From a49fed2b20b635b92f325efcabd7e3bef3d3f6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 10 Dec 2019 14:12:14 +0100 Subject: [PATCH] introducing NoopChangedObject for performance optimization where applicable --- src/c3nav/editor/models/changedobject.py | 7 +++++++ src/c3nav/editor/models/changeset.py | 7 +++++-- src/c3nav/editor/wrappers.py | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/c3nav/editor/models/changedobject.py b/src/c3nav/editor/models/changedobject.py index f2802712..a143f7f0 100644 --- a/src/c3nav/editor/models/changedobject.py +++ b/src/c3nav/editor/models/changedobject.py @@ -22,6 +22,13 @@ class ApplyToInstanceError(Exception): pass +class NoopChangedObject: + pk = None + @classmethod + def apply_to_instance(cls, *args, **kwargs): + pass + + class ChangedObject(models.Model): changeset = models.ForeignKey('editor.ChangeSet', on_delete=models.CASCADE, verbose_name=_('Change Set')) created = models.DateTimeField(auto_now_add=True, verbose_name=_('created')) diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index 5b181283..59f1b6cc 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -17,7 +17,7 @@ from django.utils.timezone import make_naive from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy -from c3nav.editor.models.changedobject import ApplyToInstanceError, ChangedObject +from c3nav.editor.models.changedobject import ApplyToInstanceError, ChangedObject, NoopChangedObject from c3nav.editor.tasks import send_changeset_proposed_notification from c3nav.editor.wrappers import ModelInstanceWrapper, ModelWrapper, is_created_pk from c3nav.mapdata.models import LocationSlug, MapUpdate @@ -374,7 +374,7 @@ class ChangeSet(models.Model): r = tuple((pk, values[name]) for pk, values in self.updated_existing.get(model, {}).items() if name in values) return r - def get_changed_object(self, obj) -> ChangedObject: + def get_changed_object(self, obj, allow_noop=False) -> typing.Union[ChangedObject, typing.Type[NoopChangedObject]]: if isinstance(obj, ModelInstanceWrapper): obj = obj._obj model = obj.__class__ @@ -394,6 +394,9 @@ class ChangeSet(models.Model): if is_created_pk(pk): raise model.DoesNotExist + if allow_noop: + return NoopChangedObject + return ChangedObject(changeset=self, model_class=model, existing_object_pk=pk) def get_created_object(self, model, pk, get_foreign_objects=False, allow_deleted=False): diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index 37c63c98..889919c7 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -201,7 +201,7 @@ class ModelInstanceWrapper(BaseWrapper): super().__init__(*args, **kwargs) self._affected_by_changeset = False if self._obj.pk is not None: - changed_object = self._changeset.get_changed_object(self._obj) + changed_object = self._changeset.get_changed_object(self._obj, allow_noop=True) self._affected_by_changeset = changed_object.pk is not None changed_object.apply_to_instance(self)