Sith/club/views.py

728 lines
24 KiB
Python
Raw Permalink Normal View History

#
# Copyright 2016,2017
# - Skia <skia@libskia.so>
2017-08-17 00:07:19 +02:00
# - Sli <antoine@bartuccio.fr>
#
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
# http://ae.utbm.fr.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License a published by the Free Software
# Foundation; either version 3 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
# Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
import csv
from django.conf import settings
2025-01-10 15:17:41 +01:00
from django.contrib.auth.mixins import PermissionRequiredMixin
2024-06-24 13:07:36 +02:00
from django.core.exceptions import NON_FIELD_ERRORS, PermissionDenied, ValidationError
from django.core.paginator import InvalidPage, Paginator
from django.db.models import Sum
from django.http import (
Http404,
2024-06-24 13:07:36 +02:00
HttpResponseRedirect,
StreamingHttpResponse,
)
2024-06-24 13:07:36 +02:00
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse, reverse_lazy
2016-09-02 21:21:57 +02:00
from django.utils import timezone
from django.utils.translation import gettext as _t
2024-06-24 13:07:36 +02:00
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, ListView, View
2024-06-24 13:07:36 +02:00
from django.views.generic.edit import CreateView, DeleteView, UpdateView
2016-09-08 03:29:49 +02:00
from club.forms import (
ClubAdminEditForm,
ClubEditForm,
ClubMemberForm,
MailingForm,
SellingsForm,
)
2024-06-24 13:07:36 +02:00
from club.models import Club, Mailing, MailingSubscription, Membership
from com.views import (
PosterCreateBaseView,
PosterDeleteBaseView,
PosterEditBaseView,
PosterListBaseView,
)
from core.auth.mixins import CanCreateMixin, CanEditMixin, CanViewMixin
from core.models import PageRev
from core.views import DetailFormView, PageEditViewBase
from core.views.mixins import TabedViewMixin
from counter.models import Selling
class ClubTabsMixin(TabedViewMixin):
def get_tabs_title(self):
obj = self.get_object()
if isinstance(obj, PageRev):
self.object = obj.page.club
return self.object.get_display_name()
def get_list_of_tabs(self):
tab_list = [
2018-10-05 21:51:54 +02:00
{
"url": reverse("club:club_view", kwargs={"club_id": self.object.id}),
"slug": "infos",
"name": _("Infos"),
}
]
if self.request.user.can_view(self.object):
tab_list.extend(
[
{
"url": reverse(
"club:club_members", kwargs={"club_id": self.object.id}
),
"slug": "members",
"name": _("Members"),
},
{
"url": reverse(
"club:club_old_members", kwargs={"club_id": self.object.id}
),
"slug": "elderlies",
"name": _("Old members"),
},
]
2018-10-05 21:51:54 +02:00
)
if self.object.page:
2018-10-05 21:51:54 +02:00
tab_list.append(
{
"url": reverse(
"club:club_hist", kwargs={"club_id": self.object.id}
),
"slug": "history",
"name": _("History"),
}
)
if self.request.user.can_edit(self.object):
tab_list.extend(
[
{
"url": reverse(
"club:tools", kwargs={"club_id": self.object.id}
),
"slug": "tools",
"name": _("Tools"),
},
{
"url": reverse(
"club:club_edit", kwargs={"club_id": self.object.id}
),
"slug": "edit",
"name": _("Edit"),
},
]
2018-10-05 21:51:54 +02:00
)
if self.object.page and self.request.user.can_edit(self.object.page):
2018-10-05 21:51:54 +02:00
tab_list.append(
{
"url": reverse(
"core:page_edit",
kwargs={"page_name": self.object.page.get_full_name()},
),
"slug": "page_edit",
"name": _("Edit club page"),
}
)
tab_list.extend(
[
{
"url": reverse(
"club:club_sellings", kwargs={"club_id": self.object.id}
),
"slug": "sellings",
"name": _("Sellings"),
},
{
"url": reverse(
"club:mailing", kwargs={"club_id": self.object.id}
),
"slug": "mailing",
"name": _("Mailing list"),
},
{
"url": reverse(
"club:poster_list", kwargs={"club_id": self.object.id}
),
"slug": "posters",
"name": _("Posters list"),
},
]
2018-10-05 21:51:54 +02:00
)
return tab_list
2017-06-12 08:54:48 +02:00
2016-07-27 17:23:02 +02:00
class ClubListView(ListView):
2024-07-12 09:34:16 +02:00
"""List the Clubs."""
2018-10-05 21:51:54 +02:00
model = Club
2018-10-05 21:51:54 +02:00
template_name = "club/club_list.jinja"
2017-06-12 08:54:48 +02:00
class ClubView(ClubTabsMixin, DetailView):
2024-07-12 09:34:16 +02:00
"""Front page of a Club."""
2018-10-05 21:51:54 +02:00
model = Club
pk_url_kwarg = "club_id"
2018-10-05 21:51:54 +02:00
template_name = "club/club_detail.jinja"
current_tab = "infos"
def get_context_data(self, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(**kwargs)
kwargs["page_revision"] = (
PageRev.objects.filter(page_id=self.object.page_id)
.order_by("-date")
.first()
)
return kwargs
class ClubRevView(ClubView):
2024-07-12 09:34:16 +02:00
"""Display a specific page revision."""
2018-10-05 21:51:54 +02:00
def dispatch(self, request, *args, **kwargs):
obj = self.get_object()
2018-10-05 21:51:54 +02:00
self.revision = get_object_or_404(PageRev, pk=kwargs["rev_id"], page__club=obj)
2024-06-27 14:46:43 +02:00
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(**kwargs)
2018-10-05 21:51:54 +02:00
kwargs["page_revision"] = self.revision.content
return kwargs
class ClubPageEditView(ClubTabsMixin, PageEditViewBase):
2018-10-05 21:51:54 +02:00
template_name = "club/pagerev_edit.jinja"
current_tab = "page_edit"
def dispatch(self, request, *args, **kwargs):
2018-10-05 21:51:54 +02:00
self.club = get_object_or_404(Club, pk=kwargs["club_id"])
if not self.club.page:
raise Http404
2024-06-27 14:46:43 +02:00
return super().dispatch(request, *args, **kwargs)
def get_object(self):
self.page = self.club.page
return self._get_revision()
def get_success_url(self, **kwargs):
2018-10-05 21:51:54 +02:00
return reverse_lazy("club:club_view", kwargs={"club_id": self.club.id})
class ClubPageHistView(ClubTabsMixin, CanViewMixin, DetailView):
2024-07-12 09:34:16 +02:00
"""Modification hostory of the page."""
2018-10-05 21:51:54 +02:00
model = Club
pk_url_kwarg = "club_id"
2018-10-05 21:51:54 +02:00
template_name = "club/page_history.jinja"
current_tab = "history"
2017-06-12 08:54:48 +02:00
class ClubToolsView(ClubTabsMixin, CanEditMixin, DetailView):
2024-07-12 09:34:16 +02:00
"""Tools page of a Club."""
2018-10-05 21:51:54 +02:00
2016-05-09 11:49:01 +02:00
model = Club
pk_url_kwarg = "club_id"
2018-10-05 21:51:54 +02:00
template_name = "club/club_tools.jinja"
current_tab = "tools"
2016-09-02 09:23:21 +02:00
2017-06-12 08:54:48 +02:00
class ClubMembersView(ClubTabsMixin, CanViewMixin, DetailFormView):
2024-07-12 09:34:16 +02:00
"""View of a club's members."""
2018-10-05 21:51:54 +02:00
model = Club
pk_url_kwarg = "club_id"
2016-02-04 08:59:03 +01:00
form_class = ClubMemberForm
2018-10-05 21:51:54 +02:00
template_name = "club/club_members.jinja"
current_tab = "members"
def get_form_kwargs(self):
2024-06-27 14:46:43 +02:00
kwargs = super().get_form_kwargs()
kwargs["request_user"] = self.request.user
2025-01-16 15:10:46 +01:00
kwargs["club"] = self.object
2019-04-24 18:17:03 +02:00
kwargs["club_members"] = self.members
return kwargs
def get_context_data(self, *args, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(*args, **kwargs)
2019-04-24 18:17:03 +02:00
kwargs["members"] = self.members
return kwargs
2016-02-04 08:59:03 +01:00
def form_valid(self, form):
2024-07-12 09:34:16 +02:00
"""Check user rights."""
2024-06-27 14:46:43 +02:00
resp = super().form_valid(form)
data = form.clean()
users = data.pop("users", [])
2019-04-24 18:17:03 +02:00
users_old = data.pop("users_old", [])
for user in users:
2025-01-16 15:10:46 +01:00
Membership(club=self.object, user=user, **data).save()
2019-04-24 18:17:03 +02:00
for user in users_old:
2025-01-16 15:10:46 +01:00
membership = self.object.get_membership_for(user)
2019-04-24 18:17:03 +02:00
membership.end_date = timezone.now()
membership.save()
return resp
2016-09-27 21:05:57 +02:00
def dispatch(self, request, *args, **kwargs):
self.members = self.get_object().members.ongoing().order_by("-role")
2024-06-27 14:46:43 +02:00
return super().dispatch(request, *args, **kwargs)
def get_success_url(self, **kwargs):
2025-01-16 15:10:46 +01:00
return reverse_lazy("club:club_members", kwargs={"club_id": self.object.id})
2017-06-12 08:54:48 +02:00
class ClubOldMembersView(ClubTabsMixin, CanViewMixin, DetailView):
2024-07-12 09:34:16 +02:00
"""Old members of a club."""
2018-10-05 21:51:54 +02:00
2016-09-02 21:21:57 +02:00
model = Club
pk_url_kwarg = "club_id"
2018-10-05 21:51:54 +02:00
template_name = "club/club_old_members.jinja"
current_tab = "elderlies"
2016-09-02 21:21:57 +02:00
2017-06-12 08:54:48 +02:00
class ClubSellingView(ClubTabsMixin, CanEditMixin, DetailFormView):
2024-07-12 09:34:16 +02:00
"""Sellings of a club."""
2018-10-05 21:51:54 +02:00
2016-09-08 03:29:49 +02:00
model = Club
pk_url_kwarg = "club_id"
2018-10-05 21:51:54 +02:00
template_name = "club/club_sellings.jinja"
2016-09-08 03:29:49 +02:00
current_tab = "sellings"
form_class = SellingsForm
paginate_by = 70
def dispatch(self, request, *args, **kwargs):
try:
self.asked_page = int(request.GET.get("page", 1))
2024-06-27 14:46:43 +02:00
except ValueError as e:
raise Http404 from e
return super().dispatch(request, *args, **kwargs)
2016-09-08 03:29:49 +02:00
def get_form_kwargs(self):
2024-06-27 14:46:43 +02:00
kwargs = super().get_form_kwargs()
kwargs["club"] = self.object
return kwargs
def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
2016-09-08 03:29:49 +02:00
def get_context_data(self, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(**kwargs)
2016-09-08 03:29:49 +02:00
qs = Selling.objects.filter(club=self.object)
kwargs["result"] = qs[:0]
kwargs["paginated_result"] = kwargs["result"]
kwargs["total"] = 0
kwargs["total_quantity"] = 0
kwargs["benefit"] = 0
form = self.get_form()
2016-09-08 03:29:49 +02:00
if form.is_valid():
2016-09-12 17:34:17 +02:00
if not len([v for v in form.cleaned_data.values() if v is not None]):
qs = Selling.objects.filter(id=-1)
2018-10-05 21:51:54 +02:00
if form.cleaned_data["begin_date"]:
qs = qs.filter(date__gte=form.cleaned_data["begin_date"])
if form.cleaned_data["end_date"]:
qs = qs.filter(date__lte=form.cleaned_data["end_date"])
if form.cleaned_data["counters"]:
qs = qs.filter(counter__in=form.cleaned_data["counters"])
selected_products = []
if form.cleaned_data["products"]:
selected_products.extend(form.cleaned_data["products"])
if form.cleaned_data["archived_products"]:
2019-11-28 15:14:51 +01:00
selected_products.extend(form.cleaned_data["archived_products"])
if len(selected_products) > 0:
qs = qs.filter(product__in=selected_products)
2018-10-05 21:51:54 +02:00
kwargs["result"] = qs.all().order_by("-id")
kwargs["total"] = sum([s.quantity * s.unit_price for s in kwargs["result"]])
total_quantity = qs.all().aggregate(Sum("quantity"))
if total_quantity["quantity__sum"]:
kwargs["total_quantity"] = total_quantity["quantity__sum"]
benefit = (
qs.exclude(product=None).all().aggregate(Sum("product__purchase_price"))
)
if benefit["product__purchase_price__sum"]:
kwargs["benefit"] = benefit["product__purchase_price__sum"]
kwargs["paginator"] = Paginator(kwargs["result"], self.paginate_by)
try:
kwargs["paginated_result"] = kwargs["paginator"].page(self.asked_page)
2024-06-27 14:46:43 +02:00
except InvalidPage as e:
raise Http404 from e
2016-09-08 03:29:49 +02:00
return kwargs
2017-06-12 08:54:48 +02:00
2016-11-07 22:05:09 +01:00
class ClubSellingCSVView(ClubSellingView):
2024-07-12 09:34:16 +02:00
"""Generate sellings in csv for a given period."""
2016-11-07 22:05:09 +01:00
class StreamWriter:
2024-07-12 09:34:16 +02:00
"""Implements a file-like interface for streaming the CSV."""
def write(self, value):
"""Write the value by returning it, instead of storing in a buffer."""
return value
def write_selling(self, selling):
row = [selling.date, selling.counter]
if selling.seller:
row.append(selling.seller.get_display_name())
else:
row.append("")
if selling.customer:
row.append(selling.customer.user.get_display_name())
else:
row.append("")
row = [
*row,
selling.label,
selling.quantity,
selling.quantity * selling.unit_price,
selling.get_payment_method_display(),
]
if selling.product:
row.append(selling.product.selling_price)
row.append(selling.product.purchase_price)
row.append(selling.product.selling_price - selling.product.purchase_price)
else:
row = [*row, "", "", ""]
return row
2016-11-07 22:05:09 +01:00
def get(self, request, *args, **kwargs):
self.object = self.get_object()
kwargs = self.get_context_data(**kwargs)
# Use the StreamWriter class instead of request for streaming
pseudo_buffer = self.StreamWriter()
2018-10-05 21:51:54 +02:00
writer = csv.writer(
pseudo_buffer, delimiter=";", lineterminator="\n", quoting=csv.QUOTE_ALL
2018-10-05 21:51:54 +02:00
)
writer.writerow([_t("Quantity"), kwargs["total_quantity"]])
writer.writerow([_t("Total"), kwargs["total"]])
writer.writerow([_t("Benefit"), kwargs["benefit"]])
writer.writerow(
[
_t("Date"),
_t("Counter"),
_t("Barman"),
_t("Customer"),
_t("Label"),
_t("Quantity"),
_t("Total"),
_t("Payment method"),
_t("Selling price"),
_t("Purchase price"),
_t("Benefit"),
]
)
# Stream response
response = StreamingHttpResponse(
(
writer.writerow(self.write_selling(selling))
for selling in kwargs["result"]
),
content_type="text/csv",
)
name = _("Sellings") + "_" + self.object.name + ".csv"
response["Content-Disposition"] = "filename=" + name
2016-11-07 22:05:09 +01:00
return response
2017-06-12 08:54:48 +02:00
class ClubEditView(ClubTabsMixin, CanEditMixin, UpdateView):
"""Edit a Club.
Regular club board members will be able to edit the main infos
(like the logo and the description).
Admins will also be able to edit the club properties
(like the name and the parent club).
"""
2018-10-05 21:51:54 +02:00
2016-02-08 17:09:52 +01:00
model = Club
pk_url_kwarg = "club_id"
template_name = "club/edit_club.jinja"
current_tab = "edit"
2016-09-02 09:23:21 +02:00
def get_form_class(self):
if self.object.is_owned_by(self.request.user):
return ClubAdminEditForm
return ClubEditForm
2016-05-03 12:06:03 +02:00
2017-06-12 08:54:48 +02:00
class ClubCreateView(PermissionRequiredMixin, CreateView):
2024-07-12 09:34:16 +02:00
"""Create a club (for the Sith admin)."""
2018-10-05 21:51:54 +02:00
2016-05-03 12:06:03 +02:00
model = Club
pk_url_kwarg = "club_id"
fields = ["name", "parent"]
template_name = "core/create.jinja"
permission_required = "club.add_club"
2016-05-03 12:06:03 +02:00
2017-06-12 08:54:48 +02:00
2016-09-02 21:21:57 +02:00
class MembershipSetOldView(CanEditMixin, DetailView):
2024-07-12 09:34:16 +02:00
"""Set a membership as beeing old."""
2018-10-05 21:51:54 +02:00
2016-09-02 21:21:57 +02:00
model = Membership
pk_url_kwarg = "membership_id"
def get(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.end_date = timezone.now()
self.object.save()
2018-10-05 21:51:54 +02:00
return HttpResponseRedirect(
reverse(
"club:club_members",
args=self.args,
kwargs={"club_id": self.object.club.id},
)
)
2016-09-02 21:21:57 +02:00
def post(self, request, *args, **kwargs):
self.object = self.get_object()
2018-10-05 21:51:54 +02:00
return HttpResponseRedirect(
reverse(
"club:club_members",
args=self.args,
kwargs={"club_id": self.object.club.id},
)
)
2016-09-02 21:21:57 +02:00
2017-06-12 08:54:48 +02:00
2025-01-10 15:17:41 +01:00
class MembershipDeleteView(PermissionRequiredMixin, DeleteView):
2024-07-12 09:34:16 +02:00
"""Delete a membership (for admins only)."""
model = Membership
pk_url_kwarg = "membership_id"
template_name = "core/delete_confirm.jinja"
2025-01-10 15:17:41 +01:00
permission_required = "club.delete_membership"
def get_success_url(self):
return reverse_lazy("core:user_clubs", kwargs={"user_id": self.object.user.id})
class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
2024-07-12 09:34:16 +02:00
"""A list of mailing for a given club."""
2018-10-05 21:51:54 +02:00
model = Club
form_class = MailingForm
pk_url_kwarg = "club_id"
2017-08-17 00:07:19 +02:00
template_name = "club/mailing.jinja"
2018-10-05 21:51:54 +02:00
current_tab = "mailing"
2017-08-17 20:55:20 +02:00
def get_form_kwargs(self):
2024-06-27 14:46:43 +02:00
kwargs = super().get_form_kwargs()
kwargs["club_id"] = self.object.id
kwargs["user_id"] = self.request.user.id
kwargs["mailings"] = self.object.mailings.all()
return kwargs
2017-08-17 00:07:19 +02:00
def get_context_data(self, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(**kwargs)
mailings = list(self.object.mailings.all())
kwargs["club"] = self.object
kwargs["user"] = self.request.user
kwargs["mailings"] = mailings
kwargs["mailings_moderated"] = [m for m in mailings if m.is_moderated]
kwargs["mailings_not_moderated"] = [m for m in mailings if not m.is_moderated]
kwargs["form_actions"] = {
"NEW_MALING": self.form_class.ACTION_NEW_MAILING,
"NEW_SUBSCRIPTION": self.form_class.ACTION_NEW_SUBSCRIPTION,
"REMOVE_SUBSCRIPTION": self.form_class.ACTION_REMOVE_SUBSCRIPTION,
}
2017-08-17 00:07:19 +02:00
return kwargs
def add_new_mailing(self, cleaned_data) -> ValidationError | None:
2024-07-12 09:34:16 +02:00
"""Create a new mailing list from the form."""
mailing = Mailing(
club=self.object,
email=cleaned_data["mailing_email"],
moderator=self.request.user,
is_moderated=False,
)
try:
mailing.clean()
except ValidationError as validation_error:
return validation_error
mailing.save()
return None
2017-12-22 12:06:23 +01:00
def add_new_subscription(self, cleaned_data) -> ValidationError | None:
2024-07-12 09:34:16 +02:00
"""Add mailing subscriptions for each user given and/or for the specified email in form."""
2019-05-09 18:06:11 +02:00
users_to_save = []
for user in cleaned_data["subscription_users"]:
sub = MailingSubscription(
mailing=cleaned_data["subscription_mailing"], user=user
)
2019-05-09 18:06:11 +02:00
try:
sub.clean()
except ValidationError as validation_error:
return validation_error
sub.save()
users_to_save.append(sub)
2017-08-17 00:07:19 +02:00
if cleaned_data["subscription_email"]:
sub = MailingSubscription(
mailing=cleaned_data["subscription_mailing"],
email=cleaned_data["subscription_email"],
)
try:
sub.clean()
except ValidationError as validation_error:
return validation_error
sub.save()
2019-05-09 18:06:11 +02:00
# Save users after we are sure there is no error
for user in users_to_save:
user.save()
return None
2018-10-05 21:51:54 +02:00
def remove_subscription(self, cleaned_data):
2024-07-12 09:34:16 +02:00
"""Remove specified users from a mailing list."""
fields = [
val for key, val in cleaned_data.items() if key.startswith("removal_")
]
for field in fields:
for sub in field:
sub.delete()
def form_valid(self, form):
2024-06-27 14:46:43 +02:00
resp = super().form_valid(form)
2017-08-17 00:07:19 +02:00
cleaned_data = form.clean()
error = None
2017-08-17 00:07:19 +02:00
if cleaned_data["action"] == self.form_class.ACTION_NEW_MAILING:
error = self.add_new_mailing(cleaned_data)
2017-08-17 00:07:19 +02:00
if cleaned_data["action"] == self.form_class.ACTION_NEW_SUBSCRIPTION:
error = self.add_new_subscription(cleaned_data)
if cleaned_data["action"] == self.form_class.ACTION_REMOVE_SUBSCRIPTION:
self.remove_subscription(cleaned_data)
if error:
form.add_error(NON_FIELD_ERRORS, error)
return self.form_invalid(form)
return resp
2017-08-17 00:07:19 +02:00
def get_success_url(self, **kwargs):
return reverse("club:mailing", kwargs={"club_id": self.object.id})
2017-08-17 20:55:20 +02:00
class MailingDeleteView(CanEditMixin, DeleteView):
model = Mailing
2018-10-05 21:51:54 +02:00
template_name = "core/delete_confirm.jinja"
2017-08-17 20:55:20 +02:00
pk_url_kwarg = "mailing_id"
2017-08-21 19:53:17 +02:00
redirect_page = None
2017-08-17 20:55:20 +02:00
def dispatch(self, request, *args, **kwargs):
self.club_id = self.get_object().club.id
2024-06-27 14:46:43 +02:00
return super().dispatch(request, *args, **kwargs)
2017-08-17 20:55:20 +02:00
def get_success_url(self, **kwargs):
2017-08-21 19:53:17 +02:00
if self.redirect_page:
return reverse_lazy(self.redirect_page)
else:
2018-10-05 21:51:54 +02:00
return reverse_lazy("club:mailing", kwargs={"club_id": self.club_id})
2017-08-17 20:55:20 +02:00
class MailingSubscriptionDeleteView(CanEditMixin, DeleteView):
model = MailingSubscription
2018-10-05 21:51:54 +02:00
template_name = "core/delete_confirm.jinja"
2017-08-17 20:55:20 +02:00
pk_url_kwarg = "mailing_subscription_id"
def dispatch(self, request, *args, **kwargs):
self.club_id = self.get_object().mailing.club.id
2024-06-27 14:46:43 +02:00
return super().dispatch(request, *args, **kwargs)
2017-08-17 20:55:20 +02:00
def get_success_url(self, **kwargs):
2018-10-05 21:51:54 +02:00
return reverse_lazy("club:mailing", kwargs={"club_id": self.club_id})
2017-10-02 00:10:52 +02:00
2017-10-02 00:10:52 +02:00
class MailingAutoGenerationView(View):
def dispatch(self, request, *args, **kwargs):
2018-10-05 21:51:54 +02:00
self.mailing = get_object_or_404(Mailing, pk=kwargs["mailing_id"])
2017-10-02 00:10:52 +02:00
if not request.user.can_edit(self.mailing):
raise PermissionDenied
2024-06-27 14:46:43 +02:00
return super().dispatch(request, *args, **kwargs)
2017-10-02 00:10:52 +02:00
def get(self, request, *args, **kwargs):
club = self.mailing.club
self.mailing.subscriptions.all().delete()
2018-10-05 21:51:54 +02:00
members = club.members.filter(
role__gte=settings.SITH_CLUB_ROLES_ID["Board member"]
).exclude(end_date__lte=timezone.now())
2017-10-02 00:10:52 +02:00
for member in members.all():
MailingSubscription(user=member.user, mailing=self.mailing).save()
2018-10-05 21:51:54 +02:00
return redirect("club:mailing", club_id=club.id)
2017-10-02 00:10:52 +02:00
class PosterListView(ClubTabsMixin, PosterListBaseView, CanViewMixin):
2024-07-12 09:34:16 +02:00
"""List communication posters."""
2017-11-01 18:12:33 +01:00
2017-12-05 15:53:36 +01:00
def get_object(self):
return self.club
2017-12-05 15:24:46 +01:00
2017-11-01 18:12:33 +01:00
def get_context_data(self, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(**kwargs)
2018-10-05 21:51:54 +02:00
kwargs["app"] = "club"
kwargs["club"] = self.club
2017-11-01 18:12:33 +01:00
return kwargs
2017-12-05 15:24:46 +01:00
class PosterCreateView(PosterCreateBaseView, CanCreateMixin):
2024-07-12 09:34:16 +02:00
"""Create communication poster."""
2017-11-01 18:12:33 +01:00
pk_url_kwarg = "club_id"
2017-11-01 18:12:33 +01:00
def get_object(self):
2024-06-27 14:46:43 +02:00
obj = super().get_object()
if not obj:
return self.club
return obj
def get_success_url(self, **kwargs):
2018-10-05 21:51:54 +02:00
return reverse_lazy("club:poster_list", kwargs={"club_id": self.club.id})
2017-11-01 18:12:33 +01:00
2017-12-05 15:24:46 +01:00
class PosterEditView(ClubTabsMixin, PosterEditBaseView, CanEditMixin):
2024-07-12 09:34:16 +02:00
"""Edit communication poster."""
2017-11-01 18:12:33 +01:00
2017-11-28 14:43:05 +01:00
def get_success_url(self):
2018-10-05 21:51:54 +02:00
return reverse_lazy("club:poster_list", kwargs={"club_id": self.club.id})
2017-11-01 18:12:33 +01:00
def get_context_data(self, **kwargs):
2024-06-27 14:46:43 +02:00
kwargs = super().get_context_data(**kwargs)
2018-10-05 21:51:54 +02:00
kwargs["app"] = "club"
2017-11-01 18:12:33 +01:00
return kwargs
2017-12-05 15:24:46 +01:00
class PosterDeleteView(PosterDeleteBaseView, ClubTabsMixin, CanEditMixin):
2024-07-12 09:34:16 +02:00
"""Delete communication poster."""
2017-12-05 15:24:46 +01:00
def get_success_url(self):
2018-10-05 21:51:54 +02:00
return reverse_lazy("club:poster_list", kwargs={"club_id": self.club.id})