kopia lustrzana https://github.com/wagtail/wagtail
Make comparisons work on objects rather than values
Simplifies the code for initialising child object field comparisonspull/3275/merge
rodzic
b824c779c6
commit
e39b0879d3
wagtail/wagtailadmin
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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', {
|
||||
|
|
Ładowanie…
Reference in New Issue