diff options
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 |
commit | df8a001203e9e936ae5bae4e06f5631d87fb3ada (patch) | |
tree | b7bece5905a4a433cbde9132bec669669f1c8ea0 /ishtar_common/views.py | |
parent | 3ff82007369b115406c2f2effbdfb13188167bb7 (diff) | |
download | Ishtar-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.py | 99 |
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 |