summaryrefslogtreecommitdiff
path: root/archaeological_operations
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_operations')
-rw-r--r--archaeological_operations/models.py29
-rw-r--r--archaeological_operations/tests.py36
2 files changed, 52 insertions, 13 deletions
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index c8c291752..4a900c276 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -557,14 +557,6 @@ class Operation(ClosedItem, BaseHistorizedItem, ImageModel, OwnPerms,
def is_active(self):
return not bool(self.end_date)
- def save(self, *args, **kwargs):
- # put a default year if start_date is defined
- if self.start_date and not self.year:
- self.year = self.start_date.year
- if self.operation_code is None:
- self.operation_code = self.get_available_operation_code(self.year)
- return super(Operation, self).save(*args, **kwargs)
-
@property
def nb_parcels(self):
_(u"Number of parcels")
@@ -767,6 +759,14 @@ class Operation(ClosedItem, BaseHistorizedItem, ImageModel, OwnPerms,
res['mode'] = u" ; ".join([str(m) for m in mode(finds)])
return res
+ def save(self, *args, **kwargs):
+ # put a default year if start_date is defined
+ if self.start_date and not self.year:
+ self.year = self.start_date.year
+ if self.operation_code is None:
+ self.operation_code = self.get_available_operation_code(self.year)
+ return super(Operation, self).save(*args, **kwargs)
+
m2m_changed.connect(cached_label_changed, sender=Operation.towns.through)
@@ -1193,10 +1193,10 @@ class Parcel(LightHistorizedItem):
associated_file = models.ForeignKey(
'archaeological_files.File',
related_name='parcels', verbose_name=_(u"File"),
- blank=True, null=True)
+ blank=True, null=True, on_delete=models.CASCADE)
operation = models.ForeignKey(
Operation, related_name='parcels', blank=True, null=True,
- verbose_name=_(u"Operation"))
+ verbose_name=_(u"Operation"), on_delete=models.CASCADE)
year = models.IntegerField(_(u"Year"), blank=True, null=True)
town = models.ForeignKey(Town, related_name='parcels',
verbose_name=_(u"Town"))
@@ -1356,6 +1356,13 @@ def parcel_post_save(sender, **kwargs):
if not kwargs['instance']:
return
parcel = kwargs['instance']
+ created = kwargs.get('created', None)
+
+ # 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
updated = False
if not parcel.external_id or parcel.auto_external_id:
@@ -1365,6 +1372,7 @@ def parcel_post_save(sender, **kwargs):
parcel.auto_external_id = True
parcel.external_id = external_id
if updated:
+ parcel._updated_id = True
parcel.save()
return
@@ -1378,6 +1386,7 @@ def parcel_post_save(sender, **kwargs):
if parcel.operation and parcel.associated_file:
# parcels are copied between files and operations
parcel.copy_to_operation()
+
post_save.connect(parcel_post_save, sender=Parcel)
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index d8399eedb..33199dd04 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -35,7 +35,7 @@ import models
from archaeological_operations import views
from ishtar_common.models import OrganizationType, Organization, \
- ImporterType, IshtarUser, TargetKey, IshtarSiteProfile
+ ImporterType, IshtarUser, TargetKey, IshtarSiteProfile, Town
from ishtar_common import forms_common
from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \
@@ -578,8 +578,7 @@ class OperationTest(TestCase, OperationInitTest):
{'operator': self.orgas[0].pk})
self.assertTrue(json.loads(response.content)['total'] == 2)
- def testRelatedSearch(self):
- c = Client()
+ def create_relations(self):
rel1 = models.RelationType.objects.create(
symmetrical=True, label='Include', txt_idx='include')
rel2 = models.RelationType.objects.create(
@@ -589,6 +588,11 @@ class OperationTest(TestCase, OperationInitTest):
left_record=self.operations[0],
right_record=self.operations[1],
relation_type=rel1)
+ return rel1, rel2
+
+ def testRelatedSearch(self):
+ c = Client()
+ rel1, rel2 = self.create_relations()
self.operations[1].year = 2011
self.operations[1].save()
search = {'year': '2010', 'relation_types_0': rel2.pk}
@@ -599,6 +603,28 @@ class OperationTest(TestCase, OperationInitTest):
response = c.get(reverse('get-operation'), search)
self.assertTrue(json.loads(response.content)['total'] == 2)
+ def testPostDeleteRelations(self):
+ self.create_relations()
+ self.operations[0].delete()
+
+ def testPostDeleteParcels(self):
+ ope = self.operations[0]
+ town = Town.objects.create(name='plouf', numero_insee='20000')
+ parcel = models.Parcel.objects.create(town=town)
+ parcel_nb = models.Parcel.objects.count()
+ ope.parcels.add(parcel)
+ ope.delete()
+ # our parcel has no operation attached and should be deleted
+ self.assertEqual(parcel_nb - 1, models.Parcel.objects.count())
+ ope = self.operations[1]
+ parcel = models.Parcel.objects.create(town=town)
+ parcel_nb = models.Parcel.objects.count()
+ ope.parcels.add(parcel)
+ ope.parcels.clear() # no signal raised... should resave
+ models.Parcel.objects.filter(pk=parcel.pk).all()[0].save()
+ # our parcel has no operation attached and should be deleted
+ self.assertEqual(parcel_nb - 1, models.Parcel.objects.count())
+
def testOwnSearch(self):
c = Client()
response = c.get(reverse('get-operation'), {'year': '2010'})
@@ -718,6 +744,8 @@ class OperationWizardDeleteTest(OperationWizardCreationTest):
def pre_wizard(self):
self.ope = self.get_default_operation(force=True)
+ self.ope.parcels.add(self.create_parcel()[0])
+ self.parcel_nb = models.Parcel.objects.count()
self.form_datas[0].form_datas['selec-operation_deletion']['pk'] = \
self.ope.pk
self.operation_number = models.Operation.objects.count()
@@ -726,6 +754,8 @@ class OperationWizardDeleteTest(OperationWizardCreationTest):
def post_wizard(self):
self.assertEqual(self.operation_number - 1,
models.Operation.objects.count())
+ # associated parcel removed
+ self.assertEqual(self.parcel_nb - 1, models.Parcel.objects.count())
class OperationWizardClosingTest(OperationWizardCreationTest):