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,106 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 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 documents REST APIs permissions."""
9
-
10
- import json
11
-
12
- from flask import url_for
13
- from invenio_db import db
14
- from invenio_indexer.api import RecordIndexer
15
- from invenio_search import current_search
16
-
17
- from invenio_app_ils.documents.api import Document
18
- from tests.helpers import user_login
19
-
20
-
21
- def test_open_access_permissions(client, json_headers, testdata, users):
22
- """Test GET open/close access documents."""
23
- # set the documents to have read access only by patron2. `_access` should
24
- # be totally ignored.
25
- indexer = RecordIndexer()
26
- doc1 = Document.get_record_by_pid("docid-open-access")
27
- doc2 = Document.get_record_by_pid("docid-closed-access")
28
- for doc in [doc1, doc2]:
29
- doc.update(dict(_access=dict(read=["patron2"])))
30
- doc.commit()
31
- db.session.commit()
32
- indexer.index(doc)
33
- current_search.flush_and_refresh(index="documents")
34
-
35
- test_data = [
36
- ("anonymous", "docid-open-access", 200, 1),
37
- ("patron1", "docid-open-access", 200, 1),
38
- ("patron2", "docid-open-access", 200, 1),
39
- ("librarian", "docid-open-access", 200, 1),
40
- ("admin", "docid-open-access", 200, 1),
41
- ("anonymous", "docid-closed-access", 401, 0),
42
- ("patron1", "docid-closed-access", 403, 0),
43
- ("patron2", "docid-closed-access", 403, 0),
44
- ("librarian", "docid-closed-access", 200, 1),
45
- ("admin", "docid-closed-access", 200, 1),
46
- ]
47
- for user, pid, status_code, n_hits in test_data:
48
- # item endpoint
49
- user_login(client, user, users)
50
- url = url_for("invenio_records_rest.docid_item", pid_value=pid)
51
- res = client.get(url, headers=json_headers)
52
- assert res.status_code == status_code
53
-
54
- # list endpoint
55
- user_login(client, user, users)
56
- url = url_for(
57
- "invenio_records_rest.docid_list", q="pid:{}".format(pid)
58
- )
59
- res = client.get(url, headers=json_headers)
60
- hits = json.loads(res.data.decode("utf-8"))
61
- assert hits["hits"]["total"] == n_hits
62
-
63
-
64
- def test_access_permissions(
65
- client, json_headers, testdata, users, with_access
66
- ):
67
- """Test GET documents with `_access` ignoring `restricted`."""
68
- # set the documents to have read access only by patron2. `_access` should
69
- # be taken into account and take precedence over `restricted`.
70
- indexer = RecordIndexer()
71
- doc1 = Document.get_record_by_pid("docid-open-access")
72
- doc2 = Document.get_record_by_pid("docid-closed-access")
73
- for doc in [doc1, doc2]:
74
- doc.update(dict(_access=dict(read=[users["patron2"].id])))
75
- doc.commit()
76
- db.session.commit()
77
- indexer.index(doc)
78
- current_search.flush_and_refresh(index="documents")
79
-
80
- test_data = [
81
- ("anonymous", "docid-open-access", 401, 0),
82
- ("patron1", "docid-open-access", 403, 0),
83
- ("patron2", "docid-open-access", 200, 1), # should have access
84
- ("librarian", "docid-open-access", 200, 1),
85
- ("admin", "docid-open-access", 200, 1),
86
- ("anonymous", "docid-closed-access", 401, 0),
87
- ("patron1", "docid-closed-access", 403, 0),
88
- ("patron2", "docid-closed-access", 200, 1), # should have access
89
- ("librarian", "docid-closed-access", 200, 1),
90
- ("admin", "docid-closed-access", 200, 1),
91
- ]
92
- for user, pid, status_code, n_hits in test_data:
93
- # item endpoint
94
- user_login(client, user, users)
95
- url = url_for("invenio_records_rest.docid_item", pid_value=pid)
96
- res = client.get(url, headers=json_headers)
97
- assert res.status_code == status_code
98
-
99
- # list endpoint
100
- user_login(client, user, users)
101
- url = url_for(
102
- "invenio_records_rest.docid_list", q="pid:{}".format(pid)
103
- )
104
- res = client.get(url, headers=json_headers)
105
- hits = json.loads(res.data.decode("utf-8"))
106
- assert hits["hits"]["total"] == n_hits
@@ -1,35 +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 document resolvers."""
9
-
10
- from invenio_app_ils.documents.api import Document
11
-
12
-
13
- def test_document_resolvers(app, testdata):
14
- """Test item resolving from loan."""
15
- doc_pid = testdata["documents"][0]["pid"]
16
- document = Document.get_record_by_pid(doc_pid)
17
- document = document.replace_refs()
18
-
19
- # relations
20
- assert "relations" in document
21
-
22
- # circulation
23
- assert "active_loans_count" in document["circulation"]
24
- assert "pending_loans_count" in document["circulation"]
25
- assert "overdue_loans_count" in document["circulation"]
26
- assert "past_loans_count" in document["circulation"]
27
-
28
- # item and eitems
29
- assert document["items"]["total"] == 9 and document["items"]["hits"]
30
- assert document["eitems"]["total"] == 3 and document["eitems"]["hits"]
31
-
32
- # stock
33
- mediums = set([item["medium"] for item in document["items"]["hits"]])
34
- mediums.add("E-BOOK")
35
- assert set(document["stock"]["mediums"]) == mediums
@@ -1,8 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 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
- """Eitems API Tests."""
@@ -1,41 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2021 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 eitems CRUD."""
9
-
10
- import pytest
11
-
12
- from invenio_app_ils.eitems.api import EItem
13
- from invenio_app_ils.errors import DocumentNotFoundError
14
-
15
-
16
- def test_eitem_refs(app, testdata):
17
- """Test creation of an eitem."""
18
- eitem = EItem.create(
19
- dict(
20
- pid="eitemid-99",
21
- document_pid="docid-1",
22
- created_by=dict(type="script", value="demo"),
23
- )
24
- )
25
- assert "$schema" in eitem
26
- assert "document" in eitem and "$ref" in eitem["document"]
27
-
28
- eitem = EItem.get_record_by_pid("eitemid-4")
29
- eitem = eitem.replace_refs()
30
- assert "document" in eitem and eitem["document"]["title"]
31
-
32
-
33
- def test_eitem_validation(db, testdata):
34
- """Test validation when updating an eitem."""
35
- eitem_pid = testdata["eitems"][0]["pid"]
36
- eitem = EItem.get_record_by_pid(eitem_pid)
37
-
38
- # change document pid
39
- eitem["document_pid"] = "not_found_doc"
40
- with pytest.raises(DocumentNotFoundError):
41
- eitem.commit()
@@ -1,84 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 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 Eitems permissions."""
9
-
10
- import json
11
-
12
- from flask import url_for
13
-
14
- from tests.helpers import user_login
15
-
16
- _HTTP_OK = [200, 201, 204]
17
- EITEM_PID = "eitemid-1"
18
- ITEM_ENDPOINT = "invenio_records_rest.eitmid_item"
19
- LIST_ENDPOINT = "invenio_records_rest.eitmid_list"
20
-
21
-
22
- def test_eitems_permissions(client, testdata, json_headers, users):
23
- """Test eitems endpoints permissions."""
24
- dummy_eitem = dict(
25
- document_pid="docid-1",
26
- internal_notes="An internal note",
27
- description="Description of the electronic item",
28
- open_access=True,
29
- )
30
- tests = [
31
- ("admin", _HTTP_OK, dummy_eitem),
32
- ("librarian", _HTTP_OK, dummy_eitem),
33
- ("patron1", [403], dummy_eitem),
34
- ("anonymous", [401], dummy_eitem),
35
- ]
36
-
37
- def _test_list(expected_status):
38
- """Test get list."""
39
- url = url_for(LIST_ENDPOINT)
40
- res = client.get(url, headers=json_headers)
41
- assert res.status_code in expected_status
42
-
43
- def _test_create(expected_status, data):
44
- """Test record creation."""
45
- url = url_for(LIST_ENDPOINT)
46
- res = client.post(url, headers=json_headers, data=json.dumps(data))
47
- assert res.status_code in expected_status
48
-
49
- if res.status_code < 400:
50
- record = res.get_json()["metadata"]
51
- assert record
52
- return record["pid"]
53
-
54
- def _test_update(expected_status, data, pid):
55
- """Test record update."""
56
- pid_value = pid or EITEM_PID
57
- url = url_for(ITEM_ENDPOINT, pid_value=pid_value)
58
- res = client.put(url, headers=json_headers, data=json.dumps(data))
59
- assert res.status_code in expected_status
60
- if res.status_code < 400:
61
- record = res.get_json()["metadata"]
62
- assert record
63
-
64
- def _test_read(expected_status, pid):
65
- """Test record read."""
66
- pid_value = pid or EITEM_PID
67
- url = url_for(ITEM_ENDPOINT, pid_value=pid_value)
68
- res = client.get(url, headers=json_headers)
69
- assert res.status_code in expected_status
70
-
71
- def _test_delete(expected_status, pid):
72
- """Test record delete."""
73
- pid_value = pid or EITEM_PID
74
- url = url_for(ITEM_ENDPOINT, pid_value=pid_value)
75
- res = client.delete(url, headers=json_headers)
76
- assert res.status_code in expected_status
77
-
78
- for username, expected_status, data in tests:
79
- user_login(client, username, users)
80
- _test_list(expected_status)
81
- pid = _test_create(expected_status, data)
82
- _test_update(expected_status, data, pid)
83
- _test_read(expected_status, pid)
84
- _test_delete(expected_status, pid)
@@ -1,172 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2019 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 files."""
9
-
10
- import json
11
-
12
- from flask import url_for
13
- from invenio_search import current_search
14
- from six import BytesIO
15
-
16
- from tests.helpers import user_login
17
-
18
-
19
- def _test_response(
20
- client,
21
- req_method,
22
- url,
23
- headers,
24
- data,
25
- expected_resp_code,
26
- input_stream=None,
27
- ):
28
- """Util function testing response code."""
29
- kwargs = {}
30
- if input_stream:
31
- kwargs["input_stream"] = input_stream
32
- if data:
33
- res = getattr(client, req_method)(
34
- url, headers=headers, data=json.dumps(data), **kwargs
35
- )
36
- else:
37
- res = getattr(client, req_method)(url, headers=headers, **kwargs)
38
- assert expected_resp_code == res.status_code
39
- return res
40
-
41
-
42
- def _test_data_exists(key, res):
43
- """Util function for testing output data."""
44
- data = json.loads(res.data.decode("utf-8"))["metadata"]
45
- assert key in data
46
-
47
-
48
- def test_create_bucket_endpoint(
49
- client, json_headers, location, testdata, users
50
- ):
51
- """Test GET permissions."""
52
- user_login(client, "admin", users)
53
-
54
- url_with_bucket_id = url_for(
55
- "invenio_app_ils_files.eitmid_bucket", pid_value="eitemid-3"
56
- )
57
- url_without_bucket_id = url_for(
58
- "invenio_app_ils_files.eitmid_bucket", pid_value="eitemid-4"
59
- )
60
-
61
- res1 = _test_response(
62
- client, "post", url_with_bucket_id, json_headers, None, 200
63
- )
64
- _test_data_exists("bucket_id", res1)
65
- res2 = _test_response(
66
- client, "post", url_without_bucket_id, json_headers, None, 201
67
- )
68
- _test_data_exists("bucket_id", res2)
69
-
70
-
71
- def test_create_bucket_permissions(
72
- client, json_headers, location, testdata, users
73
- ):
74
- """Test create bucket permissions."""
75
- url = url_for("invenio_app_ils_files.eitmid_bucket", pid_value="eitemid-1")
76
- _test_response(client, "post", url, json_headers, None, 401)
77
-
78
- test_data = [
79
- ("admin", "eitemid-1", 201),
80
- ("librarian", "eitemid-2", 201),
81
- ("patron1", "eitemid-2", 403),
82
- ]
83
- for user, pid, status_code in test_data:
84
- user_login(client, user, users)
85
- url = url_for("invenio_app_ils_files.eitmid_bucket", pid_value=pid)
86
- _test_response(client, "post", url, json_headers, None, status_code)
87
-
88
-
89
- def test_upload_files_permissions(
90
- client, json_headers, bucket, testdata, users
91
- ):
92
- """Test upload files permissions."""
93
- filename = "myfile.txt"
94
- data = b"hello world"
95
- url = url_for(
96
- "invenio_files_rest.object_api", bucket_id=str(bucket.id), key=filename
97
- )
98
-
99
- test_data = [
100
- ("anonymous", 404),
101
- ("admin", 200),
102
- ("librarian", 200),
103
- ("patron1", 404),
104
- ]
105
- for user, status_code in test_data:
106
- user_login(client, user, users)
107
- _test_response(
108
- client,
109
- "put",
110
- url,
111
- json_headers,
112
- None,
113
- status_code,
114
- input_stream=BytesIO(data),
115
- )
116
-
117
-
118
- def test_download_files_permissions(
119
- client, json_headers, location, testdata, users
120
- ):
121
- """Test download files permissions."""
122
-
123
- tests = [
124
- (
125
- "eitemid-4",
126
- [
127
- ("anonymous", 200),
128
- ("admin", 200),
129
- ("librarian", 200),
130
- ("patron1", 200),
131
- ],
132
- ),
133
- (
134
- "eitemid-5",
135
- [
136
- ("anonymous", 404),
137
- ("admin", 200),
138
- ("librarian", 200),
139
- ("patron1", 200),
140
- ],
141
- ),
142
- ]
143
-
144
- for pid, expected in tests:
145
- # Create e-item bucket
146
- user_login(client, "admin", users)
147
- url = url_for("invenio_app_ils_files.eitmid_bucket", pid_value=pid)
148
- res = _test_response(client, "post", url, json_headers, None, 201)
149
- bucket_id = json.loads(res.data)["metadata"]["bucket_id"]
150
-
151
- # Upload file to e-item bucket
152
- filename = "myfile.txt"
153
- data = b"hello world"
154
- url = url_for(
155
- "invenio_files_rest.object_api", bucket_id=bucket_id, key=filename
156
- )
157
- _test_response(
158
- client,
159
- "put",
160
- url,
161
- json_headers,
162
- None,
163
- 200,
164
- input_stream=BytesIO(data),
165
- )
166
-
167
- current_search.flush_and_refresh(index="eitems")
168
-
169
- # Download file
170
- for user, status_code in expected:
171
- user_login(client, user, users)
172
- _test_response(client, "get", url, None, None, status_code)
@@ -1,8 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 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
- """Items API Tests."""
@@ -1,43 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 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 Items APIs."""
9
-
10
- from invenio_app_ils.items.api import (
11
- ITEM_PID_TYPE,
12
- get_document_pid_by_item_pid,
13
- get_item_pids_by_document_pid,
14
- item_exists,
15
- )
16
-
17
-
18
- def test_get_item_pids_by_document_pid(testdata):
19
- """Test retrieve Items PIDs for the given Document PID."""
20
- first_doc_pid = testdata["documents"][0]["pid"]
21
- items_pids = get_item_pids_by_document_pid(first_doc_pid)
22
- assert len(list(items_pids)) == 9
23
-
24
-
25
- def test_get_document_pid_by_item_pid(testdata):
26
- """Test retrieve Document PID for the given Item."""
27
- first_item_pid = testdata["items"][0]["pid"]
28
- item_pid = dict(type=ITEM_PID_TYPE, value=first_item_pid)
29
- doc_pid = get_document_pid_by_item_pid(item_pid)
30
- assert doc_pid == "docid-1"
31
-
32
-
33
- def test_item_exists(testdata):
34
- """Test return True if item exists."""
35
- first_item_pid = testdata["items"][0]["pid"]
36
- item_pid = dict(type=ITEM_PID_TYPE, value=first_item_pid)
37
- assert item_exists(item_pid)
38
-
39
-
40
- def test_item_not_exist(testdata):
41
- """Test return False if item does not exist."""
42
- item_pid = dict(type=ITEM_PID_TYPE, value="not-existing-item-pid")
43
- assert not item_exists(item_pid)
@@ -1,60 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2021 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 items CRUD."""
9
-
10
- from copy import deepcopy
11
-
12
- import pytest
13
-
14
- from invenio_app_ils.errors import (
15
- DocumentNotFoundError,
16
- InternalLocationNotFoundError,
17
- )
18
- from invenio_app_ils.items.api import Item
19
-
20
-
21
- def test_item_refs(app, testdata):
22
- """Test creation of an item."""
23
- item = Item.create(
24
- dict(
25
- pid="itemid-99",
26
- document_pid="docid-1",
27
- internal_location_pid="ilocid-4",
28
- created_by=dict(type="script", value="demo"),
29
- barcode="348048",
30
- status="CAN_CIRCULATE",
31
- circulation_restriction="NO_RESTRICTION",
32
- medium="PAPER",
33
- )
34
- )
35
- assert "$schema" in item
36
- assert "document" in item and "$ref" in item["document"]
37
- assert "internal_location" in item and "$ref" in item["internal_location"]
38
-
39
- item = Item.get_record_by_pid("itemid-1")
40
- item = item.replace_refs()
41
- assert "document" in item and item["document"]["title"]
42
- assert "internal_location" in item and item["internal_location"]["name"]
43
-
44
-
45
- def test_item_validation(db, testdata):
46
- """Test validation when updating an item."""
47
- item_pid = testdata["items"][0]["pid"]
48
- orginal_item = Item.get_record_by_pid(item_pid)
49
-
50
- # change document pid
51
- item = deepcopy(orginal_item)
52
- item["document_pid"] = "not_found_doc"
53
- with pytest.raises(DocumentNotFoundError):
54
- item.commit()
55
-
56
- # change internal location pid
57
- item = deepcopy(orginal_item)
58
- item["internal_location_pid"] = "not_found_pid"
59
- with pytest.raises(InternalLocationNotFoundError):
60
- item.commit()
@@ -1,107 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2018 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 accessibility of resource endpoints."""
9
-
10
- import copy
11
- import json
12
-
13
- from flask import url_for
14
-
15
- from tests.helpers import user_login, validate_response
16
-
17
- _HTTP_OK = [200, 201, 204]
18
- ITEM_PID = "itemid-1"
19
- ITEM_ENDPOINT = "invenio_records_rest.pitmid_item"
20
- LIST_ENDPOINT = "invenio_records_rest.pitmid_list"
21
-
22
-
23
- def test_items_permissions(client, testdata, item_record, json_headers, users):
24
- """Test items endpoints permissions."""
25
- dummy_item = copy.deepcopy(item_record)
26
- tests = [
27
- ("admin", _HTTP_OK, dummy_item),
28
- ("librarian", _HTTP_OK, dummy_item),
29
- ("patron1", [403], dummy_item),
30
- ("anonymous", [401], dummy_item),
31
- ]
32
-
33
- def _test_list(expected_status):
34
- """Test get list."""
35
- url = url_for(LIST_ENDPOINT)
36
- res = client.get(url, headers=json_headers)
37
- assert res.status_code in expected_status
38
-
39
- def _test_create(expected_status, data):
40
- """Test record creation."""
41
- url = url_for(LIST_ENDPOINT)
42
- res = client.post(url, headers=json_headers, data=json.dumps(data))
43
- assert res.status_code in expected_status
44
-
45
- if res.status_code < 400:
46
- record = res.get_json()["metadata"]
47
- return record["pid"]
48
-
49
- def _test_update(expected_status, data, pid):
50
- """Test record update."""
51
- pid_value = pid or ITEM_PID
52
- url = url_for(ITEM_ENDPOINT, pid_value=pid_value)
53
- res = client.put(url, headers=json_headers, data=json.dumps(data))
54
- assert res.status_code in expected_status
55
- if res.status_code < 400:
56
- record = res.get_json()["metadata"]
57
-
58
- def _test_read(expected_status, pid):
59
- """Test record read."""
60
- pid_value = pid or ITEM_PID
61
- url = url_for(ITEM_ENDPOINT, pid_value=pid_value)
62
- res = client.get(url, headers=json_headers)
63
- assert res.status_code in expected_status
64
-
65
- def _test_delete(expected_status, pid):
66
- """Test record delete."""
67
- pid_value = pid or ITEM_PID
68
- url = url_for(ITEM_ENDPOINT, pid_value=pid_value)
69
- res = client.delete(url, headers=json_headers)
70
- assert res.status_code in expected_status
71
-
72
- for username, expected_status, data in tests:
73
- user_login(client, username, users)
74
- _test_list(expected_status)
75
- pid = _test_create(expected_status, data)
76
- _test_update(expected_status, data, pid)
77
- _test_read(expected_status, pid)
78
- _test_delete(expected_status, pid)
79
-
80
-
81
- def test_item_circulation(client, json_headers, testdata, users):
82
- """Test item circulation filtering."""
83
-
84
- tests = [
85
- ("patron1", "itemid-56", 403, False),
86
- ("patron2", "itemid-56", 403, True),
87
- ("patron1", "itemid-57", 403, True),
88
- ("patron2", "itemid-57", 403, False),
89
- ("librarian", "itemid-56", 200, False),
90
- ("admin", "itemid-57", 200, False),
91
- ]
92
-
93
- for username, pid, expected_resp_code, filtered in tests:
94
- user_login(client, username, users)
95
- url = url_for("invenio_records_rest.pitmid_item", pid_value=pid)
96
- res = validate_response(
97
- client, "get", url, json_headers, None, expected_resp_code
98
- )
99
- if res.status_code < 400:
100
- circulation = res.json["metadata"]["circulation"]
101
- filter_keys = ["loan_pid", "patron_pid"]
102
- if filtered:
103
- for key in filter_keys:
104
- assert key not in circulation
105
- else:
106
- for key in filter_keys:
107
- assert key in circulation