codex 1.7.1__py3-none-any.whl → 1.7.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 (916) hide show
  1. codex/asgi.py +2 -1
  2. codex/choices.py +10 -21
  3. codex/choices_to_json.py +8 -8
  4. codex/db.py +2 -2
  5. codex/exceptions.py +5 -6
  6. codex/librarian/bookmark/bookmarkd.py +9 -6
  7. codex/librarian/bookmark/tasks.py +1 -1
  8. codex/librarian/bookmark/update.py +17 -31
  9. codex/librarian/covers/create.py +10 -8
  10. codex/librarian/covers/path.py +6 -5
  11. codex/librarian/covers/purge.py +2 -2
  12. codex/librarian/cron/crond.py +1 -1
  13. codex/librarian/importer/aggregate.py +2 -2
  14. codex/librarian/importer/cache.py +1 -4
  15. codex/librarian/importer/create_comics.py +2 -2
  16. codex/librarian/importer/create_covers.py +1 -1
  17. codex/librarian/importer/create_fks.py +4 -3
  18. codex/librarian/importer/deleted.py +3 -3
  19. codex/librarian/importer/extract.py +2 -2
  20. codex/librarian/importer/failed_imports.py +1 -1
  21. codex/librarian/importer/importer.py +3 -1
  22. codex/librarian/importer/importerd.py +3 -3
  23. codex/librarian/importer/link_comics.py +2 -1
  24. codex/librarian/importer/moved.py +2 -7
  25. codex/librarian/importer/query_fks.py +3 -6
  26. codex/librarian/importer/tasks.py +1 -1
  27. codex/librarian/janitor/integrity.py +27 -20
  28. codex/librarian/janitor/janitor.py +5 -2
  29. codex/librarian/janitor/latest_version.py +1 -1
  30. codex/librarian/janitor/update.py +2 -2
  31. codex/librarian/janitor/vacuum.py +1 -1
  32. codex/librarian/librariand.py +16 -15
  33. codex/librarian/notifier/notifierd.py +2 -1
  34. codex/librarian/search/optimize.py +1 -1
  35. codex/librarian/search/remove.py +1 -1
  36. codex/librarian/search/update.py +11 -7
  37. codex/librarian/telemeter/stats.py +7 -6
  38. codex/librarian/telemeter/telemeter.py +0 -1
  39. codex/librarian/watchdog/db_snapshot.py +3 -3
  40. codex/librarian/watchdog/dir_snapshot_diff.py +3 -4
  41. codex/librarian/watchdog/emitter.py +4 -4
  42. codex/librarian/watchdog/event_batcherd.py +2 -1
  43. codex/librarian/watchdog/events.py +1 -2
  44. codex/librarian/watchdog/observers.py +15 -10
  45. codex/logger/loggerd.py +40 -17
  46. codex/logger/logging.py +1 -1
  47. codex/memory.py +3 -2
  48. codex/migrations/0001_init.py +1 -2
  49. codex/migrations/0014_pdf_issue_suffix_remove_cover_image_sort_name.py +1 -2
  50. codex/migrations/0018_rename_userbookmark_bookmark.py +1 -2
  51. codex/migrations/0028_telemeter.py +1 -5
  52. codex/migrations/0031_adminflag_banner.py +50 -0
  53. codex/models/admin.py +4 -3
  54. codex/models/base.py +3 -1
  55. codex/models/bookmark.py +4 -7
  56. codex/models/comic.py +2 -2
  57. codex/models/functions.py +12 -5
  58. codex/models/groups.py +1 -1
  59. codex/models/library.py +1 -1
  60. codex/models/paths.py +4 -4
  61. codex/models/query.py +8 -4
  62. codex/models/util.py +1 -1
  63. codex/permissions.py +1 -1
  64. codex/run.py +1 -1
  65. codex/serializers/admin/flags.py +1 -1
  66. codex/serializers/admin/libraries.py +1 -3
  67. codex/serializers/auth.py +1 -0
  68. codex/serializers/browser/choices.py +9 -11
  69. codex/serializers/browser/metadata.py +1 -1
  70. codex/serializers/browser/mixins.py +5 -1
  71. codex/serializers/browser/settings.py +2 -2
  72. codex/serializers/fields.py +7 -7
  73. codex/serializers/models/base.py +1 -1
  74. codex/serializers/models/comic.py +2 -2
  75. codex/serializers/models/groups.py +0 -2
  76. codex/serializers/opds/authentication.py +2 -1
  77. codex/serializers/opds/v2/__init__.py +1 -0
  78. codex/serializers/opds/v2/facet.py +13 -0
  79. codex/serializers/opds/v2/feed.py +36 -0
  80. codex/serializers/opds/v2/links.py +75 -0
  81. codex/serializers/opds/v2/metadata.py +23 -0
  82. codex/serializers/opds/v2/progression.py +65 -0
  83. codex/serializers/opds/v2/publication.py +81 -0
  84. codex/serializers/opds/{v2_unused.py → v2/unused.py} +16 -9
  85. codex/serializers/route.py +2 -2
  86. codex/settings/settings.py +4 -3
  87. codex/signals/django_signals.py +1 -1
  88. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js +1 -0
  89. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js.br +0 -0
  90. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js.gz +0 -0
  91. codex/static_root/assets/VCheckbox-Dv6fwaDb.js +1 -0
  92. codex/static_root/assets/VCheckbox-Dv6fwaDb.js.br +0 -0
  93. codex/static_root/assets/VCheckbox-Dv6fwaDb.js.gz +0 -0
  94. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js +1 -0
  95. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js.br +0 -0
  96. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js.gz +0 -0
  97. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js +1 -0
  98. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js.br +0 -0
  99. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js.gz +0 -0
  100. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js +1 -0
  101. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js.br +0 -0
  102. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js.gz +0 -0
  103. codex/static_root/assets/VCombobox-DqBFki-9.js +1 -0
  104. codex/static_root/assets/VCombobox-DqBFki-9.js.br +0 -0
  105. codex/static_root/assets/VCombobox-DqBFki-9.js.gz +0 -0
  106. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js +1 -0
  107. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js.br +0 -0
  108. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js.gz +0 -0
  109. codex/static_root/assets/VDialog-CQXjBvDZ.js +1 -0
  110. codex/static_root/assets/VDialog-CQXjBvDZ.js.br +0 -0
  111. codex/static_root/assets/VDialog-CQXjBvDZ.js.gz +0 -0
  112. codex/static_root/assets/VDialog-DWos4S54.b07aca713774.css +1 -0
  113. codex/static_root/assets/VDialog-DWos4S54.b07aca713774.css.br +0 -0
  114. codex/static_root/assets/VDialog-DWos4S54.b07aca713774.css.gz +0 -0
  115. codex/static_root/assets/VDialog-DWos4S54.css +1 -0
  116. codex/static_root/assets/VDialog-DWos4S54.css.br +0 -0
  117. codex/static_root/assets/VDialog-DWos4S54.css.gz +0 -0
  118. codex/static_root/assets/VDivider-DU47sRrT.3d2e17799e5c.css +1 -0
  119. codex/static_root/assets/VDivider-DU47sRrT.3d2e17799e5c.css.br +0 -0
  120. codex/static_root/assets/VDivider-DU47sRrT.3d2e17799e5c.css.gz +0 -0
  121. codex/static_root/assets/VDivider-DU47sRrT.css +1 -0
  122. codex/static_root/assets/VDivider-DU47sRrT.css.br +0 -0
  123. codex/static_root/assets/VDivider-DU47sRrT.css.gz +0 -0
  124. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js +1 -0
  125. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js.br +0 -0
  126. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js.gz +0 -0
  127. codex/static_root/assets/VDivider-DUxQu-IZ.js +1 -0
  128. codex/static_root/assets/VDivider-DUxQu-IZ.js.br +0 -0
  129. codex/static_root/assets/VDivider-DUxQu-IZ.js.gz +0 -0
  130. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js +1 -0
  131. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js.br +0 -0
  132. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js.gz +0 -0
  133. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js +1 -0
  134. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js.br +0 -0
  135. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js.gz +0 -0
  136. codex/static_root/assets/VForm-DxBt30-N.138c0b89b6fc.css +1 -0
  137. codex/static_root/assets/VForm-DxBt30-N.138c0b89b6fc.css.br +0 -0
  138. codex/static_root/assets/VForm-DxBt30-N.138c0b89b6fc.css.gz +0 -0
  139. codex/static_root/assets/VForm-DxBt30-N.css +1 -0
  140. codex/static_root/assets/VForm-DxBt30-N.css.br +0 -0
  141. codex/static_root/assets/VForm-DxBt30-N.css.gz +0 -0
  142. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js +1 -0
  143. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js.br +0 -0
  144. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js.gz +0 -0
  145. codex/static_root/assets/VForm-hB4C5jVd.js +1 -0
  146. codex/static_root/assets/VForm-hB4C5jVd.js.br +0 -0
  147. codex/static_root/assets/VForm-hB4C5jVd.js.gz +0 -0
  148. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js +1 -0
  149. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js.br +0 -0
  150. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js.gz +0 -0
  151. codex/static_root/assets/VRadioGroup-DOjw38qB.js +1 -0
  152. codex/static_root/assets/VRadioGroup-DOjw38qB.js.br +0 -0
  153. codex/static_root/assets/VRadioGroup-DOjw38qB.js.gz +0 -0
  154. codex/static_root/assets/VSelect-CP_CVb8s.6309f7bf17bb.css +1 -0
  155. codex/static_root/assets/VSelect-CP_CVb8s.6309f7bf17bb.css.br +0 -0
  156. codex/static_root/assets/VSelect-CP_CVb8s.6309f7bf17bb.css.gz +0 -0
  157. codex/static_root/assets/VSelect-CP_CVb8s.css +1 -0
  158. codex/static_root/assets/VSelect-CP_CVb8s.css.br +0 -0
  159. codex/static_root/assets/VSelect-CP_CVb8s.css.gz +0 -0
  160. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js +1 -0
  161. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js.br +0 -0
  162. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js.gz +0 -0
  163. codex/static_root/assets/VSelect-L4v_m3ag.js +1 -0
  164. codex/static_root/assets/VSelect-L4v_m3ag.js.br +0 -0
  165. codex/static_root/assets/VSelect-L4v_m3ag.js.gz +0 -0
  166. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js +1 -0
  167. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js.br +0 -0
  168. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js.gz +0 -0
  169. codex/static_root/assets/VSelectionControl-BqB1JeKa.js +1 -0
  170. codex/static_root/assets/VSelectionControl-BqB1JeKa.js.br +0 -0
  171. codex/static_root/assets/VSelectionControl-BqB1JeKa.js.gz +0 -0
  172. codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css +1 -0
  173. codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css.br +0 -0
  174. codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css.gz +0 -0
  175. codex/static_root/assets/VSelectionControl-DPpfgCW2.css +1 -0
  176. codex/static_root/assets/VSelectionControl-DPpfgCW2.css.br +0 -0
  177. codex/static_root/assets/VSelectionControl-DPpfgCW2.css.gz +0 -0
  178. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js +1 -0
  179. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js.br +0 -0
  180. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js.gz +0 -0
  181. codex/static_root/assets/VTable-CtorAbOx.js +1 -0
  182. codex/static_root/assets/VTable-CtorAbOx.js.br +0 -0
  183. codex/static_root/assets/VTable-CtorAbOx.js.gz +0 -0
  184. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js +1 -0
  185. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js.br +0 -0
  186. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js.gz +0 -0
  187. codex/static_root/assets/VWindowItem-Bl-fa3ss.js +1 -0
  188. codex/static_root/assets/VWindowItem-Bl-fa3ss.js.br +0 -0
  189. codex/static_root/assets/VWindowItem-Bl-fa3ss.js.gz +0 -0
  190. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js +1 -0
  191. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js.br +0 -0
  192. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js.gz +0 -0
  193. codex/static_root/assets/admin-BAVKNREt.js +1 -0
  194. codex/static_root/assets/admin-BAVKNREt.js.br +0 -0
  195. codex/static_root/assets/admin-BAVKNREt.js.gz +0 -0
  196. codex/static_root/assets/admin-C3iCIUnm.06cb213f624d.css +1 -0
  197. codex/static_root/assets/admin-C3iCIUnm.06cb213f624d.css.br +0 -0
  198. codex/static_root/assets/admin-C3iCIUnm.06cb213f624d.css.gz +0 -0
  199. codex/static_root/assets/admin-C3iCIUnm.css +1 -0
  200. codex/static_root/assets/admin-C3iCIUnm.css.br +0 -0
  201. codex/static_root/assets/admin-C3iCIUnm.css.gz +0 -0
  202. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js +1 -0
  203. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js.br +0 -0
  204. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js.gz +0 -0
  205. codex/static_root/assets/admin-CHuFhx_t.js +1 -0
  206. codex/static_root/assets/admin-CHuFhx_t.js.br +0 -0
  207. codex/static_root/assets/admin-CHuFhx_t.js.gz +0 -0
  208. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js +1 -0
  209. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js.br +0 -0
  210. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js.gz +0 -0
  211. codex/static_root/assets/admin-menu-T8WJ_x0C.js +1 -0
  212. codex/static_root/assets/admin-menu-T8WJ_x0C.js.br +0 -0
  213. codex/static_root/assets/admin-menu-T8WJ_x0C.js.gz +0 -0
  214. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js +1 -0
  215. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js.br +0 -0
  216. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js.gz +0 -0
  217. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js +1 -0
  218. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js.br +0 -0
  219. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js.gz +0 -0
  220. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css +1 -0
  221. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css.br +0 -0
  222. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css.gz +0 -0
  223. codex/static_root/assets/browser-DNzQvgkY.css +1 -0
  224. codex/static_root/assets/browser-DNzQvgkY.css.br +0 -0
  225. codex/static_root/assets/browser-DNzQvgkY.css.gz +0 -0
  226. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js +1 -0
  227. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js.br +0 -0
  228. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js.gz +0 -0
  229. codex/static_root/assets/browser-DdLCtUlr.js +1 -0
  230. codex/static_root/assets/browser-DdLCtUlr.js.br +0 -0
  231. codex/static_root/assets/browser-DdLCtUlr.js.gz +0 -0
  232. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js +1 -0
  233. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js.br +0 -0
  234. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js.gz +0 -0
  235. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js +1 -0
  236. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js.br +0 -0
  237. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js.gz +0 -0
  238. codex/static_root/assets/change-password-dialog-D0ymWcl_.a30e68c6e303.css +1 -0
  239. codex/static_root/assets/change-password-dialog-D0ymWcl_.a30e68c6e303.css.br +0 -0
  240. codex/static_root/assets/change-password-dialog-D0ymWcl_.a30e68c6e303.css.gz +0 -0
  241. codex/static_root/assets/change-password-dialog-D0ymWcl_.css +1 -0
  242. codex/static_root/assets/change-password-dialog-D0ymWcl_.css.br +0 -0
  243. codex/static_root/assets/change-password-dialog-D0ymWcl_.css.gz +0 -0
  244. codex/static_root/assets/confirm-dialog-B1ABbGMU.9b5915b112c0.css +1 -0
  245. codex/static_root/assets/confirm-dialog-B1ABbGMU.9b5915b112c0.css.br +0 -0
  246. codex/static_root/assets/confirm-dialog-B1ABbGMU.css +1 -0
  247. codex/static_root/assets/confirm-dialog-B1ABbGMU.css.br +0 -0
  248. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js +1 -0
  249. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js.br +0 -0
  250. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js.gz +0 -0
  251. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js +1 -0
  252. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js.br +0 -0
  253. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js.gz +0 -0
  254. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js +1 -0
  255. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js.br +0 -0
  256. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js.gz +0 -0
  257. codex/static_root/assets/datetime-column-DVC0YqHC.js +1 -0
  258. codex/static_root/assets/datetime-column-DVC0YqHC.js.br +0 -0
  259. codex/static_root/assets/datetime-column-DVC0YqHC.js.gz +0 -0
  260. codex/static_root/assets/{filter-CnO_WiBE.4044b9091aae.js → filter-xcEcgcIx.be1bb4725c89.js} +1 -1
  261. codex/static_root/assets/filter-xcEcgcIx.be1bb4725c89.js.br +0 -0
  262. codex/static_root/assets/filter-xcEcgcIx.be1bb4725c89.js.gz +0 -0
  263. codex/static_root/assets/{filter-CnO_WiBE.js → filter-xcEcgcIx.js} +1 -1
  264. codex/static_root/assets/filter-xcEcgcIx.js.br +0 -0
  265. codex/static_root/assets/filter-xcEcgcIx.js.gz +0 -0
  266. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js +1 -0
  267. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js.br +0 -0
  268. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js.gz +0 -0
  269. codex/static_root/assets/flag-tab-BOyQb0kr.js +1 -0
  270. codex/static_root/assets/flag-tab-BOyQb0kr.js.br +0 -0
  271. codex/static_root/assets/flag-tab-BOyQb0kr.js.gz +0 -0
  272. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css +1 -0
  273. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css.br +0 -0
  274. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css.gz +0 -0
  275. codex/static_root/assets/flag-tab-D2MYXCHk.css +1 -0
  276. codex/static_root/assets/flag-tab-D2MYXCHk.css.br +0 -0
  277. codex/static_root/assets/flag-tab-D2MYXCHk.css.gz +0 -0
  278. codex/static_root/assets/{VDialog-CSvrKKb2.css → forwardRefs-CFNX6kJ2.9b56b4459240.css} +1 -1
  279. codex/static_root/assets/forwardRefs-CFNX6kJ2.9b56b4459240.css.br +0 -0
  280. codex/static_root/assets/forwardRefs-CFNX6kJ2.9b56b4459240.css.gz +0 -0
  281. codex/static_root/assets/{VDialog-CSvrKKb2.fd4d50904b17.css → forwardRefs-CFNX6kJ2.css} +1 -1
  282. codex/static_root/assets/forwardRefs-CFNX6kJ2.css.br +0 -0
  283. codex/static_root/assets/forwardRefs-CFNX6kJ2.css.gz +0 -0
  284. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js +1 -0
  285. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js.br +0 -0
  286. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js.gz +0 -0
  287. codex/static_root/assets/forwardRefs-D1ZDjzWx.js +1 -0
  288. codex/static_root/assets/forwardRefs-D1ZDjzWx.js.br +0 -0
  289. codex/static_root/assets/forwardRefs-D1ZDjzWx.js.gz +0 -0
  290. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js +1 -0
  291. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js.br +0 -0
  292. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js.gz +0 -0
  293. codex/static_root/assets/group-tab-DkAIGL8z.js +1 -0
  294. codex/static_root/assets/group-tab-DkAIGL8z.js.br +0 -0
  295. codex/static_root/assets/group-tab-DkAIGL8z.js.gz +0 -0
  296. codex/static_root/assets/http-error-CODU7jcH.8c13689ae574.css +1 -0
  297. codex/static_root/assets/http-error-CODU7jcH.8c13689ae574.css.br +0 -0
  298. codex/static_root/assets/http-error-CODU7jcH.8c13689ae574.css.gz +0 -0
  299. codex/static_root/assets/http-error-CODU7jcH.css +1 -0
  300. codex/static_root/assets/http-error-CODU7jcH.css.br +0 -0
  301. codex/static_root/assets/http-error-CODU7jcH.css.gz +0 -0
  302. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js +1 -0
  303. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js.br +0 -0
  304. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js.gz +0 -0
  305. codex/static_root/assets/http-error-CjSb8orc.js +1 -0
  306. codex/static_root/assets/http-error-CjSb8orc.js.br +0 -0
  307. codex/static_root/assets/http-error-CjSb8orc.js.gz +0 -0
  308. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js +1 -0
  309. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js.br +0 -0
  310. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js.gz +0 -0
  311. codex/static_root/assets/index-CoFXW6I0.js +1 -0
  312. codex/static_root/assets/index-CoFXW6I0.js.br +0 -0
  313. codex/static_root/assets/index-CoFXW6I0.js.gz +0 -0
  314. codex/static_root/assets/library-tab-CgsXOX_r.75baedb7e976.css +1 -0
  315. codex/static_root/assets/library-tab-CgsXOX_r.75baedb7e976.css.br +0 -0
  316. codex/static_root/assets/library-tab-CgsXOX_r.75baedb7e976.css.gz +0 -0
  317. codex/static_root/assets/library-tab-CgsXOX_r.css +1 -0
  318. codex/static_root/assets/library-tab-CgsXOX_r.css.br +0 -0
  319. codex/static_root/assets/library-tab-CgsXOX_r.css.gz +0 -0
  320. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js +1 -0
  321. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js.br +0 -0
  322. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js.gz +0 -0
  323. codex/static_root/assets/library-tab-hkMMBz1x.js +1 -0
  324. codex/static_root/assets/library-tab-hkMMBz1x.js.br +0 -0
  325. codex/static_root/assets/library-tab-hkMMBz1x.js.gz +0 -0
  326. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js +35 -0
  327. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js.br +0 -0
  328. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js.gz +0 -0
  329. codex/static_root/assets/main-DCaPxp2h.js +35 -0
  330. codex/static_root/assets/main-DCaPxp2h.js.br +0 -0
  331. codex/static_root/assets/main-DCaPxp2h.js.gz +0 -0
  332. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js +1 -0
  333. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js.br +0 -0
  334. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js.gz +0 -0
  335. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js +1 -0
  336. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js.br +0 -0
  337. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js.gz +0 -0
  338. codex/static_root/assets/pagination-toolbar-D5VQREy5.css +1 -0
  339. codex/static_root/assets/pagination-toolbar-D5VQREy5.css.br +0 -0
  340. codex/static_root/assets/pagination-toolbar-D5VQREy5.css.gz +0 -0
  341. codex/static_root/assets/pagination-toolbar-D5VQREy5.dcb0eba65827.css +1 -0
  342. codex/static_root/assets/pagination-toolbar-D5VQREy5.dcb0eba65827.css.br +0 -0
  343. codex/static_root/assets/pagination-toolbar-D5VQREy5.dcb0eba65827.css.gz +0 -0
  344. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js +1 -0
  345. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js.br +0 -0
  346. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js.gz +0 -0
  347. codex/static_root/assets/pagination-toolbar-DoqxSygU.js +1 -0
  348. codex/static_root/assets/pagination-toolbar-DoqxSygU.js.br +0 -0
  349. codex/static_root/assets/pagination-toolbar-DoqxSygU.js.gz +0 -0
  350. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js +348 -0
  351. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js.br +0 -0
  352. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js.gz +0 -0
  353. codex/static_root/assets/pdf-doc-BwxvAx1z.js +348 -0
  354. codex/static_root/assets/pdf-doc-BwxvAx1z.js.br +0 -0
  355. codex/static_root/assets/pdf-doc-BwxvAx1z.js.gz +0 -0
  356. codex/static_root/assets/reader-D_3ruSqa.2ed32f08e906.css +1 -0
  357. codex/static_root/assets/reader-D_3ruSqa.2ed32f08e906.css.br +0 -0
  358. codex/static_root/assets/reader-D_3ruSqa.2ed32f08e906.css.gz +0 -0
  359. codex/static_root/assets/reader-D_3ruSqa.css +1 -0
  360. codex/static_root/assets/reader-D_3ruSqa.css.br +0 -0
  361. codex/static_root/assets/reader-D_3ruSqa.css.gz +0 -0
  362. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js +2 -0
  363. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js.br +0 -0
  364. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js.gz +0 -0
  365. codex/static_root/assets/reader-hHIonVbA.js +2 -0
  366. codex/static_root/assets/reader-hHIonVbA.js.br +0 -0
  367. codex/static_root/assets/reader-hHIonVbA.js.gz +0 -0
  368. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js +1 -0
  369. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js.br +0 -0
  370. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js.gz +0 -0
  371. codex/static_root/assets/relation-chips-D7-5kPem.js +1 -0
  372. codex/static_root/assets/relation-chips-D7-5kPem.js.br +0 -0
  373. codex/static_root/assets/relation-chips-D7-5kPem.js.gz +0 -0
  374. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js +2 -0
  375. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js.br +0 -0
  376. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js.gz +0 -0
  377. codex/static_root/assets/settings-drawer-CdFmOhnd.js +2 -0
  378. codex/static_root/assets/settings-drawer-CdFmOhnd.js.br +0 -0
  379. codex/static_root/assets/settings-drawer-CdFmOhnd.js.gz +0 -0
  380. codex/static_root/assets/settings-drawer-DMSsWF8c.75a6ea969e71.css +1 -0
  381. codex/static_root/assets/settings-drawer-DMSsWF8c.75a6ea969e71.css.br +0 -0
  382. codex/static_root/assets/settings-drawer-DMSsWF8c.75a6ea969e71.css.gz +0 -0
  383. codex/static_root/assets/settings-drawer-DMSsWF8c.css +1 -0
  384. codex/static_root/assets/settings-drawer-DMSsWF8c.css.br +0 -0
  385. codex/static_root/assets/settings-drawer-DMSsWF8c.css.gz +0 -0
  386. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js +1 -0
  387. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js.br +0 -0
  388. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js.gz +0 -0
  389. codex/static_root/assets/stats-tab-BzaipD0m.js +1 -0
  390. codex/static_root/assets/stats-tab-BzaipD0m.js.br +0 -0
  391. codex/static_root/assets/stats-tab-BzaipD0m.js.gz +0 -0
  392. codex/static_root/assets/{stats-tab-BAYTqQNg.5f715428c394.css → stats-tab-WvF2acoZ.9fdb0106124d.css} +1 -1
  393. codex/static_root/assets/stats-tab-WvF2acoZ.9fdb0106124d.css.br +0 -0
  394. codex/static_root/assets/stats-tab-WvF2acoZ.9fdb0106124d.css.gz +0 -0
  395. codex/static_root/assets/{stats-tab-BAYTqQNg.css → stats-tab-WvF2acoZ.css} +1 -1
  396. codex/static_root/assets/stats-tab-WvF2acoZ.css.br +0 -0
  397. codex/static_root/assets/stats-tab-WvF2acoZ.css.gz +0 -0
  398. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js +1 -0
  399. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js.br +0 -0
  400. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js.gz +0 -0
  401. codex/static_root/assets/task-tab-DCnS1sM9.js +1 -0
  402. codex/static_root/assets/task-tab-DCnS1sM9.js.br +0 -0
  403. codex/static_root/assets/task-tab-DCnS1sM9.js.gz +0 -0
  404. codex/static_root/assets/task-tab-DfdUY9Rc.478e74041f80.css +1 -0
  405. codex/static_root/assets/{task-tab--cXi48kg.5dfd6890a1c2.css.br → task-tab-DfdUY9Rc.478e74041f80.css.br} +1 -1
  406. codex/static_root/assets/task-tab-DfdUY9Rc.478e74041f80.css.gz +0 -0
  407. codex/static_root/assets/task-tab-DfdUY9Rc.css +1 -0
  408. codex/static_root/assets/{task-tab--cXi48kg.css.br → task-tab-DfdUY9Rc.css.br} +1 -1
  409. codex/static_root/assets/task-tab-DfdUY9Rc.css.gz +0 -0
  410. codex/static_root/assets/unauthorized-CsSak07X.c5536d9dae75.css +1 -0
  411. codex/static_root/assets/unauthorized-CsSak07X.c5536d9dae75.css.br +0 -0
  412. codex/static_root/assets/unauthorized-CsSak07X.c5536d9dae75.css.gz +0 -0
  413. codex/static_root/assets/unauthorized-CsSak07X.css +1 -0
  414. codex/static_root/assets/unauthorized-CsSak07X.css.br +0 -0
  415. codex/static_root/assets/unauthorized-CsSak07X.css.gz +0 -0
  416. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js +1 -0
  417. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js.br +0 -0
  418. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js.gz +0 -0
  419. codex/static_root/assets/unauthorized-DJSr03Dw.js +1 -0
  420. codex/static_root/assets/unauthorized-DJSr03Dw.js.br +0 -0
  421. codex/static_root/assets/unauthorized-DJSr03Dw.js.gz +0 -0
  422. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js +1 -0
  423. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js.br +0 -0
  424. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js.gz +0 -0
  425. codex/static_root/assets/user-tab-DAK_Deoh.js +1 -0
  426. codex/static_root/assets/user-tab-DAK_Deoh.js.br +0 -0
  427. codex/static_root/assets/user-tab-DAK_Deoh.js.gz +0 -0
  428. codex/static_root/manifest.cbc39bca88fc.json +735 -0
  429. codex/static_root/manifest.cbc39bca88fc.json.br +0 -0
  430. codex/static_root/manifest.cbc39bca88fc.json.gz +0 -0
  431. codex/static_root/manifest.json +389 -366
  432. codex/static_root/manifest.json.br +0 -0
  433. codex/static_root/manifest.json.gz +0 -0
  434. codex/static_root/staticfiles.json +1 -1
  435. codex/status_controller.py +9 -12
  436. codex/templates/index.html +1 -1
  437. codex/threads.py +3 -3
  438. codex/urls/api/admin.py +4 -3
  439. codex/urls/api/browser.py +10 -1
  440. codex/urls/api/reader.py +8 -4
  441. codex/urls/opds/v2.py +6 -0
  442. codex/urls/root.py +4 -3
  443. codex/util.py +11 -0
  444. codex/views/admin/api_key.py +1 -4
  445. codex/views/admin/flag.py +5 -1
  446. codex/views/admin/library.py +4 -4
  447. codex/views/admin/stats.py +10 -10
  448. codex/views/admin/tasks.py +9 -9
  449. codex/views/auth.py +3 -8
  450. codex/views/bookmark.py +53 -41
  451. codex/views/browser/annotate/bookmark.py +6 -4
  452. codex/views/browser/annotate/card.py +4 -21
  453. codex/views/browser/annotate/order.py +51 -25
  454. codex/views/browser/bookmark.py +53 -0
  455. codex/views/browser/breadcrumbs.py +6 -5
  456. codex/views/browser/browser.py +2 -2
  457. codex/views/browser/choices.py +6 -5
  458. codex/views/browser/cover.py +6 -3
  459. codex/views/browser/download.py +67 -0
  460. codex/views/browser/filters/bookmark.py +5 -33
  461. codex/views/browser/filters/field.py +1 -1
  462. codex/views/browser/filters/filter.py +6 -8
  463. codex/views/browser/filters/group.py +7 -4
  464. codex/views/browser/filters/search/field/expression.py +1 -2
  465. codex/views/browser/filters/search/field/optimize.py +1 -1
  466. codex/views/browser/filters/search/field/parse.py +2 -2
  467. codex/views/browser/filters/search/parse.py +4 -19
  468. codex/views/browser/group_mtime.py +3 -3
  469. codex/views/browser/metadata/annotate.py +1 -1
  470. codex/views/browser/metadata/copy_intersections.py +1 -1
  471. codex/views/browser/metadata/metadata.py +2 -2
  472. codex/views/browser/mtime.py +1 -1
  473. codex/views/browser/order_by.py +9 -6
  474. codex/views/browser/params.py +1 -1
  475. codex/views/browser/settings.py +1 -1
  476. codex/views/browser/validate.py +14 -7
  477. codex/views/const.py +0 -3
  478. codex/views/download.py +5 -5
  479. codex/views/frontend.py +20 -5
  480. codex/views/mixins.py +19 -30
  481. codex/views/opds/authentication_v1.py +1 -1
  482. codex/views/opds/const.py +6 -4
  483. codex/views/opds/util.py +5 -5
  484. codex/views/opds/v1/entry/entry.py +4 -2
  485. codex/views/opds/v1/entry/links.py +5 -7
  486. codex/views/opds/v1/facets.py +8 -4
  487. codex/views/opds/v1/feed.py +5 -5
  488. codex/views/opds/v1/links.py +11 -6
  489. codex/views/opds/v2/const.py +5 -2
  490. codex/views/opds/v2/feed.py +6 -5
  491. codex/views/opds/v2/href.py +60 -0
  492. codex/views/opds/v2/links.py +13 -47
  493. codex/views/opds/v2/progression.py +136 -0
  494. codex/views/opds/v2/publications.py +31 -21
  495. codex/views/opds/v2/top_links.py +2 -1
  496. codex/views/public.py +12 -5
  497. codex/views/reader/books.py +22 -10
  498. codex/views/reader/page.py +19 -14
  499. codex/views/reader/params.py +3 -3
  500. codex/views/reader/reader.py +6 -6
  501. codex/views/reader/settings.py +1 -1
  502. codex/views/session.py +10 -3
  503. codex/views/settings.py +2 -2
  504. codex/views/timezone.py +2 -2
  505. codex/views/util.py +10 -9
  506. codex/views/version.py +1 -1
  507. {codex-1.7.1.dist-info → codex-1.7.3.dist-info}/METADATA +23 -27
  508. codex-1.7.3.dist-info/RECORD +1031 -0
  509. {codex-1.7.1.dist-info → codex-1.7.3.dist-info}/WHEEL +1 -1
  510. codex/serializers/opds/v2.py +0 -178
  511. codex/static_root/assets/VCheckbox-Cf74Jfrq.2fbb5106ef5a.js +0 -1
  512. codex/static_root/assets/VCheckbox-Cf74Jfrq.2fbb5106ef5a.js.br +0 -0
  513. codex/static_root/assets/VCheckbox-Cf74Jfrq.2fbb5106ef5a.js.gz +0 -0
  514. codex/static_root/assets/VCheckbox-Cf74Jfrq.js +0 -1
  515. codex/static_root/assets/VCheckbox-Cf74Jfrq.js.br +0 -0
  516. codex/static_root/assets/VCheckbox-Cf74Jfrq.js.gz +0 -0
  517. codex/static_root/assets/VCheckboxBtn-D5jbIiqO.921713d268ba.js +0 -1
  518. codex/static_root/assets/VCheckboxBtn-D5jbIiqO.921713d268ba.js.br +0 -0
  519. codex/static_root/assets/VCheckboxBtn-D5jbIiqO.921713d268ba.js.gz +0 -0
  520. codex/static_root/assets/VCheckboxBtn-D5jbIiqO.js +0 -1
  521. codex/static_root/assets/VCheckboxBtn-D5jbIiqO.js.br +0 -0
  522. codex/static_root/assets/VCheckboxBtn-D5jbIiqO.js.gz +0 -0
  523. codex/static_root/assets/VCombobox-Dq3Y5j2w.8f4884677e5a.js +0 -1
  524. codex/static_root/assets/VCombobox-Dq3Y5j2w.8f4884677e5a.js.br +0 -0
  525. codex/static_root/assets/VCombobox-Dq3Y5j2w.8f4884677e5a.js.gz +0 -0
  526. codex/static_root/assets/VCombobox-Dq3Y5j2w.js +0 -1
  527. codex/static_root/assets/VCombobox-Dq3Y5j2w.js.br +0 -0
  528. codex/static_root/assets/VCombobox-Dq3Y5j2w.js.gz +0 -0
  529. codex/static_root/assets/VDialog-BVHV10WD.993b98f2be7f.js +0 -1
  530. codex/static_root/assets/VDialog-BVHV10WD.993b98f2be7f.js.br +0 -0
  531. codex/static_root/assets/VDialog-BVHV10WD.993b98f2be7f.js.gz +0 -0
  532. codex/static_root/assets/VDialog-BVHV10WD.js +0 -1
  533. codex/static_root/assets/VDialog-BVHV10WD.js.br +0 -0
  534. codex/static_root/assets/VDialog-BVHV10WD.js.gz +0 -0
  535. codex/static_root/assets/VDialog-CSvrKKb2.css.br +0 -0
  536. codex/static_root/assets/VDialog-CSvrKKb2.css.gz +0 -0
  537. codex/static_root/assets/VDialog-CSvrKKb2.fd4d50904b17.css.br +0 -0
  538. codex/static_root/assets/VDialog-CSvrKKb2.fd4d50904b17.css.gz +0 -0
  539. codex/static_root/assets/VExpansionPanels-BLAGU-dj.e244f3902cf9.js +0 -1
  540. codex/static_root/assets/VExpansionPanels-BLAGU-dj.e244f3902cf9.js.br +0 -0
  541. codex/static_root/assets/VExpansionPanels-BLAGU-dj.e244f3902cf9.js.gz +0 -0
  542. codex/static_root/assets/VExpansionPanels-BLAGU-dj.js +0 -1
  543. codex/static_root/assets/VExpansionPanels-BLAGU-dj.js.br +0 -0
  544. codex/static_root/assets/VExpansionPanels-BLAGU-dj.js.gz +0 -0
  545. codex/static_root/assets/VRadioGroup-Bnt5BbmK.826e1c2d9134.js +0 -1
  546. codex/static_root/assets/VRadioGroup-Bnt5BbmK.826e1c2d9134.js.br +0 -0
  547. codex/static_root/assets/VRadioGroup-Bnt5BbmK.826e1c2d9134.js.gz +0 -0
  548. codex/static_root/assets/VRadioGroup-Bnt5BbmK.js +0 -1
  549. codex/static_root/assets/VRadioGroup-Bnt5BbmK.js.br +0 -0
  550. codex/static_root/assets/VRadioGroup-Bnt5BbmK.js.gz +0 -0
  551. codex/static_root/assets/VSelect-BTo1ZM8U.ea4a7a7bbce9.js +0 -1
  552. codex/static_root/assets/VSelect-BTo1ZM8U.ea4a7a7bbce9.js.br +0 -0
  553. codex/static_root/assets/VSelect-BTo1ZM8U.ea4a7a7bbce9.js.gz +0 -0
  554. codex/static_root/assets/VSelect-BTo1ZM8U.js +0 -1
  555. codex/static_root/assets/VSelect-BTo1ZM8U.js.br +0 -0
  556. codex/static_root/assets/VSelect-BTo1ZM8U.js.gz +0 -0
  557. codex/static_root/assets/VSelect-DLu8bpcs.98bdcf35411c.css +0 -1
  558. codex/static_root/assets/VSelect-DLu8bpcs.98bdcf35411c.css.br +0 -0
  559. codex/static_root/assets/VSelect-DLu8bpcs.98bdcf35411c.css.gz +0 -0
  560. codex/static_root/assets/VSelect-DLu8bpcs.css +0 -1
  561. codex/static_root/assets/VSelect-DLu8bpcs.css.br +0 -0
  562. codex/static_root/assets/VSelect-DLu8bpcs.css.gz +0 -0
  563. codex/static_root/assets/VSelectionControl-CiViEYoC.c77bb19a4a06.css +0 -1
  564. codex/static_root/assets/VSelectionControl-CiViEYoC.c77bb19a4a06.css.br +0 -0
  565. codex/static_root/assets/VSelectionControl-CiViEYoC.c77bb19a4a06.css.gz +0 -0
  566. codex/static_root/assets/VSelectionControl-CiViEYoC.css +0 -1
  567. codex/static_root/assets/VSelectionControl-CiViEYoC.css.br +0 -0
  568. codex/static_root/assets/VSelectionControl-CiViEYoC.css.gz +0 -0
  569. codex/static_root/assets/VSelectionControl-CrzLF2bD.965af5336c62.js +0 -1
  570. codex/static_root/assets/VSelectionControl-CrzLF2bD.965af5336c62.js.br +0 -0
  571. codex/static_root/assets/VSelectionControl-CrzLF2bD.965af5336c62.js.gz +0 -0
  572. codex/static_root/assets/VSelectionControl-CrzLF2bD.js +0 -1
  573. codex/static_root/assets/VSelectionControl-CrzLF2bD.js.br +0 -0
  574. codex/static_root/assets/VSelectionControl-CrzLF2bD.js.gz +0 -0
  575. codex/static_root/assets/VSlideGroup-BtXPhMOT.830f136ffd41.css +0 -1
  576. codex/static_root/assets/VSlideGroup-BtXPhMOT.830f136ffd41.css.br +0 -0
  577. codex/static_root/assets/VSlideGroup-BtXPhMOT.830f136ffd41.css.gz +0 -0
  578. codex/static_root/assets/VSlideGroup-BtXPhMOT.css +0 -1
  579. codex/static_root/assets/VSlideGroup-BtXPhMOT.css.br +0 -0
  580. codex/static_root/assets/VSlideGroup-BtXPhMOT.css.gz +0 -0
  581. codex/static_root/assets/VSlideGroup-ZRALPG67.9807cdc6b330.js +0 -1
  582. codex/static_root/assets/VSlideGroup-ZRALPG67.9807cdc6b330.js.br +0 -0
  583. codex/static_root/assets/VSlideGroup-ZRALPG67.9807cdc6b330.js.gz +0 -0
  584. codex/static_root/assets/VSlideGroup-ZRALPG67.js +0 -1
  585. codex/static_root/assets/VSlideGroup-ZRALPG67.js.br +0 -0
  586. codex/static_root/assets/VSlideGroup-ZRALPG67.js.gz +0 -0
  587. codex/static_root/assets/VTable-Ci8_04Au.1382ab272e40.js +0 -1
  588. codex/static_root/assets/VTable-Ci8_04Au.1382ab272e40.js.br +0 -0
  589. codex/static_root/assets/VTable-Ci8_04Au.1382ab272e40.js.gz +0 -0
  590. codex/static_root/assets/VTable-Ci8_04Au.js +0 -1
  591. codex/static_root/assets/VTable-Ci8_04Au.js.br +0 -0
  592. codex/static_root/assets/VTable-Ci8_04Au.js.gz +0 -0
  593. codex/static_root/assets/VTextField-BnCEPZIq.b0c32b2c0b14.css +0 -1
  594. codex/static_root/assets/VTextField-BnCEPZIq.b0c32b2c0b14.css.br +0 -0
  595. codex/static_root/assets/VTextField-BnCEPZIq.b0c32b2c0b14.css.gz +0 -0
  596. codex/static_root/assets/VTextField-BnCEPZIq.css +0 -1
  597. codex/static_root/assets/VTextField-BnCEPZIq.css.br +0 -0
  598. codex/static_root/assets/VTextField-BnCEPZIq.css.gz +0 -0
  599. codex/static_root/assets/VTextField-D7pt5iJ3.c020691495b7.js +0 -1
  600. codex/static_root/assets/VTextField-D7pt5iJ3.c020691495b7.js.br +0 -0
  601. codex/static_root/assets/VTextField-D7pt5iJ3.c020691495b7.js.gz +0 -0
  602. codex/static_root/assets/VTextField-D7pt5iJ3.js +0 -1
  603. codex/static_root/assets/VTextField-D7pt5iJ3.js.br +0 -0
  604. codex/static_root/assets/VTextField-D7pt5iJ3.js.gz +0 -0
  605. codex/static_root/assets/VWindowItem-CGBsUHpV.7c57d79cf74a.js +0 -1
  606. codex/static_root/assets/VWindowItem-CGBsUHpV.7c57d79cf74a.js.br +0 -0
  607. codex/static_root/assets/VWindowItem-CGBsUHpV.7c57d79cf74a.js.gz +0 -0
  608. codex/static_root/assets/VWindowItem-CGBsUHpV.js +0 -1
  609. codex/static_root/assets/VWindowItem-CGBsUHpV.js.br +0 -0
  610. codex/static_root/assets/VWindowItem-CGBsUHpV.js.gz +0 -0
  611. codex/static_root/assets/admin-BTXUbxw5.23e0d3602f29.js +0 -1
  612. codex/static_root/assets/admin-BTXUbxw5.23e0d3602f29.js.br +0 -0
  613. codex/static_root/assets/admin-BTXUbxw5.23e0d3602f29.js.gz +0 -0
  614. codex/static_root/assets/admin-BTXUbxw5.js +0 -1
  615. codex/static_root/assets/admin-BTXUbxw5.js.br +0 -0
  616. codex/static_root/assets/admin-BTXUbxw5.js.gz +0 -0
  617. codex/static_root/assets/admin-DJ7pIXDQ.css +0 -1
  618. codex/static_root/assets/admin-DJ7pIXDQ.css.br +0 -0
  619. codex/static_root/assets/admin-DJ7pIXDQ.css.gz +0 -0
  620. codex/static_root/assets/admin-DJ7pIXDQ.e2a77af73ef2.css +0 -1
  621. codex/static_root/assets/admin-DJ7pIXDQ.e2a77af73ef2.css.br +0 -0
  622. codex/static_root/assets/admin-DJ7pIXDQ.e2a77af73ef2.css.gz +0 -0
  623. codex/static_root/assets/admin-menu-Dbt1Rajw.043fb778ba6c.js +0 -1
  624. codex/static_root/assets/admin-menu-Dbt1Rajw.043fb778ba6c.js.br +0 -0
  625. codex/static_root/assets/admin-menu-Dbt1Rajw.043fb778ba6c.js.gz +0 -0
  626. codex/static_root/assets/admin-menu-Dbt1Rajw.js +0 -1
  627. codex/static_root/assets/admin-menu-Dbt1Rajw.js.br +0 -0
  628. codex/static_root/assets/admin-menu-Dbt1Rajw.js.gz +0 -0
  629. codex/static_root/assets/admin-settings-button-progress-DSOZWzf1.fad596375b9b.js +0 -1
  630. codex/static_root/assets/admin-settings-button-progress-DSOZWzf1.fad596375b9b.js.br +0 -0
  631. codex/static_root/assets/admin-settings-button-progress-DSOZWzf1.fad596375b9b.js.gz +0 -0
  632. codex/static_root/assets/admin-settings-button-progress-DSOZWzf1.js +0 -1
  633. codex/static_root/assets/admin-settings-button-progress-DSOZWzf1.js.br +0 -0
  634. codex/static_root/assets/admin-settings-button-progress-DSOZWzf1.js.gz +0 -0
  635. codex/static_root/assets/browser-3Sm5qvA_.188da1350ec3.css +0 -1
  636. codex/static_root/assets/browser-3Sm5qvA_.188da1350ec3.css.br +0 -0
  637. codex/static_root/assets/browser-3Sm5qvA_.188da1350ec3.css.gz +0 -0
  638. codex/static_root/assets/browser-3Sm5qvA_.css +0 -1
  639. codex/static_root/assets/browser-3Sm5qvA_.css.br +0 -0
  640. codex/static_root/assets/browser-3Sm5qvA_.css.gz +0 -0
  641. codex/static_root/assets/browser-Dq-fQLJF.2e88354a9574.js +0 -1
  642. codex/static_root/assets/browser-Dq-fQLJF.2e88354a9574.js.br +0 -0
  643. codex/static_root/assets/browser-Dq-fQLJF.2e88354a9574.js.gz +0 -0
  644. codex/static_root/assets/browser-Dq-fQLJF.js +0 -1
  645. codex/static_root/assets/browser-Dq-fQLJF.js.br +0 -0
  646. codex/static_root/assets/browser-Dq-fQLJF.js.gz +0 -0
  647. codex/static_root/assets/change-password-dialog-BaGA_bnX.af8ea11b1579.js +0 -1
  648. codex/static_root/assets/change-password-dialog-BaGA_bnX.af8ea11b1579.js.br +0 -0
  649. codex/static_root/assets/change-password-dialog-BaGA_bnX.af8ea11b1579.js.gz +0 -0
  650. codex/static_root/assets/change-password-dialog-BaGA_bnX.js +0 -1
  651. codex/static_root/assets/change-password-dialog-BaGA_bnX.js.br +0 -0
  652. codex/static_root/assets/change-password-dialog-BaGA_bnX.js.gz +0 -0
  653. codex/static_root/assets/change-password-dialog-DrIXdKUC.217574b45b02.css +0 -1
  654. codex/static_root/assets/change-password-dialog-DrIXdKUC.217574b45b02.css.br +0 -0
  655. codex/static_root/assets/change-password-dialog-DrIXdKUC.217574b45b02.css.gz +0 -0
  656. codex/static_root/assets/change-password-dialog-DrIXdKUC.css +0 -1
  657. codex/static_root/assets/change-password-dialog-DrIXdKUC.css.br +0 -0
  658. codex/static_root/assets/change-password-dialog-DrIXdKUC.css.gz +0 -0
  659. codex/static_root/assets/confirm-dialog-B7w6z2rf.472011c06253.css +0 -1
  660. codex/static_root/assets/confirm-dialog-B7w6z2rf.css +0 -1
  661. codex/static_root/assets/confirm-dialog-X14gSw1w.21504f7c1db4.js +0 -1
  662. codex/static_root/assets/confirm-dialog-X14gSw1w.21504f7c1db4.js.br +0 -0
  663. codex/static_root/assets/confirm-dialog-X14gSw1w.21504f7c1db4.js.gz +0 -0
  664. codex/static_root/assets/confirm-dialog-X14gSw1w.js +0 -1
  665. codex/static_root/assets/confirm-dialog-X14gSw1w.js.br +0 -0
  666. codex/static_root/assets/confirm-dialog-X14gSw1w.js.gz +0 -0
  667. codex/static_root/assets/datetime-column-BN2Ulei5.a31061d3729c.js +0 -1
  668. codex/static_root/assets/datetime-column-BN2Ulei5.a31061d3729c.js.br +0 -0
  669. codex/static_root/assets/datetime-column-BN2Ulei5.a31061d3729c.js.gz +0 -0
  670. codex/static_root/assets/datetime-column-BN2Ulei5.js +0 -1
  671. codex/static_root/assets/datetime-column-BN2Ulei5.js.br +0 -0
  672. codex/static_root/assets/datetime-column-BN2Ulei5.js.gz +0 -0
  673. codex/static_root/assets/filter-CnO_WiBE.4044b9091aae.js.br +0 -0
  674. codex/static_root/assets/filter-CnO_WiBE.4044b9091aae.js.gz +0 -0
  675. codex/static_root/assets/filter-CnO_WiBE.js.br +0 -0
  676. codex/static_root/assets/filter-CnO_WiBE.js.gz +0 -0
  677. codex/static_root/assets/flag-tab-C5NP3j6O.1c692a00884d.js +0 -1
  678. codex/static_root/assets/flag-tab-C5NP3j6O.1c692a00884d.js.br +0 -0
  679. codex/static_root/assets/flag-tab-C5NP3j6O.1c692a00884d.js.gz +0 -0
  680. codex/static_root/assets/flag-tab-C5NP3j6O.js +0 -1
  681. codex/static_root/assets/flag-tab-C5NP3j6O.js.br +0 -0
  682. codex/static_root/assets/flag-tab-C5NP3j6O.js.gz +0 -0
  683. codex/static_root/assets/flag-tab-CqWovuBu.4dfc6b251e85.css +0 -1
  684. codex/static_root/assets/flag-tab-CqWovuBu.4dfc6b251e85.css.br +0 -0
  685. codex/static_root/assets/flag-tab-CqWovuBu.4dfc6b251e85.css.gz +0 -0
  686. codex/static_root/assets/flag-tab-CqWovuBu.css +0 -1
  687. codex/static_root/assets/flag-tab-CqWovuBu.css.br +0 -0
  688. codex/static_root/assets/flag-tab-CqWovuBu.css.gz +0 -0
  689. codex/static_root/assets/group-tab-Cq4QjmHS.a9d15dac0289.js +0 -1
  690. codex/static_root/assets/group-tab-Cq4QjmHS.a9d15dac0289.js.br +0 -0
  691. codex/static_root/assets/group-tab-Cq4QjmHS.a9d15dac0289.js.gz +0 -0
  692. codex/static_root/assets/group-tab-Cq4QjmHS.js +0 -1
  693. codex/static_root/assets/group-tab-Cq4QjmHS.js.br +0 -0
  694. codex/static_root/assets/group-tab-Cq4QjmHS.js.gz +0 -0
  695. codex/static_root/assets/http-error-DGFbgQC5.da17e7b6d980.js +0 -1
  696. codex/static_root/assets/http-error-DGFbgQC5.da17e7b6d980.js.br +0 -0
  697. codex/static_root/assets/http-error-DGFbgQC5.da17e7b6d980.js.gz +0 -0
  698. codex/static_root/assets/http-error-DGFbgQC5.js +0 -1
  699. codex/static_root/assets/http-error-DGFbgQC5.js.br +0 -0
  700. codex/static_root/assets/http-error-DGFbgQC5.js.gz +0 -0
  701. codex/static_root/assets/http-error-DKulXuTl.95e42988d5d5.css +0 -1
  702. codex/static_root/assets/http-error-DKulXuTl.95e42988d5d5.css.br +0 -0
  703. codex/static_root/assets/http-error-DKulXuTl.95e42988d5d5.css.gz +0 -0
  704. codex/static_root/assets/http-error-DKulXuTl.css +0 -1
  705. codex/static_root/assets/http-error-DKulXuTl.css.br +0 -0
  706. codex/static_root/assets/http-error-DKulXuTl.css.gz +0 -0
  707. codex/static_root/assets/index-BI-1EK3Q.51e5dd220639.js +0 -1
  708. codex/static_root/assets/index-BI-1EK3Q.51e5dd220639.js.br +0 -0
  709. codex/static_root/assets/index-BI-1EK3Q.51e5dd220639.js.gz +0 -0
  710. codex/static_root/assets/index-BI-1EK3Q.js +0 -1
  711. codex/static_root/assets/index-BI-1EK3Q.js.br +0 -0
  712. codex/static_root/assets/index-BI-1EK3Q.js.gz +0 -0
  713. codex/static_root/assets/library-tab-Wew8YOLv.0c1780a6b68e.css +0 -1
  714. codex/static_root/assets/library-tab-Wew8YOLv.0c1780a6b68e.css.br +0 -0
  715. codex/static_root/assets/library-tab-Wew8YOLv.0c1780a6b68e.css.gz +0 -0
  716. codex/static_root/assets/library-tab-Wew8YOLv.css +0 -1
  717. codex/static_root/assets/library-tab-Wew8YOLv.css.br +0 -0
  718. codex/static_root/assets/library-tab-Wew8YOLv.css.gz +0 -0
  719. codex/static_root/assets/library-tab-woA1HyfN.acfc4f327913.js +0 -1
  720. codex/static_root/assets/library-tab-woA1HyfN.acfc4f327913.js.br +0 -0
  721. codex/static_root/assets/library-tab-woA1HyfN.acfc4f327913.js.gz +0 -0
  722. codex/static_root/assets/library-tab-woA1HyfN.js +0 -1
  723. codex/static_root/assets/library-tab-woA1HyfN.js.br +0 -0
  724. codex/static_root/assets/library-tab-woA1HyfN.js.gz +0 -0
  725. codex/static_root/assets/main-Ed96tESk.7777498eb960.js +0 -35
  726. codex/static_root/assets/main-Ed96tESk.7777498eb960.js.br +0 -0
  727. codex/static_root/assets/main-Ed96tESk.7777498eb960.js.gz +0 -0
  728. codex/static_root/assets/main-Ed96tESk.js +0 -35
  729. codex/static_root/assets/main-Ed96tESk.js.br +0 -0
  730. codex/static_root/assets/main-Ed96tESk.js.gz +0 -0
  731. codex/static_root/assets/pager-full-pdf-DpxPZAZR.ec23b0e50b95.js +0 -1
  732. codex/static_root/assets/pager-full-pdf-DpxPZAZR.ec23b0e50b95.js.br +0 -0
  733. codex/static_root/assets/pager-full-pdf-DpxPZAZR.ec23b0e50b95.js.gz +0 -0
  734. codex/static_root/assets/pager-full-pdf-DpxPZAZR.js +0 -1
  735. codex/static_root/assets/pager-full-pdf-DpxPZAZR.js.br +0 -0
  736. codex/static_root/assets/pager-full-pdf-DpxPZAZR.js.gz +0 -0
  737. codex/static_root/assets/pagination-toolbar-Bz5nEUwa.d01b9cf3ab5e.js +0 -1
  738. codex/static_root/assets/pagination-toolbar-Bz5nEUwa.d01b9cf3ab5e.js.br +0 -0
  739. codex/static_root/assets/pagination-toolbar-Bz5nEUwa.d01b9cf3ab5e.js.gz +0 -0
  740. codex/static_root/assets/pagination-toolbar-Bz5nEUwa.js +0 -1
  741. codex/static_root/assets/pagination-toolbar-Bz5nEUwa.js.br +0 -0
  742. codex/static_root/assets/pagination-toolbar-Bz5nEUwa.js.gz +0 -0
  743. codex/static_root/assets/pagination-toolbar-DGrxp2OD.css +0 -1
  744. codex/static_root/assets/pagination-toolbar-DGrxp2OD.css.br +0 -0
  745. codex/static_root/assets/pagination-toolbar-DGrxp2OD.css.gz +0 -0
  746. codex/static_root/assets/pagination-toolbar-DGrxp2OD.f960a624f04f.css +0 -1
  747. codex/static_root/assets/pagination-toolbar-DGrxp2OD.f960a624f04f.css.br +0 -0
  748. codex/static_root/assets/pagination-toolbar-DGrxp2OD.f960a624f04f.css.gz +0 -0
  749. codex/static_root/assets/pdf-doc-6j4uJzw7.59963079f1ec.js +0 -305
  750. codex/static_root/assets/pdf-doc-6j4uJzw7.59963079f1ec.js.br +0 -0
  751. codex/static_root/assets/pdf-doc-6j4uJzw7.59963079f1ec.js.gz +0 -0
  752. codex/static_root/assets/pdf-doc-6j4uJzw7.js +0 -305
  753. codex/static_root/assets/pdf-doc-6j4uJzw7.js.br +0 -0
  754. codex/static_root/assets/pdf-doc-6j4uJzw7.js.gz +0 -0
  755. codex/static_root/assets/reader-DAyPkkSs.0f54806aed4b.js +0 -2
  756. codex/static_root/assets/reader-DAyPkkSs.0f54806aed4b.js.br +0 -0
  757. codex/static_root/assets/reader-DAyPkkSs.0f54806aed4b.js.gz +0 -0
  758. codex/static_root/assets/reader-DAyPkkSs.js +0 -2
  759. codex/static_root/assets/reader-DAyPkkSs.js.br +0 -0
  760. codex/static_root/assets/reader-DAyPkkSs.js.gz +0 -0
  761. codex/static_root/assets/reader-nD70BeEz.06e85e73c391.css +0 -1
  762. codex/static_root/assets/reader-nD70BeEz.06e85e73c391.css.br +0 -0
  763. codex/static_root/assets/reader-nD70BeEz.06e85e73c391.css.gz +0 -0
  764. codex/static_root/assets/reader-nD70BeEz.css +0 -1
  765. codex/static_root/assets/reader-nD70BeEz.css.br +0 -0
  766. codex/static_root/assets/reader-nD70BeEz.css.gz +0 -0
  767. codex/static_root/assets/relation-chips-DUOduJmS.8b39d35f8503.js +0 -1
  768. codex/static_root/assets/relation-chips-DUOduJmS.8b39d35f8503.js.br +0 -0
  769. codex/static_root/assets/relation-chips-DUOduJmS.8b39d35f8503.js.gz +0 -0
  770. codex/static_root/assets/relation-chips-DUOduJmS.js +0 -1
  771. codex/static_root/assets/relation-chips-DUOduJmS.js.br +0 -0
  772. codex/static_root/assets/relation-chips-DUOduJmS.js.gz +0 -0
  773. codex/static_root/assets/settings-drawer-DKncO_vX.0a2cd24cd904.css +0 -1
  774. codex/static_root/assets/settings-drawer-DKncO_vX.0a2cd24cd904.css.br +0 -0
  775. codex/static_root/assets/settings-drawer-DKncO_vX.0a2cd24cd904.css.gz +0 -0
  776. codex/static_root/assets/settings-drawer-DKncO_vX.css +0 -1
  777. codex/static_root/assets/settings-drawer-DKncO_vX.css.br +0 -0
  778. codex/static_root/assets/settings-drawer-DKncO_vX.css.gz +0 -0
  779. codex/static_root/assets/settings-drawer-lRimDTyf.054f1f057cee.js +0 -2
  780. codex/static_root/assets/settings-drawer-lRimDTyf.054f1f057cee.js.br +0 -0
  781. codex/static_root/assets/settings-drawer-lRimDTyf.054f1f057cee.js.gz +0 -0
  782. codex/static_root/assets/settings-drawer-lRimDTyf.js +0 -2
  783. codex/static_root/assets/settings-drawer-lRimDTyf.js.br +0 -0
  784. codex/static_root/assets/settings-drawer-lRimDTyf.js.gz +0 -0
  785. codex/static_root/assets/stats-tab-BAYTqQNg.5f715428c394.css.br +0 -0
  786. codex/static_root/assets/stats-tab-BAYTqQNg.5f715428c394.css.gz +0 -0
  787. codex/static_root/assets/stats-tab-BAYTqQNg.css.br +0 -0
  788. codex/static_root/assets/stats-tab-BAYTqQNg.css.gz +0 -0
  789. codex/static_root/assets/stats-tab-Cyli0TxY.f9af7d3387d9.js +0 -1
  790. codex/static_root/assets/stats-tab-Cyli0TxY.f9af7d3387d9.js.br +0 -0
  791. codex/static_root/assets/stats-tab-Cyli0TxY.f9af7d3387d9.js.gz +0 -0
  792. codex/static_root/assets/stats-tab-Cyli0TxY.js +0 -1
  793. codex/static_root/assets/stats-tab-Cyli0TxY.js.br +0 -0
  794. codex/static_root/assets/stats-tab-Cyli0TxY.js.gz +0 -0
  795. codex/static_root/assets/task-tab--cXi48kg.5dfd6890a1c2.css +0 -1
  796. codex/static_root/assets/task-tab--cXi48kg.5dfd6890a1c2.css.gz +0 -0
  797. codex/static_root/assets/task-tab--cXi48kg.css +0 -1
  798. codex/static_root/assets/task-tab--cXi48kg.css.gz +0 -0
  799. codex/static_root/assets/task-tab-CrRRKMNo.52cc73a5889d.js +0 -1
  800. codex/static_root/assets/task-tab-CrRRKMNo.52cc73a5889d.js.br +0 -0
  801. codex/static_root/assets/task-tab-CrRRKMNo.52cc73a5889d.js.gz +0 -0
  802. codex/static_root/assets/task-tab-CrRRKMNo.js +0 -1
  803. codex/static_root/assets/task-tab-CrRRKMNo.js.br +0 -0
  804. codex/static_root/assets/task-tab-CrRRKMNo.js.gz +0 -0
  805. codex/static_root/assets/transition-5LRFTPo5.3d726f9bbcb0.css +0 -1
  806. codex/static_root/assets/transition-5LRFTPo5.3d726f9bbcb0.css.br +0 -4
  807. codex/static_root/assets/transition-5LRFTPo5.3d726f9bbcb0.css.gz +0 -0
  808. codex/static_root/assets/transition-5LRFTPo5.css +0 -1
  809. codex/static_root/assets/transition-5LRFTPo5.css.br +0 -4
  810. codex/static_root/assets/transition-5LRFTPo5.css.gz +0 -0
  811. codex/static_root/assets/transition-CyIqQdeu.7496bae455dc.js +0 -1
  812. codex/static_root/assets/transition-CyIqQdeu.7496bae455dc.js.br +0 -0
  813. codex/static_root/assets/transition-CyIqQdeu.7496bae455dc.js.gz +0 -0
  814. codex/static_root/assets/transition-CyIqQdeu.js +0 -1
  815. codex/static_root/assets/transition-CyIqQdeu.js.br +0 -0
  816. codex/static_root/assets/transition-CyIqQdeu.js.gz +0 -0
  817. codex/static_root/assets/unauthorized-BjhIc97q.728511c92cd0.css +0 -1
  818. codex/static_root/assets/unauthorized-BjhIc97q.728511c92cd0.css.br +0 -0
  819. codex/static_root/assets/unauthorized-BjhIc97q.728511c92cd0.css.gz +0 -0
  820. codex/static_root/assets/unauthorized-BjhIc97q.css +0 -1
  821. codex/static_root/assets/unauthorized-BjhIc97q.css.br +0 -0
  822. codex/static_root/assets/unauthorized-BjhIc97q.css.gz +0 -0
  823. codex/static_root/assets/unauthorized-IWC3QdqX.1d5d2dafa046.js +0 -1
  824. codex/static_root/assets/unauthorized-IWC3QdqX.1d5d2dafa046.js.br +0 -0
  825. codex/static_root/assets/unauthorized-IWC3QdqX.1d5d2dafa046.js.gz +0 -0
  826. codex/static_root/assets/unauthorized-IWC3QdqX.js +0 -1
  827. codex/static_root/assets/unauthorized-IWC3QdqX.js.br +0 -0
  828. codex/static_root/assets/unauthorized-IWC3QdqX.js.gz +0 -0
  829. codex/static_root/assets/user-tab-Bt7BG8Ih.8f797a19b7ae.js +0 -1
  830. codex/static_root/assets/user-tab-Bt7BG8Ih.8f797a19b7ae.js.br +0 -0
  831. codex/static_root/assets/user-tab-Bt7BG8Ih.8f797a19b7ae.js.gz +0 -0
  832. codex/static_root/assets/user-tab-Bt7BG8Ih.js +0 -1
  833. codex/static_root/assets/user-tab-Bt7BG8Ih.js.br +0 -0
  834. codex/static_root/assets/user-tab-Bt7BG8Ih.js.gz +0 -0
  835. codex/static_root/manifest.dbf5ed7a4b40.json +0 -712
  836. codex/static_root/manifest.dbf5ed7a4b40.json.br +0 -0
  837. codex/static_root/manifest.dbf5ed7a4b40.json.gz +0 -0
  838. codex-1.7.1.dist-info/RECORD +0 -1012
  839. /codex/static_root/assets/{VCheckbox-CMKdyl0R.016ed8d222c4.css → VCheckbox-CvH8ekHL.016ed8d222c4.css} +0 -0
  840. /codex/static_root/assets/{VCheckbox-CMKdyl0R.016ed8d222c4.css.br → VCheckbox-CvH8ekHL.016ed8d222c4.css.br} +0 -0
  841. /codex/static_root/assets/{VCheckbox-CMKdyl0R.016ed8d222c4.css.gz → VCheckbox-CvH8ekHL.016ed8d222c4.css.gz} +0 -0
  842. /codex/static_root/assets/{VCheckbox-CMKdyl0R.css → VCheckbox-CvH8ekHL.css} +0 -0
  843. /codex/static_root/assets/{VCheckbox-CMKdyl0R.css.br → VCheckbox-CvH8ekHL.css.br} +0 -0
  844. /codex/static_root/assets/{VCheckbox-CMKdyl0R.css.gz → VCheckbox-CvH8ekHL.css.gz} +0 -0
  845. /codex/static_root/assets/{VCombobox-bwEYrXCg.9f25a34994e2.css → VCombobox-BQHELb_o.9f25a34994e2.css} +0 -0
  846. /codex/static_root/assets/{VCombobox-bwEYrXCg.9f25a34994e2.css.br → VCombobox-BQHELb_o.9f25a34994e2.css.br} +0 -0
  847. /codex/static_root/assets/{VCombobox-bwEYrXCg.9f25a34994e2.css.gz → VCombobox-BQHELb_o.9f25a34994e2.css.gz} +0 -0
  848. /codex/static_root/assets/{VCombobox-bwEYrXCg.css → VCombobox-BQHELb_o.css} +0 -0
  849. /codex/static_root/assets/{VCombobox-bwEYrXCg.css.br → VCombobox-BQHELb_o.css.br} +0 -0
  850. /codex/static_root/assets/{VCombobox-bwEYrXCg.css.gz → VCombobox-BQHELb_o.css.gz} +0 -0
  851. /codex/static_root/assets/{VExpansionPanels-6G1AUajL.5b17872981df.css → VExpansionPanels-RsCANmDP.5b17872981df.css} +0 -0
  852. /codex/static_root/assets/{VExpansionPanels-6G1AUajL.5b17872981df.css.br → VExpansionPanels-RsCANmDP.5b17872981df.css.br} +0 -0
  853. /codex/static_root/assets/{VExpansionPanels-6G1AUajL.5b17872981df.css.gz → VExpansionPanels-RsCANmDP.5b17872981df.css.gz} +0 -0
  854. /codex/static_root/assets/{VExpansionPanels-6G1AUajL.css → VExpansionPanels-RsCANmDP.css} +0 -0
  855. /codex/static_root/assets/{VExpansionPanels-6G1AUajL.css.br → VExpansionPanels-RsCANmDP.css.br} +0 -0
  856. /codex/static_root/assets/{VExpansionPanels-6G1AUajL.css.gz → VExpansionPanels-RsCANmDP.css.gz} +0 -0
  857. /codex/static_root/assets/{VRadioGroup-i2qP9Wu9.8e3741381961.css → VRadioGroup-Cp9mZ7cb.8e3741381961.css} +0 -0
  858. /codex/static_root/assets/{VRadioGroup-i2qP9Wu9.8e3741381961.css.br → VRadioGroup-Cp9mZ7cb.8e3741381961.css.br} +0 -0
  859. /codex/static_root/assets/{VRadioGroup-i2qP9Wu9.8e3741381961.css.gz → VRadioGroup-Cp9mZ7cb.8e3741381961.css.gz} +0 -0
  860. /codex/static_root/assets/{VRadioGroup-i2qP9Wu9.css → VRadioGroup-Cp9mZ7cb.css} +0 -0
  861. /codex/static_root/assets/{VRadioGroup-i2qP9Wu9.css.br → VRadioGroup-Cp9mZ7cb.css.br} +0 -0
  862. /codex/static_root/assets/{VRadioGroup-i2qP9Wu9.css.gz → VRadioGroup-Cp9mZ7cb.css.gz} +0 -0
  863. /codex/static_root/assets/{VTable-Y5Sc3hJd.c36f0a6a30cf.css → VTable-BnxSZ_W5.c36f0a6a30cf.css} +0 -0
  864. /codex/static_root/assets/{VTable-Y5Sc3hJd.c36f0a6a30cf.css.br → VTable-BnxSZ_W5.c36f0a6a30cf.css.br} +0 -0
  865. /codex/static_root/assets/{VTable-Y5Sc3hJd.c36f0a6a30cf.css.gz → VTable-BnxSZ_W5.c36f0a6a30cf.css.gz} +0 -0
  866. /codex/static_root/assets/{VTable-Y5Sc3hJd.css → VTable-BnxSZ_W5.css} +0 -0
  867. /codex/static_root/assets/{VTable-Y5Sc3hJd.css.br → VTable-BnxSZ_W5.css.br} +0 -0
  868. /codex/static_root/assets/{VTable-Y5Sc3hJd.css.gz → VTable-BnxSZ_W5.css.gz} +0 -0
  869. /codex/static_root/assets/{VWindowItem-ByIod57Y.css → VWindowItem-CWBhiE_Y.css} +0 -0
  870. /codex/static_root/assets/{VWindowItem-ByIod57Y.css.br → VWindowItem-CWBhiE_Y.css.br} +0 -0
  871. /codex/static_root/assets/{VWindowItem-ByIod57Y.css.gz → VWindowItem-CWBhiE_Y.css.gz} +0 -0
  872. /codex/static_root/assets/{VWindowItem-ByIod57Y.f7fb19752bf3.css → VWindowItem-CWBhiE_Y.f7fb19752bf3.css} +0 -0
  873. /codex/static_root/assets/{VWindowItem-ByIod57Y.f7fb19752bf3.css.br → VWindowItem-CWBhiE_Y.f7fb19752bf3.css.br} +0 -0
  874. /codex/static_root/assets/{VWindowItem-ByIod57Y.f7fb19752bf3.css.gz → VWindowItem-CWBhiE_Y.f7fb19752bf3.css.gz} +0 -0
  875. /codex/static_root/assets/{admin-menu-B9bzD6hV.c13b7df2ff57.css → admin-menu-B3iXsOyy.c13b7df2ff57.css} +0 -0
  876. /codex/static_root/assets/{admin-menu-B9bzD6hV.c13b7df2ff57.css.br → admin-menu-B3iXsOyy.c13b7df2ff57.css.br} +0 -0
  877. /codex/static_root/assets/{admin-menu-B9bzD6hV.c13b7df2ff57.css.gz → admin-menu-B3iXsOyy.c13b7df2ff57.css.gz} +0 -0
  878. /codex/static_root/assets/{admin-menu-B9bzD6hV.css → admin-menu-B3iXsOyy.css} +0 -0
  879. /codex/static_root/assets/{admin-menu-B9bzD6hV.css.br → admin-menu-B3iXsOyy.css.br} +0 -0
  880. /codex/static_root/assets/{admin-menu-B9bzD6hV.css.gz → admin-menu-B3iXsOyy.css.gz} +0 -0
  881. /codex/static_root/assets/{admin-settings-button-progress-DUUQfVsZ.2548c49a853e.css → admin-settings-button-progress-BGB22oTD.2548c49a853e.css} +0 -0
  882. /codex/static_root/assets/{admin-settings-button-progress-DUUQfVsZ.css → admin-settings-button-progress-BGB22oTD.css} +0 -0
  883. /codex/static_root/assets/{datetime-column-DeCthByU.1f3bf499e063.css → datetime-column-BavtvLnf.1f3bf499e063.css} +0 -0
  884. /codex/static_root/assets/{datetime-column-DeCthByU.css → datetime-column-BavtvLnf.css} +0 -0
  885. /codex/static_root/assets/{group-tab-DkIN1Heu.948e907b1e6b.css → group-tab-_vKWzoyd.948e907b1e6b.css} +0 -0
  886. /codex/static_root/assets/{group-tab-DkIN1Heu.948e907b1e6b.css.br → group-tab-_vKWzoyd.948e907b1e6b.css.br} +0 -0
  887. /codex/static_root/assets/{group-tab-DkIN1Heu.948e907b1e6b.css.gz → group-tab-_vKWzoyd.948e907b1e6b.css.gz} +0 -0
  888. /codex/static_root/assets/{group-tab-DkIN1Heu.css → group-tab-_vKWzoyd.css} +0 -0
  889. /codex/static_root/assets/{group-tab-DkIN1Heu.css.br → group-tab-_vKWzoyd.css.br} +0 -0
  890. /codex/static_root/assets/{group-tab-DkIN1Heu.css.gz → group-tab-_vKWzoyd.css.gz} +0 -0
  891. /codex/static_root/assets/{index-CL_6g4tJ.523d7b3d350f.css → index-BHXJTQ4V.523d7b3d350f.css} +0 -0
  892. /codex/static_root/assets/{index-CL_6g4tJ.523d7b3d350f.css.br → index-BHXJTQ4V.523d7b3d350f.css.br} +0 -0
  893. /codex/static_root/assets/{index-CL_6g4tJ.523d7b3d350f.css.gz → index-BHXJTQ4V.523d7b3d350f.css.gz} +0 -0
  894. /codex/static_root/assets/{index-CL_6g4tJ.css → index-BHXJTQ4V.css} +0 -0
  895. /codex/static_root/assets/{index-CL_6g4tJ.css.br → index-BHXJTQ4V.css.br} +0 -0
  896. /codex/static_root/assets/{index-CL_6g4tJ.css.gz → index-BHXJTQ4V.css.gz} +0 -0
  897. /codex/static_root/assets/{main-BZ73p_WW.css → main-K8cER0IH.css} +0 -0
  898. /codex/static_root/assets/{main-BZ73p_WW.css.br → main-K8cER0IH.css.br} +0 -0
  899. /codex/static_root/assets/{main-BZ73p_WW.css.gz → main-K8cER0IH.css.gz} +0 -0
  900. /codex/static_root/assets/{main-BZ73p_WW.d529e8b3f52a.css → main-K8cER0IH.d529e8b3f52a.css} +0 -0
  901. /codex/static_root/assets/{main-BZ73p_WW.d529e8b3f52a.css.br → main-K8cER0IH.d529e8b3f52a.css.br} +0 -0
  902. /codex/static_root/assets/{main-BZ73p_WW.d529e8b3f52a.css.gz → main-K8cER0IH.d529e8b3f52a.css.gz} +0 -0
  903. /codex/static_root/assets/{pdf-doc-CG5-AZ2M.b94aac7e3313.css → pdf-doc-B4cGW_Hl.b94aac7e3313.css} +0 -0
  904. /codex/static_root/assets/{pdf-doc-CG5-AZ2M.b94aac7e3313.css.br → pdf-doc-B4cGW_Hl.b94aac7e3313.css.br} +0 -0
  905. /codex/static_root/assets/{pdf-doc-CG5-AZ2M.b94aac7e3313.css.gz → pdf-doc-B4cGW_Hl.b94aac7e3313.css.gz} +0 -0
  906. /codex/static_root/assets/{pdf-doc-CG5-AZ2M.css → pdf-doc-B4cGW_Hl.css} +0 -0
  907. /codex/static_root/assets/{pdf-doc-CG5-AZ2M.css.br → pdf-doc-B4cGW_Hl.css.br} +0 -0
  908. /codex/static_root/assets/{pdf-doc-CG5-AZ2M.css.gz → pdf-doc-B4cGW_Hl.css.gz} +0 -0
  909. /codex/static_root/assets/{relation-chips-ByfWwuQc.01269a188e01.css → relation-chips-DpbzrZxT.01269a188e01.css} +0 -0
  910. /codex/static_root/assets/{relation-chips-ByfWwuQc.01269a188e01.css.br → relation-chips-DpbzrZxT.01269a188e01.css.br} +0 -0
  911. /codex/static_root/assets/{relation-chips-ByfWwuQc.01269a188e01.css.gz → relation-chips-DpbzrZxT.01269a188e01.css.gz} +0 -0
  912. /codex/static_root/assets/{relation-chips-ByfWwuQc.css → relation-chips-DpbzrZxT.css} +0 -0
  913. /codex/static_root/assets/{relation-chips-ByfWwuQc.css.br → relation-chips-DpbzrZxT.css.br} +0 -0
  914. /codex/static_root/assets/{relation-chips-ByfWwuQc.css.gz → relation-chips-DpbzrZxT.css.gz} +0 -0
  915. {codex-1.7.1.dist-info → codex-1.7.3.dist-info}/LICENSE +0 -0
  916. {codex-1.7.1.dist-info → codex-1.7.3.dist-info}/entry_points.txt +0 -0
Binary file
Binary file
@@ -1 +1 @@
1
- {"paths": {"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/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "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/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "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/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "assets/pager-full-pdf-DpxPZAZR.js": "assets/pager-full-pdf-DpxPZAZR.ec23b0e50b95.js", "assets/main-BZ73p_WW.css": "assets/main-BZ73p_WW.d529e8b3f52a.css", "assets/VSelect-DLu8bpcs.css": "assets/VSelect-DLu8bpcs.98bdcf35411c.css", "assets/transition-5LRFTPo5.css": "assets/transition-5LRFTPo5.3d726f9bbcb0.css", "assets/http-error-DGFbgQC5.js": "assets/http-error-DGFbgQC5.da17e7b6d980.js", "assets/admin-settings-button-progress-DSOZWzf1.js": "assets/admin-settings-button-progress-DSOZWzf1.fad596375b9b.js", "assets/VDialog-BVHV10WD.js": "assets/VDialog-BVHV10WD.993b98f2be7f.js", "assets/VTextField-D7pt5iJ3.js": "assets/VTextField-D7pt5iJ3.c020691495b7.js", "assets/index-BI-1EK3Q.js": "assets/index-BI-1EK3Q.51e5dd220639.js", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/unauthorized-BjhIc97q.css": "assets/unauthorized-BjhIc97q.728511c92cd0.css", "assets/VTextField-BnCEPZIq.css": "assets/VTextField-BnCEPZIq.b0c32b2c0b14.css", "assets/browser-Dq-fQLJF.js": "assets/browser-Dq-fQLJF.2e88354a9574.js", "assets/task-tab--cXi48kg.css": "assets/task-tab--cXi48kg.5dfd6890a1c2.css", "assets/settings-drawer-DKncO_vX.css": "assets/settings-drawer-DKncO_vX.0a2cd24cd904.css", "assets/library-tab-Wew8YOLv.css": "assets/library-tab-Wew8YOLv.0c1780a6b68e.css", "assets/admin-settings-button-progress-DUUQfVsZ.css": "assets/admin-settings-button-progress-DUUQfVsZ.2548c49a853e.css", "assets/admin-menu-B9bzD6hV.css": "assets/admin-menu-B9bzD6hV.c13b7df2ff57.css", "assets/flag-tab-CqWovuBu.css": "assets/flag-tab-CqWovuBu.4dfc6b251e85.css", "assets/VWindowItem-CGBsUHpV.js": "assets/VWindowItem-CGBsUHpV.7c57d79cf74a.js", "assets/VCheckbox-Cf74Jfrq.js": "assets/VCheckbox-Cf74Jfrq.2fbb5106ef5a.js", "assets/index-CL_6g4tJ.css": "assets/index-CL_6g4tJ.523d7b3d350f.css", "assets/relation-chips-ByfWwuQc.css": "assets/relation-chips-ByfWwuQc.01269a188e01.css", "assets/pdf-doc-6j4uJzw7.js": "assets/pdf-doc-6j4uJzw7.59963079f1ec.js", "assets/VSlideGroup-ZRALPG67.js": "assets/VSlideGroup-ZRALPG67.9807cdc6b330.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/confirm-dialog-B7w6z2rf.css": "assets/confirm-dialog-B7w6z2rf.472011c06253.css", "assets/admin-menu-Dbt1Rajw.js": "assets/admin-menu-Dbt1Rajw.043fb778ba6c.js", "assets/group-tab-Cq4QjmHS.js": "assets/group-tab-Cq4QjmHS.a9d15dac0289.js", "assets/reader-DAyPkkSs.js": "assets/reader-DAyPkkSs.0f54806aed4b.js", "assets/datetime-column-BN2Ulei5.js": "assets/datetime-column-BN2Ulei5.a31061d3729c.js", "assets/group-tab-DkIN1Heu.css": "assets/group-tab-DkIN1Heu.948e907b1e6b.css", "assets/pagination-toolbar-Bz5nEUwa.js": "assets/pagination-toolbar-Bz5nEUwa.d01b9cf3ab5e.js", "assets/VCheckboxBtn-D5jbIiqO.js": "assets/VCheckboxBtn-D5jbIiqO.921713d268ba.js", "assets/pagination-toolbar-DGrxp2OD.css": "assets/pagination-toolbar-DGrxp2OD.f960a624f04f.css", "assets/stats-tab-BAYTqQNg.css": "assets/stats-tab-BAYTqQNg.5f715428c394.css", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/VCombobox-bwEYrXCg.css": "assets/VCombobox-bwEYrXCg.9f25a34994e2.css", "assets/VDialog-CSvrKKb2.css": "assets/VDialog-CSvrKKb2.fd4d50904b17.css", "assets/VSlideGroup-BtXPhMOT.css": "assets/VSlideGroup-BtXPhMOT.830f136ffd41.css", "assets/VTable-Y5Sc3hJd.css": "assets/VTable-Y5Sc3hJd.c36f0a6a30cf.css", "assets/VExpansionPanels-6G1AUajL.css": "assets/VExpansionPanels-6G1AUajL.5b17872981df.css", "assets/main-Ed96tESk.js": "assets/main-Ed96tESk.7777498eb960.js", "assets/browser-3Sm5qvA_.css": "assets/browser-3Sm5qvA_.188da1350ec3.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/VSelectionControl-CiViEYoC.css": "assets/VSelectionControl-CiViEYoC.c77bb19a4a06.css", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/VExpansionPanels-BLAGU-dj.js": "assets/VExpansionPanels-BLAGU-dj.e244f3902cf9.js", "assets/change-password-dialog-BaGA_bnX.js": "assets/change-password-dialog-BaGA_bnX.af8ea11b1579.js", "assets/reader-nD70BeEz.css": "assets/reader-nD70BeEz.06e85e73c391.css", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/VTable-Ci8_04Au.js": "assets/VTable-Ci8_04Au.1382ab272e40.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/VSelect-BTo1ZM8U.js": "assets/VSelect-BTo1ZM8U.ea4a7a7bbce9.js", "assets/settings-drawer-lRimDTyf.js": "assets/settings-drawer-lRimDTyf.054f1f057cee.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VRadioGroup-Bnt5BbmK.js": "assets/VRadioGroup-Bnt5BbmK.826e1c2d9134.js", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/user-tab-Bt7BG8Ih.js": "assets/user-tab-Bt7BG8Ih.8f797a19b7ae.js", "assets/admin-BTXUbxw5.js": "assets/admin-BTXUbxw5.23e0d3602f29.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/task-tab-CrRRKMNo.js": "assets/task-tab-CrRRKMNo.52cc73a5889d.js", "assets/change-password-dialog-DrIXdKUC.css": "assets/change-password-dialog-DrIXdKUC.217574b45b02.css", "assets/stats-tab-Cyli0TxY.js": "assets/stats-tab-Cyli0TxY.f9af7d3387d9.js", "assets/library-tab-woA1HyfN.js": "assets/library-tab-woA1HyfN.acfc4f327913.js", "assets/VSelectionControl-CrzLF2bD.js": "assets/VSelectionControl-CrzLF2bD.965af5336c62.js", "assets/flag-tab-C5NP3j6O.js": "assets/flag-tab-C5NP3j6O.1c692a00884d.js", "assets/admin-DJ7pIXDQ.css": "assets/admin-DJ7pIXDQ.e2a77af73ef2.css", "assets/unauthorized-IWC3QdqX.js": "assets/unauthorized-IWC3QdqX.1d5d2dafa046.js", "assets/relation-chips-DUOduJmS.js": "assets/relation-chips-DUOduJmS.8b39d35f8503.js", "assets/filter-CnO_WiBE.js": "assets/filter-CnO_WiBE.4044b9091aae.js", "assets/transition-CyIqQdeu.js": "assets/transition-CyIqQdeu.7496bae455dc.js", "assets/pdf-doc-CG5-AZ2M.css": "assets/pdf-doc-CG5-AZ2M.b94aac7e3313.css", "assets/VCombobox-Dq3Y5j2w.js": "assets/VCombobox-Dq3Y5j2w.8f4884677e5a.js", "assets/confirm-dialog-X14gSw1w.js": "assets/confirm-dialog-X14gSw1w.21504f7c1db4.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.dbf5ed7a4b40.json"}, "version": "1.1", "hash": "4be480ae8526"}
1
+ {"paths": {"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/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "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/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "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/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "assets/admin-C3iCIUnm.css": "assets/admin-C3iCIUnm.06cb213f624d.css", "assets/relation-chips-DpbzrZxT.css": "assets/relation-chips-DpbzrZxT.01269a188e01.css", "assets/relation-chips-D7-5kPem.js": "assets/relation-chips-D7-5kPem.4443b085aca2.js", "assets/stats-tab-BzaipD0m.js": "assets/stats-tab-BzaipD0m.b6bf627ea860.js", "assets/admin-settings-button-progress-w_CqTSMl.js": "assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js", "assets/datetime-column-DVC0YqHC.js": "assets/datetime-column-DVC0YqHC.03bb52c198e9.js", "assets/pager-full-pdf-CwmA9y3l.js": "assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js", "assets/datetime-column-BavtvLnf.css": "assets/datetime-column-BavtvLnf.1f3bf499e063.css", "assets/confirm-dialog-B_Y3KKiL.js": "assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js", "assets/filter-xcEcgcIx.js": "assets/filter-xcEcgcIx.be1bb4725c89.js", "assets/pagination-toolbar-D5VQREy5.css": "assets/pagination-toolbar-D5VQREy5.dcb0eba65827.css", "assets/task-tab-DCnS1sM9.js": "assets/task-tab-DCnS1sM9.44d8435b4989.js", "assets/pagination-toolbar-DoqxSygU.js": "assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js", "assets/admin-menu-T8WJ_x0C.js": "assets/admin-menu-T8WJ_x0C.4f011540bb4c.js", "assets/library-tab-CgsXOX_r.css": "assets/library-tab-CgsXOX_r.75baedb7e976.css", "assets/admin-BAVKNREt.js": "assets/admin-BAVKNREt.23c0966bd683.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSelect-L4v_m3ag.js": "assets/VSelect-L4v_m3ag.db9fb8348617.js", "assets/VWindowItem-Bl-fa3ss.js": "assets/VWindowItem-Bl-fa3ss.334e6b813775.js", "assets/group-tab-DkAIGL8z.js": "assets/group-tab-DkAIGL8z.527cad03c21d.js", "assets/VSelectionControl-BqB1JeKa.js": "assets/VSelectionControl-BqB1JeKa.2fb68a673402.js", "assets/confirm-dialog-B1ABbGMU.css": "assets/confirm-dialog-B1ABbGMU.9b5915b112c0.css", "assets/VWindowItem-CWBhiE_Y.css": "assets/VWindowItem-CWBhiE_Y.f7fb19752bf3.css", "assets/group-tab-_vKWzoyd.css": "assets/group-tab-_vKWzoyd.948e907b1e6b.css", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/forwardRefs-D1ZDjzWx.js": "assets/forwardRefs-D1ZDjzWx.96fccf773093.js", "assets/change-password-dialog-D0ymWcl_.css": "assets/change-password-dialog-D0ymWcl_.a30e68c6e303.css", "assets/settings-drawer-DMSsWF8c.css": "assets/settings-drawer-DMSsWF8c.75a6ea969e71.css", "assets/VCheckbox-Dv6fwaDb.js": "assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js", "assets/VForm-DxBt30-N.css": "assets/VForm-DxBt30-N.138c0b89b6fc.css", "assets/library-tab-hkMMBz1x.js": "assets/library-tab-hkMMBz1x.02270491d822.js", "assets/reader-D_3ruSqa.css": "assets/reader-D_3ruSqa.2ed32f08e906.css", "assets/VRadioGroup-DOjw38qB.js": "assets/VRadioGroup-DOjw38qB.cbf2922d05af.js", "assets/VCombobox-BQHELb_o.css": "assets/VCombobox-BQHELb_o.9f25a34994e2.css", "assets/VCombobox-DqBFki-9.js": "assets/VCombobox-DqBFki-9.2806f95c938d.js", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/VTable-CtorAbOx.js": "assets/VTable-CtorAbOx.bbda450cbd73.js", "assets/unauthorized-CsSak07X.css": "assets/unauthorized-CsSak07X.c5536d9dae75.css", "assets/VDialog-DWos4S54.css": "assets/VDialog-DWos4S54.b07aca713774.css", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/main-K8cER0IH.css": "assets/main-K8cER0IH.d529e8b3f52a.css", "assets/VSelect-CP_CVb8s.css": "assets/VSelect-CP_CVb8s.6309f7bf17bb.css", "assets/VRadioGroup-Cp9mZ7cb.css": "assets/VRadioGroup-Cp9mZ7cb.8e3741381961.css", "assets/main-DCaPxp2h.js": "assets/main-DCaPxp2h.076707ddd123.js", "assets/VDialog-CQXjBvDZ.js": "assets/VDialog-CQXjBvDZ.1a576c5e472f.js", "assets/VDivider-DU47sRrT.css": "assets/VDivider-DU47sRrT.3d2e17799e5c.css", "assets/change-password-dialog-Cy1tU-tj.js": "assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js", "assets/VExpansionPanels-BaYzHUJp.js": "assets/VExpansionPanels-BaYzHUJp.5346826103eb.js", "assets/VSelectionControl-DPpfgCW2.css": "assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css", "assets/unauthorized-DJSr03Dw.js": "assets/unauthorized-DJSr03Dw.7555cbcf1064.js", "assets/admin-menu-B3iXsOyy.css": "assets/admin-menu-B3iXsOyy.c13b7df2ff57.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/flag-tab-D2MYXCHk.css": "assets/flag-tab-D2MYXCHk.0f57e109c01b.css", "assets/forwardRefs-CFNX6kJ2.css": "assets/forwardRefs-CFNX6kJ2.9b56b4459240.css", "assets/VExpansionPanels-RsCANmDP.css": "assets/VExpansionPanels-RsCANmDP.5b17872981df.css", "assets/VCheckbox-CvH8ekHL.css": "assets/VCheckbox-CvH8ekHL.016ed8d222c4.css", "assets/VTable-BnxSZ_W5.css": "assets/VTable-BnxSZ_W5.c36f0a6a30cf.css", "assets/stats-tab-WvF2acoZ.css": "assets/stats-tab-WvF2acoZ.9fdb0106124d.css", "assets/pdf-doc-BwxvAx1z.js": "assets/pdf-doc-BwxvAx1z.96cbc39c321d.js", "assets/settings-drawer-CdFmOhnd.js": "assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js", "assets/task-tab-DfdUY9Rc.css": "assets/task-tab-DfdUY9Rc.478e74041f80.css", "assets/admin-settings-button-progress-BGB22oTD.css": "assets/admin-settings-button-progress-BGB22oTD.2548c49a853e.css", "assets/browser-DdLCtUlr.js": "assets/browser-DdLCtUlr.380b79bea4a7.js", "assets/admin-CHuFhx_t.js": "assets/admin-CHuFhx_t.a54700f97fc8.js", "assets/reader-hHIonVbA.js": "assets/reader-hHIonVbA.4c12219242a9.js", "assets/index-BHXJTQ4V.css": "assets/index-BHXJTQ4V.523d7b3d350f.css", "assets/VDivider-DUxQu-IZ.js": "assets/VDivider-DUxQu-IZ.73d92ae2a07e.js", "assets/VCheckboxBtn-CNMFahfF.js": "assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js", "assets/http-error-CODU7jcH.css": "assets/http-error-CODU7jcH.8c13689ae574.css", "assets/flag-tab-BOyQb0kr.js": "assets/flag-tab-BOyQb0kr.842fca93f19c.js", "assets/index-CoFXW6I0.js": "assets/index-CoFXW6I0.27f397e1425e.js", "assets/browser-DNzQvgkY.css": "assets/browser-DNzQvgkY.aea8b7d7ca40.css", "assets/VForm-hB4C5jVd.js": "assets/VForm-hB4C5jVd.a2b90ddcd8ee.js", "assets/pdf-doc-B4cGW_Hl.css": "assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css", "assets/user-tab-DAK_Deoh.js": "assets/user-tab-DAK_Deoh.1832877d449a.js", "assets/http-error-CjSb8orc.js": "assets/http-error-CjSb8orc.ad6fc5733ed8.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.cbc39bca88fc.json"}, "version": "1.1", "hash": "8058846c8897"}
@@ -33,7 +33,7 @@ class StatusController(LoggerBaseMixin):
33
33
  self.init_logger(log_queue)
34
34
  self.librarian_queue = librarian_queue
35
35
 
36
- def _enqueue_notifier_task(self, notify=True, until=0.0):
36
+ def _enqueue_notifier_task(self, notify: bool, until=0.0):
37
37
  """Notify the status has changed."""
38
38
  if not notify:
39
39
  return
@@ -46,7 +46,7 @@ class StatusController(LoggerBaseMixin):
46
46
  def _loggit(self, level, status):
47
47
  """Log with a ? in place of none."""
48
48
  type_title = ADMIN_STATUS_TITLES[status.status_type]
49
- msg = " ".join((type_title, status.subtitle)).strip()
49
+ msg = f"{type_title} {status.subtitle}".strip()
50
50
  msg += ": "
51
51
  if status.complete is None and status.total is None:
52
52
  msg += "In progress"
@@ -69,9 +69,9 @@ class StatusController(LoggerBaseMixin):
69
69
  def start(
70
70
  self,
71
71
  status,
72
- notify=True,
72
+ notify: bool = True, # noqa: FBT002
73
+ preactive: bool = False, # noqa: FBT002
73
74
  now_pad=0.0,
74
- preactive=False,
75
75
  ):
76
76
  """Start a librarian status."""
77
77
  try:
@@ -102,9 +102,9 @@ class StatusController(LoggerBaseMixin):
102
102
  for status in status_iterable:
