adapt populate and populate_more

This commit is contained in:
imperosol
2025-09-27 16:10:22 +02:00
parent 3f313ca984
commit cbaf9a6cce
2 changed files with 102 additions and 74 deletions

View File

@@ -36,7 +36,7 @@ from django.utils import timezone
from django.utils.timezone import localdate from django.utils.timezone import localdate
from PIL import Image from PIL import Image
from club.models import Club, Membership from club.models import Club, ClubRole, Membership
from com.ics_calendar import IcsCalendar from com.ics_calendar import IcsCalendar
from com.models import News, NewsDate, Sith, Weekmail from com.models import News, NewsDate, Sith, Weekmail
from core.models import BanGroup, Group, Page, PageRev, SithFile, User from core.models import BanGroup, Group, Page, PageRev, SithFile, User
@@ -62,6 +62,13 @@ class PopulatedGroups(NamedTuple):
campus_admin: Group campus_admin: Group
class PopulatedClubs(NamedTuple):
ae: Club
troll: Club
pdf: Club
refound: Club
class Command(BaseCommand): class Command(BaseCommand):
ROOT_PATH: ClassVar[Path] = Path(__file__).parent.parent.parent.parent ROOT_PATH: ClassVar[Path] = Path(__file__).parent.parent.parent.parent
SAS_FIXTURE_PATH: ClassVar[Path] = ( SAS_FIXTURE_PATH: ClassVar[Path] = (
@@ -111,28 +118,16 @@ 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( clubs = self._create_clubs()
id=1, name="AE", address="6 Boulevard Anatole France, 90000 Belfort"
)
main_club.board_group.permissions.add(
*Permission.objects.filter(
codename__in=["view_subscription", "add_subscription"]
)
)
bar_club = Club.objects.create(
id=settings.SITH_PDF_CLUB_ID,
name="PdF",
address="6 Boulevard Anatole France, 90000 Belfort",
)
self.reset_index("club") self.reset_index("club")
for bar_id, bar_name in settings.SITH_COUNTER_BARS: for bar_id, bar_name in settings.SITH_COUNTER_BARS:
Counter(id=bar_id, name=bar_name, club=bar_club, type="BAR").save() Counter(id=bar_id, name=bar_name, club=clubs.pdf, type="BAR").save()
self.reset_index("counter") self.reset_index("counter")
counters = [ counters = [
Counter(name="Eboutic", club=main_club, type="EBOUTIC"), Counter(name="Eboutic", club=clubs.ae, type="EBOUTIC"),
Counter(name="AE", club=main_club, type="OFFICE"), Counter(name="AE", club=clubs.ae, type="OFFICE"),
Counter(name="Vidage comptes AE", club=main_club, type="OFFICE"), Counter(name="Vidage comptes AE", club=clubs.ae, type="OFFICE"),
] ]
Counter.objects.bulk_create(counters) Counter.objects.bulk_create(counters)
bar_groups = [] bar_groups = []
@@ -315,54 +310,41 @@ class Command(BaseCommand):
self._create_subscription(tutu) self._create_subscription(tutu)
StudentCard(uid="9A89B82018B0A0", customer=sli.customer).save() StudentCard(uid="9A89B82018B0A0", customer=sli.customer).save()
# Clubs Membership.objects.create(
Club.objects.create( user=skia, club=clubs.ae, role=clubs.ae.roles.get(name="Respo Info")
name="Bibo'UT", address="46 de la Boustifaille", parent=main_club
) )
guyut = Club.objects.create(
name="Guy'UT", address="42 de la Boustifaille", parent=main_club
)
Club.objects.create(name="Woenzel'UT", address="Woenzel", parent=guyut)
troll = Club.objects.create(
name="Troll Penché", address="Terre Du Milieu", parent=main_club
)
refound = Club.objects.create(
name="Carte AE", address="Jamais imprimée", parent=main_club
)
Membership.objects.create(user=skia, club=main_club, role=3)
Membership.objects.create( Membership.objects.create(
user=comunity, user=comunity,
club=bar_club, club=clubs.pdf,
start_date=localdate(), start_date=localdate(),
role=settings.SITH_CLUB_ROLES_ID["Board member"], role=clubs.pdf.roles.get(name="Membre du bureau"),
) )
Membership.objects.create( Membership.objects.create(
user=sli, user=sli,
club=troll, club=clubs.troll,
role=9, role=clubs.troll.roles.get(name="Vice-Président⸱e"),
description="Padawan Troll", description="Padawan Troll",
start_date=localdate() - timedelta(days=17), start_date=localdate() - timedelta(days=17),
) )
Membership.objects.create( Membership.objects.create(
user=krophil, user=krophil,
club=troll, club=clubs.troll,
role=10, role=clubs.troll.roles.get(name="Président⸱e"),
description="Maitre Troll", description="Maitre Troll",
start_date=localdate() - timedelta(days=200), start_date=localdate() - timedelta(days=200),
) )
Membership.objects.create( Membership.objects.create(
user=skia, user=skia,
club=troll, club=clubs.troll,
role=2, role=clubs.troll.roles.get(name="Membre du bureau"),
description="Grand Ancien Troll", description="Grand Ancien Troll",
start_date=localdate() - timedelta(days=400), start_date=localdate() - timedelta(days=400),
end_date=localdate() - timedelta(days=86), end_date=localdate() - timedelta(days=86),
) )
Membership.objects.create( Membership.objects.create(
user=richard, user=richard,
club=troll, club=clubs.troll,
role=2, role=clubs.troll.roles.get(name="Membre du bureau"),
description="", description="",
start_date=localdate() - timedelta(days=200), start_date=localdate() - timedelta(days=200),
end_date=localdate() - timedelta(days=100), end_date=localdate() - timedelta(days=100),
@@ -379,7 +361,7 @@ class Command(BaseCommand):
purchase_price="15", purchase_price="15",
selling_price="15", selling_price="15",
special_selling_price="15", special_selling_price="15",
club=main_club, club=clubs.ae,
) )
cotis2 = Product.objects.create( cotis2 = Product.objects.create(
name="Cotis 2 semestres", name="Cotis 2 semestres",
@@ -388,7 +370,7 @@ class Command(BaseCommand):
purchase_price="28", purchase_price="28",
selling_price="28", selling_price="28",
special_selling_price="28", special_selling_price="28",
club=main_club, club=clubs.ae,
) )
refill = Product.objects.create( refill = Product.objects.create(
name="Rechargement 15 €", name="Rechargement 15 €",
@@ -397,7 +379,7 @@ class Command(BaseCommand):
purchase_price="15", purchase_price="15",
selling_price="15", selling_price="15",
special_selling_price="15", special_selling_price="15",
club=main_club, club=clubs.ae,
) )
barb = Product.objects.create( barb = Product.objects.create(
name="Barbar", name="Barbar",
@@ -406,7 +388,7 @@ class Command(BaseCommand):
purchase_price="1.50", purchase_price="1.50",
selling_price="1.7", selling_price="1.7",
special_selling_price="1.6", special_selling_price="1.6",
club=main_club, club=clubs.ae,
limit_age=18, limit_age=18,
) )
cble = Product.objects.create( cble = Product.objects.create(
@@ -416,7 +398,7 @@ class Command(BaseCommand):
purchase_price="1.50", purchase_price="1.50",
selling_price="1.7", selling_price="1.7",
special_selling_price="1.6", special_selling_price="1.6",
club=main_club, club=clubs.ae,
limit_age=18, limit_age=18,
) )
cons = Product.objects.create( cons = Product.objects.create(
@@ -426,7 +408,7 @@ class Command(BaseCommand):
purchase_price="1", purchase_price="1",
selling_price="1", selling_price="1",
special_selling_price="1", special_selling_price="1",
club=main_club, club=clubs.ae,
) )
dcons = Product.objects.create( dcons = Product.objects.create(
name="Déconsigne Eco-cup", name="Déconsigne Eco-cup",
@@ -435,7 +417,7 @@ class Command(BaseCommand):
purchase_price="-1", purchase_price="-1",
selling_price="-1", selling_price="-1",
special_selling_price="-1", special_selling_price="-1",
club=main_club, club=clubs.ae,
) )
cors = Product.objects.create( cors = Product.objects.create(
name="Corsendonk", name="Corsendonk",
@@ -444,7 +426,7 @@ class Command(BaseCommand):
purchase_price="1.50", purchase_price="1.50",
selling_price="1.7", selling_price="1.7",
special_selling_price="1.6", special_selling_price="1.6",
club=main_club, club=clubs.ae,
limit_age=18, limit_age=18,
) )
carolus = Product.objects.create( carolus = Product.objects.create(
@@ -454,7 +436,7 @@ class Command(BaseCommand):
purchase_price="1.50", purchase_price="1.50",
selling_price="1.7", selling_price="1.7",
special_selling_price="1.6", special_selling_price="1.6",
club=main_club, club=clubs.ae,
limit_age=18, limit_age=18,
) )
Product.objects.create( Product.objects.create(
@@ -463,7 +445,7 @@ class Command(BaseCommand):
purchase_price="0", purchase_price="0",
selling_price="0", selling_price="0",
special_selling_price="0", special_selling_price="0",
club=refound, club=clubs.refound,
) )
groups.subscribers.products.add( groups.subscribers.products.add(
cotis, cotis2, refill, barb, cble, cors, carolus cotis, cotis2, refill, barb, cble, cors, carolus
@@ -476,7 +458,7 @@ class Command(BaseCommand):
eboutic = Counter.objects.get(name="Eboutic") eboutic = Counter.objects.get(name="Eboutic")
eboutic.products.add(barb, cotis, cotis2, refill) eboutic.products.add(barb, cotis, cotis2, refill)
Counter.objects.create(name="Carte AE", club=refound, type="OFFICE") Counter.objects.create(name="Carte AE", club=clubs.refound, type="OFFICE")
ReturnableProduct.objects.create( ReturnableProduct.objects.create(
product=cons, returned_product=dcons, max_return=3 product=cons, returned_product=dcons, max_return=3
@@ -500,7 +482,7 @@ class Command(BaseCommand):
end_date="7942-06-12 10:28:45+01", end_date="7942-06-12 10:28:45+01",
) )
el.view_groups.add(groups.public) el.view_groups.add(groups.public)
el.edit_groups.add(main_club.board_group) el.edit_groups.add(clubs.ae.board_group)
el.candidature_groups.add(groups.subscribers) el.candidature_groups.add(groups.subscribers)
el.vote_groups.add(groups.subscribers) el.vote_groups.add(groups.subscribers)
liste = ElectionList.objects.create(title="Candidature Libre", election=el) liste = ElectionList.objects.create(title="Candidature Libre", election=el)
@@ -573,7 +555,7 @@ class Command(BaseCommand):
title="Apero barman", title="Apero barman",
summary="Viens boire un coup avec les barmans", summary="Viens boire un coup avec les barmans",
content="Glou glou glou glou glou glou glou", content="Glou glou glou glou glou glou glou",
club=bar_club, club=clubs.pdf,
author=subscriber, author=subscriber,
is_published=True, is_published=True,
moderator=skia, moderator=skia,
@@ -591,7 +573,7 @@ class Command(BaseCommand):
content=( content=(
"Viens donc t'enjailler avec les autres barmans aux frais du BdF! \\o/" "Viens donc t'enjailler avec les autres barmans aux frais du BdF! \\o/"
), ),
club=bar_club, club=clubs.pdf,
author=subscriber, author=subscriber,
is_published=True, is_published=True,
moderator=skia, moderator=skia,
@@ -607,7 +589,7 @@ class Command(BaseCommand):
title="Repas fromager", title="Repas fromager",
summary="Wien manger du l'bon fromeug'", summary="Wien manger du l'bon fromeug'",
content="Fô viendre mangey d'la bonne fondue!", content="Fô viendre mangey d'la bonne fondue!",
club=bar_club, club=clubs.pdf,
author=subscriber, author=subscriber,
is_published=True, is_published=True,
moderator=skia, moderator=skia,
@@ -623,7 +605,7 @@ class Command(BaseCommand):
title="SdF", title="SdF",
summary="Enjoy la fin des finaux!", summary="Enjoy la fin des finaux!",
content="Viens faire la fête avec tout plein de gens!", content="Viens faire la fête avec tout plein de gens!",
club=bar_club, club=clubs.pdf,
author=subscriber, author=subscriber,
is_published=True, is_published=True,
moderator=skia, moderator=skia,
@@ -641,7 +623,7 @@ class Command(BaseCommand):
summary="Viens jouer!", summary="Viens jouer!",
content="Rejoins la fine équipe du Troll Penché et viens " content="Rejoins la fine équipe du Troll Penché et viens "
"t'amuser le Vendredi soir!", "t'amuser le Vendredi soir!",
club=troll, club=clubs.troll,
author=subscriber, author=subscriber,
is_published=True, is_published=True,
moderator=skia, moderator=skia,
@@ -778,6 +760,52 @@ class Command(BaseCommand):
) )
s.save() s.save()
def _create_clubs(self) -> PopulatedClubs:
ae = Club.objects.create(
id=1, name="AE", address="6 Boulevard Anatole France, 90000 Belfort"
)
ae.board_group.permissions.add(
*Permission.objects.filter(
codename__in=["view_subscription", "add_subscription", "add_membership"]
)
)
pdf = Club.objects.create(
id=settings.SITH_PDF_CLUB_ID,
name="PdF",
address="6 Boulevard Anatole France, 90000 Belfort",
)
troll = Club.objects.create(
name="Troll Penché", address="Terre Du Milieu", parent=ae
)
refound = Club.objects.create(
name="Carte AE", address="Jamais imprimée", parent=ae
)
roles = []
presidency_roles = ["Président⸱e", "Vice-Président⸱e"]
board_roles = [
"Trésorier⸱e",
"Secrétaire",
"Respo Info",
"Respo Com",
"Membre du bureau",
]
simple_roles = ["Membre actif⸱ve", "Curieux⸱euse"]
for club in ae, pdf, troll, refound:
for i, role in enumerate(presidency_roles):
roles.append(
ClubRole(
club=club, order=i, name=role, is_presidency=True, is_board=True
)
)
for i, role in enumerate(board_roles, start=len(presidency_roles)):
roles.append(ClubRole(club=club, order=i, name=role, is_board=True))
for i, role in enumerate(
simple_roles, start=len(presidency_roles) + len(board_roles)
):
roles.append(ClubRole(club=club, order=i, name=role))
ClubRole.objects.bulk_create(roles)
return PopulatedClubs(ae=ae, troll=troll, pdf=pdf, refound=refound)
def _create_groups(self) -> PopulatedGroups: def _create_groups(self) -> PopulatedGroups:
perms = Permission.objects.all() perms = Permission.objects.all()

View File

@@ -11,7 +11,7 @@ from django.db.models import Count, Exists, Min, OuterRef, Subquery
from django.utils.timezone import localdate, make_aware, now from django.utils.timezone import localdate, make_aware, now
from faker import Faker from faker import Faker
from club.models import Club, Membership from club.models import Club, ClubRole, Membership
from core.models import Group, User, UserBan from core.models import Group, User, UserBan
from counter.models import ( from counter.models import (
Counter, Counter,
@@ -172,20 +172,25 @@ class Command(BaseCommand):
Customer.objects.bulk_create(customers, ignore_conflicts=True) Customer.objects.bulk_create(customers, ignore_conflicts=True)
def make_club(self, club: Club, members: list[User], old_members: list[User]): def make_club(self, club: Club, members: list[User], old_members: list[User]):
def zip_roles(users: list[User]) -> Iterator[tuple[User, int]]: roles: list[ClubRole] = list(club.roles.all())
roles = iter(sorted(settings.SITH_CLUB_ROLES.keys(), reverse=True))
def zip_roles(users: list[User]) -> Iterator[tuple[User, ClubRole]]:
important_roles = [r for r in roles if r.is_board]
important_roles.sort(key=lambda r: r.order)
simple_board_role = important_roles.pop()
member_roles = [r for r in roles if not r.is_board]
user_idx = 0 user_idx = 0
while (role := next(roles)) > 2: for _role in important_roles:
# one member for each major role # one member for each major role
yield users[user_idx], role yield users[user_idx], _role
user_idx += 1 user_idx += 1
for _ in range(int(0.3 * (len(users) - user_idx))): for _ in range(int(0.3 * (len(users) - user_idx))):
# 30% of the remaining in the board # 30% of the remaining in the board
yield users[user_idx], 2 yield users[user_idx], simple_board_role
user_idx += 1 user_idx += 1
for remaining in users[user_idx + 1 :]: for remaining in users[user_idx + 1 :]:
# everything else is a simple member # everything else is a simple member
yield remaining, 1 yield remaining, random.choices(member_roles, weights=(0.8, 0.2))[0]
memberships = [] memberships = []
old_members = old_members.copy() old_members = old_members.copy()
@@ -197,19 +202,14 @@ class Command(BaseCommand):
start_date=start, start_date=start,
end_date=self.faker.past_date(start), end_date=self.faker.past_date(start),
user=old, user=old,
role=random.choice(list(settings.SITH_CLUB_ROLES.keys())), role=random.choice(roles),
club=club, club=club,
) )
) )
for member, role in zip_roles(members): for member, role in zip_roles(members):
start = self.faker.past_date("-1y") start = self.faker.past_date("-1y")
memberships.append( memberships.append(
Membership( Membership(start_date=start, user=member, role=role, club=club)
start_date=start,
user=member,
role=role,
club=club,
)
) )
memberships = Membership.objects.bulk_create(memberships) memberships = Membership.objects.bulk_create(memberships)
Membership._add_club_groups(memberships) Membership._add_club_groups(memberships)