codex 1.6.2__py3-none-any.whl → 1.6.3__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.

Potentially problematic release.


This version of codex might be problematic. Click here for more details.

Files changed (489) hide show
  1. codex/exceptions.py +42 -16
  2. codex/librarian/search/update.py +1 -1
  3. codex/serializers/admin/__init__.py +1 -0
  4. codex/serializers/admin/flags.py +15 -0
  5. codex/serializers/admin/groups.py +38 -0
  6. codex/serializers/admin/libraries.py +90 -0
  7. codex/serializers/admin/stats.py +114 -0
  8. codex/serializers/admin/tasks.py +16 -0
  9. codex/serializers/admin/users.py +40 -0
  10. codex/serializers/fields.py +7 -0
  11. codex/serializers/reader.py +8 -3
  12. codex/static_root/assets/VCheckbox-CXQlndFT.c17c006a62e6.js +1 -0
  13. codex/static_root/assets/VCheckbox-CXQlndFT.c17c006a62e6.js.br +0 -0
  14. codex/static_root/assets/VCheckbox-CXQlndFT.c17c006a62e6.js.gz +0 -0
  15. codex/static_root/assets/VCheckbox-CXQlndFT.js +1 -0
  16. codex/static_root/assets/VCheckbox-CXQlndFT.js.br +0 -0
  17. codex/static_root/assets/VCheckbox-CXQlndFT.js.gz +0 -0
  18. codex/static_root/assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js +1 -0
  19. codex/static_root/assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js.br +0 -0
  20. codex/static_root/assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js.gz +0 -0
  21. codex/static_root/assets/VCheckboxBtn-DB72Bclg.js +1 -0
  22. codex/static_root/assets/VCheckboxBtn-DB72Bclg.js.br +0 -0
  23. codex/static_root/assets/VCheckboxBtn-DB72Bclg.js.gz +0 -0
  24. codex/static_root/assets/{VCombobox-CGyBgdqr.2f85598cc1a4.js → VCombobox-BDcFPzYf.0b80447cd638.js} +1 -1
  25. codex/static_root/assets/VCombobox-BDcFPzYf.0b80447cd638.js.br +0 -0
  26. codex/static_root/assets/VCombobox-BDcFPzYf.0b80447cd638.js.gz +0 -0
  27. codex/static_root/assets/{VCombobox-CGyBgdqr.js → VCombobox-BDcFPzYf.js} +1 -1
  28. codex/static_root/assets/VCombobox-BDcFPzYf.js.br +0 -0
  29. codex/static_root/assets/VCombobox-BDcFPzYf.js.gz +0 -0
  30. codex/static_root/assets/VDialog-BB4zqrGw.2decc14ea597.js +1 -0
  31. codex/static_root/assets/VDialog-BB4zqrGw.2decc14ea597.js.br +0 -0
  32. codex/static_root/assets/VDialog-BB4zqrGw.2decc14ea597.js.gz +0 -0
  33. codex/static_root/assets/VDialog-BB4zqrGw.js +1 -0
  34. codex/static_root/assets/VDialog-BB4zqrGw.js.br +0 -0
  35. codex/static_root/assets/VDialog-BB4zqrGw.js.gz +0 -0
  36. codex/static_root/assets/VExpansionPanels-SZc735F5.19004a0eba16.js +1 -0
  37. codex/static_root/assets/VExpansionPanels-SZc735F5.19004a0eba16.js.br +0 -0
  38. codex/static_root/assets/VExpansionPanels-SZc735F5.19004a0eba16.js.gz +0 -0
  39. codex/static_root/assets/VExpansionPanels-SZc735F5.js +1 -0
  40. codex/static_root/assets/VExpansionPanels-SZc735F5.js.br +0 -0
  41. codex/static_root/assets/VExpansionPanels-SZc735F5.js.gz +0 -0
  42. codex/static_root/assets/VRadioGroup-tFEuhFRq.774e14a4945a.js +1 -0
  43. codex/static_root/assets/VRadioGroup-tFEuhFRq.774e14a4945a.js.br +0 -0
  44. codex/static_root/assets/VRadioGroup-tFEuhFRq.774e14a4945a.js.gz +0 -0
  45. codex/static_root/assets/VRadioGroup-tFEuhFRq.js +1 -0
  46. codex/static_root/assets/VRadioGroup-tFEuhFRq.js.br +0 -0
  47. codex/static_root/assets/VRadioGroup-tFEuhFRq.js.gz +0 -0
  48. codex/static_root/assets/VSelect-Dd5Zy8Uy.f225abf824ff.js +1 -0
  49. codex/static_root/assets/VSelect-Dd5Zy8Uy.f225abf824ff.js.br +0 -0
  50. codex/static_root/assets/VSelect-Dd5Zy8Uy.f225abf824ff.js.gz +0 -0
  51. codex/static_root/assets/VSelect-Dd5Zy8Uy.js +1 -0
  52. codex/static_root/assets/VSelect-Dd5Zy8Uy.js.br +0 -0
  53. codex/static_root/assets/VSelect-Dd5Zy8Uy.js.gz +0 -0
  54. codex/static_root/assets/{VSelectionControl-DXxRmssH.js → VSelectionControl-DImIQPJV.1f14d2113063.js} +1 -1
  55. codex/static_root/assets/VSelectionControl-DImIQPJV.1f14d2113063.js.br +0 -0
  56. codex/static_root/assets/VSelectionControl-DImIQPJV.1f14d2113063.js.gz +0 -0
  57. codex/static_root/assets/{VSelectionControl-DXxRmssH.252890f79cc6.js → VSelectionControl-DImIQPJV.js} +1 -1
  58. codex/static_root/assets/VSelectionControl-DImIQPJV.js.br +0 -0
  59. codex/static_root/assets/VSelectionControl-DImIQPJV.js.gz +0 -0
  60. codex/static_root/assets/{VSlideGroup-DYJ3EYZI.a2542c5f90c4.js → VSlideGroup-CDaAHRAK.783800d70a8a.js} +1 -1
  61. codex/static_root/assets/VSlideGroup-CDaAHRAK.783800d70a8a.js.br +0 -0
  62. codex/static_root/assets/VSlideGroup-CDaAHRAK.783800d70a8a.js.gz +0 -0
  63. codex/static_root/assets/{VSlideGroup-DYJ3EYZI.js → VSlideGroup-CDaAHRAK.js} +1 -1
  64. codex/static_root/assets/VSlideGroup-CDaAHRAK.js.br +0 -0
  65. codex/static_root/assets/VSlideGroup-CDaAHRAK.js.gz +0 -0
  66. codex/static_root/assets/{VTable-BveGtxei.7f76f4ef812b.js → VTable-CkCZonsu.81e34381271f.js} +1 -1
  67. codex/static_root/assets/VTable-CkCZonsu.81e34381271f.js.br +0 -0
  68. codex/static_root/assets/VTable-CkCZonsu.81e34381271f.js.gz +0 -0
  69. codex/static_root/assets/{VTable-BveGtxei.js → VTable-CkCZonsu.js} +1 -1
  70. codex/static_root/assets/VTable-CkCZonsu.js.br +0 -0
  71. codex/static_root/assets/VTable-CkCZonsu.js.gz +0 -0
  72. codex/static_root/assets/VTextField-fNAzFu1M.00dec8623f18.js +1 -0
  73. codex/static_root/assets/VTextField-fNAzFu1M.00dec8623f18.js.br +0 -0
  74. codex/static_root/assets/VTextField-fNAzFu1M.00dec8623f18.js.gz +0 -0
  75. codex/static_root/assets/VTextField-fNAzFu1M.js +1 -0
  76. codex/static_root/assets/VTextField-fNAzFu1M.js.br +0 -0
  77. codex/static_root/assets/VTextField-fNAzFu1M.js.gz +0 -0
  78. codex/static_root/assets/{VWindowItem-FBuIO_rT.8610c7e83905.js → VWindowItem-_YBMW1SU.0836924f8c12.js} +1 -1
  79. codex/static_root/assets/VWindowItem-_YBMW1SU.0836924f8c12.js.br +0 -0
  80. codex/static_root/assets/VWindowItem-_YBMW1SU.0836924f8c12.js.gz +0 -0
  81. codex/static_root/assets/{VWindowItem-FBuIO_rT.js → VWindowItem-_YBMW1SU.js} +1 -1
  82. codex/static_root/assets/VWindowItem-_YBMW1SU.js.br +0 -0
  83. codex/static_root/assets/VWindowItem-_YBMW1SU.js.gz +0 -0
  84. codex/static_root/assets/{admin-B8Bp2Uih.82c98714bcf1.css → admin-D4sw3N4T.b590f88a62cf.css} +1 -1
  85. codex/static_root/assets/admin-D4sw3N4T.b590f88a62cf.css.br +0 -0
  86. codex/static_root/assets/admin-D4sw3N4T.b590f88a62cf.css.gz +0 -0
  87. codex/static_root/assets/{admin-B8Bp2Uih.css → admin-D4sw3N4T.css} +1 -1
  88. codex/static_root/assets/admin-D4sw3N4T.css.br +0 -0
  89. codex/static_root/assets/admin-D4sw3N4T.css.gz +0 -0
  90. codex/static_root/assets/admin-DYmGyJVg.262e6032ee86.js +1 -0
  91. codex/static_root/assets/admin-DYmGyJVg.262e6032ee86.js.br +0 -0
  92. codex/static_root/assets/admin-DYmGyJVg.262e6032ee86.js.gz +0 -0
  93. codex/static_root/assets/admin-DYmGyJVg.js +1 -0
  94. codex/static_root/assets/admin-DYmGyJVg.js.br +0 -0
  95. codex/static_root/assets/admin-DYmGyJVg.js.gz +0 -0
  96. codex/static_root/assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js +56 -0
  97. codex/static_root/assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js.br +0 -0
  98. codex/static_root/assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js.gz +0 -0
  99. codex/static_root/assets/admin-drawer-panel-c3f3H29x.js +56 -0
  100. codex/static_root/assets/admin-drawer-panel-c3f3H29x.js.br +0 -0
  101. codex/static_root/assets/admin-drawer-panel-c3f3H29x.js.gz +0 -0
  102. codex/static_root/assets/browser-Ck3zWCOk.d98c77747e6d.js +1 -0
  103. codex/static_root/assets/browser-Ck3zWCOk.d98c77747e6d.js.br +0 -0
  104. codex/static_root/assets/browser-Ck3zWCOk.d98c77747e6d.js.gz +0 -0
  105. codex/static_root/assets/browser-Ck3zWCOk.js +1 -0
  106. codex/static_root/assets/browser-Ck3zWCOk.js.br +0 -0
  107. codex/static_root/assets/browser-Ck3zWCOk.js.gz +0 -0
  108. codex/static_root/assets/{browser-DP9eEJ0M.css → browser-DgawKPSA.c7cf59dc4b21.css} +1 -1
  109. codex/static_root/assets/browser-DgawKPSA.c7cf59dc4b21.css.br +0 -0
  110. codex/static_root/assets/browser-DgawKPSA.c7cf59dc4b21.css.gz +0 -0
  111. codex/static_root/assets/{browser-DP9eEJ0M.276e8636f8fc.css → browser-DgawKPSA.css} +1 -1
  112. codex/static_root/assets/browser-DgawKPSA.css.br +0 -0
  113. codex/static_root/assets/browser-DgawKPSA.css.gz +0 -0
  114. codex/static_root/assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js +1 -0
  115. codex/static_root/assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js.br +0 -0
  116. codex/static_root/assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js.gz +0 -0
  117. codex/static_root/assets/change-password-dialog-BbIO0YI5.js +1 -0
  118. codex/static_root/assets/change-password-dialog-BbIO0YI5.js.br +0 -0
  119. codex/static_root/assets/change-password-dialog-BbIO0YI5.js.gz +0 -0
  120. codex/static_root/assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js +1 -0
  121. codex/static_root/assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js.br +0 -0
  122. codex/static_root/assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js.gz +0 -0
  123. codex/static_root/assets/confirm-dialog-BrzuoYAT.js +1 -0
  124. codex/static_root/assets/confirm-dialog-BrzuoYAT.js.br +0 -0
  125. codex/static_root/assets/confirm-dialog-BrzuoYAT.js.gz +0 -0
  126. codex/static_root/assets/{datetime-column-uaXWFgF_.29c6d50b483e.js → datetime-column-D8-UeX_p.e33b1556805b.js} +1 -1
  127. codex/static_root/assets/datetime-column-D8-UeX_p.e33b1556805b.js.br +0 -0
  128. codex/static_root/assets/datetime-column-D8-UeX_p.e33b1556805b.js.gz +0 -0
  129. codex/static_root/assets/{datetime-column-uaXWFgF_.js → datetime-column-D8-UeX_p.js} +1 -1
  130. codex/static_root/assets/datetime-column-D8-UeX_p.js.br +0 -0
  131. codex/static_root/assets/datetime-column-D8-UeX_p.js.gz +0 -0
  132. codex/static_root/assets/{filter-DS84uTvk.4fbebd4832bc.js → filter-XMAX5Nmg.c6ed87350f7d.js} +1 -1
  133. codex/static_root/assets/filter-XMAX5Nmg.c6ed87350f7d.js.br +0 -0
  134. codex/static_root/assets/filter-XMAX5Nmg.c6ed87350f7d.js.gz +0 -0
  135. codex/static_root/assets/{filter-DS84uTvk.js → filter-XMAX5Nmg.js} +1 -1
  136. codex/static_root/assets/filter-XMAX5Nmg.js.br +0 -0
  137. codex/static_root/assets/filter-XMAX5Nmg.js.gz +0 -0
  138. codex/static_root/assets/flag-tab-BLEUVMot.c14936c90346.js +1 -0
  139. codex/static_root/assets/flag-tab-BLEUVMot.c14936c90346.js.br +0 -0
  140. codex/static_root/assets/flag-tab-BLEUVMot.c14936c90346.js.gz +0 -0
  141. codex/static_root/assets/flag-tab-BLEUVMot.js +1 -0
  142. codex/static_root/assets/flag-tab-BLEUVMot.js.br +0 -0
  143. codex/static_root/assets/flag-tab-BLEUVMot.js.gz +0 -0
  144. codex/static_root/assets/group-tab-D9n5gZCA.634223001c44.js +1 -0
  145. codex/static_root/assets/group-tab-D9n5gZCA.634223001c44.js.br +0 -0
  146. codex/static_root/assets/group-tab-D9n5gZCA.634223001c44.js.gz +0 -0
  147. codex/static_root/assets/group-tab-D9n5gZCA.js +1 -0
  148. codex/static_root/assets/group-tab-D9n5gZCA.js.br +0 -0
  149. codex/static_root/assets/group-tab-D9n5gZCA.js.gz +0 -0
  150. codex/static_root/assets/http-error-C_EFLi0c.c7e906206b62.js +1 -0
  151. codex/static_root/assets/http-error-C_EFLi0c.c7e906206b62.js.br +0 -0
  152. codex/static_root/assets/http-error-C_EFLi0c.c7e906206b62.js.gz +0 -0
  153. codex/static_root/assets/http-error-C_EFLi0c.js +1 -0
  154. codex/static_root/assets/http-error-C_EFLi0c.js.br +0 -0
  155. codex/static_root/assets/http-error-C_EFLi0c.js.gz +0 -0
  156. codex/static_root/assets/{library-tab-BN0SfPcH.913e236f625e.css → library-tab-BygwYPnO.94e92aa60bf2.css} +1 -1
  157. codex/static_root/assets/library-tab-BygwYPnO.94e92aa60bf2.css.br +0 -0
  158. codex/static_root/assets/library-tab-BygwYPnO.94e92aa60bf2.css.gz +0 -0
  159. codex/static_root/assets/{library-tab-BN0SfPcH.css → library-tab-BygwYPnO.css} +1 -1
  160. codex/static_root/assets/library-tab-BygwYPnO.css.br +0 -0
  161. codex/static_root/assets/library-tab-BygwYPnO.css.gz +0 -0
  162. codex/static_root/assets/library-tab-fDxuhPBs.285b36d9cec0.js +1 -0
  163. codex/static_root/assets/library-tab-fDxuhPBs.285b36d9cec0.js.br +0 -0
  164. codex/static_root/assets/library-tab-fDxuhPBs.285b36d9cec0.js.gz +0 -0
  165. codex/static_root/assets/library-tab-fDxuhPBs.js +1 -0
  166. codex/static_root/assets/library-tab-fDxuhPBs.js.br +0 -0
  167. codex/static_root/assets/library-tab-fDxuhPBs.js.gz +0 -0
  168. codex/static_root/assets/main-B3MfqYNN.30d1310fc082.js +6 -0
  169. codex/static_root/assets/main-B3MfqYNN.30d1310fc082.js.br +0 -0
  170. codex/static_root/assets/main-B3MfqYNN.30d1310fc082.js.gz +0 -0
  171. codex/static_root/assets/main-B3MfqYNN.js +6 -0
  172. codex/static_root/assets/main-B3MfqYNN.js.br +0 -0
  173. codex/static_root/assets/main-B3MfqYNN.js.gz +0 -0
  174. codex/static_root/assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js +1 -0
  175. codex/static_root/assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js.br +0 -0
  176. codex/static_root/assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js.gz +0 -0
  177. codex/static_root/assets/pagination-toolbar-BD6nzIKF.js +1 -0
  178. codex/static_root/assets/pagination-toolbar-BD6nzIKF.js.br +0 -0
  179. codex/static_root/assets/pagination-toolbar-BD6nzIKF.js.gz +0 -0
  180. codex/static_root/assets/{pdf-doc-C-4EM9-d.ce9cf66bd4c3.js → pdf-doc-iF15lKRp.de9a9d394438.js} +1 -1
  181. codex/static_root/assets/pdf-doc-iF15lKRp.de9a9d394438.js.br +0 -0
  182. codex/static_root/assets/pdf-doc-iF15lKRp.de9a9d394438.js.gz +0 -0
  183. codex/static_root/assets/{pdf-doc-C-4EM9-d.js → pdf-doc-iF15lKRp.js} +1 -1
  184. codex/static_root/assets/pdf-doc-iF15lKRp.js.br +0 -0
  185. codex/static_root/assets/pdf-doc-iF15lKRp.js.gz +0 -0
  186. codex/static_root/assets/reader-5Ja_bAaT.2fe33a3891f6.js +2 -0
  187. codex/static_root/assets/reader-5Ja_bAaT.2fe33a3891f6.js.br +0 -0
  188. codex/static_root/assets/reader-5Ja_bAaT.2fe33a3891f6.js.gz +0 -0
  189. codex/static_root/assets/reader-5Ja_bAaT.js +2 -0
  190. codex/static_root/assets/reader-5Ja_bAaT.js.br +0 -0
  191. codex/static_root/assets/reader-5Ja_bAaT.js.gz +0 -0
  192. codex/static_root/assets/{reader-DOQuhDYO.css → reader-YbzUiD0T.css} +1 -1
  193. codex/static_root/assets/reader-YbzUiD0T.css.br +0 -0
  194. codex/static_root/assets/reader-YbzUiD0T.css.gz +0 -0
  195. codex/static_root/assets/{reader-DOQuhDYO.df559ad29ab3.css → reader-YbzUiD0T.efb15835b39d.css} +1 -1
  196. codex/static_root/assets/reader-YbzUiD0T.efb15835b39d.css.br +0 -0
  197. codex/static_root/assets/reader-YbzUiD0T.efb15835b39d.css.gz +0 -0
  198. codex/static_root/assets/{relation-chips-Bsc-gUxE.98e65384c3c9.css → relation-chips-BGitp3yx.b3e7d178a615.css} +1 -1
  199. codex/static_root/assets/relation-chips-BGitp3yx.b3e7d178a615.css.br +0 -0
  200. codex/static_root/assets/relation-chips-BGitp3yx.b3e7d178a615.css.gz +0 -0
  201. codex/static_root/assets/{relation-chips-Bsc-gUxE.css → relation-chips-BGitp3yx.css} +1 -1
  202. codex/static_root/assets/relation-chips-BGitp3yx.css.br +0 -0
  203. codex/static_root/assets/relation-chips-BGitp3yx.css.gz +0 -0
  204. codex/static_root/assets/relation-chips-CUWkvLNo.3d18d0c09d39.js +1 -0
  205. codex/static_root/assets/relation-chips-CUWkvLNo.3d18d0c09d39.js.br +0 -0
  206. codex/static_root/assets/relation-chips-CUWkvLNo.3d18d0c09d39.js.gz +0 -0
  207. codex/static_root/assets/relation-chips-CUWkvLNo.js +1 -0
  208. codex/static_root/assets/relation-chips-CUWkvLNo.js.br +0 -0
  209. codex/static_root/assets/relation-chips-CUWkvLNo.js.gz +0 -0
  210. codex/static_root/assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js +2 -0
  211. codex/static_root/assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js.br +0 -0
  212. codex/static_root/assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js.gz +0 -0
  213. codex/static_root/assets/settings-drawer-rn3JdMxA.js +2 -0
  214. codex/static_root/assets/settings-drawer-rn3JdMxA.js.br +0 -0
  215. codex/static_root/assets/settings-drawer-rn3JdMxA.js.gz +0 -0
  216. codex/static_root/assets/stats-tab-B6L-YFRA.1c90593f7b5c.css +1 -0
  217. codex/static_root/assets/stats-tab-B6L-YFRA.1c90593f7b5c.css.br +0 -0
  218. codex/static_root/assets/stats-tab-B6L-YFRA.1c90593f7b5c.css.gz +0 -0
  219. codex/static_root/assets/stats-tab-B6L-YFRA.css +1 -0
  220. codex/static_root/assets/stats-tab-B6L-YFRA.css.br +0 -0
  221. codex/static_root/assets/stats-tab-B6L-YFRA.css.gz +0 -0
  222. codex/static_root/assets/stats-tab-zts2Xsmg.9fb959ccf4da.js +1 -0
  223. codex/static_root/assets/stats-tab-zts2Xsmg.9fb959ccf4da.js.br +0 -0
  224. codex/static_root/assets/stats-tab-zts2Xsmg.9fb959ccf4da.js.gz +0 -0
  225. codex/static_root/assets/stats-tab-zts2Xsmg.js +1 -0
  226. codex/static_root/assets/stats-tab-zts2Xsmg.js.br +0 -0
  227. codex/static_root/assets/stats-tab-zts2Xsmg.js.gz +0 -0
  228. codex/static_root/assets/task-tab-CbzDX0IR.7b43bdf9cf42.js +1 -0
  229. codex/static_root/assets/task-tab-CbzDX0IR.7b43bdf9cf42.js.br +0 -0
  230. codex/static_root/assets/task-tab-CbzDX0IR.7b43bdf9cf42.js.gz +0 -0
  231. codex/static_root/assets/task-tab-CbzDX0IR.js +1 -0
  232. codex/static_root/assets/task-tab-CbzDX0IR.js.br +0 -0
  233. codex/static_root/assets/task-tab-CbzDX0IR.js.gz +0 -0
  234. codex/static_root/assets/unauthorized-CllrtnFV.2a18fab3dd41.js +1 -0
  235. codex/static_root/assets/unauthorized-CllrtnFV.2a18fab3dd41.js.br +0 -0
  236. codex/static_root/assets/unauthorized-CllrtnFV.2a18fab3dd41.js.gz +0 -0
  237. codex/static_root/assets/unauthorized-CllrtnFV.js +1 -0
  238. codex/static_root/assets/unauthorized-CllrtnFV.js.br +0 -0
  239. codex/static_root/assets/unauthorized-CllrtnFV.js.gz +0 -0
  240. codex/static_root/assets/user-tab-FY1xALpi.05a88f51df4f.js +1 -0
  241. codex/static_root/assets/user-tab-FY1xALpi.05a88f51df4f.js.br +0 -0
  242. codex/static_root/assets/user-tab-FY1xALpi.05a88f51df4f.js.gz +0 -0
  243. codex/static_root/assets/user-tab-FY1xALpi.js +1 -0
  244. codex/static_root/assets/user-tab-FY1xALpi.js.br +0 -0
  245. codex/static_root/assets/user-tab-FY1xALpi.js.gz +0 -0
  246. codex/static_root/{manifest.80e911824648.json → manifest.166aa32817b1.json} +229 -241
  247. codex/static_root/manifest.166aa32817b1.json.br +0 -0
  248. codex/static_root/manifest.166aa32817b1.json.gz +0 -0
  249. codex/static_root/manifest.json +229 -241
  250. codex/static_root/manifest.json.br +0 -0
  251. codex/static_root/manifest.json.gz +0 -0
  252. codex/static_root/staticfiles.json +1 -1
  253. codex/views/admin/api_key.py +1 -1
  254. codex/views/admin/flag.py +1 -1
  255. codex/views/admin/group.py +1 -1
  256. codex/views/admin/library.py +1 -1
  257. codex/views/admin/stats.py +41 -7
  258. codex/views/admin/tasks.py +1 -1
  259. codex/views/admin/user.py +1 -1
  260. codex/views/browser/browser.py +4 -1
  261. codex/views/browser/filters/field.py +15 -6
  262. codex/views/browser/paginate.py +61 -11
  263. codex/views/browser/validate.py +7 -5
  264. codex/views/opds/binary.py +1 -3
  265. codex/views/opds/const.py +10 -0
  266. codex/views/opds/util.py +10 -0
  267. codex/views/opds/v1/feed.py +5 -23
  268. codex/views/reader/arcs.py +64 -53
  269. codex/views/reader/books.py +38 -38
  270. codex/views/reader/init.py +7 -5
  271. codex/views/reader/reader.py +0 -2
  272. {codex-1.6.2.dist-info → codex-1.6.3.dist-info}/METADATA +1 -1
  273. {codex-1.6.2.dist-info → codex-1.6.3.dist-info}/RECORD +276 -272
  274. codex/serializers/admin.py +0 -268
  275. codex/static_root/assets/VCheckbox-DUxuAZcY.46ab94043464.js +0 -1
  276. codex/static_root/assets/VCheckbox-DUxuAZcY.46ab94043464.js.br +0 -0
  277. codex/static_root/assets/VCheckbox-DUxuAZcY.46ab94043464.js.gz +0 -0
  278. codex/static_root/assets/VCheckbox-DUxuAZcY.js +0 -1
  279. codex/static_root/assets/VCheckbox-DUxuAZcY.js.br +0 -0
  280. codex/static_root/assets/VCheckbox-DUxuAZcY.js.gz +0 -0
  281. codex/static_root/assets/VCheckboxBtn-BTFFFGx3.0cbde4eb9a65.js +0 -1
  282. codex/static_root/assets/VCheckboxBtn-BTFFFGx3.0cbde4eb9a65.js.br +0 -0
  283. codex/static_root/assets/VCheckboxBtn-BTFFFGx3.0cbde4eb9a65.js.gz +0 -0
  284. codex/static_root/assets/VCheckboxBtn-BTFFFGx3.js +0 -1
  285. codex/static_root/assets/VCheckboxBtn-BTFFFGx3.js.br +0 -0
  286. codex/static_root/assets/VCheckboxBtn-BTFFFGx3.js.gz +0 -0
  287. codex/static_root/assets/VCombobox-CGyBgdqr.2f85598cc1a4.js.br +0 -0
  288. codex/static_root/assets/VCombobox-CGyBgdqr.2f85598cc1a4.js.gz +0 -0
  289. codex/static_root/assets/VCombobox-CGyBgdqr.js.br +0 -0
  290. codex/static_root/assets/VCombobox-CGyBgdqr.js.gz +0 -0
  291. codex/static_root/assets/VDialog-DTWAoZBU.b8c4c276e9b2.js +0 -1
  292. codex/static_root/assets/VDialog-DTWAoZBU.b8c4c276e9b2.js.br +0 -0
  293. codex/static_root/assets/VDialog-DTWAoZBU.b8c4c276e9b2.js.gz +0 -0
  294. codex/static_root/assets/VDialog-DTWAoZBU.js +0 -1
  295. codex/static_root/assets/VDialog-DTWAoZBU.js.br +0 -0
  296. codex/static_root/assets/VDialog-DTWAoZBU.js.gz +0 -0
  297. codex/static_root/assets/VExpansionPanels-D4psrz4h.b55b901da65f.js +0 -1
  298. codex/static_root/assets/VExpansionPanels-D4psrz4h.b55b901da65f.js.br +0 -0
  299. codex/static_root/assets/VExpansionPanels-D4psrz4h.b55b901da65f.js.gz +0 -0
  300. codex/static_root/assets/VExpansionPanels-D4psrz4h.js +0 -1
  301. codex/static_root/assets/VExpansionPanels-D4psrz4h.js.br +0 -0
  302. codex/static_root/assets/VExpansionPanels-D4psrz4h.js.gz +0 -0
  303. codex/static_root/assets/VRadioGroup-BY572TP-.6d47a94795de.js +0 -1
  304. codex/static_root/assets/VRadioGroup-BY572TP-.6d47a94795de.js.br +0 -2
  305. codex/static_root/assets/VRadioGroup-BY572TP-.6d47a94795de.js.gz +0 -0
  306. codex/static_root/assets/VRadioGroup-BY572TP-.js +0 -1
  307. codex/static_root/assets/VRadioGroup-BY572TP-.js.br +0 -2
  308. codex/static_root/assets/VRadioGroup-BY572TP-.js.gz +0 -0
  309. codex/static_root/assets/VSelect-Bnhj5kBc.fdcd87c9e253.js +0 -1
  310. codex/static_root/assets/VSelect-Bnhj5kBc.fdcd87c9e253.js.br +0 -0
  311. codex/static_root/assets/VSelect-Bnhj5kBc.fdcd87c9e253.js.gz +0 -0
  312. codex/static_root/assets/VSelect-Bnhj5kBc.js +0 -1
  313. codex/static_root/assets/VSelect-Bnhj5kBc.js.br +0 -0
  314. codex/static_root/assets/VSelect-Bnhj5kBc.js.gz +0 -0
  315. codex/static_root/assets/VSelectionControl-DXxRmssH.252890f79cc6.js.br +0 -0
  316. codex/static_root/assets/VSelectionControl-DXxRmssH.252890f79cc6.js.gz +0 -0
  317. codex/static_root/assets/VSelectionControl-DXxRmssH.js.br +0 -0
  318. codex/static_root/assets/VSelectionControl-DXxRmssH.js.gz +0 -0
  319. codex/static_root/assets/VSlideGroup-DYJ3EYZI.a2542c5f90c4.js.br +0 -0
  320. codex/static_root/assets/VSlideGroup-DYJ3EYZI.a2542c5f90c4.js.gz +0 -0
  321. codex/static_root/assets/VSlideGroup-DYJ3EYZI.js.br +0 -0
  322. codex/static_root/assets/VSlideGroup-DYJ3EYZI.js.gz +0 -0
  323. codex/static_root/assets/VTable-BveGtxei.7f76f4ef812b.js.br +0 -0
  324. codex/static_root/assets/VTable-BveGtxei.7f76f4ef812b.js.gz +0 -0
  325. codex/static_root/assets/VTable-BveGtxei.js.br +0 -0
  326. codex/static_root/assets/VTable-BveGtxei.js.gz +0 -0
  327. codex/static_root/assets/VTextField-BayL7C1D.6e53c61b3760.js +0 -1
  328. codex/static_root/assets/VTextField-BayL7C1D.6e53c61b3760.js.br +0 -0
  329. codex/static_root/assets/VTextField-BayL7C1D.6e53c61b3760.js.gz +0 -0
  330. codex/static_root/assets/VTextField-BayL7C1D.js +0 -1
  331. codex/static_root/assets/VTextField-BayL7C1D.js.br +0 -0
  332. codex/static_root/assets/VTextField-BayL7C1D.js.gz +0 -0
  333. codex/static_root/assets/VWindowItem-FBuIO_rT.8610c7e83905.js.br +0 -0
  334. codex/static_root/assets/VWindowItem-FBuIO_rT.8610c7e83905.js.gz +0 -0
  335. codex/static_root/assets/VWindowItem-FBuIO_rT.js.br +0 -0
  336. codex/static_root/assets/VWindowItem-FBuIO_rT.js.gz +0 -0
  337. codex/static_root/assets/admin-B8Bp2Uih.82c98714bcf1.css.br +0 -0
  338. codex/static_root/assets/admin-B8Bp2Uih.82c98714bcf1.css.gz +0 -0
  339. codex/static_root/assets/admin-B8Bp2Uih.css.br +0 -0
  340. codex/static_root/assets/admin-B8Bp2Uih.css.gz +0 -0
  341. codex/static_root/assets/admin-BH6uiYBb.d51c720fa05c.js +0 -1
  342. codex/static_root/assets/admin-BH6uiYBb.d51c720fa05c.js.br +0 -0
  343. codex/static_root/assets/admin-BH6uiYBb.d51c720fa05c.js.gz +0 -0
  344. codex/static_root/assets/admin-BH6uiYBb.js +0 -1
  345. codex/static_root/assets/admin-BH6uiYBb.js.br +0 -0
  346. codex/static_root/assets/admin-BH6uiYBb.js.gz +0 -0
  347. codex/static_root/assets/admin-drawer-panel-DsgLbfnD.7c409b430d79.js +0 -30
  348. codex/static_root/assets/admin-drawer-panel-DsgLbfnD.7c409b430d79.js.br +0 -0
  349. codex/static_root/assets/admin-drawer-panel-DsgLbfnD.7c409b430d79.js.gz +0 -0
  350. codex/static_root/assets/admin-drawer-panel-DsgLbfnD.js +0 -30
  351. codex/static_root/assets/admin-drawer-panel-DsgLbfnD.js.br +0 -0
  352. codex/static_root/assets/admin-drawer-panel-DsgLbfnD.js.gz +0 -0
  353. codex/static_root/assets/browser-BVciW8XB.ab1d75272aa7.js +0 -1
  354. codex/static_root/assets/browser-BVciW8XB.ab1d75272aa7.js.br +0 -0
  355. codex/static_root/assets/browser-BVciW8XB.ab1d75272aa7.js.gz +0 -0
  356. codex/static_root/assets/browser-BVciW8XB.js +0 -1
  357. codex/static_root/assets/browser-BVciW8XB.js.br +0 -0
  358. codex/static_root/assets/browser-BVciW8XB.js.gz +0 -0
  359. codex/static_root/assets/browser-DP9eEJ0M.276e8636f8fc.css.br +0 -0
  360. codex/static_root/assets/browser-DP9eEJ0M.276e8636f8fc.css.gz +0 -0
  361. codex/static_root/assets/browser-DP9eEJ0M.css.br +0 -0
  362. codex/static_root/assets/browser-DP9eEJ0M.css.gz +0 -0
  363. codex/static_root/assets/change-password-dialog-B-Sd5U5p.adf0a0f02866.js +0 -1
  364. codex/static_root/assets/change-password-dialog-B-Sd5U5p.adf0a0f02866.js.br +0 -0
  365. codex/static_root/assets/change-password-dialog-B-Sd5U5p.adf0a0f02866.js.gz +0 -0
  366. codex/static_root/assets/change-password-dialog-B-Sd5U5p.js +0 -1
  367. codex/static_root/assets/change-password-dialog-B-Sd5U5p.js.br +0 -0
  368. codex/static_root/assets/change-password-dialog-B-Sd5U5p.js.gz +0 -0
  369. codex/static_root/assets/confirm-dialog-CYEBgtj5.a5f142656c12.js +0 -1
  370. codex/static_root/assets/confirm-dialog-CYEBgtj5.a5f142656c12.js.br +0 -0
  371. codex/static_root/assets/confirm-dialog-CYEBgtj5.a5f142656c12.js.gz +0 -0
  372. codex/static_root/assets/confirm-dialog-CYEBgtj5.js +0 -1
  373. codex/static_root/assets/confirm-dialog-CYEBgtj5.js.br +0 -0
  374. codex/static_root/assets/confirm-dialog-CYEBgtj5.js.gz +0 -0
  375. codex/static_root/assets/datetime-column-uaXWFgF_.29c6d50b483e.js.br +0 -0
  376. codex/static_root/assets/datetime-column-uaXWFgF_.29c6d50b483e.js.gz +0 -0
  377. codex/static_root/assets/datetime-column-uaXWFgF_.js.br +0 -0
  378. codex/static_root/assets/datetime-column-uaXWFgF_.js.gz +0 -0
  379. codex/static_root/assets/filter-DS84uTvk.4fbebd4832bc.js.br +0 -0
  380. codex/static_root/assets/filter-DS84uTvk.4fbebd4832bc.js.gz +0 -0
  381. codex/static_root/assets/filter-DS84uTvk.js.br +0 -0
  382. codex/static_root/assets/filter-DS84uTvk.js.gz +0 -0
  383. codex/static_root/assets/flag-tab-iJTJldQ1.213201f8e03b.js +0 -1
  384. codex/static_root/assets/flag-tab-iJTJldQ1.213201f8e03b.js.br +0 -0
  385. codex/static_root/assets/flag-tab-iJTJldQ1.213201f8e03b.js.gz +0 -0
  386. codex/static_root/assets/flag-tab-iJTJldQ1.js +0 -1
  387. codex/static_root/assets/flag-tab-iJTJldQ1.js.br +0 -0
  388. codex/static_root/assets/flag-tab-iJTJldQ1.js.gz +0 -0
  389. codex/static_root/assets/group-tab-DdmGE4gB.48ef83a4c7cd.js +0 -1
  390. codex/static_root/assets/group-tab-DdmGE4gB.48ef83a4c7cd.js.br +0 -0
  391. codex/static_root/assets/group-tab-DdmGE4gB.48ef83a4c7cd.js.gz +0 -0
  392. codex/static_root/assets/group-tab-DdmGE4gB.js +0 -1
  393. codex/static_root/assets/group-tab-DdmGE4gB.js.br +0 -0
  394. codex/static_root/assets/group-tab-DdmGE4gB.js.gz +0 -0
  395. codex/static_root/assets/http-error-HtOe8jPa.141ad665f81d.js +0 -1
  396. codex/static_root/assets/http-error-HtOe8jPa.141ad665f81d.js.br +0 -0
  397. codex/static_root/assets/http-error-HtOe8jPa.141ad665f81d.js.gz +0 -0
  398. codex/static_root/assets/http-error-HtOe8jPa.js +0 -1
  399. codex/static_root/assets/http-error-HtOe8jPa.js.br +0 -0
  400. codex/static_root/assets/http-error-HtOe8jPa.js.gz +0 -0
  401. codex/static_root/assets/library-tab-BN0SfPcH.913e236f625e.css.br +0 -0
  402. codex/static_root/assets/library-tab-BN0SfPcH.913e236f625e.css.gz +0 -0
  403. codex/static_root/assets/library-tab-BN0SfPcH.css.br +0 -0
  404. codex/static_root/assets/library-tab-BN0SfPcH.css.gz +0 -0
  405. codex/static_root/assets/library-tab-DLAJV6j2.dae6292bbf28.js +0 -1
  406. codex/static_root/assets/library-tab-DLAJV6j2.dae6292bbf28.js.br +0 -0
  407. codex/static_root/assets/library-tab-DLAJV6j2.dae6292bbf28.js.gz +0 -0
  408. codex/static_root/assets/library-tab-DLAJV6j2.js +0 -1
  409. codex/static_root/assets/library-tab-DLAJV6j2.js.br +0 -0
  410. codex/static_root/assets/library-tab-DLAJV6j2.js.gz +0 -0
  411. codex/static_root/assets/main-BjGE3kSi.22c1b19a9e19.js +0 -32
  412. codex/static_root/assets/main-BjGE3kSi.22c1b19a9e19.js.br +0 -0
  413. codex/static_root/assets/main-BjGE3kSi.22c1b19a9e19.js.gz +0 -0
  414. codex/static_root/assets/main-BjGE3kSi.js +0 -32
  415. codex/static_root/assets/main-BjGE3kSi.js.br +0 -0
  416. codex/static_root/assets/main-BjGE3kSi.js.gz +0 -0
  417. codex/static_root/assets/pagination-toolbar-C8CSryCU.9b61f95fd710.js +0 -1
  418. codex/static_root/assets/pagination-toolbar-C8CSryCU.9b61f95fd710.js.br +0 -0
  419. codex/static_root/assets/pagination-toolbar-C8CSryCU.9b61f95fd710.js.gz +0 -0
  420. codex/static_root/assets/pagination-toolbar-C8CSryCU.js +0 -1
  421. codex/static_root/assets/pagination-toolbar-C8CSryCU.js.br +0 -0
  422. codex/static_root/assets/pagination-toolbar-C8CSryCU.js.gz +0 -0
  423. codex/static_root/assets/pdf-doc-C-4EM9-d.ce9cf66bd4c3.js.br +0 -0
  424. codex/static_root/assets/pdf-doc-C-4EM9-d.ce9cf66bd4c3.js.gz +0 -0
  425. codex/static_root/assets/pdf-doc-C-4EM9-d.js.br +0 -0
  426. codex/static_root/assets/pdf-doc-C-4EM9-d.js.gz +0 -0
  427. codex/static_root/assets/reader-C5OTEQ7N.fae52c1fee51.js +0 -2
  428. codex/static_root/assets/reader-C5OTEQ7N.fae52c1fee51.js.br +0 -0
  429. codex/static_root/assets/reader-C5OTEQ7N.fae52c1fee51.js.gz +0 -0
  430. codex/static_root/assets/reader-C5OTEQ7N.js +0 -2
  431. codex/static_root/assets/reader-C5OTEQ7N.js.br +0 -0
  432. codex/static_root/assets/reader-C5OTEQ7N.js.gz +0 -0
  433. codex/static_root/assets/reader-DOQuhDYO.css.br +0 -0
  434. codex/static_root/assets/reader-DOQuhDYO.css.gz +0 -0
  435. codex/static_root/assets/reader-DOQuhDYO.df559ad29ab3.css.br +0 -0
  436. codex/static_root/assets/reader-DOQuhDYO.df559ad29ab3.css.gz +0 -0
  437. codex/static_root/assets/relation-chips-Bsc-gUxE.98e65384c3c9.css.br +0 -0
  438. codex/static_root/assets/relation-chips-Bsc-gUxE.98e65384c3c9.css.gz +0 -0
  439. codex/static_root/assets/relation-chips-Bsc-gUxE.css.br +0 -0
  440. codex/static_root/assets/relation-chips-Bsc-gUxE.css.gz +0 -0
  441. codex/static_root/assets/relation-chips-C4LQSHRc.3c85433df91c.js +0 -1
  442. codex/static_root/assets/relation-chips-C4LQSHRc.3c85433df91c.js.br +0 -0
  443. codex/static_root/assets/relation-chips-C4LQSHRc.3c85433df91c.js.gz +0 -0
  444. codex/static_root/assets/relation-chips-C4LQSHRc.js +0 -1
  445. codex/static_root/assets/relation-chips-C4LQSHRc.js.br +0 -0
  446. codex/static_root/assets/relation-chips-C4LQSHRc.js.gz +0 -0
  447. codex/static_root/assets/settings-drawer-aTAAoX2A.2f21008ade35.js +0 -2
  448. codex/static_root/assets/settings-drawer-aTAAoX2A.2f21008ade35.js.br +0 -0
  449. codex/static_root/assets/settings-drawer-aTAAoX2A.2f21008ade35.js.gz +0 -0
  450. codex/static_root/assets/settings-drawer-aTAAoX2A.js +0 -2
  451. codex/static_root/assets/settings-drawer-aTAAoX2A.js.br +0 -0
  452. codex/static_root/assets/settings-drawer-aTAAoX2A.js.gz +0 -0
  453. codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css +0 -1
  454. codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css.br +0 -0
  455. codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css.gz +0 -0
  456. codex/static_root/assets/stats-tab-B4yKuY0c.css +0 -1
  457. codex/static_root/assets/stats-tab-B4yKuY0c.css.br +0 -0
  458. codex/static_root/assets/stats-tab-B4yKuY0c.css.gz +0 -0
  459. codex/static_root/assets/stats-tab-DL4J3pvZ.b9056e70a70f.js +0 -1
  460. codex/static_root/assets/stats-tab-DL4J3pvZ.b9056e70a70f.js.br +0 -0
  461. codex/static_root/assets/stats-tab-DL4J3pvZ.b9056e70a70f.js.gz +0 -0
  462. codex/static_root/assets/stats-tab-DL4J3pvZ.js +0 -1
  463. codex/static_root/assets/stats-tab-DL4J3pvZ.js.br +0 -0
  464. codex/static_root/assets/stats-tab-DL4J3pvZ.js.gz +0 -0
  465. codex/static_root/assets/task-tab-0t7ZJlwL.1ff1cc14a6aa.js +0 -1
  466. codex/static_root/assets/task-tab-0t7ZJlwL.1ff1cc14a6aa.js.br +0 -0
  467. codex/static_root/assets/task-tab-0t7ZJlwL.1ff1cc14a6aa.js.gz +0 -0
  468. codex/static_root/assets/task-tab-0t7ZJlwL.js +0 -1
  469. codex/static_root/assets/task-tab-0t7ZJlwL.js.br +0 -0
  470. codex/static_root/assets/task-tab-0t7ZJlwL.js.gz +0 -0
  471. codex/static_root/assets/to-case-BCB751sX.4afb5ae1b77d.js +0 -1
  472. codex/static_root/assets/to-case-BCB751sX.js +0 -1
  473. codex/static_root/assets/unauthorized-Ovy_BO5R.598527e8e4fe.js +0 -1
  474. codex/static_root/assets/unauthorized-Ovy_BO5R.598527e8e4fe.js.br +0 -0
  475. codex/static_root/assets/unauthorized-Ovy_BO5R.598527e8e4fe.js.gz +0 -0
  476. codex/static_root/assets/unauthorized-Ovy_BO5R.js +0 -1
  477. codex/static_root/assets/unauthorized-Ovy_BO5R.js.br +0 -0
  478. codex/static_root/assets/unauthorized-Ovy_BO5R.js.gz +0 -0
  479. codex/static_root/assets/user-tab-Cdspo8ie.8e886a1a28e8.js +0 -1
  480. codex/static_root/assets/user-tab-Cdspo8ie.8e886a1a28e8.js.br +0 -0
  481. codex/static_root/assets/user-tab-Cdspo8ie.8e886a1a28e8.js.gz +0 -0
  482. codex/static_root/assets/user-tab-Cdspo8ie.js +0 -1
  483. codex/static_root/assets/user-tab-Cdspo8ie.js.br +0 -0
  484. codex/static_root/assets/user-tab-Cdspo8ie.js.gz +0 -0
  485. codex/static_root/manifest.80e911824648.json.br +0 -0
  486. codex/static_root/manifest.80e911824648.json.gz +0 -0
  487. {codex-1.6.2.dist-info → codex-1.6.3.dist-info}/LICENSE +0 -0
  488. {codex-1.6.2.dist-info → codex-1.6.3.dist-info}/WHEEL +0 -0
  489. {codex-1.6.2.dist-info → codex-1.6.3.dist-info}/entry_points.txt +0 -0