103
103
  self.start(status, notify=False, now_pad=now_pad, preactive=True)
104
104
  now_pad += 0.1
105
- self._enqueue_notifier_task()
105
+ self._enqueue_notifier_task(notify=True)
106
106
 
107
- def update(self, status, notify=True):
107
+ def update(self, status, notify: bool = True): # noqa: FBT002
108
108
  """Update a librarian status."""
109
109
  if time() - status.since < self._UPDATE_DELTA:
110
110
  # noop unless time has expired.
@@ -127,7 +127,7 @@ class StatusController(LoggerBaseMixin):
127
127
  title = ADMIN_STATUS_TITLES[status.status_type]
128
128
  self.log.warning(f"Update status {title}: {exc}")
129
129
 
130
- def finish_many(self, statii, notify=True, until=0.0):
130
+ def finish_many(self, statii, notify: bool = True, until=0.0): # noqa: FBT002
131
131
  """Finish all librarian statuses."""
132
132
  try:
133
133
  types = []
@@ -143,15 +143,12 @@ class StatusController(LoggerBaseMixin):
143
143
  update_ls.append(ls)
144
144
  LibrarianStatus.objects.bulk_update(update_ls, tuple(updates.keys()))
145
145
  self._enqueue_notifier_task(notify, until)
146
- if ls_filter:
147
- # self.log.debug(f"Cleared {types} librarian statuses")
148
- pass
149
- else:
146
+ if not ls_filter:
150
147
  self.log.info("Cleared all librarian statuses")
