Skip to content
Snippets Groups Projects

Sazba diplomů

Compare and Show latest version
12 files
+ 352
118
Compare changes
  • Side-by-side
  • Inline

Files

+ 33
16
@@ -14,7 +14,7 @@ from mo.jobs import TheJob, job_handler
import mo.util
from mo.util import logger
import mo.util_format
from mo.util_tex import tex_arg, run_tex, format_hacks
from mo.util_tex import tex_arg, run_tex, format_hacks, QREncoder
def schedule_create_certs(contest: db.Contest, for_user: db.User) -> int:
@@ -53,6 +53,10 @@ class CertMaker:
certs: List[Cert]
out_files: Dict[db.CertType, str]
qr_encoder: QREncoder
certs_dir: str
out_dir: str # relativní k certs_dir
job_dir: str # adresář jobu
def __init__(self, the_job: TheJob):
self.the_job = the_job
@@ -77,6 +81,11 @@ class CertMaker:
self.certs = []
self.out_files = {}
self.qr_encoder = QREncoder(f'{self.job.dir_path()}/qr')
self.certs_dir = mo.util.data_dir('certs')
self.out_dir = os.path.join(self.round.round_code_short(), str(self.contest.contest_id))
self.job_dir = self.job.dir_path()
def plan(self) -> None:
sess = db.get_session()
@@ -119,26 +128,31 @@ class CertMaker:
if order['span'] == 1:
place = f"{order['place']}."
else:
place = f"{order['place']}.--{order['place'] + order['span'] - 1}."
place = f"{order['place']}.{order['place'] + order['span'] - 1}."
add_cert(db.CertType.successful, f'za {place} místo', (order['place'], user.sort_key()))
# Pochvalné uznání
if row is not None and row.get('honorary_mention', False):
add_cert(db.CertType.honorary_mention, 'za úplné vyřešení úlohy', user.sort_key())
def prepare_files(self) -> None:
if self.cset.background_file:
background = os.path.join(self.job_dir, 'background.pdf')
mo.util.unlink_if_exists(background)
os.link(os.path.join(self.certs_dir, self.cset.background_file), background)
def make_certs(self, cert_type: db.CertType) -> None:
certs = [cert for cert in self.certs if cert.type == cert_type]
if not certs:
return
temp_dir = self.job.dir_path()
name = cert_type.file_name()
logger.debug(f'{self.the_job.log_prefix} Vytvářím certifikáty typu {name} v {temp_dir} ({len(certs)} listů)')
logger.debug(f'{self.the_job.log_prefix} Vytvářím certifikáty typu {name} v {self.job_dir} ({len(certs)} listů)')
certs.sort(key=lambda cert: cert.sort_key)
self.make_tex_source(f'{temp_dir}/{name}.tex', certs)
run_tex(temp_dir, f'{name}.tex')
self.out_files[cert_type] = f'{temp_dir}/{name}.pdf'
self.make_tex_source(f'{self.job_dir}/{name}.tex', certs)
run_tex(self.job_dir, f'{name}.tex')
self.out_files[cert_type] = f'{self.job_dir}/{name}.pdf'
def make_tex_source(self, filename: str, certs: List[Cert]) -> None:
with open(filename, 'w') as f:
@@ -157,6 +171,7 @@ class CertMaker:
'signerBtitle': self.cset.signer2_title,
'issueplace': self.cset.issue_place,
'issuedate': self.cset.issue_date,
'background': "background.pdf" if self.cset.background_file else "",
}
if self.round.round_type in (db.RoundType.okresni, db.RoundType.krajske):
ga['oblast'] = self.place.name
@@ -164,12 +179,15 @@ class CertMaker:
f.write(format_hacks(self.cset.tex_hacks))
for i, cert in enumerate(certs):
qr_url = self._make_qr_url(cert)
qr_file = self.qr_encoder.generate(qr_url, border=4)
f.write('\n{\n')
attrs({
'jmeno': cert.user.full_name(),
'skola': cert.school.name,
'uspech': cert.achievement,
'qrurl': self._make_qr_url(cert),
'qrurl': qr_url,
'qrimg': os.path.basename(qr_file),
})
f.write('\\Cert' + cert.type.name.replace('_', '').title() + '\n')
f.write('}\n')
@@ -194,12 +212,10 @@ class CertMaker:
sess = db.get_session()
conn = sess.connection()
certs_dir = mo.util.data_dir('certs')
out_dir = os.path.join(self.round.round_code_short(), str(self.contest.contest_id))
full_dir = os.path.join(certs_dir, out_dir)
os.makedirs(full_dir, exist_ok=True)
# Nejdříve smažeme už zbytečné soubory s QR kódy
self.qr_encoder.remove_all()
# Nejdříve najdeme všechny staré soubory s certifikáty
# Najdeme všechny staré soubory s certifikáty
old_files = [cfile.pdf_file for cfile in sess.query(db.CertFile).filter_by(cert_set_id=self.contest_id).all()]
# Smažeme z DB staré certifikáty
@@ -208,11 +224,11 @@ class CertMaker:
# Založíme nové soubory
for ctype, out_file in self.out_files.items():
file = mo.util.link_to_dir(out_file, full_dir, prefix=f'{ctype.file_name()}-', suffix='.pdf')
pdf_file = mo.util.link_to_dir(out_file, self.out_dir, base_dir=self.certs_dir, prefix=f'{ctype.file_name()}-', suffix='.pdf', make_dirs=True)
sess.add(db.CertFile(
cert_set_id=self.contest_id,
type=ctype,
pdf_file=os.path.join(out_dir, os.path.basename(file)),
pdf_file=pdf_file,
))
# Založíme nové certifikáty
@@ -245,13 +261,14 @@ class CertMaker:
# Nakonec smažeme staré soubory
for old_file in old_files:
mo.util.unlink_if_exists(os.path.join(certs_dir, old_file))
mo.util.unlink_if_exists(os.path.join(self.certs_dir, old_file))
@job_handler(db.JobType.create_certs)
def handle_create_protocols(the_job: TheJob):
cm = CertMaker(the_job)
cm.plan()
cm.prepare_files()
for ctype in db.CertType:
cm.make_certs(ctype)
cm.store_results()
Loading