invenio-app-ils 6.1.1__tar.gz → 7.0.0__tar.gz

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.
Files changed (510) hide show
  1. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/CHANGES.rst +11 -1
  2. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/PKG-INFO +13 -3
  3. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/__init__.py +2 -2
  4. invenio_app_ils-7.0.0/invenio_app_ils/circulation/errors.py +12 -0
  5. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/indexer.py +70 -0
  6. invenio_app_ils-7.0.0/invenio_app_ils/circulation/stats/api.py +151 -0
  7. invenio_app_ils-7.0.0/invenio_app_ils/circulation/stats/schemas.py +110 -0
  8. invenio_app_ils-7.0.0/invenio_app_ils/circulation/stats/serializers/__init__.py +13 -0
  9. invenio_app_ils-7.0.0/invenio_app_ils/circulation/stats/serializers/response.py +37 -0
  10. invenio_app_ils-7.0.0/invenio_app_ils/circulation/stats/serializers/schema.py +33 -0
  11. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/stats/views.py +74 -3
  12. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/config.py +55 -1
  13. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ext.py +7 -2
  14. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/permissions.py +1 -0
  15. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/event_builders.py +44 -0
  16. invenio_app_ils-7.0.0/invenio_app_ils/stats/processors.py +86 -0
  17. invenio_app_ils-7.0.0/invenio_app_ils/stats/templates/aggregations/loan_transitions/__init__.py +8 -0
  18. invenio_app_ils-7.0.0/invenio_app_ils/stats/templates/aggregations/loan_transitions/os-v2/__init__.py +8 -0
  19. invenio_app_ils-7.0.0/invenio_app_ils/stats/templates/aggregations/loan_transitions/os-v2/aggr-loan-transitions-v1.json +32 -0
  20. invenio_app_ils-7.0.0/invenio_app_ils/stats/templates/events/loan_transitions/__init__.py +8 -0
  21. invenio_app_ils-7.0.0/invenio_app_ils/stats/templates/events/loan_transitions/os-v2/__init__.py +8 -0
  22. invenio_app_ils-7.0.0/invenio_app_ils/stats/templates/events/loan_transitions/os-v2/loan-transitions-v1.json +40 -0
  23. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/PKG-INFO +13 -3
  24. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/SOURCES.txt +11 -0
  25. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/requires.txt +1 -1
  26. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/setup.cfg +1 -1
  27. invenio_app_ils-6.1.1/invenio_app_ils/circulation/stats/api.py +0 -51
  28. invenio_app_ils-6.1.1/invenio_app_ils/stats/processors.py +0 -30
  29. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/.editorconfig +0 -0
  30. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/.git-blame-ignore-revs +0 -0
  31. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/AUTHORS.rst +0 -0
  32. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/CONTRIBUTING.rst +0 -0
  33. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/INSTALL.rst +0 -0
  34. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/LICENSE +0 -0
  35. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/MANIFEST.in +0 -0
  36. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/README.rst +0 -0
  37. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/backend/Dockerfile +0 -0
  38. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/frontend/Dockerfile +0 -0
  39. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/frontend/conf.d/default.conf +0 -0
  40. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/frontend/nginx.conf +0 -0
  41. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/frontend/test.crt +0 -0
  42. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/frontend/test.key +0 -0
  43. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/lb/Dockerfile +0 -0
  44. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/lb/haproxy.cfg +0 -0
  45. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker/lb/haproxy_cert.pem +0 -0
  46. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker-compose.full.yml +0 -0
  47. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker-compose.yml +0 -0
  48. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/docker-services.yml +0 -0
  49. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/__init__.py +0 -0
  50. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/api.py +0 -0
  51. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/config.py +0 -0
  52. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/errors.py +0 -0
  53. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/ext.py +0 -0
  54. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/jsonresolvers/__init__.py +0 -0
  55. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/jsonresolvers/order_order_lines.py +0 -0
  56. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/jsonresolvers/order_provider.py +0 -0
  57. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/loaders/__init__.py +0 -0
  58. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/loaders/jsonschemas/__init__.py +0 -0
  59. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/loaders/jsonschemas/order.py +0 -0
  60. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/__init__.py +0 -0
  61. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/os-v1/__init__.py +0 -0
  62. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/os-v1/acq_orders/order-v1.0.0.json +0 -0
  63. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/os-v2/__init__.py +0 -0
  64. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/os-v2/acq_orders/order-v1.0.0.json +0 -0
  65. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/v7/__init__.py +0 -0
  66. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/mappings/v7/acq_orders/order-v1.0.0.json +0 -0
  67. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/proxies.py +0 -0
  68. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/schemas/__init__.py +0 -0
  69. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/schemas/acq_orders/order-v1.0.0.json +0 -0
  70. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/acquisition/search.py +0 -0
  71. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/assets/semantic-ui/less/theme.config +0 -0
  72. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/assets/semantic-ui/templates/.gitkeep +0 -0
  73. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/__init__.py +0 -0
  74. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/api.py +0 -0
  75. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/config.py +0 -0
  76. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/jsonresolvers/__init__.py +0 -0
  77. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/jsonresolvers/loan.py +0 -0
  78. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/__init__.py +0 -0
  79. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/__init__.py +0 -0
  80. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/__init__.py +0 -0
  81. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/base.py +0 -0
  82. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/bulk_extend.py +0 -0
  83. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/loan_checkout.py +0 -0
  84. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/loan_request.py +0 -0
  85. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/loan_self_checkout.py +0 -0
  86. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/loaders/schemas/json/loan_update_dates.py +0 -0
  87. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/notifications/__init__.py +0 -0
  88. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/notifications/api.py +0 -0
  89. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/notifications/messages.py +0 -0
  90. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/notifications/tasks.py +0 -0
  91. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/receivers.py +0 -0
  92. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/search.py +0 -0
  93. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/serializers/__init__.py +0 -0
  94. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/serializers/csv.py +0 -0
  95. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/serializers/custom_fields.py +0 -0
  96. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/serializers/json.py +0 -0
  97. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/serializers/response.py +0 -0
  98. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/stats/__init__.py +0 -0
  99. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/tasks.py +0 -0
  100. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/bulk_extend.html +0 -0
  101. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/cancel.html +0 -0
  102. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/checkin.html +0 -0
  103. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/checkout.html +0 -0
  104. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/extend.html +0 -0
  105. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/overdue_reminder.html +0 -0
  106. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/request.html +0 -0
  107. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/request_no_items.html +0 -0
  108. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/self_checkout.html +0 -0
  109. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/update_dates.html +0 -0
  110. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/will_expire_in_reminder.html +0 -0
  111. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/transitions/__init__.py +0 -0
  112. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/transitions/transitions.py +0 -0
  113. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/utils.py +0 -0
  114. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/circulation/views.py +0 -0
  115. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/cli.py +0 -0
  116. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/__init__.py +0 -0
  117. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/api.py +0 -0
  118. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/serializers/__init__.py +0 -0
  119. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/serializers/response.py +0 -0
  120. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/serializers/schema.py +0 -0
  121. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/tasks.py +0 -0
  122. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/closures/views.py +0 -0
  123. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/demo_data/documents.json +0 -0
  124. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/demo_data/items.json +0 -0
  125. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/__init__.py +0 -0
  126. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/api.py +0 -0
  127. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/indexer.py +0 -0
  128. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/jsonresolvers/__init__.py +0 -0
  129. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/jsonresolvers/document_request_document.py +0 -0
  130. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/jsonresolvers/document_request_patron.py +0 -0
  131. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/loaders/__init__.py +0 -0
  132. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/loaders/jsonschemas/__init__.py +0 -0
  133. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/loaders/jsonschemas/document_request.py +0 -0
  134. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/loaders/jsonschemas/document_request_decline.py +0 -0
  135. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/loaders/jsonschemas/document_request_document.py +0 -0
  136. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/loaders/jsonschemas/document_request_provider.py +0 -0
  137. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/__init__.py +0 -0
  138. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/os-v1/__init__.py +0 -0
  139. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/os-v1/document_requests/document_request-v1.0.0.json +0 -0
  140. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/os-v2/__init__.py +0 -0
  141. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/os-v2/document_requests/document_request-v1.0.0.json +0 -0
  142. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/v7/__init__.py +0 -0
  143. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/mappings/v7/document_requests/document_request-v1.0.0.json +0 -0
  144. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/notifications/__init__.py +0 -0
  145. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/notifications/api.py +0 -0
  146. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/notifications/messages.py +0 -0
  147. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/schemas/__init__.py +0 -0
  148. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/schemas/document_requests/document_request-v1.0.0.json +0 -0
  149. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/search.py +0 -0
  150. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/templates/invenio_app_ils_document_requests/notifications/document_request_accept.html +0 -0
  151. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/templates/invenio_app_ils_document_requests/notifications/document_request_decline_in_catalog.html +0 -0
  152. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/templates/invenio_app_ils_document_requests/notifications/document_request_decline_not_found.html +0 -0
  153. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/templates/invenio_app_ils_document_requests/notifications/document_request_decline_other.html +0 -0
  154. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/templates/invenio_app_ils_document_requests/notifications/document_request_decline_user_cancel.html +0 -0
  155. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/document_requests/views.py +0 -0
  156. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/__init__.py +0 -0
  157. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/api.py +0 -0
  158. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/indexer.py +0 -0
  159. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/jsonresolvers/__init__.py +0 -0
  160. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/jsonresolvers/document_circulation.py +0 -0
  161. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/jsonresolvers/document_eitem.py +0 -0
  162. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/jsonresolvers/document_item.py +0 -0
  163. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/jsonresolvers/document_relations.py +0 -0
  164. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/jsonresolvers/document_stock.py +0 -0
  165. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/loaders/__init__.py +0 -0
  166. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/loaders/jsonschemas/__init__.py +0 -0
  167. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/loaders/jsonschemas/document.py +0 -0
  168. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/__init__.py +0 -0
  169. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/os-v1/__init__.py +0 -0
  170. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/os-v1/documents/document-v1.0.0.json +0 -0
  171. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/os-v1/documents/document-v2.0.0.json +0 -0
  172. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/os-v2/__init__.py +0 -0
  173. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/os-v2/documents/document-v1.0.0.json +0 -0
  174. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/os-v2/documents/document-v2.0.0.json +0 -0
  175. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/v7/__init__.py +0 -0
  176. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/v7/documents/document-v1.0.0.json +0 -0
  177. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/mappings/v7/documents/document-v2.0.0.json +0 -0
  178. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/schemas/__init__.py +0 -0
  179. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/schemas/documents/document-v1.0.0.json +0 -0
  180. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/schemas/documents/document-v2.0.0.json +0 -0
  181. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/search.py +0 -0
  182. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/documents/utils.py +0 -0
  183. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/__init__.py +0 -0
  184. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/api.py +0 -0
  185. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/indexer.py +0 -0
  186. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/jsonresolvers/__init__.py +0 -0
  187. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/jsonresolvers/eitem_document.py +0 -0
  188. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/jsonresolvers/eitem_files.py +0 -0
  189. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/loaders/__init__.py +0 -0
  190. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/loaders/jsonschemas/__init__.py +0 -0
  191. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/loaders/jsonschemas/eitems.py +0 -0
  192. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/__init__.py +0 -0
  193. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v1/__init__.py +0 -0
  194. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v1.0.0.json +0 -0
  195. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v2.0.0.json +0 -0
  196. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v3.0.0.json +0 -0
  197. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v2/__init__.py +0 -0
  198. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v1.0.0.json +0 -0
  199. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v2.0.0.json +0 -0
  200. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v3.0.0.json +0 -0
  201. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/v7/__init__.py +0 -0
  202. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/v7/eitems/eitem-v1.0.0.json +0 -0
  203. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/v7/eitems/eitem-v2.0.0.json +0 -0
  204. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/mappings/v7/eitems/eitem-v3.0.0.json +0 -0
  205. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/schemas/__init__.py +0 -0
  206. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/schemas/eitems/eitem-v1.0.0.json +0 -0
  207. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/schemas/eitems/eitem-v2.0.0.json +0 -0
  208. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/schemas/eitems/eitem-v3.0.0.json +0 -0
  209. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/eitems/search.py +0 -0
  210. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/errors.py +0 -0
  211. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/facets.py +0 -0
  212. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/fetchers.py +0 -0
  213. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/files/__init__.py +0 -0
  214. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/files/receivers.py +0 -0
  215. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/files/views.py +0 -0
  216. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/__init__.py +0 -0
  217. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/api.py +0 -0
  218. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/config.py +0 -0
  219. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/errors.py +0 -0
  220. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/ext.py +0 -0
  221. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/jsonresolvers/__init__.py +0 -0
  222. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/jsonresolvers/borrowing_request_document.py +0 -0
  223. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/jsonresolvers/borrowing_request_patron.py +0 -0
  224. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/jsonresolvers/borrowing_request_provider.py +0 -0
  225. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/loaders/__init__.py +0 -0
  226. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/loaders/jsonschemas/__init__.py +0 -0
  227. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/loaders/jsonschemas/borrowing_request.py +0 -0
  228. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/loaders/jsonschemas/patron_loan_actions.py +0 -0
  229. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/loaders/jsonschemas/patron_loan_extension_actions.py +0 -0
  230. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/__init__.py +0 -0
  231. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/os-v1/__init__.py +0 -0
  232. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/os-v1/ill_borrowing_requests/borrowing_request-v1.0.0.json +0 -0
  233. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/os-v2/__init__.py +0 -0
  234. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/os-v2/ill_borrowing_requests/borrowing_request-v1.0.0.json +0 -0
  235. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/v7/__init__.py +0 -0
  236. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/mappings/v7/ill_borrowing_requests/borrowing_request-v1.0.0.json +0 -0
  237. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/notifications/__init__.py +0 -0
  238. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/notifications/api.py +0 -0
  239. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/notifications/messages.py +0 -0
  240. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/proxies.py +0 -0
  241. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/schemas/__init__.py +0 -0
  242. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/schemas/ill_borrowing_requests/borrowing_request-v1.0.0.json +0 -0
  243. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/search.py +0 -0
  244. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/serializers/__init__.py +0 -0
  245. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/serializers/csv.py +0 -0
  246. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/serializers/custom_fields.py +0 -0
  247. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/serializers/json.py +0 -0
  248. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/templates/invenio_app_ils_ill/notifications/patron_loan_extension_accept.html +0 -0
  249. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/templates/invenio_app_ils_ill/notifications/patron_loan_extension_decline.html +0 -0
  250. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/templates/invenio_app_ils_ill/notifications/patron_loan_extension_request.html +0 -0
  251. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/ill/views.py +0 -0
  252. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/indexer.py +0 -0
  253. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/__init__.py +0 -0
  254. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/api.py +0 -0
  255. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/indexer.py +0 -0
  256. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/jsonresolvers/__init__.py +0 -0
  257. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/jsonresolvers/internal_location.py +0 -0
  258. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/loaders/__init__.py +0 -0
  259. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/loaders/jsonschemas/__init__.py +0 -0
  260. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/loaders/jsonschemas/internal_location.py +0 -0
  261. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/__init__.py +0 -0
  262. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/os-v1/__init__.py +0 -0
  263. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/os-v1/internal_locations/internal_location-v1.0.0.json +0 -0
  264. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/os-v2/__init__.py +0 -0
  265. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/os-v2/internal_locations/internal_location-v1.0.0.json +0 -0
  266. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/v7/__init__.py +0 -0
  267. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/mappings/v7/internal_locations/internal_location-v1.0.0.json +0 -0
  268. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/schemas/__init__.py +0 -0
  269. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/schemas/internal_locations/internal_location-v1.0.0.json +0 -0
  270. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/internal_locations/search.py +0 -0
  271. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/__init__.py +0 -0
  272. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/api.py +0 -0
  273. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/indexer.py +0 -0
  274. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/jsonresolvers/__init__.py +0 -0
  275. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/jsonresolvers/item_document.py +0 -0
  276. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/jsonresolvers/item_internal_location.py +0 -0
  277. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/jsonresolvers/item_loan.py +0 -0
  278. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/loaders/__init__.py +0 -0
  279. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/loaders/jsonschemas/__init__.py +0 -0
  280. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/loaders/jsonschemas/items.py +0 -0
  281. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/__init__.py +0 -0
  282. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/os-v1/__init__.py +0 -0
  283. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/os-v1/items/item-v1.0.0.json +0 -0
  284. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/os-v1/items/item-v2.0.0.json +0 -0
  285. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/os-v2/__init__.py +0 -0
  286. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/os-v2/items/item-v1.0.0.json +0 -0
  287. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/os-v2/items/item-v2.0.0.json +0 -0
  288. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/v7/__init__.py +0 -0
  289. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/v7/items/item-v1.0.0.json +0 -0
  290. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/mappings/v7/items/item-v2.0.0.json +0 -0
  291. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/schemas/__init__.py +0 -0
  292. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/schemas/items/item-v1.0.0.json +0 -0
  293. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/schemas/items/item-v2.0.0.json +0 -0
  294. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/search.py +0 -0
  295. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/serializers/__init__.py +0 -0
  296. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/items/serializers/item.py +0 -0
  297. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/__init__.py +0 -0
  298. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/api.py +0 -0
  299. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/covers_builder.py +0 -0
  300. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/search.py +0 -0
  301. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/serializers/__init__.py +0 -0
  302. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/serializers/csv.py +0 -0
  303. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/serializers/custom_fields.py +0 -0
  304. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/literature/serializers/json.py +0 -0
  305. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/__init__.py +0 -0
  306. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/api.py +0 -0
  307. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/indexer.py +0 -0
  308. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/loaders/__init__.py +0 -0
  309. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/loaders/jsonschemas/__init__.py +0 -0
  310. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/loaders/jsonschemas/location.py +0 -0
  311. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/__init__.py +0 -0
  312. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/os-v1/__init__.py +0 -0
  313. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/os-v1/locations/location-v1.0.0.json +0 -0
  314. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/os-v2/__init__.py +0 -0
  315. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/os-v2/locations/location-v1.0.0.json +0 -0
  316. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/v7/__init__.py +0 -0
  317. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/mappings/v7/locations/location-v1.0.0.json +0 -0
  318. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/receivers.py +0 -0
  319. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/schemas/__init__.py +0 -0
  320. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/schemas/locations/location-v1.0.0.json +0 -0
  321. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/locations/search.py +0 -0
  322. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/minters.py +0 -0
  323. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/__init__.py +0 -0
  324. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/api.py +0 -0
  325. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/backends/__init__.py +0 -0
  326. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/backends/mail.py +0 -0
  327. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/messages.py +0 -0
  328. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/models.py +0 -0
  329. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/tasks.py +0 -0
  330. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/notifications/views.py +0 -0
  331. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/__init__.py +0 -0
  332. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/anonymization.py +0 -0
  333. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/api.py +0 -0
  334. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/cli.py +0 -0
  335. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/indexer.py +0 -0
  336. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/__init__.py +0 -0
  337. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/os-v1/__init__.py +0 -0
  338. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/os-v1/patrons/patron-v1.0.0.json +0 -0
  339. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/os-v2/__init__.py +0 -0
  340. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/os-v2/patrons/patron-v1.0.0.json +0 -0
  341. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/v7/__init__.py +0 -0
  342. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/mappings/v7/patrons/patron-v1.0.0.json +0 -0
  343. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/search.py +0 -0
  344. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/patrons/views.py +0 -0
  345. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/__init__.py +0 -0
  346. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/api.py +0 -0
  347. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/config.py +0 -0
  348. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/errors.py +0 -0
  349. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/ext.py +0 -0
  350. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/indexer.py +0 -0
  351. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/loaders/__init__.py +0 -0
  352. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/loaders/jsonschemas/__init__.py +0 -0
  353. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/loaders/jsonschemas/provider.py +0 -0
  354. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/__init__.py +0 -0
  355. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/os-v1/__init__.py +0 -0
  356. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/os-v1/providers/provider-v1.0.0.json +0 -0
  357. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/os-v2/__init__.py +0 -0
  358. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/os-v2/providers/provider-v1.0.0.json +0 -0
  359. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/v7/__init__.py +0 -0
  360. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/mappings/v7/providers/provider-v1.0.0.json +0 -0
  361. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/proxies.py +0 -0
  362. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/schemas/__init__.py +0 -0
  363. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/schemas/providers/provider-v1.0.0.json +0 -0
  364. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/providers/search.py +0 -0
  365. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/proxies.py +0 -0
  366. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/__init__.py +0 -0
  367. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/api.py +0 -0
  368. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/jsonresolvers/__init__.py +0 -0
  369. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/jsonresolvers/api.py +0 -0
  370. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/listeners.py +0 -0
  371. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/loaders/__init__.py +0 -0
  372. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/loaders/schemas/__init__.py +0 -0
  373. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/loaders/schemas/changed_by.py +0 -0
  374. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/loaders/schemas/identifiers.py +0 -0
  375. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/loaders/schemas/preserve_cover_metadata.py +0 -0
  376. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/loaders/schemas/price.py +0 -0
  377. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/metadata_extensions.py +0 -0
  378. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/permissions.py +0 -0
  379. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/receivers.py +0 -0
  380. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/schemas/__init__.py +0 -0
  381. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/schemas/json.py +0 -0
  382. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/serializers/__init__.py +0 -0
  383. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records/views.py +0 -0
  384. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records_relations/__init__.py +0 -0
  385. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records_relations/api.py +0 -0
  386. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records_relations/indexer.py +0 -0
  387. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records_relations/retriever.py +0 -0
  388. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/records_relations/views.py +0 -0
  389. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/relations/__init__.py +0 -0
  390. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/relations/api.py +0 -0
  391. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/relations/nodes.py +0 -0
  392. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/search_permissions.py +0 -0
  393. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/__init__.py +0 -0
  394. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/api.py +0 -0
  395. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/indexer.py +0 -0
  396. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/jsonresolvers/__init__.py +0 -0
  397. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/jsonresolvers/series_relations.py +0 -0
  398. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/loaders/__init__.py +0 -0
  399. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/loaders/jsonschemas/__init__.py +0 -0
  400. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/loaders/jsonschemas/series.py +0 -0
  401. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/__init__.py +0 -0
  402. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/os-v1/__init__.py +0 -0
  403. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/os-v1/series/series-v1.0.0.json +0 -0
  404. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/os-v1/series/series-v2.0.0.json +0 -0
  405. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/os-v2/__init__.py +0 -0
  406. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/os-v2/series/series-v1.0.0.json +0 -0
  407. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/os-v2/series/series-v2.0.0.json +0 -0
  408. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/v7/__init__.py +0 -0
  409. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/v7/series/series-v1.0.0.json +0 -0
  410. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/mappings/v7/series/series-v2.0.0.json +0 -0
  411. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/schemas/__init__.py +0 -0
  412. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/schemas/series/series-v1.0.0.json +0 -0
  413. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/schemas/series/series-v2.0.0.json +0 -0
  414. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/series/search.py +0 -0
  415. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/signals.py +0 -0
  416. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/static/images/placeholder.png +0 -0
  417. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/static_pages/search_guide.html +0 -0
  418. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/__init__.py +0 -0
  419. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/__init__.py +0 -0
  420. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/__init__.py +0 -0
  421. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/os-v1/__init__.py +0 -0
  422. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/os-v1/aggr-file-download-v1.json +0 -0
  423. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/os-v2/__init__.py +0 -0
  424. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/os-v2/aggr-file-download-v1.json +0 -0
  425. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/v7/__init__.py +0 -0
  426. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/aggregations/aggr_file_download/v7/aggr-file-download-v1.json +0 -0
  427. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/__init__.py +0 -0
  428. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/os-v1/__init__.py +0 -0
  429. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/os-v1/file-download-v1.json +0 -0
  430. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/os-v2/__init__.py +0 -0
  431. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/os-v2/file-download-v1.json +0 -0
  432. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/v7/__init__.py +0 -0
  433. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/file_download/v7/file-download-v1.json +0 -0
  434. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/aggregations/__init__.py +0 -0
  435. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/aggregations/ils_record_changes/__init__.py +0 -0
  436. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/aggregations/ils_record_changes/os-v2/__init__.py +0 -0
  437. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/aggregations/ils_record_changes/os-v2/aggr-ils-record-changes-v1.json +0 -0
  438. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/events/__init__.py +0 -0
  439. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/events/ils_record_changes/__init__.py +0 -0
  440. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/events/ils_record_changes/os-v2/__init__.py +0 -0
  441. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/stats/templates/events/ils_record_changes/os-v2/ils-record-changes-v1.json +0 -0
  442. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/templates/invenio_app_ils/mail/footer.html +0 -0
  443. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/templates/invenio_app_ils/notifications/footer.html +0 -0
  444. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/templates/logged_out.html +0 -0
  445. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/translations/.gitkeep +0 -0
  446. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/views.py +0 -0
  447. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/__init__.py +0 -0
  448. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/api.py +0 -0
  449. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/cli.py +0 -0
  450. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/__init__.py +0 -0
  451. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/acq_mediums.json +0 -0
  452. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/acq_order_line_payment_modes.json +0 -0
  453. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/acq_order_line_purchase_types.json +0 -0
  454. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/acq_payment_modes.json +0 -0
  455. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/acq_recipients.json +0 -0
  456. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/affiliation_identifier_schemes.json +0 -0
  457. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/alternative_identifier_schemes.json +0 -0
  458. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/alternative_title_types.json +0 -0
  459. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/author_identifier_schemes.json +0 -0
  460. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/author_roles.json +0 -0
  461. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/author_types.json +0 -0
  462. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/conference_identifier_schemes.json +0 -0
  463. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/countries.json +0 -0
  464. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/currencies.json +0 -0
  465. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/docreq_payment_method.json +0 -0
  466. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/docreq_request_type.json +0 -0
  467. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/document_identifiers_materials.json +0 -0
  468. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/document_requests_mediums.json +0 -0
  469. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/document_subjects.json +0 -0
  470. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/eitem_sources.json +0 -0
  471. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/identifier_schemes.json +0 -0
  472. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/ill_item_types.json +0 -0
  473. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/ill_payment_modes.json +0 -0
  474. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/item_mediums.json +0 -0
  475. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/provider_types.json +0 -0
  476. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/series_identifier_schemes.json +0 -0
  477. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/series_url_access_restrictions.json +0 -0
  478. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/data/tags.json +0 -0
  479. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/indexer.py +0 -0
  480. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/jsonresolvers/__init__.py +0 -0
  481. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/jsonresolvers/licenses.py +0 -0
  482. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/__init__.py +0 -0
  483. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/os-v1/__init__.py +0 -0
  484. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/os-v1/vocabularies/vocabulary-v1.0.0.json +0 -0
  485. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/os-v2/__init__.py +0 -0
  486. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/os-v2/vocabularies/vocabulary-v1.0.0.json +0 -0
  487. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/v7/__init__.py +0 -0
  488. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/mappings/v7/vocabularies/vocabulary-v1.0.0.json +0 -0
  489. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/schemas/__init__.py +0 -0
  490. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/schemas/vocabularies/vocabulary-v1.0.0.json +0 -0
  491. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/search.py +0 -0
  492. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/sources/__init__.py +0 -0
  493. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/sources/base.py +0 -0
  494. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/sources/json.py +0 -0
  495. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/vocabularies/sources/opendefinition.py +0 -0
  496. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils/webpack.py +0 -0
  497. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/dependency_links.txt +0 -0
  498. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/entry_points.txt +0 -0
  499. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/not-zip-safe +0 -0
  500. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/invenio_app_ils.egg-info/top_level.txt +0 -0
  501. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/pyproject.toml +0 -0
  502. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/run-tests.sh +0 -0
  503. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/bootstrap +0 -0
  504. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/build_assets +0 -0
  505. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/celery +0 -0
  506. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/console +0 -0
  507. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/server +0 -0
  508. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/setup +0 -0
  509. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/scripts/update +0 -0
  510. {invenio_app_ils-6.1.1 → invenio_app_ils-7.0.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
 
2
2
  ..
3
- Copyright (C) 2018-2025 CERN.
3
+ Copyright (C) 2018-2026 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.
@@ -8,6 +8,16 @@
8
8
  Changes
9
9
  =======
10
10
 
11
+ Version 7.0.0 (released 2026-01-06)
12
+
13
+ - stats: generalize stat tracking loan extensions to track all transitions
14
+ - stats: raise error when loan is indexed while loan transition events index does not exits
15
+ - stats: add feature flag for extending record indices with stats
16
+ - stats: warn when loan gets indexed while loan-transitions index does not exist
17
+ - breaking change: global: update invenio-circulation
18
+ - breaking change: stats: add loan stats endpoint and extend loans index
19
+ - breaking change: stats: add stat to track loan extensions
20
+
11
21
  Version 6.1.1 (released 2025-12-10)
12
22
 
13
23
  - tests: move covers builder test into correct folder
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invenio-app-ils
3
- Version: 6.1.1
3
+ Version: 7.0.0
4
4
  Summary: Invenio Integrated Library System.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-app-ils
6
6
  Author: CERN
@@ -39,7 +39,7 @@ Requires-Dist: invenio-records<4.0.0,>=3.0.2
39
39
  Requires-Dist: invenio-files-rest<4.0.0,>=3.2.0
40
40
  Requires-Dist: invenio-banners<6.0.0,>=5.0.0
41
41
  Requires-Dist: invenio-pages<8.0.0,>=7.1.0
42
- Requires-Dist: invenio-circulation<4.0.0,>=3.0.0a1
42
+ Requires-Dist: invenio-circulation<5.0.0,>=4.0.0
43
43
  Requires-Dist: invenio-opendefinition<3.0.0,>=2.0.0a2
44
44
  Requires-Dist: invenio-pidrelations<2.0.0,>=1.0.0
45
45
  Requires-Dist: invenio-stats<6.0.0,>=5.1.1
@@ -95,7 +95,7 @@ https://invenioils.docs.cern.ch
95
95
 
96
96
 
97
97
  ..
98
- Copyright (C) 2018-2025 CERN.
98
+ Copyright (C) 2018-2026 CERN.
99
99
 
100
100
  invenio-app-ils is free software; you can redistribute it and/or modify it
101
101
  under the terms of the MIT License; see LICENSE file for more details.
@@ -103,6 +103,16 @@ https://invenioils.docs.cern.ch
103
103
  Changes
104
104
  =======
105
105
 
106
+ Version 7.0.0 (released 2026-01-06)
107
+
108
+ - stats: generalize stat tracking loan extensions to track all transitions
109
+ - stats: raise error when loan is indexed while loan transition events index does not exits
110
+ - stats: add feature flag for extending record indices with stats
111
+ - stats: warn when loan gets indexed while loan-transitions index does not exist
112
+ - breaking change: global: update invenio-circulation
113
+ - breaking change: stats: add loan stats endpoint and extend loans index
114
+ - breaking change: stats: add stat to track loan extensions
115
+
106
116
  Version 6.1.1 (released 2025-12-10)
107
117
 
108
118
  - tests: move covers builder test into correct folder
@@ -1,12 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2018-2024 CERN.
3
+ # Copyright (C) 2018-2026 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
  """invenio-app-ils."""
9
9
 
10
- __version__ = "6.1.1"
10
+ __version__ = "7.0.0"
11
11
 
12
12
  __all__ = ("__version__",)
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2025 CERN.
4
+ #
5
+ # Invenio-App-Ils is free software; you can redistribute it and/or modify
6
+ # it under the terms of the MIT License; see LICENSE file for more details.
7
+
8
+ """Circulation exceptions."""
9
+
10
+
11
+ class LoanTransitionEventsIndexMissingError(Exception):
12
+ """Error raised when the loan transition events index is missing."""
@@ -15,7 +15,9 @@ from invenio_circulation.pidstore.pids import CIRCULATION_LOAN_PID_TYPE
15
15
  from invenio_circulation.proxies import current_circulation
16
16
  from invenio_indexer.api import RecordIndexer
17
17
  from invenio_pidstore.errors import PIDDeletedError
18
+ from invenio_search import current_search_client
18
19
 
20
+ from invenio_app_ils.circulation.errors import LoanTransitionEventsIndexMissingError
19
21
  from invenio_app_ils.circulation.utils import resolve_item_from_loan
20
22
  from invenio_app_ils.documents.api import DOCUMENT_PID_TYPE
21
23
  from invenio_app_ils.indexer import ReferencedRecordsIndexer
@@ -97,3 +99,71 @@ def index_extra_fields_for_loan(loan_dict):
97
99
 
98
100
  can_circulate_items_count = document["circulation"]["can_circulate_items_count"]
99
101
  loan_dict["can_circulate_items_count"] = can_circulate_items_count
102
+
103
+
104
+ def index_stats_fields_for_loan(loan_dict):
105
+ """Indexer hook to modify the loan record dict before indexing"""
106
+
107
+ creation_date = datetime.fromisoformat(loan_dict["_created"]).date()
108
+ start_date = (
109
+ datetime.fromisoformat(loan_dict["start_date"]).date()
110
+ if loan_dict.get("start_date")
111
+ else None
112
+ )
113
+ end_date = (
114
+ datetime.fromisoformat(loan_dict["end_date"]).date()
115
+ if loan_dict.get("end_date")
116
+ else None
117
+ )
118
+
119
+ # Collect extra information relevant for stats
120
+ stats = {}
121
+
122
+ # Time ranges in days
123
+ if start_date and end_date:
124
+ loan_duration = (end_date - start_date).days
125
+ stats["loan_duration"] = loan_duration
126
+
127
+ if creation_date and start_date:
128
+ waiting_time = (start_date - creation_date).days
129
+ stats["waiting_time"] = waiting_time if waiting_time >= 0 else None
130
+
131
+ # Document availability during loan request
132
+ stat_events_index_name = "events-stats-loan-transitions"
133
+ if not current_search_client.indices.exists(index=stat_events_index_name):
134
+ raise LoanTransitionEventsIndexMissingError()
135
+
136
+ loan_pid = loan_dict["pid"]
137
+ search_body = {
138
+ "query": {
139
+ "bool": {
140
+ "must": [
141
+ {"term": {"trigger": "request"}},
142
+ {"term": {"pid_value": loan_pid}},
143
+ ],
144
+ }
145
+ },
146
+ }
147
+
148
+ search_result = current_search_client.search(
149
+ index=stat_events_index_name, body=search_body
150
+ )
151
+ hits = search_result["hits"]["hits"]
152
+ if len(hits) == 1:
153
+ request_transition_event = hits[0]["_source"]
154
+ available_items_during_request_count = request_transition_event[
155
+ "extra_data"
156
+ ]["available_items_during_request_count"]
157
+ stats["available_items_during_request"] = (
158
+ available_items_during_request_count > 0
159
+ )
160
+ elif len(hits) > 1:
161
+ raise ValueError(
162
+ f"Multiple request transition events for loan {loan_pid}."
163
+ "Expected zero or one."
164
+ )
165
+
166
+
167
+ if not "extra_data" in loan_dict:
168
+ loan_dict["extra_data"] = {}
169
+ loan_dict["extra_data"]["stats"] = stats
@@ -0,0 +1,151 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2019-2025 CERN.
4
+ #
5
+ # invenio-app-ils is free software; you can redistribute it and/or modify it
6
+ # under the terms of the MIT License; see LICENSE file for more details.
7
+
8
+ """APIs for ILS circulation statistics."""
9
+
10
+ from invenio_search.engine import dsl
11
+
12
+ from invenio_app_ils.circulation.search import get_most_loaned_documents
13
+ from invenio_app_ils.circulation.stats.schemas import (
14
+ _OS_NATIVE_AGGREGATE_FUNCTION_TYPES,
15
+ )
16
+ from invenio_app_ils.proxies import current_app_ils
17
+
18
+
19
+ def fetch_most_loaned_documents(from_date, to_date, bucket_size):
20
+ """Fetch the documents with the most loans within the date interval."""
21
+ # Create loans aggregation
22
+ most_loaned = get_most_loaned_documents(from_date, to_date, bucket_size)
23
+
24
+ # Prepare the loan and extension count
25
+ document_pids = []
26
+ document_metadata = {}
27
+ loan_result = most_loaned.execute()
28
+ for bucket in loan_result.aggregations.most_loaned_documents.buckets:
29
+ document_pid = bucket["key"]
30
+ loan_count = bucket["doc_count"]
31
+ loan_extensions = int(bucket["extensions"]["value"])
32
+ document_pids.append(document_pid)
33
+ document_metadata[document_pid] = dict(
34
+ loans=loan_count, extensions=loan_extensions
35
+ )
36
+
37
+ # Enhance the document serializer
38
+ doc_search = current_app_ils.document_search_cls()
39
+ doc_search = doc_search.with_preference_param().params(version=True)
40
+ doc_search = doc_search.search_by_pid(*document_pids)
41
+ doc_search = doc_search[0:bucket_size]
42
+ result = doc_search.execute()
43
+
44
+ for hit in result.hits:
45
+ pid = hit["pid"]
46
+ hit["loan_count"] = document_metadata[pid]["loans"]
47
+ hit["loan_extensions"] = document_metadata[pid]["extensions"]
48
+
49
+ res = result.to_dict()
50
+ res["hits"]["hits"] = sorted(
51
+ res["hits"]["hits"],
52
+ key=lambda hit: hit["_source"]["loan_count"],
53
+ reverse=True,
54
+ )
55
+
56
+ return res
57
+
58
+
59
+ def _generate_metric_agg_field_name(metric):
60
+ """Return the aggregation name used for a metric.
61
+
62
+ :param metric: Must include 'field' and 'aggregation' keys.
63
+ :returns: The aggregation field name in the form '<aggregation>_<field>'.
64
+ """
65
+
66
+ return f"{metric['aggregation']}__{metric['field']}"
67
+
68
+
69
+ def get_loan_statistics(date_fields, search, requested_group_by, requested_metrics):
70
+ """Aggregate loan statistics for requested metrics.
71
+
72
+ :param date_fields: List of date fields for the record type.
73
+ Date fields require different handling when using them to group by.
74
+ :param search: The base search object to apply aggregations on
75
+ :param requested_group_by: List of group dictionaries with 'field' and optional 'interval' keys.
76
+ Example: [{"field": "start_date", "interval": "monthly"}, {"field": "state"}]
77
+ :param requested_metrics: List of metric dictionaries with 'field' and 'aggregation' keys.
78
+ Example: [{"field": "loan_duration", "aggregation": "avg"}]
79
+ :returns: OpenSearch aggregation results with multi-terms histogram and optional metrics
80
+ """
81
+
82
+ # Build composite aggregation
83
+ sources = []
84
+ for grouping in requested_group_by:
85
+ grouping_field = grouping["field"]
86
+
87
+ if grouping_field in date_fields:
88
+ sources.append(
89
+ {
90
+ grouping_field: {
91
+ "date_histogram": {
92
+ "field": grouping_field,
93
+ "calendar_interval": grouping["interval"],
94
+ "format": "yyyy-MM-dd",
95
+ }
96
+ }
97
+ }
98
+ )
99
+ else:
100
+ sources.append({grouping_field: {"terms": {"field": grouping_field}}})
101
+
102
+ composite_agg = dsl.A("composite", sources=sources, size=1000)
103
+
104
+ for metric in requested_metrics:
105
+ agg_name = _generate_metric_agg_field_name(metric)
106
+
107
+ grouping_field = metric["field"]
108
+ agg_type = metric["aggregation"]
109
+ field_config = {"field": grouping_field}
110
+ if agg_type in _OS_NATIVE_AGGREGATE_FUNCTION_TYPES:
111
+ composite_agg = composite_agg.metric(
112
+ agg_name, dsl.A(agg_type, **field_config)
113
+ )
114
+ elif agg_type == "median":
115
+ composite_agg = composite_agg.metric(
116
+ agg_name, dsl.A("percentiles", percents=[50], **field_config)
117
+ )
118
+
119
+ search.aggs.bucket("loan_aggregations", composite_agg)
120
+
121
+ # Only retrieve aggregation results
122
+ search = search[:0]
123
+ result = search.execute()
124
+
125
+ # Parse aggregation results
126
+ buckets = []
127
+ if hasattr(result.aggregations, "loan_aggregations"):
128
+ for bucket in result.aggregations.loan_aggregations.buckets:
129
+ metrics_data = {}
130
+ for metric in requested_metrics:
131
+ agg_name = _generate_metric_agg_field_name(metric)
132
+
133
+ if hasattr(bucket, agg_name):
134
+ agg_result = getattr(bucket, agg_name)
135
+ agg_type = metric["aggregation"]
136
+
137
+ if agg_type in _OS_NATIVE_AGGREGATE_FUNCTION_TYPES:
138
+ metrics_data[agg_name] = agg_result.value
139
+ elif agg_type == "median":
140
+ median_value = agg_result.values.get("50.0")
141
+ metrics_data[agg_name] = median_value
142
+
143
+ bucket_data = {
144
+ "key": bucket.key.to_dict(),
145
+ "doc_count": bucket.doc_count,
146
+ "metrics": metrics_data,
147
+ }
148
+
149
+ buckets.append(bucket_data)
150
+
151
+ return buckets
@@ -0,0 +1,110 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2025 CERN.
4
+ #
5
+ # invenio-app-ils is free software; you can redistribute it and/or modify it
6
+ # under the terms of the MIT License; see LICENSE file for more details.
7
+
8
+ """Marshmallow schemas for loan statistics validation."""
9
+
10
+ import json
11
+ import re
12
+
13
+ from marshmallow import (
14
+ Schema,
15
+ ValidationError,
16
+ fields,
17
+ pre_load,
18
+ validate,
19
+ validates_schema,
20
+ )
21
+
22
+ from invenio_app_ils.errors import InvalidParameterError
23
+
24
+ _OS_VALID_FIELD_NAME_PATTERN = re.compile(r"^[A-Za-z0-9_.]+$")
25
+ _OS_NATIVE_AGGREGATE_FUNCTION_TYPES = {"avg", "sum", "min", "max"}
26
+ _VALID_AGGREGATE_FUNCTION_TYPES = _OS_NATIVE_AGGREGATE_FUNCTION_TYPES.union({"median"})
27
+ _VALID_DATE_INTERVALS = {"1d", "1w", "1M", "1q", "1y"}
28
+
29
+
30
+ def validate_field_name(field_name):
31
+ """Validate a field name for search to prevent injection attacks.
32
+
33
+ :param field_name: The field name to validate
34
+ :raises InvalidParameterError: If field name is invalid or potentially malicious
35
+ """
36
+ if not _OS_VALID_FIELD_NAME_PATTERN.match(field_name):
37
+ raise InvalidParameterError(
38
+ description=(
39
+ f"Invalid field name '{field_name}'. "
40
+ "Field names may contain only alphanumeric characters, underscores, "
41
+ "and dots."
42
+ )
43
+ )
44
+
45
+
46
+ class SecureFieldNameField(fields.String):
47
+ """Marshmallow field that validates field names to prevent injection attacks."""
48
+
49
+ def _deserialize(self, value, attr, data, **kwargs):
50
+ """Deserialize and validate field name."""
51
+
52
+ field_name = super()._deserialize(value, attr, data, **kwargs)
53
+ validate_field_name(field_name)
54
+ return field_name
55
+
56
+
57
+ class GroupByItemSchema(Schema):
58
+ field = SecureFieldNameField(required=True)
59
+ interval = fields.String(validate=validate.OneOf(_VALID_DATE_INTERVALS))
60
+
61
+ @validates_schema
62
+ def validate_date_fields(self, data, **kwargs):
63
+ """Validate that date fields have an interval and non-date fields do not."""
64
+
65
+ date_fields = self.context["date_fields"]
66
+ field = data.get("field")
67
+ interval = data.get("interval")
68
+ if field in date_fields and not interval:
69
+ raise ValidationError(
70
+ {"interval": ["Interval is required for date fields."]}
71
+ )
72
+ if field not in date_fields and interval is not None:
73
+ raise ValidationError(
74
+ {"interval": ["Interval must not be provided for non-date fields."]}
75
+ )
76
+
77
+
78
+ class MetricItemSchema(Schema):
79
+ """Schema for validating a single metric item."""
80
+
81
+ field = SecureFieldNameField(required=True)
82
+ aggregation = fields.String(
83
+ required=True, validate=validate.OneOf(_VALID_AGGREGATE_FUNCTION_TYPES)
84
+ )
85
+
86
+
87
+ class HistogramParamsSchema(Schema):
88
+ """Schema for validating the query string parameters for the histogram endpoint"""
89
+
90
+ metrics = fields.List(fields.Nested(MetricItemSchema), required=False)
91
+ group_by = fields.List(
92
+ fields.Nested(GroupByItemSchema), required=True, validate=validate.Length(min=1)
93
+ )
94
+ q = fields.String()
95
+
96
+ def __init__(self, date_fields, *args, **kwargs):
97
+ super().__init__(*args, **kwargs)
98
+ self.context = {"date_fields": set(date_fields)}
99
+
100
+ @pre_load
101
+ def parse_query_string(self, data, **kwargs):
102
+ """Parse the metrics and group_by parameters from JSON strings."""
103
+
104
+ try:
105
+ for key in ("metrics", "group_by"):
106
+ # default value as the field "metrics" is not required
107
+ data[key] = json.loads(data.get(key, "[]"))
108
+ except Exception as e:
109
+ raise ValidationError from e
110
+ return data
@@ -0,0 +1,13 @@
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.circulation.stats.serializers.response import loan_stats_responsify
11
+ from invenio_app_ils.circulation.stats.serializers.schema import HistogramStatsV1
12
+
13
+ loan_stats_response = loan_stats_responsify(HistogramStatsV1, "application/json")
@@ -0,0 +1,37 @@
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 loan stats response serializers."""
10
+
11
+ import json
12
+
13
+ from flask import current_app
14
+
15
+
16
+ def loan_stats_responsify(schema_class, mimetype):
17
+ """Loan stats response serializer.
18
+
19
+ :param schema_class: Schema instance.
20
+ :param mimetype: MIME type of response.
21
+ """
22
+
23
+ def view(data, code=200, headers=None):
24
+ """Generate the response object."""
25
+ # return jsonify(data), code
26
+ response_data = schema_class().dump(data)
27
+
28
+ response = current_app.response_class(
29
+ json.dumps(response_data), mimetype=mimetype
30
+ )
31
+ response.status_code = code
32
+
33
+ if headers is not None:
34
+ response.headers.extend(headers)
35
+ return response
36
+
37
+ return view
@@ -0,0 +1,33 @@
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 loan stats serializers schema."""
10
+
11
+ from marshmallow import Schema, fields
12
+
13
+
14
+ class BucketSchema(Schema):
15
+ """Schema for a single histogram bucket."""
16
+
17
+ doc_count = fields.Int(required=True)
18
+ key = fields.Dict(keys=fields.String(), values=fields.String())
19
+
20
+ metrics = fields.Dict(
21
+ keys=fields.String(),
22
+ values=fields.Float(),
23
+ )
24
+
25
+
26
+ class HistogramStatsV1(Schema):
27
+ """Schema for a stats histogram response."""
28
+
29
+ buckets = fields.List(
30
+ fields.Nested(BucketSchema),
31
+ required=True,
32
+ description="Statistics buckets.",
33
+ )
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2019 CERN.
3
+ # Copyright (C) 2019-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.
@@ -10,11 +10,21 @@
10
10
  from datetime import datetime
11
11
 
12
12
  from flask import Blueprint, current_app, request
13
+ from invenio_circulation.pidstore.pids import CIRCULATION_LOAN_PID_TYPE
14
+ from invenio_circulation.proxies import current_circulation
13
15
  from invenio_pidstore import current_pidstore
16
+ from invenio_records_rest.query import default_search_factory
14
17
  from invenio_records_rest.utils import obj_or_import_string
15
18
  from invenio_rest import ContentNegotiatedMethodView
16
-
17
- from invenio_app_ils.circulation.stats.api import fetch_most_loaned_documents
19
+ from marshmallow.exceptions import ValidationError
20
+
21
+ from invenio_app_ils.circulation.stats.api import (
22
+ fetch_most_loaned_documents,
23
+ get_loan_statistics,
24
+ )
25
+ from invenio_app_ils.circulation.stats.schemas import HistogramParamsSchema
26
+ from invenio_app_ils.circulation.stats.serializers import loan_stats_response
27
+ from invenio_app_ils.circulation.views import IlsCirculationResource
18
28
  from invenio_app_ils.config import RECORDS_REST_MAX_RESULT_WINDOW
19
29
  from invenio_app_ils.documents.api import DOCUMENT_PID_FETCHER, DOCUMENT_PID_TYPE
20
30
  from invenio_app_ils.errors import InvalidParameterError
@@ -46,11 +56,33 @@ def create_most_loaned_documents_view(blueprint, app):
46
56
  )
47
57
 
48
58
 
59
+ def create_loan_histogram_view(blueprint, app):
60
+ """Add url rule for loan histogram view."""
61
+
62
+ endpoints = app.config.get("RECORDS_REST_ENDPOINTS")
63
+ document_endpoint = endpoints.get(CIRCULATION_LOAN_PID_TYPE)
64
+ default_media_type = document_endpoint.get("default_media_type")
65
+ loan_stats_serializers = {"application/json": loan_stats_response}
66
+
67
+ loan_stats_view_func = LoanHistogramResource.as_view(
68
+ LoanHistogramResource.view_name,
69
+ serializers=loan_stats_serializers,
70
+ default_media_type=default_media_type,
71
+ ctx={},
72
+ )
73
+ blueprint.add_url_rule(
74
+ "/circulation/loans/stats",
75
+ view_func=loan_stats_view_func,
76
+ methods=["GET"],
77
+ )
78
+
79
+
49
80
  def create_circulation_stats_blueprint(app):
50
81
  """Add statistics views to the blueprint."""
51
82
  blueprint = Blueprint("invenio_app_ils_circulation_stats", __name__, url_prefix="")
52
83
 
53
84
  create_most_loaned_documents_view(blueprint, app)
85
+ create_loan_histogram_view(blueprint, app)
54
86
 
