def test_holding_item_links(client, holding_lib_martigny, item_lib_martigny, item_lib_martigny_data, document, item_type_on_site_martigny, loc_public_martigny, item_lib_saxon_data, loc_public_saxon, item_type_standard_martigny): """Test holding and item links.""" item = deepcopy(item_lib_martigny_data) del item['pid'] item['barcode'] = 'barcode' item = Item.create(item, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item.holding_pid == holding_lib_martigny.pid assert item.holding_circulation_category_pid == \ item_type_standard_martigny.pid item2 = deepcopy(item_lib_saxon_data) del item2['pid'] item2 = Item.create(item2, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item2.holding_pid != holding_lib_martigny.pid holding = Holding.get_record_by_pid(item2.holding_pid) assert holding.document_pid == document.pid assert holding.circulation_category_pid == item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid(item2.holding_pid) == \ document.pid holdings = list(Holding.get_holdings_pid_by_document_pid(document.pid)) assert holding_lib_martigny.pid in holdings assert item2.holding_pid in holdings assert holding_lib_martigny.get_links_to_me().get('items') assert not holding_lib_martigny.can_delete
def test_holding_item_links(client, holding_lib_martigny, item_lib_martigny, item_lib_martigny_data, document, item_type_on_site_martigny, loc_public_martigny, item_lib_saxon_data, loc_public_saxon, item_type_standard_martigny): """Test holding and item links.""" item = deepcopy(item_lib_martigny_data) del item['pid'] item['barcode'] = 'barcode' item = Item.create(item, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item.holding_pid == holding_lib_martigny.pid assert item.holding_circulation_category_pid == \ item_type_standard_martigny.pid item2 = deepcopy(item_lib_saxon_data) del item2['pid'] item2 = Item.create(item2, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item2.holding_pid != holding_lib_martigny.pid holding = Holding.get_record_by_pid(item2.holding_pid) assert holding.document_pid == document.pid assert holding.circulation_category_pid == item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid(item2.holding_pid) == \ document.pid holdings = list(Holding.get_holdings_pid_by_document_pid(document.pid)) assert holding_lib_martigny.pid in holdings assert item2.holding_pid in holdings assert holding_lib_martigny.get_links_to_me().get('items') assert not holding_lib_martigny.can_delete # test loan conditions assert holding_loan_condition_filter(holding_lib_martigny.pid) == \ 'standard' with pytest.raises(Exception): assert holding_loan_condition_filter('no pid') assert holding_location(holding_lib_martigny.replace_refs()) == \ 'Library of Martigny-ville: Martigny Library Public Space' assert holding_circulation_category(holding_lib_martigny) == 'standard' holdings = get_holdings_by_document_item_type( document.pid, item_type_standard_martigny.pid) assert holding_lib_martigny.pid == holdings[1].get('pid') assert list(holding_lib_martigny.get_items)[1].get('pid') == \ item_lib_martigny.pid holding_lib_martigny.delete_from_index() assert not holding_lib_martigny.delete_from_index() holding_lib_martigny.dbcommit(forceindex=True) # test item count by holdings pid assert holding_lib_martigny.get_items_count_by_holding_pid == 2
def test_holding_can_delete_and_utils(client, holding_lib_martigny, document, item_type_standard_martigny): """Test can delete a holding.""" can, reasons = holding_lib_martigny.can_delete assert can assert reasons == {} assert holding_lib_martigny.document_pid == document.pid assert holding_lib_martigny.circulation_category_pid == \ item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid( holding_lib_martigny.pid) == document.pid assert list(Holding.get_holdings_pid_by_document_pid(document.pid))[0] == \ holding_lib_martigny.pid
def test_holding_can_delete_and_utils(client, holding_lib_martigny, document, item_type_standard_martigny): """Test can delete a holding.""" links = holding_lib_martigny.get_links_to_me() assert 'items' not in links assert holding_lib_martigny.can_delete reasons = holding_lib_martigny.reasons_not_to_delete() assert 'links' not in reasons assert holding_lib_martigny.document_pid == document.pid assert holding_lib_martigny.circulation_category_pid == \ item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid( holding_lib_martigny.pid) == document.pid assert list(Holding.get_holdings_pid_by_document_pid(document.pid))[0] == \ holding_lib_martigny.pid
def test_publish_harvested_records(app, ebooks_1_xml, ebooks_2_xml, org_martigny, loc_online_martigny, item_type_online_martigny, org_sion, loc_online_sion, item_type_online_sion, capsys): """Test publish harvested records.""" Identifier = namedtuple('Identifier', 'identifier') Record = namedtuple('Record', 'xml deleted header') records = [] records.append( Record(xml=ebooks_1_xml, deleted=False, header=Identifier(identifier='record1'))) records.append( Record(xml=ebooks_2_xml, deleted=False, header=Identifier(identifier='record2'))) records.append( Record(xml=ebooks_2_xml, deleted=True, header=Identifier(identifier='record3'))) kwargs = {'max': 100} publish_harvested_records(sender=None, records=records, kwargs=kwargs) flush_index(DocumentsSearch.Meta.index) flush_index(HoldingsSearch.Meta.index) assert Document.count() == 2 doc1 = Document.get_record_by_pid('1') assert doc1.get('$schema') is not None assert doc1.get('identifiedBy') == [{ 'type': 'bf:Isbn', 'value': '9782075118842' }, { 'type': 'bf:Local', 'value': 'cantook-EDEN502344' }, { 'type': 'bf:Local', 'source': 'cantook', 'value': 'record1' }] assert len(list(Holding.get_holdings_pid_by_document_pid(doc1.pid))) == 1 doc2 = Document.get_record_by_pid('2') assert doc2.get('$schema') is not None assert doc2.get('identifiedBy') == [{ 'type': 'bf:Isbn', 'value': '9782811234157' }, { 'type': 'bf:Local', 'value': 'cantook-immateriel.frO1006810' }, { 'type': 'bf:Local', 'source': 'cantook', 'value': 'record2' }] assert len(list(Holding.get_holdings_pid_by_document_pid(doc2.pid))) == 1 # test update publish_harvested_records(sender=None, records=records) flush_index(DocumentsSearch.Meta.index) flush_index(HoldingsSearch.Meta.index) assert len(list(Holding.get_holdings_pid_by_document_pid(doc1.pid))) == 1 assert len(list(Holding.get_holdings_pid_by_document_pid(doc2.pid))) == 1 # test delete records = [] del doc1['electronicLocator'] records.append(doc1) doc2['electronicLocator'] = [{ "content": "coverImage", "type": "relatedResource", "url": "http://images.immateriel.fr/covers/DEQ2C5A.png" }] records.append(doc2) create_records(records=records) flush_index(DocumentsSearch.Meta.index) flush_index(HoldingsSearch.Meta.index) assert len(list(Holding.get_holdings_pid_by_document_pid(doc1.pid))) == 0 assert len(list(Holding.get_holdings_pid_by_document_pid(doc2.pid))) == 0 assert 2 == delete_records(records=records)
def get_holdings_items(document_pid, organisation_pids=None, library_pids=None, location_pids=None): """Create Holding and Item informations. :param document_pid: document pid to use for holdings search :param organisation_pids: Which organisations items to add. :param library_pids: Which from libraries items to add. :param location_pids: Which from locations items to add. :returns: list of holding informations with associated organisation, library and location pid, name informations. """ def get_name(resource, pid): """Get name from resource. The name will be cached. :param resource: Resource class to use. :param pid: Pid for the resource to get the name from. :returns: name from the resource """ data = resource.get_record_by_pid(pid) if data: return data.get('name') results = [] if document_pid: holding_pids = Holding.get_holdings_pid_by_document_pid( document_pid=document_pid, with_masked=False) holding_pids = list(holding_pids) organisations = {} libraries = {} locations = {} query = HoldingsSearch().filter('terms', pid=holding_pids) if organisation_pids: query = query.filter( {'terms': { 'organisation.pid': organisation_pids }}) if library_pids: query = query.filter({'terms': {'library.pid': library_pids}}) if location_pids: query = query.filter({'terms': {'location.pid': location_pids}}) for hit in query.scan(): holding = hit.to_dict() organisation_pid = hit.organisation.pid if organisation_pid not in organisations: organisations[organisation_pid] = get_name( Organisation, organisation_pid) library_pid = hit.library.pid if library_pid not in libraries: libraries[library_pid] = get_name(Library, library_pid) location_pid = hit.location.pid if location_pid not in locations: locations[location_pid] = get_name(Location, location_pid) result = { 'organisation': { 'pid': organisation_pid, 'name': organisations[organisation_pid] }, 'library': { 'pid': library_pid, 'name': libraries[library_pid] }, 'location': { 'pid': location_pid, 'name': locations[location_pid] }, 'holdings': { 'call_number': holding.get('call_number'), 'second_call_number': holding.get('second_call_number'), 'enumerationAndChronology': holding.get('enumerationAndChronology'), 'electronic_location': holding.get('electronic_location', []), 'notes': holding.get('notes', []), 'supplementaryContent': holding.get('supplementaryContent'), 'index': holding.get('index'), 'missing_issues': holding.get('missing_issues'), } } if hit.holdings_type == 'standard': item_pids = Item.get_items_pid_by_holding_pid( hit.pid, with_masked=False) item_hits = ItemsSearch() \ .filter('terms', pid=list(item_pids)) \ .scan() for item_hit in item_hits: item_data = item_hit.to_dict() item_result = result item_result['item'] = { 'barcode': item_data.get('barcode'), 'all_number': item_data.get('all_number'), 'second_call_number': item_data.get('second_call_number'), 'enumerationAndChronology': item_data.get('enumerationAndChronology'), 'url': item_data.get('url'), 'notes': item_data.get('notes', []), } results.append(item_result) else: results.append(result) return results