diff options
Diffstat (limited to 'archaeological_context_records/views.py')
-rw-r--r-- | archaeological_context_records/views.py | 122 |
1 files changed, 117 insertions, 5 deletions
diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index 9d1d285e5..3695617f9 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -21,7 +21,7 @@ import json from django.db.models import Q from django.http import HttpResponse, HttpResponseRedirect, Http404 -from django.shortcuts import redirect +from django.shortcuts import render, redirect from django.urls import reverse from ishtar_common.utils import ugettext_lazy as _ from django.views.generic import RedirectView @@ -32,7 +32,6 @@ from archaeological_context_records import models from archaeological_operations.views import site_extra_context from archaeological_context_records import forms -from ishtar_common.utils import put_session_message from ishtar_common.views import ( IshtarMixin, @@ -42,7 +41,7 @@ from ishtar_common.views import ( wizard_is_available, QAItemEditForm, ) -from ishtar_common.views_item import display_item, get_item, show_item, revert_item +from ishtar_common.views_item import get_item, show_item, revert_item from archaeological_context_records import wizards show_contextrecord = show_item( @@ -122,7 +121,6 @@ record_creation_steps = [ ("general-record_creation", forms.RecordFormGeneral), ("datings-record_creation", forms.DatingFormSet), ("interpretation-record_creation", forms.RecordFormInterpretation), - ("relations-record_creation", forms.RecordRelationsFormSet), ("final-record_creation", forms.FinalForm), ] @@ -138,7 +136,6 @@ record_modification_steps = [ ("general-record_modification", forms.RecordFormGeneral), ("datings-record_modification", forms.DatingFormSet), ("interpretation-record_modification", forms.RecordFormInterpretation), - ("relations-record_modification", forms.RecordRelationsFormSet), ("final-record_modification", forms.FinalForm), ] @@ -196,6 +193,121 @@ 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): + formset_class = forms.RecordRelationsFormSet + item = model.objects.get(pk=pk) + 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" +) + + class GenerateRelationImage(IshtarMixin, LoginRequiredMixin, RedirectView): upper_model = models.Operation model = models.ContextRecord |