diff --git a/etc/config.py.example b/etc/config.py.example
index f7db910c8d24c676a30bba7a76e80c983ab6f1db..af31c885e4b8e54e644833d85064433a921fb6df 100644
--- a/etc/config.py.example
+++ b/etc/config.py.example
@@ -53,3 +53,6 @@ REG_MAX_PER_MINUTE = 10
# Jak dlouho vydrží tokeny používané při registraci a změnách e-mailu [min]
REG_TOKEN_VALIDITY = 10
+
+# Aktuální ročník MO
+CURRENT_YEAR = 71
diff --git a/mo/__init__.py b/mo/__init__.py
index 98d16b9ad30321087b30790a71fe913ae7eec036..d98ba045b8e901ab953bcc40df33a46e096b8c94 100644
--- a/mo/__init__.py
+++ b/mo/__init__.py
@@ -2,9 +2,6 @@
import datetime
-# Aktuální ročník
-current_year = 71
-
# Referenční čas nastavovaný v initu requestu (web) nebo při volání skriptu
now: datetime.datetime
diff --git a/mo/imports.py b/mo/imports.py
index 005f62f029da3f0a8840b9c16d462352ce53b38a..4cf8deede795e083e67eb21f7d97b0bd1a6c1408 100644
--- a/mo/imports.py
+++ b/mo/imports.py
@@ -7,6 +7,7 @@ from sqlalchemy import and_
from sqlalchemy.orm import joinedload, Query
from typing import List, Optional, Any, Dict, Type, Union
+import mo.config as config
import mo.csv
from mo.csv import FileFormat, MissingHeaderError
import mo.db as db
@@ -449,7 +450,7 @@ class ContestImport(Import):
if user is None:
return
- part = self.find_or_create_participant(user, mo.current_year, school_place.place_id if school_place else None, rok_naroz, rocnik)
+ part = self.find_or_create_participant(user, config.CURRENT_YEAR, school_place.place_id if school_place else None, rok_naroz, rocnik)
if part is None:
return
diff --git a/mo/web/acct.py b/mo/web/acct.py
index cd3bc74e15d377bc877887ec678a6f6a2fbcab9d..a07888d3dd7b1682c5e3bbf0102374e26097384a 100644
--- a/mo/web/acct.py
+++ b/mo/web/acct.py
@@ -120,7 +120,7 @@ def user_settings():
if g.user.is_org or g.user.is_admin:
pant = None
else:
- pant = sess.query(db.Participant).get((g.user.user_id, mo.current_year))
+ pant = sess.query(db.Participant).get((g.user.user_id, config.CURRENT_YEAR))
return render_template('settings.html', user=g.user, pant=pant, roles=roles, roles_by_type=mo.rights.roles_by_type)
diff --git a/mo/web/org.py b/mo/web/org.py
index aebbfae957f8f0677327553d3a9a4e20b7671015..a07d62610d05d51728386fee3f087b75a2556cd3 100644
--- a/mo/web/org.py
+++ b/mo/web/org.py
@@ -3,6 +3,7 @@ from sqlalchemy import and_, or_
from sqlalchemy.orm import aliased, joinedload
from typing import List, Set, Dict
+import mo.config as config
import mo.db as db
import mo.rights
import mo.users
@@ -38,7 +39,7 @@ def org_index():
or_(db.UserRole.category == None, db.UserRole.category == db.Round.category),
or_(db.UserRole.year == None, db.UserRole.year == db.Round.year),
or_(db.UserRole.seq == None, db.UserRole.seq == db.Round.seq),
- db.Round.year == mo.current_year,
+ db.Round.year == config.CURRENT_YEAR,
db.Contest.round_id == db.Round.round_id,
db.Contest.place_id == db.UserRole.place_id))
.options(joinedload(db.Contest.place))
diff --git a/mo/web/org_round.py b/mo/web/org_round.py
index 88da8505708ee535929ad8fb9ccc2cc639a9153a..587821c920575090d5133294189a80db888588e7 100644
--- a/mo/web/org_round.py
+++ b/mo/web/org_round.py
@@ -16,7 +16,7 @@ import wtforms
from wtforms import validators, ValidationError
from wtforms.widgets.html5 import NumberInput
-import mo
+import mo.config as config
import mo.db as db
import mo.imports
from mo.rights import Right, RoundRights
@@ -54,7 +54,7 @@ def get_task(round: db.Round, task_id: int) -> db.Task:
def org_rounds():
sess = db.get_session()
- rounds = sess.query(db.Round).filter_by(year=mo.current_year).order_by(db.Round.year, db.Round.category, db.Round.seq, db.Round.part)
+ rounds = sess.query(db.Round).filter_by(year=config.CURRENT_YEAR).order_by(db.Round.year, db.Round.category, db.Round.seq, db.Round.part)
return render_template('org_rounds.html', rounds=rounds, history=False)
diff --git a/mo/web/user.py b/mo/web/user.py
index ee53d404bccf1edcc9f0fd24b9aeb363a922ee66..4ac6b05af25726f8f34de0f6085f6eea3ddea26f 100644
--- a/mo/web/user.py
+++ b/mo/web/user.py
@@ -8,7 +8,6 @@ import werkzeug.exceptions
import wtforms
from wtforms.validators import Required
-import mo
import mo.config as config
import mo.email
import mo.db as db
@@ -41,7 +40,7 @@ def load_pcrs() -> List[Tuple[db.Participation, db.Contest, db.Round]]:
.join(db.Contest, db.Contest.master_contest_id == db.Participation.contest_id)
.join(db.Round)
.filter(db.Participation.user == g.user)
- .filter(db.Round.year == mo.current_year)
+ .filter(db.Round.year == config.CURRENT_YEAR)
.options(joinedload(db.Contest.place))
.order_by(db.Round.category, db.Round.seq, db.Round.part)
.all())
@@ -52,7 +51,7 @@ def user_join():
available_rounds: List[db.Round] = (
db.get_session().query(db.Round)
.select_from(db.Round)
- .filter_by(year=mo.current_year)
+ .filter_by(year=config.CURRENT_YEAR)
.filter(db.Round.enroll_mode.in_([db.RoundEnrollMode.register, db.RoundEnrollMode.confirm]))
.filter_by(state=db.RoundState.running)
.order_by(db.Round.category, db.Round.seq)
@@ -87,7 +86,7 @@ def user_join_round(round_id):
if not round:
raise werkzeug.exceptions.NotFound()
- if (round.year != mo.current_year
+ if (round.year != config.CURRENT_YEAR
or round.part > 1
or round.enroll_mode not in [db.RoundEnrollMode.register, db.RoundEnrollMode.confirm]
or round.state != db.RoundState.running):
@@ -155,7 +154,7 @@ def user_join_round(round_id):
def join_create_pant(form: JoinRoundForm) -> db.Participant:
assert form.school.place is not None
pant = db.Participant(user=g.user,
- year=mo.current_year,
+ year=config.CURRENT_YEAR,
school_place=form.school.place,
grade=form.grade.data,
birth_year=form.birth_year.data)