diff options
| -rw-r--r-- | archaeological_context_records/tests.py | 42 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 21 | ||||
| -rw-r--r-- | archaeological_operations/tests.py | 18 | ||||
| -rw-r--r-- | ishtar_common/utils.py | 7 | 
4 files changed, 80 insertions, 8 deletions
| diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index 1c900184c..b87f3ce4d 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -147,7 +147,6 @@ class ContextRecordInit(OperationInitTest):      def create_context_record(self, user=None, data={}, force=False):          if not getattr(self, 'context_records', None):              self.context_records = [] -          default = {'label': "Context record"}          if force or not data.get('operation'):              data['operation'] = self.get_default_operation(force=force) @@ -200,6 +199,47 @@ class ContextRecordTest(ContextRecordInit, TestCase):              cr.external_id,              u"{}-{}".format(cr.parcel.external_id, cr.label)) +    def test_lost_parcel_dont_delete_context_record(self): +        cr = self.create_context_record(force=True)[0] +        parcel = models.Parcel.objects.get(pk=cr.parcel.pk) +        parcel.operation = None +        parcel.save() +        self.assertEqual( +            models.ContextRecord.objects.filter(pk=cr.pk).count(), 1) +        # associated operation is restored +        self.assertEqual( +            models.Parcel.objects.get(pk=parcel.pk).operation, +            cr.operation +        ) + +    def test_cache_update(self): +        cr = self.create_context_record()[0] +        cr_pk = cr.pk +        # OP2010 - 1 | A | 1 | CR 1 +        ope_id, parcel_sec, parcel_nb, cr_label = cr.cached_label.split(' | ') +        self.assertEqual(ope_id, 'OP2010-1') +        self.assertEqual(parcel_sec, cr.parcel.section) +        self.assertEqual(parcel_nb, cr.parcel.parcel_number) +        self.assertEqual(cr_label, cr.label) + +        new_lbl = "UE 2" +        cr.label = new_lbl +        cr.save() +        cr = models.ContextRecord.objects.get(pk=cr_pk) +        ope_id, parcel_sec, parcel_nb, cr_label = cr.cached_label.split(' | ') +        self.assertEqual(cr_label, new_lbl) + +        new_sec, new_nb = "B", "42" +        parcel = cr.parcel +        parcel.section = new_sec +        parcel.parcel_number = new_nb +        parcel.save() +        cr = models.ContextRecord.objects.get(pk=cr_pk) +        ope_id, parcel_sec, parcel_nb, cr_label = cr.cached_label.split(' | ') +        self.assertEqual(parcel_sec, new_sec) +        self.assertEqual(parcel_nb, new_nb) + +  class ContextRecordSearchTest(ContextRecordInit, TestCase):      fixtures = ImportContextRecordTest.fixtures diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 7c9efaef7..225d46a53 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -29,7 +29,8 @@ from django.db.models.signals import post_save, m2m_changed, post_delete  from django.forms import ValidationError  from django.utils.translation import ugettext_lazy as _, ugettext -from ishtar_common.utils import cached_label_changed, get_cache, mode +from ishtar_common.utils import cached_label_changed, \ +    force_cached_label_changed, get_cache, mode  from ishtar_common.models import GeneralType, BaseHistorizedItem, \      HistoricalRecords, LightHistorizedItem, OwnPerms, Department, Source,\ @@ -769,7 +770,7 @@ class Operation(ClosedItem, BaseHistorizedItem, ImageModel, OwnPerms,          return super(Operation, self).save(*args, **kwargs) -m2m_changed.connect(cached_label_changed, sender=Operation.towns.through) +m2m_changed.connect(force_cached_label_changed, sender=Operation.towns.through)  def operation_post_save(sender, **kwargs): @@ -1356,16 +1357,22 @@ class Parcel(LightHistorizedItem):  def parcel_post_save(sender, **kwargs):      if not kwargs['instance']:          return +    from archaeological_context_records.models import ContextRecord      parcel = kwargs['instance']      created = kwargs.get('created', None) +    updated = False      # remove when the parcel is linked to nothing -    if not getattr(parcel, '_updated_id', None) and not created and not \ -            parcel.operation and not parcel.associated_file: -        parcel.delete() -        return +    if not getattr(parcel, '_updated_id', None) and not created \ +            and not parcel.operation and not parcel.associated_file: +        if parcel.context_record.count(): +            # trying to restore a lost parcel +            parcel.operation = parcel.context_record.all()[0].operation +            updated = True +        else: +            parcel.delete() +            return -    updated = False      if not parcel.external_id or parcel.auto_external_id:          external_id = get_external_id('parcel_external_id', parcel)          if external_id != parcel.external_id: diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 364cc4c8e..9cdeb67e6 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -607,6 +607,9 @@ class OperationInitTest(object):      def create_parcel(self, data={}):          default = {'town': self.get_default_town(),                     'section': 'A', 'parcel_number': '1'} +        if not hasattr(self, 'operations'): +            self.create_operation() +        default['operation'] = self.operations[0]          default.update(data)          if not getattr(self, 'parcels', None):              self.parcels = [] @@ -741,6 +744,21 @@ class OperationTest(TestCase, OperationInitTest):          ope2 = create_operation(self.user, values={'year': 0})          self.assertEqual(ope2.operation_code, 2) +    def test_cache_update(self): +        self.create_towns() +        operation = self.operations[0] +        town, ope_id = operation.cached_label.split(' | ') +        self.assertIn(town, (u'Intercommunal', u"Multi-town")) +        self.assertEqual(ope_id, 'OP2010-1') +        operation = models.Operation.objects.get(pk=operation.pk) +        operation.year = 2011 +        operation.save() +        operation.towns.add(self.towns[0]) +        operation = models.Operation.objects.get(pk=operation.pk) +        town, ope_id = operation.cached_label.split(' | ') +        self.assertEqual(ope_id, 'OP2011-1') +        self.assertEqual(town, self.towns[0].name) +  class OperationSearchTest(TestCase, OperationInitTest):      fixtures = [settings.ROOT_PATH + diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 83534d93a..e16d1abb6 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -55,6 +55,13 @@ def get_cache(cls, extra_args=[]):      return cache_key, cache.get(cache_key) +def force_cached_label_changed(sender, **kwargs): +    if not kwargs.get('instance'): +        return +    kwargs['instance']._cached_label_checked = False +    cached_label_changed(sender, **kwargs) + +  def cached_label_changed(sender, **kwargs):      if not kwargs.get('instance'):          return | 
