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
|
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'))
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue