diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-09-17 11:10:30 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2024-09-17 11:29:18 +0200 |
commit | 9430e8577cff4995c310f5675ea5d2a619554ccf (patch) | |
tree | e809cc61d746115afa703042591e8f7cc696bfdb /archaeological_operations/views.py | |
parent | 0e22d62ec2cacfe501bdb7a4f3afde9081366d55 (diff) | |
download | Ishtar-9430e8577cff4995c310f5675ea5d2a619554ccf.tar.bz2 Ishtar-9430e8577cff4995c310f5675ea5d2a619554ccf.zip |
✨ Operations: remove form from the wizard to put in a specific form
Diffstat (limited to 'archaeological_operations/views.py')
-rw-r--r-- | archaeological_operations/views.py | 128 |
1 files changed, 126 insertions, 2 deletions
diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 028f311e6..93fb1864b 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -21,6 +21,7 @@ import json from jinja2 import TemplateSyntaxError from django.conf import settings +from django.core.exceptions import PermissionDenied from django.db.models import Q from django.forms.utils import ErrorDict, ErrorList from django.http import HttpResponse, HttpResponseRedirect, Http404 @@ -204,7 +205,6 @@ wizard_steps = [ ("judiciary-operation_creation", forms.CourtOrderedSeizureForm), ("preventive-operation_creation", forms.OperationFormPreventive), ("preventivediag-operation_creation", forms.OperationFormPreventiveDiag), - ("relations-operation_creation", forms.RecordRelationsFormSet), ("final-operation_creation", FinalForm), ] @@ -269,7 +269,6 @@ operation_modif_wizard_steps = [ ("judiciary-operation_modification", forms.CourtOrderedSeizureForm), ("preventive-operation_modification", forms.OperationFormPreventive), ("preventivediag-operation_modification", forms.OperationFormPreventiveDiag), - ("relations-operation_modification", forms.RecordRelationsFormSet), ("final-operation_modification", FinalForm), ] @@ -500,6 +499,131 @@ operation_modify_parcels = get_parcel_modify( ) +RELATION_FORMSET_EXTRA_FORM = 3 + + +def get_relation_modify(model, model_relation, url_name, formset_class, filter_operations=False): + def _modify_relation(request, pk, current_right=None): + try: + item = model.objects.get(pk=pk) + except model.DoesNotExist: + raise Http404() + if "_own_" in current_right: + if not item.is_own(request.user): + raise PermissionDenied() + relations = model_relation.objects.filter(left_record_id=pk).all() + + items, current_items = [], [] + if filter_operations: + items = [ + (item.id, str(item)) + for item in model.objects.filter(operation=item.operation).all() + ] + current_items = [item[0] for item in items] + + initial = [] + for relation in relations: + initial.append({ + "pk": relation.pk, + "right_record": relation.right_record_id, + "relation_type": relation.relation_type_id, + }) + if filter_operations and relation.right_record_id not in current_items: + items.append((relation.right_record_id, str(relation.right_record))) + data = { + 'form-TOTAL_FORMS': len(initial) + RELATION_FORMSET_EXTRA_FORM, + 'form-INITIAL_FORMS': 0, + 'form-MIN_NUM_FORMS': 0, + 'form-MAX_NUM_FORMS': 100, + } + if filter_operations: + data["CURRENT_ITEMS"] = items + 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 + + # remove empty lines and get deleted + no_values = list(range(data["form-TOTAL_FORMS"])) + deleted = {} + for k, value in list(new_data.items()): + if not value or not k.startswith("form-"): + continue + try: + form_number = int(k.split("-")[1]) + except (ValueError, IndexError) as __: + continue + if k.endswith("-DELETE"): + if new_data.get(f"form-{form_number}-pk", None): + deleted[form_number] = new_data[f"form-{form_number}-pk"] + if form_number not in no_values: # put it back in no values + no_values.append(form_number) + else: + new_data.pop(k) + elif form_number in no_values and form_number not in deleted: + no_values.pop(no_values.index(form_number)) + for no_value in no_values: + for k in list(new_data.keys()): + if k.startswith(f"form-{no_value}-"): + new_data.pop(k) + data["form-TOTAL_FORMS"] = data["form-TOTAL_FORMS"] - len(no_values) + + new_data.update(data) + formset = formset_class(data=new_data) + + if formset.is_valid(): + is_valid = True + # delete + for deleted_id in deleted.values(): + try: + model_relation.objects.get(pk=deleted_id).delete() + except model_relation.DoesNotExist: + continue + + for idx_form, data in enumerate(formset.cleaned_data): + if not data.get('right_record') or not data.get('relation_type'): + continue + + if data.get("pk"): + try: + current_relation = model_relation.objects.get(pk=data.get("pk")) + except model_relation.DoesNotExist: + continue + not_deleted_or_associated = True + for key, value in data.items(): + if key == "DELETE" and value is True: + current_relation.delete() + not_deleted_or_associated = False + + if not_deleted_or_associated: + current_relation.right_record_id = data.get("right_record") + current_relation.relation_type_id = data.get("relation_type") + current_relation.save() + else: + model_relation.objects.create( + **{ + "left_record_id": item.pk, + "right_record_id": data.get("right_record"), + "relation_type_id": data.get("relation_type"), + } + ) + if is_valid: + return redirect(reverse(url_name, args=[pk])) + else: + formset = formset_class(initial=initial, data=data) + + return render(request, 'ishtar/forms/modify_relations.html', { + 'formset': formset, + "url": reverse(url_name, args=[pk]) + }) + return _modify_relation + + +operation_modify_relations = get_relation_modify( + models.Operation, models.RecordRelations, + "operation-relation-modify", forms.RecordRelationsFormSet +) + + # archaeological sites |