def _start_end_date(start_date, end_date): """Format date.""" return '{start} - {end}'.format(start=format_date_filter( start_date, date_format='short', time_format=None, locale='fr'), end=format_date_filter(end_date, date_format='short', time_format=None, locale='fr'))
def test_date_filter_format_timestamp_en(): """Test timestamp english date filter.""" datestring = format_date_filter('2018-06-06T09:29:55.947149+00:00', 'timestamp') assert '06.06.2018 09:29' in datestring datestring = format_date_filter('1950-01-01', 'day_month', 'fr') assert '01.01' in datestring
def preprocess_search_hit(self, pid, record_hit, links_factory=None, **kwargs): """Prepare a record hit from Elasticsearch for serialization. :param pid: Persistent identifier instance. :param record_hit: Record metadata retrieved via search. :param links_factory: Factory function for record links. """ record = record_hit['_source'] item_pid = pid.pid_value # process location locations_map = kwargs.get('locations_map') record['location_name'] = locations_map[record.get('location').get( 'pid')] # retrieve and process document document = search_document_by_pid(record['document']['pid']) record['document_title'] = title_format_text_head(document.title, with_subtitle=True) creator = [] for contribution in document.contribution: if any(role in contribution.role for role in role_filter): try: creator.append(contribution['agent']['preferred_name']) except KeyError: creator.append( contribution['agent']['authorized_access_point_en']) if creator: record['document_creator'] = ' ; '.join(creator) record['document_type'] = document.type # get loans information loans_count, loans = search_active_loans_for_item(item_pid) record['loans_count'] = loans_count if loans_count: # get first loan loan = next(loans) record['last_transaction_date'] = format_date_filter( loan.transaction_date, date_format='short', locale=current_i18n.locale.language, ) record['created'] = format_date_filter( record['_created'], date_format='short', locale=current_i18n.locale.language, ) # prevent csv key error # TODO: find other way to prevent csv key error del (record['type']) return record
def get_notification_context(cls, notifications=None): """Get the context to render the notification template.""" context = {} notifications = notifications or [] if not notifications: return context context['loans'] = [] doc_dumper = DocumentGenericDumper() item_dumper = ItemNotificationDumper() patron_dumper = PatronNotificationDumper() for notification in notifications: loan = notification.loan creation_date = format_date_filter( notification.get('creation_date'), date_format='medium', locale=language_iso639_2to1( notification.get_language_to_use())) request_expire_date = format_date_filter( loan.get('request_expire_date'), date_format='medium', locale=language_iso639_2to1( notification.get_language_to_use())) # merge doc and item metadata preserving document key item_data = notification.item.dumps(dumper=item_dumper) doc_data = notification.document.dumps(dumper=doc_dumper) doc_data = {**item_data, **doc_data} # pickup location name --> !! pickup is on notif.request_loan, not # on notif.loan request_loan = notification.request_loan pickup_location = Location.get_record_by_pid( request_loan.get('pickup_location_pid')) if not pickup_location: pickup_location = Location.get_record_by_pid( request_loan.get('transaction_location_pid')) # request_patron request_patron = Patron.get_record_by_pid( request_loan.get('patron_pid')) loan_context = { 'creation_date': creation_date, 'document': doc_data, 'pickup_name': pickup_location.get('pickup_name', pickup_location.get('name')), 'request_expire_date': request_expire_date, 'patron': request_patron.dumps(dumper=patron_dumper) } context['loans'].append(loan_context) return context
def test_date_filter_format_timestamp_en(app): """Test full english date and tile filter.""" datestring = format_date_filter('2018-06-06T09:29:55.947149+00:00') assert 'Wednesday, June 6, 2018, 11:29:55 AM' in datestring datestring = format_date_filter( '2018-06-06T09:29:55.947149+00:00', locale='fr') assert 'mercredi 6 juin 2018, 11:29:55' in datestring datestring = format_date_filter( '1950-01-01', date_format='short', time_format=None, locale='fr_CH') assert '01.01' in datestring
def get_notification_context(cls, notifications=None): """Get the context to render the notification template.""" context = {'loans': []} notifications = notifications or [] doc_dumper = DocumentGenericDumper() item_dumper = ItemNotificationDumper() patron_dumper = PatronNotificationDumper() for notification in notifications: loan = notification.loan creation_date = format_date_filter( notification.get('creation_date'), date_format='medium', locale=language_iso639_2to1(notification.get_language_to_use()) ) # merge doc and item metadata preserving document key item_data = notification.item.dumps(dumper=item_dumper) doc_data = notification.document.dumps(dumper=doc_dumper) doc_data = {**item_data, **doc_data} # pickup location name pickup_location = notification.pickup_location if not pickup_location: pickup_location = notification.transaction_location loan_context = { 'creation_date': creation_date, 'in_transit': loan.state in LoanState.ITEM_IN_TRANSIT, 'document': doc_data, 'pickup_name': pickup_location.get( 'pickup_name', pickup_location.get('name')), 'patron': notification.patron.dumps(dumper=patron_dumper) } context['loans'].append(loan_context) return context
def test_date_filter_format_full_fr(app): """Test full french date filter.""" datestring = format_date_filter('1950-01-01', date_format='full', time_format=None, locale='fr') assert 'dimanche 1 janvier 1950' in datestring
def get_notification_context(cls, notifications=None): """Get the context to render the notification template.""" context = {'loans': []} notifications = notifications or [] doc_dumper = DocumentGenericDumper() item_dumper = ItemNotificationDumper() lib_dumper = LibraryCirculationNotificationDumper() for notification in notifications: trans_lib = notification.transaction_library creation_date = format_date_filter( notification.get('creation_date'), date_format='medium', locale=language_iso639_2to1( notification.get_language_to_use())) # merge doc and item metadata preserving document key item_data = notification.item.dumps(dumper=item_dumper) doc_data = notification.document.dumps(dumper=doc_dumper) doc_data = {**item_data, **doc_data} loan_context = { 'creation_date': creation_date, 'document': doc_data, 'transaction_library': trans_lib.dumps(dumper=lib_dumper) } context['loans'].append(loan_context) return context
def test_date_filter_format_short_fr(app): """Test short french date filter with pernicious date.""" datestring = format_date_filter('2006-08-14', date_format='short', time_format=None, locale='fr_CH') assert datestring == '14.08.06'
def test_date_filter_format_full_fr(): """Test full french date filter.""" datestring = format_date_filter('1950-01-01', 'full', 'fr') assert 'dimanche, 1. janvier 1950' in datestring
def test_date_filter_format_full_en(app): """Test full english date filter.""" datestring = format_date_filter('1950-01-01', date_format='full', time_format=None) assert 'Sunday, January 1, 1950' in datestring
def test_date_filter_format_medium_date_en(app): """Test medium_date english date filter.""" datestring = format_date_filter('1950-01-01', date_format='medium', time_format=None) assert 'Jan 1, 1950' in datestring
def test_date_filter_timezone(app): """Test medium english date filter.""" datestring = format_date_filter('2018-06-06T09:29:55.947149+00:00', timezone='Europe/Helsinki') assert 'Wednesday, June 6, 2018, 12:29:55 PM' in datestring
def test_date_filter_format_default_en(app): """Test medium english date filter.""" datestring = format_date_filter('1950-01-01', date_format='short', time_format=None) assert '1/1/50' in datestring
def test_time_filter_format_delimiter(app): """Test default time.""" datestring = format_date_filter('2018-06-06T09:29:55.947149+00:00', delimiter=' - ') assert datestring == 'Wednesday, June 6, 2018 - 11:29:55 AM'
def test_date_filter_format_short_fr(): """Test short french date filter with pernicious date.""" datestring = format_date_filter('2006-08-14', 'short_date', 'fr') assert datestring == '14.08.2006'
def test_date_filter_format_timestamp_en(): """Test timestamp english date filter.""" datestring = format_date_filter('2018-06-06T09:29:55.947149+00:00', 'timestamp') assert '06.06.2018 09:29' in datestring
def test_item_holding_document_availability( client, document, holding_lib_martigny, item_lib_martigny, item2_lib_martigny, librarian_martigny_no_email, librarian_saxon_no_email, patron_martigny_no_email, patron2_martigny_no_email, loc_public_saxon, circulation_policies): """Test item, holding and document availability.""" assert item_availablity_status(client, item_lib_martigny.pid, librarian_martigny_no_email.user) assert item_lib_martigny.available assert item_availability_text(item_lib_martigny) == 'on_shelf' assert holding_lib_martigny.available assert holding_availablity_status(client, holding_lib_martigny.pid, librarian_martigny_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() == 'standard' assert document.is_available(view_code='global') assert document_availablity_status(client, document.pid, librarian_martigny_no_email.user) # login as patron with mock.patch('rero_ils.modules.patrons.api.current_patron', patron_martigny_no_email): login_user_via_session(client, patron_martigny_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() \ == 'short 15 days' # request login_user_via_session(client, librarian_martigny_no_email.user) res, data = postdata( client, 'api_item.librarian_request', dict(item_pid=item_lib_martigny.pid, pickup_location_pid=loc_public_saxon.pid, patron_pid=patron_martigny_no_email.pid)) assert res.status_code == 200 actions = data.get('action_applied') loan_pid = actions[LoanAction.REQUEST].get('pid') assert not item_lib_martigny.available assert not item_availablity_status(client, item_lib_martigny.pid, librarian_martigny_no_email.user) assert item_availability_text(item_lib_martigny) == '1 request' holding = Holding.get_record_by_pid(holding_lib_martigny.pid) assert holding.available assert holding_availablity_status(client, holding_lib_martigny.pid, librarian_martigny_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() == 'standard' assert document.is_available('global') assert document_availablity_status(client, document.pid, librarian_martigny_no_email.user) # validate request res, _ = postdata(client, 'api_item.validate_request', dict(item_pid=item_lib_martigny.pid, pid=loan_pid)) assert res.status_code == 200 assert not item_lib_martigny.available assert not item_availablity_status(client, item_lib_martigny.pid, librarian_martigny_no_email.user) assert not item_lib_martigny.available item = Item.get_record_by_pid(item_lib_martigny.pid) assert item_availability_text(item) == 'in transit (1 request)' holding = Holding.get_record_by_pid(holding_lib_martigny.pid) assert holding.available assert holding_availablity_status(client, holding_lib_martigny.pid, librarian_martigny_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() == 'standard' assert document.is_available('global') assert document_availablity_status(client, document.pid, librarian_martigny_no_email.user) login_user_via_session(client, librarian_saxon_no_email.user) # receive res, _ = postdata(client, 'api_item.receive', dict(item_pid=item_lib_martigny.pid, pid=loan_pid)) assert res.status_code == 200 assert not item_lib_martigny.available assert not item_availablity_status(client, item_lib_martigny.pid, librarian_saxon_no_email.user) item = Item.get_record_by_pid(item_lib_martigny.pid) assert not item.available assert item_availability_text(item) == '1 request' holding = Holding.get_record_by_pid(holding_lib_martigny.pid) assert holding.available assert holding_availablity_status(client, holding_lib_martigny.pid, librarian_saxon_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() == 'standard' assert document.is_available('global') assert document_availablity_status(client, document.pid, librarian_martigny_no_email.user) # checkout res, _ = postdata( client, 'api_item.checkout', dict(item_pid=item_lib_martigny.pid, patron_pid=patron_martigny_no_email.pid)) assert res.status_code == 200 item = Item.get_record_by_pid(item_lib_martigny.pid) assert not item.available assert not item_availablity_status(client, item.pid, librarian_martigny_no_email.user) holding = Holding.get_record_by_pid(holding_lib_martigny.pid) assert holding.available assert holding_availablity_status(client, holding_lib_martigny.pid, librarian_saxon_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() == 'standard' assert document.is_available('global') assert document_availablity_status(client, document.pid, librarian_martigny_no_email.user) class current_i18n: class locale: language = 'en' with mock.patch('rero_ils.modules.items.api.current_i18n', current_i18n): end_date = pytz.utc.localize(parser.parse(item.get_item_end_date())) end_date = format_date_filter(end_date, format='short_date') assert item_availability_text(item) == 'due until ' + end_date """ request second item with another patron and test document and holding availability """ # login as patron with mock.patch('rero_ils.modules.patrons.api.current_patron', patron_martigny_no_email): login_user_via_session(client, patron2_martigny_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() \ == 'short 15 days' # request second item login_user_via_session(client, librarian_martigny_no_email.user) res, data = postdata( client, 'api_item.librarian_request', dict(item_pid=item2_lib_martigny.pid, pickup_location_pid=loc_public_saxon.pid, patron_pid=patron2_martigny_no_email.pid)) assert res.status_code == 200 actions = data.get('action_applied') loan_pid = actions[LoanAction.REQUEST].get('pid') assert not item2_lib_martigny.available assert not item_availablity_status(client, item2_lib_martigny.pid, librarian_martigny_no_email.user) assert item_availability_text(item2_lib_martigny) == '1 request' holding = Holding.get_record_by_pid(holding_lib_martigny.pid) assert not holding.available assert not holding_availablity_status(client, holding_lib_martigny.pid, librarian_martigny_no_email.user) assert holding_lib_martigny.get_holding_loan_conditions() == 'standard' assert not document.is_available('global') assert not document_availablity_status(client, document.pid, librarian_martigny_no_email.user)
def test_date_filter_format_default_en(): """Test medium english date filter.""" datestring = format_date_filter('1950-01-01') assert 'Sun 01.01.1950' in datestring
def test_date_filter_format_full_en(): """Test full english date filter.""" datestring = format_date_filter('1950-01-01', 'full') assert 'Sunday, 1. January 1950' in datestring
def test_date_filter_format_medium_date_en(): """Test medium_date english date filter.""" datestring = format_date_filter('1950-01-01', 'medium_date') assert '01 January 1950' in datestring
def test_time_filter_format_fr(app): """Test default time.""" datestring = format_date_filter('2018-06-06T09:29:55.947149+00:00', date_format=None, locale='fr') assert datestring == '11:29:55'
def preprocess_search_hit(self, pid, record_hit, links_factory=None, **kwargs): """Prepare a record hit from Elasticsearch for serialization. :param pid: Persistent identifier instance. :param record_hit: Record metadata retrieved via search. :param links_factory: Factory function for record links. """ language = kwargs.get('language') record = record_hit['_source'] # inherit holdings call number when possible item = Item(record) issue_call_number = item.issue_inherited_first_call_number if issue_call_number: record['call_number'] = issue_call_number item_pid = pid.pid_value # process location locations_map = kwargs.get('locations_map') record['location_name'] = locations_map[record.get('location').get( 'pid')] # retrieve and process document document = search_document_by_pid(record['document']['pid']) record['document_title'] = title_format_text_head(document.title, with_subtitle=True) # process contributions creator = [] if 'contribution' in document: for contribution in document.contribution: if any(role in contribution.role for role in role_filter): authorized_access_point = \ f'authorized_access_point_{language}' if authorized_access_point in contribution['agent']: creator.append( contribution['agent'][authorized_access_point]) if creator: record['document_creator'] = ' ; '.join(creator) document_main_type = [] document_sub_type = [] for document_type in document.type: data = document_type.to_dict() document_main_type.append(data.get('main_type')) document_sub_type.append(data.get('subtype', '')) record['document_main_type'] = ', '.join(document_main_type) record['document_sub_type'] = ', '.join(document_sub_type) # get loans information loans_count, loans = search_active_loans_for_item(item_pid) record['loans_count'] = loans_count if loans_count: # get first loan loan = next(loans) record['last_transaction_date'] = format_date_filter( loan.transaction_date, date_format='short', locale=language, ) record['created'] = format_date_filter( record['_created'], date_format='short', locale=language, ) # prevent csv key error # TODO: find other way to prevent csv key error del (record['type']) return record