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

Nový skript na opravování rozbitých submitů

parent ecde2727
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !53. Comments created here will be created in the context of that merge request.
#!/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')
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}')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment