From 19beb3d327825d656b9e48e8693804ad7c162d02 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Mon, 15 Mar 2021 14:34:30 +0100
Subject: [PATCH] =?UTF-8?q?Nov=C3=BD=20skript=20na=20opravov=C3=A1n=C3=AD?=
=?UTF-8?q?=20rozbit=C3=BDch=20submit=C5=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bin/fix-submits | 53 ++++++++++++++++++-------------------------------
1 file changed, 19 insertions(+), 34 deletions(-)
diff --git a/bin/fix-submits b/bin/fix-submits
index eb4476f3..9fccdc73 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}')
--
GitLab