Binary file
Binary file
@@ -1 +1 @@
1
- {"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "js/choices.json": "js/choices.2f6b0359e1ef.json", "js/choices-admin.json": "js/choices-admin.3521e2a863df.json", "assets/relation-chips-Bsc-gUxE.css": "assets/relation-chips-Bsc-gUxE.98e65384c3c9.css", "assets/group-tab-CBKuS3Iv.css": "assets/group-tab-CBKuS3Iv.7e4746634782.css", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/VSelect-ARDhJiQK.css": "assets/VSelect-ARDhJiQK.372c098fb475.css", "assets/flag-tab-BNwbLfrN.css": "assets/flag-tab-BNwbLfrN.b755a99fff7e.css", "assets/admin-BH6uiYBb.js": "assets/admin-BH6uiYBb.d51c720fa05c.js", "assets/http-error-HtOe8jPa.js": "assets/http-error-HtOe8jPa.141ad665f81d.js", "assets/browser-DP9eEJ0M.css": "assets/browser-DP9eEJ0M.276e8636f8fc.css", "assets/group-tab-DdmGE4gB.js": "assets/group-tab-DdmGE4gB.48ef83a4c7cd.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/filter-DS84uTvk.js": "assets/filter-DS84uTvk.4fbebd4832bc.js", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/VWindowItem-FBuIO_rT.js": "assets/VWindowItem-FBuIO_rT.8610c7e83905.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSlideGroup-Dk_1upHt.css": "assets/VSlideGroup-Dk_1upHt.2c836070ec75.css", "assets/admin-drawer-panel-mne3FIj6.css": "assets/admin-drawer-panel-mne3FIj6.561b3f75fe65.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/settings-drawer-nZ9HvKSZ.css": "assets/settings-drawer-nZ9HvKSZ.01744e131806.css", "assets/VDialog-lQ13FnRR.css": "assets/VDialog-lQ13FnRR.1c801ad756b2.css", "assets/library-tab-DLAJV6j2.js": "assets/library-tab-DLAJV6j2.dae6292bbf28.js", "assets/flag-tab-iJTJldQ1.js": "assets/flag-tab-iJTJldQ1.213201f8e03b.js", "assets/main-Ztp855PW.css": "assets/main-Ztp855PW.d46d718fac45.css", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/pagination-toolbar-C8CSryCU.js": "assets/pagination-toolbar-C8CSryCU.9b61f95fd710.js", "assets/VSelect-Bnhj5kBc.js": "assets/VSelect-Bnhj5kBc.fdcd87c9e253.js", "assets/to-case-BCB751sX.js": "assets/to-case-BCB751sX.4afb5ae1b77d.js", "assets/VCheckboxBtn-BTFFFGx3.js": "assets/VCheckboxBtn-BTFFFGx3.0cbde4eb9a65.js", "assets/change-password-dialog-0u6IJA87.css": "assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css", "assets/VTable-BveGtxei.js": "assets/VTable-BveGtxei.7f76f4ef812b.js", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/VDialog-DTWAoZBU.js": "assets/VDialog-DTWAoZBU.b8c4c276e9b2.js", "assets/browser-BVciW8XB.js": "assets/browser-BVciW8XB.ab1d75272aa7.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/main-BjGE3kSi.js": "assets/main-BjGE3kSi.22c1b19a9e19.js", "assets/datetime-column-uaXWFgF_.js": "assets/datetime-column-uaXWFgF_.29c6d50b483e.js", "assets/VCheckbox-DUxuAZcY.js": "assets/VCheckbox-DUxuAZcY.46ab94043464.js", "assets/pagination-toolbar-BA9ifTed.css": "assets/pagination-toolbar-BA9ifTed.b4865334ee08.css", "assets/user-tab-Cdspo8ie.js": "assets/user-tab-Cdspo8ie.8e886a1a28e8.js", "assets/relation-chips-C4LQSHRc.js": "assets/relation-chips-C4LQSHRc.3c85433df91c.js", "assets/reader-C5OTEQ7N.js": "assets/reader-C5OTEQ7N.fae52c1fee51.js", "assets/library-tab-BN0SfPcH.css": "assets/library-tab-BN0SfPcH.913e236f625e.css", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/admin-drawer-panel-DsgLbfnD.js": "assets/admin-drawer-panel-DsgLbfnD.7c409b430d79.js", "assets/task-tab-0t7ZJlwL.js": "assets/task-tab-0t7ZJlwL.1ff1cc14a6aa.js", "assets/VRadioGroup-BY572TP-.js": "assets/VRadioGroup-BY572TP-.6d47a94795de.js", "assets/pdf-doc-C-4EM9-d.js": "assets/pdf-doc-C-4EM9-d.ce9cf66bd4c3.js", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/change-password-dialog-B-Sd5U5p.js": "assets/change-password-dialog-B-Sd5U5p.adf0a0f02866.js", "assets/VSlideGroup-DYJ3EYZI.js": "assets/VSlideGroup-DYJ3EYZI.a2542c5f90c4.js", "assets/unauthorized-Ovy_BO5R.js": "assets/unauthorized-Ovy_BO5R.598527e8e4fe.js", "assets/admin-B8Bp2Uih.css": "assets/admin-B8Bp2Uih.82c98714bcf1.css", "assets/VSelectionControl-DXxRmssH.js": "assets/VSelectionControl-DXxRmssH.252890f79cc6.js", "assets/settings-drawer-aTAAoX2A.js": "assets/settings-drawer-aTAAoX2A.2f21008ade35.js", "assets/task-tab-1XiWn9xP.css": "assets/task-tab-1XiWn9xP.06cb8e1b794d.css", "assets/VTextField-BayL7C1D.js": "assets/VTextField-BayL7C1D.6e53c61b3760.js", "assets/stats-tab-B4yKuY0c.css": "assets/stats-tab-B4yKuY0c.a5728396494b.css", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/reader-DOQuhDYO.css": "assets/reader-DOQuhDYO.df559ad29ab3.css", "assets/unauthorized-DWDO1s6-.css": "assets/unauthorized-DWDO1s6-.d34daac27dcf.css", "assets/VExpansionPanels-DsEXVcCv.css": "assets/VExpansionPanels-DsEXVcCv.20b475255e66.css", "assets/VExpansionPanels-D4psrz4h.js": "assets/VExpansionPanels-D4psrz4h.b55b901da65f.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/stats-tab-DL4J3pvZ.js": "assets/stats-tab-DL4J3pvZ.b9056e70a70f.js", "assets/VTextField-BssVoDhB.css": "assets/VTextField-BssVoDhB.4cc388b4aa3c.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/VCombobox-CGyBgdqr.js": "assets/VCombobox-CGyBgdqr.2f85598cc1a4.js", "assets/confirm-dialog-CYEBgtj5.js": "assets/confirm-dialog-CYEBgtj5.a5f142656c12.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.80e911824648.json"}, "version": "1.1", "hash": "5a4e0c1aba28"}
1
+ {"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "js/choices.json": "js/choices.2f6b0359e1ef.json", "js/choices-admin.json": "js/choices-admin.3521e2a863df.json", "assets/group-tab-CBKuS3Iv.css": "assets/group-tab-CBKuS3Iv.7e4746634782.css", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/VSelect-ARDhJiQK.css": "assets/VSelect-ARDhJiQK.372c098fb475.css", "assets/flag-tab-BNwbLfrN.css": "assets/flag-tab-BNwbLfrN.b755a99fff7e.css", "assets/VTable-CkCZonsu.js": "assets/VTable-CkCZonsu.81e34381271f.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/filter-XMAX5Nmg.js": "assets/filter-XMAX5Nmg.c6ed87350f7d.js", "assets/VWindowItem-_YBMW1SU.js": "assets/VWindowItem-_YBMW1SU.0836924f8c12.js", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/settings-drawer-rn3JdMxA.js": "assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js", "assets/library-tab-fDxuhPBs.js": "assets/library-tab-fDxuhPBs.285b36d9cec0.js", "assets/VTextField-fNAzFu1M.js": "assets/VTextField-fNAzFu1M.00dec8623f18.js", "assets/admin-drawer-panel-c3f3H29x.js": "assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js", "assets/VSelectionControl-DImIQPJV.js": "assets/VSelectionControl-DImIQPJV.1f14d2113063.js", "assets/VRadioGroup-tFEuhFRq.js": "assets/VRadioGroup-tFEuhFRq.774e14a4945a.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSlideGroup-Dk_1upHt.css": "assets/VSlideGroup-Dk_1upHt.2c836070ec75.css", "assets/relation-chips-CUWkvLNo.js": "assets/relation-chips-CUWkvLNo.3d18d0c09d39.js", "assets/admin-drawer-panel-mne3FIj6.css": "assets/admin-drawer-panel-mne3FIj6.561b3f75fe65.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/settings-drawer-nZ9HvKSZ.css": "assets/settings-drawer-nZ9HvKSZ.01744e131806.css", "assets/VDialog-lQ13FnRR.css": "assets/VDialog-lQ13FnRR.1c801ad756b2.css", "assets/relation-chips-BGitp3yx.css": "assets/relation-chips-BGitp3yx.b3e7d178a615.css", "assets/VCombobox-BDcFPzYf.js": "assets/VCombobox-BDcFPzYf.0b80447cd638.js", "assets/main-Ztp855PW.css": "assets/main-Ztp855PW.d46d718fac45.css", "assets/change-password-dialog-BbIO0YI5.js": "assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/admin-D4sw3N4T.css": "assets/admin-D4sw3N4T.b590f88a62cf.css", "assets/unauthorized-CllrtnFV.js": "assets/unauthorized-CllrtnFV.2a18fab3dd41.js", "assets/reader-YbzUiD0T.css": "assets/reader-YbzUiD0T.efb15835b39d.css", "assets/change-password-dialog-0u6IJA87.css": "assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/main-B3MfqYNN.js": "assets/main-B3MfqYNN.30d1310fc082.js", "assets/pagination-toolbar-BD6nzIKF.js": "assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VDialog-BB4zqrGw.js": "assets/VDialog-BB4zqrGw.2decc14ea597.js", "assets/pagination-toolbar-BA9ifTed.css": "assets/pagination-toolbar-BA9ifTed.b4865334ee08.css", "assets/library-tab-BygwYPnO.css": "assets/library-tab-BygwYPnO.94e92aa60bf2.css", "assets/reader-5Ja_bAaT.js": "assets/reader-5Ja_bAaT.2fe33a3891f6.js", "assets/stats-tab-B6L-YFRA.css": "assets/stats-tab-B6L-YFRA.1c90593f7b5c.css", "assets/user-tab-FY1xALpi.js": "assets/user-tab-FY1xALpi.05a88f51df4f.js", "assets/stats-tab-zts2Xsmg.js": "assets/stats-tab-zts2Xsmg.9fb959ccf4da.js", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/datetime-column-D8-UeX_p.js": "assets/datetime-column-D8-UeX_p.e33b1556805b.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/confirm-dialog-BrzuoYAT.js": "assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js", "assets/browser-DgawKPSA.css": "assets/browser-DgawKPSA.c7cf59dc4b21.css", "assets/VCheckbox-CXQlndFT.js": "assets/VCheckbox-CXQlndFT.c17c006a62e6.js", "assets/task-tab-1XiWn9xP.css": "assets/task-tab-1XiWn9xP.06cb8e1b794d.css", "assets/VExpansionPanels-SZc735F5.js": "assets/VExpansionPanels-SZc735F5.19004a0eba16.js", "assets/pdf-doc-iF15lKRp.js": "assets/pdf-doc-iF15lKRp.de9a9d394438.js", "assets/task-tab-CbzDX0IR.js": "assets/task-tab-CbzDX0IR.7b43bdf9cf42.js", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/admin-DYmGyJVg.js": "assets/admin-DYmGyJVg.262e6032ee86.js", "assets/flag-tab-BLEUVMot.js": "assets/flag-tab-BLEUVMot.c14936c90346.js", "assets/unauthorized-DWDO1s6-.css": "assets/unauthorized-DWDO1s6-.d34daac27dcf.css", "assets/VSlideGroup-CDaAHRAK.js": "assets/VSlideGroup-CDaAHRAK.783800d70a8a.js", "assets/VSelect-Dd5Zy8Uy.js": "assets/VSelect-Dd5Zy8Uy.f225abf824ff.js", "assets/http-error-C_EFLi0c.js": "assets/http-error-C_EFLi0c.c7e906206b62.js", "assets/group-tab-D9n5gZCA.js": "assets/group-tab-D9n5gZCA.634223001c44.js", "assets/VExpansionPanels-DsEXVcCv.css": "assets/VExpansionPanels-DsEXVcCv.20b475255e66.css", "assets/VCheckboxBtn-DB72Bclg.js": "assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/VTextField-BssVoDhB.css": "assets/VTextField-BssVoDhB.4cc388b4aa3c.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/browser-Ck3zWCOk.js": "assets/browser-Ck3zWCOk.d98c77747e6d.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.166aa32817b1.json"}, "version": "1.1", "hash": "704d3fcae5ee"}
@@ -4,7 +4,7 @@ from drf_spectacular.utils import extend_schema
4
4
  from rest_framework.response import Response
5
5
 
6
6
  from codex.models import Timestamp
7
- from codex.serializers.admin import APIKeySerializer
7
+ from codex.serializers.admin.stats import APIKeySerializer
8
8
  from codex.views.admin.auth import AdminGenericAPIView
9
9
 
10
10
 
codex/views/admin/flag.py CHANGED
@@ -5,7 +5,7 @@ from codex.librarian.notifier.tasks import LIBRARY_CHANGED_TASK
5
5
  from codex.logger.logging import get_logger
6
6
  from codex.models import AdminFlag
7
7
  from codex.registration import patch_registration_setting
8
- from codex.serializers.admin import AdminFlagSerializer
8
+ from codex.serializers.admin.flags import AdminFlagSerializer
9
9
  from codex.views.admin.auth import AdminModelViewSet
10
10
 
11
11
  LOG = get_logger(__name__)
@@ -6,7 +6,7 @@ from django.core.cache import cache
6
6
  from codex.librarian.mp_queue import LIBRARIAN_QUEUE
7
7
  from codex.librarian.notifier.tasks import LIBRARY_CHANGED_TASK
8
8
  from codex.logger.logging import get_logger
9
- from codex.serializers.admin import GroupSerializer
9
+ from codex.serializers.admin.groups import GroupSerializer
10
10
  from codex.views.admin.auth import AdminModelViewSet
11
11
 
12
12
  LOG = get_logger(__name__)
@@ -18,7 +18,7 @@ from codex.librarian.watchdog.tasks import (
18
18
  )
19
19
  from codex.logger.logging import get_logger
20
20
  from codex.models import FailedImport, Folder, Library
21
- from codex.serializers.admin import (
21
+ from codex.serializers.admin.libraries import (
22
22
  AdminFolderListSerializer,
23
23
  AdminFolderSerializer,
24
24
  FailedImportSerializer,
@@ -1,5 +1,6 @@
1
1
  """Admin Flag View."""
2
2
 
3
+ from multiprocessing import cpu_count
3
4
  from pathlib import Path
4
5
  from platform import machine, python_version, release, system
5
6
  from types import MappingProxyType
@@ -18,10 +19,14 @@ from codex.models import (
18
19
  Timestamp,
19
20
  )
20
21
  from codex.permissions import HasAPIKeyOrIsAdminUser
21
- from codex.serializers.admin import AdminStatsRequestSerializer, AdminStatsSerializer
22
+ from codex.serializers.admin.stats import (
23
+ AdminStatsRequestSerializer,
24
+ AdminStatsSerializer,
25
+ )
22
26
  from codex.version import VERSION
23
27
  from codex.views.admin.auth import AdminGenericAPIView
24
28
  from codex.views.const import CONFIG_MODELS, METADATA_MODELS, STATS_GROUP_MODELS
29
+ from codex.views.session import SessionView
25
30
 
26
31
  LOG = get_logger(__name__)
27
32
  _KEY_MODELS_MAP = MappingProxyType(
@@ -33,6 +38,16 @@ _KEY_MODELS_MAP = MappingProxyType(
33
38
  )
34
39
  _DOCKERENV_PATH = Path("/.dockerenv")
35
40
  _CGROUP_PATH = Path("/proc/self/cgroup")
41
+ _USER_STATS = MappingProxyType(
42
+ {
43
+ SessionView.BROWSER_SESSION_KEY: ("top_group", "order_by", "dynamic_covers"),
44
+ SessionView.READER_SESSION_KEY: (
45
+ "finish_on_last_page",
46
+ "fit_to",
47
+ "reading_direction",
48
+ ),
49
+ }
50
+ )
36
51
 
37
52
 
38
53
  class AdminStatsView(AdminGenericAPIView):
@@ -94,22 +109,39 @@ class AdminStatsView(AdminGenericAPIView):
94
109
  return obj
95
110
 
96
111
  @staticmethod
97
- def _get_anon_sessions():
112
+ def _aggregate_session_key(session, session_key, session_subkeys, user_stats):
113
+ session_dict = session.get(session_key, {})
114
+ for key in session_subkeys:
115
+ value = session_dict.get(key)
116
+ if value is None:
117
+ continue
118
+ if key not in user_stats:
119
+ user_stats[key] = {}
120
+ if value not in user_stats[key]:
121
+ user_stats[key][value] = 0
122
+ user_stats[key][value] += 1
123
+
124
+ @classmethod
125
+ def _get_session_stats(cls):
98
126
  """Return the number of anonymous sessions."""
99
127
  sessions = Session.objects.all()
100
- anon_sessions = 0
128
+ anon_session_count = 0
129
+ user_stats = {}
101
130
  for encoded_session in sessions:
102
131
  session = encoded_session.get_decoded()
103
132
  if not session.get("_auth_user_id"):
104
- anon_sessions += 1
133
+ anon_session_count += 1
134
+ for session_key, subkeys in _USER_STATS.items():
135
+ cls._aggregate_session_key(session, session_key, subkeys, user_stats)
105
136
 
106
- return anon_sessions
137
+ return user_stats, anon_session_count
107
138
 
108
139
  def _get_platform(self, obj):
109
140
  """Add dict of platform information to object."""
110
141
  platform = {
111
142
  "docker": self._is_docker(),
112
143
  "machine": machine(),
144
+ "cores": cpu_count(),
113
145
  "system": system(),
114
146
  "system_release": release(),
115
147
  "python": python_version(),
@@ -121,13 +153,15 @@ class AdminStatsView(AdminGenericAPIView):
121
153
  """Add dict of config informaation to object."""
122
154
  config = self._get_model_counts("config")
123
155
  request_counts = self._get_request_counts("config")
124
- if not request_counts or "sessionanon" in request_counts:
125
- config["sessions_anon_count"] = self._get_anon_sessions()
156
+ sessions, config["anonymous_users_count"] = self._get_session_stats()
126
157
  if not request_counts or "apikey" in request_counts:
127
158
  config["api_key"] = Timestamp.objects.get(
128
159
  key=Timestamp.TimestampChoices.API_KEY.value
129
160
  ).version
161
+ config["registered_users_count"] = config.pop("users_count", 0)
162
+ config["user_groups_count"] = config.pop("groups_count", 0)
130
163
  obj["config"] = config
164
+ obj["sessions"] = sessions
131
165
 
132
166
  def _get_file_types(self):
133
167
  """Query for file types."""
@@ -44,7 +44,7 @@ from codex.librarian.watchdog.tasks import (
44
44
  )
45
45
  from codex.logger.logging import get_logger
46
46
  from codex.models import LibrarianStatus
47
- from codex.serializers.admin import AdminLibrarianTaskSerializer
47
+ from codex.serializers.admin.tasks import AdminLibrarianTaskSerializer
48
48
  from codex.serializers.mixins import OKSerializer
49
49
  from codex.serializers.models.admin import LibrarianStatusSerializer
50
50
  from codex.views.admin.auth import AdminAPIView, AdminReadOnlyModelViewSet
codex/views/admin/user.py CHANGED
@@ -10,7 +10,7 @@ from rest_framework.status import HTTP_202_ACCEPTED, HTTP_400_BAD_REQUEST
10
10
  from codex.librarian.mp_queue import LIBRARIAN_QUEUE
11
11
  from codex.librarian.notifier.tasks import LIBRARY_CHANGED_TASK
12
12
  from codex.logger.logging import get_logger
13
- from codex.serializers.admin import UserChangePasswordSerializer, UserSerializer
13
+ from codex.serializers.admin.users import UserChangePasswordSerializer, UserSerializer
14
14
  from codex.views.admin.auth import AdminGenericAPIView, AdminModelViewSet
15
15
 
16
16
  LOG = get_logger(__name__)
@@ -81,7 +81,10 @@ class BrowserView(BrowserTitleView):
81
81
  self.group_query = self.group_class.objects.none()
82
82
  else:
83
83
  reason = f"{group}__in={pks} does not exist!"
84
- self.raise_redirect(reason, route_mask={"group": group})
84
+ settings_mask = {"breadcrumbs": []}
85
+ self.raise_redirect(
86
+ reason, route_mask={"group": group}, settings_mask=settings_mask
87
+ )
85
88
  elif self.group_class:
86
89
  self.group_query = self.group_class.objects.none()
87
90
  else:
@@ -18,9 +18,9 @@ _FILTER_REL_MAP = MappingProxyType(
18
18
  class ComicFieldFilterView(GroupFilterView):
19
19
  """Comic field filters."""
20
20
 
21
- def _filter_by_comic_field(self, field, rel_prefix):
21
+ @staticmethod
22
+ def _filter_by_comic_field(field, rel_prefix, filter_list):
22
23
  """Filter by a comic any2many attribute."""
23
- filter_list = self.params["filters"].get(field) # type: ignore
24
24
  filter_query = Q()
25
25
  if not filter_list:
26
26
  return filter_query
@@ -36,10 +36,19 @@ class ComicFieldFilterView(GroupFilterView):
36
36
  filter_query |= Q(**{f"{rel}__in": filter_list})
37
37
  return filter_query
38
38
 
39
+ @classmethod
40
+ def get_all_comic_field_filters(cls, rel_prefix, filters):
41
+ """Get all comicfiled filters for rel_prefix."""
42
+ comic_field_filter = Q()
43
+ for field in cls.FILTER_ATTRIBUTES:
44
+ filter_list = filters.get(field, [])
45
+ comic_field_filter &= cls._filter_by_comic_field(
46
+ field, rel_prefix, filter_list
47
+ )
48
+ return comic_field_filter
49
+
39
50
  def get_comic_field_filter(self, model):
40
51
  """Filter the comics based on the form filters."""
41
- comic_field_filter = Q()
42
52
  rel_prefix = self.get_rel_prefix(model)
43
- for attribute in self.FILTER_ATTRIBUTES:
44
- comic_field_filter &= self._filter_by_comic_field(attribute, rel_prefix)
45
- return comic_field_filter
53
+ filters = self.params["filters"] # type: ignore
54
+ return self.get_all_comic_field_filters(rel_prefix, filters)
@@ -13,6 +13,7 @@ from codex.views.browser.annotations import BrowserAnnotationsView
13
13
  from codex.views.const import (
14
14
  MAX_OBJ_PER_PAGE,
15
15
  )
16
+ from codex.views.util import Route
16
17
 
17
18
  LOG = get_logger(__name__)
18
19
 
@@ -20,30 +21,79 @@ LOG = get_logger(__name__)
20
21
  class BrowserPaginateView(BrowserAnnotationsView):
21
22
  """Browser pagination."""
22
23
 
24
+ def _get_back_one_page_route(self, num_pages):
25
+ """Get max page if oob or 1."""
26
+ LOG.debug("Redirect back one page.")
27
+ group = self.kwargs.get("group")
28
+ pks = self.kwargs.get("pks")
29
+ page = self.kwargs.get("page", 1)
30
+ new_page = num_pages if num_pages and page > num_pages else 1
31
+ pks = pks if pks else "0"
32
+ return {"group": group, "pks": pks, "page": new_page}
33
+
34
+ def _get_up_breadcrumbs(self):
35
+ """Walk up the breadcrumbs to get the next level up."""
36
+ breadcrumbs = self.params.get("breadcrumbs", [])
37
+ new_breadcrumbs = []
38
+ level = False
39
+ group = self.kwargs.get("group")
40
+ pks = self.kwargs.get("pks")
41
+ page = self.kwargs.get("page", 1)
42
+ current_route = Route(group=group, pks=pks, page=page)
43
+ for crumb in reversed(breadcrumbs):
44
+ if not level:
45
+ crumb_route = Route(**crumb)
46
+ level = current_route & crumb_route
47
+ continue
48
+ new_breadcrumbs = [crumb, *new_breadcrumbs]
49
+
50
+ if not new_breadcrumbs:
51
+ if group not in ("f", "a"):
52
+ group = "r"
53
+ top_route = {"group": group, "pks": (), "page": 1}
54
+ new_breadcrumbs = [top_route]
55
+ return new_breadcrumbs
56
+
57
+ def _get_up_page_redirect(self):
58
+ """Walk up the breadcrumbs."""
59
+ try:
60
+ up_breadcrumbs = self._get_up_breadcrumbs()
61
+ route_mask = up_breadcrumbs[-1]
62
+ settings_mask = {"breadcrumbs": up_breadcrumbs}
63
+ LOG.debug("Redirect up a level.")
64
+ except IndexError:
65
+ group = self.kwargs.get("group")
66
+ pks = "0"
67
+ new_page = 1
68
+ route_mask = {"group": group, "pks": pks, "page": new_page}
69
+ settings_mask = {"breadcrumbs": [route_mask]}
70
+ LOG.debug("Redirect to all at current group.")
71
+ return route_mask, settings_mask
72
+
23
73
  def _check_page_in_bounds(self, total_count):
24
74
  """Redirect page out of bounds."""
25
75
  pks = self.kwargs.get("pks")
26
76
  page = self.kwargs.get("page", 1)
27
77
  num_pages = ceil(total_count / MAX_OBJ_PER_PAGE)
28
- if (not pks and page == 1) or (page >= 1 and page <= num_pages):
78
+ if page == 1 or (page >= 1 and page <= num_pages):
29
79
  # Don't redirect if on the root page for the group.
30
80
  # Or page within valid range.
31
81
  return num_pages
32
82
 
33
- # Adjust route mask for redirect
34
83
  group = self.kwargs.get("group")
84
+ reason = f"{group=} {pks=} {page=} does not exist."
85
+
86
+ # Adjust route mask for redirect
35
87
  if num_pages and page > 1:
36
- # Try page 1 first.
37
- new_page = num_pages if num_pages and page > num_pages else 1
38
- pks = pks if pks else "0"
88
+ route_mask = self._get_back_one_page_route(num_pages)
89
+ settings_mask = None
39
90
  else:
40
- # Redirect to root for the group.
41
- pks = "0"
42
- new_page = 1
91
+ # This now only occurs when page < 1
92
+ route_mask, settings_mask = self._get_up_page_redirect()
43
93
 
44
- reason = f"{page=} does not exist!"
45
- route_changes = {"group": group, "pks": pks, "page": new_page}
46
- return self.raise_redirect(reason, route_mask=route_changes)
94
+ return self.raise_redirect(
95
+ reason, route_mask=route_mask, settings_mask=settings_mask
96
+ )
47
97
 
48
98
  def _paginate_section(self, model, qs, page):
49
99
  """Paginate a group or Comic section."""
@@ -15,7 +15,6 @@ from codex.views.const import (
15
15
  )
16
16
 
17
17
  LOG = get_logger(__name__)
18
- _NO_TOP_GROUP_VALIDATE = frozenset({"metadata"})
19
18
 
20
19
 
21
20
  class BrowserValidateView(BrowserBaseView):
@@ -56,8 +55,6 @@ class BrowserValidateView(BrowserBaseView):
56
55
  return valid_top_groups
57
56
 
58
57
  def _validate_top_group(self, valid_top_groups):
59
- # if self.TARGET in _NO_TOP_GROUP_VALIDATE:
60
- # return
61
58
  nav_group = self.kwargs.get("group")
62
59
  top_group = self.params.get("top_group")
63
60
  if top_group not in valid_top_groups:
@@ -72,7 +69,8 @@ class BrowserValidateView(BrowserBaseView):
72
69
  pks = self.kwargs.get("pks", ())
73
70
  page = self.kwargs["page"]
74
71
  route = {"group": nav_group, "pks": pks, "page": page}
75
- settings_mask = {"top_group": valid_top_group}
72
+ breadcrumbs = []
73
+ settings_mask = {"top_group": valid_top_group, "breadcrumbs": breadcrumbs}
76
74
  self.raise_redirect(reason, route, settings_mask)
77
75
 
78
76
  def set_valid_browse_nav_groups(self, valid_top_groups):
@@ -109,7 +107,11 @@ class BrowserValidateView(BrowserBaseView):
109
107
  if not self.admin_flags["folder_view"]:
110
108
  reason = "folder view disabled"
111
109
  valid_top_groups = self._get_valid_browse_top_groups()
112
- settings_mask = {"top_group": valid_top_groups[0]}
110
+ breadcrumbs = []
111
+ settings_mask = {
112
+ "top_group": valid_top_groups[0],
113
+ "breadcrumbs": breadcrumbs,
114
+ }
113
115
  self.raise_redirect(reason, settings_mask=settings_mask)
114
116
 
115
117
  valid_top_groups = (FOLDER_GROUP,)
@@ -6,11 +6,9 @@ from codex.views.opds.auth import OPDSAuthMixin
6
6
  from codex.views.reader.page import ReaderPageView
7
7
 
8
8
 
9
- class OPDSCoverView(CoverView):
9
+ class OPDSCoverView(OPDSAuthMixin, CoverView):
10
10
  """Cover View with Basic Auth."""
11
11
 
12
- # Panels sometimes doesn't send auth with cover requests.
13
-
14
12
 
15
13
  class OPDSDownloadView(OPDSAuthMixin, DownloadView):
16
14
  """Download View with Basic Auth."""
codex/views/opds/const.py CHANGED
@@ -84,3 +84,13 @@ class MimeType:
84
84
 
85
85
 
86
86
  OPDS_M2M_MODELS = (Character, Genre, Location, SeriesGroup, StoryArc, Tag, Team)
87
+
88
+
89
+ class UserAgentNames:
90
+ """Control whether to hack in facets with nav links."""
91
+
92
+ CLIENT_REORDERS = frozenset({"Chunky"})
93
+ FACET_SUPPORT = frozenset({"yar"}) # kybooks
94
+ SIMPLE_DOWNLOAD_MIME_TYPES = frozenset({"PocketBook Reader"})
95
+ # Other known valid names:
96
+ # "Chunky"
codex/views/opds/util.py CHANGED
@@ -93,3 +93,13 @@ def full_redirect_view(url_name):
93
93
  return response
94
94
 
95
95
  return func
96
+
97
+
98
+ def get_user_agent_name(request):
99
+ """Get the first part of the user agent."""
100
+ user_agent_name = ""
101
+ if (user_agent := request.headers.get("User-Agent")) and (
102
+ user_agent_parts := user_agent.split("/", 1)
103
+ ):
104
+ user_agent_name = user_agent_parts[0]
105
+ return user_agent_name
@@ -17,7 +17,8 @@ from codex.serializers.opds.v1 import (
17
17
  )
18
18
  from codex.views.const import FALSY, MAX_OBJ_PER_PAGE
19
19
  from codex.views.opds.auth import OPDSTemplateView
20
- from codex.views.opds.const import BLANK_TITLE, MimeType
20
+ from codex.views.opds.const import BLANK_TITLE, MimeType, UserAgentNames
21
+ from codex.views.opds.util import get_user_agent_name
21
22
  from codex.views.opds.v1.entry.data import OPDS1EntryData
22
23
  from codex.views.opds.v1.entry.entry import OPDS1Entry
23
24
  from codex.views.opds.v1.links import (
@@ -41,16 +42,6 @@ class OpdsNs:
41
42
  ACQUISITION = "http://opds-spec.org/2010/acquisition"
42
43
 
43
44
 
44
- class UserAgentNames:
45
- """Control whether to hack in facets with nav links."""
46
-
47
- CLIENT_REORDERS = frozenset({"Chunky"})
48
- FACET_SUPPORT = frozenset({"yar"}) # kybooks
49
- SIMPLE_DOWNLOAD_MIME_TYPES = frozenset({"PocketBook Reader"})
50
- # Other known valid names:
51
- # "Panels", "Chunky"
52
-
53
-
54
45
  class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
55
46
  """OPDS 1 Feed."""
56
47
 
@@ -218,19 +209,10 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
218
209
 
219
210
  def _set_user_agent_variables(self):
220
211
  """Set User Agent variables."""
221
- user_agent = self.request.headers.get("User-Agent")
222
- if not user_agent:
223
- return
224
- user_agent_parts = user_agent.split("/", 1)
225
- if user_agent_parts:
226
- user_agent_name = user_agent_parts[0]
227
- else:
228
- return
212
+ user_agent_name = get_user_agent_name(self.request)
229
213
 
230
- if user_agent_name in UserAgentNames.FACET_SUPPORT:
231
- self.use_facets = True
232
- if user_agent_name in UserAgentNames.CLIENT_REORDERS:
233
- self.skip_order_facets = True
214
+ self.user_facets = user_agent_name in UserAgentNames.FACET_SUPPORT
215
+ self.skip_order_facets = user_agent_name in UserAgentNames.CLIENT_REORDERS
234
216
  if user_agent_name in UserAgentNames.SIMPLE_DOWNLOAD_MIME_TYPES:
235
217
  self.mime_type_map = MimeType.SIMPLE_FILE_TYPE_MAP
236
218