introducing NoopChangedObject for performance optimization where applicable

This commit is contained in:
Laura Klünder 2019-12-10 14:12:14 +01:00
parent 35220eaef6
commit a49fed2b20
3 changed files with 13 additions and 3 deletions

View file

@ -22,6 +22,13 @@ class ApplyToInstanceError(Exception):
pass pass
class NoopChangedObject:
pk = None
@classmethod
def apply_to_instance(cls, *args, **kwargs):
pass
class ChangedObject(models.Model): class ChangedObject(models.Model):
changeset = models.ForeignKey('editor.ChangeSet', on_delete=models.CASCADE, verbose_name=_('Change Set')) changeset = models.ForeignKey('editor.ChangeSet', on_delete=models.CASCADE, verbose_name=_('Change Set'))
created = models.DateTimeField(auto_now_add=True, verbose_name=_('created')) created = models.DateTimeField(auto_now_add=True, verbose_name=_('created'))

View file

@ -17,7 +17,7 @@ from django.utils.timezone import make_naive
from django.utils.translation import ugettext_lazy as _ 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.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.tasks import send_changeset_proposed_notification
from c3nav.editor.wrappers import ModelInstanceWrapper, ModelWrapper, is_created_pk from c3nav.editor.wrappers import ModelInstanceWrapper, ModelWrapper, is_created_pk
from c3nav.mapdata.models import LocationSlug, MapUpdate 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) r = tuple((pk, values[name]) for pk, values in self.updated_existing.get(model, {}).items() if name in values)
return r 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): if isinstance(obj, ModelInstanceWrapper):
obj = obj._obj obj = obj._obj
model = obj.__class__ model = obj.__class__
@ -394,6 +394,9 @@ class ChangeSet(models.Model):
if is_created_pk(pk): if is_created_pk(pk):
raise model.DoesNotExist raise model.DoesNotExist
if allow_noop:
return NoopChangedObject
return ChangedObject(changeset=self, model_class=model, existing_object_pk=pk) 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): def get_created_object(self, model, pk, get_foreign_objects=False, allow_deleted=False):

View file

@ -201,7 +201,7 @@ class ModelInstanceWrapper(BaseWrapper):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._affected_by_changeset = False self._affected_by_changeset = False
if self._obj.pk is not None: 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 self._affected_by_changeset = changed_object.pk is not None
changed_object.apply_to_instance(self) changed_object.apply_to_instance(self)