55
87
  return blueprint
56
88
 
@@ -131,3 +163,42 @@ class MostLoanedDocumentsResource(ContentNegotiatedMethodView):
131
163
  pid_fetcher=current_pidstore.fetchers[DOCUMENT_PID_FETCHER],
132
164
  search_result=most_loaned_documents,
133
165
  )
166
+
167
+
168
+ class LoanHistogramResource(IlsCirculationResource):
169
+ """Loan stats resource."""
170
+
171
+ view_name = "loan_histogram"
172
+
173
+ @need_permissions("stats-loans")
174
+ def get(self, **kwargs):
175
+ """Get loan statistics."""
176
+
177
+ loan_cls = current_circulation.loan_record_cls
178
+ loan_date_fields = (
179
+ loan_cls.DATE_FIELDS + loan_cls.DATETIME_FIELDS + ["_created"]
180
+ )
181
+
182
+ schema = HistogramParamsSchema(loan_date_fields)
183
+ try:
184
+ parsed_args = schema.load(request.args.to_dict())
185
+ except ValidationError as e:
186
+ raise InvalidParameterError(description=e.messages) from e
187
+
188
+ # Construct search to allow for filtering with the q parameter
189
+ search_cls = current_circulation.loan_search_cls
190
+ search = search_cls()
191
+ search, _ = default_search_factory(self, search)
192
+
193
+ aggregation_buckets = get_loan_statistics(
194
+ loan_date_fields,
195
+ search,
196
+ parsed_args["group_by"],
197
+ parsed_args["metrics"],
198
+ )
199
+
200
+ response = {
201
+ "buckets": aggregation_buckets,
202
+ }
203
+
204
+ return self.make_response(response, 200)