Skip to content
Snippets Groups Projects

Reforma uploadů

1 unresolved thread
Merged Martin Mareš requested to merge mj/upload into devel
1 unresolved thread
1 file
+ 6
17
Compare changes
  • Side-by-side
  • Inline
+ 6
17
@@ -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):
Loading