summaryrefslogtreecommitdiff
path: root/archaeological_context_records/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_context_records/views.py')
-rw-r--r--archaeological_context_records/views.py122
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