Make comparisons work on objects rather than values

Simplifies the code for initialising child object field comparisons
pull/3275/merge
Karl Hobley 2016-11-22 12:49:52 +00:00 zatwierdzone przez Matt Westcott
rodzic b824c779c6
commit e39b0879d3
3 zmienionych plików z 24 dodań i 27 usunięć
wagtail/wagtailadmin

Wyświetl plik

@ -16,10 +16,10 @@ class FieldComparison:
is_field = True
is_child_relation = False
def __init__(self, field, val_a, val_b):
def __init__(self, field, obj_a, obj_b):
self.field = field
self.val_a = val_a
self.val_b = val_b
self.val_a = field.value_from_object(obj_a)
self.val_b = field.value_from_object(obj_b)
def field_label(self):
"""
@ -102,11 +102,11 @@ class ChildRelationComparison:
is_field = False
is_child_relation = True
def __init__(self, field, val_a, val_b, field_comparisons):
def __init__(self, field, field_comparisons, obj_a, obj_b):
self.field = field
self.val_a = val_a
self.val_b = val_b
self.field_comparisons = field_comparisons
self.val_a = getattr(obj_a, field.related_name)
self.val_b = getattr(obj_b, field.related_name)
def field_label(self):
"""
@ -211,7 +211,7 @@ class ChildRelationComparison:
return map_forwards, map_backwards, added, deleted
def get_child_comparison(self, obj_a, obj_b):
return ChildObjectComparison(self.field.related_model, obj_a, obj_b, self.field_comparisons)
return ChildObjectComparison(self.field.related_model, self.field_comparisons, obj_a, obj_b)
def get_child_comparisons(self):
"""
@ -267,11 +267,11 @@ class ChildRelationComparison:
class ChildObjectComparison:
def __init__(self, model, obj_a, obj_b, field_comparisons):
def __init__(self, model, field_comparisons, obj_a, obj_b):
self.model = model
self.field_comparisons = field_comparisons
self.obj_a = obj_a
self.obj_b = obj_b
self.field_comparisons = field_comparisons
def is_addition(self):
"""
@ -308,10 +308,10 @@ class ChildObjectComparison:
obj = self.obj_a or self.obj_b
for field_comparison in self.field_comparisons:
comparisons.extend(field_comparison(obj, obj))
comparisons.append(field_comparison(obj, obj))
else:
for field_comparison in self.field_comparisons:
comparisons.extend(field_comparison(self.obj_a, self.obj_b))
comparisons.append(field_comparison(self.obj_a, self.obj_b))
return comparisons

Wyświetl plik

@ -9,6 +9,7 @@ from django.db.models.fields import FieldDoesNotExist
from django.core.exceptions import ImproperlyConfigured
from django.forms.models import fields_for_model
from django.template.loader import render_to_string
from django.utils.functional import curry
from django.utils.safestring import mark_safe
from django.utils.six import text_type
from django.utils.translation import ugettext_lazy
@ -201,7 +202,7 @@ class EditHandler(object):
return mark_safe(self.render_as_object() + self.render_missing_fields())
@classmethod
def get_comparison(cls, obj_a, obj_b):
def get_comparison(cls):
return []
@ -271,11 +272,11 @@ class BaseCompositeEditHandler(EditHandler):
}))
@classmethod
def get_comparison(cls, obj_a, obj_b):
def get_comparison(cls):
comparators = []
for child in cls.children:
comparators.extend(child.get_comparison(obj_a, obj_b))
comparators.extend(child.get_comparison())
return comparators
@ -488,14 +489,12 @@ class BaseFieldPanel(EditHandler):
return compare.FieldComparison
@classmethod
def get_comparison(cls, obj_a, obj_b):
def get_comparison(cls):
comparator_class = cls.get_comparison_class()
if comparator_class:
field = cls.model._meta.get_field(cls.field_name)
val_a = field.value_from_object(obj_a)
val_b = field.value_from_object(obj_b)
return [comparator_class(field, val_a, val_b)]
return [curry(comparator_class, field)]
else:
return []
@ -672,17 +671,14 @@ class BaseInlinePanel(EditHandler):
return cls.get_child_edit_handler_class().html_declarations()
@classmethod
def get_comparison(cls, obj_a, obj_b):
def get_comparison(cls):
field = cls.model._meta.get_field(cls.relation_name)
val_a = getattr(obj_a, field.name)
val_b = getattr(obj_b, field.name)
field_comparisons = []
field_comparisons = [
(lambda panel: lambda obj_a, obj_b: panel.bind_to_model(cls.related.related_model).get_comparison(obj_a, obj_b))(p)
for p in cls.get_panel_definitions()
]
for panel in cls.get_panel_definitions():
field_comparisons.extend(panel.bind_to_model(cls.related.related_model).get_comparison())
return [compare.ChildRelationComparison(field, val_a, val_b, field_comparisons)]
return [curry(compare.ChildRelationComparison, field, field_comparisons)]
def __init__(self, instance=None, form=None):
super(BaseInlinePanel, self).__init__(instance=instance, form=form)

Wyświetl plik

@ -1123,7 +1123,8 @@ def revisions_compare(request, page_id, revision_id_a, revision_id_b):
revision_b = get_object_or_404(page.revisions, id=revision_id_b).as_page_object()
revision_b_heading = str(get_object_or_404(page.revisions, id=revision_id_b).created_at)
comparison = page.get_edit_handler().get_comparison(revision_a, revision_b)
comparison = page.get_edit_handler().get_comparison()
comparison = [comp(revision_a, revision_b) for comp in comparison]
comparison = [comp for comp in comparison if comp.has_changed()]
return render(request, 'wagtailadmin/pages/revisions/compare.html', {