def test_build_query(add_languages): rec = { 'title': 'magic', 'languages': ['eng', 'fre'], 'authors': [{}], 'description': 'test', } q = build_query(rec) assert q['title'] == 'magic' assert q['description'] == {'type': '/type/text', 'value': 'test'} assert q['type'] == {'key': '/type/edition'} assert q['languages'] == [{'key': '/languages/eng'}, {'key': '/languages/fre'}] pytest.raises(InvalidLanguage, build_query, {'languages': ['wtf']})
def load_data(rec): cover_url = None if 'cover' in rec: cover_url = rec['cover'] del rec['cover'] try: q = build_query(rec) except InvalidLanguage as e: return { 'success': False, 'error': str(e), } edits = [] reply = {} author_in = [ import_author(a, eastern=east_in_by_statement(rec, a)) for a in q.get('authors', []) ] (authors, author_reply) = build_author_reply(author_in, edits) #q['source_records'] = [loc] if authors: q['authors'] = authors reply['authors'] = author_reply wkey = None ekey = web.ctx.site.new_key('/type/edition') cover_id = None if cover_url: cover_id = add_cover(cover_url, ekey) q['covers'] = [cover_id] work_state = 'created' if 'authors' in q: wkey = find_matching_work(q) if wkey: w = web.ctx.site.get(wkey) work_state = 'matched' found_wkey_match = True need_update = False for k in subject_fields: if k not in rec: continue for s in rec[k]: if s not in w.get(k, []): w.setdefault(k, []).append(s) need_update = True if cover_id: w.setdefault('covers', []).append(cover_id) need_update = True if need_update: work_state = 'modified' w_dict = w.dict() assert w_dict and isinstance(w_dict, dict) edits.append(w_dict) else: w = new_work(q, rec, cover_id) wkey = w['key'] edits.append(w) assert wkey q['works'] = [{'key': wkey}] q['key'] = ekey assert isinstance(q, dict) edits.append(q) assert edits web.ctx.site.save_many(edits, 'import new book') reply['success'] = True reply['edition'] = { 'key': ekey, 'status': 'created', } reply['work'] = { 'key': wkey, 'status': work_state, } return reply
def load_data(rec): """ Adds a new Edition to Open Library. Creates a new Work if required, otherwise associates the new Edition with an existing Work. :param dict rec: Edition record to add (no further checks at this point) :rtype: dict :return: { "success": False, "error": <error msg> } OR { "success": True, "work": {"key": <key>, "status": "created" | "modified" | "matched"}, "edition": {"key": <key>, "status": "created"} } """ cover_url = None if 'cover' in rec: cover_url = rec['cover'] del rec['cover'] try: # get an OL style edition dict edition = build_query(rec) except InvalidLanguage as e: return { 'success': False, 'error': str(e), } ekey = web.ctx.site.new_key('/type/edition') cover_id = None if cover_url: cover_id = add_cover(cover_url, ekey) edition['covers'] = [cover_id] edits = [] reply = {} author_in = [ import_author(a, eastern=east_in_by_statement(rec, a)) for a in edition.get('authors', []) ] # build_author_reply() adds authors to edits (authors, author_reply) = build_author_reply(author_in, edits) if authors: edition['authors'] = authors reply['authors'] = author_reply wkey = None work_state = 'created' # Look for an existing work if 'authors' in edition: wkey = find_matching_work(edition) if wkey: w = web.ctx.site.get(wkey) work_state = 'matched' found_wkey_match = True need_update = False for k in subject_fields: if k not in rec: continue for s in rec[k]: if s not in w.get(k, []): w.setdefault(k, []).append(s) need_update = True if cover_id: w.setdefault('covers', []).append(cover_id) need_update = True if need_update: work_state = 'modified' edits.append(w.dict()) else: # Create new work w = new_work(edition, rec, cover_id) wkey = w['key'] edits.append(w) assert wkey edition['works'] = [{'key': wkey}] edition['key'] = ekey edits.append(edition) web.ctx.site.save_many(edits, 'import new book') # Writes back `openlibrary_edition` and `openlibrary_work` to # archive.org item after successful import: update_ia_metadata_for_ol_edition(ekey.split('/')[-1]) reply['success'] = True reply['edition'] = {'key': ekey, 'status': 'created'} reply['work'] = {'key': wkey, 'status': work_state} return reply
def load_data(rec): cover_url = None if 'cover' in rec: cover_url = rec['cover'] del rec['cover'] try: q = build_query(rec) except InvalidLanguage as e: return { 'success': False, 'error': str(e), } edits = [] reply = {} author_in = [import_author(a, eastern=east_in_by_statement(rec, a)) for a in q.get('authors', [])] (authors, author_reply) = build_author_reply(author_in, edits) #q['source_records'] = [loc] if authors: q['authors'] = authors reply['authors'] = author_reply wkey = None ekey = web.ctx.site.new_key('/type/edition') cover_id = None if cover_url: cover_id = add_cover(cover_url, ekey) q['covers'] = [cover_id] work_state = 'created' if 'authors' in q: wkey = find_matching_work(q) if wkey: w = web.ctx.site.get(wkey) work_state = 'matched' found_wkey_match = True need_update = False for k in subject_fields: if k not in rec: continue for s in rec[k]: if s not in w.get(k, []): w.setdefault(k, []).append(s) need_update = True if cover_id: w.setdefault('covers', []).append(cover_id) need_update = True if need_update: work_state = 'modified' w_dict = w.dict() assert w_dict and isinstance(w_dict, dict) edits.append(w_dict) else: w = new_work(q, rec, cover_id) wkey = w['key'] edits.append(w) assert wkey q['works'] = [{'key': wkey}] q['key'] = ekey assert isinstance(q, dict) edits.append(q) assert edits web.ctx.site.save_many(edits, 'import new book') reply['success'] = True reply['edition'] = { 'key': ekey, 'status': 'created', } reply['work'] = { 'key': wkey, 'status': work_state, } return reply
def load_data(rec): """ Adds a new Edition to Open Library. Creates a new Work if required, otherwise associates the new Edition with an existing Work. :param dict rec: Edition record to add (no further checks at this point) :rtype: dict :return: { "success": False, "error": <error msg> } OR { "success": True, "work": {"key": <key>, "status": "created" | "modified" | "matched"}, "edition": {"key": <key>, "status": "created"} } """ cover_url = None if 'cover' in rec: cover_url = rec['cover'] del rec['cover'] try: # get an OL style edition dict edition = build_query(rec) except InvalidLanguage as e: return { 'success': False, 'error': str(e), } ekey = web.ctx.site.new_key('/type/edition') cover_id = None if cover_url: cover_id = add_cover(cover_url, ekey) edition['covers'] = [cover_id] edits = [] reply = {} author_in = [import_author(a, eastern=east_in_by_statement(rec, a)) for a in edition.get('authors', [])] # build_author_reply() adds authors to edits (authors, author_reply) = build_author_reply(author_in, edits) if authors: edition['authors'] = authors reply['authors'] = author_reply wkey = None work_state = 'created' # Look for an existing work if 'authors' in edition: wkey = find_matching_work(edition) if wkey: w = web.ctx.site.get(wkey) work_state = 'matched' found_wkey_match = True need_update = False for k in subject_fields: if k not in rec: continue for s in rec[k]: if s not in w.get(k, []): w.setdefault(k, []).append(s) need_update = True if cover_id: w.setdefault('covers', []).append(cover_id) need_update = True if need_update: work_state = 'modified' edits.append(w.dict()) else: # Create new work w = new_work(edition, rec, cover_id) wkey = w['key'] edits.append(w) assert wkey edition['works'] = [{'key': wkey}] edition['key'] = ekey edits.append(edition) web.ctx.site.save_many(edits, 'import new book') # Writes back `openlibrary_edition` and `openlibrary_work` to # archive.org item after successful import: update_ia_metadata_for_ol_edition(ekey.split('/')[-1]) reply['success'] = True reply['edition'] = {'key': ekey, 'status': 'created'} reply['work'] = {'key': wkey, 'status': work_state} return reply
def load_data(rec): q = build_query(rec) edits = [] reply = {} author_in = q.get('authors', []) (authors, author_reply) = build_author_reply(author_in, edits) #q['source_records'] = [loc] if authors: q['authors'] = authors reply['authors'] = author_reply wkey = None #subjects = subjects_for_work(rec) subjects = {} # subjects.setdefault('subjects', []).append('Accessible book') # # if 'printdisabled' in collections: # subjects['subjects'].append('Protected DAISY') # elif 'lendinglibrary' in collections: # subjects['subjects'] += ['Protected DAISY', 'Lending library'] # elif 'inlibrary' in collections: # subjects['subjects'] += ['Protected DAISY', 'In library'] work_state = 'created' if 'authors' in q: wkey = find_matching_work(q) if wkey: w = web.ctx.site.get(wkey) work_state = 'matched' found_wkey_match = True need_update = False for k in subject_fields: if k not in rec: continue for s in rec[k]: if s not in w.get(k, []): w.setdefault(k, []).append(s) need_update = True if need_update: work_state = 'modified' edits.append(w) else: w = { 'type': { 'key': '/type/work' }, 'title': get_title(q), } for s in subject_fields: if s in rec: w[s] = rec[s] if 'authors' in q: w['authors'] = [{ 'type': { 'key': '/type/author_role' }, 'author': akey } for akey in q['authors']] w.update(subjects) wkey = web.ctx.site.new_key('/type/work') w['key'] = wkey edits.append(w) q['works'] = [{'key': wkey}] ekey = web.ctx.site.new_key('/type/edition') q['key'] = ekey edits.append(q) #pool.update(ekey, q) #print 'add_cover_image' #if 'cover' in rec: # add_cover_image(ekey, rec['cover']) assert edits web.ctx.site.save_many(edits, 'import new book') reply['success'] = True reply['edition'] = { 'key': ekey, 'status': 'created', } reply['work'] = { 'key': wkey, 'status': work_state, } return reply
def load_data(rec): q = build_query(rec) reply = {} author_in = q.get('authors', []) (authors, author_reply) = build_author_reply(author_in) #q['source_records'] = [loc] if authors: q['authors'] = authors reply['authors'] = author_reply wkey = None #subjects = subjects_for_work(rec) subjects = {} # subjects.setdefault('subjects', []).append('Accessible book') # # if 'printdisabled' in collections: # subjects['subjects'].append('Protected DAISY') # elif 'lendinglibrary' in collections: # subjects['subjects'] += ['Protected DAISY', 'Lending library'] # elif 'inlibrary' in collections: # subjects['subjects'] += ['Protected DAISY', 'In library'] work_state = 'created' if 'authors' in q: wkey = find_matching_work(q) if wkey: w = web.ctx.site.get(wkey) work_state = 'matched' found_wkey_match = True need_update = False for k in subject_fields: if k not in rec: continue for s in rec[k]: if s not in w.get(k, []): w.setdefault(k, []).append(s) need_update = True if need_update: work_state = 'modified' web.ctx.site.save(w, wkey, 'add subjects from new record') else: w = { 'type': {'key': '/type/work'}, 'title': get_title(q), } for s in subject_fields: if s in rec: w[s] = rec[s] if 'authors' in q: w['authors'] = [{'type':{'key': '/type/author_role'}, 'author': akey} for akey in q['authors']] w.update(subjects) wkey = web.ctx.site.new_key('/type/work') w['key'] = wkey web.ctx.site.save(w, comment='initial import') q['works'] = [{'key': wkey}] ekey = web.ctx.site.new_key('/type/edition') q['key'] = ekey web.ctx.site.save(q, comment='initial import') #pool.update(ekey, q) #print 'add_cover_image' #if 'cover' in rec: # add_cover_image(ekey, rec['cover']) reply['success'] = True reply['edition'] = { 'key': ekey, 'status': 'created', } reply['work'] = { 'key': wkey, 'status': work_state, } return reply