Skip to content
Snippets Groups Projects
Commit bdbe4c1d authored by Martin Mareš's avatar Martin Mareš
Browse files

Export účastníků umí sloupeček s e-maily školních garantů

Closes #278.
parent 87dfbad6
No related branches found
No related tags found
1 merge request!127E-maily školních garantů účastníků
...@@ -607,7 +607,7 @@ def org_generic_list(round_id: Optional[int] = None, hier_id: Optional[int] = No ...@@ -607,7 +607,7 @@ def org_generic_list(round_id: Optional[int] = None, hier_id: Optional[int] = No
filter=filter, count=count, action_form=action_form, filter=filter, count=count, action_form=action_form,
) )
else: else:
table = make_contestant_table(query, round) table = make_contestant_table(query, round, add_school_orgs=True)
return table.send_as(format, args=request.args) return table.send_as(format, args=request.args)
...@@ -618,6 +618,7 @@ contest_list_columns = ( ...@@ -618,6 +618,7 @@ contest_list_columns = (
Column(key='email', name='email', title='E-mail'), Column(key='email', name='email', title='E-mail'),
Column(key='school', name='skola', title='Škola'), Column(key='school', name='skola', title='Škola'),
Column(key='school_code', name='kod_skoly', title='Kód školy'), Column(key='school_code', name='kod_skoly', title='Kód školy'),
Column(key='school_orgs', name='skol_garanti', title='E-maily školních garantů'),
Column(key='grade', name='rocnik', title='Ročník'), Column(key='grade', name='rocnik', title='Ročník'),
Column(key='born_year', name='rok_naroz', title='Rok naroz.'), Column(key='born_year', name='rok_naroz', title='Rok naroz.'),
Column(key='place_code', name='kod_soutez_mista', title='Sout. místo'), Column(key='place_code', name='kod_soutez_mista', title='Sout. místo'),
...@@ -665,17 +666,37 @@ def get_contestants_query( ...@@ -665,17 +666,37 @@ def get_contestants_query(
return query return query
def make_contestant_table(query: Query, round: db.Round, add_checkbox: bool = False, add_contest_column: bool = False): def get_school_orgs(query_result: List[Tuple[db.Participation, db.Participant, db.Contest]]) -> Dict[int, List[db.User]]:
school_ids = set(pant.school for _, pant, _ in query_result)
user_roles = (db.get_session()
.query(db.UserRole)
.filter_by(role=db.RoleType.garant_skola)
.filter(db.UserRole.place_id.in_(school_ids))
.options(joinedload(db.UserRole.user))
.all())
out: Dict[int, List[db.User]] = {sid: [] for sid in school_ids}
for ur in user_roles:
out[ur.place_id].append(ur.user)
return out
def make_contestant_table(query: Query, round: db.Round, add_checkbox: bool = False, add_contest_column: bool = False, add_school_orgs: bool = False) -> Table:
ctants = query.all() ctants = query.all()
if add_school_orgs:
school_orgs = get_school_orgs(ctants)
rows: List[Row] = [] rows: List[Row] = []
for pion, pant, ct in ctants: for pion, pant, ct in ctants:
u = pion.user u = pion.user
html_attr = { html_attr = {
'class': 'state-' + pion.state.name 'class': 'state-' + pion.state.name
} }
rows.append(Row( row_keys = {
keys={
'sort_key': u.sort_key(), 'sort_key': u.sort_key(),
'user_id': u.user_id, 'user_id': u.user_id,
'first_name': cell_pion_link(u, pion.contest_id, u.first_name), 'first_name': cell_pion_link(u, pion.contest_id, u.first_name),
...@@ -689,9 +710,11 @@ def make_contestant_table(query: Query, round: db.Round, add_checkbox: bool = Fa ...@@ -689,9 +710,11 @@ def make_contestant_table(query: Query, round: db.Round, add_checkbox: bool = Fa
'place_code': cell_contest_link(ct, pion.place), 'place_code': cell_contest_link(ct, pion.place),
'status': pion.state.friendly_name(), 'status': pion.state.friendly_name(),
'checkbox': CellCheckbox('checked', u.user_id, False), 'checkbox': CellCheckbox('checked', u.user_id, False),
}, }
html_attr=html_attr, if add_school_orgs:
)) assert pant.school in school_orgs
row_keys['school_orgs'] = ', '.join([user.email for user in school_orgs[pant.school]])
rows.append(Row(keys=row_keys, html_attr=html_attr))
rows.sort(key=lambda r: r.keys['sort_key']) rows.sort(key=lambda r: r.keys['sort_key'])
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment