from smtplib import SMTPException from django.urls import reverse_lazy from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ from django.views.generic.base import TemplateView from django.views.generic.edit import ( CreateView, UpdateView, DeleteView, ) from django.views.generic import FormView import logging from dashboard.mixins import DashboardView, Http403 from user.models import User, Institution from admin.email import NotifyActivateUserByEmail from admin.forms import CustomStatusLabelForm, CustomStatusValueForm, CustomStatusFormSet from evidence.models import Annotation, AllowedValue import uuid logger = logging.getLogger('dhub') class AdminView(DashboardView): def get(self, *args, **kwargs): response = super().get(*args, **kwargs) if not self.request.user.is_admin: raise Http403 return response class PanelView(AdminView, TemplateView): template_name = "admin_panel.html" title = _("Admin") breadcrumb = _("admin") + " /" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) return context class UsersView(AdminView, TemplateView): template_name = "admin_users.html" title = _("Users") breadcrumb = _("admin / Users") + " /" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ "users": User.objects.filter() }) return context class CreateUserView(AdminView, NotifyActivateUserByEmail, CreateView): template_name = "user.html" title = _("User") breadcrumb = _("admin / User") + " /" success_url = reverse_lazy('admin:users') model = User fields = ( "email", "password", "is_admin", ) def form_valid(self, form): form.instance.institution = self.request.user.institution form.instance.set_password(form.instance.password) response = super().form_valid(form) try: self.send_email(form.instance) except SMTPException as e: messages.error(self.request, e) return response class DeleteUserView(AdminView, DeleteView): template_name = "delete_user.html" title = _("Delete user") breadcrumb = "admin / Delete user" success_url = reverse_lazy('admin:users') model = User fields = ( "email", "password", "is_admin", ) def form_valid(self, form): response = super().form_valid(form) return response class EditUserView(AdminView, UpdateView): template_name = "user.html" title = _("Edit user") breadcrumb = "admin / Edit user" success_url = reverse_lazy('admin:users') model = User fields = ( "email", "is_admin", ) def get_form_kwargs(self): pk = self.kwargs.get('pk') self.object = get_object_or_404(self.model, pk=pk) #self.object.set_password(self.object.password) kwargs = super().get_form_kwargs() return kwargs class InstitutionView(AdminView, UpdateView): template_name = "institution.html" title = _("Edit institution") section = "admin" subtitle = _('Edit institution') model = Institution success_url = reverse_lazy('admin:panel') fields = ( "name", "logo", "location", "responsable_person", "supervisor_person" ) def get_form_kwargs(self): self.object = self.request.user.institution kwargs = super().get_form_kwargs() return kwargs class AddReservedAnnotationView(AdminView, FormView): template_name = "reserved.html" title = _("New Custom State Labels") breadcrumb = "Admin / Custom State Labels (new name?)" success_url = reverse_lazy('admin:panel') form_class = CustomStatusLabelForm formset_class = CustomStatusFormSet def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) if self.request.POST: context['form'] = self.form_class(self.request.POST) context['formset'] = self.formset_class(self.request.POST) else: context['form'] = self.form_class() context['formset'] = self.formset_class() context['subtitle'] = _("Add Custom Status Label") return context def form_valid(self, form): context = self.get_context_data() formset = context['formset'] form = context['form'] if form.is_valid(): label_name = form.cleaned_data['label_name'] else: return self.form_invalid(form) if formset.is_valid(): annotation = Annotation.objects.create( uuid=uuid.uuid4(), owner=self.request.user.institution, user=self.request.user, type=Annotation.Type.ADMIN, key=label_name, value=label_name ) first_state = None for form in formset: state = form.cleaned_data.get('label_state') if state and not first_state: first_state = state annotation.value = state annotation.save() if state: AllowedValue.objects.create( annotation=annotation, value=state ) logger.info("Saving custom label to db: " + label_name) self.success_message = _("Custom status label has been added.") self.success_url = reverse_lazy('admin:panel') return super().form_valid(form) else: logger.error("Formset is not valid") logger.error(formset.errors) return self.form_invalid(form)