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
@@ -14,7 +14,8 @@ from codex.librarian.mp_queue import LIBRARIAN_QUEUE
14
14
  from codex.logger.logging import get_logger
15
15
  from codex.models.comic import Comic, FileType
16
16
  from codex.settings.settings import FALSY
17
- from codex.views.bookmark import BookmarkBaseView
17
+ from codex.views.auth import AuthFilterAPIView
18
+ from codex.views.bookmark import BookmarkAuthMixin
18
19
  from codex.views.util import chunker
19
20
 
20
21
  LOG = get_logger(__name__)
@@ -31,23 +32,23 @@ class IgnoreClientContentNegotiation(BaseContentNegotiation):
31
32
  """Select the first parser in the `.parser_classes` list."""
32
33
  return next(iter(parsers))
33
34
 
34
- def select_renderer( # type: ignore
35
+ def select_renderer(
35
36
  self,
36
37
  request, # noqa: ARG002
37
38
  renderers,
38
- _format_suffix="",
39
+ format_suffix="", # noqa: ARG002, F841, RUF100
39
40
  ):
40
41
  """Select the first renderer in the `.renderer_classes` list."""
41
42
  renderer = next(iter(renderers))
42
43
  return (renderer, renderer.media_type)
43
44
 
44
45
 
45
- class ReaderPageView(BookmarkBaseView):
46
+ class ReaderPageView(BookmarkAuthMixin, AuthFilterAPIView):
46
47
  """Display a comic page from the archive itself."""
47
48
 
48
49
  X_MOZ_PRE_HEADERS = frozenset({"prefetch", "preload", "prerender", "subresource"})
49
50
  content_type = "image/jpeg"
50
- content_negotiation_class = IgnoreClientContentNegotiation # type: ignore
51
+ content_negotiation_class = IgnoreClientContentNegotiation # type: ignore[reportAssignmentType]
51
52
 
52
53
  def _update_bookmark(self):
53
54
  """Update the bookmark if the bookmark param was passed."""
@@ -59,31 +60,35 @@ class ReaderPageView(BookmarkBaseView):
59
60
  return
60
61
 
61
62
  auth_filter = self.get_bookmark_auth_filter()
62
- pk = self.kwargs.get("pk")
63
- comic_filter = {"pk": pk}
63
+ comic_pks = (self.kwargs.get("pk"),)
64
64
  page = self.kwargs.get("page")
65
65
  updates = {"page": page}
66
66
 
67
- task = BookmarkUpdateTask(auth_filter, comic_filter, updates)
67
+ task = BookmarkUpdateTask(auth_filter, comic_pks, updates)
68
68
  LIBRARIAN_QUEUE.put(task)
69
69
 
70
70
  def _get_page_image(self):
71
71
  """Get the image data and content type."""
72
+ # Get comic - Distinct is important
72
73
  group_acl_filter = self.get_group_acl_filter(Comic, self.request.user)
74
+ qs = Comic.objects.filter(group_acl_filter).only("path", "file_type").distinct()
73
75
  pk = self.kwargs.get("pk")
74
- comic = Comic.objects.filter(group_acl_filter).only("path").get(pk=pk)
76
+ comic = qs.get(pk=pk)
77
+
78
+ # page_image
75
79
  page = self.kwargs.get("page")
76
80
  to_pixmap = self.request.GET.get("pixmap", "").lower() not in FALSY
77
- if comic.file_type == FileType.PDF.value and not to_pixmap:
78
- content_type = _PDF_MIME_TYPE
79
- else:
80
- content_type = self.content_type
81
-
82
81
  with Comicbox(comic.path) as cb:
83
82
  page_image = cb.get_page_by_index(page, to_pixmap=to_pixmap)
84
83
  if not page_image:
85
84
  page_image = b""
86
85
 
86
+ # content type
87
+ if comic.file_type == FileType.PDF.value and not to_pixmap:
88
+ content_type = _PDF_MIME_TYPE
89
+ else:
90
+ content_type = self.content_type
91
+
87
92
  return page_image, content_type
88
93
 
89
94
  @extend_schema(
@@ -3,12 +3,12 @@
3
3
  from types import MappingProxyType
4
4
  from typing import Any
5
5
 
6
- from codex.choices import mapping_to_dict
7
6
  from codex.logger.logging import get_logger
8
7
  from codex.models import Comic
9
8
  from codex.serializers.reader import (
10
9
  ReaderViewInputSerializer,
11
10
  )
11
+ from codex.util import mapping_to_dict
12
12
  from codex.views.const import FOLDER_GROUP, GROUP_RELATION, STORY_ARC_GROUP
13
13
  from codex.views.session import SessionView
14
14
  from codex.views.util import reparse_json_query_params
@@ -121,9 +121,9 @@ class ReaderParamsView(SessionView):
121
121
  serializer = self.input_serializer_class(data=data)
122
122
  serializer.is_valid(raise_exception=True)
123
123
 
124
- params: dict = mapping_to_dict(_DEFAULT_PARAMS) # type: ignore
124
+ params: dict[str, Any] = mapping_to_dict(_DEFAULT_PARAMS) # type: ignore[reportAssignmentType]
125
125
  if serializer.validated_data:
126
- params.update(serializer.validated_data) # type: ignore
126
+ params.update(serializer.validated_data)
127
127
  self._ensure_arc_contains_comic(params)
128
128
  self._ensure_arc(params)
129
129
 
@@ -58,7 +58,7 @@ class ReaderView(ReaderArcsView):
58
58
  task = LazyImportComicsTask(frozenset(import_pks))
59
59
  LIBRARIAN_QUEUE.put(task)
60
60
 
61
- def get_object(self): # type: ignore
61
+ def get_object(self):
62
62
  """Get the previous and next comics in a group or story arc."""
63
63
  # Books
64
64
  books = self.get_book_collection()
@@ -82,13 +82,13 @@ class ReaderView(ReaderArcsView):
82
82
 
83
83
  arc = self.params.get("arc", {})
84
84
  if not arc.get("group"):
85
- arc["group"] = current.arc_group # type: ignore
85
+ arc["group"] = current.arc_group
86
86
  if not arc.get("pks"):
87
- arc["pks"] = (current.arc_pk,) # type: ignore
88
- arc["index"] = current.arc_index # type:ignore
89
- arc["count"] = current.arc_count # type: ignore
87
+ arc["pks"] = (current.arc_pk,)
88
+ arc["index"] = current.arc_index
89
+ arc["count"] = current.arc_count
90
90
 
91
- close_route = self.get_last_route()
91
+ close_route = self.get_last_route(name=True)
92
92
 
93
93
  return {
94
94
  "books": books,
@@ -7,6 +7,6 @@ from codex.views.settings import SettingsView
7
7
  class ReaderSettingsView(SettingsView):
8
8
  """Get Reader Settings."""
9
9
 
10
- serializer_class = ReaderSettingsSerializer # type: ignore
10
+ serializer_class = ReaderSettingsSerializer
11
11
 
12
12
  SESSION_KEY = "reader"
codex/views/session.py CHANGED
@@ -3,12 +3,17 @@
3
3
  from abc import ABC
4
4
  from copy import deepcopy
5
5
  from types import MappingProxyType
6
+ from typing import TYPE_CHECKING
6
7
 
7
- from codex.choices import BROWSER_DEFAULTS, READER_DEFAULTS, mapping_to_dict
8
+ from codex.choices import BROWSER_DEFAULTS, READER_DEFAULTS
8
9
  from codex.logger.logging import get_logger
10
+ from codex.util import mapping_to_dict
9
11
  from codex.views.auth import AuthFilterGenericAPIView
10
12
  from codex.views.util import pop_name
11
13
 
14
+ if TYPE_CHECKING:
15
+ from collections.abc import Mapping
16
+
12
17
  LOG = get_logger(__name__)
13
18
 
14
19
  CONTRIBUTOR_PERSON_UI_FIELD = "contributors"
@@ -77,13 +82,15 @@ class SessionView(AuthFilterGenericAPIView, ABC):
77
82
  default = self.SESSION_DEFAULTS[session_key][key]
78
83
  return session.get(key, default)
79
84
 
80
- def get_last_route(self, name=True):
85
+ def get_last_route(self, name: bool):
81
86
  """Get the last route from the breadcrumbs."""
82
87
  breadcrumbs = self.get_from_session(
83
88
  "breadcrumbs", session_key=self.BROWSER_SESSION_KEY
84
89
  )
85
90
  if not breadcrumbs:
86
- default_breadcrumbs: tuple[dict] = BROWSER_DEFAULTS["breadcrumbs"] # type: ignore
91
+ default_breadcrumbs: tuple[
92
+ Mapping[str, str | tuple[int, ...] | int], ...
93
+ ] = BROWSER_DEFAULTS["breadcrumbs"] # type: ignore[reportAssignmentType]
87
94
  breadcrumbs = default_breadcrumbs
88
95
  last_route = breadcrumbs[-1]
89
96
  if not name:
codex/views/settings.py CHANGED
@@ -29,7 +29,7 @@ class SettingsView(SessionView, ABC):
29
29
  serializer = self.input_serializer_class(data=data)
30
30
  serializer.is_valid(raise_exception=True)
31
31
  validated_data = serializer.validated_data
32
- only = validated_data.get("only") if validated_data else None # type: ignore
32
+ only = validated_data.get("only") if validated_data else None
33
33
  params = self.load_params_from_session(only=only)
34
34
  params = self.validate_settings_get(validated_data, params)
35
35
  serializer = self.get_serializer(params)
@@ -38,7 +38,7 @@ class SettingsView(SessionView, ABC):
38
38
  @extend_schema(responses=None)
39
39
  def patch(self, *args, **kwargs):
40
40
  """Update session settings."""
41
- data = self.request.data # type: ignore
41
+ data = self.request.data
42
42
  serializer = self.get_serializer(data=data)
43
43
  serializer.is_valid(raise_exception=True)
44
44
  params = self.load_params_from_session()
codex/views/timezone.py CHANGED
@@ -28,11 +28,11 @@ class TimezoneView(AuthGenericAPIView):
28
28
  @extend_schema(request=input_serializer_class)
29
29
  def put(self, *args, **kwargs):
30
30
  """Get the user info for the current user."""
31
- data = self.request.data # type: ignore
31
+ data = self.request.data
32
32
  serializer = self.input_serializer_class(data=data)
33
33
  serializer.is_valid(raise_exception=True)
34
34
  try:
35
- timezone = serializer.validated_data.get("timezone") # type: ignore
35
+ timezone = serializer.validated_data.get("timezone")
36
36
  self._save_timezone(timezone)
37
37
  except Exception as exc:
38
38
  reason = f"update user timezone {exc}"
codex/views/util.py CHANGED
@@ -5,6 +5,7 @@ from collections.abc import Mapping
5
5
  from contextlib import suppress
6
6
  from dataclasses import asdict, dataclass
7
7
  from json.decoder import JSONDecodeError
8
+ from typing import Any
8
9
  from urllib.parse import unquote_plus
9
10
 
10
11
  from djangorestframework_camel_case.settings import api_settings
@@ -43,7 +44,7 @@ class Route(dict):
43
44
  dict = asdict
44
45
 
45
46
 
46
- def reparse_json_query_params(query_params, keys) -> dict:
47
+ def reparse_json_query_params(query_params, keys) -> dict[str, Any]:
47
48
  """Reparse JSON encoded query_params."""
48
49
  # It is an unbelievable amount of trouble to try to parse axios native bracket
49
50
  # encoded complex objects in python
@@ -57,7 +58,7 @@ def reparse_json_query_params(query_params, keys) -> dict:
57
58
  parsed_value = value
58
59
 
59
60
  parsed_dict[key] = parsed_value
60
- return dict(underscoreize(parsed_dict, **api_settings.JSON_UNDERSCOREIZE)) # type:ignore
61
+ return dict(underscoreize(parsed_dict, **api_settings.JSON_UNDERSCOREIZE)) # type:ignore[reportReturnType]
61
62
 
62
63
 
63
64
  def pop_name(kwargs: Mapping):
@@ -67,11 +68,11 @@ def pop_name(kwargs: Mapping):
67
68
  return kwargs
68
69
 
69
70
 
70
- async def chunker(open_file, chunk_size=DEFAULT_CHUNK_SIZE):
71
+ def chunker(open_file, chunk_size=DEFAULT_CHUNK_SIZE):
71
72
  """Asynchronous iterator for serving files."""
72
- while True:
73
- chunk = open_file.read(chunk_size)
74
- if not chunk:
75
- open_file.close()
76
- break
77
- yield chunk
73
+ with open_file:
74
+ while True:
75
+ if chunk := open_file.read(chunk_size):
76
+ yield chunk
77
+ else:
78
+ break
codex/views/version.py CHANGED
@@ -15,7 +15,7 @@ class VersionView(AuthGenericAPIView):
15
15
 
16
16
  serializer_class = VersionsSerializer
17
17
 
18
- def get_object(self) -> dict[str, str]: # type: ignore
18
+ def get_object(self) -> dict[str, str]:
19
19
  """Get the versions."""
20
20
  ts = Timestamp.objects.get(key=Timestamp.TimestampChoices.CODEX_VERSION.value)
21
21
  if ts.version:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codex
3
- Version: 1.7.1
3
+ Version: 1.7.3
4
4
  Summary: A comic archive web server.
5
5
  Home-page: https://github.com/ajslater/codex
6
6
  License: GPL-3.0-only
@@ -20,10 +20,11 @@ Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
23
24
  Classifier: Programming Language :: Python :: 3 :: Only
24
25
  Classifier: Topic :: Internet :: WWW/HTTP
25
26
  Classifier: Topic :: Multimedia :: Graphics :: Viewers
26
- Requires-Dist: Pillow (>=10.0.0,<11.0.0)
27
+ Requires-Dist: Pillow (>=11.0.0,<12.0.0)
27
28
  Requires-Dist: aioprocessing (>=2.0.1,<3.0.0)
28
29
  Requires-Dist: ansicolors (>=1.1,<2.0)
29
30
  Requires-Dist: bidict (>=0.23.1,<0.24.0)
@@ -52,6 +53,7 @@ Requires-Dist: versio (>=0.5.0,<0.6.0)
52
53
  Requires-Dist: watchdog (>=5.0.2,<6.0.0)
53
54
  Requires-Dist: websocket_client (>=1.2,<2.0)
54
55
  Requires-Dist: whitenoise[brotli] (>=6.0,<7.0)
56
+ Requires-Dist: zipstream-ng (>=1.8.0,<2.0.0)
55
57
  Project-URL: Documentation, https://github.com/ajslater/codex
56
58
  Project-URL: Docker Image, https://hub.docker.com/r/ajslater/codex
57
59
  Project-URL: News, https://github.com/ajslater/codex/blob/main/NEWS.md
@@ -142,8 +144,6 @@ before installing Codex.
142
144
 
143
145
  ...and Ubuntu, Mint, MX, Window Subsystem for Linux, and others.
144
146
 
145
- <!-- eslint-skip -->
146
-
147
147
  ```sh
148
148
  apt install build-essential libimagequant0 libjpeg-turbo8 libopenjp2-7 libssl libyaml-0-2 libtiff6 libwebp7 python3-dev python3-pip mupdf sqlite3 unrar zlib1g
149
149
  ```
@@ -153,16 +153,12 @@ and versions of your distribution. If the package versions listed in the example
153
153
  above are not available, try searching for ones that are with `apt-cache` or
154
154
  `aptitude`.
155
155
 
156
- <!-- eslint-skip -->
157
-
158
156
  ```sh
159
157
  apt-cache search libjpeg-turbo
160
158
  ```
161
159
 
162
160
  ###### <a href="alpine">Alpine</a> Dependencies
163
161
 
164
- <!-- eslint-skip -->
165
-
166
162
  ```sh
167
163
  apk add bsd-compat-headers build-base jpeg-dev libffi-dev libwebp openssl-dev sqlite yaml-dev zlib-dev
168
164
  ```
@@ -179,8 +175,6 @@ Unrar as packaged for Alpine Linux v3.14 seems to work on Alpine v3.15+
179
175
 
180
176
  Using [Homebrew](https://brew.sh/):
181
177
 
182
- <!-- eslint-skip -->
183
-
184
178
  ```sh
185
179
  brew install jpeg libffi libyaml libzip openssl python sqlite unrar webp
186
180
  ```
@@ -198,8 +192,6 @@ Dependencies Installation Document</a>.
198
192
  Once you have installed codex, the codex binary should be on your path. To start
199
193
  codex, run:
200
194
 
201
- <!-- eslint-skip -->
202
-
203
195
  ```sh
204
196
  codex
205
197
  ```
@@ -245,16 +237,12 @@ If you forget all your superuser passwords, you may restore the original default
245
237
  admin account by running codex with the `CODEX_RESET_ADMIN` environment variable
246
238
  set.
247
239
 
248
- <!-- eslint-skip -->
249
-
250
240
  ```sh
251
241
  CODEX_RESET_ADMIN=1 codex
252
242
  ```
253
243
 
254
244
  or, if using Docker:
255
245
 
256
- <!-- eslint-skip -->
257
-
258
246
  ```sh
259
247
  docker run -e CODEX_RESET_ADMIN=1 -v host-parent-dir/config:/config ajslater/codex
260
248
  ```
@@ -314,8 +302,6 @@ a default one to that directory on startup.
314
302
 
315
303
  The default values for the config options are:
316
304
 
317
- <!-- eslint-skip -->
318
-
319
305
  ```toml
320
306
  bind = ["0.0.0.0:9810"]
321
307
  quick_bind = ["0.0.0.0:9810"]
@@ -373,8 +359,6 @@ to 2 queries per second.
373
359
 
374
360
  Here's an example nginx config with a subpath named '/codex'.
375
361
 
376
- <!-- eslint-skip -->
377
-
378
362
  ```nginx
379
363
  # HTTP
380
364
  proxy_set_header Host $http_host;
@@ -399,8 +383,6 @@ proxy_set_header Connection "Upgrade" location /codex {
399
383
 
400
384
  Specify a reverse proxy sub path (if you have one) in `config/hypercorn.toml`
401
385
 
402
- <!-- eslint-skip -->
403
-
404
386
  ```toml
405
387
  root_path = "/codex"
406
388
  ```
@@ -472,11 +454,17 @@ authentication. In that case the OPDS url will look like:
472
454
 
473
455
  #### Supported OPDS Specifications
474
456
 
457
+ ##### OPDS v1
458
+
475
459
  - [OPDS 1.2](https://specs.opds.io/opds-1.2.html)
476
460
  - [OPDS-PSE 1.2](https://github.com/anansi-project/opds-pse/blob/master/v1.2.md)
477
461
  - [OPDS Authentication 1.0](https://drafts.opds.io/authentication-for-opds-1.0.html)
478
462
  - [OpenSearch 1.1](https://github.com/dewitt/opensearch)
463
+
464
+ ##### OPDS v2
465
+
479
466
  - [OPDS 2.0 (draft)](https://drafts.opds.io/opds-2.0.html)
467
+ - [OPDS 2.0 Progression (proposal)](https://github.com/opds-community/drafts/discussions/67)
480
468
 
481
469
  ## <a name="troubleshooting">🩺 Troubleshooting</a>
482
470
 
@@ -489,9 +477,7 @@ You can change how much codex logs by setting the `LOGLEVEL` environment
489
477
  variable. By default this level is `INFO`. To see more verbose messages, run
490
478
  codex like:
491
479
 
492
- <!-- eslint-skip -->
493
-
494
- ```bash
480
+ ```sh
495
481
  LOGLEVEL=DEBUG codex
496
482
  ```
497
483
 
@@ -511,8 +497,6 @@ If the database becomes corrupt, Codex includes a facility to rebuild the
511
497
  database. Place a file named `rebuild_db` in your Codex config directory like
512
498
  so:
513
499
 
514
- <!-- eslint-skip -->
515
-
516
500
  ```sh
517
501
  touch config/rebuild_db
518
502
  ```
@@ -525,6 +509,18 @@ rebuild it. The database lives in the config directory as the file
525
509
  original database at `config/backups/codex.sqlite3.before-rebuild`. Codex will
526
510
  remove the `rebuild_db` file.
527
511
 
512
+ ### Warnings to Ignore
513
+
514
+ #### StreamingHttpResponse Iterator Warning
515
+
516
+ ```pycon
517
+ packages/django/http/response.py:517: Warning: StreamingHttpResponse must consume synchronous iterators in order to serve them asynchronously. Use an asynchronous iterator instead.
518
+ ```
519
+
520
+ This is a known warning and does not represent anything bad happening. It's an
521
+ artifact of the Django framework slowly supporting asynchronous server endpoints
522
+ and unfortunately isn't practical to remove yet.
523
+
528
524
  ## <a name="alternatives-to-codex">📚Alternatives</a>
529
525
 
530
526
  - [Kavita](https://www.kavitareader.com/) has light metadata filtering/editing,