diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index a326b8ed..52931898 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -36,7 +36,7 @@ from django.utils import timezone from django.utils.timezone import localdate 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.models import News, NewsDate, Sith, Weekmail from core.models import BanGroup, Group, Page, PageRev, SithFile, User @@ -69,6 +69,13 @@ class PopulatedGroups(NamedTuple): campus_admin: Group +class PopulatedClubs(NamedTuple): + ae: Club + troll: Club + pdf: Club + refound: Club + + class Command(BaseCommand): ROOT_PATH: ClassVar[Path] = Path(__file__).parent.parent.parent.parent SAS_FIXTURE_PATH: ClassVar[Path] = ( @@ -120,32 +127,16 @@ class Command(BaseCommand): sas = SithFile.objects.create( name="SAS", owner=root, id=settings.SITH_SAS_ROOT_DIR_ID ) - main_club = Club.objects.create( - 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", - "view_hidden_user", - ] - ) - ) - bar_club = Club.objects.create( - id=settings.SITH_PDF_CLUB_ID, - name="PdF", - address="6 Boulevard Anatole France, 90000 Belfort", - ) + clubs = self._create_clubs() self.reset_index("club") 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") counters = [ - Counter(name="Eboutic", club=main_club, type="EBOUTIC"), - Counter(name="AE", club=main_club, type="OFFICE"), - Counter(name="Vidage comptes AE", club=main_club, type="OFFICE"), + Counter(name="Eboutic", club=clubs.ae, type="EBOUTIC"), + Counter(name="AE", club=clubs.ae, type="OFFICE"), + Counter(name="Vidage comptes AE", club=clubs.ae, type="OFFICE"), ] Counter.objects.bulk_create(counters) bar_groups = [] @@ -328,62 +319,49 @@ class Command(BaseCommand): self._create_subscription(tutu) StudentCard(uid="9A89B82018B0A0", customer=sli.customer).save() - # Clubs - Club.objects.create( - name="Bibo'UT", address="46 de la Boustifaille", parent=main_club + Membership.objects.create( + user=skia, club=clubs.ae, role=clubs.ae.roles.get(name="Respo Info") ) - 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( user=comunity, - club=bar_club, + club=clubs.pdf, start_date=localdate(), - role=settings.SITH_CLUB_ROLES_ID["Board member"], + role=clubs.pdf.roles.get(name="Membre du bureau"), ) Membership.objects.create( user=sli, - club=troll, - role=9, + club=clubs.troll, + role=clubs.troll.roles.get(name="Vice-Président⸱e"), description="Padawan Troll", start_date=localdate() - timedelta(days=17), ) Membership.objects.create( user=krophil, - club=troll, - role=10, + club=clubs.troll, + role=clubs.troll.roles.get(name="Président⸱e"), description="Maitre Troll", start_date=localdate() - timedelta(days=200), ) Membership.objects.create( user=skia, - club=troll, - role=2, + club=clubs.troll, + role=clubs.troll.roles.get(name="Membre du bureau"), description="Grand Ancien Troll", start_date=localdate() - timedelta(days=400), end_date=localdate() - timedelta(days=86), ) Membership.objects.create( user=richard, - club=troll, - role=2, + club=clubs.troll, + role=clubs.troll.roles.get(name="Membre du bureau"), description="", start_date=localdate() - timedelta(days=200), end_date=localdate() - timedelta(days=100), ) - self._create_products(groups, main_club, refound) + self._create_products(groups, clubs) - Counter.objects.create(name="Carte AE", club=refound, type="OFFICE") + Counter.objects.create(name="Carte AE", club=clubs.refound, type="OFFICE") # Add barman to counter Counter.sellers.through.objects.bulk_create( @@ -403,7 +381,7 @@ class Command(BaseCommand): end_date="7942-06-12 10:28:45+01", ) 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.vote_groups.add(groups.subscribers) liste = ElectionList.objects.create(title="Candidature Libre", election=el) @@ -476,7 +454,7 @@ class Command(BaseCommand): title="Apero barman", summary="Viens boire un coup avec les barmans", content="Glou glou glou glou glou glou glou", - club=bar_club, + club=clubs.pdf, author=subscriber, is_published=True, moderator=skia, @@ -494,7 +472,7 @@ class Command(BaseCommand): content=( "Viens donc t'enjailler avec les autres barmans aux frais du BdF! \\o/" ), - club=bar_club, + club=clubs.pdf, author=subscriber, is_published=True, moderator=skia, @@ -510,7 +488,7 @@ class Command(BaseCommand): title="Repas fromager", summary="Wien manger du l'bon fromeug'", content="Fô viendre mangey d'la bonne fondue!", - club=bar_club, + club=clubs.pdf, author=subscriber, is_published=True, moderator=skia, @@ -526,7 +504,7 @@ class Command(BaseCommand): title="SdF", summary="Enjoy la fin des finaux!", content="Viens faire la fête avec tout plein de gens!", - club=bar_club, + club=clubs.pdf, author=subscriber, is_published=True, moderator=skia, @@ -544,7 +522,7 @@ class Command(BaseCommand): summary="Viens jouer!", content="Rejoins la fine équipe du Troll Penché et viens " "t'amuser le Vendredi soir!", - club=troll, + club=clubs.troll, author=subscriber, is_published=True, moderator=skia, @@ -645,9 +623,7 @@ class Command(BaseCommand): ] ) - def _create_products( - self, groups: PopulatedGroups, main_club: Club, refound_club: Club - ): + def _create_products(self, groups: PopulatedGroups, clubs: PopulatedClubs): beers_type, cotis_type, refill_type, verre_type = ( ProductType.objects.bulk_create( [ @@ -663,28 +639,28 @@ class Command(BaseCommand): code="1SCOTIZ", product_type=cotis_type, purchase_price=15, - club=main_club, + club=clubs.ae, ) cotis2 = Product.objects.create( name="Cotis 2 semestres", code="2SCOTIZ", product_type=cotis_type, purchase_price="28", - club=main_club, + club=clubs.ae, ) refill = Product.objects.create( name="Rechargement 15 €", code="15REFILL", product_type=refill_type, purchase_price=15, - club=main_club, + club=clubs.ae, ) barb = Product.objects.create( name="Barbar", code="BARB", product_type=beers_type, purchase_price="1.50", - club=main_club, + club=clubs.pdf, limit_age=18, ) cble = Product.objects.create( @@ -692,7 +668,7 @@ class Command(BaseCommand): code="CBLE", product_type=beers_type, purchase_price="1.50", - club=main_club, + club=clubs.pdf, limit_age=18, ) cons = Product.objects.create( @@ -700,21 +676,21 @@ class Command(BaseCommand): code="CONS", product_type=verre_type, purchase_price="1", - club=main_club, + club=clubs.pdf, ) dcons = Product.objects.create( name="Déconsigne Eco-cup", code="DECO", product_type=verre_type, purchase_price="-1", - club=main_club, + club=clubs.pdf, ) cors = Product.objects.create( name="Corsendonk", code="CORS", product_type=beers_type, purchase_price="1.50", - club=main_club, + club=clubs.pdf, limit_age=18, ) carolus = Product.objects.create( @@ -722,14 +698,14 @@ class Command(BaseCommand): code="CARO", product_type=beers_type, purchase_price="1.50", - club=main_club, + club=clubs.pdf, limit_age=18, ) Product.objects.create( name="remboursement", code="REMBOURS", purchase_price=0, - club=refound_club, + club=clubs.refound, ) ReturnableProduct.objects.create( product=cons, returned_product=dcons, max_return=3 @@ -806,6 +782,57 @@ class Command(BaseCommand): ) 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", + "view_hidden_user", + ] + ) + ) + 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: perms = Permission.objects.all() diff --git a/core/management/commands/populate_more.py b/core/management/commands/populate_more.py index 47cb75d5..14b1c59a 100644 --- a/core/management/commands/populate_more.py +++ b/core/management/commands/populate_more.py @@ -11,7 +11,7 @@ from django.db.models import Count, Exists, Min, OuterRef, Subquery from django.utils.timezone import localdate, make_aware, now 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 counter.models import ( Counter, @@ -173,20 +173,25 @@ class Command(BaseCommand): Customer.objects.bulk_create(customers, ignore_conflicts=True) def make_club(self, club: Club, members: list[User], old_members: list[User]): - def zip_roles(users: list[User]) -> Iterator[tuple[User, int]]: - roles = iter(sorted(settings.SITH_CLUB_ROLES.keys(), reverse=True)) + roles: list[ClubRole] = list(club.roles.all()) + + 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 - while (role := next(roles)) > 2: + for _role in important_roles: # one member for each major role - yield users[user_idx], role + yield users[user_idx], _role user_idx += 1 for _ in range(int(0.3 * (len(users) - user_idx))): # 30% of the remaining in the board - yield users[user_idx], 2 + yield users[user_idx], simple_board_role user_idx += 1 for remaining in users[user_idx + 1 :]: # everything else is a simple member - yield remaining, 1 + yield remaining, random.choices(member_roles, weights=(0.8, 0.2))[0] memberships = [] old_members = old_members.copy() @@ -198,19 +203,14 @@ class Command(BaseCommand): start_date=start, end_date=self.faker.past_date(start), user=old, - role=random.choice(list(settings.SITH_CLUB_ROLES.keys())), + role=random.choice(roles), club=club, ) ) for member, role in zip_roles(members): start = self.faker.past_date("-1y") memberships.append( - Membership( - start_date=start, - user=member, - role=role, - club=club, - ) + Membership(start_date=start, user=member, role=role, club=club) ) memberships = Membership.objects.bulk_create(memberships) Membership._add_club_groups(memberships)