invenio-app-ils 1.0.0a54__py2.py3-none-any.whl → 6.1.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- invenio_app_ils/__init__.py +2 -2
- invenio_app_ils/acquisition/api.py +3 -1
- invenio_app_ils/acquisition/config.py +10 -21
- invenio_app_ils/acquisition/jsonresolvers/order_order_lines.py +1 -0
- invenio_app_ils/acquisition/mappings/os-v1/acq_orders/order-v1.0.0.json +364 -0
- invenio_app_ils/acquisition/mappings/os-v2/__init__.py +0 -0
- invenio_app_ils/acquisition/mappings/os-v2/acq_orders/order-v1.0.0.json +364 -0
- invenio_app_ils/acquisition/mappings/v7/acq_orders/order-v1.0.0.json +14 -0
- invenio_app_ils/acquisition/search.py +5 -15
- invenio_app_ils/assets/semantic-ui/less/theme.config +103 -0
- invenio_app_ils/assets/semantic-ui/templates/.gitkeep +0 -0
- invenio_app_ils/circulation/api.py +153 -67
- invenio_app_ils/circulation/config.py +29 -25
- invenio_app_ils/circulation/indexer.py +14 -19
- invenio_app_ils/circulation/loaders/__init__.py +2 -0
- invenio_app_ils/circulation/loaders/schemas/json/loan_checkout.py +2 -3
- invenio_app_ils/circulation/loaders/schemas/json/loan_request.py +82 -16
- invenio_app_ils/circulation/loaders/schemas/json/loan_self_checkout.py +19 -0
- invenio_app_ils/circulation/notifications/api.py +23 -19
- invenio_app_ils/circulation/notifications/messages.py +6 -6
- invenio_app_ils/circulation/notifications/tasks.py +1 -2
- invenio_app_ils/circulation/receivers.py +2 -5
- invenio_app_ils/circulation/search.py +23 -22
- invenio_app_ils/circulation/serializers/__init__.py +2 -2
- invenio_app_ils/circulation/serializers/csv.py +1 -3
- invenio_app_ils/circulation/serializers/custom_fields.py +5 -9
- invenio_app_ils/circulation/serializers/json.py +2 -6
- invenio_app_ils/circulation/serializers/response.py +12 -12
- invenio_app_ils/circulation/stats/views.py +5 -15
- invenio_app_ils/circulation/tasks.py +2 -6
- invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/self_checkout.html +19 -0
- invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/update_dates.html +19 -0
- invenio_app_ils/circulation/utils.py +23 -17
- invenio_app_ils/circulation/views.py +103 -39
- invenio_app_ils/cli.py +220 -260
- invenio_app_ils/closures/api.py +72 -7
- invenio_app_ils/closures/serializers/__init__.py +16 -0
- invenio_app_ils/closures/serializers/response.py +35 -0
- invenio_app_ils/closures/serializers/schema.py +28 -0
- invenio_app_ils/closures/tasks.py +4 -11
- invenio_app_ils/closures/views.py +66 -0
- invenio_app_ils/config.py +207 -150
- invenio_app_ils/document_requests/api.py +6 -21
- invenio_app_ils/document_requests/loaders/__init__.py +4 -12
- invenio_app_ils/document_requests/mappings/{v6 → os-v1}/__init__.py +2 -2
- invenio_app_ils/document_requests/mappings/os-v1/document_requests/document_request-v1.0.0.json +196 -0
- invenio_app_ils/document_requests/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/document_requests/mappings/os-v2/document_requests/document_request-v1.0.0.json +196 -0
- invenio_app_ils/document_requests/notifications/api.py +2 -7
- invenio_app_ils/document_requests/notifications/messages.py +3 -7
- invenio_app_ils/document_requests/search.py +2 -6
- invenio_app_ils/document_requests/views.py +4 -10
- invenio_app_ils/documents/api.py +19 -25
- invenio_app_ils/documents/indexer.py +13 -20
- invenio_app_ils/documents/jsonresolvers/document_circulation.py +11 -33
- invenio_app_ils/documents/jsonresolvers/document_eitem.py +1 -0
- invenio_app_ils/documents/jsonresolvers/document_item.py +8 -9
- invenio_app_ils/documents/jsonresolvers/document_stock.py +7 -7
- invenio_app_ils/documents/loaders/jsonschemas/document.py +3 -14
- invenio_app_ils/documents/mappings/{v6 → os-v1}/__init__.py +1 -1
- invenio_app_ils/documents/mappings/os-v1/documents/document-v1.0.0.json +932 -0
- invenio_app_ils/documents/mappings/os-v1/documents/document-v2.0.0.json +1066 -0
- invenio_app_ils/documents/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/documents/mappings/os-v2/documents/document-v1.0.0.json +932 -0
- invenio_app_ils/documents/mappings/os-v2/documents/document-v2.0.0.json +1066 -0
- invenio_app_ils/documents/mappings/v7/documents/document-v1.0.0.json +102 -11
- invenio_app_ils/documents/mappings/v7/documents/document-v2.0.0.json +1066 -0
- invenio_app_ils/documents/schemas/documents/document-v2.0.0.json +732 -0
- invenio_app_ils/eitems/api.py +41 -7
- invenio_app_ils/eitems/loaders/jsonschemas/eitems.py +6 -6
- invenio_app_ils/eitems/mappings/{v6 → os-v1}/__init__.py +1 -1
- invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v1.0.0.json +139 -0
- invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v2.0.0.json +142 -0
- invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v3.0.0.json +179 -0
- invenio_app_ils/{series/mappings/v6 → eitems/mappings/os-v2}/__init__.py +1 -1
- invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v1.0.0.json +139 -0
- invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v2.0.0.json +142 -0
- invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v3.0.0.json +179 -0
- invenio_app_ils/eitems/mappings/v7/eitems/eitem-v1.0.0.json +12 -2
- invenio_app_ils/eitems/mappings/v7/eitems/eitem-v2.0.0.json +142 -0
- invenio_app_ils/eitems/mappings/v7/eitems/eitem-v3.0.0.json +179 -0
- invenio_app_ils/eitems/schemas/eitems/eitem-v2.0.0.json +120 -0
- invenio_app_ils/eitems/schemas/eitems/eitem-v3.0.0.json +120 -0
- invenio_app_ils/eitems/search.py +3 -9
- invenio_app_ils/errors.py +119 -6
- invenio_app_ils/ext.py +15 -18
- invenio_app_ils/facets.py +13 -15
- invenio_app_ils/files/receivers.py +1 -1
- invenio_app_ils/files/views.py +1 -2
- invenio_app_ils/ill/api.py +1 -2
- invenio_app_ils/ill/config.py +10 -16
- invenio_app_ils/ill/jsonresolvers/borrowing_request_document.py +2 -3
- invenio_app_ils/ill/jsonresolvers/borrowing_request_patron.py +1 -3
- invenio_app_ils/ill/jsonresolvers/borrowing_request_provider.py +1 -3
- invenio_app_ils/ill/loaders/__init__.py +3 -9
- invenio_app_ils/ill/loaders/jsonschemas/patron_loan_actions.py +1 -8
- invenio_app_ils/ill/loaders/jsonschemas/patron_loan_extension_actions.py +3 -8
- invenio_app_ils/ill/mappings/{v6 → os-v1}/__init__.py +1 -1
- invenio_app_ils/ill/mappings/os-v1/ill_borrowing_requests/borrowing_request-v1.0.0.json +254 -0
- invenio_app_ils/{acquisition/mappings/v6 → ill/mappings/os-v2}/__init__.py +1 -1
- invenio_app_ils/ill/mappings/os-v2/ill_borrowing_requests/borrowing_request-v1.0.0.json +254 -0
- invenio_app_ils/ill/mappings/v7/ill_borrowing_requests/borrowing_request-v1.0.0.json +14 -0
- invenio_app_ils/ill/notifications/api.py +1 -4
- invenio_app_ils/ill/search.py +3 -9
- invenio_app_ils/ill/serializers/__init__.py +1 -3
- invenio_app_ils/ill/views.py +2 -4
- invenio_app_ils/internal_locations/api.py +1 -4
- invenio_app_ils/internal_locations/mappings/{v6 → os-v1}/__init__.py +1 -1
- invenio_app_ils/internal_locations/mappings/os-v1/internal_locations/internal_location-v1.0.0.json +108 -0
- invenio_app_ils/internal_locations/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/internal_locations/mappings/os-v2/internal_locations/internal_location-v1.0.0.json +108 -0
- invenio_app_ils/internal_locations/search.py +1 -3
- invenio_app_ils/items/api.py +18 -15
- invenio_app_ils/items/indexer.py +1 -3
- invenio_app_ils/items/jsonresolvers/item_document.py +1 -1
- invenio_app_ils/items/jsonresolvers/item_internal_location.py +2 -6
- invenio_app_ils/items/loaders/jsonschemas/items.py +2 -0
- {tests/api/circulation → invenio_app_ils/items/mappings/os-v1}/__init__.py +1 -1
- invenio_app_ils/items/mappings/os-v1/items/item-v1.0.0.json +285 -0
- invenio_app_ils/items/mappings/os-v1/items/item-v2.0.0.json +326 -0
- {tests/api/ill → invenio_app_ils/items/mappings/os-v2}/__init__.py +1 -1
- invenio_app_ils/items/mappings/os-v2/items/item-v1.0.0.json +285 -0
- invenio_app_ils/items/mappings/os-v2/items/item-v2.0.0.json +326 -0
- invenio_app_ils/items/mappings/v7/items/item-v1.0.0.json +11 -0
- invenio_app_ils/items/mappings/v7/items/item-v2.0.0.json +326 -0
- invenio_app_ils/items/schemas/items/item-v1.0.0.json +22 -0
- invenio_app_ils/items/schemas/items/item-v2.0.0.json +172 -0
- invenio_app_ils/items/search.py +18 -11
- invenio_app_ils/items/serializers/item.py +7 -6
- invenio_app_ils/literature/api.py +1 -3
- invenio_app_ils/literature/search.py +3 -5
- invenio_app_ils/literature/serializers/csv.py +1 -3
- invenio_app_ils/literature/serializers/json.py +1 -3
- invenio_app_ils/locations/api.py +2 -4
- invenio_app_ils/locations/indexer.py +3 -9
- invenio_app_ils/locations/loaders/__init__.py +1 -3
- invenio_app_ils/locations/loaders/jsonschemas/location.py +4 -11
- invenio_app_ils/locations/mappings/{v6 → os-v1}/__init__.py +1 -1
- invenio_app_ils/locations/mappings/os-v1/locations/location-v1.0.0.json +90 -0
- invenio_app_ils/locations/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/locations/mappings/os-v2/locations/location-v1.0.0.json +90 -0
- invenio_app_ils/notifications/messages.py +4 -3
- invenio_app_ils/notifications/tasks.py +1 -3
- invenio_app_ils/notifications/views.py +2 -2
- invenio_app_ils/patrons/anonymization.py +53 -32
- invenio_app_ils/patrons/api.py +3 -5
- invenio_app_ils/patrons/cli.py +1 -2
- invenio_app_ils/patrons/indexer.py +4 -13
- invenio_app_ils/patrons/mappings/os-v1/__init__.py +8 -0
- invenio_app_ils/patrons/mappings/os-v1/patrons/patron-v1.0.0.json +42 -0
- invenio_app_ils/patrons/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/patrons/mappings/os-v2/patrons/patron-v1.0.0.json +42 -0
- invenio_app_ils/patrons/views.py +4 -14
- invenio_app_ils/permissions.py +93 -35
- invenio_app_ils/providers/api.py +2 -6
- invenio_app_ils/providers/config.py +11 -19
- invenio_app_ils/providers/indexer.py +2 -6
- invenio_app_ils/providers/mappings/{v6 → os-v1}/__init__.py +1 -1
- invenio_app_ils/providers/mappings/os-v1/providers/provider-v1.0.0.json +57 -0
- invenio_app_ils/providers/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/providers/mappings/os-v2/providers/provider-v1.0.0.json +57 -0
- invenio_app_ils/providers/mappings/v7/__init__.py +1 -1
- invenio_app_ils/providers/proxies.py +1 -3
- invenio_app_ils/records/api.py +3 -9
- invenio_app_ils/records/loaders/schemas/changed_by.py +1 -3
- invenio_app_ils/records/loaders/schemas/identifiers.py +23 -0
- invenio_app_ils/records/metadata_extensions.py +1 -4
- invenio_app_ils/records/permissions.py +8 -2
- invenio_app_ils/records/serializers/__init__.py +1 -4
- invenio_app_ils/records/views.py +4 -7
- invenio_app_ils/records_relations/api.py +11 -34
- invenio_app_ils/records_relations/indexer.py +1 -3
- invenio_app_ils/records_relations/retriever.py +14 -9
- invenio_app_ils/records_relations/views.py +16 -50
- invenio_app_ils/relations/api.py +17 -16
- invenio_app_ils/search_permissions.py +24 -24
- invenio_app_ils/series/api.py +10 -12
- invenio_app_ils/series/loaders/jsonschemas/series.py +3 -2
- invenio_app_ils/{items/mappings/v6 → series/mappings/os-v1}/__init__.py +1 -1
- invenio_app_ils/series/mappings/os-v1/series/series-v1.0.0.json +324 -0
- invenio_app_ils/series/mappings/os-v1/series/series-v2.0.0.json +396 -0
- {tests/api/acquisition → invenio_app_ils/series/mappings/os-v2}/__init__.py +1 -1
- invenio_app_ils/series/mappings/os-v2/series/series-v1.0.0.json +324 -0
- invenio_app_ils/series/mappings/os-v2/series/series-v2.0.0.json +396 -0
- invenio_app_ils/series/mappings/v7/series/series-v1.0.0.json +35 -3
- invenio_app_ils/series/mappings/v7/series/series-v2.0.0.json +396 -0
- invenio_app_ils/series/schemas/series/series-v2.0.0.json +354 -0
- invenio_app_ils/stats/aggregations/aggr_file_download/os-v1/aggr-file-download-v1.json +60 -0
- invenio_app_ils/stats/aggregations/aggr_file_download/os-v2/__init__.py +9 -0
- invenio_app_ils/stats/aggregations/aggr_file_download/os-v2/aggr-file-download-v1.json +60 -0
- invenio_app_ils/stats/event_builders.py +73 -0
- invenio_app_ils/stats/file_download/os-v1/file-download-v1.json +72 -0
- invenio_app_ils/stats/file_download/os-v2/__init__.py +9 -0
- invenio_app_ils/stats/file_download/os-v2/file-download-v1.json +72 -0
- invenio_app_ils/stats/processors.py +30 -0
- invenio_app_ils/stats/templates/aggregations/__init__.py +8 -0
- invenio_app_ils/stats/templates/aggregations/ils_record_changes/__init__.py +8 -0
- invenio_app_ils/stats/templates/aggregations/ils_record_changes/os-v2/__init__.py +8 -0
- invenio_app_ils/stats/templates/aggregations/ils_record_changes/os-v2/aggr-ils-record-changes-v1.json +41 -0
- {tests → invenio_app_ils/stats/templates/events}/__init__.py +2 -2
- invenio_app_ils/stats/templates/events/ils_record_changes/__init__.py +8 -0
- invenio_app_ils/stats/templates/events/ils_record_changes/os-v2/__init__.py +8 -0
- invenio_app_ils/stats/templates/events/ils_record_changes/os-v2/ils-record-changes-v1.json +41 -0
- invenio_app_ils/templates/logged_out.html +12 -0
- invenio_app_ils/views.py +18 -4
- invenio_app_ils/vocabularies/api.py +1 -1
- invenio_app_ils/vocabularies/cli.py +6 -18
- invenio_app_ils/vocabularies/data/acq_order_line_payment_modes.json +5 -0
- invenio_app_ils/vocabularies/data/identifier_schemes.json +5 -0
- invenio_app_ils/vocabularies/indexer.py +1 -4
- invenio_app_ils/vocabularies/jsonresolvers/licenses.py +2 -11
- invenio_app_ils/vocabularies/mappings/os-v1/__init__.py +8 -0
- invenio_app_ils/vocabularies/mappings/os-v1/vocabularies/vocabulary-v1.0.0.json +23 -0
- invenio_app_ils/vocabularies/mappings/os-v2/__init__.py +8 -0
- invenio_app_ils/vocabularies/mappings/os-v2/vocabularies/vocabulary-v1.0.0.json +23 -0
- invenio_app_ils/vocabularies/sources/base.py +1 -3
- invenio_app_ils/webpack.py +27 -0
- invenio_app_ils-6.1.0.dist-info/METADATA +627 -0
- {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/RECORD +227 -249
- {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/WHEEL +1 -1
- {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/entry_points.txt +9 -5
- {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/top_level.txt +0 -1
- invenio_app_ils/acquisition/mappings/v6/acq_orders/order-v1.0.0.json +0 -352
- invenio_app_ils/document_requests/mappings/v6/document_requests/document_request-v1.0.0.json +0 -199
- invenio_app_ils/documents/mappings/v6/documents/document-v1.0.0.json +0 -843
- invenio_app_ils/eitems/mappings/v6/eitems/eitem-v1.0.0.json +0 -131
- invenio_app_ils/ill/mappings/v6/ill_borrowing_requests/borrowing_request-v1.0.0.json +0 -242
- invenio_app_ils/internal_locations/mappings/v6/internal_locations/internal_location-v1.0.0.json +0 -110
- invenio_app_ils/items/mappings/v6/items/item-v1.0.0.json +0 -276
- invenio_app_ils/locations/mappings/v6/locations/location-v1.0.0.json +0 -92
- invenio_app_ils/notifications/admin.py +0 -57
- invenio_app_ils/patrons/mappings/v6/__init__.py +0 -8
- invenio_app_ils/patrons/mappings/v6/patrons/patron-v1.0.0.json +0 -44
- invenio_app_ils/providers/mappings/v6/providers/provider-v1.0.0.json +0 -59
- invenio_app_ils/series/mappings/v6/series/series-v1.0.0.json +0 -298
- invenio_app_ils/stats/aggregations/aggr_file_download/v6/aggr-file-download-v1.json +0 -59
- invenio_app_ils/stats/file_download/v6/file-download-v1.json +0 -74
- invenio_app_ils/version.py +0 -14
- invenio_app_ils/vocabularies/mappings/v6/__init__.py +0 -8
- invenio_app_ils/vocabularies/mappings/v6/vocabularies/vocabulary-v1.0.0.json +0 -25
- invenio_app_ils-1.0.0a54.dist-info/METADATA +0 -95
- tests/api/__init__.py +0 -8
- tests/api/acquisition/test_acq_orders_crud.py +0 -102
- tests/api/acquisition/test_acq_orders_permissions.py +0 -104
- tests/api/acquisition/test_acq_providers_permissions.py +0 -83
- tests/api/circulation/test_expired_loans.py +0 -88
- tests/api/circulation/test_loan_checkout.py +0 -216
- tests/api/circulation/test_loan_default_durations.py +0 -57
- tests/api/circulation/test_loan_document_resolver.py +0 -18
- tests/api/circulation/test_loan_extend.py +0 -132
- tests/api/circulation/test_loan_item_permissions.py +0 -139
- tests/api/circulation/test_loan_item_resolver.py +0 -26
- tests/api/circulation/test_loan_list_permissions.py +0 -104
- tests/api/circulation/test_loan_patron_resolver.py +0 -38
- tests/api/circulation/test_loan_request.py +0 -234
- tests/api/circulation/test_loan_update.py +0 -150
- tests/api/circulation/test_notifications.py +0 -229
- tests/api/conftest.py +0 -236
- tests/api/document_requests/__init__.py +0 -8
- tests/api/document_requests/test_document_requests.py +0 -131
- tests/api/document_requests/test_document_requests_permissions.py +0 -177
- tests/api/document_requests/test_notifications_filter.py +0 -36
- tests/api/ill/test_ill_brw_crud.py +0 -84
- tests/api/ill/test_ill_brw_reqs_patron_loan_create_action.py +0 -207
- tests/api/ill/test_ill_brw_reqs_patron_loan_extension_actions.py +0 -298
- tests/api/ill/test_ill_brw_reqs_permissions.py +0 -169
- tests/api/ill/test_ill_providers_permissions.py +0 -82
- tests/api/ils/__init__.py +0 -8
- tests/api/ils/documents/__init__.py +0 -8
- tests/api/ils/documents/test_document_crud.py +0 -57
- tests/api/ils/documents/test_document_permissions.py +0 -106
- tests/api/ils/documents/test_document_resolvers.py +0 -35
- tests/api/ils/eitems/__init__.py +0 -8
- tests/api/ils/eitems/test_eitems_crud.py +0 -41
- tests/api/ils/eitems/test_eitems_permissions.py +0 -84
- tests/api/ils/eitems/test_files.py +0 -172
- tests/api/ils/items/__init__.py +0 -8
- tests/api/ils/items/test_apis.py +0 -43
- tests/api/ils/items/test_items_crud.py +0 -60
- tests/api/ils/items/test_items_permissions.py +0 -107
- tests/api/ils/items/test_items_update.py +0 -47
- tests/api/ils/records_relations/__init__.py +0 -8
- tests/api/ils/records_relations/helpers.py +0 -115
- tests/api/ils/records_relations/test_records_relations_parentchild.py +0 -560
- tests/api/ils/records_relations/test_records_relations_sequence.py +0 -302
- tests/api/ils/records_relations/test_records_relations_siblings.py +0 -678
- tests/api/ils/series/__init__.py +0 -8
- tests/api/ils/series/test_series_permissions.py +0 -95
- tests/api/ils/test_anonymization.py +0 -189
- tests/api/ils/test_apis.py +0 -76
- tests/api/ils/test_closures.py +0 -324
- tests/api/ils/test_errors.py +0 -126
- tests/api/ils/test_facets.py +0 -84
- tests/api/ils/test_internal_locations.py +0 -96
- tests/api/ils/test_loaders.py +0 -55
- tests/api/ils/test_metadata_extensions.py +0 -205
- tests/api/ils/test_notifications.py +0 -183
- tests/api/ils/test_notifications_mails.py +0 -39
- tests/api/ils/test_notifications_permissions.py +0 -55
- tests/api/ils/test_patrons.py +0 -106
- tests/api/ils/test_record_delete.py +0 -46
- tests/api/ils/test_record_permissions.py +0 -135
- tests/api/ils/test_resolvers.py +0 -207
- tests/api/ils/test_stats.py +0 -160
- tests/api/ils/test_tasks.py +0 -211
- tests/api/ils/test_vocabularies.py +0 -35
- tests/conftest.py +0 -123
- tests/data/acq_orders.json +0 -89
- tests/data/acq_providers.json +0 -12
- tests/data/document_requests.json +0 -77
- tests/data/documents.json +0 -237
- tests/data/eitems.json +0 -66
- tests/data/ill_borrowing_requests.json +0 -77
- tests/data/ill_providers.json +0 -12
- tests/data/internal_locations.json +0 -22
- tests/data/items.json +0 -271
- tests/data/loans.json +0 -133
- tests/data/loans_most_loaned.json +0 -128
- tests/data/locations.json +0 -20
- tests/data/series.json +0 -33
- tests/helpers.py +0 -104
- tests/templates/notifications/title_body.html +0 -8
- tests/templates/notifications/title_body_html.html +0 -13
- tests/templates/notifications/title_body_html_ctx.html +0 -13
- tests/templates/notifications/title_only.html +0 -3
- tests/test_version.py +0 -17
- /tests/templates/notifications/blank.html → /invenio_app_ils/acquisition/mappings/os-v1/__init__.py +0 -0
- /invenio_app_ils/stats/aggregations/aggr_file_download/{v6 → os-v1}/__init__.py +0 -0
- /invenio_app_ils/stats/file_download/{v6 → os-v1}/__init__.py +0 -0
- {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info/licenses}/AUTHORS.rst +0 -0
- {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info/licenses}/LICENSE +0 -0
invenio_app_ils/closures/api.py
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2020 CERN.
|
|
3
|
+
# Copyright (C) 2020-2025 CERN.
|
|
4
4
|
#
|
|
5
5
|
# invenio-app-ils is free software; you can redistribute it and/or modify it
|
|
6
6
|
# under the terms of the MIT License; see LICENSE file for more details.
|
|
7
7
|
|
|
8
8
|
"""ILS location closures API."""
|
|
9
9
|
|
|
10
|
-
from datetime import timedelta
|
|
10
|
+
from datetime import date, timedelta
|
|
11
|
+
from calendar import day_name
|
|
11
12
|
|
|
12
13
|
import arrow
|
|
13
14
|
|
|
@@ -51,9 +52,7 @@ def _is_open_on(location, date):
|
|
|
51
52
|
|
|
52
53
|
def find_next_open_date(location_pid, date):
|
|
53
54
|
"""Finds the next day where this location is open."""
|
|
54
|
-
location = current_app_ils.location_record_cls.get_record_by_pid(
|
|
55
|
-
location_pid
|
|
56
|
-
)
|
|
55
|
+
location = current_app_ils.location_record_cls.get_record_by_pid(location_pid)
|
|
57
56
|
_infinite_loop_guard = date + timedelta(days=365)
|
|
58
57
|
while date < _infinite_loop_guard:
|
|
59
58
|
if _is_open_on(location, date):
|
|
@@ -64,6 +63,72 @@ def find_next_open_date(location_pid, date):
|
|
|
64
63
|
raise IlsException(
|
|
65
64
|
description="Cannot find any date for which the "
|
|
66
65
|
"location %s is open after the given date %s."
|
|
67
|
-
"Please check opening/closures dates."
|
|
68
|
-
% (location_pid, date.isoformat())
|
|
66
|
+
"Please check opening/closures dates." % (location_pid, date.isoformat())
|
|
69
67
|
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def get_closure_periods(location, start, end):
|
|
71
|
+
"""
|
|
72
|
+
Return date ranges within a specified period when the location is closed.
|
|
73
|
+
"""
|
|
74
|
+
if (
|
|
75
|
+
not location
|
|
76
|
+
or not isinstance(start, date)
|
|
77
|
+
or not isinstance(end, date)
|
|
78
|
+
or start > end
|
|
79
|
+
):
|
|
80
|
+
raise ValueError("Invalid input parameters")
|
|
81
|
+
|
|
82
|
+
one_day_delta = timedelta(days=1)
|
|
83
|
+
|
|
84
|
+
weekday_name_to_index = {name.lower(): i for i, name in enumerate(day_name)}
|
|
85
|
+
closed_weekdays = set()
|
|
86
|
+
for weekday_rule in location.get("opening_weekdays", []):
|
|
87
|
+
if weekday_rule.get("is_open") is False:
|
|
88
|
+
weekday_str = weekday_rule.get("weekday", "").lower()
|
|
89
|
+
closed_weekdays.add(weekday_name_to_index[weekday_str])
|
|
90
|
+
|
|
91
|
+
exception_overrides = {}
|
|
92
|
+
for exception in location.get("opening_exceptions", []):
|
|
93
|
+
is_closed_override = not exception.get("is_open")
|
|
94
|
+
|
|
95
|
+
ex_start = date.fromisoformat(exception["start_date"])
|
|
96
|
+
ex_end = date.fromisoformat(exception["end_date"])
|
|
97
|
+
|
|
98
|
+
current_ex_date = ex_start
|
|
99
|
+
while current_ex_date <= ex_end:
|
|
100
|
+
exception_overrides[current_ex_date] = is_closed_override
|
|
101
|
+
current_ex_date += one_day_delta
|
|
102
|
+
|
|
103
|
+
closure_periods = []
|
|
104
|
+
closure_streak_start = None
|
|
105
|
+
current_date = start
|
|
106
|
+
|
|
107
|
+
while current_date <= end:
|
|
108
|
+
is_date_closed = False
|
|
109
|
+
|
|
110
|
+
override_status = exception_overrides.get(current_date)
|
|
111
|
+
|
|
112
|
+
if override_status is not None:
|
|
113
|
+
is_date_closed = override_status
|
|
114
|
+
else:
|
|
115
|
+
if current_date.weekday() in closed_weekdays:
|
|
116
|
+
is_date_closed = True
|
|
117
|
+
|
|
118
|
+
if is_date_closed:
|
|
119
|
+
if closure_streak_start is None:
|
|
120
|
+
closure_streak_start = current_date
|
|
121
|
+
else:
|
|
122
|
+
if closure_streak_start is not None:
|
|
123
|
+
closure_periods.append(
|
|
124
|
+
{"start": closure_streak_start, "end": current_date - one_day_delta}
|
|
125
|
+
)
|
|
126
|
+
closure_streak_start = None
|
|
127
|
+
|
|
128
|
+
current_date += one_day_delta
|
|
129
|
+
|
|
130
|
+
# Handle trailing closed period
|
|
131
|
+
if closure_streak_start is not None:
|
|
132
|
+
closure_periods.append({"start": closure_streak_start, "end": end})
|
|
133
|
+
|
|
134
|
+
return closure_periods
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file is part of Invenio.
|
|
4
|
+
# Copyright (C) 2025-2025 CERN.
|
|
5
|
+
#
|
|
6
|
+
# Invenio is free software; you can redistribute it and/or modify it
|
|
7
|
+
# under the terms of the MIT License; see LICENSE file for more details.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from invenio_app_ils.closures.serializers.response import closure_periods_responsify
|
|
11
|
+
from invenio_app_ils.closures.serializers.schema import ClosurePeriodsV1
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
closure_periods_response = closure_periods_responsify(
|
|
15
|
+
ClosurePeriodsV1, "application/json"
|
|
16
|
+
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file is part of Invenio.
|
|
4
|
+
# Copyright (C) 2025-2025 CERN.
|
|
5
|
+
#
|
|
6
|
+
# Invenio is free software; you can redistribute it and/or modify it
|
|
7
|
+
# under the terms of the MIT License; see LICENSE file for more details.
|
|
8
|
+
|
|
9
|
+
"""Invenio App ILS Closures response serializers."""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
from flask import current_app
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def closure_periods_responsify(schema_class, mimetype):
|
|
16
|
+
"""Closure periods response serializer.
|
|
17
|
+
|
|
18
|
+
:param schema_class: Schema instance.
|
|
19
|
+
:param mimetype: MIME type of response.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def view(data, code=200, headers=None):
|
|
23
|
+
"""Generate the response object."""
|
|
24
|
+
response_data = schema_class().dump(data)
|
|
25
|
+
|
|
26
|
+
response = current_app.response_class(
|
|
27
|
+
json.dumps(response_data), mimetype=mimetype
|
|
28
|
+
)
|
|
29
|
+
response.status_code = code
|
|
30
|
+
|
|
31
|
+
if headers is not None:
|
|
32
|
+
response.headers.extend(headers)
|
|
33
|
+
return response
|
|
34
|
+
|
|
35
|
+
return view
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file is part of Invenio.
|
|
4
|
+
# Copyright (C) 2025-2025 CERN.
|
|
5
|
+
#
|
|
6
|
+
# Invenio is free software; you can redistribute it and/or modify it
|
|
7
|
+
# under the terms of the MIT License; see LICENSE file for more details.
|
|
8
|
+
|
|
9
|
+
"""Invenio App ILS Closures response schemas."""
|
|
10
|
+
|
|
11
|
+
from marshmallow import Schema, fields
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class DateRangeSchema(Schema):
|
|
15
|
+
"""Schema for a single closure period."""
|
|
16
|
+
|
|
17
|
+
start = fields.Date(required=True, description="Start date of the closure period.")
|
|
18
|
+
end = fields.Date(required=True, description="End date of the closure period.")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ClosurePeriodsV1(Schema):
|
|
22
|
+
"""Schema for a list of closure periods."""
|
|
23
|
+
|
|
24
|
+
closure_periods = fields.List(
|
|
25
|
+
fields.Nested(DateRangeSchema),
|
|
26
|
+
required=True,
|
|
27
|
+
description="List of closure date periods.",
|
|
28
|
+
)
|
|
@@ -71,16 +71,13 @@ def notify_location_updated(location_pid):
|
|
|
71
71
|
|
|
72
72
|
def is_already_running():
|
|
73
73
|
inspect = Inspect(app=current_app.extensions["invenio-celery"].celery)
|
|
74
|
-
filtered_results = filter(
|
|
75
|
-
None, [inspect.scheduled(), inspect.active()]
|
|
76
|
-
)
|
|
74
|
+
filtered_results = filter(None, [inspect.scheduled(), inspect.active()])
|
|
77
75
|
for results in filtered_results:
|
|
78
76
|
for result in results.values():
|
|
79
77
|
for task in result:
|
|
80
78
|
request = task["request"]
|
|
81
79
|
matches_name = (
|
|
82
|
-
request["name"]
|
|
83
|
-
== extend_active_loans_location_closure.name
|
|
80
|
+
request["name"] == extend_active_loans_location_closure.name
|
|
84
81
|
)
|
|
85
82
|
matches_location = request["args"][0] == location_pid
|
|
86
83
|
if matches_name and matches_location:
|
|
@@ -95,9 +92,7 @@ def notify_location_updated(location_pid):
|
|
|
95
92
|
if eta <= now:
|
|
96
93
|
eta += timedelta(days=1)
|
|
97
94
|
|
|
98
|
-
extend_active_loans_location_closure.apply_async(
|
|
99
|
-
args=[location_pid], eta=eta
|
|
100
|
-
)
|
|
95
|
+
extend_active_loans_location_closure.apply_async(args=[location_pid], eta=eta)
|
|
101
96
|
|
|
102
97
|
|
|
103
98
|
@shared_task
|
|
@@ -110,9 +105,7 @@ def extend_active_loans_location_closure(location_pid):
|
|
|
110
105
|
new_end_date = find_next_open_date(location_pid, current_end_date)
|
|
111
106
|
if new_end_date != current_end_date: # Update loan
|
|
112
107
|
modified_count += 1
|
|
113
|
-
loan = current_circulation.loan_record_cls.get_record_by_pid(
|
|
114
|
-
hit.pid
|
|
115
|
-
)
|
|
108
|
+
loan = current_circulation.loan_record_cls.get_record_by_pid(hit.pid)
|
|
116
109
|
_log("extend_loan_closure_before", loan)
|
|
117
110
|
loan.update(end_date=new_end_date.isoformat())
|
|
118
111
|
loan.commit()
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file is part of Invenio.
|
|
4
|
+
# Copyright (C) 2025-2025 CERN.
|
|
5
|
+
#
|
|
6
|
+
# Invenio is free software; you can redistribute it and/or modify it
|
|
7
|
+
# under the terms of the MIT License; see LICENSE file for more details.
|
|
8
|
+
|
|
9
|
+
"""Invenio App ILS Closure views."""
|
|
10
|
+
|
|
11
|
+
from flask import Blueprint, abort
|
|
12
|
+
from flask_login import current_user
|
|
13
|
+
from datetime import date
|
|
14
|
+
from invenio_records_rest.views import pass_record
|
|
15
|
+
from invenio_rest import ContentNegotiatedMethodView
|
|
16
|
+
from invenio_app_ils.locations.api import LOCATION_PID_TYPE
|
|
17
|
+
from invenio_app_ils.closures.serializers import closure_periods_response
|
|
18
|
+
from invenio_app_ils.closures.api import get_closure_periods
|
|
19
|
+
from invenio_app_ils.permissions import backoffice_read_permission
|
|
20
|
+
from invenio_app_ils.records.permissions import RecordPermission
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def create_closures_blueprint(app):
|
|
24
|
+
"""Create location closed periods blueprint."""
|
|
25
|
+
blueprint = Blueprint("invenio_app_ils_closures", __name__, url_prefix="")
|
|
26
|
+
endpoints = app.config["RECORDS_REST_ENDPOINTS"]
|
|
27
|
+
|
|
28
|
+
options = endpoints[LOCATION_PID_TYPE]
|
|
29
|
+
default_media_type = options.get("default_media_type", "")
|
|
30
|
+
closure_periods_serializers = {"application/json": closure_periods_response}
|
|
31
|
+
|
|
32
|
+
closure_periods_view = LocationClosurePeriodsResource.as_view(
|
|
33
|
+
LocationClosurePeriodsResource.view_name,
|
|
34
|
+
serializers=closure_periods_serializers,
|
|
35
|
+
default_media_type=default_media_type,
|
|
36
|
+
)
|
|
37
|
+
blueprint.add_url_rule(
|
|
38
|
+
"{0}/closure_periods/<int:year>".format(options["item_route"]),
|
|
39
|
+
view_func=closure_periods_view,
|
|
40
|
+
methods=["GET"],
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return blueprint
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class LocationClosurePeriodsResource(ContentNegotiatedMethodView):
|
|
47
|
+
"""Returns the closure periods of a Location"""
|
|
48
|
+
|
|
49
|
+
view_name = "location_closure_periods"
|
|
50
|
+
|
|
51
|
+
@pass_record
|
|
52
|
+
def get(self, pid, record, year, **kwargs):
|
|
53
|
+
"""Get the date ranges for which a location is closure based in the specified year"""
|
|
54
|
+
|
|
55
|
+
factory = RecordPermission(record, "read")
|
|
56
|
+
if not factory.is_public() and not backoffice_read_permission().can():
|
|
57
|
+
if not current_user.is_authenticated:
|
|
58
|
+
abort(401)
|
|
59
|
+
abort(403)
|
|
60
|
+
|
|
61
|
+
start_date = date(year, 1, 1)
|
|
62
|
+
end_date = date(year, 12, 31)
|
|
63
|
+
|
|
64
|
+
closure_periods = get_closure_periods(record, start_date, end_date)
|
|
65
|
+
|
|
66
|
+
return self.make_response({"closure_periods": closure_periods}, 200)
|