151
148
  except Exception as exc:
152
149
  self.log.warning(f"Finish status {statii}: {exc}")
153
150
 
154
- def finish(self, status, notify=True, until=0.0):
151
+ def finish(self, status, notify: bool = True, until=0.0): # noqa: FBT002
155
152
  """Finish a librarian status."""
156
153
  try:
157
154
  self.finish_many((status,), notify=notify, until=until)
@@ -5,7 +5,7 @@
5
5
  <meta charset="utf-8" />
6
6
  <meta name="viewport"
7
7
  content="width=device-width,initial-scale=1.0,viewport-fit=cover" />
8
- <title>Codex</title>
8
+ <title>{{ title }}</title>
9
9
  {% include "headers-icons.html" %}
10
10
  {% include "pwa/headers.html" %}
11
11
  {% include "headers-script-globals.html" %}
codex/threads.py CHANGED
@@ -20,11 +20,11 @@ class NamedThread(Thread, WorkerBaseMixin, ABC):
20
20
  librarian_queue = kwargs.pop("librarian_queue")
21
21
  log_queue = kwargs.pop("log_queue")
22
22
  self.init_worker(log_queue, librarian_queue)
23
- super().__init__(*args, **kwargs)
23
+ super().__init__(*args, name=self.__class__.__name__, **kwargs)
24
24
 
