summaryrefslogtreecommitdiff
path: root/archaeological_operations
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2022-11-16 17:56:34 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-12-12 12:23:19 +0100
commitb46aa637fa1018a151f623138c94e145efa8288c (patch)
tree00066ed170255d1adb18de7de2d368772600b202 /archaeological_operations
parentcbf4b6cfba17564c169cbacd4dbd6fcaeb5ef319 (diff)
downloadIshtar-b46aa637fa1018a151f623138c94e145efa8288c.tar.bz2
Ishtar-b46aa637fa1018a151f623138c94e145efa8288c.zip
Refactor and improve parcel for operation and file
Diffstat (limited to 'archaeological_operations')
-rw-r--r--archaeological_operations/views.py247
1 files changed, 125 insertions, 122 deletions
diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py
index d3bccb635..7d83bb7e0 100644
--- a/archaeological_operations/views.py
+++ b/archaeological_operations/views.py
@@ -378,132 +378,135 @@ def operation_delete(request, pk):
PARCEL_FORMSET_EXTRA_FORM = 3
-def operation_modify_parcels(request, pk):
- formset_class = SelectedParcelGeneralFormSet
- operation = models.Operation.objects.get(pk=pk)
- parcels = models.Parcel.objects.filter(operation=pk).all()
- available_towns = []
-
- for town in operation.towns.all():
- available_towns.append((town.pk, str(town)))
-
- initial = []
- for parcel in parcels:
- town = models.Town.objects.get(pk=parcel.town_id)
- initial.append({
- "pk": parcel.pk,
- "town": town.pk,
- "year": parcel.year,
- "section": parcel.section,
- "parcel_number": parcel.parcel_number,
- "public_domain": parcel.public_domain
+def get_parcel_modify(model, key_for_parcel, url_name):
+ def _modify_parcels(request, pk):
+ formset_class = SelectedParcelGeneralFormSet
+ item = model.objects.get(pk=pk)
+ parcels = models.Parcel.objects.filter(**{key_for_parcel: pk}).all()
+ available_towns = [(town.pk, str(town)) for town in item.towns.all()]
+
+ initial = []
+ for parcel in parcels:
+ town = models.Town.objects.get(pk=parcel.town_id)
+ initial.append({
+ "pk": parcel.pk,
+ "town": town.pk,
+ "year": parcel.year,
+ "section": parcel.section,
+ "parcel_number": parcel.parcel_number,
+ "public_domain": parcel.public_domain
+ })
+
+ data = {
+ 'TOWNS': available_towns,
+ 'form-TOTAL_FORMS': len(initial) + PARCEL_FORMSET_EXTRA_FORM,
+ 'form-INITIAL_FORMS': 0,
+ 'form-MIN_NUM_FORMS': 0,
+ 'form-MAX_NUM_FORMS': 100,
+ }
+
+ if request.method == 'POST':
+ new_data = dict(request.POST)
+ new_data = {k: new_data[k][0] for k in new_data} # convert POST to classic dict
+ new_data.update(data)
+ formset = formset_class(new_data)
+ parcel_selection = new_data.get('_parcel_selection', None)
+
+ if parcel_selection:
+ selected_town = new_data.get("_town")
+ p_town = int(selected_town)
+ _parcels = parse_parcels(parcel_selection)
+
+ for p in _parcels:
+ p_year = p["year"]
+ p_section = p["section"]
+ p_parcel_number = p["parcel_number"]
+ query = {
+ "section": p_section,
+ "parcel_number": p_parcel_number,
+ "town_id": p_town,
+ key_for_parcel: item
+ }
+ q = models.Parcel.objects.filter(**query)
+ if not q.count():
+ added_parcel = models.Parcel.objects.create(
+ **{
+ "section": p_section,
+ "parcel_number": p_parcel_number,
+ "town_id": p_town,
+ key_for_parcel: item
+ }
+ )
+ if p_year:
+ added_parcel.year = p_year
+ added_parcel.save()
+ item.parcels.add(added_parcel)
+ return redirect(reverse(url_name, args=[pk]))
+
+ if formset.is_valid():
+ is_valid = True
+ for idx_form, data in enumerate(formset.cleaned_data):
+ if (not data.get('parcel_number') or not data.get('section')) and \
+ not data.get('public_domain'):
+ continue
+
+ if data.get("pk"):
+ try:
+ current_parcel = models.Parcel.objects.get(pk=data.get("pk"))
+ except models.Parcel.DoesNotExist:
+ continue
+ not_deleted_or_associated = True
+ for key, value in data.items():
+ if key == "DELETE" and value is True:
+ parcel_associated_by_context_record = \
+ ContextRecord.objects.filter(parcel=current_parcel.pk).all()
+ if parcel_associated_by_context_record.count() > 0:
+ is_valid = False
+ formset.forms[idx_form].errors["__all__"] = ErrorList([
+ ValidationError(
+ _("This parcel is associated with a context "
+ "record. It can't be deleted.")
+ )
+ ])
+ else:
+ current_parcel.delete()
+ not_deleted_or_associated = False
+
+ if not_deleted_or_associated:
+ current_parcel.year = data.get("year")
+ current_parcel.section = data.get("section")
+ current_parcel.parcel_number = data.get("parcel_number")
+ current_parcel.town = models.Town.objects.get(pk=int(data.get("town")))
+ current_parcel.public_domain = data.get("public_domain")
+ current_parcel.save()
+ else:
+ parcel_to_add = models.Parcel.objects.create(
+ **{
+ "section": data.get("section"),
+ "parcel_number": data.get("parcel_number"),
+ "town_id": int(data.get("town")),
+ key_for_parcel: item,
+ "year": data.get("year"),
+ "public_domain":data.get("public_domain")
+ }
+ )
+ item.parcels.add(parcel_to_add)
+ if is_valid:
+ return redirect(reverse(url_name, args=[pk]))
+ else:
+ formset = formset_class(initial=initial, data=data)
+
+ return render(request, 'ishtar/forms/modify_parcels.html', {
+ 'formset': formset,
+ "url": reverse(url_name, args=[pk])
})
+ return _modify_parcels
- data = {
- 'TOWNS': available_towns,
- 'form-TOTAL_FORMS': len(initial) + PARCEL_FORMSET_EXTRA_FORM,
- 'form-INITIAL_FORMS': 0,
- 'form-MIN_NUM_FORMS': 0,
- 'form-MAX_NUM_FORMS': 100,
- }
-
- if request.method == 'POST':
- new_data = dict(request.POST)
- new_data = {k: new_data[k][0] for k in new_data} # convert POST to classic dict
- new_data.update(data)
- formset = formset_class(new_data)
- parcel_selection = new_data.get('_parcel_selection', None)
-
- if parcel_selection:
- selected_town = new_data.get("_town")
- _parcels = parse_parcels(parcel_selection)
- existant_parcel = None
-
- for p in _parcels:
- p_year = p["year"]
- p_section = p["section"]
- p_parcel_number = p["parcel_number"]
- p_town = models.Town.objects.get(pk=int(selected_town))
- q = models.Parcel.objects.filter(
- section=p_section, parcel_number=p_parcel_number, town=p_town, operation=operation
- )
- nb = q.count()
-
- if nb > 1: # if duplicates parcels, keep just one
- while nb > 1:
- for d in q:
- d.delete()
- nb -= 1
- else:
- added_parcel = models.Parcel.objects.create(
- section = p_section,
- parcel_number = p_parcel_number,
- town = p_town,
- )
- if p_year:
- added_parcel.year = p_year
- added_parcel.save()
- operation.parcels.add(added_parcel)
- return redirect(reverse("operation-parcels-modify", args=[pk]))
-
- if formset.is_valid():
- is_valid = True
- for idx_form, data in enumerate(formset.cleaned_data):
- if (not data.get('parcel_number') or not data.get('section')) and \
- not data.get('public_domain'):
- continue
-
- current_parcel = None
- if data.get("pk"):
- try:
- current_parcel = models.Parcel.objects.get(pk=data.get("pk"))
- except models.Parcel.DoesNotExist:
- continue
- if current_parcel:
- not_deleted_or_associated = True
- for key, value in data.items():
-
- if key == "DELETE" and value is True:
- parcel_associated_by_context_record = \
- ContextRecord.objects.filter(parcel=current_parcel.pk).all()
- if parcel_associated_by_context_record.count() > 0:
- is_valid = False
- formset.forms[idx_form].errors["__all__"] = ErrorList([
- ValidationError(
- _("This parcel is associated with a context "
- "record. It can't be deleted.")
- )
- ])
- else:
- current_parcel.delete()
- not_deleted_or_associated = False
-
- if not_deleted_or_associated:
- current_parcel.year = data.get("year")
- current_parcel.section = data.get("section")
- current_parcel.parcel_number = data.get("parcel_number")
- current_parcel.town = models.Town.objects.get(pk=int(data.get("town")))
- current_parcel.public_domain = data.get("public_domain")
- current_parcel.save()
- else:
- parcel_to_add = models.Parcel.objects.create(
- year = data.get("year"),
- section = data.get("section"),
- parcel_number = data.get("parcel_number"),
- town = models.Town.objects.get(pk=int(data.get("town"))),
- public_domain = data.get("public_domain")
- )
- operation.parcels.add(parcel_to_add)
- if is_valid:
- return redirect(reverse("operation-parcels-modify", args=[pk]))
- else:
- formset = formset_class(initial=initial, data=data)
- return render(request, 'ishtar/forms/modify_parcels.html', {
- 'formset': formset,
- "url": reverse("operation-parcels-modify", args=[pk])
- })
+operation_modify_parcels = get_parcel_modify(
+ models.Operation, "operation", "operation-parcels-modify"
+)
# archaeological sites