def upgrade_downgrade(action): """Upgrade or downgrade index holdings. Correct items_count and public_items_count for holdings of type serial. :param str action: upgrade or downgrade. """ index = HoldingsSearch.Meta.index query = HoldingsSearch()\ .filter('term', holdings_type='serial') \ .source(['pid']) ids = [(h.meta.id, h.pid) for h in query.scan()] count = 0 LOGGER.info(f'Indexing {len(ids)} records ....') for (_id, pid) in ids: document = Document.get(_id, index=index, using=current_search_client) items_count, public_items_count = get_counts(pid, action) document.update(items_count=items_count, public_items_count=public_items_count, index=index, using=current_search_client, refresh=True) count += 1 LOGGER.info(f'{count} records indexed.')
def upgrade_downgrade(action): """Upgrade or downgrade index holdings. Correct items_count and public_items_count for holdings of type serial. :param str action: upgrade or downgrade. """ query = HoldingsSearch()\ .filter('term', holdings_type='serial') \ .source(['pid']) ids = [(h.meta.id, h.pid) for h in query.scan()] LOGGER.info(f'Indexing {len(ids)} records ....') errors = 0 for idx, (id, pid) in enumerate(ids): LOGGER.info(f'{idx} * Reindex holding: {pid}.') try: hold = Holding.get_record_by_id(id) hold.reindex() except Exception as err: LOGGER.error(f'{idx} * Reindex holding: {pid} {err}') errors += 1 return errors
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