diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-01-11 14:01:02 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-01-11 17:30:46 +0100 |
commit | d68eed24e409cf6b5c15c77fbf1034843eea9acd (patch) | |
tree | 53a7b08c771d8b454fe83b4b7fc40f7ca5b62277 /ishtar_common | |
parent | f0f17e614d03140fef0b1dff3aca8fdb9e06aded (diff) | |
download | Ishtar-d68eed24e409cf6b5c15c77fbf1034843eea9acd.tar.bz2 Ishtar-d68eed24e409cf6b5c15c77fbf1034843eea9acd.zip |
Fix history M2M save
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models.py | 38 | ||||
-rw-r--r-- | ishtar_common/templatetags/window_field.py | 5 | ||||
-rw-r--r-- | ishtar_common/utils.py | 14 |
3 files changed, 51 insertions, 6 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index c7223c898..e5e173654 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -148,6 +148,18 @@ class ValueGetter(object): return values +class HistoryModel(models.Model): + class Meta: + abstract = True + + def m2m_listing(self, key): + hist_value = getattr(self, "historical_" + key, None) + if not hist_value: + return + related_model = getattr(self, key).model + return related_model.history_decompress(hist_value) + + class HistoricalRecords(BaseHistoricalRecords): def create_historical_record(self, instance, type): try: @@ -523,9 +535,9 @@ class GeneralType(Cached, models.Model): return self.txt_idx @classmethod - def history_decompress(cls, value=""): + def history_decompress(cls, value, create=False): if not value: - value = "" + return [] res = [] for txt_idx in value.split(HISTORY_M2M_SPLIT): try: @@ -1571,12 +1583,27 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData, if not new_item: raise HistoryError(u"The date to rollback to doesn't exist.") try: - for f in self._meta.fields: - k = f.name + field_keys = [f.name for f in self._meta.fields] + for k in field_keys: if k != 'id' and hasattr(self, k): if not hasattr(new_item, k): k = k + "_id" setattr(self, k, getattr(new_item, k)) + + # M2M history + if k.startwith('historical_') \ + and k[len('historical_'):] in field_keys: + value = getattr(new_item, k) + if not value: + continue + base_k = k[len('historical_'):] + base_field = self._meta.get_field(base_k) + base_field.clear() + new_values = base_field.related_model.history_decompress( + value, create=True + ) + for val in new_values: + base_field.add(val) try: self.history_modifier = User.objects.get( pk=new_item.history_modifier_id) @@ -1591,6 +1618,9 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData, for historized_item in to_del: historized_item.delete() + def m2m_listing(self, key): + return getattr(self, key).all() + def values(self): values = {} for f in self._meta.fields: diff --git a/ishtar_common/templatetags/window_field.py b/ishtar_common/templatetags/window_field.py index 3af9ed634..df72690c4 100644 --- a/ishtar_common/templatetags/window_field.py +++ b/ishtar_common/templatetags/window_field.py @@ -166,3 +166,8 @@ def field_flex_detail(context, caption, item, small=False): if small: size = 2 return field_detail(context, caption, item, size=size) + + +@register.filter +def m2m_listing(item, key): + return item.m2m_listing(key) diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 94e71c655..56c6f669f 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -938,12 +938,22 @@ def m2m_historization_changed(sender, **kwargs): obj = kwargs.get('instance', None) if not obj: return + hist_values = {} for attr in obj.HISTORICAL_M2M: values = [] for value in getattr(obj, attr).all(): if not hasattr(value, "history_compress"): continue values.append(value.history_compress()) - setattr(obj, 'historical_' + attr, HISTORY_M2M_SPLIT.join(values)) - obj.skip_history_when_saving = True + hist_values['historical_' + attr] = HISTORY_M2M_SPLIT.join(values) + for key in hist_values: + setattr(obj, key, hist_values[key]) + # force resave of last history record + if hasattr(obj, 'skip_history_when_saving'): + delattr(obj, 'skip_history_when_saving') + obj._force_history = True + q = obj.history.order_by("-history_date") + if q.count(): + last = q.all()[0] + last.delete() obj.save() |