summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2021-01-27 13:24:25 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:24 +0100
commitf53b0fec14bc4a5aef2527bc70597fa112fdda43 (patch)
treeeb0e09d72e58d4cd71e363ad22a6c2a7c7fe1abc
parent53036766f9968fa9be995efe53ad3e3f802ec38f (diff)
downloadIshtar-f53b0fec14bc4a5aef2527bc70597fa112fdda43.tar.bz2
Ishtar-f53b0fec14bc4a5aef2527bc70597fa112fdda43.zip
Operation parcel: fix add/modification
-rw-r--r--archaeological_operations/forms.py3
-rw-r--r--archaeological_operations/models.py19
-rw-r--r--archaeological_operations/tests.py29
-rw-r--r--ishtar_common/templates/ishtar/wizard/parcels_wizard.html4
4 files changed, 35 insertions, 20 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py
index 98f263ab6..3714b2e6a 100644
--- a/archaeological_operations/forms.py
+++ b/archaeological_operations/forms.py
@@ -67,6 +67,7 @@ class ParcelForm(IshtarForm):
form_label = _("Parcels")
base_model = 'parcel'
associated_models = {'parcel': models.Parcel, 'town': models.Town, }
+ pk = forms.IntegerField(required=False, widget=forms.HiddenInput)
town = forms.ChoiceField(label=_("Town"), choices=(), required=False,
validators=[valid_id(models.Town)])
year = forms.IntegerField(label=_("Year"), required=False,
@@ -361,7 +362,7 @@ class ParcelFormSet(FormSet):
self.management_form.is_valid()
# Checks that no parcels are duplicated.
self.check_duplicate(('town', 'section', 'parcel_number',
- 'year'), _(u"There are identical parcels."))
+ 'year'), _("There are identical parcels."))
if hasattr(self, 'cleaned_data') and self.cleaned_data:
return self.cleaned_data
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 246934d91..0c4f6330b 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -685,16 +685,16 @@ class ClosedItem(object):
class ParcelItem:
def clean_parcel_duplicates(self):
- parcels = []
+ parcels = {}
for p in self.parcels.order_by('pk').all():
if p.associated_file:
continue
key = (p.section, p.parcel_number, p.year, p.town.pk,
p.public_domain)
if key in parcels:
- p.delete()
+ parcels[key].merge(p)
else:
- parcels.append(key)
+ parcels[key] = p
class Operation(ClosedItem, DocumentItem, BaseHistorizedItem,
@@ -1399,10 +1399,10 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem,
return self.towns.values('numero_insee').all()[0]['numero_insee'][:2]
def grouped_parcels(self):
- return Parcel.grouped_parcels(list(self.parcels.all()))
+ return Parcel.grouped_parcels(list(self.parcels.distinct().all()))
def render_parcels(self):
- return Parcel.render_parcels(list(self.parcels.all()))
+ return Parcel.render_parcels(list(self.parcels.distinct().all()))
def get_town_centroid(self):
q = self.towns.filter(center__isnull=False).annotate(
@@ -2511,8 +2511,11 @@ class Parcel(LightHistorizedItem):
grouped[-1].parcel_numbers = []
nb = ""
if parcel.parcel_number:
- nb = "0" * (12 - len(parcel.parcel_number)) + \
- parcel.parcel_number
+ if parcel.parcel_number == "0":
+ nb = "0"
+ else:
+ nb = "0" * (12 - len(parcel.parcel_number)) + \
+ parcel.parcel_number
if parcel.public_domain:
if nb:
nb += " "
@@ -2542,7 +2545,7 @@ class Parcel(LightHistorizedItem):
res += parcels.section + ' '
res += ", ".join(parcels.parcel_numbers)
if parcels.year:
- res += " (%s)" % str(parcels.year)
+ res += " ({})".format(parcels.year)
return res
def long_label(self):
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index 67f4484e2..7ff7d87ac 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -2806,7 +2806,7 @@ class OperationWizardModifTest(WizardTest, OperationInitTest, TestCase):
error_expected='general'
),
FormData(
- "Operation: add a parcel",
+ "Operation: change a parcel",
form_datas={
'selec': {},
'general': {
@@ -2870,18 +2870,19 @@ class OperationWizardModifTest(WizardTest, OperationInitTest, TestCase):
for idx in range(0, 5):
for t in towns:
self.form_datas[idx].append('townsgeneral', t)
- self.form_datas[idx].append('parcelsgeneral', parcel_data)
-
- p = parcel_data.copy()
- p['parcel_number'] = '43'
- self.form_datas[4].append('parcelsgeneral', p)
+ if idx != 4:
+ self.form_datas[idx].append('parcelsgeneral', parcel_data)
parcel_data_2 = {
'town': init_parcel.town.pk, 'year': init_parcel.year or '',
'section': init_parcel.section,
+ 'pk': init_parcel.pk,
'parcel_number': init_parcel.parcel_number}
data['parcelsgeneral'].append(parcel_data_2)
- # no init parcel for data2 and data3
+
+ p = parcel_data.copy()
+ p['parcel_number'] = '43'
+ self.form_datas[4].form_datas['parcelsgeneral'] = [p]
self.operation_number = models.Operation.objects.count()
self.parcel_number = models.Parcel.objects.count()
@@ -2899,6 +2900,11 @@ class OperationWizardModifTest(WizardTest, OperationInitTest, TestCase):
test_object.assertEqual(operation.parcels.count(),
test_object.parcel_number + 1)
+ def pre_second_wizard(test_object):
+ test_object.form_datas[1].form_datas[
+ 'parcelsgeneral-operation_modification'][0]["pk"] = \
+ models.Parcel.objects.get(parcel_number="42").pk
+
def post_second_wizard(test_object, final_step_response):
test_object.assertEqual(models.Operation.objects.count(),
test_object.operation_number)
@@ -2909,6 +2915,7 @@ class OperationWizardModifTest(WizardTest, OperationInitTest, TestCase):
test_object.assertEqual(operation.year, 2017)
test_object.assertEqual(models.Parcel.objects.count(),
test_object.parcel_number + 1)
+
# the init parcel is not submited but have a context record
# the init parcel is not detached from the operation
test_object.assertEqual(operation.parcels.count(),
@@ -2944,6 +2951,9 @@ class OperationWizardModifTest(WizardTest, OperationInitTest, TestCase):
operation = models.Operation.objects.get(
pk=test_object.operations[0].pk)
test_object.operation_parcel_number = operation.parcels.count()
+ test_object.form_datas[4].form_datas[
+ 'parcelsgeneral-operation_modification'][0]["pk"] = \
+ models.Parcel.objects.get(parcel_number="42").pk
def post_fifth_wizard(test_object, final_step_response):
test_object.assertEqual(models.Operation.objects.count(),
@@ -2951,11 +2961,12 @@ class OperationWizardModifTest(WizardTest, OperationInitTest, TestCase):
operation = models.Operation.objects.get(
pk=test_object.operations[0].pk)
test_object.assertEqual(models.Parcel.objects.count(),
- test_object.parcel_number + 1)
+ test_object.parcel_number)
test_object.assertEqual(operation.parcels.count(),
- test_object.operation_parcel_number + 1)
+ test_object.operation_parcel_number)
self.form_datas[0].extra_tests = [post_first_wizard]
+ self.form_datas[1].pre_tests = [pre_second_wizard]
self.form_datas[1].extra_tests = [post_second_wizard]
self.form_datas[2].pre_tests = [pre_third_wizard]
self.form_datas[2].extra_tests = [post_third_wizard]
diff --git a/ishtar_common/templates/ishtar/wizard/parcels_wizard.html b/ishtar_common/templates/ishtar/wizard/parcels_wizard.html
index d8c902c72..93addd7a2 100644
--- a/ishtar_common/templates/ishtar/wizard/parcels_wizard.html
+++ b/ishtar_common/templates/ishtar/wizard/parcels_wizard.html
@@ -23,8 +23,8 @@
<table class='inline-table' id='parcel-table'>
<tr>{% for field in wizard.form.forms.0 %}
- {% if field.required %}<th{%else%}<td{% endif %}{% if not forloop.last %} rowspan='2'{% endif %}>
- {{ field.label_tag }}{% if field.required %}</th>{%else%}</td>{% endif %}{% endfor %}
+ {% if field.name != 'pk' %}{% if field.required %}<th{%else%}<td{% endif %}{% if not forloop.last %} rowspan='2'{% endif %}>
+ {{ field.label_tag }}{% if field.required %}</th>{%else%}</td>{% endif %}{% endif %}{% endfor %}
</tr>
<tr><td>({% trans "all"%} <input type='checkbox' name='check-all' class='check-all'/>)</td></tr>
{% inline_formset 'Parcels' wizard.form.forms False %}