mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-10 11:59:23 +00:00
change Club.unix_name
to Club.slug_name
and remove it from forms
This commit is contained in:
@ -19,8 +19,8 @@ from club.models import Club, Membership
|
||||
|
||||
@admin.register(Club)
|
||||
class ClubAdmin(admin.ModelAdmin):
|
||||
list_display = ("name", "unix_name", "parent", "is_active")
|
||||
search_fields = ("name", "unix_name")
|
||||
list_display = ("name", "slug_name", "parent", "is_active")
|
||||
search_fields = ("name", "slug_name")
|
||||
autocomplete_fields = (
|
||||
"parent",
|
||||
"board_group",
|
||||
|
@ -1,10 +1,9 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
import club.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [("club", "0010_auto_20170912_2028")]
|
||||
@ -15,7 +14,7 @@ class Migration(migrations.Migration):
|
||||
name="owner_group",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
default=club.models.get_default_owner_group,
|
||||
default=lambda: settings.SITH_ROOT_USER_ID,
|
||||
related_name="owned_club",
|
||||
to="core.Group",
|
||||
),
|
||||
|
@ -0,0 +1,75 @@
|
||||
# Generated by Django 4.2.17 on 2025-02-28 20:34
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
import core.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("core", "0044_alter_userban_options"),
|
||||
("club", "0013_alter_club_board_group_alter_club_members_group_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(name="club", options={"ordering": ["name"]}),
|
||||
migrations.RenameField(
|
||||
model_name="club",
|
||||
old_name="unix_name",
|
||||
new_name="slug_name",
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="club",
|
||||
name="name",
|
||||
field=models.CharField(unique=True, max_length=64, verbose_name="name"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="club",
|
||||
name="slug_name",
|
||||
field=models.SlugField(
|
||||
editable=False, max_length=30, unique=True, verbose_name="slug name"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="club",
|
||||
name="id",
|
||||
field=models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="club",
|
||||
name="logo",
|
||||
field=core.fields.ResizedImageField(
|
||||
blank=True,
|
||||
force_format="WEBP",
|
||||
height=200,
|
||||
null=True,
|
||||
upload_to="club_logos",
|
||||
verbose_name="logo",
|
||||
width=200,
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="club",
|
||||
name="page",
|
||||
field=models.OneToOneField(
|
||||
blank=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="club",
|
||||
to="core.page",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="club",
|
||||
name="short_description",
|
||||
field=models.CharField(
|
||||
blank=True,
|
||||
default="",
|
||||
help_text="A summary of what your club does. This will be displayed on the club list page.",
|
||||
max_length=1000,
|
||||
verbose_name="short description",
|
||||
),
|
||||
),
|
||||
]
|
120
club/models.py
120
club/models.py
@ -26,7 +26,6 @@ from __future__ import annotations
|
||||
from typing import Iterable, Self
|
||||
|
||||
from django.conf import settings
|
||||
from django.core import validators
|
||||
from django.core.cache import cache
|
||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||
from django.core.validators import RegexValidator, validate_email
|
||||
@ -35,48 +34,43 @@ from django.db.models import Exists, F, OuterRef, Q
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.text import slugify
|
||||
from django.utils.timezone import localdate
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from core.fields import ResizedImageField
|
||||
from core.models import Group, Notification, Page, SithFile, User
|
||||
|
||||
# Create your models here.
|
||||
|
||||
|
||||
# This function prevents generating migration upon settings change
|
||||
def get_default_owner_group():
|
||||
return settings.SITH_GROUP_ROOT_ID
|
||||
|
||||
|
||||
class Club(models.Model):
|
||||
"""The Club class, made as a tree to allow nice tidy organization."""
|
||||
|
||||
id = models.AutoField(primary_key=True, db_index=True)
|
||||
name = models.CharField(_("name"), max_length=64)
|
||||
name = models.CharField(_("name"), unique=True, max_length=64)
|
||||
parent = models.ForeignKey(
|
||||
"Club", related_name="children", null=True, blank=True, on_delete=models.CASCADE
|
||||
)
|
||||
unix_name = models.CharField(
|
||||
_("unix name"),
|
||||
max_length=30,
|
||||
unique=True,
|
||||
validators=[
|
||||
validators.RegexValidator(
|
||||
r"^[a-z0-9][a-z0-9._-]*[a-z0-9]$",
|
||||
_(
|
||||
"Enter a valid unix name. This value may contain only "
|
||||
"letters, numbers ./-/_ characters."
|
||||
),
|
||||
)
|
||||
],
|
||||
error_messages={"unique": _("A club with that unix name already exists.")},
|
||||
slug_name = models.SlugField(
|
||||
_("slug name"), max_length=30, unique=True, editable=False
|
||||
)
|
||||
logo = models.ImageField(
|
||||
upload_to="club_logos", verbose_name=_("logo"), null=True, blank=True
|
||||
logo = ResizedImageField(
|
||||
upload_to="club_logos",
|
||||
verbose_name=_("logo"),
|
||||
null=True,
|
||||
blank=True,
|
||||
force_format="WEBP",
|
||||
height=200,
|
||||
width=200,
|
||||
)
|
||||
is_active = models.BooleanField(_("is active"), default=True)
|
||||
short_description = models.CharField(
|
||||
_("short description"), max_length=1000, default="", blank=True, null=True
|
||||
_("short description"),
|
||||
max_length=1000,
|
||||
default="",
|
||||
blank=True,
|
||||
help_text=_(
|
||||
"A summary of what your club does. "
|
||||
"This will be displayed on the club list page."
|
||||
),
|
||||
)
|
||||
address = models.CharField(_("address"), max_length=254)
|
||||
home = models.OneToOneField(
|
||||
@ -88,7 +82,7 @@ class Club(models.Model):
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
page = models.OneToOneField(
|
||||
Page, related_name="club", blank=True, null=True, on_delete=models.CASCADE
|
||||
Page, related_name="club", blank=True, on_delete=models.CASCADE
|
||||
)
|
||||
members_group = models.OneToOneField(
|
||||
Group, related_name="club", on_delete=models.PROTECT
|
||||
@ -98,7 +92,7 @@ class Club(models.Model):
|
||||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ["name", "unix_name"]
|
||||
ordering = ["name"]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@ -106,10 +100,12 @@ class Club(models.Model):
|
||||
@transaction.atomic()
|
||||
def save(self, *args, **kwargs):
|
||||
creation = self._state.adding
|
||||
if (slug := slugify(self.name)[:30]) != self.slug_name:
|
||||
self.slug_name = slug
|
||||
if not creation:
|
||||
db_club = Club.objects.get(id=self.id)
|
||||
if self.unix_name != db_club.unix_name:
|
||||
self.home.name = self.unix_name
|
||||
if self.name != db_club.name:
|
||||
self.home.name = self.slug_name
|
||||
self.home.save()
|
||||
if self.name != db_club.name:
|
||||
self.board_group.name = f"{self.name} - Bureau"
|
||||
@ -123,11 +119,9 @@ class Club(models.Model):
|
||||
self.members_group = Group.objects.create(
|
||||
name=f"{self.name} - Membres", is_manually_manageable=False
|
||||
)
|
||||
super().save(*args, **kwargs)
|
||||
if creation:
|
||||
self.make_home()
|
||||
self.make_page()
|
||||
cache.set(f"sith_club_{self.unix_name}", self)
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse("club:club_view", kwargs={"club_id": self.id})
|
||||
@ -155,49 +149,37 @@ class Club(models.Model):
|
||||
def make_home(self) -> None:
|
||||
if self.home:
|
||||
return
|
||||
home_root = SithFile.objects.filter(parent=None, name="clubs").first()
|
||||
root = User.objects.filter(username="root").first()
|
||||
if home_root and root:
|
||||
home = SithFile(parent=home_root, name=self.unix_name, owner=root)
|
||||
home.save()
|
||||
self.home = home
|
||||
self.save()
|
||||
home_root = SithFile.objects.get(parent=None, name="clubs")
|
||||
root = User.objects.get(id=settings.SITH_ROOT_USER_ID)
|
||||
self.home = SithFile.objects.create(
|
||||
parent=home_root, name=self.slug_name, owner=root
|
||||
)
|
||||
|
||||
def make_page(self) -> None:
|
||||
root = User.objects.filter(username="root").first()
|
||||
if not self.page:
|
||||
club_root = Page.objects.filter(name=settings.SITH_CLUB_ROOT_PAGE).first()
|
||||
if root and club_root:
|
||||
public = Group.objects.filter(id=settings.SITH_GROUP_PUBLIC_ID).first()
|
||||
p = Page(name=self.unix_name)
|
||||
p.parent = club_root
|
||||
p.save(force_lock=True)
|
||||
if public:
|
||||
p.view_groups.add(public)
|
||||
p.save(force_lock=True)
|
||||
if self.parent and self.parent.page:
|
||||
p.parent = self.parent.page
|
||||
self.page = p
|
||||
self.save()
|
||||
elif self.page and self.page.name != self.unix_name:
|
||||
self.page.unset_lock()
|
||||
self.page.name = self.unix_name
|
||||
self.page.save(force_lock=True)
|
||||
elif (
|
||||
self.page
|
||||
and self.parent
|
||||
and self.parent.page
|
||||
and self.page.parent != self.parent.page
|
||||
):
|
||||
self.page.unset_lock()
|
||||
page_name = self.slug_name
|
||||
if not self.page_id:
|
||||
# Club.page is a OneToOneField, so if we are inside this condition
|
||||
# then self._meta.state.adding is True.
|
||||
club_root = Page.objects.get(name=settings.SITH_CLUB_ROOT_PAGE)
|
||||
public = Group.objects.get(id=settings.SITH_GROUP_PUBLIC_ID)
|
||||
p = Page(name=page_name, parent=club_root)
|
||||
p.save(force_lock=True)
|
||||
p.view_groups.add(public)
|
||||
if self.parent and self.parent.page_id:
|
||||
p.parent_id = self.parent.page_id
|
||||
self.page = p
|
||||
return
|
||||
self.page.unset_lock()
|
||||
if self.page.name != page_name:
|
||||
self.page.name = page_name
|
||||
elif self.parent and self.parent.page and self.page.parent != self.parent.page:
|
||||
self.page.parent = self.parent.page
|
||||
self.page.save(force_lock=True)
|
||||
self.page.save(force_lock=True)
|
||||
|
||||
def delete(self, *args, **kwargs) -> tuple[int, dict[str, int]]:
|
||||
# Invalidate the cache of this club and of its memberships
|
||||
for membership in self.members.ongoing().select_related("user"):
|
||||
cache.delete(f"membership_{self.id}_{membership.user.id}")
|
||||
cache.delete(f"sith_club_{self.unix_name}")
|
||||
self.board_group.delete()
|
||||
self.members_group.delete()
|
||||
return super().delete(*args, **kwargs)
|
||||
|
@ -4,7 +4,7 @@
|
||||
{% block content %}
|
||||
<div id="club_detail">
|
||||
{% if club.logo %}
|
||||
<div class="club_logo"><img src="{{ club.logo.url }}" alt="{{ club.unix_name }}"></div>
|
||||
<div class="club_logo"><img src="{{ club.logo.url }}" alt="{{ club.name }}"></div>
|
||||
{% endif %}
|
||||
{% if page_revision %}
|
||||
{{ page_revision|markdown }}
|
||||
|
@ -16,7 +16,7 @@
|
||||
</ul>
|
||||
<h4>{% trans %}Counters:{% endtrans %}</h4>
|
||||
<ul>
|
||||
{% if object.unix_name == settings.SITH_LAUNDERETTE_MANAGER['unix_name'] %}
|
||||
{% if object.id == settings.SITH_LAUNDERETTE_CLUB_ID %}
|
||||
{% for l in Launderette.objects.all() %}
|
||||
<li><a href="{{ url('launderette:main_click', launderette_id=l.id) }}">{{ l }}</a></li>
|
||||
{% endfor %}
|
||||
@ -37,7 +37,7 @@
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% if object.unix_name == settings.SITH_LAUNDERETTE_MANAGER['unix_name'] %}
|
||||
{% if object.id == settings.SITH_LAUNDERETTE_CLUB_ID %}
|
||||
<li><a href="{{ url('launderette:launderette_list') }}">{% trans %}Manage launderettes{% endtrans %}</a></li>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
@ -27,7 +27,6 @@ from club.forms import MailingForm
|
||||
from club.models import Club, Mailing, Membership
|
||||
from core.baker_recipes import subscriber_user
|
||||
from core.models import AnonymousUser, User
|
||||
from sith.settings import SITH_BAR_MANAGER, SITH_MAIN_CLUB_ID
|
||||
|
||||
|
||||
class TestClub(TestCase):
|
||||
@ -64,12 +63,8 @@ class TestClub(TestCase):
|
||||
# not subscribed
|
||||
cls.public = User.objects.get(username="public")
|
||||
|
||||
cls.ae = Club.objects.filter(pk=SITH_MAIN_CLUB_ID)[0]
|
||||
cls.club = Club.objects.create(
|
||||
name="Fake Club",
|
||||
unix_name="fake-club",
|
||||
address="5 rue de la République, 90000 Belfort",
|
||||
)
|
||||
cls.ae = Club.objects.get(pk=settings.SITH_MAIN_CLUB_ID)
|
||||
cls.club = baker.make(Club)
|
||||
cls.members_url = reverse("club:club_members", kwargs={"club_id": cls.club.id})
|
||||
a_month_ago = now() - timedelta(days=30)
|
||||
yesterday = now() - timedelta(days=1)
|
||||
@ -579,13 +574,11 @@ class TestMailingForm(TestCase):
|
||||
cls.krophil = User.objects.get(username="krophil")
|
||||
cls.comunity = User.objects.get(username="comunity")
|
||||
cls.root = User.objects.get(username="root")
|
||||
cls.bdf = Club.objects.get(unix_name=SITH_BAR_MANAGER["unix_name"])
|
||||
cls.mail_url = reverse("club:mailing", kwargs={"club_id": cls.bdf.id})
|
||||
|
||||
def setUp(self):
|
||||
cls.club = Club.objects.get(id=settings.SITH_PDF_CLUB_ID)
|
||||
cls.mail_url = reverse("club:mailing", kwargs={"club_id": cls.club.id})
|
||||
Membership(
|
||||
user=self.rbatsbak,
|
||||
club=self.bdf,
|
||||
user=cls.rbatsbak,
|
||||
club=cls.club,
|
||||
start_date=timezone.now(),
|
||||
role=settings.SITH_CLUB_ROLES_ID["Board member"],
|
||||
).save()
|
||||
@ -894,13 +887,13 @@ class TestClubSellingView(TestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.ae = Club.objects.get(unix_name="ae")
|
||||
cls.skia = User.objects.get(username="skia")
|
||||
cls.club = baker.make(Club)
|
||||
cls.admin = baker.make(User, is_superuser=True)
|
||||
|
||||
def test_page_not_internal_error(self):
|
||||
"""Test that the page does not return and internal error."""
|
||||
self.client.force_login(self.skia)
|
||||
self.client.force_login(self.admin)
|
||||
response = self.client.get(
|
||||
reverse("club:club_sellings", kwargs={"club_id": self.ae.id})
|
||||
reverse("club:club_sellings", kwargs={"club_id": self.club.id})
|
||||
)
|
||||
assert response.status_code == 200
|
||||
|
130
club/views.py
130
club/views.py
@ -39,10 +39,16 @@ from django.urls import reverse, reverse_lazy
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import gettext as _t
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import DetailView, ListView, TemplateView, View
|
||||
from django.views.generic import DetailView, ListView, View
|
||||
from django.views.generic.edit import CreateView, DeleteView, UpdateView
|
||||
|
||||
from club.forms import ClubEditForm, ClubMemberForm, MailingForm, SellingsForm
|
||||
from club.forms import (
|
||||
ClubAdminEditForm,
|
||||
ClubEditForm,
|
||||
ClubMemberForm,
|
||||
MailingForm,
|
||||
SellingsForm,
|
||||
)
|
||||
from club.models import Club, Mailing, MailingSubscription, Membership
|
||||
from com.views import (
|
||||
PosterCreateBaseView,
|
||||
@ -78,23 +84,23 @@ class ClubTabsMixin(TabedViewMixin):
|
||||
}
|
||||
]
|
||||
if self.request.user.can_view(self.object):
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse(
|
||||
"club:club_members", kwargs={"club_id": self.object.id}
|
||||
),
|
||||
"slug": "members",
|
||||
"name": _("Members"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse(
|
||||
"club:club_old_members", kwargs={"club_id": self.object.id}
|
||||
),
|
||||
"slug": "elderlies",
|
||||
"name": _("Old members"),
|
||||
}
|
||||
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"),
|
||||
},
|
||||
]
|
||||
)
|
||||
if self.object.page:
|
||||
tab_list.append(
|
||||
@ -134,30 +140,30 @@ class ClubTabsMixin(TabedViewMixin):
|
||||
"name": _("Edit club page"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse(
|
||||
"club:club_sellings", kwargs={"club_id": self.object.id}
|
||||
),
|
||||
"slug": "sellings",
|
||||
"name": _("Sellings"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse("club:mailing", kwargs={"club_id": self.object.id}),
|
||||
"slug": "mailing",
|
||||
"name": _("Mailing list"),
|
||||
}
|
||||
)
|
||||
tab_list.append(
|
||||
{
|
||||
"url": reverse(
|
||||
"club:poster_list", kwargs={"club_id": self.object.id}
|
||||
),
|
||||
"slug": "posters",
|
||||
"name": _("Posters list"),
|
||||
}
|
||||
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"),
|
||||
},
|
||||
]
|
||||
)
|
||||
if self.request.user.is_owner(self.object):
|
||||
tab_list.append(
|
||||
@ -189,8 +195,11 @@ class ClubView(ClubTabsMixin, DetailView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super().get_context_data(**kwargs)
|
||||
if self.object.page and self.object.page.revisions.exists():
|
||||
kwargs["page_revision"] = self.object.page.revisions.last().content
|
||||
kwargs["page_revision"] = (
|
||||
PageRev.objects.filter(page_id=self.object.page_id)
|
||||
.order_by("-date")
|
||||
.first()
|
||||
)
|
||||
return kwargs
|
||||
|
||||
|
||||
@ -466,7 +475,7 @@ class ClubEditPropView(ClubTabsMixin, CanEditPropMixin, UpdateView):
|
||||
|
||||
model = Club
|
||||
pk_url_kwarg = "club_id"
|
||||
fields = ["name", "unix_name", "parent", "is_active"]
|
||||
fields = ["name", "parent", "is_active"]
|
||||
template_name = "core/edit.jinja"
|
||||
current_tab = "props"
|
||||
|
||||
@ -476,8 +485,8 @@ class ClubCreateView(PermissionRequiredMixin, CreateView):
|
||||
|
||||
model = Club
|
||||
pk_url_kwarg = "club_id"
|
||||
fields = ["name", "unix_name", "parent"]
|
||||
template_name = "core/edit.jinja"
|
||||
fields = ["name", "parent"]
|
||||
template_name = "core/create.jinja"
|
||||
permission_required = "club.add_club"
|
||||
|
||||
|
||||
@ -533,26 +542,19 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs["club_id"] = self.get_object().id
|
||||
kwargs["club_id"] = self.object.id
|
||||
kwargs["user_id"] = self.request.user.id
|
||||
kwargs["mailings"] = self.mailings
|
||||
kwargs["mailings"] = self.object.mailings.all()
|
||||
return kwargs
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.mailings = Mailing.objects.filter(club_id=self.get_object().id).all()
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
kwargs = super().get_context_data(**kwargs)
|
||||
kwargs["club"] = self.get_object()
|
||||
mailings = list(self.object.mailings.all())
|
||||
kwargs["club"] = self.object
|
||||
kwargs["user"] = self.request.user
|
||||
kwargs["mailings"] = self.mailings
|
||||
kwargs["mailings_moderated"] = (
|
||||
kwargs["mailings"].exclude(is_moderated=False).all()
|
||||
)
|
||||
kwargs["mailings_not_moderated"] = (
|
||||
kwargs["mailings"].exclude(is_moderated=True).all()
|
||||
)
|
||||
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,
|
||||
@ -563,7 +565,7 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
|
||||
def add_new_mailing(self, cleaned_data) -> ValidationError | None:
|
||||
"""Create a new mailing list from the form."""
|
||||
mailing = Mailing(
|
||||
club=self.get_object(),
|
||||
club=self.object,
|
||||
email=cleaned_data["mailing_email"],
|
||||
moderator=self.request.user,
|
||||
is_moderated=False,
|
||||
@ -640,7 +642,7 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
|
||||
return resp
|
||||
|
||||
def get_success_url(self, **kwargs):
|
||||
return reverse_lazy("club:mailing", kwargs={"club_id": self.get_object().id})
|
||||
return reverse("club:mailing", kwargs={"club_id": self.object.id})
|
||||
|
||||
|
||||
class MailingDeleteView(CanEditMixin, DeleteView):
|
||||
|
Reference in New Issue
Block a user