summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_files/tests.py26
-rw-r--r--archaeological_operations/models.py68
-rw-r--r--archaeological_operations/wizards.py11
3 files changed, 83 insertions, 22 deletions
diff --git a/archaeological_files/tests.py b/archaeological_files/tests.py
index 312c0402d..f24a29582 100644
--- a/archaeological_files/tests.py
+++ b/archaeological_files/tests.py
@@ -225,3 +225,29 @@ class FileOperationTest(TestCase, OperationInitTest, FileInit):
# parcel owner well attached
q = ParcelOwner.objects.filter(parcel__associated_file=self.item)
self.assertEqual(q.count(), 1)
+
+ # when attaching parcel from a file to an operation, copy is done
+ parcel = Parcel.objects.create(parcel_number='42',
+ section='ZZ',
+ town=default_town,
+ associated_file=self.item)
+ ParcelOwner.objects.create(
+ owner=self.extra_models['person'],
+ parcel=parcel, start_date=datetime.date.today(),
+ end_date=datetime.date.today())
+ parcel.operation = self.operation
+ parcel.save()
+ # double reference to operation and associated_file is deleted
+ self.assertEqual(parcel.operation, None)
+ # now 2 objects with the same parameters
+ q = Parcel.objects.filter(parcel_number='42', section='ZZ',
+ town=default_town)
+ self.assertEqual(q.count(), 2)
+ q = q.filter(operation=self.operation, associated_file=None)
+ self.assertEqual(q.count(), 1)
+ # parcel owner well attached
+ q = ParcelOwner.objects.filter(parcel__operation=self.operation,
+ parcel__parcel_number='42')
+ self.assertEqual(q.count(), 1)
+
+
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index e76de8dd9..fb8cd722b 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -451,17 +451,7 @@ def operation_post_save(sender, **kwargs):
# manage parcel association
if FILES_AVAILABLE and operation.associated_file:
for parcel in operation.parcels.all():
- keys = {'town':parcel.town, 'section':parcel.section,
- 'parcel_number':parcel.parcel_number}
- if not operation.associated_file.parcels.filter(**keys).count():
- keys['address'] = parcel.address
- keys['year'] = parcel.year
- keys['associated_file'] = operation.associated_file
- new_p = Parcel.objects.create(**keys)
- for owning in parcel.owners.all():
- ParcelOwner.objects.create(owner=owning.owner,
- parcel=new_p, start_date=owning.start_date,
- end_date=owning.end_date)
+ parcel.copy_to_file()
post_save.connect(operation_post_save, sender=Operation)
class OperationByDepartment(models.Model):
@@ -782,12 +772,59 @@ class Parcel(LightHistorizedItem):
if item]
return settings.JOINT.join(items)
+ def copy_to_file(self):
+ """
+ Copy from operation to file when associating file to operation
+ """
+ if not self.operation or not self.operation.associated_file:
+ # not concerned
+ return
+ keys = {'town':self.town, 'section':self.section,
+ 'parcel_number':self.parcel_number}
+ if self.operation.associated_file.parcels.filter(**keys).count():
+ # everything is OK
+ return
+ keys['address'] = self.address
+ keys['year'] = self.year
+ keys['associated_file'] = self.operation.associated_file
+ new_p = Parcel.objects.create(**keys)
+ # also copy owning
+ for owning in self.owners.all():
+ ParcelOwner.objects.create(owner=owning.owner,
+ parcel=new_p, start_date=owning.start_date,
+ end_date=owning.end_date)
+
+ def copy_to_operation(self):
+ """
+ Parcel cannot have operation and associated_file but on
+ new parcel association a copy have to be done before cleaning
+ """
+ if not (self.operation and self.associated_file):
+ # everything is OK
+ return
+ keys = {'town':self.town, 'section':self.section,
+ 'parcel_number':self.parcel_number,
+ 'operation':self.operation,
+ 'associated_file':None,
+ 'defaults':{'address':self.address, 'year':self.year}
+ }
+ new_p, created = Parcel.objects.get_or_create(**keys)
+ # copy owning only if created
+ if created:
+ for owning in self.owners.all():
+ ParcelOwner.objects.create(owner=owning.owner,
+ parcel=new_p, start_date=owning.start_date,
+ end_date=owning.end_date)
+ self.operation = None
+ self.save()
+
def parcel_post_save(sender, **kwargs):
if not kwargs['instance']:
return
parcel = kwargs['instance']
if not parcel.external_id and (parcel.section or parcel.parcel_number):
- parcel.external_id = (parcel.section or "") + (parcel.parcel_number or "")
+ parcel.external_id = unicode(parcel.section or "") + \
+ unicode(parcel.parcel_number or "")
parcel.save()
return
if parcel.operation and parcel.operation.pk and \
@@ -800,11 +837,8 @@ def parcel_post_save(sender, **kwargs):
if not FILES_AVAILABLE:
return
if parcel.operation and parcel.associated_file:
- return
- if parcel.operation and parcel.operation.associated_file:
- parcel.associated_file = parcel.operation.associated_file
- parcel.save()
- return
+ # parcels are copied between files and operations
+ parcel.copy_to_operation()
post_save.connect(parcel_post_save, sender=Parcel)
class ParcelOwner(LightHistorizedItem):
diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py
index b31e7b7f6..081281d8a 100644
--- a/archaeological_operations/wizards.py
+++ b/archaeological_operations/wizards.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2012-2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2012-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -111,10 +111,11 @@ class OperationWizard(Wizard):
parcels = []
current_parcels = []
operation = self.get_current_object()
- for parcel in operation.parcels.all():
- current_parcels.append((parcel.town, parcel.section,
- parcel.parcel_number))
- parcels.append((parcel.pk, parcel.short_label))
+ if operation:
+ for parcel in operation.parcels.all():
+ current_parcels.append((parcel.town, parcel.section,
+ parcel.parcel_number))
+ parcels.append((parcel.pk, parcel.short_label))
try:
for parcel in file.parcels.all():
if (parcel.town, parcel.section, parcel.parcel_number) \