introducing NoopChangedObject for performance optimization where applicable
This commit is contained in:
parent
35220eaef6
commit
a49fed2b20
3 changed files with 13 additions and 3 deletions
|
@ -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'))
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue