summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py38
1 files changed, 34 insertions, 4 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: