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,131 +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 document requests."""
9
-
10
- import json
11
-
12
- from flask import url_for
13
-
14
- from tests.helpers import user_login
15
-
16
-
17
- def _compare_list_data(all_expected, data, user_id, is_admin):
18
- """Compare list data with expected values."""
19
- if is_admin:
20
- expected = []
21
- for pids in all_expected.values():
22
- for pid in pids:
23
- expected.append(pid)
24
- else:
25
- expected = all_expected[str(user_id)]
26
-
27
- for hit in data["hits"]["hits"]:
28
- assert hit["metadata"]["pid"] in expected
29
-
30
-
31
- def test_request_list_permissions(client, testdata, json_headers, users):
32
- """Test doc req list permissions."""
33
- url = url_for("invenio_records_rest.dreqid_list")
34
- res = client.get(url, headers=json_headers)
35
- assert res.status_code == 401
36
-
37
- requests_by_patron = {}
38
- for req in testdata["document_requests"]:
39
- if req["patron_pid"] not in requests_by_patron:
40
- requests_by_patron[req["patron_pid"]] = []
41
- requests_by_patron[req["patron_pid"]].append(req["pid"])
42
-
43
- for username in users.keys():
44
- user = user_login(client, username, users)
45
- url = url_for("invenio_records_rest.dreqid_list")
46
- res = client.get(url, headers=json_headers)
47
- assert res.status_code == 200
48
- data = json.loads(res.data.decode("utf-8"))
49
- is_admin = "librarian" in user.email or "admin" in user.email
50
- _compare_list_data(requests_by_patron, data, user.id, is_admin)
51
-
52
-
53
- def test_create_document_request(client, testdata, json_headers, users):
54
- """Test creating document requests."""
55
- tests = [
56
- (
57
- "admin",
58
- 201,
59
- dict(
60
- title="Test title",
61
- request_type="LOAN",
62
- medium="Paper",
63
- patron_pid="1",
64
- ),
65
- ),
66
- (
67
- "librarian",
68
- 400,
69
- dict(
70
- patron_pid="1",
71
- ),
72
- ),
73
- (
74
- "admin",
75
- 201,
76
- dict(
77
- patron_pid="1",
78
- title="Test",
79
- invalid_param="Test",
80
- request_type="LOAN",
81
- medium="Paper",
82
- ),
83
- ),
84
- (
85
- "librarian",
86
- 201,
87
- dict(
88
- title="Test title",
89
- patron_pid="1",
90
- request_type="BUY",
91
- medium="Paper",
92
- ),
93
- ),
94
- (
95
- "patron1",
96
- 201,
97
- dict(
98
- title="Test title",
99
- patron_pid="1",
100
- request_type="BUY",
101
- medium="Paper",
102
- ),
103
- ),
104
- (
105
- "patron2",
106
- 400,
107
- dict(
108
- title="Test title",
109
- patron_pid="1",
110
- request_type="LOAN",
111
- medium="Paper",
112
- ),
113
- ),
114
- (
115
- "patron2",
116
- 201,
117
- dict(
118
- title="Test title",
119
- patron_pid="2",
120
- request_type="LOAN",
121
- medium="Paper",
122
- ),
123
- ),
124
- ]
125
- for username, expected_status, data in tests:
126
- user_login(client, username, users)
127
- url = url_for("invenio_records_rest.dreqid_list")
128
- res = client.post(url, headers=json_headers, data=json.dumps(data))
129
- assert res.status_code == expected_status
130
- if res.status_code == 201:
131
- assert "invalid_param" not in json.loads(res.data)["metadata"]
@@ -1,177 +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 accessibility of document request resource endpoints."""
9
-
10
- from flask import url_for
11
-
12
- from tests.helpers import user_login, validate_response
13
-
14
-
15
- def test_get_document_request_endpoint(client, json_headers, testdata, users):
16
- """Test GET permissions."""
17
-
18
- tests = [
19
- ("patron1", "dreq-1", 200),
20
- ("librarian", "dreq-1", 200),
21
- ("admin", "dreq-1", 200),
22
- ("patron2", "dreq-1", 403),
23
- ("anonymous", "dreq-1", 401),
24
- ("patron2", "dreq-2", 200),
25
- ("librarian", "dreq-2", 200),
26
- ("admin", "dreq-2", 200),
27
- ("patron1", "dreq-2", 403),
28
- ("anonymous", "dreq-2", 401),
29
- ]
30
-
31
- for user, res_id, expected_resp_code in tests:
32
- user_login(client, user, users)
33
- url = url_for("invenio_records_rest.dreqid_item", pid_value=res_id)
34
- validate_response(
35
- client, "get", url, json_headers, None, expected_resp_code
36
- )
37
-
38
-
39
- def test_document_request_add_document(client, json_headers, testdata, users):
40
- """Test add document to Document Request permissions."""
41
-
42
- tests = [
43
- ("patron1", "dreq-1", 403),
44
- ("librarian", "dreq-1", 202),
45
- ("admin", "dreq-1", 202),
46
- ("anonymous", "dreq-1", 401),
47
- ]
48
-
49
- for user, res_id, expected_resp_code in tests:
50
- user_login(client, user, users)
51
- url = url_for(
52
- "invenio_app_ils_document_requests.dreqid_document",
53
- pid_value=res_id,
54
- )
55
- data = {"document_pid": "docid-1"}
56
- validate_response(
57
- client, "post", url, json_headers, data, expected_resp_code
58
- )
59
-
60
-
61
- def test_document_request_remove_document(
62
- client, json_headers, testdata, users
63
- ):
64
- """Test remove document from Document Request permissions."""
65
-
66
- tests = [
67
- ("patron1", "dreq-1", 403),
68
- ("librarian", "dreq-1", 202),
69
- ("admin", "dreq-1", 202),
70
- ("anonymous", "dreq-1", 401),
71
- ]
72
-
73
- for user, res_id, expected_resp_code in tests:
74
- user_login(client, user, users)
75
- url = url_for(
76
- "invenio_app_ils_document_requests.dreqid_document",
77
- pid_value=res_id,
78
- )
79
- data = {"document_pid": "docid-1"}
80
- validate_response(
81
- client, "delete", url, json_headers, data, expected_resp_code
82
- )
83
-
84
-
85
- def test_document_request_add_provider(client, json_headers, testdata, users):
86
- """Test add provider to Document Request permissions."""
87
-
88
- tests = [
89
- ("patron1", "dreq-1", 403),
90
- ("librarian", "dreq-1", 202),
91
- ("admin", "dreq-1", 202),
92
- ("anonymous", "dreq-1", 401),
93
- ]
94
-
95
- for user, res_id, expected_resp_code in tests:
96
- user_login(client, user, users)
97
- url = url_for(
98
- "invenio_app_ils_document_requests.dreqid_provider",
99
- pid_value=res_id,
100
- )
101
- data = {
102
- "physical_item_provider": {
103
- "pid": "acqoid-1",
104
- "pid_type": "acqoid",
105
- }
106
- }
107
- validate_response(
108
- client, "post", url, json_headers, data, expected_resp_code
109
- )
110
-
111
-
112
- def test_document_request_remove_provider(
113
- client, json_headers, testdata, users
114
- ):
115
- """Test remove provider from Document Request permissions."""
116
-
117
- tests = [
118
- ("patron1", "dreq-1", 403),
119
- ("librarian", "dreq-1", 202),
120
- ("admin", "dreq-1", 202),
121
- ("anonymous", "dreq-1", 401),
122
- ]
123
-
124
- for user, res_id, expected_resp_code in tests:
125
- user_login(client, user, users)
126
- url = url_for(
127
- "invenio_app_ils_document_requests.dreqid_provider",
128
- pid_value=res_id,
129
- )
130
- validate_response(
131
- client, "delete", url, json_headers, None, expected_resp_code
132
- )
133
-
134
-
135
- def test_document_request_accept(client, json_headers, testdata, users):
136
- """Test Document Request permissions to accept request."""
137
-
138
- tests = [
139
- ("patron1", "dreq-1", 403),
140
- ("librarian", "dreq-5", 202),
141
- ("admin", "dreq-6", 202),
142
- ("anonymous", "dreq-1", 401),
143
- ("admin", "dreq-2", 400),
144
- ]
145
-
146
- for user, res_id, expected_resp_code in tests:
147
- user_login(client, user, users)
148
- url = url_for(
149
- "invenio_app_ils_document_requests.dreqid_accept", pid_value=res_id
150
- )
151
- data = {"state": "ACCEPTED"}
152
- validate_response(
153
- client, "post", url, json_headers, data, expected_resp_code
154
- )
155
-
156
-
157
- def test_document_request_decline(client, json_headers, testdata, users):
158
- """Test Document Request permissions to decline request."""
159
-
160
- tests = [
161
- ("patron1", "dreq-1", 202),
162
- ("librarian", "dreq-5", 202),
163
- ("admin", "dreq-6", 202),
164
- ("anonymous", "dreq-1", 401),
165
- ("admin", "dreq-2", 400),
166
- ]
167
-
168
- for user, res_id, expected_resp_code in tests:
169
- user_login(client, user, users)
170
- url = url_for(
171
- "invenio_app_ils_document_requests.dreqid_decline",
172
- pid_value=res_id,
173
- )
174
- data = {"decline_reason": "USER_CANCEL"}
175
- validate_response(
176
- client, "post", url, json_headers, data, expected_resp_code
177
- )
@@ -1,36 +0,0 @@
1
- from invenio_app_ils.document_requests.notifications.api import (
2
- send_document_request_notification,
3
- )
4
-
5
-
6
- def test_notification_document_request_filter(app_with_notifs, mocker, users,
7
- testdata):
8
- """Test notification filtering."""
9
-
10
- def filter_document_request_messages(record, action, **kwargs):
11
- """Define notification filter."""
12
- if action == "decline":
13
- return False
14
- return True
15
-
16
- send_mocked = mocker.patch(
17
- "invenio_app_ils.notifications.backends.mail.send"
18
- )
19
- send_mocked.__name__ = "send"
20
- send_mocked.__annotations__ = "send"
21
- backends = mocker.patch(
22
- "invenio_app_ils.notifications.api._get_notification_backends",
23
- return_value=[send_mocked]
24
- )
25
- document_request = testdata["document_requests"][0]
26
- with app_with_notifs.app_context():
27
- # remove footer
28
- app_with_notifs.config["ILS_NOTIFICATIONS_TEMPLATES"] = {}
29
- # set filtering on the document requests
30
- app_with_notifs.config["ILS_NOTIFICATIONS_FILTER_DOCUMENT_REQUEST"]\
31
- = filter_document_request_messages
32
-
33
- send_document_request_notification(document_request, action="decline",
34
- msg_extra_ctx={})
35
-
36
- assert not send_mocked.apply_async.called
@@ -1,84 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2021 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 record CRUD."""
9
-
10
- import pytest
11
-
12
- from invenio_app_ils.errors import DocumentNotFoundError, PatronNotFoundError
13
- from invenio_app_ils.ill.api import BorrowingRequest
14
- from invenio_app_ils.ill.errors import ILLError
15
- from invenio_app_ils.providers.errors import ProviderNotFoundError
16
-
17
-
18
- def test_brw_req_refs(app, testdata):
19
- """Test creation of a borrowing request."""
20
- brw_req = BorrowingRequest.create(
21
- dict(
22
- pid="illlid-99",
23
- document_pid="docid-1",
24
- patron_pid="1",
25
- provider_pid="ill-provid-1",
26
- status="PENDING",
27
- type="PHYSICAL_COPY",
28
- )
29
- )
30
- assert "$schema" in brw_req
31
- assert "provider" in brw_req and "$ref" in brw_req["provider"]
32
- assert "document" in brw_req and "$ref" in brw_req["document"]
33
- assert "patron" in brw_req and "$ref" in brw_req["patron"]
34
-
35
- brw_req = BorrowingRequest.get_record_by_pid("illbid-1")
36
- brw_req = brw_req.replace_refs()
37
- assert "provider" in brw_req and brw_req["provider"]["name"]
38
- assert "document" in brw_req and brw_req["document"]["title"]
39
- assert "patron" in brw_req and brw_req["patron"]["name"]
40
-
41
-
42
- def test_ill_brw_validation(db, testdata):
43
- """Test validation when updating a borrowing request."""
44
- borrowing_request_pid = testdata["ill_brw_reqs"][0]["pid"]
45
-
46
- # change document pid
47
- borrowing_request = BorrowingRequest.get_record_by_pid(
48
- borrowing_request_pid
49
- )
50
- borrowing_request["document_pid"] = "not_found_doc"
51
- with pytest.raises(DocumentNotFoundError):
52
- borrowing_request.commit()
53
-
54
- # change provider pid
55
- borrowing_request = BorrowingRequest.get_record_by_pid(
56
- borrowing_request_pid
57
- )
58
- borrowing_request["provider_pid"] = "not_found_lib"
59
- with pytest.raises(ProviderNotFoundError):
60
- borrowing_request.commit()
61
-
62
- # change patron pid
63
- borrowing_request = BorrowingRequest.get_record_by_pid(
64
- borrowing_request_pid
65
- )
66
- borrowing_request["patron_pid"] = "9999"
67
- with pytest.raises(PatronNotFoundError):
68
- borrowing_request.commit()
69
-
70
- # add cancel reason without status CANCELLED
71
- borrowing_request = BorrowingRequest.get_record_by_pid(
72
- borrowing_request_pid
73
- )
74
- borrowing_request["cancel_reason"] = "USER_CANCEL"
75
- with pytest.raises(ILLError):
76
- borrowing_request.commit()
77
-
78
- # update status to CANCELLED without cancel_reason
79
- borrowing_request = BorrowingRequest.get_record_by_pid(
80
- borrowing_request_pid
81
- )
82
- borrowing_request["status"] = "CANCELLED"
83
- with pytest.raises(ILLError):
84
- borrowing_request.commit()
@@ -1,207 +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 ILL borrowing requests actions."""
9
-
10
- import json
11
- from datetime import timedelta
12
-
13
- import arrow
14
- from flask import url_for
15
-
16
- from invenio_app_ils.ill.api import (
17
- BORROWING_REQUEST_PID_TYPE,
18
- BorrowingRequest,
19
- )
20
- from tests.helpers import user_login
21
-
22
- _HTTP_OK = [200, 201, 204]
23
- ITEM_ENDPOINT = "invenio_records_rest.illbid_item"
24
- LIST_ENDPOINT = "invenio_records_rest.illbid_list"
25
-
26
-
27
- def _create_loan_action(pid, data, client, json_headers):
28
- """Send request to create a new loan from the ILL."""
29
- url = url_for("invenio_app_ils_ill.illbid_create_loan", pid_value=pid)
30
- data["transaction_location_pid"] = "locid-1"
31
- return client.post(url, headers=json_headers, data=json.dumps(data))
32
-
33
-
34
- def _assert_create_loan_action_fails(pid, data, client, json_headers):
35
- """Asserts that the create loan action validation fails."""
36
- res = _create_loan_action(pid, data, client, json_headers)
37
- assert res.status_code == 400
38
-
39
-
40
- def test_brwreq_create_loan_only_backoffice(
41
- client, testdata, json_headers, users
42
- ):
43
- """Test that patron have no permission of creating loans from ILLs."""
44
- user_login(client, "patron1", users)
45
- res = _create_loan_action("illbid-2", dict(), client, json_headers)
46
- assert res.status_code == 403
47
-
48
-
49
- def test_brwreq_create_loan_fails_on_wrong_status(
50
- db, client, testdata, json_headers, users
51
- ):
52
- """Test borrowing requests create loan action fails on wrong status."""
53
- user_login(client, "librarian", users)
54
-
55
- def _create_new_brwreq(data=None):
56
- brwreq = data or dict(
57
- document_pid="docid-3",
58
- provider_pid="ill-provid-2",
59
- patron_pid="1",
60
- status="PENDING",
61
- type="PHYSICAL_COPY",
62
- )
63
- url = url_for(LIST_ENDPOINT)
64
- res = client.post(url, headers=json_headers, data=json.dumps(brwreq))
65
- assert res.status_code in _HTTP_OK
66
- brw_req = res.get_json()["metadata"]
67
- return brw_req["pid"]
68
-
69
- def _update_brwreq_with_new_status(pid, status):
70
- rec = BorrowingRequest.get_record_by_pid(pid)
71
- rec["status"] = status
72
- if status == "CANCELLED":
73
- rec["cancel_reason"] = "OTHER"
74
- rec.commit()
75
- db.session.commit()
76
-
77
- def _assert_fail_when_status(pid, status):
78
- _update_brwreq_with_new_status(pid, status)
79
-
80
- now = arrow.utcnow()
81
- future = now + timedelta(days=15)
82
- data = dict(
83
- loan_start_date=now.isoformat(), loan_end_date=future.isoformat()
84
- )
85
- _assert_create_loan_action_fails(pid, data, client, json_headers)
86
-
87
- pid = _create_new_brwreq()
88
-
89
- _assert_fail_when_status(pid, "PENDING")
90
- _assert_fail_when_status(pid, "ON_LOAN")
91
- _assert_fail_when_status(pid, "RETURNED")
92
- _assert_fail_when_status(pid, "CANCELLED")
93
-
94
-
95
- def test_brwreq_create_loan_fails_on_wrong_loan_end_date(
96
- db, client, testdata, json_headers, users
97
- ):
98
- """Test borrowing requests create loan action fails on wrong end date."""
99
- user_login(client, "librarian", users)
100
-
101
- # demo data "illbid-2" has the valid state `REQUESTED`
102
- pid = "illbid-2"
103
- # missing date param
104
- _assert_create_loan_action_fails(pid, dict(), client, json_headers)
105
-
106
- now = arrow.utcnow()
107
-
108
- # wrong format date
109
- future = now + timedelta(days=5)
110
- data = dict(
111
- loan_start_date=now.isoformat(),
112
- loan_end_date=future.date().isoformat(),
113
- )
114
- _assert_create_loan_action_fails(pid, data, client, json_headers)
115
- data = dict(
116
- loan_start_date=now.date().isoformat(),
117
- loan_end_date=future.isoformat(),
118
- )
119
- _assert_create_loan_action_fails(pid, data, client, json_headers)
120
-
121
- # past date
122
- past = now - timedelta(days=15)
123
- data = dict(
124
- loan_start_date=now.date().isoformat(),
125
- loan_end_date=past.date().isoformat(),
126
- )
127
- _assert_create_loan_action_fails(pid, data, client, json_headers)
128
-
129
-
130
- def test_brwreq_create_loan_fails_on_loan_pid_already_attached(
131
- db, client, testdata, json_headers, users
132
- ):
133
- """Test borrowing requests create loan action fails on loan_pid already."""
134
- user_login(client, "librarian", users)
135
-
136
- # demo data "illbid-2" has the valid state `REQUESTED`
137
- pid = "illbid-2"
138
-
139
- rec = BorrowingRequest.get_record_by_pid(pid)
140
- rec.setdefault("patron_loan", {})
141
- rec["patron_loan"]["pid"] = "loanid-3"
142
- rec.commit()
143
- db.session.commit()
144
-
145
- # already with a loan pid for some reasons
146
- now = arrow.utcnow()
147
- future = now + timedelta(days=5)
148
- data = dict(
149
- loan_start_date=now.date().isoformat(),
150
- loan_end_date=future.date().isoformat(),
151
- )
152
- _assert_create_loan_action_fails(pid, data, client, json_headers)
153
-
154
-
155
- def test_brwreq_create_loan_succeeds(
156
- db, client, testdata, json_headers, users
157
- ):
158
- """Test borrowing requests create loan action succeeds."""
159
- user = user_login(client, "librarian", users)
160
-
161
- # demo data "illbid-2" has the valid state `REQUESTED`
162
- pid = "illbid-2"
163
-
164
- now = arrow.utcnow()
165
- start = (now + timedelta(days=3)).date().isoformat()
166
- future = (now + timedelta(days=5)).date().isoformat()
167
- data = dict(loan_start_date=start, loan_end_date=future)
168
- res = _create_loan_action(pid, data, client, json_headers)
169
- assert res.status_code in _HTTP_OK
170
- brw_req = res.get_json()["metadata"]
171
-
172
- assert brw_req["status"] == "ON_LOAN"
173
- assert "patron_loan" in brw_req
174
- patron_loan = brw_req["patron_loan"]
175
- assert "pid" in patron_loan
176
- assert "loan" in patron_loan
177
- loan = patron_loan["loan"]
178
- assert patron_loan["pid"] == loan["pid"]
179
- assert loan["end_date"] == future
180
- loan_pid = loan["pid"]
181
-
182
- # fetch the loan
183
- url = url_for("invenio_records_rest.loanid_item", pid_value=loan_pid)
184
- res = client.get(url, headers=json_headers)
185
- assert res.status_code in _HTTP_OK
186
- loan = res.get_json()["metadata"]
187
-
188
- # make sure the loan is created with the data from the ILL
189
- assert loan["item_pid"] == dict(type=BORROWING_REQUEST_PID_TYPE, value=pid)
190
- assert loan["start_date"] == start
191
- assert loan["end_date"] == future
192
- assert loan["document_pid"] == brw_req["document_pid"]
193
- assert loan["patron_pid"] == brw_req["patron_pid"]
194
- assert loan["transaction_user_pid"] == str(user.id)
195
-
196
- # update notes (a random field)
197
- brw_req["notes"] = "This is a note"
198
- url = url_for(ITEM_ENDPOINT, pid_value=pid)
199
- res = client.put(url, headers=json_headers, data=json.dumps(brw_req))
200
- assert res.status_code in _HTTP_OK
201
- updated_brw_req = res.get_json()["metadata"]
202
-
203
- # make sure `patron_loan` system field is preserved
204
- assert updated_brw_req["notes"] == "This is a note"
205
- assert "patron_loan" in updated_brw_req
206
- assert "pid" in patron_loan
207
- assert "loan" in patron_loan