#!/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}')