Beispiel #1
0
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'))
Beispiel #2
0
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
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
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
Beispiel #6
0
    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
Beispiel #7
0
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
Beispiel #8
0
    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
Beispiel #9
0
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'
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
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
Beispiel #14
0
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
Beispiel #15
0
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'
Beispiel #16
0
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'
Beispiel #17
0
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
Beispiel #18
0
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)
Beispiel #19
0
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
Beispiel #20
0
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
Beispiel #21
0
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
Beispiel #22
0
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'
Beispiel #23
0
    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