Select Git revision
fix-submits
-
Martin Mareš authoredMartin Mareš authored
fix-submits 1.59 KiB
#!/usr/bin/env python3
import argparse
import datetime
import os
from sqlalchemy.orm import joinedload
import subprocess
import tempfile
import mo.db as db
import mo.submit
import mo.util
parser = argparse.ArgumentParser(description='Pokusí se opravit rozbitá PDF')
parser.add_argument(dest='id', type=int, nargs='?', help='ID papíru k opravení')
args = parser.parse_args()
mo.util.init_standalone()
sess = db.get_session()
fixed = 0
errors = 0
def fix_paper(id: int):
global fixed, errors
paper = (sess.query(db.Paper)
.options(joinedload(db.Paper.for_user_obj))
.get(id))
assert paper is not None
assert paper.orig_file_name is not None
print(f"=== Paper #{id} ({paper.orig_file_name}){' [RETRY]' if paper.fixed_at else ''}")
tmp_file = tempfile.NamedTemporaryFile(dir=mo.util.data_dir('tmp'), prefix='fix-')
res = subprocess.run(['qpdf', os.path.join(mo.util.data_dir('submits'), paper.orig_file_name), tmp_file.name])
if res.returncode in [0, 3]:
sub = mo.submit.Submitter()
try:
sub.submit_fix(paper, tmp_file.name)
fixed += 1
except mo.submit.SubmitException:
errors += 1
else:
print(f'--> ERROR: qpdf failed with exit code {res.returncode}')
errors += 1
paper.fixed_at = datetime.datetime.now()
sess.commit()
if args.id is not None:
fix_paper(args.id)
else:
papers = sess.query(db.Paper).filter_by(file_name=None).all()
sess.rollback()
for p in papers:
fix_paper(p.paper_id)
print(f'Opraveno {fixed} PDF, stále rozbito {errors}')