import json from urllib.parse import urlparse from django.http import HttpResponse from django.utils.translation import gettext_lazy as _ from django.shortcuts import get_object_or_404, redirect, Http404 from django.views.generic.base import TemplateView from django.urls import reverse_lazy, resolve from django.views.generic.edit import ( DeleteView, FormView, ) from dashboard.mixins import DashboardView, Http403 from evidence.models import Evidence, Annotation from evidence.forms import ( UploadForm, UserTagForm, ImportForm, EraseServerForm ) class ListEvidencesView(DashboardView, TemplateView): template_name = "evidences.html" section = "evidences" title = _("Evidences") breadcrumb = "Evidences" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) evidences = Evidence.get_all(self.request.user) context.update({ 'evidences': evidences, }) return context class UploadView(DashboardView, FormView): template_name = "upload.html" section = "evidences" title = _("Upload Evidence") breadcrumb = "Evidences / Upload" success_url = reverse_lazy('evidence:list') form_class = UploadForm def form_valid(self, form): form.save(self.request.user) response = super().form_valid(form) return response def form_invalid(self, form): #TODO: change file_input field class to "is-invalid" if any errors occur response = super().form_invalid(form) return response class ImportView(DashboardView, FormView): template_name = "upload.html" section = "evidences" title = _("Import Evidence") breadcrumb = "Evidences / Import" success_url = reverse_lazy('evidence:list') form_class = ImportForm def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['user'] = self.request.user return kwargs def form_valid(self, form): form.save() response = super().form_valid(form) return response def form_invalid(self, form): response = super().form_invalid(form) return response class EvidenceView(DashboardView, FormView): template_name = "ev_details.html" section = "evidences" title = _("Evidences") breadcrumb = "Evidences / Details" success_url = reverse_lazy('evidence:list') form_class = UserTagForm def get(self, request, *args, **kwargs): self.pk = kwargs['pk'] self.object = Evidence(self.pk) if self.object.owner != self.request.user.institution: raise Http403 self.object.get_annotations() return super().get(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'object': self.object, }) return context def get_form_kwargs(self): self.pk = self.kwargs.get('pk') kwargs = super().get_form_kwargs() kwargs['uuid'] = self.pk kwargs['user'] = self.request.user return kwargs def form_valid(self, form): form.save(self.request.user) response = super().form_valid(form) return response def form_invalid(self, form): response = super().form_invalid(form) return response def get_success_url(self): success_url = reverse_lazy('evidence:details', args=[self.pk]) return success_url class DownloadEvidenceView(DashboardView, TemplateView): def get(self, request, *args, **kwargs): pk = kwargs['pk'] evidence = Evidence(pk) if evidence.owner != self.request.user.institution: raise Http403() evidence.get_doc() data = json.dumps(evidence.doc) response = HttpResponse(data, content_type="application/json") response['Content-Disposition'] = 'attachment; filename={}'.format("credential.json") return response class AnnotationDeleteView(DashboardView, DeleteView): model = Annotation def get(self, request, *args, **kwargs): self.pk = kwargs['pk'] try: referer = self.request.META["HTTP_REFERER"] path_referer = urlparse(referer).path resolver_match = resolve(path_referer) url_name = resolver_match.view_name kwargs_view = resolver_match.kwargs except: # if is not possible resolve the reference path return 404 raise Http404 self.object = get_object_or_404( self.model, pk=self.pk, owner=self.request.user.institution ) self.object.delete() return redirect(url_name, **kwargs_view) class EraseServerView(DashboardView, FormView): template_name = "ev_eraseserver.html" section = "evidences" title = _("Evidences") breadcrumb = "Evidences / Details" success_url = reverse_lazy('evidence:list') form_class = EraseServerForm def get(self, request, *args, **kwargs): self.pk = kwargs['pk'] self.object = Evidence(self.pk) if self.object.owner != self.request.user.institution: raise Http403 self.object.get_annotations() return super().get(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'object': self.object, }) return context def get_form_kwargs(self): self.pk = self.kwargs.get('pk') kwargs = super().get_form_kwargs() kwargs['uuid'] = self.pk kwargs['user'] = self.request.user return kwargs def form_valid(self, form): form.save(self.request.user) response = super().form_valid(form) return response def form_invalid(self, form): response = super().form_invalid(form) return response def get_success_url(self): success_url = reverse_lazy('evidence:details', args=[self.pk]) return success_url