import csv import io from typing import Any from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin from django.http import HttpResponse, HttpResponseRedirect from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from django.views.generic import CreateView, DeleteView, FormView, UpdateView from django_filters.views import FilterView from rules.contrib.views import PermissionRequiredMixin from members.filters import MemberFilter from members.forms import MassUploadForm, MemberForm from members.models import Member from ..mixins import HTMXViewMixin class MemberListView(HTMXViewMixin, PermissionRequiredMixin, FilterView): filterset_class = MemberFilter paginate_by = 50 permission_denied_message = _("You do not have permission to view this page.") permission_required = "members.view_member" partial_name = "members/member_filter.html#content" menu_highlight = "members" def handle_no_permission(self) -> HttpResponseRedirect: messages.error(self.request, self.get_permission_denied_message()) return HttpResponseRedirect(reverse_lazy("backend:index")) def get_filterset_kwargs(self, filterset_class) -> dict[str, Any]: kwargs = super().get_filterset_kwargs(filterset_class) filter_values = {} if kwargs["data"] is None else kwargs["data"].dict() if not filter_values: filter_values.update({"user__is_active": "true"}) kwargs["data"] = filter_values return kwargs class MemberAddView(HTMXViewMixin, PermissionRequiredMixin, SuccessMessageMixin, CreateView): model = Member form_class = MemberForm permission_required = "members.add_member" permission_denied_message = _("You do not have permission to view this page.") success_message = _("Member %(name)s has been created successfully.") success_url = reverse_lazy("backend:members:list") partial_name = "members/member_form.html#content" menu_highlight = "members" def handle_no_permission(self) -> HttpResponseRedirect: messages.error(self.request, self.get_permission_denied_message()) return HttpResponseRedirect(reverse_lazy("backend:index")) def get_success_message(self, cleaned_data): return self.success_message % dict(cleaned_data, name=self.object.user.get_full_name()) class MemberEditView(HTMXViewMixin, PermissionRequiredMixin, SuccessMessageMixin, UpdateView): model = Member form_class = MemberForm permission_required = "members.change_member" permission_denied_message = _("You do not have permission to view this page.") success_message = _("Member %(name)s has been updated successfully.") success_url = reverse_lazy("backend:members:list") partial_name = "members/member_form.html#content" menu_highlight = "members" def handle_no_permission(self) -> HttpResponseRedirect: messages.error(self.request, self.get_permission_denied_message()) return HttpResponseRedirect(reverse_lazy("backend:index")) def get_success_message(self, cleaned_data): return self.success_message % dict(cleaned_data, name=self.object.user.get_full_name()) def get_initial(self): initial = super().get_initial() user = self.get_object().user initial.update({"first_name": user.first_name, "last_name": user.last_name, "email": user.email, "admin": user.is_superuser}) return initial class MemberDeleteView(HTMXViewMixin, PermissionRequiredMixin, SuccessMessageMixin, DeleteView): model = Member success_message = _("Member %(name)s has been deleted successfully.") permission_required = "members.delete_member" permission_denied_message = _("You do not have permission to view this page.") success_url = reverse_lazy("backend:members:list") partial_name = "members/member_confirm_delete.html#content" menu_highlight = "members" def handle_no_permission(self) -> HttpResponseRedirect: messages.error(self.request, self.get_permission_denied_message()) return HttpResponseRedirect(reverse_lazy("backend:index")) def get_success_message(self, cleaned_data): return self.success_message % dict(cleaned_data, name=self.object.user.get_full_name()) def post(self, request, *args, **kwargs): self.object = self.get_object() # Soft delete user self.object.user.is_active = False self.object.user.save() # Do not delete the member object messages.success(self.request, self.get_success_message({"name": self.object.user.get_full_name()})) return HttpResponseRedirect(self.get_success_url()) class MemberLoadView(PermissionRequiredMixin, HTMXViewMixin, SuccessMessageMixin, FormView): form_class = MassUploadForm permission_required = "members.add_member" permission_denied_message = _("You do not have permission to view this page.") success_url = reverse_lazy("backend:members:list") success_message = _("Members have been added successfully.") partial_name = "members/member_load.html#content" menu_highlight = "members" template_name = "members/member_load.html" def handle_no_permission(self) -> HttpResponseRedirect: messages.error(self.request, self.get_permission_denied_message()) return HttpResponseRedirect(reverse_lazy("backend:index")) def form_valid(self, form: MassUploadForm) -> HttpResponse: member_data = self.request.FILES["members_data"] with io.TextIOWrapper(member_data.file) as csvfile: reader = csv.reader(csvfile) for row in reader: member_information = {"first_name": row[0], "last_name": row[1], "email": row[2], "birthday": row[3], "license": row[4]} member = Member.create(first_name=member_information["fist_name"], last_name=member_information["last_name"], email=member_information["email"]) member.license = member_information["license"] if member_information["birthday"] is not None and member_information["birthday"] != "": member.birthday = member_information["birthday"] member.save(update_fields=["license", "birthday"]) return super().form_valid(form)