summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2022-05-22 20:31:19 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-12-12 12:21:00 +0100
commitdf8a001203e9e936ae5bae4e06f5631d87fb3ada (patch)
treeb7bece5905a4a433cbde9132bec669669f1c8ea0 /ishtar_common/views.py
parent3ff82007369b115406c2f2effbdfb13188167bb7 (diff)
downloadIshtar-df8a001203e9e936ae5bae4e06f5631d87fb3ada.tar.bz2
Ishtar-df8a001203e9e936ae5bae4e06f5631d87fb3ada.zip
Geodata - geo forms: new forms - many adaptations
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py99
1 files changed, 98 insertions, 1 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index b6686e0bd..361c32022 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -2131,7 +2131,7 @@ document_search_wizard = wizards.DocumentSearch.as_view(
class DocumentFormMixin(IshtarMixin, LoginRequiredMixin):
form_class = forms.DocumentForm
- template_name = "ishtar/forms/document.html"
+ template_name = "ishtar/forms/base_related_items.html"
model = models.Document
def get_context_data(self, **kwargs):
@@ -2711,3 +2711,100 @@ class DisplayItemView(IshtarMixin, TemplateView):
else:
data["show_url"] = "/show-{}/{}/".format(item_type, pk)
return data
+
+
+class GeoFormMixin(IshtarMixin, LoginRequiredMixin):
+ form_class = forms.GISForm
+ template_name = "ishtar/forms/base_related_items.html"
+ model = models.GeoVectorData
+
+ def _get_source(self, request):
+ self.success_url = request.GET.get("source_url")
+
+ def get(self, request, *args, **kwargs):
+ self._get_source(request)
+ return super().get(request, *args, **kwargs)
+
+ def post(self, request, *args, **kwargs):
+ self._get_source(request)
+ return super().post(request, *args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ data = super(GeoFormMixin, self).get_context_data(**kwargs)
+ data["extra_form_modals"] = self.form_class.extra_form_modals
+ return data
+
+ def get_success_url(self):
+ if not self.success_url:
+ return reverse("edit-geo", kwargs={"pk": self.object.pk})
+ return f"{self.success_url}?open_item={self.object.pk}"
+
+
+class GeoEditView(GeoFormMixin, UpdateView):
+ page_name = _("Geo item modification")
+
+ def get_form_kwargs(self):
+ kwargs = super(GeoEditView, self).get_form_kwargs()
+ try:
+ geo = models.GeoVectorData.objects.get(pk=self.kwargs.get("pk"))
+ assert check_permission(self.request, "geo/edit", geo.pk)
+ except (AssertionError, models.GeoVectorData.DoesNotExist):
+ raise Http404()
+ initial = {}
+
+ for k in (
+ list(self.form_class.base_fields.keys()) +
+ models.GeoVectorData.RELATED_MODELS
+ ):
+ value = getattr(geo, k)
+ if hasattr(value, "all"):
+ value = ",".join([str(v.pk) for v in value.all()])
+ if hasattr(value, "pk"):
+ value = value.pk
+ initial[k] = value
+
+ kwargs["initial"] = initial
+ kwargs["user"] = self.request.user
+ self.geo = geo
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ kwargs = super(GeoEditView, self).get_context_data(**kwargs)
+ return kwargs
+
+
+class GeoCreateView(GeoFormMixin, UpdateView):
+ page_name = _("Geo item creation")
+
+ def get_form_kwargs(self):
+ if not hasattr(self.request.user, "ishtaruser"):
+ raise Http404()
+ ishtaruser = self.request.user.ishtaruser
+ kwargs = super(GeoCreateView, self).get_form_kwargs()
+ try:
+ content_type = ContentType.objects.get(
+ app_label=self.kwargs.get("app_source"),
+ model=self.kwargs.get("model_source")
+ )
+ except ContentType.DoesNotExist:
+ raise Http404()
+ model = content_type.model_class()
+ try:
+ obj = model.objects.get(pk=self.kwargs.get("source_pk"))
+ except model.DoesNotExist:
+ raise Http404()
+ if not ishtaruser.has_perm("add_geovectordata"): # -> add_own_geovectordata
+ # check permission to view attached item
+ if not getattr(model, "SLUG", None):
+ raise Http404()
+ if not ishtaruser.has_right(f"view_{model.SLUG}") \
+ or not ishtaruser.has_right(f"view_own_{model.SLUG}") \
+ or not obj.is_own(ishtaruser):
+ # check permission to view own attached item
+ raise Http404()
+ kwargs["user"] = self.request.user
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ kwargs = super(GeoCreateView, self).get_context_data(**kwargs)
+ return kwargs