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

Jobs: Implementace jobu fix_submits

Inspirováno skriptem bin/fix-submits
parent 29c406ac
No related branches found
No related tags found
1 merge request!109Automatická oprava rozbitých PDF
# Implementace jobů pracujících se submity
from dataclasses import dataclass
import datetime
import os
import re
import shutil
from sqlalchemy import and_
from sqlalchemy.orm import joinedload
import subprocess
from tempfile import NamedTemporaryFile
from typing import List, Optional
import unicodedata
......@@ -311,3 +313,77 @@ def handle_upload_feedback(the_job: TheJob):
+ inflect_by_number(len(the_job.errors), 'nastala', 'nastaly', 'nastalo')
+ ' '
+ inflect_number(len(the_job.errors), 'chyba', 'chyby', 'chyb'))
#
# Job fix_submits: Opravuje rozbité submity
#
# Vstupní JSON:
# { 'papers': [ seznam paper_id k opravení ],
# }
#
# Výstupní JSON:
# null
#
def check_broken_submits() -> None:
sess = db.get_session()
papers = sess.query(db.Paper).filter_by(file_name=None, fixed_at=None).all()
if not papers:
return
the_job = TheJob()
job = the_job.create(db.JobType.fix_submits, db.get_system_user())
job.description = 'Oprava rozbitých protokolů'
job.in_json = {'papers': [p.paper_id for p in papers]}
the_job.submit()
@job_handler(db.JobType.fix_submits)
def handle_fix_submits(the_job: TheJob):
job = the_job.job
assert job.in_json is not None
paper_ids: List[int] = job.in_json['papers'] # type: ignore
sess = db.get_session()
cnt_fixed = 0
cnt_failed = 0
cnt_skipped = 0
for paper_id in paper_ids:
log_prefix = f'Protokol #{paper_id}'
paper = (sess.query(db.Paper)
.options(joinedload(db.Paper.for_user_obj))
.get(paper_id))
if paper is None or paper.fixed_at is not None:
cnt_skipped += 1
logger.debug(f'Job: {log_prefix}: Již byl vyřízen')
continue
logger.debug(f'Job: {log_prefix}: Opravuji')
tmp_file = NamedTemporaryFile(dir=data_dir('tmp'), prefix='fix-')
res = subprocess.run(['qpdf', os.path.join(data_dir('submits'), paper.orig_file_name), tmp_file.name])
if res.returncode in [0, 3]:
sub = Submitter()
try:
sub.submit_fix(paper, tmp_file.name)
logger.info(f'Job: {log_prefix}: Opraven')
cnt_fixed += 1
except SubmitException:
the_job.error(f'{log_prefix}: Oprava selhala')
cnt_failed += 1
else:
the_job.error(f'{log_prefix}: qpdf selhalo s exit code {res.returncode}')
cnt_failed += 1
paper.fixed_at = datetime.datetime.now()
sess.commit()
report = [inflect_number(cnt_fixed, 'opraven', 'opraveny', 'opraveno')]
if cnt_failed > 0:
report.append(inflect_number(cnt_failed, 'selhal', 'selhaly', 'selhalo'))
if cnt_skipped > 0:
report.append(inflect_number(cnt_skipped, 'přeskočen', 'přeskočeny', 'přeskočeno'))
job.result = 'Oprava protokolů: ' + ', '.join(report)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment