39 lines
1.7 KiB
Python
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
|