25
25
  def run_start(self):
26
26
  """First thing to do when running a new thread."""
27
- self.log.debug(f"Started {self.__class__.__name__}")
27
+ self.log.debug(f"Started {self.name}")
28
28
 
29
29
 
30
30
  class QueuedThread(NamedThread, ABC):
@@ -36,7 +36,7 @@ class QueuedThread(NamedThread, ABC):
36
36
  def __init__(self, *args, **kwargs):
37
37
  """Initialize with overridden name and as a daemon thread."""
38
38
  self.queue = kwargs.pop("queue", SimpleQueue())
39
- super().__init__(*args, name=self.__class__.__name__, daemon=True, **kwargs)
39
+ super().__init__(*args, daemon=True, **kwargs)
40
40
 
41
41
  @abstractmethod
42
42
  def process_item(self, item):
codex/urls/api/admin.py CHANGED
@@ -19,6 +19,7 @@ from codex.views.admin.tasks import (
19
19
  from codex.views.admin.user import AdminUserChangePasswordView, AdminUserViewSet
20
20
 
21
21
  READ = {"get": "list"}
22
+ RETRIEVE = {"get": "retrieve"}
22
23
  CREATE = {"post": "create"}
23
24
  UPDATE = {"put": "partial_update"}
24
25
  DELETE = {"delete": "destroy"}
@@ -38,7 +39,7 @@ urlpatterns = [
38
39
  path(
39
40
  "user/<int:pk>/password",
40
41
  AdminUserChangePasswordView.as_view(),
41
- name="user_update_delete",
42
+ name="user_password_update",
42
43
  ),
43
44
  path("group", AdminGroupViewSet.as_view({**CREATE, **READ}), name="group"),
44
45
  path(
@@ -49,8 +50,8 @@ urlpatterns = [
49
50
  path("flag", AdminFlagViewSet.as_view({**READ}), name="flag"),
50
51
  path(
51
52
  "flag/<str:key>/",
52
- AdminFlagViewSet.as_view({**UPDATE}),
53
- name="flag_update",
53
+ AdminFlagViewSet.as_view({**RETRIEVE, **UPDATE}),
54
+ name="one_flag",
54
55
  ),
55
56
  path(
56
57
  "library",
codex/urls/api/browser.py CHANGED
@@ -4,10 +4,11 @@ from django.urls import path
4
4
  from django.views.decorators.cache import cache_control, cache_page, never_cache
5
5
 
6
6
  from codex.urls.const import BROWSER_TIMEOUT, COVER_MAX_AGE, PAGE_MAX_AGE
7
- from codex.views.bookmark import BookmarkView
7
+ from codex.views.browser.bookmark import BookmarkView
8
8
  from codex.views.browser.browser import BrowserView
9
9
  from codex.views.browser.choices import BrowserChoicesAvailableView, BrowserChoicesView
10
10
  from codex.views.browser.cover import CoverView
11
+ from codex.views.browser.download import GroupDownloadView
11
12
  from codex.views.browser.metadata.metadata import MetadataView
12
13
  from codex.views.browser.settings import BrowserSettingsView
13
14
 
@@ -55,4 +56,12 @@ urlpatterns = [
55
56
  cache_control(max_age=COVER_MAX_AGE, public=True)(CoverView.as_view()),
56
57
  name="cover",
57
58
  ),
59
+ #
60
+ #
61
+ # Download
62
+ path(
63
+ "<int_list:pks>/download/<str:filename>",
64
+ GroupDownloadView.as_view(),
65
+ name="download",
66
+ ),
58
67
  ]
codex/urls/api/reader.py CHANGED
@@ -11,10 +11,6 @@ from codex.views.reader.settings import ReaderSettingsView
11
11
 
12
12
  app_name = "issue"
13
13
  urlpatterns = [
14
- #
15
- #
16
- # Comic
17
- path("<int:pk>/download/<str:filename>", DownloadView.as_view(), name="download"),
18
14
  #
19
15
  #
20
16
  # Reader
@@ -25,4 +21,12 @@ urlpatterns = [
25
21
  name="page",
26
22
  ),
27
23
  path("settings", ReaderSettingsView.as_view(), name="settings"),
24
+ #
25
+ #
26
+ # Download
27
+ path(
28
+ "<int:pk>/download/<str:filename>",
29
+ DownloadView.as_view(),
30
+ name="download",
31
+ ),
28
32
  ]
codex/urls/opds/v2.py CHANGED
@@ -6,6 +6,7 @@ from django.views.decorators.cache import cache_page
6
6
  from codex.urls.const import BROWSER_TIMEOUT
7
7
  from codex.views.opds.util import full_redirect_view
8
8
  from codex.views.opds.v2.feed import OPDS2FeedView
9
+ from codex.views.opds.v2.progression import OPDS2ProgressionView
9
10
 
10
11
  app_name = "v2"
11
12
 
@@ -22,6 +23,11 @@ urlpatterns = [
22
23
  cache_page(BROWSER_TIMEOUT)(OPDS2FeedView.as_view()),
23
24
  name="acq",
24
25
  ),
26
+ path(
27
+ "<group:group>/<int:pk>/position",
28
+ cache_page(BROWSER_TIMEOUT)(OPDS2ProgressionView.as_view()),
29
+ name="position",
30
+ ),
25
31
  #
26
32
  # Catch All
27
33
  path("", full_redirect_view("opds:v2:feed"), name="start"),
codex/urls/root.py CHANGED
@@ -1,4 +1,5 @@
1
- """Codex URL Configuration.
1
+ """
2
+ Codex URL Configuration.
2
3
 
3
4
  https://docs.djangoproject.com/en/dev/topics/http/urls/
4
5
  """
@@ -17,10 +18,10 @@ register_converter(IntListConverter, "int_list")
17
18
  urlpatterns = []
18
19
  if DEBUG:
19
20
  # Pyright doesn't follow logic so will try to find these types.
20
- from schema_graph.views import Schema # type: ignore
21
+ from schema_graph.views import Schema # type: ignore[reportMissingImports]
21
22
 
22
23
  urlpatterns += [
23
- path("schema/", Schema.as_view()), # type: ignore
24
+ path("schema/", Schema.as_view()), # type: ignore[reportPossiblyUnboundVariable]
24
25
  ]
25
26
 
26
27
  urlpatterns += [
codex/util.py CHANGED
@@ -1,5 +1,7 @@
1
1
  """Utility functions."""
2
2
 
3
+ from collections.abc import Mapping
4
+
3
5
 
4
6
  def max_none(*args):
5
7
  """None aware math.max."""
@@ -10,3 +12,12 @@ def max_none(*args):
10
12
  elif arg is not None:
11
13
  max_arg = max(max_arg, arg)
12
14
  return max_arg
15
+
16
+
17
+ def mapping_to_dict(data):
18
+ """Convert nested Mapping objects to dicts."""
19
+ if isinstance(data, Mapping):
20
+ return {key: mapping_to_dict(value) for key, value in data.items()}
21
+ if isinstance(data, list | tuple | frozenset | set):
22
+ return [mapping_to_dict(item) for item in data]
23
+ return data
@@ -14,10 +14,7 @@ class AdminAPIKey(AdminGenericAPIView):
14
14
  serializer_class = APIKeySerializer
15
15
  input_serializer_class = None
16
16
 
17
- @extend_schema(
18
- # parameters=[input_serializer_class],
19
- request=input_serializer_class
20
- )
17
+ @extend_schema(request=input_serializer_class)
21
18
  def put(self, *_args, **_kwargs):
22
19
  """Regenerate the API Key."""
23
20
  ts = Timestamp.objects.get(key=Timestamp.TimestampChoices.API_KEY.value)
codex/views/admin/flag.py CHANGED
@@ -13,7 +13,11 @@ LOG = get_logger(__name__)
13
13
 
14
14
  _REFRESH_LIBRARY_FLAGS = frozenset(
15
15
  flag.value
16
- for flag in (AdminFlag.FlagChoices.FOLDER_VIEW, AdminFlag.FlagChoices.NON_USERS)
16
+ for flag in (
17
+ AdminFlag.FlagChoices.FOLDER_VIEW,
18
+ AdminFlag.FlagChoices.NON_USERS,
19
+ AdminFlag.FlagChoices.BANNER_TEXT,
20
+ )
17
21
  )
18
22
 
19
23
 
@@ -74,7 +74,7 @@ class AdminLibraryViewSet(AdminModelViewSet):
74
74
  )
75
75
  self._create_library_folder(library)
76
76
  self._sync_watchdog()
77
- self._poll(library.pk, False)
77
+ self._poll(library.pk, force=False)
78
78
 
79
79
  def perform_update(self, serializer):
80
80
  """Perform update an run hooks."""
@@ -87,7 +87,7 @@ class AdminLibraryViewSet(AdminModelViewSet):
87
87
  if "groupSet" in validated_keys:
88
88
  self._on_change()
89
89
  self._sync_watchdog(validated_keys)
90
- self._poll(pk, False)
90
+ self._poll(pk, force=False)
91
91
 
92
92
  def perform_destroy(self, instance):
93
93
  """Perform destroy and run hooks."""
@@ -132,8 +132,8 @@ class AdminFolderListView(AdminGenericAPIView):
132
132
  try:
133
133
  serializer = self.input_serializer_class(data=self.request.GET)
134
134
  serializer.is_valid(raise_exception=True)
135
- root_path = Path(serializer.validated_data.get("path", ".")).resolve() # type: ignore
136
- show_hidden = serializer.validated_data.get("show_hidden", False) # type: ignore
135
+ root_path = Path(serializer.validated_data.get("path", ".")).resolve()
136
+ show_hidden = serializer.validated_data.get("show_hidden", False)
137
137
 
138
138
  dirs = self._get_dirs(root_path, show_hidden)
139
139
 
@@ -23,7 +23,7 @@ LOG = get_logger(__name__)
23
23
  class AdminStatsView(AdminGenericAPIView):
24
24
  """Admin Flag Viewset."""
25
25
 
26
- permission_classes: ClassVar[list] = [HasAPIKeyOrIsAdminUser] # type: ignore
26
+ permission_classes: ClassVar[list] = [HasAPIKeyOrIsAdminUser]
27
27
  serializer_class = StatsSerializer
28
28
  input_serializer_class = AdminStatsRequestSerializer
29
29
 
@@ -40,14 +40,14 @@ class AdminStatsView(AdminGenericAPIView):
40
40
 
41
41
  input_serializer = self.input_serializer_class(data=data)
42
42
  input_serializer.is_valid(raise_exception=True)
43
- params = {}
44
- if input_serializer.validated_data and not isinstance(
45
- input_serializer.validated_data, empty
46
- ):
47
- for key, value in input_serializer.validated_data.items():
48
- if value:
49
- params[key] = value
50
- self._params = MappingProxyType(params)
43
+ self._params = MappingProxyType(
44
+ {
45
+ key: value
46
+ for key, value in input_serializer.validated_data.items()
47
+ if input_serializer.validated_data
48
+ and not isinstance(input_serializer.validated_data, empty)
49
+ }
50
+ )
51
51
  return self._params
52
52
 
53
53
  def _add_api_key(self, obj):
@@ -62,7 +62,7 @@ class AdminStatsView(AdminGenericAPIView):
62
62
  obj["config"] = {}
63
63
  obj["config"]["api_key"] = api_key
64
64
 
65
- def get_object(self): # type: ignore
65
+ def get_object(self):
66
66
  """Get the stats object with an api key."""
67
67
  getter = CodexStats(self.params)
68
68
  obj = getter.get()
@@ -64,11 +64,11 @@ _TASK_MAP = MappingProxyType(
64
64
  {
65
65
  "purge_comic_covers": CoverRemoveAllTask(),
66
66
  "create_all_comic_covers": CoverCreateAllTask(),
67
- "search_index_update": SearchIndexUpdateTask(False),
68
- "search_index_rebuild": SearchIndexUpdateTask(True),
67
+ "search_index_update": SearchIndexUpdateTask(rebuild=False),
68
+ "search_index_rebuild": SearchIndexUpdateTask(rebuild=True),
69
69
  "search_index_remove_stale": SearchIndexRemoveStaleTask(),
70
70
  "search_index_abort": SearchIndexAbortTask(),
71
- "search_index_optimize": SearchIndexOptimizeTask(True),
71
+ "search_index_optimize": SearchIndexOptimizeTask(janitor=False),
72
72
  "search_index_clear": SearchIndexClearTask(),
73
73
  "db_vacuum": JanitorVacuumTask(),
74
74
  "db_backup": JanitorBackupTask(),
@@ -77,8 +77,8 @@ _TASK_MAP = MappingProxyType(
77
77
  "db_fts_integrity_check": JanitorFTSIntegrityCheck(),
78
78
  "db_fts_rebuild": JanitorFTSRebuildTask(),
79
79
  "watchdog_sync": WatchdogSyncTask(),
80
- "codex_latest_version": JanitorLatestVersionTask(True),
81
- "codex_update": JanitorUpdateTask(False),
80
+ "codex_latest_version": JanitorLatestVersionTask(force=True),
81
+ "codex_update": JanitorUpdateTask(force=False),
82
82
  "codex_shutdown": JanitorShutdownTask(),
83
83
  "codex_restart": JanitorRestartTask(),
84
84
  "notify_library_changed": LIBRARY_CHANGED_TASK,
@@ -90,8 +90,8 @@ _TASK_MAP = MappingProxyType(
90
90
  "cleanup_covers": CoverRemoveOrphansTask(),
91
91
  "librarian_clear_status": JanitorClearStatusTask(),
92
92
  "force_update_all_failed_imports": ForceUpdateAllFailedImportsTask(),
93
- "poll": WatchdogPollLibrariesTask(frozenset(), False),
94
- "poll_force": WatchdogPollLibrariesTask(frozenset(), True),
93
+ "poll": WatchdogPollLibrariesTask(frozenset(), force=False),
94
+ "poll_force": WatchdogPollLibrariesTask(frozenset(), force=True),
95
95
  "janitor_nightly": JanitorNightlyTask(),
96
96
  "force_update_groups": UpdateGroupsTask(start_time=EPOCH_START),
97
97
  "adopt_folders": AdoptOrphanFoldersTask(),
@@ -128,10 +128,10 @@ class AdminLibrarianTaskView(AdminAPIView):
128
128
  def post(self, *_args, **_kwargs):
129
129
  """Download a comic archive."""
130
130
  # DRF does not populate POST correctly, only data
131
- data = self.request.data # type:ignore
131
+ data = self.request.data
132
132
  serializer = self.input_serializer_class(data=data)
133
133
  serializer.is_valid(raise_exception=True)
134
- validated_data: Mapping = serializer.validated_data # type: ignore
134
+ validated_data: Mapping = serializer.validated_data
135
135
  task_name = validated_data.get("task")
136
136
  pk = validated_data.get("library_id")
137
137
  task = self._get_task(task_name, pk)
codex/views/auth.py CHANGED
@@ -1,7 +1,5 @@
1
1
  """Views authorization bases."""
2
2
 
3
- from typing import TYPE_CHECKING
4
-
5
3
  from django.contrib.auth.models import AnonymousUser
6
4
  from django.db.models import Q
7
5
  from rest_framework.generics import GenericAPIView
@@ -11,9 +9,6 @@ from rest_framework.views import APIView
11
9
  from codex.logger.logging import get_logger
12
10
  from codex.models import AdminFlag, Comic, Folder, StoryArc
13
11
 
14
- if TYPE_CHECKING:
15
- from django.contrib.auth.models import User
16
-
17
12
  LOG = get_logger(__name__)
18
13
 
19
14
 
@@ -46,15 +41,15 @@ class AuthGenericAPIView(AuthMixin, GenericAPIView):
46
41
  """Auth Policy GenericAPIView."""
47
42
 
48
43
 
49
- class GroupACLMixin:
44
+ class GroupACLMixin(APIView):
50
45
  """Filter group ACLS for views."""
51
46
 
52
47
  @property
53
48
  def is_admin(self):
54
49
  """Is the current user an admin."""
55
50
  if self._is_admin is None:
56
- user: User = self.request.user # type: ignore
57
- self._is_admin = user and user.is_staff
51
+ user = self.request.user
52
+ self._is_admin = user and getattr(user, "is_staff", False)
58
53
  return self._is_admin
59
54
 
60
55
  @staticmethod
codex/views/bookmark.py CHANGED
@@ -1,24 +1,52 @@
1
- """Bookmark views."""
1
+ """Views for reading comic books."""
2
2
 
3
- from drf_spectacular.utils import extend_schema
3
+ from abc import ABC
4
+ from typing import TYPE_CHECKING
5
+
6
+ from django.db.models import Q
4
7
  from rest_framework.response import Response
8
+ from rest_framework.views import APIView
5
9
 
6
- from codex.librarian.bookmark.update import BookmarkUpdate
10
+ from codex.librarian.bookmark.tasks import BookmarkUpdateTask
11
+ from codex.librarian.mp_queue import LIBRARIAN_QUEUE
7
12
  from codex.logger.logging import get_logger
8
- from codex.serializers.models.bookmark import (
9
- BookmarkFinishedSerializer,
10
- BookmarkSerializer,
11
- )
12
- from codex.views.auth import (
13
- AuthFilterAPIView,
14
- AuthFilterGenericAPIView,
15
- )
16
- from codex.views.const import FILTER_ONLY_GROUP_RELATION
13
+ from codex.views.auth import AuthAPIView, GroupACLMixin
14
+
15
+ if TYPE_CHECKING:
16
+ from codex.models import BrowserGroupModel
17
17
 
18
18
  LOG = get_logger(__name__)
19
19
 
20
20
 
21
- class BookmarkBaseView(AuthFilterAPIView):
21
+ class BookmarkFilterMixin(GroupACLMixin, ABC):
22
+ """Bookmark filter methods."""
23
+
24
+ def __init__(self, *args, **kwargs):
25
+ """Initialize the bm_annotation_data."""
26
+ super().__init__(*args, **kwargs)
27
+ self._bm_rels: dict[BrowserGroupModel, str] = {}
28
+ self._bm_filters: dict[BrowserGroupModel, Q] = {}
29
+
30
+ def get_bm_rel(self, model):
31
+ """Create bookmark relation."""
32
+ if model not in self._bm_rels:
33
+ rel_prefix = self.get_rel_prefix(model)
34
+ self._bm_rels[model] = rel_prefix + "bookmark"
35
+ return self._bm_rels[model]
36
+
37
+ def get_my_bookmark_filter(self, bm_rel):
38
+ """Get a filter for my session or user defined bookmarks."""
39
+ if self.request.user and self.request.user.is_authenticated:
40
+ key = f"{bm_rel}__user"
41
+ value = self.request.user
42
+ else:
43
+ key = f"{bm_rel}__session__session_key"
44
+ value = self.request.session.session_key
45
+ my_bookmarks_kwargs = {key: value}
46
+ return Q(**my_bookmarks_kwargs)
47
+
48
+
49
+ class BookmarkAuthMixin(APIView):
22
50
  """Base class for Bookmark Views."""
23
51
 
24
52
  def get_bookmark_auth_filter(self):
@@ -35,36 +63,20 @@ class BookmarkBaseView(AuthFilterAPIView):
35
63
  return {key: value}
36
64
 
37
65
 
38
- class BookmarkView(AuthFilterGenericAPIView, BookmarkBaseView, BookmarkUpdate):
39
- """User Bookmark View."""
40
-
41
- serializer_class = BookmarkSerializer
42
-
43
- def _parse_params(self):
44
- """Validate and translate the submitted data."""
45
- group = self.kwargs.get("group")
46
- # If the target is recursive, strip everything but finished state data.
47
- serializer_class = None if group == "c" else BookmarkFinishedSerializer
48
-
49
- data = self.request.data # type: ignore
50
- if serializer_class:
51
- serializer = serializer_class(data=data, partial=True)
52
- else:
53
- serializer = self.get_serializer(data=data, partial=True)
54
- serializer.is_valid(raise_exception=True)
55
- return serializer.validated_data
56
-
57
- @extend_schema(request=serializer_class, responses=None)
58
- def patch(self, *_args, **_kwargs):
59
- """Update bookmarks recursively."""
60
- updates = self._parse_params()
66
+ class BookmarkPageView(BookmarkAuthMixin, AuthAPIView):
67
+ """Display a comic page from the archive itself."""
61
68
 
69
+ def _update_bookmark(self):
70
+ """Update the bookmark if the bookmark param was passed."""
62
71
  auth_filter = self.get_bookmark_auth_filter()
72
+ comic_pks = (self.kwargs.get("pk"),)
73
+ page = self.kwargs.get("page")
74
+ updates = {"page": page}
63
75
 
64
- group = self.kwargs.get("group")
65
- rel = FILTER_ONLY_GROUP_RELATION[group] + "__in"
66
- pks = self.kwargs.get("pks")
67
- comic_filter = {rel: pks}
76
+ task = BookmarkUpdateTask(auth_filter, comic_pks, updates)
77
+ LIBRARIAN_QUEUE.put(task)
68
78
 
69
- self.update_bookmarks(auth_filter, comic_filter, updates, LOG)
79
+ def put(self, *_args, **_kwargs):
80
+ """Get the comic page from the archive."""
81
+ self._update_bookmark()
70
82
  return Response()
@@ -9,7 +9,7 @@ from django.db.models import (
9
9
  )
10
10
  from django.db.models.fields import BooleanField, PositiveSmallIntegerField
11
11
  from django.db.models.functions import Least
12
- from django.db.models.functions.comparison import Coalesce
12
+ from django.db.models.functions.comparison import Coalesce, Greatest
13
13
 
14
14
  from codex.logger.logging import get_logger
15
15
  from codex.models import (
@@ -69,8 +69,8 @@ class BrowserAnnotateBookmarkView(BrowserAnnotateOrderView):
69
69
 
70
70
  def annotate_bookmarks(self, qs):
71
71
  """Hoist up bookmark annotations."""
72
- bm_rel = self._get_bm_rel(qs.model)
73
- bm_filter = self._get_my_bookmark_filter(bm_rel)
72
+ bm_rel = self.get_bm_rel(qs.model)
73
+ bm_filter = self.get_my_bookmark_filter(bm_rel)
74
74
  page_rel = f"{bm_rel}__page"
75
75
  finished_rel = f"{bm_rel}__finished"
76
76
 
@@ -108,5 +108,7 @@ class BrowserAnnotateBookmarkView(BrowserAnnotateOrderView):
108
108
  # Page counts can be null with metadata turned off.
109
109
  # Least guard is for rare instances when bookmarks are set to
110
110
  # invalid high values
111
- progress = Least(Coalesce(F("page"), 0) * 100.0 / F("page_count"), Value(100.0))
111
+ progress = Least(
112
+ Coalesce(F("page"), 0) * 100.0 / Greatest("page_count", 1), Value(100.0)
113
+ )
112
114
  return qs.annotate(progress=progress)