Files
paper-atlas/paper_atlas/db/edition_scopes.py
T
codex-bot 7035cf33b9
Metadata integrity checks / metadata (push) Successful in 1m59s
Correct existing attempt tracks with bound evidence and refresh guards
2026-11-08 23:46:37 +08:00

39 lines
1.7 KiB
Python

"""Retain reviewed event scopes when a source refresh repeats a whole-volume label."""
import json
KEY = 'edition_scope_curation_v1'
def preserve(metadata, previous):
old = json.loads(previous).get(KEY) if previous else None
if KEY in metadata and metadata[KEY] != old:
raise ValueError('Source import cannot supply or replace reviewed edition scope')
if old is not None:
metadata[KEY] = old
return metadata
def resolve(c, record, external, venue, year, track, event_key):
row = c.execute('SELECT metadata_json FROM source_records WHERE id=?', (record,)).fetchone()
entries = json.loads(row[0]).get(KEY, []) if row else []
if not isinstance(entries, list):
raise ValueError('Invalid reviewed edition scope')
applicable = []
for entry in entries:
if entry['external_id'] != external:
continue
old, target = entry['from'], entry['target']
if int(year) != old['year'] or venue not in entry['venue_names']:
continue
if track not in (old['track'], target['track']):
continue
if event_key is not None and event_key != old['event_key']:
continue
current = c.execute('SELECT venue_id,year,track,event_key FROM editions WHERE id=?', (target['edition_id'],)).fetchone()
if not current or [current[i] for i in range(4)] != [target[k] for k in ('venue_id','year','track','event_key')]:
raise ValueError('Reviewed target edition has changed')
applicable.append(target['edition_id'])
if len(applicable) > 1:
raise ValueError('Ambiguous reviewed edition scope')
return applicable[0] if applicable else None