Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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