summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/migrations/0036_auto_20190111_1755.py26
-rw-r--r--archaeological_context_records/models.py15
-rw-r--r--archaeological_files/migrations/0017_auto_20190111_1755.py26
-rw-r--r--archaeological_finds/migrations/0055_auto_20181227_1643.py75
-rw-r--r--archaeological_finds/migrations/0055_auto_20190111_1755.py61
-rw-r--r--archaeological_finds/models_finds.py7
-rw-r--r--archaeological_finds/templates/ishtar/sheet_find.html10
-rw-r--r--archaeological_finds/tests.py56
-rw-r--r--archaeological_operations/migrations/0044_auto_20190111_1755.py56
-rw-r--r--archaeological_warehouse/migrations/0029_auto_20190111_1755.py31
-rw-r--r--ishtar_common/migrations/0080_auto_20190111_1755.py36
-rw-r--r--ishtar_common/models.py12
-rw-r--r--ishtar_common/templatetags/window_field.py6
-rw-r--r--ishtar_common/utils.py10
14 files changed, 293 insertions, 134 deletions
diff --git a/archaeological_context_records/migrations/0036_auto_20190111_1755.py b/archaeological_context_records/migrations/0036_auto_20190111_1755.py
new file mode 100644
index 000000000..0bd4cb182
--- /dev/null
+++ b/archaeological_context_records/migrations/0036_auto_20190111_1755.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2019-01-11 17:55
+from __future__ import unicode_literals
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0035_migrate_main_image'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='contextrecord',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicalcontextrecord',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ ]
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 030f817d9..4f1711d31 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -29,7 +29,7 @@ from django.utils.translation import ugettext_lazy as _, pgettext, \
activate, pgettext_lazy, deactivate
from django.utils.text import slugify
-from ishtar_common.utils import cached_label_changed, HISTORY_M2M_SPLIT
+from ishtar_common.utils import cached_label_changed
from ishtar_common.models import Document, GeneralType, \
BaseHistorizedItem, HistoricalRecords, OwnPerms, ShortMenuItem, \
@@ -84,12 +84,11 @@ class Dating(models.Model):
return unicode(self.period)
return u"%s (%s-%s)" % (self.period, start_date, end_date)
- SEP = u"$|£|$"
HISTORY_ATTR = ["period", "start_date", "end_date", "dating_type",
"quality", "precise_dating"]
def history_compress(self):
- values = []
+ values = {}
for attr in self.HISTORY_ATTR:
val = getattr(self, attr)
if hasattr(val, 'history_compress'):
@@ -100,18 +99,18 @@ class Dating(models.Model):
val = ''
else:
val = unicode(val)
- values.append(val)
- return self.SEP.join(values)
+ values[attr] = val
+ return values
@classmethod
def history_decompress(cls, full_value, create=False):
if not full_value:
return []
full_res = []
- for value in full_value.split(HISTORY_M2M_SPLIT):
+ for value in full_value:
res = {}
- for idx, val in enumerate(value.split(cls.SEP)):
- key = cls.HISTORY_ATTR[idx]
+ for key in value:
+ val = value[key]
if val == '':
val = None
elif key in ("period", "dating_type", "quality"):
diff --git a/archaeological_files/migrations/0017_auto_20190111_1755.py b/archaeological_files/migrations/0017_auto_20190111_1755.py
new file mode 100644
index 000000000..043cafa7d
--- /dev/null
+++ b/archaeological_files/migrations/0017_auto_20190111_1755.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2019-01-11 17:55
+from __future__ import unicode_literals
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_files', '0016_auto_20181203_1442'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='file',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicalfile',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ ]
diff --git a/archaeological_finds/migrations/0055_auto_20181227_1643.py b/archaeological_finds/migrations/0055_auto_20181227_1643.py
deleted file mode 100644
index 094fbaf12..000000000
--- a/archaeological_finds/migrations/0055_auto_20181227_1643.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.10 on 2018-12-27 16:43
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('archaeological_finds', '0054_migrate_main_image'),
- ]
-
- operations = [
- migrations.AddField(
- model_name='find',
- name='historical_communicabilities',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='find',
- name='historical_datings',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='find',
- name='historical_integrities',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='find',
- name='historical_material_types',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='find',
- name='historical_object_types',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='find',
- name='historical_remarkabilities',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='historicalfind',
- name='historical_communicabilities',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='historicalfind',
- name='historical_datings',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='historicalfind',
- name='historical_integrities',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='historicalfind',
- name='historical_material_types',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='historicalfind',
- name='historical_object_types',
- field=models.TextField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='historicalfind',
- name='historical_remarkabilities',
- field=models.TextField(blank=True, null=True),
- ),
- ]
diff --git a/archaeological_finds/migrations/0055_auto_20190111_1755.py b/archaeological_finds/migrations/0055_auto_20190111_1755.py
new file mode 100644
index 000000000..5b9ca2558
--- /dev/null
+++ b/archaeological_finds/migrations/0055_auto_20190111_1755.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2019-01-11 17:55
+from __future__ import unicode_literals
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0054_migrate_main_image'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='basefind',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicalbasefind',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicaltreatment',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicaltreatmentfile',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='property',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='treatment',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='treatmentfile',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 9e377d1f6..803f885b4 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -21,6 +21,7 @@ import datetime
from django.conf import settings
from django.contrib.gis.db import models
+from django.contrib.postgres.fields import JSONField
from django.core.urlresolvers import reverse
from django.db import connection
from django.db.models import Max, Q, F
@@ -1074,7 +1075,6 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
MaterialType, verbose_name=_(u"Material types"), related_name='finds',
blank=True
)
- historical_material_types = models.TextField(blank=True, null=True)
material_type_quality = models.ForeignKey(
MaterialTypeQualityType,
verbose_name=_(u"Material type quality"), related_name='finds',
@@ -1094,7 +1094,6 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
verbose_name=_(u"Downstream treatment"), on_delete=models.SET_NULL)
datings = models.ManyToManyField(Dating, verbose_name=_(u"Dating"),
related_name='find')
- historical_datings = models.TextField(blank=True, null=True)
container = models.ForeignKey(
"archaeological_warehouse.Container", verbose_name=_(u"Container"),
blank=True, null=True,
@@ -1110,7 +1109,6 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
ObjectType, verbose_name=_(u"Object types"), related_name='find',
blank=True
)
- historical_object_types = models.TextField(blank=True, null=True)
object_type_quality = models.ForeignKey(
ObjectTypeQualityType,
verbose_name=_(u"Object type quality"), related_name='finds',
@@ -1119,15 +1117,12 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
integrities = models.ManyToManyField(
IntegrityType, verbose_name=_(u"Integrity / interest"),
related_name='find', blank=True)
- historical_integrities = models.TextField(blank=True, null=True)
remarkabilities = models.ManyToManyField(
RemarkabilityType, verbose_name=_(u"Remarkability"),
related_name='find', blank=True)
- historical_remarkabilities = models.TextField(blank=True, null=True)
communicabilities = models.ManyToManyField(
CommunicabilityType, verbose_name=_(u"Communicability"),
related_name='find', blank=True)
- historical_communicabilities = models.TextField(blank=True, null=True)
min_number_of_individuals = models.IntegerField(
_(u"Minimum number of individuals (MNI)"), blank=True, null=True)
length = models.FloatField(_(u"Length (cm)"), blank=True, null=True)
diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html
index ac2df607d..a7302d16a 100644
--- a/archaeological_finds/templates/ishtar/sheet_find.html
+++ b/archaeological_finds/templates/ishtar/sheet_find.html
@@ -19,7 +19,9 @@
{% with permission_view_document=permission_view_document %}
{% with permission_view_own_document=permission_view_own_document %}
-{% with display_datings=item.integrities.count|or_:item.remarkabilities.count|or_:item.conservatory_state|or_:item.conservatory_comment|or_:item.alterations.count|or_:item.alteration_causes.count|or_:item.preservation_to_considers.count|or_:item.appraisal_date|or_:item.treatment_emergency|or_:item.insurance_value|or_:item.estimated_value|or_:item.historical_datings|or_:item.datings.count|or_:item.dating_comment %}
+{% with m2m_listing_datings=item|m2m_listing:'datings' %}
+
+{% with display_datings=item.integrities.count|or_:item.remarkabilities.count|or_:item.conservatory_state|or_:item.conservatory_comment|or_:item.alterations.count|or_:item.alteration_causes.count|or_:item.preservation_to_considers.count|or_:item.appraisal_date|or_:item.treatment_emergency|or_:item.insurance_value|or_:item.estimated_value|or_:m2m_listing_datings|or_:item.dating_comment %}
{% with display_warehouse_treatments=item.container|or_:item.container_ref|or_:item.upstream_treatment|or_:item.downstream_treatment|or_:item.treatments.count %}
{% with can_view_documents=permission_view_own_document|or_:permission_view_document %}
{% with display_documents=can_view_documents|and_:item.documents.count %}
@@ -200,7 +202,7 @@
</div>
{% endif %}
- {% if item.historical_datings or item.datings.count or item.dating_comment %}
+ {% if m2m_listing_datings or item.dating_comment %}
<h3>{% trans "Dating" %}</h3>
<table id='{{window_id}}-datings' class="table table-striped">
<tr>
@@ -211,7 +213,7 @@
<th>{% trans "Quality" %}</th>
<th>{% trans "Precise dating" %}</th>
</tr>
- {% for dating in item|m2m_listing:'datings' %}
+ {% for dating in m2m_listing_datings %}
<tr>
<td>
{{dating.period}}
@@ -393,7 +395,7 @@
{% endif %}
</div>
-{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}
+{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}
{% endblock %}
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index 231ac30ad..2f485f36e 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -36,7 +36,6 @@ from archaeological_finds import models, views
from archaeological_warehouse.models import Warehouse, WarehouseType
from ishtar_common import forms_common
-from ishtar_common.utils import HISTORY_M2M_SPLIT
from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \
TestCase, create_user, create_superuser
@@ -837,26 +836,27 @@ class FindHistoryTest(FindInit, TestCase):
"quality": DatingQuality.objects.get(txt_idx='sure'),
"precise_dating": u"Blah !!!"
}
- d1_txt = Dating.SEP.join([
- (d1_attrs[k].txt_idx
- if hasattr(d1_attrs[k], 'txt_idx') else unicode(d1_attrs[k]))
- if k in d1_attrs else ''
- for k in Dating.HISTORY_ATTR
- ])
d1 = Dating.objects.create(**d1_attrs)
d2_attrs = {
"period": Period.objects.get(txt_idx='paleolithic'),
}
- d2_txt = Dating.SEP.join([
- (d2_attrs[k].txt_idx
- if hasattr(d2_attrs[k], 'txt_idx') else unicode(d2_attrs[k]))
- if k in d2_attrs else ''
- for k in Dating.HISTORY_ATTR
- ])
d2 = Dating.objects.create(**d2_attrs)
+
+ d1_dct, d2_dct = {}, {}
+ for k in Dating.HISTORY_ATTR:
+ for dct, attr in ((d1_dct, d1_attrs) ,
+ (d2_dct, d2_attrs)):
+ if k in attr:
+ if hasattr(attr[k], 'txt_idx'):
+ dct[k] = attr[k].txt_idx
+ else:
+ dct[k] = unicode(attr[k])
+ else:
+ dct[k] = ''
+
find.datings.add(d1)
find.datings.add(d2)
- return d1_txt, d2_txt
+ return d1_dct, d2_dct
def test_m2m_history_save(self):
find = self.finds[0]
@@ -874,16 +874,20 @@ class FindHistoryTest(FindInit, TestCase):
find.material_types.add(ceram)
find.material_types.add(glass)
d1_txt, d2_txt = self._add_datings(find)
+
+ self.assertIsNotNone(find.history_m2m)
+ self.assertIn('material_types', find.history_m2m)
self.assertIn(
- find.historical_material_types,
- [HISTORY_M2M_SPLIT.join(['ceramic', 'glass']), # order do not
- HISTORY_M2M_SPLIT.join(['glass', 'ceramic'])]) # matter
+ find.history_m2m['material_types'],
+ [['ceramic', 'glass'], # order do not
+ ['glass', 'ceramic']]) # matter
+ self.assertIn('datings', find.history_m2m)
self.assertIn(
- find.historical_datings,
- [HISTORY_M2M_SPLIT.join([d1_txt, d2_txt]), # order do not
- HISTORY_M2M_SPLIT.join([d2_txt, d1_txt])]) # matter
+ find.history_m2m['datings'],
+ [[d1_txt, d2_txt], # order do not
+ [d2_txt, d1_txt]]) # matter
- historical_material_types = find.historical_material_types
+ historical_material_types = find.history_m2m['material_types']
find = models.Find.objects.get(pk=find.pk)
find.label = "hop hop hop2"
@@ -896,13 +900,13 @@ class FindHistoryTest(FindInit, TestCase):
find.datings.clear()
find = models.Find.objects.get(pk=find.pk)
- self.assertEqual(find.historical_material_types, 'glass')
- self.assertEqual(find.historical_datings, "")
+ self.assertEqual(find.history_m2m['material_types'], ['glass'])
+ self.assertEqual(find.history_m2m['datings'], [])
self.assertEqual(find.history.count(), nb_hist + 2)
- self.assertEqual(find.history.all()[1].historical_material_types,
+ self.assertEqual(find.history.all()[1].history_m2m['material_types'],
historical_material_types)
- self.assertEqual(find.history.all()[0].historical_material_types,
- "glass")
+ self.assertEqual(find.history.all()[0].history_m2m['material_types'],
+ ["glass"])
def test_m2m_history_display(self):
c = Client()
diff --git a/archaeological_operations/migrations/0044_auto_20190111_1755.py b/archaeological_operations/migrations/0044_auto_20190111_1755.py
new file mode 100644
index 000000000..7e3869627
--- /dev/null
+++ b/archaeological_operations/migrations/0044_auto_20190111_1755.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2019-01-11 17:55
+from __future__ import unicode_literals
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0043_migrate_main_image'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='administrativeact',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='archaeologicalsite',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicaladministrativeact',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicalarchaeologicalsite',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicaloperation',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='operation',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='parcel',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='parcelowner',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ ]
diff --git a/archaeological_warehouse/migrations/0029_auto_20190111_1755.py b/archaeological_warehouse/migrations/0029_auto_20190111_1755.py
new file mode 100644
index 000000000..09f27c148
--- /dev/null
+++ b/archaeological_warehouse/migrations/0029_auto_20190111_1755.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2019-01-11 17:55
+from __future__ import unicode_literals
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_warehouse', '0028_migrate_main_image'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='collection',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='container',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='warehouse',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ ]
diff --git a/ishtar_common/migrations/0080_auto_20190111_1755.py b/ishtar_common/migrations/0080_auto_20190111_1755.py
new file mode 100644
index 000000000..3043c50d7
--- /dev/null
+++ b/ishtar_common/migrations/0080_auto_20190111_1755.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2019-01-11 17:55
+from __future__ import unicode_literals
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0079_migrate-importers'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='historicalorganization',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='historicalperson',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='organization',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ migrations.AddField(
+ model_name='person',
+ name='history_m2m',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}),
+ ),
+ ]
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index e5e173654..ef7dc8a4e 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -69,7 +69,7 @@ from ishtar_common.models_imports import ImporterModel, ImporterType, \
Import, TargetKeyGroup
from ishtar_common.utils import get_cache, disable_for_loaddata, create_slug, \
get_all_field_names, merge_tsvectors, cached_label_changed, \
- generate_relation_graph, HISTORY_M2M_SPLIT
+ generate_relation_graph
__all__ = [
'ImporterModel', 'ImporterType', 'ImporterDefault', 'ImporterDefaultValues',
@@ -153,11 +153,10 @@ class HistoryModel(models.Model):
abstract = True
def m2m_listing(self, key):
- hist_value = getattr(self, "historical_" + key, None)
- if not hist_value:
+ if not self.history_m2m or key not in self.history_m2m:
return
related_model = getattr(self, key).model
- return related_model.history_decompress(hist_value)
+ return related_model.history_decompress(self.history_m2m[key])
class HistoricalRecords(BaseHistoricalRecords):
@@ -539,7 +538,7 @@ class GeneralType(Cached, models.Model):
if not value:
return []
res = []
- for txt_idx in value.split(HISTORY_M2M_SPLIT):
+ for txt_idx in value:
try:
res.append(cls.objects.get(txt_idx=txt_idx))
except cls.DoesNotExist:
@@ -1481,6 +1480,7 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData,
User, related_name='+', on_delete=models.SET_NULL,
verbose_name=_(u"Creator"), blank=True, null=True)
last_modified = models.DateTimeField(auto_now=True)
+ history_m2m = JSONField(default={}, blank=True)
class Meta:
abstract = True
@@ -2827,6 +2827,7 @@ class OrganizationManager(models.Manager):
class Organization(Address, Merge, OwnPerms, ValueGetter):
TABLE_COLS = ('name', 'organization_type', 'town')
+ SLUG = "organization"
SHOW_URL = 'show-organization'
# search parameters
@@ -2954,6 +2955,7 @@ class PersonManager(models.Manager):
class Person(Address, Merge, OwnPerms, ValueGetter):
+ SLUG = "person"
_prefix = 'person_'
TYPE = (
('Mr', _(u'Mr')),
diff --git a/ishtar_common/templatetags/window_field.py b/ishtar_common/templatetags/window_field.py
index df72690c4..d843d3030 100644
--- a/ishtar_common/templatetags/window_field.py
+++ b/ishtar_common/templatetags/window_field.py
@@ -101,14 +101,14 @@ from django.template import Library, loader, Context
@register.simple_tag
def field_multiple_obj(caption, item, attr, li=False, size=None):
data = getattr(item, attr)
- if not hasattr(item, '_step') or not hasattr(item, 'historical_' + attr):
+ if not hasattr(item, '_step') or attr not in item.history_m2m \
+ or not item.history_m2m[attr]:
t = loader.get_template('ishtar/blocks/window_field_flex_multiple.html')
return t.render(
{'caption': caption, 'data': data, 'li': li, "size": size}
)
rel_model = data.model
- data = getattr(item, 'historical_' + attr)
- data = rel_model.history_decompress(data)
+ data = rel_model.history_decompress(item.history_m2m[attr])
t = loader.get_template(
'ishtar/blocks/window_field_flex_historized_multiple.html')
return t.render(
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 56c6f669f..e293562ff 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -931,26 +931,22 @@ def get_urls_for_model(model, views, own=False, autocomplete=False,
return urls
-HISTORY_M2M_SPLIT = u"*||*"
-
-
def m2m_historization_changed(sender, **kwargs):
obj = kwargs.get('instance', None)
if not obj:
return
- hist_values = {}
+ hist_values = obj.history_m2m or {}
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())
- hist_values['historical_' + attr] = HISTORY_M2M_SPLIT.join(values)
- for key in hist_values:
- setattr(obj, key, hist_values[key])
+ hist_values[attr] = values
# force resave of last history record
if hasattr(obj, 'skip_history_when_saving'):
delattr(obj, 'skip_history_when_saving')
+ obj.history_m2m = hist_values
obj._force_history = True
q = obj.history.order_by("-history_date")
if q.count():