move code to ChangeSet.get_objects()
This commit is contained in:
parent
fdf3da8987
commit
0226f0b36f
2 changed files with 51 additions and 39 deletions
|
@ -13,7 +13,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils.translation import ungettext_lazy
|
from django.utils.translation import ungettext_lazy
|
||||||
|
|
||||||
from c3nav.editor.wrappers import ModelInstanceWrapper, ModelWrapper, is_created_pk
|
from c3nav.editor.wrappers import ModelInstanceWrapper, ModelWrapper, is_created_pk
|
||||||
from c3nav.mapdata.models.locations import LocationRedirect
|
from c3nav.mapdata.models.locations import LocationRedirect, LocationSlug
|
||||||
|
|
||||||
|
|
||||||
class ChangeSet(models.Model):
|
class ChangeSet(models.Model):
|
||||||
|
@ -176,6 +176,49 @@ class ChangeSet(models.Model):
|
||||||
m2m_added.discard(value)
|
m2m_added.discard(value)
|
||||||
self.m2m_removed.setdefault(model, {}).setdefault(pk, {}).setdefault(name, set()).add(value)
|
self.m2m_removed.setdefault(model, {}).setdefault(pk, {}).setdefault(name, set()).add(value)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Analyse Changes
|
||||||
|
"""
|
||||||
|
def get_objects(self):
|
||||||
|
if self.changes_qs is None:
|
||||||
|
raise TypeError
|
||||||
|
|
||||||
|
# collect pks of relevant objects
|
||||||
|
object_pks = {}
|
||||||
|
for change in self.changes_qs:
|
||||||
|
object_pks.setdefault(change.model_class, set()).add(change.obj_pk)
|
||||||
|
model = None
|
||||||
|
if change.action == 'update':
|
||||||
|
if change.model_class == LocationRedirect:
|
||||||
|
if change.field_name == 'target':
|
||||||
|
object_pks.setdefault(LocationSlug, set()).add(json.loads(change.field_value))
|
||||||
|
continue
|
||||||
|
elif not change.field_name.startswith('title_'):
|
||||||
|
field = change.model_class._meta.get_field(change.field_name)
|
||||||
|
model = getattr(field, 'related_model', None)
|
||||||
|
if change.action in ('m2m_add', 'm2m_remove'):
|
||||||
|
model = change.model_class._meta.get_field(change.field_name).related_model
|
||||||
|
if model is not None:
|
||||||
|
object_pks.setdefault(model, set()).add(json.loads(change.field_value))
|
||||||
|
|
||||||
|
# retrieve relevant objects
|
||||||
|
objects = {}
|
||||||
|
for model, pks in object_pks.items():
|
||||||
|
created_pks = set(pk for pk in pks if is_created_pk(pk))
|
||||||
|
existing_pks = pks - created_pks
|
||||||
|
model_objects = {}
|
||||||
|
if existing_pks:
|
||||||
|
for obj in model.objects.filter(pk__in=existing_pks):
|
||||||
|
if model == LocationSlug:
|
||||||
|
obj = obj.get_child()
|
||||||
|
model_objects[obj.pk] = obj
|
||||||
|
if created_pks:
|
||||||
|
for pk in created_pks:
|
||||||
|
model_objects[pk] = self.get_created_object(model, pk, allow_deleted=True)._obj
|
||||||
|
objects[model] = model_objects
|
||||||
|
|
||||||
|
return objects
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Lookup changes and created objects
|
Lookup changes and created objects
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -54,48 +54,17 @@ def changeset_history(request, pk):
|
||||||
def group_changes(changeset, can_edit=False, show_history=False):
|
def group_changes(changeset, can_edit=False, show_history=False):
|
||||||
changeset.parse_changes(get_history=show_history)
|
changeset.parse_changes(get_history=show_history)
|
||||||
|
|
||||||
changes_list = changeset.changes_qs
|
objects = changeset.get_objects()
|
||||||
|
|
||||||
# collect pks of relevant objects
|
|
||||||
object_pks = {}
|
|
||||||
for change in changes_list:
|
|
||||||
object_pks.setdefault(change.model_class, set()).add(change.obj_pk)
|
|
||||||
model = None
|
|
||||||
if change.action == 'update':
|
|
||||||
if change.model_class == LocationRedirect:
|
|
||||||
if change.field_name == 'target':
|
|
||||||
object_pks.setdefault(LocationSlug, set()).add(json.loads(change.field_value))
|
|
||||||
continue
|
|
||||||
elif not change.field_name.startswith('title_'):
|
|
||||||
field = change.model_class._meta.get_field(change.field_name)
|
|
||||||
model = getattr(field, 'related_model', None)
|
|
||||||
if change.action in ('m2m_add', 'm2m_remove'):
|
|
||||||
model = change.model_class._meta.get_field(change.field_name).related_model
|
|
||||||
if model is not None:
|
|
||||||
object_pks.setdefault(model, set()).add(json.loads(change.field_value))
|
|
||||||
|
|
||||||
# retrieve relevant objects
|
|
||||||
objects = {}
|
|
||||||
for model, pks in object_pks.items():
|
|
||||||
created_pks = set(pk for pk in pks if is_created_pk(pk))
|
|
||||||
existing_pks = pks - created_pks
|
|
||||||
model_objects = {}
|
|
||||||
if existing_pks:
|
|
||||||
for obj in model.objects.filter(pk__in=existing_pks):
|
|
||||||
if model == LocationSlug:
|
|
||||||
obj = obj.get_child()
|
|
||||||
model_objects[obj.pk] = obj
|
|
||||||
if created_pks:
|
|
||||||
for pk in created_pks:
|
|
||||||
model_objects[pk] = changeset.get_created_object(model, pk, allow_deleted=True)._obj
|
|
||||||
if show_history:
|
if show_history:
|
||||||
model_objects[pk].titles = {}
|
grouped_changes = []
|
||||||
objects[model] = model_objects
|
for obj in objects:
|
||||||
|
if is_created_pk(obj.pk):
|
||||||
|
obj.titles = {}
|
||||||
|
|
||||||
grouped_changes = [] if show_history else {}
|
grouped_changes = [] if show_history else {}
|
||||||
changes = []
|
changes = []
|
||||||
last_obj = None
|
last_obj = None
|
||||||
for change in changes_list:
|
for change in changeset.changes_qs:
|
||||||
pk = change.obj_pk
|
pk = change.obj_pk
|
||||||
obj = objects[change.model_class][pk]
|
obj = objects[change.model_class][pk]
|
||||||
if change.model_class == LocationRedirect:
|
if change.model_class == LocationRedirect:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue