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_context_records | |
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_context_records')
-rw-r--r-- | archaeological_context_records/forms.py | 18 | ||||
-rw-r--r-- | archaeological_context_records/views.py | 123 |
2 files changed, 10 insertions, 131 deletions
diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index f4176b619..e5d34117c 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -578,6 +578,7 @@ class RecordRelationsForm(OpeRecordRelationsForm): "relation_type": models.RelationType, } ERROR_MISSING = _("You should select a context record and a relation type.") + ERROR_SAME = _("A context record cannot be related to himself.") right_record = forms.ChoiceField( label=_("Context record"), choices=[], required=False @@ -585,16 +586,9 @@ class RecordRelationsForm(OpeRecordRelationsForm): def __init__(self, *args, **kwargs): crs = None - if "data" in kwargs and "CONTEXT_RECORDS" in kwargs["data"]: + if "data" in kwargs and "CURRENT_ITEMS" in kwargs["data"]: kwargs["data"] = copy(kwargs["data"]) - crs = kwargs["data"].pop("CONTEXT_RECORDS") - # clean data if not "real" data - prefix_value = kwargs['prefix'] + '-relation_type' - if not [k for k in kwargs['data'].keys() - if k.startswith(prefix_value) and kwargs['data'][k]]: - kwargs.pop('data') - if 'files' in kwargs: - kwargs.pop('files') + crs = kwargs["data"].pop("CURRENT_ITEMS") initial = kwargs.get("initial", {}) if initial and initial.get("right_record", None): if initial["right_record"] not in [cr_id for cr_id, cr_lbl in crs]: @@ -613,9 +607,9 @@ class RecordRelationsForm(OpeRecordRelationsForm): RecordRelationsFormSet = formset_factory( RecordRelationsForm, can_delete=True, formset=RecordRelationsFormSetBase ) -RecordRelationsFormSet.form_label = _("Relations") -RecordRelationsFormSet.form_admin_name = _("Context record - 050 - Relations") -RecordRelationsFormSet.form_slug = "contextrecord-050-recordrelations" +RecordRelationsFormSet.form_label = _("Context records - Relations") +RecordRelationsFormSet.form_admin_name = _("Context record - Relations") +RecordRelationsFormSet.form_slug = "contextrecord-recordrelations" class QAOperationCR(IshtarForm): diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index eba1ae8c0..98236dcd6 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -19,7 +19,6 @@ import json -from django.core.exceptions import PermissionDenied from django.db.models import Q from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.shortcuts import render, redirect @@ -31,7 +30,7 @@ from ishtar_common.models import QuickAction from archaeological_operations.models import Operation from archaeological_context_records import models -from archaeological_operations.views import site_extra_context +from archaeological_operations.views import site_extra_context, get_relation_modify from archaeological_context_records import forms from ishtar_common.views import ( @@ -194,124 +193,10 @@ def reset_wizards(request): wizard_class.session_reset(request, url_name) -RELATION_FORMSET_EXTRA_FORM = 3 - - -def get_relation_modify(model, model_relation, url_name): - 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() - formset_class = forms.RecordRelationsFormSet - relations = model_relation.objects.filter(left_record_id=pk).all() - - 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 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, - "CONTEXT_RECORDS": 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 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") and 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) - 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 - - context_record_modify_relations = get_relation_modify( - models.ContextRecord, models.RecordRelations, "context-record-relation-modify" + models.ContextRecord, models.RecordRelations, + "context-record-relation-modify", forms.RecordRelationsFormSet, + filter_operations=True ) |