From e66a4dbf73b293607bc1e0b8eded0481ab766174 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Sun, 10 Jan 2021 21:23:35 +0100 Subject: [PATCH] =?UTF-8?q?Job=20pro=20stahov=C3=A1n=C3=AD=20=C5=99e=C5=A1?= =?UTF-8?q?en=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dostává množinu papírů, které má zazipovat. --- mo/jobs/submit.py | 64 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/mo/jobs/submit.py b/mo/jobs/submit.py index 9ae525e5..0fca6478 100644 --- a/mo/jobs/submit.py +++ b/mo/jobs/submit.py @@ -1,17 +1,71 @@ # Implementace jobů pracujících se submity -from mo.util import logger +import os +from sqlalchemy.orm import joinedload +from tempfile import NamedTemporaryFile +from typing import List +import unicodedata +import werkzeug.utils +import zipfile + +from mo.util import logger, data_dir import mo.db as db from mo.jobs import TheJob, job_handler +def schedule_download_submits(paper_ids: List[int], description: str, for_user: db.User): + tj = TheJob() + job = tj.create(db.JobType.download_submits, for_user) + job.description = description + job.in_json = {'papers': paper_ids} + tj.submit() + + @job_handler(db.JobType.download_submits) def handle_download_submits(tj: TheJob): - logger.debug('Entering download_submits') - pass + """Zazipuje zadané papíry. + + Vstupní JSON: + { 'papers': [ seznam paper_id ke stažení ] } + + Výstupní JSON: + null + """ + + job = tj.job + assert job.in_json is not None + # FIXME: Typování JSONu... + ids = job.in_json['papers'] + + sess = db.get_session() + papers = (sess.query(db.Paper) + .filter(db.Paper.paper_id.in_(ids)) + .options(joinedload(db.Paper.for_user_obj), + joinedload(db.Paper.task)) + .all()) + + temp_file = NamedTemporaryFile(suffix='.zip', dir=data_dir('tmp'), mode='w+b') + logger.debug('Job: Vytvářím archiv %s', temp_file.name) + # FIXME: Setřídit soubory + + cnt = 0 + with zipfile.ZipFile(temp_file, mode='w') as zip: + for p in papers: + cnt += 1 + full_name = p.for_user_obj.full_name() + ascii_name = (unicodedata.normalize('NFD', full_name) + .encode('ascii', 'ignore') + .decode('utf-8')) + fn = f'{p.task.code}_{cnt:04d}_{p.for_user}_{p.paper_id}_{ascii_name}.pdf' + fn = werkzeug.utils.secure_filename(fn) + logger.debug('Job: Přidávám %s', fn) + zip.write(filename=os.path.join(data_dir('submits'), p.file_name), + arcname=fn) + + job.out_file = tj.attach_file(temp_file.name, '.zip') + temp_file.close() @job_handler(db.JobType.upload_feedback) def handle_upload_feedback(tj: TheJob): - logger.debug('Entering upload_feedback') - pass + raise NotImplementedError() -- GitLab