diff options
Diffstat (limited to 'archaeological_operations')
-rw-r--r-- | archaeological_operations/views.py | 247 |
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 |