diff --git a/bin/fix-submits b/bin/fix-submits index eb4476f3ae9056f9a3417b26dd099ba203c7f633..9fccdc73e2cf501b8e8e2e00acbeefd0a7311842 100755 --- a/bin/fix-submits +++ b/bin/fix-submits @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import argparse -import datetime import os from sqlalchemy.orm import joinedload import subprocess @@ -18,57 +17,43 @@ 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 - print(f"=== Paper #{id} ({paper.file_name})") - - sol = (sess.query(db.Solution) - .filter_by(task_id=paper.for_task, user_id=paper.for_user) - .one()) - if paper.paper_id not in [sol.final_submit, sol.final_feedback]: - print('--> not final\n') - sess.rollback() - return + assert paper.orig_file_name is not None + print(f"=== Paper #{id} ({paper.orig_file_name})") 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.file_name), tmp_file.name]) + 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() - new_paper = db.Paper(task=paper.task, - for_user_obj=paper.for_user_obj, - type=paper.type, - uploaded_by_obj=paper.uploaded_by_obj, - uploaded_at=paper.uploaded_at + datetime.timedelta(seconds=1), - note='Automatická konverze rozbitého PDF') - sub.submit_paper(new_paper, tmp_file.name) - assert not new_paper.broken - - sess.add(new_paper) - if new_paper.type == db.PaperType.solution: - sol.final_submit_obj = new_paper - elif new_paper.type == db.PaperType.feedback: - sol.final_feedback_obj = new_paper - else: - assert False - - print('--> OK') - sess.commit() + try: + sub.submit_fix(paper, tmp_file.name) + sess.commit() + fixed += 1 + except mo.submit.SubmitException: + sess.rollback() + errors += 1 else: print(f'--> ERROR: qpdf failed with exit code {res.returncode}') sess.rollback() - - print("") + errors += 1 if args.id is not None: fix_paper(args.id) else: - papers = sess.query(db.Paper).filter_by(broken=True).all() + 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}')