diff options
| -rw-r--r-- | ishtar_common/models.py | 33 | ||||
| -rw-r--r-- | ishtar_common/utils.py | 21 | 
2 files changed, 34 insertions, 20 deletions
| diff --git a/ishtar_common/models.py b/ishtar_common/models.py index e7f0e9262..946e88703 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2103,8 +2103,24 @@ class StatisticItem:      )  # example: "Price", "Volume" - the number is a multiplier +class CascasdeUpdate: +    DOWN_MODEL_UPDATE = [] + +    def cascade_update(self): +        for down_model in self.DOWN_MODEL_UPDATE: +            if not settings.USE_BACKGROUND_TASK: +                rel = getattr(self, down_model) +                if hasattr(rel.model, "need_update"): +                    rel.update(need_update=True) +                    continue +            for item in getattr(self, down_model).all(): +                cached_label_changed(item.__class__, instance=item) +                if hasattr(item, "point_2d"): +                    post_save_geo(item.__class__, instance=item) + +  class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported, -                         JsonData, FixAssociated): +                         JsonData, FixAssociated, CascasdeUpdate):      """      Historized item with external ID management.      All historized items are searchable and have a data json field. @@ -2114,7 +2130,6 @@ class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported,      SHOW_URL = None      EXTERNAL_ID_KEY = ''      EXTERNAL_ID_DEPENDENCIES = [] -    DOWN_MODEL_UPDATE = []      HISTORICAL_M2M = []      history_modifier = models.ForeignKey( @@ -2151,18 +2166,6 @@ class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported,      class Meta:          abstract = True -    def cascade_update(self): -        for down_model in self.DOWN_MODEL_UPDATE: -            if not settings.USE_BACKGROUND_TASK: -                rel = getattr(self, down_model) -                if hasattr(rel.model, "need_update"): -                    rel.update(need_update=True) -                    continue -            for item in getattr(self, down_model).all(): -                cached_label_changed(item.__class__, instance=item) -                if hasattr(item, "point_2d"): -                    post_save_geo(item.__class__, instance=item) -      @classmethod      def get_verbose_name(cls):          return cls._meta.verbose_name @@ -4875,8 +4878,8 @@ post_delete.connect(post_save_cache, sender=AuthorType)  class Author(FullSearch): -    PARENT_SEARCH_VECTORS = ['person']      SLUG = "author" +    PARENT_SEARCH_VECTORS = ['person']      uuid = models.UUIDField(default=uuid.uuid4)      person = models.ForeignKey(Person, verbose_name=_("Person"), diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 641fbd156..d22a89916 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -36,6 +36,7 @@ import six  import subprocess  import sys  import tempfile +import time  import xmltodict  import zipfile @@ -418,9 +419,18 @@ def deserialize_args_for_tasks(sender, kwargs, extra_kwargs=None):      if not isinstance(sender, (tuple, list)):  # not task          return sender, kwargs["instance"]      sender = apps.get_model(*sender) -    try: -        instance = sender.objects.get(pk=kwargs['instance']) -    except sender.DoesNotExist: +    instance = None +    retried = 0 +    # object can be in cache of another thread but not yet commited +    # waiting for it +    while not instance and retried < 6: +        if retried: +            time.sleep(.5) +        if sender.objects.filter(pk=kwargs['instance']).count(): +            instance = sender.objects.get(pk=kwargs['instance']) +        else: +            retried += 1 +    if not instance:          return sender, None  # object is not here anymore      if extra_kwargs:          for kw in extra_kwargs: @@ -456,7 +466,9 @@ def cached_label_changed(sender, **kwargs):      #     return      # cache.set(cache_key, True, settings.CACHE_TASK_TIMEOUT) -    if not settings.USE_BACKGROUND_TASK: +    if not settings.USE_BACKGROUND_TASK or not instance.pk \ +            or not sender.objects.filter(pk=instance.pk).count(): +        # no background task or not yet fully saved          return _cached_label_changed(sender, **kwargs)      if getattr(instance, "_cascade_change", False): @@ -474,7 +486,6 @@ def _cached_label_changed(sender, **kwargs):      if not instance:          return      force_update = kwargs.get('force_update', False) -      if hasattr(instance, "need_update") and instance.need_update:          force_update = True          instance.skip_history_when_saving = True | 
