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

Submit používá link_to_dir a uchovává vadné soubory v data/errors/

parent 1e030420
No related branches found
No related tags found
1 merge request!21Reforma uploadů
This commit is part of merge request !21. Comments created here will be created in the context of that merge request.
......@@ -2,7 +2,6 @@ import datetime
import multiprocessing
import os
import pikepdf
import secrets
import werkzeug.utils
import mo.db as db
......@@ -30,10 +29,11 @@ class Submitter:
logger.info(f'Submit: Hotovo: file={paper.file_name} pages={paper.pages} bytes={paper.bytes} time={duration:.3f}')
except SubmitException as e:
duration = (datetime.datetime.now() - t_start).total_seconds()
logger.info(f'Submit: Chyba: {e} (time={duration:.3f})')
preserved_as = mo.util.link_to_dir(tmpfile, mo.util.data_dir('errors'), prefix='submit-')
logger.info(f'Submit: Chyba: {e} (time={duration:.3f}), uloženo do {preserved_as}')
raise
def _create_file_name(self, paper: db.Paper) -> str:
def _file_paper(self, paper: db.Paper, tmpfile: str):
round = paper.task.round
secure_category = werkzeug.utils.secure_filename(round.category)
top_level = f'{round.year}-{secure_category}-{round.seq}'
......@@ -42,18 +42,11 @@ class Submitter:
os.makedirs(sub_user_dir, exist_ok=True)
secure_task_code = werkzeug.utils.secure_filename(paper.task.code)
while True:
nonce = secrets.token_hex(8)
file_name = f'{secure_task_code}-{paper.type.name[:3]}-{nonce}.pdf'
if not os.path.lexists(os.path.join(sub_user_dir, file_name)):
break
logger.warning(f'Retrying file creation for {sub_user_dir}/{file_name}')
return os.path.join(user_dir, file_name)
full_name = mo.util.link_to_dir(tmpfile, sub_user_dir, prefix=f'{secure_task_code}-{paper.type.name[:3]}-', suffix='.pdf')
paper.file_name = os.path.join(user_dir, os.path.basename(full_name))
def _do_submit(self, paper: db.Paper, tmpfile: str):
# Zpracování PDF spustíme v samostatném procesu, aby bylo dostatečně oddělené
# FIXME: Omezit paměť apod.
pipe_rx, pipe_tx = multiprocessing.Pipe(duplex=False)
proc = multiprocessing.Process(name='submit', target=Submitter._process_pdf, args=(tmpfile, pipe_tx))
proc.start()
......@@ -83,11 +76,7 @@ class Submitter:
paper.bytes = os.path.getsize(tmpfile)
paper.pages = result['pages']
paper.file_name = self._create_file_name(paper)
# FIXME: fsync?
dest = os.path.join(self.submit_dir, paper.file_name)
os.rename(tmpfile, dest)
self._file_paper(paper, tmpfile)
# Zpracování PDF běží v samostatném procesu, výsledek pošle jako slovník rourou.
def _process_pdf(tmpfile, pipe):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment