150 lines
6.3 KiB
Python
150 lines
6.3 KiB
Python
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 <strong>%(name)s</strong> 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 <strong>%(name)s</strong> 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 <strong>%(name)s</strong> 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)
|