diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-01-11 19:23:51 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-01-11 19:23:51 +0100 |
commit | f3294fc59af4bdaadab8f04dcf7df89ef1c317fb (patch) | |
tree | f5d133b3456888ccd805fdf5c50b880acab3e502 | |
parent | 0801fd75242e769ec856f4e7e94ee57b1dc945d2 (diff) | |
download | Ishtar-f3294fc59af4bdaadab8f04dcf7df89ef1c317fb.tar.bz2 Ishtar-f3294fc59af4bdaadab8f04dcf7df89ef1c317fb.zip |
Use JSON for M2M history
-rw-r--r-- | archaeological_context_records/migrations/0036_auto_20190111_1755.py | 26 | ||||
-rw-r--r-- | archaeological_context_records/models.py | 15 | ||||
-rw-r--r-- | archaeological_files/migrations/0017_auto_20190111_1755.py | 26 | ||||
-rw-r--r-- | archaeological_finds/migrations/0055_auto_20181227_1643.py | 75 | ||||
-rw-r--r-- | archaeological_finds/migrations/0055_auto_20190111_1755.py | 61 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 7 | ||||
-rw-r--r-- | archaeological_finds/templates/ishtar/sheet_find.html | 10 | ||||
-rw-r--r-- | archaeological_finds/tests.py | 56 | ||||
-rw-r--r-- | archaeological_operations/migrations/0044_auto_20190111_1755.py | 56 | ||||
-rw-r--r-- | archaeological_warehouse/migrations/0029_auto_20190111_1755.py | 31 | ||||
-rw-r--r-- | ishtar_common/migrations/0080_auto_20190111_1755.py | 36 | ||||
-rw-r--r-- | ishtar_common/models.py | 12 | ||||
-rw-r--r-- | ishtar_common/templatetags/window_field.py | 6 | ||||
-rw-r--r-- | ishtar_common/utils.py | 10 |
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(): |