"""A number of useful helper functions to automate common tasks."""
from django.contrib import admin
from django.contrib.admin.sites import NotRegistered
from reversion.admin import VersionAdmin
def patch_admin(model, admin_site=None):
"""
Enables version control with full admin integration for a model that has
already been registered with the django admin site.
This is excellent for adding version control to existing Django contrib
applications.
"""
admin_site = admin_site or admin.site
try:
ModelAdmin = admin_site._registry[model].__class__
except KeyError:
raise NotRegistered, "The model %r has not been registered with the admin site." % model
# Unregister existing admin class.
admin_site.unregister(model)
# Register patched admin class.
class PatchedModelAdmin(VersionAdmin, ModelAdmin):
pass
admin_site.register(model, PatchedModelAdmin)
# Patch generation methods, only available if the google-diff-match-patch
# library is installed.
#
# http://code.google.com/p/google-diff-match-patch/
try:
from diff_match_patch import diff_match_patch
except ImportError:
pass
else:
dmp = diff_match_patch()
def generate_diffs(old_version, new_version, field_name):
"""Generates a diff array for the named field between the two versions."""
# Extract the text from the versions.
old_text = old_version.field_dict[field_name]
new_text = new_version.field_dict[field_name]
# Generate the patch.
diffs = dmp.diff_main(old_text, new_text)
return diffs
def generate_patch(old_version, new_version, field_name):
"""
Generates a text patch of the named field between the two versions.
"""
diffs = generate_diffs(old_version, new_version, field_name)
patch = dmp.patch_make(diffs)
return dmp.patch_toText(patch)
def generate_patch_html(old_version, new_version, field_name):
"""
Generates a pretty html version of the differences between the named
field in two versions.
"""
diffs = generate_diffs(old_version, new_version, field_name)
return dmp.diff_prettyHtml(diffs)
|