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 waffle.mixins import WaffleFlagMixin 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, WaffleFlagMixin, 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" waffle_flag = "TF_MASS_UPLOAD" 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)