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.
Files changed (331) hide show
  1. invenio_app_ils/__init__.py +2 -2
  2. invenio_app_ils/acquisition/api.py +3 -1
  3. invenio_app_ils/acquisition/config.py +10 -21
  4. invenio_app_ils/acquisition/jsonresolvers/order_order_lines.py +1 -0
  5. invenio_app_ils/acquisition/mappings/os-v1/acq_orders/order-v1.0.0.json +364 -0
  6. invenio_app_ils/acquisition/mappings/os-v2/__init__.py +0 -0
  7. invenio_app_ils/acquisition/mappings/os-v2/acq_orders/order-v1.0.0.json +364 -0
  8. invenio_app_ils/acquisition/mappings/v7/acq_orders/order-v1.0.0.json +14 -0
  9. invenio_app_ils/acquisition/search.py +5 -15
  10. invenio_app_ils/assets/semantic-ui/less/theme.config +103 -0
  11. invenio_app_ils/assets/semantic-ui/templates/.gitkeep +0 -0
  12. invenio_app_ils/circulation/api.py +153 -67
  13. invenio_app_ils/circulation/config.py +29 -25
  14. invenio_app_ils/circulation/indexer.py +14 -19
  15. invenio_app_ils/circulation/loaders/__init__.py +2 -0
  16. invenio_app_ils/circulation/loaders/schemas/json/loan_checkout.py +2 -3
  17. invenio_app_ils/circulation/loaders/schemas/json/loan_request.py +82 -16
  18. invenio_app_ils/circulation/loaders/schemas/json/loan_self_checkout.py +19 -0
  19. invenio_app_ils/circulation/notifications/api.py +23 -19
  20. invenio_app_ils/circulation/notifications/messages.py +6 -6
  21. invenio_app_ils/circulation/notifications/tasks.py +1 -2
  22. invenio_app_ils/circulation/receivers.py +2 -5
  23. invenio_app_ils/circulation/search.py +23 -22
  24. invenio_app_ils/circulation/serializers/__init__.py +2 -2
  25. invenio_app_ils/circulation/serializers/csv.py +1 -3
  26. invenio_app_ils/circulation/serializers/custom_fields.py +5 -9
  27. invenio_app_ils/circulation/serializers/json.py +2 -6
  28. invenio_app_ils/circulation/serializers/response.py +12 -12
  29. invenio_app_ils/circulation/stats/views.py +5 -15
  30. invenio_app_ils/circulation/tasks.py +2 -6
  31. invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/self_checkout.html +19 -0
  32. invenio_app_ils/circulation/templates/invenio_app_ils_circulation/notifications/update_dates.html +19 -0
  33. invenio_app_ils/circulation/utils.py +23 -17
  34. invenio_app_ils/circulation/views.py +103 -39
  35. invenio_app_ils/cli.py +220 -260
  36. invenio_app_ils/closures/api.py +72 -7
  37. invenio_app_ils/closures/serializers/__init__.py +16 -0
  38. invenio_app_ils/closures/serializers/response.py +35 -0
  39. invenio_app_ils/closures/serializers/schema.py +28 -0
  40. invenio_app_ils/closures/tasks.py +4 -11
  41. invenio_app_ils/closures/views.py +66 -0
  42. invenio_app_ils/config.py +207 -150
  43. invenio_app_ils/document_requests/api.py +6 -21
  44. invenio_app_ils/document_requests/loaders/__init__.py +4 -12
  45. invenio_app_ils/document_requests/mappings/{v6 → os-v1}/__init__.py +2 -2
  46. invenio_app_ils/document_requests/mappings/os-v1/document_requests/document_request-v1.0.0.json +196 -0
  47. invenio_app_ils/document_requests/mappings/os-v2/__init__.py +8 -0
  48. invenio_app_ils/document_requests/mappings/os-v2/document_requests/document_request-v1.0.0.json +196 -0
  49. invenio_app_ils/document_requests/notifications/api.py +2 -7
  50. invenio_app_ils/document_requests/notifications/messages.py +3 -7
  51. invenio_app_ils/document_requests/search.py +2 -6
  52. invenio_app_ils/document_requests/views.py +4 -10
  53. invenio_app_ils/documents/api.py +19 -25
  54. invenio_app_ils/documents/indexer.py +13 -20
  55. invenio_app_ils/documents/jsonresolvers/document_circulation.py +11 -33
  56. invenio_app_ils/documents/jsonresolvers/document_eitem.py +1 -0
  57. invenio_app_ils/documents/jsonresolvers/document_item.py +8 -9
  58. invenio_app_ils/documents/jsonresolvers/document_stock.py +7 -7
  59. invenio_app_ils/documents/loaders/jsonschemas/document.py +3 -14
  60. invenio_app_ils/documents/mappings/{v6 → os-v1}/__init__.py +1 -1
  61. invenio_app_ils/documents/mappings/os-v1/documents/document-v1.0.0.json +932 -0
  62. invenio_app_ils/documents/mappings/os-v1/documents/document-v2.0.0.json +1066 -0
  63. invenio_app_ils/documents/mappings/os-v2/__init__.py +8 -0
  64. invenio_app_ils/documents/mappings/os-v2/documents/document-v1.0.0.json +932 -0
  65. invenio_app_ils/documents/mappings/os-v2/documents/document-v2.0.0.json +1066 -0
  66. invenio_app_ils/documents/mappings/v7/documents/document-v1.0.0.json +102 -11
  67. invenio_app_ils/documents/mappings/v7/documents/document-v2.0.0.json +1066 -0
  68. invenio_app_ils/documents/schemas/documents/document-v2.0.0.json +732 -0
  69. invenio_app_ils/eitems/api.py +41 -7
  70. invenio_app_ils/eitems/loaders/jsonschemas/eitems.py +6 -6
  71. invenio_app_ils/eitems/mappings/{v6 → os-v1}/__init__.py +1 -1
  72. invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v1.0.0.json +139 -0
  73. invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v2.0.0.json +142 -0
  74. invenio_app_ils/eitems/mappings/os-v1/eitems/eitem-v3.0.0.json +179 -0
  75. invenio_app_ils/{series/mappings/v6 → eitems/mappings/os-v2}/__init__.py +1 -1
  76. invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v1.0.0.json +139 -0
  77. invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v2.0.0.json +142 -0
  78. invenio_app_ils/eitems/mappings/os-v2/eitems/eitem-v3.0.0.json +179 -0
  79. invenio_app_ils/eitems/mappings/v7/eitems/eitem-v1.0.0.json +12 -2
  80. invenio_app_ils/eitems/mappings/v7/eitems/eitem-v2.0.0.json +142 -0
  81. invenio_app_ils/eitems/mappings/v7/eitems/eitem-v3.0.0.json +179 -0
  82. invenio_app_ils/eitems/schemas/eitems/eitem-v2.0.0.json +120 -0
  83. invenio_app_ils/eitems/schemas/eitems/eitem-v3.0.0.json +120 -0
  84. invenio_app_ils/eitems/search.py +3 -9
  85. invenio_app_ils/errors.py +119 -6
  86. invenio_app_ils/ext.py +15 -18
  87. invenio_app_ils/facets.py +13 -15
  88. invenio_app_ils/files/receivers.py +1 -1
  89. invenio_app_ils/files/views.py +1 -2
  90. invenio_app_ils/ill/api.py +1 -2
  91. invenio_app_ils/ill/config.py +10 -16
  92. invenio_app_ils/ill/jsonresolvers/borrowing_request_document.py +2 -3
  93. invenio_app_ils/ill/jsonresolvers/borrowing_request_patron.py +1 -3
  94. invenio_app_ils/ill/jsonresolvers/borrowing_request_provider.py +1 -3
  95. invenio_app_ils/ill/loaders/__init__.py +3 -9
  96. invenio_app_ils/ill/loaders/jsonschemas/patron_loan_actions.py +1 -8
  97. invenio_app_ils/ill/loaders/jsonschemas/patron_loan_extension_actions.py +3 -8
  98. invenio_app_ils/ill/mappings/{v6 → os-v1}/__init__.py +1 -1
  99. invenio_app_ils/ill/mappings/os-v1/ill_borrowing_requests/borrowing_request-v1.0.0.json +254 -0
  100. invenio_app_ils/{acquisition/mappings/v6 → ill/mappings/os-v2}/__init__.py +1 -1
  101. invenio_app_ils/ill/mappings/os-v2/ill_borrowing_requests/borrowing_request-v1.0.0.json +254 -0
  102. invenio_app_ils/ill/mappings/v7/ill_borrowing_requests/borrowing_request-v1.0.0.json +14 -0
  103. invenio_app_ils/ill/notifications/api.py +1 -4
  104. invenio_app_ils/ill/search.py +3 -9
  105. invenio_app_ils/ill/serializers/__init__.py +1 -3
  106. invenio_app_ils/ill/views.py +2 -4
  107. invenio_app_ils/internal_locations/api.py +1 -4
  108. invenio_app_ils/internal_locations/mappings/{v6 → os-v1}/__init__.py +1 -1
  109. invenio_app_ils/internal_locations/mappings/os-v1/internal_locations/internal_location-v1.0.0.json +108 -0
  110. invenio_app_ils/internal_locations/mappings/os-v2/__init__.py +8 -0
  111. invenio_app_ils/internal_locations/mappings/os-v2/internal_locations/internal_location-v1.0.0.json +108 -0
  112. invenio_app_ils/internal_locations/search.py +1 -3
  113. invenio_app_ils/items/api.py +18 -15
  114. invenio_app_ils/items/indexer.py +1 -3
  115. invenio_app_ils/items/jsonresolvers/item_document.py +1 -1
  116. invenio_app_ils/items/jsonresolvers/item_internal_location.py +2 -6
  117. invenio_app_ils/items/loaders/jsonschemas/items.py +2 -0
  118. {tests/api/circulation → invenio_app_ils/items/mappings/os-v1}/__init__.py +1 -1
  119. invenio_app_ils/items/mappings/os-v1/items/item-v1.0.0.json +285 -0
  120. invenio_app_ils/items/mappings/os-v1/items/item-v2.0.0.json +326 -0
  121. {tests/api/ill → invenio_app_ils/items/mappings/os-v2}/__init__.py +1 -1
  122. invenio_app_ils/items/mappings/os-v2/items/item-v1.0.0.json +285 -0
  123. invenio_app_ils/items/mappings/os-v2/items/item-v2.0.0.json +326 -0
  124. invenio_app_ils/items/mappings/v7/items/item-v1.0.0.json +11 -0
  125. invenio_app_ils/items/mappings/v7/items/item-v2.0.0.json +326 -0
  126. invenio_app_ils/items/schemas/items/item-v1.0.0.json +22 -0
  127. invenio_app_ils/items/schemas/items/item-v2.0.0.json +172 -0
  128. invenio_app_ils/items/search.py +18 -11
  129. invenio_app_ils/items/serializers/item.py +7 -6
  130. invenio_app_ils/literature/api.py +1 -3
  131. invenio_app_ils/literature/search.py +3 -5
  132. invenio_app_ils/literature/serializers/csv.py +1 -3
  133. invenio_app_ils/literature/serializers/json.py +1 -3
  134. invenio_app_ils/locations/api.py +2 -4
  135. invenio_app_ils/locations/indexer.py +3 -9
  136. invenio_app_ils/locations/loaders/__init__.py +1 -3
  137. invenio_app_ils/locations/loaders/jsonschemas/location.py +4 -11
  138. invenio_app_ils/locations/mappings/{v6 → os-v1}/__init__.py +1 -1
  139. invenio_app_ils/locations/mappings/os-v1/locations/location-v1.0.0.json +90 -0
  140. invenio_app_ils/locations/mappings/os-v2/__init__.py +8 -0
  141. invenio_app_ils/locations/mappings/os-v2/locations/location-v1.0.0.json +90 -0
  142. invenio_app_ils/notifications/messages.py +4 -3
  143. invenio_app_ils/notifications/tasks.py +1 -3
  144. invenio_app_ils/notifications/views.py +2 -2
  145. invenio_app_ils/patrons/anonymization.py +53 -32
  146. invenio_app_ils/patrons/api.py +3 -5
  147. invenio_app_ils/patrons/cli.py +1 -2
  148. invenio_app_ils/patrons/indexer.py +4 -13
  149. invenio_app_ils/patrons/mappings/os-v1/__init__.py +8 -0
  150. invenio_app_ils/patrons/mappings/os-v1/patrons/patron-v1.0.0.json +42 -0
  151. invenio_app_ils/patrons/mappings/os-v2/__init__.py +8 -0
  152. invenio_app_ils/patrons/mappings/os-v2/patrons/patron-v1.0.0.json +42 -0
  153. invenio_app_ils/patrons/views.py +4 -14
  154. invenio_app_ils/permissions.py +93 -35
  155. invenio_app_ils/providers/api.py +2 -6
  156. invenio_app_ils/providers/config.py +11 -19
  157. invenio_app_ils/providers/indexer.py +2 -6
  158. invenio_app_ils/providers/mappings/{v6 → os-v1}/__init__.py +1 -1
  159. invenio_app_ils/providers/mappings/os-v1/providers/provider-v1.0.0.json +57 -0
  160. invenio_app_ils/providers/mappings/os-v2/__init__.py +8 -0
  161. invenio_app_ils/providers/mappings/os-v2/providers/provider-v1.0.0.json +57 -0
  162. invenio_app_ils/providers/mappings/v7/__init__.py +1 -1
  163. invenio_app_ils/providers/proxies.py +1 -3
  164. invenio_app_ils/records/api.py +3 -9
  165. invenio_app_ils/records/loaders/schemas/changed_by.py +1 -3
  166. invenio_app_ils/records/loaders/schemas/identifiers.py +23 -0
  167. invenio_app_ils/records/metadata_extensions.py +1 -4
  168. invenio_app_ils/records/permissions.py +8 -2
  169. invenio_app_ils/records/serializers/__init__.py +1 -4
  170. invenio_app_ils/records/views.py +4 -7
  171. invenio_app_ils/records_relations/api.py +11 -34
  172. invenio_app_ils/records_relations/indexer.py +1 -3
  173. invenio_app_ils/records_relations/retriever.py +14 -9
  174. invenio_app_ils/records_relations/views.py +16 -50
  175. invenio_app_ils/relations/api.py +17 -16
  176. invenio_app_ils/search_permissions.py +24 -24
  177. invenio_app_ils/series/api.py +10 -12
  178. invenio_app_ils/series/loaders/jsonschemas/series.py +3 -2
  179. invenio_app_ils/{items/mappings/v6 → series/mappings/os-v1}/__init__.py +1 -1
  180. invenio_app_ils/series/mappings/os-v1/series/series-v1.0.0.json +324 -0
  181. invenio_app_ils/series/mappings/os-v1/series/series-v2.0.0.json +396 -0
  182. {tests/api/acquisition → invenio_app_ils/series/mappings/os-v2}/__init__.py +1 -1
  183. invenio_app_ils/series/mappings/os-v2/series/series-v1.0.0.json +324 -0
  184. invenio_app_ils/series/mappings/os-v2/series/series-v2.0.0.json +396 -0
  185. invenio_app_ils/series/mappings/v7/series/series-v1.0.0.json +35 -3
  186. invenio_app_ils/series/mappings/v7/series/series-v2.0.0.json +396 -0
  187. invenio_app_ils/series/schemas/series/series-v2.0.0.json +354 -0
  188. invenio_app_ils/stats/aggregations/aggr_file_download/os-v1/aggr-file-download-v1.json +60 -0
  189. invenio_app_ils/stats/aggregations/aggr_file_download/os-v2/__init__.py +9 -0
  190. invenio_app_ils/stats/aggregations/aggr_file_download/os-v2/aggr-file-download-v1.json +60 -0
  191. invenio_app_ils/stats/event_builders.py +73 -0
  192. invenio_app_ils/stats/file_download/os-v1/file-download-v1.json +72 -0
  193. invenio_app_ils/stats/file_download/os-v2/__init__.py +9 -0
  194. invenio_app_ils/stats/file_download/os-v2/file-download-v1.json +72 -0
  195. invenio_app_ils/stats/processors.py +30 -0
  196. invenio_app_ils/stats/templates/aggregations/__init__.py +8 -0
  197. invenio_app_ils/stats/templates/aggregations/ils_record_changes/__init__.py +8 -0
  198. invenio_app_ils/stats/templates/aggregations/ils_record_changes/os-v2/__init__.py +8 -0
  199. invenio_app_ils/stats/templates/aggregations/ils_record_changes/os-v2/aggr-ils-record-changes-v1.json +41 -0
  200. {tests → invenio_app_ils/stats/templates/events}/__init__.py +2 -2
  201. invenio_app_ils/stats/templates/events/ils_record_changes/__init__.py +8 -0
  202. invenio_app_ils/stats/templates/events/ils_record_changes/os-v2/__init__.py +8 -0
  203. invenio_app_ils/stats/templates/events/ils_record_changes/os-v2/ils-record-changes-v1.json +41 -0
  204. invenio_app_ils/templates/logged_out.html +12 -0
  205. invenio_app_ils/views.py +18 -4
  206. invenio_app_ils/vocabularies/api.py +1 -1
  207. invenio_app_ils/vocabularies/cli.py +6 -18
  208. invenio_app_ils/vocabularies/data/acq_order_line_payment_modes.json +5 -0
  209. invenio_app_ils/vocabularies/data/identifier_schemes.json +5 -0
  210. invenio_app_ils/vocabularies/indexer.py +1 -4
  211. invenio_app_ils/vocabularies/jsonresolvers/licenses.py +2 -11
  212. invenio_app_ils/vocabularies/mappings/os-v1/__init__.py +8 -0
  213. invenio_app_ils/vocabularies/mappings/os-v1/vocabularies/vocabulary-v1.0.0.json +23 -0
  214. invenio_app_ils/vocabularies/mappings/os-v2/__init__.py +8 -0
  215. invenio_app_ils/vocabularies/mappings/os-v2/vocabularies/vocabulary-v1.0.0.json +23 -0
  216. invenio_app_ils/vocabularies/sources/base.py +1 -3
  217. invenio_app_ils/webpack.py +27 -0
  218. invenio_app_ils-6.1.0.dist-info/METADATA +627 -0
  219. {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/RECORD +227 -249
  220. {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/WHEEL +1 -1
  221. {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/entry_points.txt +9 -5
  222. {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info}/top_level.txt +0 -1
  223. invenio_app_ils/acquisition/mappings/v6/acq_orders/order-v1.0.0.json +0 -352
  224. invenio_app_ils/document_requests/mappings/v6/document_requests/document_request-v1.0.0.json +0 -199
  225. invenio_app_ils/documents/mappings/v6/documents/document-v1.0.0.json +0 -843
  226. invenio_app_ils/eitems/mappings/v6/eitems/eitem-v1.0.0.json +0 -131
  227. invenio_app_ils/ill/mappings/v6/ill_borrowing_requests/borrowing_request-v1.0.0.json +0 -242
  228. invenio_app_ils/internal_locations/mappings/v6/internal_locations/internal_location-v1.0.0.json +0 -110
  229. invenio_app_ils/items/mappings/v6/items/item-v1.0.0.json +0 -276
  230. invenio_app_ils/locations/mappings/v6/locations/location-v1.0.0.json +0 -92
  231. invenio_app_ils/notifications/admin.py +0 -57
  232. invenio_app_ils/patrons/mappings/v6/__init__.py +0 -8
  233. invenio_app_ils/patrons/mappings/v6/patrons/patron-v1.0.0.json +0 -44
  234. invenio_app_ils/providers/mappings/v6/providers/provider-v1.0.0.json +0 -59
  235. invenio_app_ils/series/mappings/v6/series/series-v1.0.0.json +0 -298
  236. invenio_app_ils/stats/aggregations/aggr_file_download/v6/aggr-file-download-v1.json +0 -59
  237. invenio_app_ils/stats/file_download/v6/file-download-v1.json +0 -74
  238. invenio_app_ils/version.py +0 -14
  239. invenio_app_ils/vocabularies/mappings/v6/__init__.py +0 -8
  240. invenio_app_ils/vocabularies/mappings/v6/vocabularies/vocabulary-v1.0.0.json +0 -25
  241. invenio_app_ils-1.0.0a54.dist-info/METADATA +0 -95
  242. tests/api/__init__.py +0 -8
  243. tests/api/acquisition/test_acq_orders_crud.py +0 -102
  244. tests/api/acquisition/test_acq_orders_permissions.py +0 -104
  245. tests/api/acquisition/test_acq_providers_permissions.py +0 -83
  246. tests/api/circulation/test_expired_loans.py +0 -88
  247. tests/api/circulation/test_loan_checkout.py +0 -216
  248. tests/api/circulation/test_loan_default_durations.py +0 -57
  249. tests/api/circulation/test_loan_document_resolver.py +0 -18
  250. tests/api/circulation/test_loan_extend.py +0 -132
  251. tests/api/circulation/test_loan_item_permissions.py +0 -139
  252. tests/api/circulation/test_loan_item_resolver.py +0 -26
  253. tests/api/circulation/test_loan_list_permissions.py +0 -104
  254. tests/api/circulation/test_loan_patron_resolver.py +0 -38
  255. tests/api/circulation/test_loan_request.py +0 -234
  256. tests/api/circulation/test_loan_update.py +0 -150
  257. tests/api/circulation/test_notifications.py +0 -229
  258. tests/api/conftest.py +0 -236
  259. tests/api/document_requests/__init__.py +0 -8
  260. tests/api/document_requests/test_document_requests.py +0 -131
  261. tests/api/document_requests/test_document_requests_permissions.py +0 -177
  262. tests/api/document_requests/test_notifications_filter.py +0 -36
  263. tests/api/ill/test_ill_brw_crud.py +0 -84
  264. tests/api/ill/test_ill_brw_reqs_patron_loan_create_action.py +0 -207
  265. tests/api/ill/test_ill_brw_reqs_patron_loan_extension_actions.py +0 -298
  266. tests/api/ill/test_ill_brw_reqs_permissions.py +0 -169
  267. tests/api/ill/test_ill_providers_permissions.py +0 -82
  268. tests/api/ils/__init__.py +0 -8
  269. tests/api/ils/documents/__init__.py +0 -8
  270. tests/api/ils/documents/test_document_crud.py +0 -57
  271. tests/api/ils/documents/test_document_permissions.py +0 -106
  272. tests/api/ils/documents/test_document_resolvers.py +0 -35
  273. tests/api/ils/eitems/__init__.py +0 -8
  274. tests/api/ils/eitems/test_eitems_crud.py +0 -41
  275. tests/api/ils/eitems/test_eitems_permissions.py +0 -84
  276. tests/api/ils/eitems/test_files.py +0 -172
  277. tests/api/ils/items/__init__.py +0 -8
  278. tests/api/ils/items/test_apis.py +0 -43
  279. tests/api/ils/items/test_items_crud.py +0 -60
  280. tests/api/ils/items/test_items_permissions.py +0 -107
  281. tests/api/ils/items/test_items_update.py +0 -47
  282. tests/api/ils/records_relations/__init__.py +0 -8
  283. tests/api/ils/records_relations/helpers.py +0 -115
  284. tests/api/ils/records_relations/test_records_relations_parentchild.py +0 -560
  285. tests/api/ils/records_relations/test_records_relations_sequence.py +0 -302
  286. tests/api/ils/records_relations/test_records_relations_siblings.py +0 -678
  287. tests/api/ils/series/__init__.py +0 -8
  288. tests/api/ils/series/test_series_permissions.py +0 -95
  289. tests/api/ils/test_anonymization.py +0 -189
  290. tests/api/ils/test_apis.py +0 -76
  291. tests/api/ils/test_closures.py +0 -324
  292. tests/api/ils/test_errors.py +0 -126
  293. tests/api/ils/test_facets.py +0 -84
  294. tests/api/ils/test_internal_locations.py +0 -96
  295. tests/api/ils/test_loaders.py +0 -55
  296. tests/api/ils/test_metadata_extensions.py +0 -205
  297. tests/api/ils/test_notifications.py +0 -183
  298. tests/api/ils/test_notifications_mails.py +0 -39
  299. tests/api/ils/test_notifications_permissions.py +0 -55
  300. tests/api/ils/test_patrons.py +0 -106
  301. tests/api/ils/test_record_delete.py +0 -46
  302. tests/api/ils/test_record_permissions.py +0 -135
  303. tests/api/ils/test_resolvers.py +0 -207
  304. tests/api/ils/test_stats.py +0 -160
  305. tests/api/ils/test_tasks.py +0 -211
  306. tests/api/ils/test_vocabularies.py +0 -35
  307. tests/conftest.py +0 -123
  308. tests/data/acq_orders.json +0 -89
  309. tests/data/acq_providers.json +0 -12
  310. tests/data/document_requests.json +0 -77
  311. tests/data/documents.json +0 -237
  312. tests/data/eitems.json +0 -66
  313. tests/data/ill_borrowing_requests.json +0 -77
  314. tests/data/ill_providers.json +0 -12
  315. tests/data/internal_locations.json +0 -22
  316. tests/data/items.json +0 -271
  317. tests/data/loans.json +0 -133
  318. tests/data/loans_most_loaned.json +0 -128
  319. tests/data/locations.json +0 -20
  320. tests/data/series.json +0 -33
  321. tests/helpers.py +0 -104
  322. tests/templates/notifications/title_body.html +0 -8
  323. tests/templates/notifications/title_body_html.html +0 -13
  324. tests/templates/notifications/title_body_html_ctx.html +0 -13
  325. tests/templates/notifications/title_only.html +0 -3
  326. tests/test_version.py +0 -17
  327. /tests/templates/notifications/blank.html → /invenio_app_ils/acquisition/mappings/os-v1/__init__.py +0 -0
  328. /invenio_app_ils/stats/aggregations/aggr_file_download/{v6 → os-v1}/__init__.py +0 -0
  329. /invenio_app_ils/stats/file_download/{v6 → os-v1}/__init__.py +0 -0
  330. {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info/licenses}/AUTHORS.rst +0 -0
  331. {invenio_app_ils-1.0.0a54.dist-info → invenio_app_ils-6.1.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,132 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2019-2020 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
- """Test loan extend."""
9
-
10
- import json
11
- from copy import deepcopy
12
- from datetime import timedelta
13
-
14
- import arrow
15
- from flask import url_for
16
- from invenio_circulation.api import Loan
17
- from invenio_db import db
18
-
19
- from invenio_app_ils.circulation.api import (
20
- circulation_default_loan_duration_for_item,
21
- )
22
- from invenio_app_ils.items.api import Item
23
- from tests.helpers import user_login
24
-
25
-
26
- def _checkout_loan_pid1(client, json_headers, users, loan_params):
27
- """Create an ongoing loan."""
28
-
29
- def _checkout(loan_pid, params):
30
- """Perform checkout action."""
31
- user_login(client, "librarian", users)
32
- checkout_url = url_for(
33
- "invenio_circulation_loan_actions.loanid_actions",
34
- pid_value=loan_pid,
35
- action="checkout",
36
- )
37
- resp = client.post(
38
- checkout_url, headers=json_headers, data=json.dumps(params)
39
- )
40
- assert resp.status_code == 202
41
- return resp.get_json()
42
-
43
- loan_pid = "loanid-1"
44
- params = deepcopy(loan_params)
45
- params["document_pid"] = "docid-1"
46
- params["item_pid"]["value"] = "itemid-2"
47
-
48
- return _checkout(loan_pid, params)
49
-
50
-
51
- def test_loan_extend_permissions(
52
- client, json_headers, users, testdata, loan_params
53
- ):
54
- """Test loan can be extended."""
55
- params = deepcopy(loan_params)
56
- del params["transaction_date"]
57
- loan = _checkout_loan_pid1(client, json_headers, users, params)
58
-
59
- tests = [
60
- ("admin", 202),
61
- ("librarian", 202),
62
- ("patron1", 202),
63
- ("patron3", 403),
64
- ]
65
-
66
- for username, expected_resp_code in tests:
67
- extend_url = loan["links"]["actions"]["extend"]
68
-
69
- user_login(client, username, users)
70
- res = client.post(
71
- extend_url,
72
- headers=json_headers,
73
- data=json.dumps(params),
74
- )
75
- assert res.status_code == expected_resp_code
76
-
77
-
78
- def test_loan_extension_end_date(
79
- app, client, json_headers, users, testdata, loan_params
80
- ):
81
- """Test loan end date after extension."""
82
- params = deepcopy(loan_params)
83
- del params["transaction_date"]
84
- record = _checkout_loan_pid1(client, json_headers, users, params)
85
- extend_url = record["links"]["actions"]["extend"]
86
- loan = record["metadata"]
87
-
88
- item = Item.get_record_by_pid(loan["item_pid"]["value"])
89
- item_loan_duration = circulation_default_loan_duration_for_item(item)
90
-
91
- user_login(client, "patron1", users)
92
-
93
- def _set_loan_end_date(loan_pid, new_end_date):
94
- """Set loan end date."""
95
- loan = Loan.get_record_by_pid(loan_pid)
96
- loan["end_date"] = new_end_date.date().isoformat()
97
- loan.commit()
98
- db.session.commit()
99
-
100
- def test_extension_end_date_loan_not_overdue(loan_pid):
101
- """Test that new end date is added to the current end date."""
102
- now = arrow.utcnow()
103
- new_end_date = now + timedelta(days=10) # loan is not overdue
104
- _set_loan_end_date(loan_pid, new_end_date)
105
-
106
- expected_end_date = new_end_date + item_loan_duration
107
-
108
- res = client.post(
109
- extend_url, headers=json_headers, data=json.dumps(params)
110
- )
111
- assert res.status_code == 202
112
- new_loan = res.get_json()["metadata"]
113
- assert new_loan["end_date"] == expected_end_date.date().isoformat()
114
-
115
- def test_extension_end_date_loan_overdue(loan_pid):
116
- """Test that new end date is added to today."""
117
- now = arrow.utcnow()
118
-
119
- new_end_date = now - timedelta(days=2) # loan is overdue since 2 days
120
- _set_loan_end_date(loan_pid, new_end_date)
121
-
122
- expected_end_date = now + item_loan_duration
123
- res = client.post(
124
- extend_url, headers=json_headers, data=json.dumps(params)
125
- )
126
- assert res.status_code == 202
127
- new_loan = res.get_json()["metadata"]
128
- # loan new end date should start from now
129
- assert new_loan["end_date"] == expected_end_date.date().isoformat()
130
-
131
- test_extension_end_date_loan_not_overdue(loan["pid"])
132
- test_extension_end_date_loan_overdue(loan["pid"])
@@ -1,139 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2018-2020 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
- """Test loans item permissions."""
9
-
10
- import json
11
- from copy import deepcopy
12
-
13
- from flask import url_for
14
-
15
- from tests.helpers import user_login
16
-
17
- NEW_LOAN = {
18
- "item_pid": {"type": "pitmid", "value": "itemid-1"},
19
- "document_pid": "docid-1",
20
- "patron_pid": "1",
21
- "transaction_location_pid": "locid-1",
22
- "pickup_location_pid": "locid-1",
23
- }
24
-
25
-
26
- def _fetch_loan(client, json_headers, loan):
27
- """Return the loan fetched with a REST call."""
28
- url = url_for("invenio_records_rest.loanid_item", pid_value=loan["pid"])
29
- return client.get(url, headers=json_headers)
30
-
31
-
32
- def _assert_get_loan_success(client, json_headers, loan):
33
- """Assert that GET API call succeeded."""
34
- res = _fetch_loan(client, json_headers, loan)
35
- assert res.status_code == 200
36
- data = json.loads(res.data.decode("utf-8"))["metadata"]
37
- assert data["pid"] == loan["pid"]
38
- assert data["patron_pid"] == loan["patron_pid"]
39
-
40
-
41
- def test_anonymous_cannot_get_any_loan(client, json_headers, testdata):
42
- """Test that anonymous cannot get any loan."""
43
- loan_patron1 = testdata["loans"][0]
44
- assert loan_patron1["patron_pid"] == "1"
45
- loan_patron2 = testdata["loans"][3]
46
- assert loan_patron2["patron_pid"] == "2"
47
-
48
- res = _fetch_loan(client, json_headers, loan_patron1)
49
- assert res.status_code == 401
50
- res = _fetch_loan(client, json_headers, loan_patron2)
51
- assert res.status_code == 401
52
-
53
-
54
- def test_admin_or_librarian_can_get_any_loan(
55
- client, json_headers, users, testdata
56
- ):
57
- """Test that admins and librarians can get any loan."""
58
- for username in ["admin", "librarian"]:
59
- user_login(client, username, users)
60
- # GET loans of Patron 1
61
- loan_patron1 = testdata["loans"][0]
62
- assert loan_patron1["patron_pid"] == "1"
63
- _assert_get_loan_success(client, json_headers, loan_patron1)
64
-
65
- # GET loans of Patron 2
66
- loan_patron2 = testdata["loans"][3]
67
- assert loan_patron2["patron_pid"] == "2"
68
- _assert_get_loan_success(client, json_headers, loan_patron2)
69
-
70
-
71
- def test_patron_can_get_only_his_loans(client, json_headers, users, testdata):
72
- """Test that patrons can get only their loans."""
73
- loan_patron1 = testdata["loans"][0]
74
- assert loan_patron1["patron_pid"] == "1"
75
-
76
- loan_patron2 = testdata["loans"][3]
77
- assert loan_patron2["patron_pid"] == "2"
78
-
79
- # Patron 1 GET his loans
80
- user_login(client, "patron1", users)
81
- _assert_get_loan_success(client, json_headers, loan_patron1)
82
- # Patron 1 GET loans of Patron 2
83
- res = _fetch_loan(client, json_headers, loan_patron2)
84
- assert res.status_code == 403
85
-
86
- # Patron 2 GET his loans
87
- user_login(client, "patron2", users)
88
- _assert_get_loan_success(client, json_headers, loan_patron2)
89
- # Patron 2 GET loans of Patron 1
90
- res = _fetch_loan(client, json_headers, loan_patron1)
91
- assert res.status_code == 403
92
-
93
-
94
- def _test_post_new_loan(client, json_headers, user_id, response_code):
95
- """Test POST new loan."""
96
- url = url_for("invenio_records_rest.loanid_list")
97
- params = deepcopy(NEW_LOAN)
98
- params["transaction_user_pid"] = user_id
99
- res = client.post(url, headers=json_headers, data=json.dumps(params))
100
- assert res.status_code == response_code
101
- if res.status_code == 201:
102
- data = json.loads(res.data.decode("utf-8"))["metadata"]
103
- return data["pid"]
104
-
105
-
106
- def _test_replace_existing_loan(
107
- client, json_headers, user_id, loanid, response_code
108
- ):
109
- """Test PUT existing loan."""
110
- url = url_for("invenio_records_rest.loanid_item", pid_value=loanid)
111
- params = deepcopy(NEW_LOAN)
112
- params["transaction_user_pid"] = user_id
113
- res = client.put(url, headers=json_headers, data=json.dumps(params))
114
- assert res.status_code == response_code
115
-
116
-
117
- def _test_delete_existing_loan(client, json_headers, loanid, response_code):
118
- """Test DELETE existing loan."""
119
- url = url_for("invenio_records_rest.loanid_item", pid_value=loanid)
120
- res = client.delete(url, headers=json_headers)
121
- assert res.status_code == response_code
122
-
123
-
124
- def test_anonymous_cannot_update_loans(client, json_headers, testdata):
125
- """Test that anonymous cannot update loans."""
126
- loanid = "loanid-1"
127
- _test_post_new_loan(client, json_headers, user_id="", response_code=401)
128
- _test_replace_existing_loan(
129
- client, json_headers, user_id="", loanid=loanid, response_code=401
130
- )
131
-
132
-
133
- def test_patron_cannot_update_loans(client, json_headers, users, testdata):
134
- """Test that patrons cannot update loans."""
135
- loanid = "loanid-1"
136
- user = user_login(client, "patron1", users)
137
- _test_post_new_loan(client, json_headers, user.id, 403)
138
- _test_replace_existing_loan(client, json_headers, user.id, loanid, 403)
139
- _test_delete_existing_loan(client, json_headers, loanid, 403)
@@ -1,26 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2019 CERN.
4
- #
5
- # Invenio-Circulation 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
- """Tests for loan item resolver."""
9
-
10
- from invenio_circulation.api import Loan
11
-
12
-
13
- def test_loan_item_resolver(app, testdata):
14
- """Test item resolving from loan."""
15
- loan_pid = testdata["loans"][1]["pid"]
16
- loan = Loan.get_record_by_pid(loan_pid)
17
- loan = loan.replace_refs()
18
- assert loan["item"]["pid"] == loan["item_pid"]["value"]
19
-
20
-
21
- def test_loan_item_resolver_for_empty_item_pid(app, testdata):
22
- """Test item resolving from loan."""
23
- loan_pid = testdata["loans"][0]["pid"]
24
- loan = Loan.get_record_by_pid(loan_pid)
25
- loan = loan.replace_refs()
26
- assert loan["item"] == dict()
@@ -1,104 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2018-2020 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
- """Test loans list permissions."""
9
-
10
- import json
11
-
12
- from flask import url_for
13
-
14
- from tests.helpers import user_login, user_logout
15
-
16
-
17
- def _search_loans(client, json_headers, **kwargs):
18
- """Return the loan fetched with a REST call."""
19
- url = url_for("invenio_records_rest.loanid_list", **kwargs)
20
- return client.get(url, headers=json_headers)
21
-
22
-
23
- def test_anonymous_cannot_search_any_loan(client, json_headers, users):
24
- """Test that anonymous cannot search any loan in search results."""
25
- res = _search_loans(client, json_headers)
26
- assert res.status_code == 401
27
-
28
-
29
- def test_admin_or_librarian_can_search_any_loan(
30
- client, json_headers, users, testdata
31
- ):
32
- """Test that admins and librarians can search any loan."""
33
- for username in ["admin", "librarian"]:
34
- user_login(client, username, users)
35
- res = _search_loans(client, json_headers)
36
- assert res.status_code == 200
37
- hits = json.loads(res.data.decode("utf-8"))
38
- assert len(hits["hits"]["hits"]) == len(testdata["loans"])
39
-
40
-
41
- def test_patrons_can_search_their_own_loans(
42
- client, json_headers, users, testdata
43
- ):
44
- """Test that patrons can search their own loans."""
45
-
46
- def _validate_only_patron_loans(res, user, state):
47
- """Assert that result loans belong to the given user only."""
48
- patron_loans = [
49
- loan
50
- for loan in testdata["loans"]
51
- if loan["patron_pid"] == str(user.id) and loan["state"] == state
52
- ]
53
-
54
- assert res.status_code == 200
55
- hits = json.loads(res.data.decode("utf-8"))
56
- assert len(hits["hits"]["hits"]) == len(patron_loans)
57
- for hit in hits["hits"]["hits"]:
58
- assert hit["metadata"]["patron_pid"] == str(user.id)
59
-
60
- state = "PENDING"
61
- for username in ["patron1", "patron2"]:
62
- user = user_login(client, username, users)
63
- # search with no params
64
- res = _search_loans(client, json_headers, state=state)
65
- _validate_only_patron_loans(res, user, state)
66
-
67
- # search with params
68
- res = _search_loans(
69
- client,
70
- json_headers,
71
- state=state, # test extra query
72
- q="patron_pid:{}".format(str(user.id)),
73
- )
74
- _validate_only_patron_loans(res, user, state)
75
-
76
-
77
- def test_patrons_cannot_search_other_loans(
78
- client, json_headers, users, testdata
79
- ):
80
- """Test that patrons cannot search for loans of other patrons."""
81
- user_login(client, "patron1", users)
82
- res = _search_loans(
83
- client,
84
- json_headers,
85
- state="PENDING", # test extra query
86
- q="patron_pid:{}".format(str(users["patron2"].id)),
87
- )
88
- assert res.status_code == 403
89
-
90
-
91
- def test_most_loaned_permissions(client, json_headers, users, testdata):
92
- """Test that only the backoffice is able to list the most loaned items."""
93
- url = url_for("invenio_app_ils_circulation_stats.most-loaned")
94
- tests = [
95
- ("admin", 200),
96
- ("librarian", 200),
97
- ("patron1", 403),
98
- ("anonymous", 401),
99
- ]
100
- for username, status in tests:
101
- user_login(client, username, users)
102
- res = client.get(url, headers=json_headers)
103
- assert res.status_code == status
104
- user_logout(client)
@@ -1,38 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2019-2020 CERN.
4
- #
5
- # Invenio-Circulation 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
- """Tests for loan patron resolver."""
9
-
10
- from invenio_circulation.api import Loan
11
-
12
-
13
- def test_loan_patron_resolver(app, testdata):
14
- """Test item resolving from loan."""
15
- loan_pid = testdata["loans"][0]["pid"]
16
- loan = Loan.get_record_by_pid(loan_pid)
17
- loan = loan.replace_refs()
18
- assert loan["patron_pid"] == loan["patron"]["id"]
19
-
20
-
21
- def test_loan_patron_resolver_for_non_existing_patron_pid(app, testdata):
22
- """Test item resolving from loan."""
23
- AnonymousPatron = app.config["ILS_PATRON_ANONYMOUS_CLASS"]
24
- loan_pid = testdata["loans"][6]["pid"]
25
- loan = Loan.get_record_by_pid(loan_pid)
26
- loan = loan.replace_refs()
27
- assert loan["patron_pid"] == str(20)
28
- assert loan["patron"]["id"] == str(AnonymousPatron.id)
29
- assert loan["patron"]["name"] == "anonymous"
30
-
31
-
32
- def test_loan_patron_resolver_for_anonymous_patron_pid(app, testdata):
33
- """Test item resolving from loan."""
34
- loan_pid = testdata["loans"][7]["pid"]
35
- loan = Loan.get_record_by_pid(loan_pid)
36
- loan = loan.replace_refs()
37
- assert loan["patron_pid"] == loan["patron"]["id"]
38
- assert loan["patron"]["name"] == "anonymous"
@@ -1,234 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2019-2020 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
- """Test loans item permissions."""
9
-
10
- import json
11
- from copy import deepcopy
12
- from datetime import timedelta
13
-
14
- import arrow
15
- from flask import url_for
16
- from invenio_search import current_search
17
-
18
- from tests.helpers import user_login
19
-
20
- NEW_LOAN = {
21
- "document_pid": "CHANGE ME IN EACH TEST",
22
- "patron_pid": "3",
23
- "transaction_location_pid": "locid-1",
24
- "pickup_location_pid": "locid-1",
25
- "delivery": {"method": "PICKUP"},
26
- "request_start_date": "2019-09-10",
27
- "request_expire_date": "2019-09-20",
28
- }
29
-
30
-
31
- def test_anonymous_cannot_request_loan(client, json_headers, testdata):
32
- """Test that anonymous users cannot request a loan."""
33
- url = url_for("invenio_app_ils_circulation.loan_request")
34
- res = client.post(url, headers=json_headers, data=json.dumps(NEW_LOAN))
35
- assert res.status_code == 401
36
-
37
-
38
- def test_patron_can_request_loan(client, json_headers, users, testdata):
39
- """Test that a patron can request a loan."""
40
- url = url_for("invenio_app_ils_circulation.loan_request")
41
- user = user_login(client, "patron1", users)
42
- params = deepcopy(NEW_LOAN)
43
- params["document_pid"] = "docid-3"
44
- params["transaction_user_pid"] = str(user.id)
45
- res = client.post(url, headers=json_headers, data=json.dumps(params))
46
- assert res.status_code == 202
47
- loan = res.get_json()["metadata"]
48
- assert loan["state"] == "PENDING"
49
- assert loan["document_pid"] == params["document_pid"]
50
- assert loan["transaction_date"]
51
-
52
-
53
- def test_patron_can_cancel_loan(
54
- client, json_headers, users, testdata, app_config
55
- ):
56
- """Test that a patron can cancel its own loan."""
57
- url = url_for("invenio_app_ils_circulation.loan_request")
58
- user = user_login(client, "patron3", users)
59
- params = deepcopy(NEW_LOAN)
60
- params["document_pid"] = "docid-3"
61
- params["transaction_user_pid"] = str(user.id)
62
-
63
- # Create a Loan
64
- res = client.post(url, headers=json_headers, data=json.dumps(params))
65
- loan = res.get_json()
66
-
67
- cancel_url = loan["links"]["actions"]["cancel"]
68
- meta = loan["metadata"]
69
- payload = {
70
- "document_pid": meta["document_pid"],
71
- "patron_pid": meta["patron_pid"],
72
- "transaction_location_pid": meta["transaction_location_pid"],
73
- "transaction_user_pid": meta["transaction_user_pid"],
74
- "cancel_reason": "USER_CANCEL",
75
- }
76
- assert res.status_code == 202
77
-
78
- # Try to cancel a loan that belongs to patron3 as patron1
79
- user_login(client, "patron1", users)
80
- cancel_res = client.post(
81
- cancel_url, headers=json_headers, data=json.dumps(payload)
82
- )
83
- assert cancel_res.status_code == 403
84
-
85
- # Try to cancel a loan that belongs to patron3 as patron3
86
- user_login(client, "patron3", users)
87
- cancel_res = client.post(
88
- cancel_url, headers=json_headers, data=json.dumps(payload)
89
- )
90
- assert cancel_res.status_code == 202
91
-
92
-
93
- def test_patron_can_request_loan_with_or_without_end_date(
94
- app, client, json_headers, users, testdata
95
- ):
96
- """Test that a patron can request a loan [with/without] end date."""
97
- url = url_for("invenio_app_ils_circulation.loan_request")
98
- user = user_login(client, "patron1", users)
99
-
100
- now = arrow.utcnow()
101
- start_date = (now + timedelta(days=3)).date().isoformat()
102
- end_date = (now + timedelta(days=15)).date().isoformat()
103
-
104
- # it should succeed when start/end dates provided
105
- params = deepcopy(NEW_LOAN)
106
- params["document_pid"] = "docid-2"
107
- params["request_start_date"] = start_date
108
- params["request_expire_date"] = end_date
109
- params["transaction_user_pid"] = str(user.id)
110
- res = client.post(url, headers=json_headers, data=json.dumps(params))
111
- assert res.status_code == 202
112
- loan = res.get_json()["metadata"]
113
- assert loan["state"] == "PENDING"
114
- assert loan["document_pid"] == params["document_pid"]
115
- assert loan["request_start_date"] == start_date
116
- assert loan["request_expire_date"] == end_date
117
- assert loan["transaction_date"]
118
-
119
- # it should fail when wrong date provided
120
- params = deepcopy(NEW_LOAN)
121
- past_end_date = now - timedelta(days=30)
122
- params["request_expire_date"] = past_end_date.date().isoformat()
123
- params["transaction_user_pid"] = str(user.id)
124
- res = client.post(url, headers=json_headers, data=json.dumps(params))
125
- assert res.status_code == 400
126
-
127
- # it should fail when request duration over max
128
- params = deepcopy(NEW_LOAN)
129
- days = app.config["ILS_CIRCULATION_LOAN_REQUEST_DURATION_DAYS"]
130
- past_end_date = now + timedelta(days=days + 1)
131
- params["request_expire_date"] = past_end_date.date().isoformat()
132
- params["transaction_user_pid"] = str(user.id)
133
- res = client.post(url, headers=json_headers, data=json.dumps(params))
134
- assert res.status_code == 400
135
-
136
- # it should fail when request start/end date not provided
137
- params = deepcopy(NEW_LOAN)
138
- params["document_pid"] = "docid-4"
139
- params["transaction_user_pid"] = str(user.id)
140
- del params["request_start_date"]
141
- del params["request_expire_date"]
142
- res = client.post(url, headers=json_headers, data=json.dumps(params))
143
- assert res.status_code == 202
144
- loan = res.get_json()["metadata"]
145
- now = arrow.utcnow()
146
- start_date = now.date().isoformat()
147
- days = app.config["ILS_CIRCULATION_LOAN_REQUEST_DURATION_DAYS"]
148
- end_date = (now + timedelta(days=days)).date().isoformat()
149
- assert loan["request_start_date"] == start_date
150
- assert loan["request_expire_date"] == end_date
151
-
152
-
153
- def test_request_loan_with_or_without_delivery(
154
- app, client, json_headers, users, testdata
155
- ):
156
- """Test that loan request with or without delivery."""
157
- url = url_for("invenio_app_ils_circulation.loan_request")
158
- user = user_login(client, "patron1", users)
159
-
160
- previous_dev_methods = app.config["ILS_CIRCULATION_DELIVERY_METHODS"]
161
- app.config["ILS_CIRCULATION_DELIVERY_METHODS"] = {}
162
- params = deepcopy(NEW_LOAN)
163
- params["document_pid"] = "docid-12"
164
- params["transaction_user_pid"] = str(user.id)
165
- del params["delivery"]
166
- res = client.post(url, headers=json_headers, data=json.dumps(params))
167
- assert res.status_code == 202
168
-
169
- app.config["ILS_CIRCULATION_DELIVERY_METHODS"] = {
170
- "TEST_METHOD1": "",
171
- "TEST_METHOD2": "",
172
- }
173
- params = deepcopy(NEW_LOAN)
174
- params["document_pid"] = "docid-6"
175
- params["delivery"] = {"method": "TEST_METHOD1"}
176
- params["transaction_user_pid"] = str(user.id)
177
- res = client.post(url, headers=json_headers, data=json.dumps(params))
178
- assert res.status_code == 202
179
-
180
- app.config["ILS_CIRCULATION_DELIVERY_METHODS"] = {"TEST_METHOD": ""}
181
- params = deepcopy(NEW_LOAN)
182
- params["transaction_user_pid"] = str(user.id)
183
- del params["delivery"]
184
- res = client.post(url, headers=json_headers, data=json.dumps(params))
185
- assert res.status_code == 400
186
- assert res.get_json()["message"] == "Validation error."
187
-
188
- app.config["ILS_CIRCULATION_DELIVERY_METHODS"] = {"TEST_METHOD": ""}
189
- params = deepcopy(NEW_LOAN)
190
- params["delivery"] = {"method": "NON_EXISTING_METHOD"}
191
- params["transaction_user_pid"] = str(user.id)
192
- res = client.post(url, headers=json_headers, data=json.dumps(params))
193
- assert res.status_code == 400
194
- assert res.get_json()["message"] == "Validation error."
195
-
196
- # restore
197
- app.config["ILS_CIRCULATION_DELIVERY_METHODS"] = previous_dev_methods
198
-
199
-
200
- def test_request_loan_with_active_loan_or_loan_request(
201
- app, client, json_headers, users, testdata
202
- ):
203
- """Test that a patron cannot request a loan with already an active loan or
204
- a loan request on the same document.
205
- """
206
- # Try to request document with already a loan request
207
- url = url_for("invenio_app_ils_circulation.loan_request")
208
- user = user_login(client, "patron1", users)
209
- params = deepcopy(NEW_LOAN)
210
- params["document_pid"] = "docid-3"
211
- params["transaction_user_pid"] = str(user.id)
212
- res = client.post(url, headers=json_headers, data=json.dumps(params))
213
- assert res.status_code == 202
214
- current_search.flush_and_refresh(index="*")
215
- res = client.post(url, headers=json_headers, data=json.dumps(params))
216
- assert res.status_code == 400
217
-
218
- # Try to request document with already an active loan
219
- user_login(client, "librarian", users)
220
- url = url_for("invenio_app_ils_circulation.loan_checkout")
221
- params = deepcopy(NEW_LOAN)
222
- params["document_pid"] = "docid-3"
223
- params["transaction_user_pid"] = str(users["librarian"].id)
224
- params["item_pid"] = dict(type="pitmid", value="itemid-60")
225
- res = client.post(url, headers=json_headers, data=json.dumps(params))
226
- assert res.status_code == 202
227
- current_search.flush_and_refresh(index="*")
228
- url = url_for("invenio_app_ils_circulation.loan_request")
229
- user = user_login(client, "patron1", users)
230
- params = deepcopy(NEW_LOAN)
231
- params["document_pid"] = "docid-3"
232
- params["transaction_user_pid"] = str(user.id)
233
- res = client.post(url, headers=json_headers, data=json.dumps(params))
234
- assert res.status_code == 400