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

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

parent 58a4fee7
Branches
No related tags found
1 merge request!53Změna reprezentace rozbitých submitů
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 #!/usr/bin/env python3
import argparse import argparse
import datetime
import os import os
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
import subprocess import subprocess
...@@ -18,57 +17,43 @@ args = parser.parse_args() ...@@ -18,57 +17,43 @@ args = parser.parse_args()
mo.util.init_standalone() mo.util.init_standalone()
sess = db.get_session() sess = db.get_session()
fixed = 0
errors = 0
def fix_paper(id: int): def fix_paper(id: int):
global fixed, errors
paper = (sess.query(db.Paper) paper = (sess.query(db.Paper)
.options(joinedload(db.Paper.for_user_obj)) .options(joinedload(db.Paper.for_user_obj))
.get(id)) .get(id))
assert paper is not None assert paper is not None
print(f"=== Paper #{id} ({paper.file_name})") assert paper.orig_file_name is not None
print(f"=== Paper #{id} ({paper.orig_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
tmp_file = tempfile.NamedTemporaryFile(dir=mo.util.data_dir('tmp'), prefix='fix-') 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])
res = subprocess.run(['qpdf', os.path.join(mo.util.data_dir('submits'), paper.file_name), tmp_file.name])
if res.returncode in [0, 3]: if res.returncode in [0, 3]:
sub = mo.submit.Submitter() sub = mo.submit.Submitter()
new_paper = db.Paper(task=paper.task, try:
for_user_obj=paper.for_user_obj, sub.submit_fix(paper, tmp_file.name)
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() sess.commit()
fixed += 1
except mo.submit.SubmitException:
sess.rollback()
errors += 1
else: else:
print(f'--> ERROR: qpdf failed with exit code {res.returncode}') print(f'--> ERROR: qpdf failed with exit code {res.returncode}')
sess.rollback() sess.rollback()
errors += 1
print("")
if args.id is not None: if args.id is not None:
fix_paper(args.id) fix_paper(args.id)
else: else:
papers = sess.query(db.Paper).filter_by(broken=True).all() papers = sess.query(db.Paper).filter_by(file_name=None).all()
sess.rollback() sess.rollback()
for p in papers: for p in papers:
fix_paper(p.paper_id) 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