Skip to content
Snippets Groups Projects
Commit 2dc2ec66 authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Skeny: Použití state namísto speciálních hodnot seq_id při rozpoznávání skenů + odhadnuté stavy

Automaticky odhadujeme prázdné stránky a při oboustranném skenování také
pokračující stránky (sudé navazující stránky bez kódu, co nejsou prázdné).

Příprava pro #279
parent 551cbab1
No related branches found
No related tags found
1 merge request!126Vylepšení skenování - prázdné stránky, otáčení, vylepšení UI
......@@ -929,22 +929,15 @@ class ScanPage(Base):
task = relationship('Task')
def is_empty(self) -> bool:
return self.seq_id == SCAN_PAGE_EMPTY and self.user_id is None and self.task_id is None
return self.state in (ScanPageState.empty, ScanPageState.probably_empty)
def is_ok(self) -> bool:
return self.user_id is not None and self.user_id > 0 and self.task_id is not None and self.task_id > 0 and self.seq_id >= 0
return self.user_id is not None and self.user_id > 0 and self.task_id is not None and self.task_id > 0 and self.seq_id > 0
def human_nr(self) -> str:
return f'{self.file_nr + 1}/{self.page_nr + 1}'
# Speciální seq_id ve ScanPage
SCAN_PAGE_FIX = -1
SCAN_PAGE_EMPTY = -2
SCAN_PAGE_CONTINUE = -3
SCAN_PAGE_UFO = -4
class ScoreTable(Base):
__tablename__ = 'score_tables'
......
......@@ -259,10 +259,26 @@ def handle_process_scans(the_job: TheJob):
for fi, fn in enumerate(in_files)]
results = pool.map(_process_scan_file, args)
def _parse_code(pr: ScanJobPage, sp: db.ScanPage) -> Optional[str]:
def _fill_continuation(sp: db.ScanPage, prev_page: db.ScanPage):
sp.user_id = prev_page.user_id
sp.task_id = prev_page.task_id
sp.seq_id = prev_page.seq_id + 1
def _parse_code(pi: int, pr: ScanJobPage, sp: db.ScanPage, pp: Optional[db.ScanPage]) -> Optional[str]:
if pr.code is None:
if pr.empty:
sp.state = db.ScanPageState.probably_empty
elif double_sided and pi % 2 == 1 and pp:
# Sudá stránka bez kódu při oboustranném skenování -> pokračování té předchozí
sp.state = db.ScanPageState.probably_ok
_fill_continuation(sp, pp)
else:
sp.state = db.ScanPageState.unknown
return None
# Máme kód a pokud ho nerozpoznáme, tak je sken oficiálně divný
sp.state = db.ScanPageState.ufo
fields = pr.code.split(':')
if fields[0] != 'MO':
return 'Neznámý prefix'
......@@ -270,12 +286,17 @@ def handle_process_scans(the_job: TheJob):
if len(fields) == 2:
if fields[1] == '*':
# Univerzální hlavička úlohy
sp.seq_id = db.SCAN_PAGE_FIX
sp.state = db.ScanPageState.unknown
return None
if fields[1] == '+':
# Pokračovací papír s kódem
sp.seq_id = db.SCAN_PAGE_CONTINUE
if pp:
sp.state = db.ScanPageState.ok
_fill_continuation(sp, pp)
return None
else:
sp.state = db.ScanPageState.unknown
return "Pokračovací papír bez rozpoznaného předchozího skenu"
elif len(fields) == 4:
if not fields[3].isnumeric():
......@@ -288,6 +309,7 @@ def handle_process_scans(the_job: TheJob):
return 'Neznámá úloha'
if user_id not in user_ids:
return 'Neznámý účastník'
sp.state = db.ScanPageState.ok
sp.user_id = user_id
sp.task_id = tasks_by_code[fields[2]].task_id
sp.seq_id = 1
......@@ -312,23 +334,21 @@ def handle_process_scans(the_job: TheJob):
job_id=job.job_id,
file_nr=fi,
page_nr=pi,
seq_id=db.SCAN_PAGE_FIX,
seq_id=0,
)
err = _parse_code(pr, sp)
if sp.seq_id == 1:
prev_page = sp
elif sp.seq_id == db.SCAN_PAGE_CONTINUE and prev_page is not None:
sp.user_id = prev_page.user_id
sp.task_id = prev_page.task_id
sp.seq_id = prev_page.seq_id + 1
prev_page = sp
else:
prev_page = None
err = _parse_code(pi, pr, sp, prev_page)
if err is not None:
logger.debug(f'Scan: {fi}/{pi} ({pr.code}): {err}')
sp.seq_id = db.SCAN_PAGE_UFO
# Zapamatujeme si stránku pro navázání
if sp.state in (db.ScanPageState.ok, db.ScanPageState.probably_ok):
prev_page = sp
elif sp.state == db.ScanPageState.probably_empty:
pass # přeskočíme
else:
prev_page = None # na neznámé a divné stránky nejda navázat (ani navázat napříč jimi)
sess.add(sp)
num_pages += 1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment