···1616 PLAZA_PRICE: int = 10
1717 PLAZA_DEFAULT_HOUR: int = 10
1818 PLAZA_DEFAULT_MINUTE: int = 0
1919- PLAZA_SIZE: int = 4
1919+ PLAZA_SIZE: str = "3-5"
2020+ PLAZA_SIZE_OPTIONS: list[int] = [3, 4, 5]
2021 LOCALE: str = "es_ES"
2122 KUDOS_PRICE: int = 100
2223 CONGRATS_PRICE: int = 25
+19-4
kefi/models/plazas/helpers.py
···102102 results = session.exec(query).all()
103103 users = [attendance.user for attendance in results]
104104 random.shuffle(users)
105105- return [
106106- users[index : index + settings.PLAZA_SIZE]
107107- for index in range(0, len(users), settings.PLAZA_SIZE)
108108- ]
105105+ return split_users_in_groups(users)
106106+107107+108108+def split_users_in_groups(users: list[User]) -> list[list]:
109109+ users_len = len(users)
110110+ if min(settings.PLAZA_SIZE_OPTIONS) > users_len:
111111+ return []
112112+ group_size = next(
113113+ filter(lambda size: users_len % size == 0, settings.PLAZA_SIZE_OPTIONS),
114114+ settings.PLAZA_SIZE_OPTIONS[0],
115115+ )
116116+ grouped_users = list(
117117+ [users[i : i + group_size] for i in range(0, users_len, group_size)]
118118+ )
119119+ if len(grouped_users[-1]) < group_size:
120120+ orphan_users = grouped_users.pop()
121121+ for i, user in enumerate(orphan_users):
122122+ grouped_users[i % len(grouped_users)].append(user)
123123+ return grouped_users
109124110125111126def notify_plaza(session: Session, plaza: Plaza | None = None):
kefi/tests/plazas/__init__.py
This is a binary file and will not be displayed.
+22
kefi/tests/plazas/helpers.py
···11+from kefi.models.database import User
22+from kefi.models.plazas.helpers import split_users_in_groups
33+44+55+def test_split_users_in_groups():
66+ mock_user_list = lambda size_list: (
77+ User(slack_user_id="user_1") for i in range(size_list)
88+ )
99+ # Creates some list of users
1010+ # Here i would like to mock settings value to [3,4,5] for test to work always
1111+ # Creates some list of users
1212+ users_lists = [
1313+ {"list": mock_user_list(9), "expected_groups": 3},
1414+ {"list": mock_user_list(10), "expected_groups": 2},
1515+ {"list": mock_user_list(8), "expected_groups": 2},
1616+ {"list": mock_user_list(14), "expected_groups": 4},
1717+ {"list": mock_user_list(3), "expected_groups": 1},
1818+ {"list": mock_user_list(2), "expected_groups": 0},
1919+ ]
2020+2121+ for users in users_lists:
2222+ assert len(split_users_in_groups(users.list)) == users.expected_groups