Skip to content
Snippets Groups Projects

Změna reprezentace rozbitých submitů

Merged Martin Mareš requested to merge mj/broken into devel
All threads resolved!
1 file
+ 19
34
Compare changes
  • Side-by-side
  • Inline
+ 19
34
#!/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}')
Loading