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.py123
1 files changed, 4 insertions, 119 deletions
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
)