change Club.unix_name to Club.slug_name and remove it from forms

This commit is contained in:
imperosol 2025-03-01 11:47:40 +01:00
parent 87559a384a
commit fa5ddfaeda
21 changed files with 380 additions and 401 deletions

View File

@ -19,8 +19,8 @@ from club.models import Club, Membership
@admin.register(Club) @admin.register(Club)
class ClubAdmin(admin.ModelAdmin): class ClubAdmin(admin.ModelAdmin):
list_display = ("name", "unix_name", "parent", "is_active") list_display = ("name", "slug_name", "parent", "is_active")
search_fields = ("name", "unix_name") search_fields = ("name", "slug_name")
autocomplete_fields = ( autocomplete_fields = (
"parent", "parent",
"board_group", "board_group",

View File

@ -1,10 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import django.db.models.deletion import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import club.models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [("club", "0010_auto_20170912_2028")] dependencies = [("club", "0010_auto_20170912_2028")]
@ -15,7 +14,7 @@ class Migration(migrations.Migration):
name="owner_group", name="owner_group",
field=models.ForeignKey( field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, 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", related_name="owned_club",
to="core.Group", to="core.Group",
), ),

View File

@ -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",
),
),
]

View File

@ -26,7 +26,6 @@ from __future__ import annotations
from typing import Iterable, Self from typing import Iterable, Self
from django.conf import settings from django.conf import settings
from django.core import validators
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.validators import RegexValidator, validate_email 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.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.text import slugify
from django.utils.timezone import localdate from django.utils.timezone import localdate
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from core.fields import ResizedImageField
from core.models import Group, Notification, Page, SithFile, User 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): class Club(models.Model):
"""The Club class, made as a tree to allow nice tidy organization.""" """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"), unique=True, max_length=64)
name = models.CharField(_("name"), max_length=64)
parent = models.ForeignKey( parent = models.ForeignKey(
"Club", related_name="children", null=True, blank=True, on_delete=models.CASCADE "Club", related_name="children", null=True, blank=True, on_delete=models.CASCADE
) )
unix_name = models.CharField( slug_name = models.SlugField(
_("unix name"), _("slug name"), max_length=30, unique=True, editable=False
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.")},
) )
logo = models.ImageField( logo = ResizedImageField(
upload_to="club_logos", verbose_name=_("logo"), null=True, blank=True 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) is_active = models.BooleanField(_("is active"), default=True)
short_description = models.CharField( 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) address = models.CharField(_("address"), max_length=254)
home = models.OneToOneField( home = models.OneToOneField(
@ -88,7 +82,7 @@ class Club(models.Model):
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
) )
page = models.OneToOneField( 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( members_group = models.OneToOneField(
Group, related_name="club", on_delete=models.PROTECT Group, related_name="club", on_delete=models.PROTECT
@ -98,7 +92,7 @@ class Club(models.Model):
) )
class Meta: class Meta:
ordering = ["name", "unix_name"] ordering = ["name"]
def __str__(self): def __str__(self):
return self.name return self.name
@ -106,10 +100,12 @@ class Club(models.Model):
@transaction.atomic() @transaction.atomic()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
creation = self._state.adding creation = self._state.adding
if (slug := slugify(self.name)[:30]) != self.slug_name:
self.slug_name = slug
if not creation: if not creation:
db_club = Club.objects.get(id=self.id) db_club = Club.objects.get(id=self.id)
if self.unix_name != db_club.unix_name: if self.name != db_club.name:
self.home.name = self.unix_name self.home.name = self.slug_name
self.home.save() self.home.save()
if self.name != db_club.name: if self.name != db_club.name:
self.board_group.name = f"{self.name} - Bureau" self.board_group.name = f"{self.name} - Bureau"
@ -123,11 +119,9 @@ class Club(models.Model):
self.members_group = Group.objects.create( self.members_group = Group.objects.create(
name=f"{self.name} - Membres", is_manually_manageable=False name=f"{self.name} - Membres", is_manually_manageable=False
) )
super().save(*args, **kwargs)
if creation:
self.make_home() self.make_home()
self.make_page() self.make_page()
cache.set(f"sith_club_{self.unix_name}", self) super().save(*args, **kwargs)
def get_absolute_url(self): def get_absolute_url(self):
return reverse("club:club_view", kwargs={"club_id": self.id}) return reverse("club:club_view", kwargs={"club_id": self.id})
@ -155,49 +149,37 @@ class Club(models.Model):
def make_home(self) -> None: def make_home(self) -> None:
if self.home: if self.home:
return return
home_root = SithFile.objects.filter(parent=None, name="clubs").first() home_root = SithFile.objects.get(parent=None, name="clubs")
root = User.objects.filter(username="root").first() root = User.objects.get(id=settings.SITH_ROOT_USER_ID)
if home_root and root: self.home = SithFile.objects.create(
home = SithFile(parent=home_root, name=self.unix_name, owner=root) parent=home_root, name=self.slug_name, owner=root
home.save() )
self.home = home
self.save()
def make_page(self) -> None: def make_page(self) -> None:
root = User.objects.filter(username="root").first() page_name = self.slug_name
if not self.page: if not self.page_id:
club_root = Page.objects.filter(name=settings.SITH_CLUB_ROOT_PAGE).first() # Club.page is a OneToOneField, so if we are inside this condition
if root and club_root: # then self._meta.state.adding is True.
public = Group.objects.filter(id=settings.SITH_GROUP_PUBLIC_ID).first() club_root = Page.objects.get(name=settings.SITH_CLUB_ROOT_PAGE)
p = Page(name=self.unix_name) public = Group.objects.get(id=settings.SITH_GROUP_PUBLIC_ID)
p.parent = club_root p = Page(name=page_name, parent=club_root)
p.save(force_lock=True) p.save(force_lock=True)
if public: p.view_groups.add(public)
p.view_groups.add(public) if self.parent and self.parent.page_id:
p.save(force_lock=True) p.parent_id = self.parent.page_id
if self.parent and self.parent.page: self.page = p
p.parent = self.parent.page return
self.page = p self.page.unset_lock()
self.save() if self.page.name != page_name:
elif self.page and self.page.name != self.unix_name: self.page.name = page_name
self.page.unset_lock() elif self.parent and self.parent.page and self.page.parent != self.parent.page:
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()
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]]: def delete(self, *args, **kwargs) -> tuple[int, dict[str, int]]:
# Invalidate the cache of this club and of its memberships # Invalidate the cache of this club and of its memberships
for membership in self.members.ongoing().select_related("user"): for membership in self.members.ongoing().select_related("user"):
cache.delete(f"membership_{self.id}_{membership.user.id}") cache.delete(f"membership_{self.id}_{membership.user.id}")
cache.delete(f"sith_club_{self.unix_name}")
self.board_group.delete() self.board_group.delete()
self.members_group.delete() self.members_group.delete()
return super().delete(*args, **kwargs) return super().delete(*args, **kwargs)

View File

@ -4,7 +4,7 @@
{% block content %} {% block content %}
<div id="club_detail"> <div id="club_detail">
{% if club.logo %} {% 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 %} {% endif %}
{% if page_revision %} {% if page_revision %}
{{ page_revision|markdown }} {{ page_revision|markdown }}

View File

@ -16,7 +16,7 @@
</ul> </ul>
<h4>{% trans %}Counters:{% endtrans %}</h4> <h4>{% trans %}Counters:{% endtrans %}</h4>
<ul> <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() %} {% for l in Launderette.objects.all() %}
<li><a href="{{ url('launderette:main_click', launderette_id=l.id) }}">{{ l }}</a></li> <li><a href="{{ url('launderette:main_click', launderette_id=l.id) }}">{{ l }}</a></li>
{% endfor %} {% endfor %}
@ -37,7 +37,7 @@
{% endfor %} {% endfor %}
</ul> </ul>
{% endif %} {% 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> <li><a href="{{ url('launderette:launderette_list') }}">{% trans %}Manage launderettes{% endtrans %}</a></li>
{% endif %} {% endif %}
</div> </div>

View File

@ -27,7 +27,6 @@ from club.forms import MailingForm
from club.models import Club, Mailing, Membership from club.models import Club, Mailing, Membership
from core.baker_recipes import subscriber_user from core.baker_recipes import subscriber_user
from core.models import AnonymousUser, User from core.models import AnonymousUser, User
from sith.settings import SITH_BAR_MANAGER, SITH_MAIN_CLUB_ID
class TestClub(TestCase): class TestClub(TestCase):
@ -64,12 +63,8 @@ class TestClub(TestCase):
# not subscribed # not subscribed
cls.public = User.objects.get(username="public") cls.public = User.objects.get(username="public")
cls.ae = Club.objects.filter(pk=SITH_MAIN_CLUB_ID)[0] cls.ae = Club.objects.get(pk=settings.SITH_MAIN_CLUB_ID)
cls.club = Club.objects.create( cls.club = baker.make(Club)
name="Fake Club",
unix_name="fake-club",
address="5 rue de la République, 90000 Belfort",
)
cls.members_url = reverse("club:club_members", kwargs={"club_id": cls.club.id}) cls.members_url = reverse("club:club_members", kwargs={"club_id": cls.club.id})
a_month_ago = now() - timedelta(days=30) a_month_ago = now() - timedelta(days=30)
yesterday = now() - timedelta(days=1) yesterday = now() - timedelta(days=1)
@ -579,13 +574,11 @@ class TestMailingForm(TestCase):
cls.krophil = User.objects.get(username="krophil") cls.krophil = User.objects.get(username="krophil")
cls.comunity = User.objects.get(username="comunity") cls.comunity = User.objects.get(username="comunity")
cls.root = User.objects.get(username="root") cls.root = User.objects.get(username="root")
cls.bdf = Club.objects.get(unix_name=SITH_BAR_MANAGER["unix_name"]) cls.club = Club.objects.get(id=settings.SITH_PDF_CLUB_ID)
cls.mail_url = reverse("club:mailing", kwargs={"club_id": cls.bdf.id}) cls.mail_url = reverse("club:mailing", kwargs={"club_id": cls.club.id})
def setUp(self):
Membership( Membership(
user=self.rbatsbak, user=cls.rbatsbak,
club=self.bdf, club=cls.club,
start_date=timezone.now(), start_date=timezone.now(),
role=settings.SITH_CLUB_ROLES_ID["Board member"], role=settings.SITH_CLUB_ROLES_ID["Board member"],
).save() ).save()
@ -894,13 +887,13 @@ class TestClubSellingView(TestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
cls.ae = Club.objects.get(unix_name="ae") cls.club = baker.make(Club)
cls.skia = User.objects.get(username="skia") cls.admin = baker.make(User, is_superuser=True)
def test_page_not_internal_error(self): def test_page_not_internal_error(self):
"""Test that the page does not return and internal error.""" """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( 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 assert response.status_code == 200

View File

@ -39,10 +39,16 @@ from django.urls import reverse, reverse_lazy
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext as _t from django.utils.translation import gettext as _t
from django.utils.translation import gettext_lazy as _ 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 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 club.models import Club, Mailing, MailingSubscription, Membership
from com.views import ( from com.views import (
PosterCreateBaseView, PosterCreateBaseView,
@ -78,23 +84,23 @@ class ClubTabsMixin(TabedViewMixin):
} }
] ]
if self.request.user.can_view(self.object): if self.request.user.can_view(self.object):
tab_list.append( tab_list.extend(
{ [
"url": reverse( {
"club:club_members", kwargs={"club_id": self.object.id} "url": reverse(
), "club:club_members", kwargs={"club_id": self.object.id}
"slug": "members", ),
"name": _("Members"), "slug": "members",
} "name": _("Members"),
) },
tab_list.append( {
{ "url": reverse(
"url": reverse( "club:club_old_members", kwargs={"club_id": self.object.id}
"club:club_old_members", kwargs={"club_id": self.object.id} ),
), "slug": "elderlies",
"slug": "elderlies", "name": _("Old members"),
"name": _("Old members"), },
} ]
) )
if self.object.page: if self.object.page:
tab_list.append( tab_list.append(
@ -134,30 +140,30 @@ class ClubTabsMixin(TabedViewMixin):
"name": _("Edit club page"), "name": _("Edit club page"),
} }
) )
tab_list.append( tab_list.extend(
{ [
"url": reverse( {
"club:club_sellings", kwargs={"club_id": self.object.id} "url": reverse(
), "club:club_sellings", kwargs={"club_id": self.object.id}
"slug": "sellings", ),
"name": _("Sellings"), "slug": "sellings",
} "name": _("Sellings"),
) },
tab_list.append( {
{ "url": reverse(
"url": reverse("club:mailing", kwargs={"club_id": self.object.id}), "club:mailing", kwargs={"club_id": self.object.id}
"slug": "mailing", ),
"name": _("Mailing list"), "slug": "mailing",
} "name": _("Mailing list"),
) },
tab_list.append( {
{ "url": reverse(
"url": reverse( "club:poster_list", kwargs={"club_id": self.object.id}
"club:poster_list", kwargs={"club_id": self.object.id} ),
), "slug": "posters",
"slug": "posters", "name": _("Posters list"),
"name": _("Posters list"), },
} ]
) )
if self.request.user.is_owner(self.object): if self.request.user.is_owner(self.object):
tab_list.append( tab_list.append(
@ -189,8 +195,11 @@ class ClubView(ClubTabsMixin, DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super().get_context_data(**kwargs) kwargs = super().get_context_data(**kwargs)
if self.object.page and self.object.page.revisions.exists(): kwargs["page_revision"] = (
kwargs["page_revision"] = self.object.page.revisions.last().content PageRev.objects.filter(page_id=self.object.page_id)
.order_by("-date")
.first()
)
return kwargs return kwargs
@ -466,7 +475,7 @@ class ClubEditPropView(ClubTabsMixin, CanEditPropMixin, UpdateView):
model = Club model = Club
pk_url_kwarg = "club_id" pk_url_kwarg = "club_id"
fields = ["name", "unix_name", "parent", "is_active"] fields = ["name", "parent", "is_active"]
template_name = "core/edit.jinja" template_name = "core/edit.jinja"
current_tab = "props" current_tab = "props"
@ -476,8 +485,8 @@ class ClubCreateView(PermissionRequiredMixin, CreateView):
model = Club model = Club
pk_url_kwarg = "club_id" pk_url_kwarg = "club_id"
fields = ["name", "unix_name", "parent"] fields = ["name", "parent"]
template_name = "core/edit.jinja" template_name = "core/create.jinja"
permission_required = "club.add_club" permission_required = "club.add_club"
@ -533,26 +542,19 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
def get_form_kwargs(self): def get_form_kwargs(self):
kwargs = super().get_form_kwargs() 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["user_id"] = self.request.user.id
kwargs["mailings"] = self.mailings kwargs["mailings"] = self.object.mailings.all()
return kwargs 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): def get_context_data(self, **kwargs):
kwargs = super().get_context_data(**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["user"] = self.request.user
kwargs["mailings"] = self.mailings kwargs["mailings"] = mailings
kwargs["mailings_moderated"] = ( kwargs["mailings_moderated"] = [m for m in mailings if m.is_moderated]
kwargs["mailings"].exclude(is_moderated=False).all() kwargs["mailings_not_moderated"] = [m for m in mailings if not m.is_moderated]
)
kwargs["mailings_not_moderated"] = (
kwargs["mailings"].exclude(is_moderated=True).all()
)
kwargs["form_actions"] = { kwargs["form_actions"] = {
"NEW_MALING": self.form_class.ACTION_NEW_MAILING, "NEW_MALING": self.form_class.ACTION_NEW_MAILING,
"NEW_SUBSCRIPTION": self.form_class.ACTION_NEW_SUBSCRIPTION, "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: def add_new_mailing(self, cleaned_data) -> ValidationError | None:
"""Create a new mailing list from the form.""" """Create a new mailing list from the form."""
mailing = Mailing( mailing = Mailing(
club=self.get_object(), club=self.object,
email=cleaned_data["mailing_email"], email=cleaned_data["mailing_email"],
moderator=self.request.user, moderator=self.request.user,
is_moderated=False, is_moderated=False,
@ -640,7 +642,7 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
return resp return resp
def get_success_url(self, **kwargs): 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): class MailingDeleteView(CanEditMixin, DeleteView):

View File

@ -120,10 +120,7 @@ class Command(BaseCommand):
club_root = SithFile.objects.create(name="clubs", owner=root) club_root = SithFile.objects.create(name="clubs", owner=root)
sas = SithFile.objects.create(name="SAS", owner=root) sas = SithFile.objects.create(name="SAS", owner=root)
main_club = Club.objects.create( main_club = Club.objects.create(
id=1, id=1, name="AE", address="6 Boulevard Anatole France, 90000 Belfort"
name=settings.SITH_MAIN_CLUB["name"],
unix_name=settings.SITH_MAIN_CLUB["unix_name"],
address=settings.SITH_MAIN_CLUB["address"],
) )
main_club.board_group.permissions.add( main_club.board_group.permissions.add(
*Permission.objects.filter( *Permission.objects.filter(
@ -131,16 +128,14 @@ class Command(BaseCommand):
) )
) )
bar_club = Club.objects.create( bar_club = Club.objects.create(
id=2, id=settings.SITH_PDF_CLUB_ID,
name=settings.SITH_BAR_MANAGER["name"], name="PdF",
unix_name=settings.SITH_BAR_MANAGER["unix_name"], address="6 Boulevard Anatole France, 90000 Belfort",
address=settings.SITH_BAR_MANAGER["address"],
) )
Club.objects.create( Club.objects.create(
id=84, id=settings.SITH_LAUNDERETTE_CLUB_ID,
name=settings.SITH_LAUNDERETTE_MANAGER["name"], name="Laverie",
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"], address="6 Boulevard Anatole France, 90000 Belfort",
address=settings.SITH_LAUNDERETTE_MANAGER["address"],
) )
self.reset_index("club") self.reset_index("club")
@ -353,31 +348,17 @@ Welcome to the wiki page!
# Clubs # Clubs
Club.objects.create( Club.objects.create(
name="Bibo'UT", name="Bibo'UT", address="46 de la Boustifaille", parent=main_club
unix_name="bibout",
address="46 de la Boustifaille",
parent=main_club,
) )
guyut = Club.objects.create( guyut = Club.objects.create(
name="Guy'UT", name="Guy'UT", address="42 de la Boustifaille", parent=main_club
unix_name="guyut",
address="42 de la Boustifaille",
parent=main_club,
)
Club.objects.create(
name="Woenzel'UT", unix_name="woenzel", address="Woenzel", parent=guyut
) )
Club.objects.create(name="Woenzel'UT", address="Woenzel", parent=guyut)
troll = Club.objects.create( troll = Club.objects.create(
name="Troll Penché", name="Troll Penché", address="Terre Du Milieu", parent=main_club
unix_name="troll",
address="Terre Du Milieu",
parent=main_club,
) )
refound = Club.objects.create( refound = Club.objects.create(
name="Carte AE", name="Carte AE", address="Jamais imprimée", parent=main_club
unix_name="carte_ae",
address="Jamais imprimée",
parent=main_club,
) )
Membership.objects.create(user=skia, club=main_club, role=3) Membership.objects.create(user=skia, club=main_club, role=3)

View File

@ -64,12 +64,12 @@ class Command(BaseCommand):
) )
) )
self.make_club( self.make_club(
Club.objects.get(unix_name="ae"), Club.objects.get(id=settings.SITH_MAIN_CLUB_ID),
random.sample(subscribers_now, k=min(30, len(subscribers_now))), random.sample(subscribers_now, k=min(30, len(subscribers_now))),
random.sample(old_subscribers, k=min(60, len(old_subscribers))), random.sample(old_subscribers, k=min(60, len(old_subscribers))),
) )
self.make_club( self.make_club(
Club.objects.get(unix_name="troll"), Club.objects.get(name="Troll Penché"),
random.sample(subscribers_now, k=min(20, len(subscribers_now))), random.sample(subscribers_now, k=min(20, len(subscribers_now))),
random.sample(old_subscribers, k=min(80, len(old_subscribers))), random.sample(old_subscribers, k=min(80, len(old_subscribers))),
) )
@ -235,7 +235,7 @@ class Command(BaseCommand):
categories = list( categories = list(
ProductType.objects.filter(name__in=[c.name for c in categories]) ProductType.objects.filter(name__in=[c.name for c in categories])
) )
ae = Club.objects.get(unix_name="ae") ae = Club.objects.get(id=settings.SITH_MAIN_CLUB_ID)
other_clubs = random.sample(list(Club.objects.all()), k=3) other_clubs = random.sample(list(Club.objects.all()), k=3)
groups = list( groups = list(
Group.objects.filter(name__in=["Subscribers", "Old subscribers", "Public"]) Group.objects.filter(name__in=["Subscribers", "Old subscribers", "Public"])

View File

@ -421,13 +421,9 @@ class User(AbstractUser):
def is_launderette_manager(self): def is_launderette_manager(self):
from club.models import Club from club.models import Club
return ( return Club.objects.get(
Club.objects.filter( id=settings.SITH_LAUNDERETTE_CLUB_ID
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"] ).get_membership_for(self)
)
.first()
.get_membership_for(self)
)
@cached_property @cached_property
def is_banned_alcohol(self) -> bool: def is_banned_alcohol(self) -> bool:

View File

@ -132,111 +132,104 @@
</div> </div>
</div> </div>
</main> </main>
{% if {% if user == profile or user.memberships.ongoing().exists() %}
user == profile {# if the user is member of a club, he can view the subscription state #}
or user.memberships.ongoing().exists() <hr>
or user.is_board_member {% if profile.is_subscribed %}
or user.is_in_group(name=settings.SITH_BAR_MANAGER_BOARD_GROUP) {% if user == profile or user.is_root or user.is_board_member %}
%} <div>
{# if the user is member of a club, he can view the subscription state #} {{ user_subscription(profile) }}
<hr> </div>
{% if profile.is_subscribed %}
{% if user == profile or user.is_root or user.is_board_member %}
<div>
{{ user_subscription(profile) }}
</div>
{% endif %}
{% if user == profile or user.is_root or user.is_board_member or user.is_launderette_manager %}
<div>
{# Shows tokens bought by the user #}
{{ show_tokens(profile) }}
{# Shows slots took by the user #}
{{ show_slots(profile) }}
</div>
{% endif %}
{% else %}
<div>
{% trans %}Not subscribed{% endtrans %}
{% if user.is_board_member %}
<a href="{{ url('subscription:subscription') }}?member={{ profile.id }}">
{% trans %}New subscription{% endtrans %}
</a>
{% endif %} {% endif %}
{% if user == profile or user.is_root or user.is_board_member or user.is_launderette_manager %}
<div>
{{ show_tokens(profile) }}
{{ show_slots(profile) }}
</div>
{% endif %}
{% else %}
<div>
{% trans %}Not subscribed{% endtrans %}
{% if user.is_board_member %}
<a href="{{ url('subscription:subscription') }}?member={{ profile.id }}">
{% trans %}New subscription{% endtrans %}
</a>
{% endif %}
{% endif %}
</div>
{% endif %} {% endif %}
</div> <br>
{% endif %} {% if profile.was_subscribed and (user == profile or user.has_perm("subscription.view_subscription")) %}
<br>
{% if profile.was_subscribed and (user == profile or user.has_perm("subscription.view_subscription")) %}
<div class="collapse" :class="{'shadow': collapsed}" x-data="{collapsed: false}" x-cloak>
<div class="collapse-header clickable" @click="collapsed = !collapsed">
<span class="collapse-header-text">
{% trans %}Subscription history{% endtrans %}
</span>
<span class="collapse-header-icon" :class="{'reverse': collapsed}">
<i class="fa fa-caret-down"></i>
</span>
</div>
<div class="collapse-body" x-show="collapsed" x-transition.scale.origin.top>
<table>
<thead>
<tr>
<th>{% trans %}Subscription start{% endtrans %}</th>
<th>{% trans %}Subscription end{% endtrans %}</th>
<th>{% trans %}Subscription type{% endtrans %}</th>
<th>{% trans %}Payment method{% endtrans %}</th>
</tr>
</thead>
{% for sub in profile.subscriptions.all() %}
<tr>
<td>{{ sub.subscription_start }}</td>
<td>{{ sub.subscription_end }}</td>
<td>{{ sub.subscription_type }}</td>
<td>{{ sub.get_payment_method_display() }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<hr>
{% endif %}
<div>
{% if user.is_root or user.is_board_member %}
<form class="form-gifts" action="{{ url('core:user_gift_create', user_id=profile.id) }}" method="post">
{% csrf_token %}
{{ gift_form.label }}
{{ gift_form.user }}
<input type="submit" value="{% trans %}Give gift{% endtrans %}">
</form>
{% if profile.gifts.exists() %}
{% set gifts = profile.gifts.order_by("-date")|list %}
<br>
<div class="collapse" :class="{'shadow': collapsed}" x-data="{collapsed: false}" x-cloak> <div class="collapse" :class="{'shadow': collapsed}" x-data="{collapsed: false}" x-cloak>
<div class="collapse-header clickable" @click="collapsed = !collapsed"> <div class="collapse-header clickable" @click="collapsed = !collapsed">
<span class="collapse-header-text"> <span class="collapse-header-text">
{% trans %}Last given gift :{% endtrans %} {{ gifts[0] }} {% trans %}Subscription history{% endtrans %}
</span> </span>
<span class="collapse-header-icon" :class="{'reverse': collapsed}"> <span class="collapse-header-icon" :class="{'reverse': collapsed}">
<i class="fa fa-caret-down"></i> <i class="fa fa-caret-down"></i>
</span> </span>
</div> </div>
<div class="collapse-body" x-show="collapsed" x-transition.scale.origin.top> <div class="collapse-body" x-show="collapsed" x-transition.scale.origin.top>
<ul> <table>
{% for gift in gifts %} <thead>
<li>{{ gift }} <tr>
<a href="{{ url('core:user_gift_delete', user_id=profile.id, gift_id=gift.id) }}"> <th>{% trans %}Subscription start{% endtrans %}</th>
<i class="fa-solid fa-trash-can delete-action"></i> <th>{% trans %}Subscription end{% endtrans %}</th>
</a> <th>{% trans %}Subscription type{% endtrans %}</th>
</li> <th>{% trans %}Payment method{% endtrans %}</th>
</tr>
</thead>
{% for sub in profile.subscriptions.all() %}
<tr>
<td>{{ sub.subscription_start }}</td>
<td>{{ sub.subscription_end }}</td>
<td>{{ sub.subscription_type }}</td>
<td>{{ sub.get_payment_method_display() }}</td>
</tr>
{% endfor %} {% endfor %}
</ul> </table>
</div> </div>
{% else %} </div>
<em>{% trans %}No gift given yet{% endtrans %}</em> <hr>
{% endif %} {% endif %}
<div>
{% if user.is_root or user.is_board_member %}
<form class="form-gifts" action="{{ url('core:user_gift_create', user_id=profile.id) }}" method="post">
{% csrf_token %}
{{ gift_form.label }}
{{ gift_form.user }}
<input type="submit" value="{% trans %}Give gift{% endtrans %}">
</form>
{% if profile.gifts.exists() %}
{% set gifts = profile.gifts.order_by("-date")|list %}
<br>
<div class="collapse" :class="{'shadow': collapsed}" x-data="{collapsed: false}" x-cloak>
<div class="collapse-header clickable" @click="collapsed = !collapsed">
<span class="collapse-header-text">
{% trans %}Last given gift :{% endtrans %} {{ gifts[0] }}
</span>
<span class="collapse-header-icon" :class="{'reverse': collapsed}">
<i class="fa fa-caret-down"></i>
</span>
</div>
<div class="collapse-body" x-show="collapsed" x-transition.scale.origin.top>
<ul>
{% for gift in gifts %}
<li>{{ gift }}
<a href="{{ url('core:user_gift_delete', user_id=profile.id, gift_id=gift.id) }}">
<i class="fa-solid fa-trash-can delete-action"></i>
</a>
</li>
{% endfor %}
</ul>
</div>
{% else %}
<em>{% trans %}No gift given yet{% endtrans %}</em>
{% endif %}
</div>
{% endif %}
</div> </div>
{% endif %}
</div>
{% endblock %} {% endblock %}

View File

@ -251,17 +251,7 @@ class UserTabsMixin(TabedViewMixin):
if ( if (
hasattr(user, "customer") hasattr(user, "customer")
and user.customer and user.customer
and ( and (user == self.request.user or user.has_perm("counter.view_customer"))
user == self.request.user
or self.request.user.is_in_group(
pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID
)
or self.request.user.is_in_group(
name=settings.SITH_BAR_MANAGER["unix_name"]
+ settings.SITH_BOARD_SUFFIX
)
or self.request.user.is_root
)
): ):
tab_list.append( tab_list.append(
{ {
@ -370,12 +360,7 @@ class UserStatsView(UserTabsMixin, CanViewMixin, DetailView):
raise Http404 raise Http404
if not ( if not (
profile == request.user profile == request.user or request.user.has_perm("counter.view_customer")
or request.user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID)
or request.user.is_in_group(
name=settings.SITH_BAR_MANAGER["unix_name"] + settings.SITH_BOARD_SUFFIX
)
or request.user.is_root
): ):
raise PermissionDenied raise PermissionDenied
@ -599,14 +584,9 @@ class UserAccountBase(UserTabsMixin, DetailView):
current_tab = "account" current_tab = "account"
queryset = User.objects.select_related("customer") queryset = User.objects.select_related("customer")
def dispatch(self, request, *arg, **kwargs): # Manually validates the rights def dispatch(self, request, *arg, **kwargs):
if ( if kwargs.get("user_id") == request.user.id or request.user.has_perm(
kwargs.get("user_id") == request.user.id "counter.view_customer"
or request.user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID)
or request.user.is_in_group(
name=settings.SITH_BAR_MANAGER["unix_name"] + settings.SITH_BOARD_SUFFIX
)
or request.user.is_root
): ):
return super().dispatch(request, *arg, **kwargs) return super().dispatch(request, *arg, **kwargs)
raise PermissionDenied raise PermissionDenied

View File

@ -44,7 +44,6 @@ from core.fields import ResizedImageField
from core.models import Group, Notification, User from core.models import Group, Notification, User
from core.utils import get_start_of_semester from core.utils import get_start_of_semester
from counter.apps import PAYMENT_METHOD from counter.apps import PAYMENT_METHOD
from sith.settings import SITH_MAIN_CLUB
from subscription.models import Subscription from subscription.models import Subscription
@ -519,13 +518,6 @@ class Counter(models.Model):
return reverse("eboutic:main") return reverse("eboutic:main")
return reverse("counter:details", kwargs={"counter_id": self.id}) return reverse("counter:details", kwargs={"counter_id": self.id})
def __getattribute__(self, name: str):
if name == "edit_groups":
return Group.objects.filter(
name=self.club.unix_name + settings.SITH_BOARD_SUFFIX
).all()
return object.__getattribute__(self, name)
def is_owned_by(self, user: User) -> bool: def is_owned_by(self, user: User) -> bool:
if user.is_anonymous: if user.is_anonymous:
return False return False
@ -569,7 +561,7 @@ class Counter(models.Model):
if self.type != "BAR": if self.type != "BAR":
return False return False
# at least one of the barmen is in the AE board # at least one of the barmen is in the AE board
ae = Club.objects.get(unix_name=SITH_MAIN_CLUB["unix_name"]) ae = Club.objects.get(id=settings.SITH_MAIN_CLUB_ID)
return any(ae.get_membership_for(barman) for barman in self.barmen_list) return any(ae.get_membership_for(barman) for barman in self.barmen_list)
def get_top_barmen(self) -> QuerySet: def get_top_barmen(self) -> QuerySet:

View File

@ -783,7 +783,7 @@ class TestCounterStats(TestCase):
s = Selling( s = Selling(
label=barbar.name, label=barbar.name,
product=barbar, product=barbar,
club=Club.objects.get(name=settings.SITH_MAIN_CLUB["name"]), club=baker.make(Club),
counter=cls.counter, counter=cls.counter,
unit_price=2, unit_price=2,
seller=cls.skia, seller=cls.skia,

View File

@ -86,7 +86,7 @@ class Command(BaseCommand):
self.logger.info("The Galaxy is being populated by the Sith.") self.logger.info("The Galaxy is being populated by the Sith.")
self.logger.info("Cleaning old Galaxy population") self.logger.info("Cleaning old Galaxy population")
Club.objects.filter(unix_name__startswith="galaxy-").delete() Club.objects.filter(name__startswith="galaxy-").delete()
Group.objects.filter(name__startswith="galaxy-").delete() Group.objects.filter(name__startswith="galaxy-").delete()
Page.objects.filter(name__startswith="galaxy-").delete() Page.objects.filter(name__startswith="galaxy-").delete()
User.objects.filter(username__startswith="galaxy-").delete() User.objects.filter(username__startswith="galaxy-").delete()

View File

@ -47,16 +47,12 @@ class Launderette(models.Model):
"""Method to see if that object can be edited by the given user.""" """Method to see if that object can be edited by the given user."""
if user.is_anonymous: if user.is_anonymous:
return False return False
launderette_club = Club.objects.filter( launderette_club = Club.objects.get(id=settings.SITH_LAUNDERETTE_CLUB_ID)
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"]
).first()
m = launderette_club.get_membership_for(user) m = launderette_club.get_membership_for(user)
return bool(m and m.role >= 9) return bool(m and m.role >= 9)
def can_be_edited_by(self, user): def can_be_edited_by(self, user):
launderette_club = Club.objects.filter( launderette_club = Club.objects.get(id=settings.SITH_LAUNDERETTE_CLUB_ID)
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"]
).first()
m = launderette_club.get_membership_for(user) m = launderette_club.get_membership_for(user)
return bool(m and m.role >= 2) return bool(m and m.role >= 2)
@ -105,9 +101,7 @@ class Machine(models.Model):
"""Method to see if that object can be edited by the given user.""" """Method to see if that object can be edited by the given user."""
if user.is_anonymous: if user.is_anonymous:
return False return False
launderette_club = Club.objects.filter( launderette_club = Club.objects.get(id=settings.SITH_LAUNDERETTE_CLUB_ID)
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"]
).first()
m = launderette_club.get_membership_for(user) m = launderette_club.get_membership_for(user)
return bool(m and m.role >= 9) return bool(m and m.role >= 9)
@ -154,9 +148,7 @@ class Token(models.Model):
"""Method to see if that object can be edited by the given user.""" """Method to see if that object can be edited by the given user."""
if user.is_anonymous: if user.is_anonymous:
return False return False
launderette_club = Club.objects.filter( launderette_club = Club.objects.get(id=settings.SITH_LAUNDERETTE_CLUB_ID)
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"]
).first()
m = launderette_club.get_membership_for(user) m = launderette_club.get_membership_for(user)
return bool(m and m.role >= 9) return bool(m and m.role >= 9)

View File

@ -196,9 +196,7 @@ class LaunderetteCreateView(PermissionRequiredMixin, CreateView):
permission_required = "launderette.add_launderette" permission_required = "launderette.add_launderette"
def form_valid(self, form): def form_valid(self, form):
club = Club.objects.filter( club = Club.objects.get(id=settings.SITH_LAUNDERETTE_CLUB_ID)
unix_name=settings.SITH_LAUNDERETTE_MANAGER["unix_name"]
).first()
c = Counter(name=form.instance.name, club=club, type="OFFICE") c = Counter(name=form.instance.name, club=club, type="OFFICE")
c.save() c.save()
form.instance.counter = c form.instance.counter = c

View File

@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-25 16:38+0100\n" "POT-Creation-Date: 2025-03-01 10:56+0100\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n" "Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@ -656,11 +656,11 @@ msgid "Linked operation:"
msgstr "Opération liée : " msgstr "Opération liée : "
#: accounting/templates/accounting/operation_edit.jinja #: accounting/templates/accounting/operation_edit.jinja
#: com/templates/com/news_edit.jinja com/templates/com/poster_edit.jinja #: club/templates/club/edit_club.jinja com/templates/com/news_edit.jinja
#: com/templates/com/screen_edit.jinja com/templates/com/weekmail.jinja #: com/templates/com/poster_edit.jinja com/templates/com/screen_edit.jinja
#: core/templates/core/create.jinja core/templates/core/edit.jinja #: com/templates/com/weekmail.jinja core/templates/core/create.jinja
#: core/templates/core/file_edit.jinja core/templates/core/macros_pages.jinja #: core/templates/core/edit.jinja core/templates/core/file_edit.jinja
#: core/templates/core/page_prop.jinja #: core/templates/core/macros_pages.jinja core/templates/core/page_prop.jinja
#: core/templates/core/user_godfathers.jinja #: core/templates/core/user_godfathers.jinja
#: core/templates/core/user_godfathers_tree.jinja #: core/templates/core/user_godfathers_tree.jinja
#: core/templates/core/user_preferences.jinja #: core/templates/core/user_preferences.jinja
@ -882,20 +882,8 @@ msgid "You do not have the permission to do that"
msgstr "Vous n'avez pas la permission de faire cela" msgstr "Vous n'avez pas la permission de faire cela"
#: club/models.py #: club/models.py
msgid "unix name" msgid "slug name"
msgstr "nom unix" msgstr "nom slug"
#: club/models.py
msgid ""
"Enter a valid unix name. This value may contain only letters, numbers ./-/_ "
"characters."
msgstr ""
"Entrez un nom UNIX valide. Cette valeur peut contenir uniquement des "
"lettres, des nombres, et les caractères ./-/_"
#: club/models.py
msgid "A club with that unix name already exists."
msgstr "Un club avec ce nom UNIX existe déjà."
#: club/models.py #: club/models.py
msgid "logo" msgid "logo"
@ -909,6 +897,14 @@ msgstr "actif"
msgid "short description" msgid "short description"
msgstr "description courte" msgstr "description courte"
#: club/models.py
msgid ""
"A summary of what your club does. This will be displayed on the club list "
"page."
msgstr ""
"Un résumé des activités des activités de votre club. Ceci sera affiché sur "
"la page de la liste des clubs."
#: club/models.py core/models.py #: club/models.py core/models.py
msgid "address" msgid "address"
msgstr "Adresse" msgstr "Adresse"
@ -988,7 +984,7 @@ msgstr "inactif"
msgid "New club" msgid "New club"
msgstr "Nouveau club" msgstr "Nouveau club"
#: club/templates/club/club_list.jinja club/templates/club/stats.jinja #: club/templates/club/club_list.jinja
msgid "There is no club in this website." msgid "There is no club in this website."
msgstr "Il n'y a pas de club dans ce site web." msgstr "Il n'y a pas de club dans ce site web."
@ -1059,7 +1055,7 @@ msgstr "Suivant"
msgid "Sales" msgid "Sales"
msgstr "Ventes" msgstr "Ventes"
#: club/templates/club/club_sellings.jinja club/templates/club/stats.jinja #: club/templates/club/club_sellings.jinja
#: counter/templates/counter/cash_summary_list.jinja #: counter/templates/counter/cash_summary_list.jinja
msgid "Show" msgid "Show"
msgstr "Montrer" msgstr "Montrer"
@ -1160,6 +1156,35 @@ msgstr "Comptabilité : "
msgid "Manage launderettes" msgid "Manage launderettes"
msgstr "Gestion des laveries" msgstr "Gestion des laveries"
#: club/templates/club/edit_club.jinja core/templates/core/edit.jinja
#, python-format
msgid "Edit %(name)s"
msgstr "Éditer %(name)s"
#: club/templates/club/edit_club.jinja
msgid "Club properties"
msgstr "Propriétés du club"
#: club/templates/club/edit_club.jinja
msgid ""
"The following form fields are linked to the core properties of a club. Only "
"admin users can see and edit them."
msgstr ""
"Les champs de formulaire suivants sont liées aux propriétés essentielles d'un "
"club. Seuls les administrateurs peuvent voir et modifier ceux-ci."
#: club/templates/club/edit_club.jinja
msgid "Club informations"
msgstr "Informations du club"
#: club/templates/club/edit_club.jinja
msgid ""
"The following form fields are linked to the basic description of a club. All "
"board members of this club can see and edit them."
msgstr ""
"Les champs de formulaire suivants sont liées à la description basique d'un club. "
"Tous les membres du bureau du club peuvent voir et modifier ceux-ci."
#: club/templates/club/mailing.jinja #: club/templates/club/mailing.jinja
msgid "Mailing lists" msgid "Mailing lists"
msgstr "Mailing listes" msgstr "Mailing listes"
@ -1218,10 +1243,6 @@ msgstr "Créer une liste de diffusion"
msgid "No page existing for this club" msgid "No page existing for this club"
msgstr "Aucune page n'existe pour ce club" msgstr "Aucune page n'existe pour ce club"
#: club/templates/club/stats.jinja
msgid "Club stats"
msgstr "Statistiques du club"
#: club/views.py #: club/views.py
msgid "Members" msgid "Members"
msgstr "Membres" msgstr "Membres"
@ -2427,11 +2448,6 @@ msgstr "Confirmation"
msgid "Cancel" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
#: core/templates/core/edit.jinja
#, python-format
msgid "Edit %(name)s"
msgstr "Éditer %(name)s"
#: core/templates/core/file.jinja core/templates/core/file_list.jinja #: core/templates/core/file.jinja core/templates/core/file_list.jinja
msgid "File list" msgid "File list"
msgstr "Liste de fichiers" msgstr "Liste de fichiers"
@ -2837,6 +2853,7 @@ msgid "Users"
msgstr "Utilisateurs" msgstr "Utilisateurs"
#: core/templates/core/search.jinja core/views/user.py #: core/templates/core/search.jinja core/views/user.py
#: counter/templates/counter/product_list.jinja
msgid "Clubs" msgid "Clubs"
msgstr "Clubs" msgstr "Clubs"
@ -3182,7 +3199,7 @@ msgid "Bans"
msgstr "Bans" msgstr "Bans"
#: core/templates/core/user_tools.jinja counter/forms.py #: core/templates/core/user_tools.jinja counter/forms.py
#: counter/views/mixins.py #: counter/templates/counter/product_list.jinja counter/views/mixins.py
msgid "Counters" msgid "Counters"
msgstr "Comptoirs" msgstr "Comptoirs"

View File

@ -18,6 +18,7 @@ from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
from django.utils.timezone import localtime, now from django.utils.timezone import localtime, now
from model_bakery import baker
from club.models import Club from club.models import Club
from core.models import Group, User from core.models import Group, User
@ -28,7 +29,7 @@ from subscription.models import Subscription
class TestMergeUser(TestCase): class TestMergeUser(TestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
cls.ae = Club.objects.get(unix_name="ae") cls.club = baker.make(Club)
cls.eboutic = Counter.objects.get(name="Eboutic") cls.eboutic = Counter.objects.get(name="Eboutic")
cls.barbar = Product.objects.get(code="BARB") cls.barbar = Product.objects.get(code="BARB")
cls.barbar.selling_price = 2 cls.barbar.selling_price = 2
@ -97,7 +98,7 @@ class TestMergeUser(TestCase):
Selling( Selling(
label="barbar", label="barbar",
counter=self.eboutic, counter=self.eboutic,
club=self.ae, club=self.club,
product=self.barbar, product=self.barbar,
customer=self.to_keep.customer, customer=self.to_keep.customer,
seller=self.root, seller=self.root,
@ -108,7 +109,7 @@ class TestMergeUser(TestCase):
Selling( Selling(
label="barbar", label="barbar",
counter=self.eboutic, counter=self.eboutic,
club=self.ae, club=self.club,
product=self.barbar, product=self.barbar,
customer=self.to_delete.customer, customer=self.to_delete.customer,
seller=self.root, seller=self.root,
@ -180,7 +181,7 @@ class TestMergeUser(TestCase):
Selling( Selling(
label="barbar", label="barbar",
counter=self.eboutic, counter=self.eboutic,
club=self.ae, club=self.club,
product=self.barbar, product=self.barbar,
customer=self.to_delete.customer, customer=self.to_delete.customer,
seller=self.root, seller=self.root,
@ -208,7 +209,7 @@ class TestMergeUser(TestCase):
Selling( Selling(
label="barbar", label="barbar",
counter=self.eboutic, counter=self.eboutic,
club=self.ae, club=self.club,
product=self.barbar, product=self.barbar,
customer=self.to_keep.customer, customer=self.to_keep.customer,
seller=self.root, seller=self.root,

View File

@ -332,27 +332,9 @@ SITH_TWITTER = "@ae_utbm"
SITH_ENABLE_GALAXY = False SITH_ENABLE_GALAXY = False
# AE configuration # AE configuration
# TODO: keep only that first setting, with the ID, and do the same for the other clubs
SITH_MAIN_CLUB_ID = env.int("SITH_MAIN_CLUB_ID", default=1) SITH_MAIN_CLUB_ID = env.int("SITH_MAIN_CLUB_ID", default=1)
SITH_MAIN_CLUB = { SITH_PDF_CLUB_ID = env.int("SITH_PDF_CLUB_ID", default=2)
"name": "AE", SITH_LAUNDERETTE_CLUB_ID = env.int("SITH_LAUNDERETTE_CLUB_ID", default=84)
"unix_name": "ae",
"address": "6 Boulevard Anatole France, 90000 Belfort",
}
# Bar managers
SITH_BAR_MANAGER = {
"name": "Pdf",
"unix_name": "pdfesti",
"address": "6 Boulevard Anatole France, 90000 Belfort",
}
# Launderette managers
SITH_LAUNDERETTE_MANAGER = {
"name": "Laverie",
"unix_name": "laverie",
"address": "6 Boulevard Anatole France, 90000 Belfort",
}
# Main root for club pages # Main root for club pages
SITH_CLUB_ROOT_PAGE = "clubs" SITH_CLUB_ROOT_PAGE = "clubs"
@ -405,10 +387,6 @@ SITH_SAS_IMAGES_PER_PAGE = 60
SITH_BOARD_SUFFIX = "-bureau" SITH_BOARD_SUFFIX = "-bureau"
SITH_MEMBER_SUFFIX = "-membres" SITH_MEMBER_SUFFIX = "-membres"
SITH_MAIN_BOARD_GROUP = SITH_MAIN_CLUB["unix_name"] + SITH_BOARD_SUFFIX
SITH_MAIN_MEMBERS_GROUP = SITH_MAIN_CLUB["unix_name"] + SITH_MEMBER_SUFFIX
SITH_BAR_MANAGER_BOARD_GROUP = SITH_BAR_MANAGER["unix_name"] + SITH_BOARD_SUFFIX
SITH_PROFILE_DEPARTMENTS = [ SITH_PROFILE_DEPARTMENTS = [
("TC", _("TC")), ("TC", _("TC")),
("IMSI", _("IMSI")), ("IMSI", _("IMSI")),