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

Merge branch 'master' into devel

parents 806a7c86 bdacd9eb
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python3
# Přehled všech organizátorských účtů
from dataclasses import dataclass
from sqlalchemy.orm import joinedload
import sys
import mo.csv
import mo.db as db
sess = db.get_session()
orgs = (sess.query(db.User)
.filter_by(is_org=True)
.options(joinedload(db.User.roles).joinedload(db.UserRole.place))
.all())
@dataclass
class Row:
jmeno: str
email: str
last_login: str
role: str = ""
kod_souteze: str = ""
kod_mista: str = ""
misto: str = ""
output = []
for user in sorted(orgs, key=lambda u: u.sort_key()):
o = Row(
jmeno=user.full_name(),
email=user.email,
last_login=(user.last_login_at.strftime('%Y-%m-%d') if user.last_login_at is not None else '-'),
)
if user.roles:
for r in user.roles:
o.role = r.role
o.kod_souteze = f"{r.category or '*'}-{r.year or '*'}-{r.seq or '*'}"
p = r.place
o.kod_mista = p.get_code()
o.misto = p.type_name() + " " + p.name
output.append(o)
else:
o.role = '-'
output.append(o)
mo.csv.write(sys.stdout, mo.csv.FileFormat.en_csv, Row, output)
Co obsahuje výsledková listina (organizační řád 2017)
=====================================================
Klauzurní část školního kola
- pořadí
Okresní kolo
- pořadí
- úspěšní řešitelé
Krajské kolo
- jednoznačné pořadí
- úspěšní řešitelé
- bodova hranice stanovena celostátně
- celostátně: # úspěšných řešitelů ≤ # všech účastníků / 2
Ústřední kolo
- jednoznačné pořadí
- úspěšní řešitelé
- # úspěšných řešitelů ≤ # všech účastníků / 2
- vítězové
- # vítězů ≤ # úspěšných řešitelů
Určování jednoznačného pořadí (bodovací pokyny 2017)
====================================================
(1) celkový počet bodů
(2) lexikografické srovnání k-tic bodů za úlohy,
každá k-tice je uspořádána sestupně
(3) lexikografické srovnání k-tic bodů za úlohy,
ale tentokrát úlohy uspořádáme od nejtěžší
(té s nejmenším průměrným počtem bodů v této výsledkovce)
## Neřeší se, co dělat při shodě obtížností úloh.
(4) rekurze na předchozí kolo
## Neřeší se, z čeho se počítají obtížnosti úloh.
(5) upřednostníme soutěžící z nižších ročníků
(6) rozhodne los
U neúspěšných řešitelů neuvádíme pořadí. Třídíme je primárně podle
počtu bodů, sekundárně podle jména.
......@@ -19,7 +19,7 @@ class Right(Enum):
upload_feedback = auto() # Nahrávat opravené řešení ve stavu "grading"
view_submits = auto() # Prohlížet si řešení a opravy
upload_submits = auto() # Nahrávat řešení a opravy nezávisle na stavu soutěže
edit_points = auto()
edit_points = auto() # Přidělovat body ve stavu "grading"
view_statement = auto() # Prohlížet zadání, pokud je dostupné pro dozor
add_users = auto()
edit_users = auto()
......@@ -192,7 +192,8 @@ class Rights:
or self.have_right(Right.upload_feedback) and round.state == db.RoundState.grading)
def can_edit_points(self, round: db.Round) -> bool:
return self.have_right(Right.edit_points) and round.state == db.RoundState.grading
return (self.have_right(Right.edit_points) and round.state == db.RoundState.grading
or self.have_right(Right.manage_contest))
def can_view_statement(self, round: db.Round) -> bool:
if round.tasks_file is None:
......
......@@ -33,6 +33,8 @@ def login_and_redirect(user: db.User, url: Optional[str] = None):
url = url_for('org_index')
else:
url = url_for('index')
else:
url = request.script_root + url
return redirect(url)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment