codex 1.7.3__py3-none-any.whl → 1.7.3a1__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 (736) hide show
  1. codex/asgi.py +1 -2
  2. codex/choices.py +6 -3
  3. codex/choices_to_json.py +8 -8
  4. codex/db.py +2 -2
  5. codex/exceptions.py +6 -5
  6. codex/librarian/bookmark/bookmarkd.py +4 -8
  7. codex/librarian/bookmark/update.py +2 -2
  8. codex/librarian/covers/create.py +8 -10
  9. codex/librarian/covers/path.py +5 -6
  10. codex/librarian/covers/purge.py +2 -2
  11. codex/librarian/importer/aggregate.py +2 -2
  12. codex/librarian/importer/cache.py +4 -1
  13. codex/librarian/importer/create_comics.py +2 -2
  14. codex/librarian/importer/create_covers.py +1 -1
  15. codex/librarian/importer/create_fks.py +3 -4
  16. codex/librarian/importer/deleted.py +3 -3
  17. codex/librarian/importer/extract.py +2 -2
  18. codex/librarian/importer/failed_imports.py +1 -1
  19. codex/librarian/importer/importer.py +1 -3
  20. codex/librarian/importer/importerd.py +3 -3
  21. codex/librarian/importer/link_comics.py +1 -2
  22. codex/librarian/importer/moved.py +7 -2
  23. codex/librarian/importer/query_fks.py +4 -1
  24. codex/librarian/importer/tasks.py +1 -1
  25. codex/librarian/janitor/integrity.py +20 -27
  26. codex/librarian/janitor/janitor.py +1 -1
  27. codex/librarian/janitor/latest_version.py +1 -1
  28. codex/librarian/janitor/update.py +2 -2
  29. codex/librarian/janitor/vacuum.py +1 -1
  30. codex/librarian/librariand.py +2 -3
  31. codex/librarian/notifier/notifierd.py +1 -2
  32. codex/librarian/search/optimize.py +1 -1
  33. codex/librarian/search/remove.py +1 -1
  34. codex/librarian/search/update.py +3 -3
  35. codex/librarian/telemeter/stats.py +6 -7
  36. codex/librarian/telemeter/telemeter.py +1 -0
  37. codex/librarian/watchdog/db_snapshot.py +3 -3
  38. codex/librarian/watchdog/dir_snapshot_diff.py +4 -3
  39. codex/librarian/watchdog/emitter.py +4 -4
  40. codex/librarian/watchdog/event_batcherd.py +1 -2
  41. codex/librarian/watchdog/events.py +2 -1
  42. codex/librarian/watchdog/observers.py +10 -15
  43. codex/logger/logging.py +1 -1
  44. codex/memory.py +2 -3
  45. codex/migrations/0001_init.py +2 -1
  46. codex/migrations/0014_pdf_issue_suffix_remove_cover_image_sort_name.py +2 -1
  47. codex/migrations/0018_rename_userbookmark_bookmark.py +2 -1
  48. codex/migrations/0028_telemeter.py +5 -1
  49. codex/migrations/0031_adminflag_banner.py +1 -1
  50. codex/models/admin.py +1 -1
  51. codex/models/base.py +1 -3
  52. codex/models/bookmark.py +7 -4
  53. codex/models/comic.py +2 -2
  54. codex/models/functions.py +5 -12
  55. codex/models/groups.py +1 -1
  56. codex/models/library.py +1 -1
  57. codex/models/paths.py +4 -4
  58. codex/models/query.py +4 -8
  59. codex/models/util.py +1 -1
  60. codex/permissions.py +1 -1
  61. codex/run.py +1 -1
  62. codex/serializers/admin/libraries.py +3 -1
  63. codex/serializers/browser/choices.py +2 -2
  64. codex/serializers/browser/mixins.py +1 -5
  65. codex/serializers/browser/settings.py +2 -2
  66. codex/serializers/fields.py +7 -7
  67. codex/serializers/models/base.py +1 -1
  68. codex/serializers/models/comic.py +2 -2
  69. codex/serializers/models/groups.py +2 -0
  70. codex/serializers/opds/authentication.py +1 -2
  71. codex/serializers/opds/v2/feed.py +1 -2
  72. codex/serializers/opds/v2/links.py +12 -14
  73. codex/serializers/opds/v2/metadata.py +1 -2
  74. codex/serializers/opds/v2/progression.py +2 -4
  75. codex/serializers/opds/v2/publication.py +11 -14
  76. codex/serializers/opds/v2/unused.py +8 -15
  77. codex/serializers/route.py +2 -2
  78. codex/settings/settings.py +3 -4
  79. codex/signals/django_signals.py +1 -1
  80. codex/static_root/assets/{VCheckbox-Dv6fwaDb.56abbfb00c8a.js → VCheckbox-BV02IXFk.7b1ac0cc0c68.js} +1 -1
  81. codex/static_root/assets/VCheckbox-BV02IXFk.7b1ac0cc0c68.js.br +0 -0
  82. codex/static_root/assets/VCheckbox-BV02IXFk.7b1ac0cc0c68.js.gz +0 -0
  83. codex/static_root/assets/{VCheckbox-Dv6fwaDb.js → VCheckbox-BV02IXFk.js} +1 -1
  84. codex/static_root/assets/VCheckbox-BV02IXFk.js.br +0 -0
  85. codex/static_root/assets/VCheckbox-BV02IXFk.js.gz +0 -0
  86. codex/static_root/assets/{VCheckboxBtn-CNMFahfF.4ee9778a562e.js → VCheckboxBtn-DRCMElDO.e3bc3b165786.js} +1 -1
  87. codex/static_root/assets/VCheckboxBtn-DRCMElDO.e3bc3b165786.js.br +0 -0
  88. codex/static_root/assets/VCheckboxBtn-DRCMElDO.e3bc3b165786.js.gz +0 -0
  89. codex/static_root/assets/{VCheckboxBtn-CNMFahfF.js → VCheckboxBtn-DRCMElDO.js} +1 -1
  90. codex/static_root/assets/VCheckboxBtn-DRCMElDO.js.br +0 -0
  91. codex/static_root/assets/VCheckboxBtn-DRCMElDO.js.gz +0 -0
  92. codex/static_root/assets/{VCombobox-DqBFki-9.2806f95c938d.js → VCombobox-BUzWpAvZ.ec97d55d18d6.js} +1 -1
  93. codex/static_root/assets/VCombobox-BUzWpAvZ.ec97d55d18d6.js.br +0 -0
  94. codex/static_root/assets/VCombobox-BUzWpAvZ.ec97d55d18d6.js.gz +0 -0
  95. codex/static_root/assets/{VCombobox-DqBFki-9.js → VCombobox-BUzWpAvZ.js} +1 -1
  96. codex/static_root/assets/VCombobox-BUzWpAvZ.js.br +0 -0
  97. codex/static_root/assets/VCombobox-BUzWpAvZ.js.gz +0 -0
  98. codex/static_root/assets/{VDialog-CQXjBvDZ.1a576c5e472f.js → VDialog-CvyPs47z.06bd89160727.js} +1 -1
  99. codex/static_root/assets/VDialog-CvyPs47z.06bd89160727.js.br +0 -0
  100. codex/static_root/assets/VDialog-CvyPs47z.06bd89160727.js.gz +0 -0
  101. codex/static_root/assets/{VDialog-CQXjBvDZ.js → VDialog-CvyPs47z.js} +1 -1
  102. codex/static_root/assets/VDialog-CvyPs47z.js.br +0 -0
  103. codex/static_root/assets/VDialog-CvyPs47z.js.gz +0 -0
  104. codex/static_root/assets/{VDivider-DUxQu-IZ.73d92ae2a07e.js → VDivider-DxA4gr8D.a62a378b1691.js} +1 -1
  105. codex/static_root/assets/VDivider-DxA4gr8D.a62a378b1691.js.br +0 -0
  106. codex/static_root/assets/VDivider-DxA4gr8D.a62a378b1691.js.gz +0 -0
  107. codex/static_root/assets/{VDivider-DUxQu-IZ.js → VDivider-DxA4gr8D.js} +1 -1
  108. codex/static_root/assets/VDivider-DxA4gr8D.js.br +0 -0
  109. codex/static_root/assets/VDivider-DxA4gr8D.js.gz +0 -0
  110. codex/static_root/assets/{VExpansionPanels-BaYzHUJp.5346826103eb.js → VExpansionPanels-_Hd_Icpj.4670cf36fda0.js} +1 -1
  111. codex/static_root/assets/VExpansionPanels-_Hd_Icpj.4670cf36fda0.js.br +0 -0
  112. codex/static_root/assets/VExpansionPanels-_Hd_Icpj.4670cf36fda0.js.gz +0 -0
  113. codex/static_root/assets/{VExpansionPanels-BaYzHUJp.js → VExpansionPanels-_Hd_Icpj.js} +1 -1
  114. codex/static_root/assets/VExpansionPanels-_Hd_Icpj.js.br +0 -0
  115. codex/static_root/assets/VExpansionPanels-_Hd_Icpj.js.gz +0 -0
  116. codex/static_root/assets/{VForm-hB4C5jVd.a2b90ddcd8ee.js → VForm-B4doHkrL.1f48583f2de6.js} +1 -1
  117. codex/static_root/assets/VForm-B4doHkrL.1f48583f2de6.js.br +0 -0
  118. codex/static_root/assets/VForm-B4doHkrL.1f48583f2de6.js.gz +0 -0
  119. codex/static_root/assets/{VForm-hB4C5jVd.js → VForm-B4doHkrL.js} +1 -1
  120. codex/static_root/assets/VForm-B4doHkrL.js.br +0 -0
  121. codex/static_root/assets/VForm-B4doHkrL.js.gz +0 -0
  122. codex/static_root/assets/{VRadioGroup-DOjw38qB.cbf2922d05af.js → VRadioGroup-DT7JWkoW.28cd429e5a15.js} +1 -1
  123. codex/static_root/assets/VRadioGroup-DT7JWkoW.28cd429e5a15.js.br +0 -0
  124. codex/static_root/assets/VRadioGroup-DT7JWkoW.28cd429e5a15.js.gz +0 -0
  125. codex/static_root/assets/{VRadioGroup-DOjw38qB.js → VRadioGroup-DT7JWkoW.js} +1 -1
  126. codex/static_root/assets/VRadioGroup-DT7JWkoW.js.br +0 -0
  127. codex/static_root/assets/VRadioGroup-DT7JWkoW.js.gz +0 -0
  128. codex/static_root/assets/{VSelect-L4v_m3ag.db9fb8348617.js → VSelect-DtYhH7Mk.67eae5723992.js} +1 -1
  129. codex/static_root/assets/VSelect-DtYhH7Mk.67eae5723992.js.br +0 -0
  130. codex/static_root/assets/VSelect-DtYhH7Mk.67eae5723992.js.gz +0 -0
  131. codex/static_root/assets/{VSelect-L4v_m3ag.js → VSelect-DtYhH7Mk.js} +1 -1
  132. codex/static_root/assets/VSelect-DtYhH7Mk.js.br +0 -0
  133. codex/static_root/assets/VSelect-DtYhH7Mk.js.gz +0 -0
  134. codex/static_root/assets/{VSelectionControl-BqB1JeKa.2fb68a673402.js → VSelectionControl-BJm6ORIw.efe501dcf742.js} +1 -1
  135. codex/static_root/assets/VSelectionControl-BJm6ORIw.efe501dcf742.js.br +0 -0
  136. codex/static_root/assets/VSelectionControl-BJm6ORIw.efe501dcf742.js.gz +0 -0
  137. codex/static_root/assets/{VSelectionControl-BqB1JeKa.js → VSelectionControl-BJm6ORIw.js} +1 -1
  138. codex/static_root/assets/VSelectionControl-BJm6ORIw.js.br +0 -0
  139. codex/static_root/assets/VSelectionControl-BJm6ORIw.js.gz +0 -0
  140. codex/static_root/assets/{VTable-CtorAbOx.bbda450cbd73.js → VTable-Bpr_wGHh.65e8b5288ad7.js} +1 -1
  141. codex/static_root/assets/VTable-Bpr_wGHh.65e8b5288ad7.js.br +0 -0
  142. codex/static_root/assets/VTable-Bpr_wGHh.65e8b5288ad7.js.gz +0 -0
  143. codex/static_root/assets/{VTable-CtorAbOx.js → VTable-Bpr_wGHh.js} +1 -1
  144. codex/static_root/assets/VTable-Bpr_wGHh.js.br +0 -0
  145. codex/static_root/assets/VTable-Bpr_wGHh.js.gz +0 -0
  146. codex/static_root/assets/{VWindowItem-Bl-fa3ss.334e6b813775.js → VWindowItem-C1nqmRqv.aa75e27fc15e.js} +1 -1
  147. codex/static_root/assets/VWindowItem-C1nqmRqv.aa75e27fc15e.js.br +0 -0
  148. codex/static_root/assets/VWindowItem-C1nqmRqv.aa75e27fc15e.js.gz +0 -0
  149. codex/static_root/assets/{VWindowItem-Bl-fa3ss.js → VWindowItem-C1nqmRqv.js} +1 -1
  150. codex/static_root/assets/VWindowItem-C1nqmRqv.js.br +0 -0
  151. codex/static_root/assets/VWindowItem-C1nqmRqv.js.gz +0 -0
  152. codex/static_root/assets/{admin-CHuFhx_t.a54700f97fc8.js → admin-BYCwfr2h.581e490b1ec8.js} +1 -1
  153. codex/static_root/assets/admin-BYCwfr2h.581e490b1ec8.js.br +0 -0
  154. codex/static_root/assets/admin-BYCwfr2h.581e490b1ec8.js.gz +0 -0
  155. codex/static_root/assets/{admin-CHuFhx_t.js → admin-BYCwfr2h.js} +1 -1
  156. codex/static_root/assets/admin-BYCwfr2h.js.br +0 -0
  157. codex/static_root/assets/admin-BYCwfr2h.js.gz +0 -0
  158. codex/static_root/assets/{admin-BAVKNREt.23c0966bd683.js → admin-Do4UwPej.6beffbe88dd0.js} +1 -1
  159. codex/static_root/assets/admin-Do4UwPej.6beffbe88dd0.js.br +0 -0
  160. codex/static_root/assets/admin-Do4UwPej.6beffbe88dd0.js.gz +0 -0
  161. codex/static_root/assets/{admin-BAVKNREt.js → admin-Do4UwPej.js} +1 -1
  162. codex/static_root/assets/admin-Do4UwPej.js.br +0 -0
  163. codex/static_root/assets/admin-Do4UwPej.js.gz +0 -0
  164. codex/static_root/assets/{admin-menu-T8WJ_x0C.4f011540bb4c.js → admin-menu-DyaS3ZkH.34c055460f79.js} +1 -1
  165. codex/static_root/assets/admin-menu-DyaS3ZkH.34c055460f79.js.br +0 -0
  166. codex/static_root/assets/admin-menu-DyaS3ZkH.34c055460f79.js.gz +0 -0
  167. codex/static_root/assets/{admin-menu-T8WJ_x0C.js → admin-menu-DyaS3ZkH.js} +1 -1
  168. codex/static_root/assets/admin-menu-DyaS3ZkH.js.br +0 -0
  169. codex/static_root/assets/admin-menu-DyaS3ZkH.js.gz +0 -0
  170. codex/static_root/assets/{admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js → admin-settings-button-progress-BKp0yruZ.550d96596ce5.js} +1 -1
  171. codex/static_root/assets/admin-settings-button-progress-BKp0yruZ.550d96596ce5.js.br +0 -0
  172. codex/static_root/assets/admin-settings-button-progress-BKp0yruZ.550d96596ce5.js.gz +0 -0
  173. codex/static_root/assets/{admin-settings-button-progress-w_CqTSMl.js → admin-settings-button-progress-BKp0yruZ.js} +1 -1
  174. codex/static_root/assets/admin-settings-button-progress-BKp0yruZ.js.br +0 -0
  175. codex/static_root/assets/admin-settings-button-progress-BKp0yruZ.js.gz +0 -0
  176. codex/static_root/assets/browser-BcXpHHP5.ef6076284520.js +1 -0
  177. codex/static_root/assets/browser-BcXpHHP5.ef6076284520.js.br +0 -0
  178. codex/static_root/assets/browser-BcXpHHP5.ef6076284520.js.gz +0 -0
  179. codex/static_root/assets/browser-BcXpHHP5.js +1 -0
  180. codex/static_root/assets/browser-BcXpHHP5.js.br +0 -0
  181. codex/static_root/assets/browser-BcXpHHP5.js.gz +0 -0
  182. codex/static_root/assets/{browser-DNzQvgkY.aea8b7d7ca40.css → browser-CReWGhn_.521193ab0710.css} +1 -1
  183. codex/static_root/assets/browser-CReWGhn_.521193ab0710.css.br +0 -0
  184. codex/static_root/assets/browser-CReWGhn_.521193ab0710.css.gz +0 -0
  185. codex/static_root/assets/{browser-DNzQvgkY.css → browser-CReWGhn_.css} +1 -1
  186. codex/static_root/assets/browser-CReWGhn_.css.br +0 -0
  187. codex/static_root/assets/browser-CReWGhn_.css.gz +0 -0
  188. codex/static_root/assets/{change-password-dialog-Cy1tU-tj.416ef5bdfd46.js → change-password-dialog-DB0tGBYA.8712454eb2b5.js} +1 -1
  189. codex/static_root/assets/change-password-dialog-DB0tGBYA.8712454eb2b5.js.br +0 -0
  190. codex/static_root/assets/change-password-dialog-DB0tGBYA.8712454eb2b5.js.gz +0 -0
  191. codex/static_root/assets/{change-password-dialog-Cy1tU-tj.js → change-password-dialog-DB0tGBYA.js} +1 -1
  192. codex/static_root/assets/change-password-dialog-DB0tGBYA.js.br +0 -0
  193. codex/static_root/assets/change-password-dialog-DB0tGBYA.js.gz +0 -0
  194. codex/static_root/assets/{confirm-dialog-B_Y3KKiL.1070d18f6b2d.js → confirm-dialog-CUfR1UVh.d59ed57fbf3c.js} +1 -1
  195. codex/static_root/assets/confirm-dialog-CUfR1UVh.d59ed57fbf3c.js.br +0 -0
  196. codex/static_root/assets/confirm-dialog-CUfR1UVh.d59ed57fbf3c.js.gz +0 -0
  197. codex/static_root/assets/{confirm-dialog-B_Y3KKiL.js → confirm-dialog-CUfR1UVh.js} +1 -1
  198. codex/static_root/assets/confirm-dialog-CUfR1UVh.js.br +0 -0
  199. codex/static_root/assets/confirm-dialog-CUfR1UVh.js.gz +0 -0
  200. codex/static_root/assets/{datetime-column-DVC0YqHC.03bb52c198e9.js → datetime-column-DWwCltHX.be3a30e165e2.js} +1 -1
  201. codex/static_root/assets/datetime-column-DWwCltHX.be3a30e165e2.js.br +2 -0
  202. codex/static_root/assets/datetime-column-DWwCltHX.be3a30e165e2.js.gz +0 -0
  203. codex/static_root/assets/{datetime-column-DVC0YqHC.js → datetime-column-DWwCltHX.js} +1 -1
  204. codex/static_root/assets/datetime-column-DWwCltHX.js.br +2 -0
  205. codex/static_root/assets/datetime-column-DWwCltHX.js.gz +0 -0
  206. codex/static_root/assets/{filter-xcEcgcIx.be1bb4725c89.js → filter-DUzmOcWQ.62e2578018fc.js} +1 -1
  207. codex/static_root/assets/filter-DUzmOcWQ.62e2578018fc.js.br +0 -0
  208. codex/static_root/assets/filter-DUzmOcWQ.62e2578018fc.js.gz +0 -0
  209. codex/static_root/assets/{filter-xcEcgcIx.js → filter-DUzmOcWQ.js} +1 -1
  210. codex/static_root/assets/filter-DUzmOcWQ.js.br +0 -0
  211. codex/static_root/assets/filter-DUzmOcWQ.js.gz +0 -0
  212. codex/static_root/assets/flag-tab-DHGfv0Q3.2b7ef394b850.css +1 -0
  213. codex/static_root/assets/flag-tab-DHGfv0Q3.2b7ef394b850.css.br +0 -0
  214. codex/static_root/assets/flag-tab-DHGfv0Q3.2b7ef394b850.css.gz +0 -0
  215. codex/static_root/assets/flag-tab-DHGfv0Q3.css +1 -0
  216. codex/static_root/assets/flag-tab-DHGfv0Q3.css.br +0 -0
  217. codex/static_root/assets/flag-tab-DHGfv0Q3.css.gz +0 -0
  218. codex/static_root/assets/flag-tab-DI0mJlXh.35d270069e4f.js +1 -0
  219. codex/static_root/assets/flag-tab-DI0mJlXh.35d270069e4f.js.br +0 -0
  220. codex/static_root/assets/flag-tab-DI0mJlXh.35d270069e4f.js.gz +0 -0
  221. codex/static_root/assets/flag-tab-DI0mJlXh.js +1 -0
  222. codex/static_root/assets/flag-tab-DI0mJlXh.js.br +0 -0
  223. codex/static_root/assets/flag-tab-DI0mJlXh.js.gz +0 -0
  224. codex/static_root/assets/{forwardRefs-D1ZDjzWx.96fccf773093.js → forwardRefs-hLICxMEm.fd43ec456950.js} +1 -1
  225. codex/static_root/assets/forwardRefs-hLICxMEm.fd43ec456950.js.br +0 -0
  226. codex/static_root/assets/forwardRefs-hLICxMEm.fd43ec456950.js.gz +0 -0
  227. codex/static_root/assets/{forwardRefs-D1ZDjzWx.js → forwardRefs-hLICxMEm.js} +1 -1
  228. codex/static_root/assets/forwardRefs-hLICxMEm.js.br +0 -0
  229. codex/static_root/assets/forwardRefs-hLICxMEm.js.gz +0 -0
  230. codex/static_root/assets/{group-tab-DkAIGL8z.527cad03c21d.js → group-tab-Ch6sd19Y.15f92ebc959d.js} +1 -1
  231. codex/static_root/assets/group-tab-Ch6sd19Y.15f92ebc959d.js.br +0 -0
  232. codex/static_root/assets/group-tab-Ch6sd19Y.15f92ebc959d.js.gz +0 -0
  233. codex/static_root/assets/{group-tab-DkAIGL8z.js → group-tab-Ch6sd19Y.js} +1 -1
  234. codex/static_root/assets/group-tab-Ch6sd19Y.js.br +0 -0
  235. codex/static_root/assets/group-tab-Ch6sd19Y.js.gz +0 -0
  236. codex/static_root/assets/{http-error-CjSb8orc.ad6fc5733ed8.js → http-error-BQoj78jv.fc5280352b17.js} +1 -1
  237. codex/static_root/assets/http-error-BQoj78jv.fc5280352b17.js.br +0 -0
  238. codex/static_root/assets/http-error-BQoj78jv.fc5280352b17.js.gz +0 -0
  239. codex/static_root/assets/{http-error-CjSb8orc.js → http-error-BQoj78jv.js} +1 -1
  240. codex/static_root/assets/http-error-BQoj78jv.js.br +0 -0
  241. codex/static_root/assets/http-error-BQoj78jv.js.gz +0 -0
  242. codex/static_root/assets/{index-CoFXW6I0.27f397e1425e.js → index-DtVx0ej4.9ca3e3d32eb8.js} +1 -1
  243. codex/static_root/assets/index-DtVx0ej4.9ca3e3d32eb8.js.br +0 -0
  244. codex/static_root/assets/index-DtVx0ej4.9ca3e3d32eb8.js.gz +0 -0
  245. codex/static_root/assets/{index-CoFXW6I0.js → index-DtVx0ej4.js} +1 -1
  246. codex/static_root/assets/index-DtVx0ej4.js.br +0 -0
  247. codex/static_root/assets/index-DtVx0ej4.js.gz +0 -0
  248. codex/static_root/assets/{library-tab-hkMMBz1x.02270491d822.js → library-tab-DEvrF6PF.c7a68c22664c.js} +1 -1
  249. codex/static_root/assets/library-tab-DEvrF6PF.c7a68c22664c.js.br +0 -0
  250. codex/static_root/assets/library-tab-DEvrF6PF.c7a68c22664c.js.gz +0 -0
  251. codex/static_root/assets/{library-tab-hkMMBz1x.js → library-tab-DEvrF6PF.js} +1 -1
  252. codex/static_root/assets/library-tab-DEvrF6PF.js.br +0 -0
  253. codex/static_root/assets/library-tab-DEvrF6PF.js.gz +0 -0
  254. codex/static_root/assets/{main-DCaPxp2h.076707ddd123.js → main-DTplblFl.b8e4b708287f.js} +3 -3
  255. codex/static_root/assets/main-DTplblFl.b8e4b708287f.js.br +0 -0
  256. codex/static_root/assets/main-DTplblFl.b8e4b708287f.js.gz +0 -0
  257. codex/static_root/assets/{main-DCaPxp2h.js → main-DTplblFl.js} +3 -3
  258. codex/static_root/assets/main-DTplblFl.js.br +0 -0
  259. codex/static_root/assets/main-DTplblFl.js.gz +0 -0
  260. codex/static_root/assets/pager-full-pdf-JIU1UvrN.627b621aa583.js +1 -0
  261. codex/static_root/assets/pager-full-pdf-JIU1UvrN.627b621aa583.js.br +0 -0
  262. codex/static_root/assets/pager-full-pdf-JIU1UvrN.627b621aa583.js.gz +0 -0
  263. codex/static_root/assets/pager-full-pdf-JIU1UvrN.js +1 -0
  264. codex/static_root/assets/pager-full-pdf-JIU1UvrN.js.br +0 -0
  265. codex/static_root/assets/pager-full-pdf-JIU1UvrN.js.gz +0 -0
  266. codex/static_root/assets/{pagination-toolbar-DoqxSygU.f985bc705fe5.js → pagination-toolbar-DHVJWGeE.c70de5ca6915.js} +1 -1
  267. codex/static_root/assets/pagination-toolbar-DHVJWGeE.c70de5ca6915.js.br +0 -0
  268. codex/static_root/assets/pagination-toolbar-DHVJWGeE.c70de5ca6915.js.gz +0 -0
  269. codex/static_root/assets/{pagination-toolbar-DoqxSygU.js → pagination-toolbar-DHVJWGeE.js} +1 -1
  270. codex/static_root/assets/pagination-toolbar-DHVJWGeE.js.br +0 -0
  271. codex/static_root/assets/pagination-toolbar-DHVJWGeE.js.gz +0 -0
  272. codex/static_root/assets/{pdf-doc-BwxvAx1z.96cbc39c321d.js → pdf-doc-DjtoQWxA.2c9fd3017300.js} +1 -1
  273. codex/static_root/assets/pdf-doc-DjtoQWxA.2c9fd3017300.js.br +0 -0
  274. codex/static_root/assets/pdf-doc-DjtoQWxA.2c9fd3017300.js.gz +0 -0
  275. codex/static_root/assets/{pdf-doc-BwxvAx1z.js → pdf-doc-DjtoQWxA.js} +1 -1
  276. codex/static_root/assets/pdf-doc-DjtoQWxA.js.br +0 -0
  277. codex/static_root/assets/pdf-doc-DjtoQWxA.js.gz +0 -0
  278. codex/static_root/assets/{reader-hHIonVbA.4c12219242a9.js → reader-DIjUh67D.061a8b501e35.js} +2 -2
  279. codex/static_root/assets/reader-DIjUh67D.061a8b501e35.js.br +0 -0
  280. codex/static_root/assets/reader-DIjUh67D.061a8b501e35.js.gz +0 -0
  281. codex/static_root/assets/{reader-hHIonVbA.js → reader-DIjUh67D.js} +2 -2
  282. codex/static_root/assets/reader-DIjUh67D.js.br +0 -0
  283. codex/static_root/assets/reader-DIjUh67D.js.gz +0 -0
  284. codex/static_root/assets/{relation-chips-D7-5kPem.4443b085aca2.js → relation-chips-ByFsclaN.2b9dc61299f6.js} +1 -1
  285. codex/static_root/assets/relation-chips-ByFsclaN.2b9dc61299f6.js.br +0 -0
  286. codex/static_root/assets/relation-chips-ByFsclaN.2b9dc61299f6.js.gz +0 -0
  287. codex/static_root/assets/{relation-chips-D7-5kPem.js → relation-chips-ByFsclaN.js} +1 -1
  288. codex/static_root/assets/relation-chips-ByFsclaN.js.br +0 -0
  289. codex/static_root/assets/relation-chips-ByFsclaN.js.gz +0 -0
  290. codex/static_root/assets/{settings-drawer-CdFmOhnd.f7dcd12b3ebc.js → settings-drawer-DWa5PBWW.dee5ebeb24fe.js} +2 -2
  291. codex/static_root/assets/settings-drawer-DWa5PBWW.dee5ebeb24fe.js.br +0 -0
  292. codex/static_root/assets/settings-drawer-DWa5PBWW.dee5ebeb24fe.js.gz +0 -0
  293. codex/static_root/assets/{settings-drawer-CdFmOhnd.js → settings-drawer-DWa5PBWW.js} +2 -2
  294. codex/static_root/assets/settings-drawer-DWa5PBWW.js.br +0 -0
  295. codex/static_root/assets/settings-drawer-DWa5PBWW.js.gz +0 -0
  296. codex/static_root/assets/{stats-tab-BzaipD0m.b6bf627ea860.js → stats-tab-B_i6PH1G.f11e0562b20d.js} +1 -1
  297. codex/static_root/assets/stats-tab-B_i6PH1G.f11e0562b20d.js.br +0 -0
  298. codex/static_root/assets/stats-tab-B_i6PH1G.f11e0562b20d.js.gz +0 -0
  299. codex/static_root/assets/{stats-tab-BzaipD0m.js → stats-tab-B_i6PH1G.js} +1 -1
  300. codex/static_root/assets/stats-tab-B_i6PH1G.js.br +0 -0
  301. codex/static_root/assets/stats-tab-B_i6PH1G.js.gz +0 -0
  302. codex/static_root/assets/{task-tab-DCnS1sM9.44d8435b4989.js → task-tab-DOEbnSf2.fe4907da1530.js} +1 -1
  303. codex/static_root/assets/task-tab-DOEbnSf2.fe4907da1530.js.br +0 -0
  304. codex/static_root/assets/task-tab-DOEbnSf2.fe4907da1530.js.gz +0 -0
  305. codex/static_root/assets/{task-tab-DCnS1sM9.js → task-tab-DOEbnSf2.js} +1 -1
  306. codex/static_root/assets/task-tab-DOEbnSf2.js.br +0 -0
  307. codex/static_root/assets/task-tab-DOEbnSf2.js.gz +0 -0
  308. codex/static_root/assets/{unauthorized-DJSr03Dw.7555cbcf1064.js → unauthorized-Cblht_KD.e0c38cb1a24c.js} +1 -1
  309. codex/static_root/assets/unauthorized-Cblht_KD.e0c38cb1a24c.js.br +0 -0
  310. codex/static_root/assets/unauthorized-Cblht_KD.e0c38cb1a24c.js.gz +0 -0
  311. codex/static_root/assets/{unauthorized-DJSr03Dw.js → unauthorized-Cblht_KD.js} +1 -1
  312. codex/static_root/assets/unauthorized-Cblht_KD.js.br +0 -0
  313. codex/static_root/assets/unauthorized-Cblht_KD.js.gz +0 -0
  314. codex/static_root/assets/{user-tab-DAK_Deoh.1832877d449a.js → user-tab-CdvLJrTe.e52c18781b89.js} +1 -1
  315. codex/static_root/assets/user-tab-CdvLJrTe.e52c18781b89.js.br +0 -0
  316. codex/static_root/assets/user-tab-CdvLJrTe.e52c18781b89.js.gz +0 -0
  317. codex/static_root/assets/{user-tab-DAK_Deoh.js → user-tab-CdvLJrTe.js} +1 -1
  318. codex/static_root/assets/user-tab-CdvLJrTe.js.br +0 -0
  319. codex/static_root/assets/user-tab-CdvLJrTe.js.gz +0 -0
  320. codex/static_root/manifest.e3e070ebb908.json +735 -0
  321. codex/static_root/manifest.e3e070ebb908.json.br +0 -0
  322. codex/static_root/manifest.e3e070ebb908.json.gz +0 -0
  323. codex/static_root/manifest.json +305 -305
  324. codex/static_root/manifest.json.br +0 -0
  325. codex/static_root/manifest.json.gz +0 -0
  326. codex/static_root/staticfiles.json +1 -1
  327. codex/status_controller.py +12 -9
  328. codex/urls/root.py +3 -4
  329. codex/views/admin/api_key.py +4 -1
  330. codex/views/admin/library.py +4 -4
  331. codex/views/admin/stats.py +10 -10
  332. codex/views/admin/tasks.py +9 -9
  333. codex/views/auth.py +8 -3
  334. codex/views/bookmark.py +3 -3
  335. codex/views/browser/annotate/card.py +2 -2
  336. codex/views/browser/annotate/order.py +7 -6
  337. codex/views/browser/bookmark.py +1 -1
  338. codex/views/browser/breadcrumbs.py +5 -6
  339. codex/views/browser/browser.py +2 -2
  340. codex/views/browser/choices.py +5 -6
  341. codex/views/browser/cover.py +3 -6
  342. codex/views/browser/download.py +1 -2
  343. codex/views/browser/filters/bookmark.py +1 -1
  344. codex/views/browser/filters/field.py +1 -1
  345. codex/views/browser/filters/filter.py +8 -6
  346. codex/views/browser/filters/group.py +4 -5
  347. codex/views/browser/filters/search/field/expression.py +2 -1
  348. codex/views/browser/filters/search/field/optimize.py +1 -1
  349. codex/views/browser/filters/search/field/parse.py +2 -2
  350. codex/views/browser/filters/search/parse.py +19 -4
  351. codex/views/browser/group_mtime.py +1 -1
  352. codex/views/browser/metadata/copy_intersections.py +1 -1
  353. codex/views/browser/metadata/metadata.py +1 -1
  354. codex/views/browser/mtime.py +1 -1
  355. codex/views/browser/order_by.py +5 -3
  356. codex/views/browser/params.py +1 -1
  357. codex/views/browser/settings.py +1 -1
  358. codex/views/browser/validate.py +5 -8
  359. codex/views/const.py +3 -0
  360. codex/views/frontend.py +1 -1
  361. codex/views/mixins.py +2 -3
  362. codex/views/opds/authentication_v1.py +1 -1
  363. codex/views/opds/const.py +4 -4
  364. codex/views/opds/util.py +3 -3
  365. codex/views/opds/v1/entry/entry.py +2 -4
  366. codex/views/opds/v1/entry/links.py +5 -4
  367. codex/views/opds/v1/facets.py +4 -8
  368. codex/views/opds/v1/feed.py +5 -5
  369. codex/views/opds/v1/links.py +6 -11
  370. codex/views/opds/v2/const.py +2 -5
  371. codex/views/opds/v2/feed.py +3 -3
  372. codex/views/opds/v2/progression.py +9 -8
  373. codex/views/opds/v2/publications.py +20 -10
  374. codex/views/public.py +1 -1
  375. codex/views/reader/books.py +2 -3
  376. codex/views/reader/page.py +3 -3
  377. codex/views/reader/params.py +2 -2
  378. codex/views/reader/reader.py +6 -6
  379. codex/views/reader/settings.py +1 -1
  380. codex/views/session.py +2 -8
  381. codex/views/settings.py +2 -2
  382. codex/views/timezone.py +2 -2
  383. codex/views/util.py +9 -10
  384. codex/views/version.py +1 -1
  385. {codex-1.7.3.dist-info → codex-1.7.3a1.dist-info}/METADATA +1 -2
  386. {codex-1.7.3.dist-info → codex-1.7.3a1.dist-info}/RECORD +565 -565
  387. {codex-1.7.3.dist-info → codex-1.7.3a1.dist-info}/WHEEL +1 -1
  388. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js.br +0 -0
  389. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js.gz +0 -0
  390. codex/static_root/assets/VCheckbox-Dv6fwaDb.js.br +0 -0
  391. codex/static_root/assets/VCheckbox-Dv6fwaDb.js.gz +0 -0
  392. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js.br +0 -0
  393. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js.gz +0 -0
  394. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js.br +0 -0
  395. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js.gz +0 -0
  396. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js.br +0 -0
  397. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js.gz +0 -0
  398. codex/static_root/assets/VCombobox-DqBFki-9.js.br +0 -0
  399. codex/static_root/assets/VCombobox-DqBFki-9.js.gz +0 -0
  400. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js.br +0 -0
  401. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js.gz +0 -0
  402. codex/static_root/assets/VDialog-CQXjBvDZ.js.br +0 -0
  403. codex/static_root/assets/VDialog-CQXjBvDZ.js.gz +0 -0
  404. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js.br +0 -0
  405. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js.gz +0 -0
  406. codex/static_root/assets/VDivider-DUxQu-IZ.js.br +0 -0
  407. codex/static_root/assets/VDivider-DUxQu-IZ.js.gz +0 -0
  408. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js.br +0 -0
  409. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js.gz +0 -0
  410. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js.br +0 -0
  411. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js.gz +0 -0
  412. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js.br +0 -0
  413. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js.gz +0 -0
  414. codex/static_root/assets/VForm-hB4C5jVd.js.br +0 -0
  415. codex/static_root/assets/VForm-hB4C5jVd.js.gz +0 -0
  416. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js.br +0 -0
  417. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js.gz +0 -0
  418. codex/static_root/assets/VRadioGroup-DOjw38qB.js.br +0 -0
  419. codex/static_root/assets/VRadioGroup-DOjw38qB.js.gz +0 -0
  420. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js.br +0 -0
  421. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js.gz +0 -0
  422. codex/static_root/assets/VSelect-L4v_m3ag.js.br +0 -0
  423. codex/static_root/assets/VSelect-L4v_m3ag.js.gz +0 -0
  424. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js.br +0 -0
  425. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js.gz +0 -0
  426. codex/static_root/assets/VSelectionControl-BqB1JeKa.js.br +0 -0
  427. codex/static_root/assets/VSelectionControl-BqB1JeKa.js.gz +0 -0
  428. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js.br +0 -0
  429. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js.gz +0 -0
  430. codex/static_root/assets/VTable-CtorAbOx.js.br +0 -0
  431. codex/static_root/assets/VTable-CtorAbOx.js.gz +0 -0
  432. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js.br +0 -0
  433. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js.gz +0 -0
  434. codex/static_root/assets/VWindowItem-Bl-fa3ss.js.br +0 -0
  435. codex/static_root/assets/VWindowItem-Bl-fa3ss.js.gz +0 -0
  436. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js.br +0 -0
  437. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js.gz +0 -0
  438. codex/static_root/assets/admin-BAVKNREt.js.br +0 -0
  439. codex/static_root/assets/admin-BAVKNREt.js.gz +0 -0
  440. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js.br +0 -0
  441. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js.gz +0 -0
  442. codex/static_root/assets/admin-CHuFhx_t.js.br +0 -0
  443. codex/static_root/assets/admin-CHuFhx_t.js.gz +0 -0
  444. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js.br +0 -0
  445. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js.gz +0 -0
  446. codex/static_root/assets/admin-menu-T8WJ_x0C.js.br +0 -0
  447. codex/static_root/assets/admin-menu-T8WJ_x0C.js.gz +0 -0
  448. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js.br +0 -0
  449. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js.gz +0 -0
  450. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js.br +0 -0
  451. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js.gz +0 -0
  452. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css.br +0 -0
  453. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css.gz +0 -0
  454. codex/static_root/assets/browser-DNzQvgkY.css.br +0 -0
  455. codex/static_root/assets/browser-DNzQvgkY.css.gz +0 -0
  456. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js +0 -1
  457. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js.br +0 -0
  458. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js.gz +0 -0
  459. codex/static_root/assets/browser-DdLCtUlr.js +0 -1
  460. codex/static_root/assets/browser-DdLCtUlr.js.br +0 -0
  461. codex/static_root/assets/browser-DdLCtUlr.js.gz +0 -0
  462. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js.br +0 -0
  463. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js.gz +0 -0
  464. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js.br +0 -0
  465. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js.gz +0 -0
  466. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js.br +0 -0
  467. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js.gz +0 -0
  468. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js.br +0 -0
  469. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js.gz +0 -0
  470. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js.br +0 -0
  471. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js.gz +0 -0
  472. codex/static_root/assets/datetime-column-DVC0YqHC.js.br +0 -0
  473. codex/static_root/assets/datetime-column-DVC0YqHC.js.gz +0 -0
  474. codex/static_root/assets/filter-xcEcgcIx.be1bb4725c89.js.br +0 -0
  475. codex/static_root/assets/filter-xcEcgcIx.be1bb4725c89.js.gz +0 -0
  476. codex/static_root/assets/filter-xcEcgcIx.js.br +0 -0
  477. codex/static_root/assets/filter-xcEcgcIx.js.gz +0 -0
  478. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js +0 -1
  479. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js.br +0 -0
  480. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js.gz +0 -0
  481. codex/static_root/assets/flag-tab-BOyQb0kr.js +0 -1
  482. codex/static_root/assets/flag-tab-BOyQb0kr.js.br +0 -0
  483. codex/static_root/assets/flag-tab-BOyQb0kr.js.gz +0 -0
  484. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css +0 -1
  485. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css.br +0 -0
  486. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css.gz +0 -0
  487. codex/static_root/assets/flag-tab-D2MYXCHk.css +0 -1
  488. codex/static_root/assets/flag-tab-D2MYXCHk.css.br +0 -0
  489. codex/static_root/assets/flag-tab-D2MYXCHk.css.gz +0 -0
  490. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js.br +0 -0
  491. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js.gz +0 -0
  492. codex/static_root/assets/forwardRefs-D1ZDjzWx.js.br +0 -0
  493. codex/static_root/assets/forwardRefs-D1ZDjzWx.js.gz +0 -0
  494. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js.br +0 -0
  495. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js.gz +0 -0
  496. codex/static_root/assets/group-tab-DkAIGL8z.js.br +0 -0
  497. codex/static_root/assets/group-tab-DkAIGL8z.js.gz +0 -0
  498. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js.br +0 -0
  499. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js.gz +0 -0
  500. codex/static_root/assets/http-error-CjSb8orc.js.br +0 -0
  501. codex/static_root/assets/http-error-CjSb8orc.js.gz +0 -0
  502. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js.br +0 -0
  503. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js.gz +0 -0
  504. codex/static_root/assets/index-CoFXW6I0.js.br +0 -0
  505. codex/static_root/assets/index-CoFXW6I0.js.gz +0 -0
  506. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js.br +0 -0
  507. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js.gz +0 -0
  508. codex/static_root/assets/library-tab-hkMMBz1x.js.br +0 -0
  509. codex/static_root/assets/library-tab-hkMMBz1x.js.gz +0 -0
  510. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js.br +0 -0
  511. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js.gz +0 -0
  512. codex/static_root/assets/main-DCaPxp2h.js.br +0 -0
  513. codex/static_root/assets/main-DCaPxp2h.js.gz +0 -0
  514. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js +0 -1
  515. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js.br +0 -0
  516. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js.gz +0 -0
  517. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js +0 -1
  518. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js.br +0 -0
  519. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js.gz +0 -0
  520. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js.br +0 -0
  521. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js.gz +0 -0
  522. codex/static_root/assets/pagination-toolbar-DoqxSygU.js.br +0 -0
  523. codex/static_root/assets/pagination-toolbar-DoqxSygU.js.gz +0 -0
  524. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js.br +0 -0
  525. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js.gz +0 -0
  526. codex/static_root/assets/pdf-doc-BwxvAx1z.js.br +0 -0
  527. codex/static_root/assets/pdf-doc-BwxvAx1z.js.gz +0 -0
  528. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js.br +0 -0
  529. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js.gz +0 -0
  530. codex/static_root/assets/reader-hHIonVbA.js.br +0 -0
  531. codex/static_root/assets/reader-hHIonVbA.js.gz +0 -0
  532. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js.br +0 -0
  533. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js.gz +0 -0
  534. codex/static_root/assets/relation-chips-D7-5kPem.js.br +0 -0
  535. codex/static_root/assets/relation-chips-D7-5kPem.js.gz +0 -0
  536. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js.br +0 -0
  537. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js.gz +0 -0
  538. codex/static_root/assets/settings-drawer-CdFmOhnd.js.br +0 -0
  539. codex/static_root/assets/settings-drawer-CdFmOhnd.js.gz +0 -0
  540. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js.br +0 -0
  541. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js.gz +0 -0
  542. codex/static_root/assets/stats-tab-BzaipD0m.js.br +0 -0
  543. codex/static_root/assets/stats-tab-BzaipD0m.js.gz +0 -0
  544. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js.br +0 -0
  545. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js.gz +0 -0
  546. codex/static_root/assets/task-tab-DCnS1sM9.js.br +0 -0
  547. codex/static_root/assets/task-tab-DCnS1sM9.js.gz +0 -0
  548. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js.br +0 -0
  549. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js.gz +0 -0
  550. codex/static_root/assets/unauthorized-DJSr03Dw.js.br +0 -0
  551. codex/static_root/assets/unauthorized-DJSr03Dw.js.gz +0 -0
  552. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js.br +0 -0
  553. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js.gz +0 -0
  554. codex/static_root/assets/user-tab-DAK_Deoh.js.br +0 -0
  555. codex/static_root/assets/user-tab-DAK_Deoh.js.gz +0 -0
  556. codex/static_root/manifest.cbc39bca88fc.json +0 -735
  557. codex/static_root/manifest.cbc39bca88fc.json.br +0 -0
  558. codex/static_root/manifest.cbc39bca88fc.json.gz +0 -0
  559. /codex/static_root/assets/{VCheckbox-CvH8ekHL.016ed8d222c4.css → VCheckbox-CMKdyl0R.016ed8d222c4.css} +0 -0
  560. /codex/static_root/assets/{VCheckbox-CvH8ekHL.016ed8d222c4.css.br → VCheckbox-CMKdyl0R.016ed8d222c4.css.br} +0 -0
  561. /codex/static_root/assets/{VCheckbox-CvH8ekHL.016ed8d222c4.css.gz → VCheckbox-CMKdyl0R.016ed8d222c4.css.gz} +0 -0
  562. /codex/static_root/assets/{VCheckbox-CvH8ekHL.css → VCheckbox-CMKdyl0R.css} +0 -0
  563. /codex/static_root/assets/{VCheckbox-CvH8ekHL.css.br → VCheckbox-CMKdyl0R.css.br} +0 -0
  564. /codex/static_root/assets/{VCheckbox-CvH8ekHL.css.gz → VCheckbox-CMKdyl0R.css.gz} +0 -0
  565. /codex/static_root/assets/{VCombobox-BQHELb_o.9f25a34994e2.css → VCombobox-bwEYrXCg.9f25a34994e2.css} +0 -0
  566. /codex/static_root/assets/{VCombobox-BQHELb_o.9f25a34994e2.css.br → VCombobox-bwEYrXCg.9f25a34994e2.css.br} +0 -0
  567. /codex/static_root/assets/{VCombobox-BQHELb_o.9f25a34994e2.css.gz → VCombobox-bwEYrXCg.9f25a34994e2.css.gz} +0 -0
  568. /codex/static_root/assets/{VCombobox-BQHELb_o.css → VCombobox-bwEYrXCg.css} +0 -0
  569. /codex/static_root/assets/{VCombobox-BQHELb_o.css.br → VCombobox-bwEYrXCg.css.br} +0 -0
  570. /codex/static_root/assets/{VCombobox-BQHELb_o.css.gz → VCombobox-bwEYrXCg.css.gz} +0 -0
  571. /codex/static_root/assets/{VDialog-DWos4S54.b07aca713774.css → VDialog-Dyd05WHA.b07aca713774.css} +0 -0
  572. /codex/static_root/assets/{VDialog-DWos4S54.b07aca713774.css.br → VDialog-Dyd05WHA.b07aca713774.css.br} +0 -0
  573. /codex/static_root/assets/{VDialog-DWos4S54.b07aca713774.css.gz → VDialog-Dyd05WHA.b07aca713774.css.gz} +0 -0
  574. /codex/static_root/assets/{VDialog-DWos4S54.css → VDialog-Dyd05WHA.css} +0 -0
  575. /codex/static_root/assets/{VDialog-DWos4S54.css.br → VDialog-Dyd05WHA.css.br} +0 -0
  576. /codex/static_root/assets/{VDialog-DWos4S54.css.gz → VDialog-Dyd05WHA.css.gz} +0 -0
  577. /codex/static_root/assets/{VDivider-DU47sRrT.3d2e17799e5c.css → VDivider-DE8MJPGz.3d2e17799e5c.css} +0 -0
  578. /codex/static_root/assets/{VDivider-DU47sRrT.3d2e17799e5c.css.br → VDivider-DE8MJPGz.3d2e17799e5c.css.br} +0 -0
  579. /codex/static_root/assets/{VDivider-DU47sRrT.3d2e17799e5c.css.gz → VDivider-DE8MJPGz.3d2e17799e5c.css.gz} +0 -0
  580. /codex/static_root/assets/{VDivider-DU47sRrT.css → VDivider-DE8MJPGz.css} +0 -0
  581. /codex/static_root/assets/{VDivider-DU47sRrT.css.br → VDivider-DE8MJPGz.css.br} +0 -0
  582. /codex/static_root/assets/{VDivider-DU47sRrT.css.gz → VDivider-DE8MJPGz.css.gz} +0 -0
  583. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.5b17872981df.css → VExpansionPanels-6G1AUajL.5b17872981df.css} +0 -0
  584. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.5b17872981df.css.br → VExpansionPanels-6G1AUajL.5b17872981df.css.br} +0 -0
  585. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.5b17872981df.css.gz → VExpansionPanels-6G1AUajL.5b17872981df.css.gz} +0 -0
  586. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.css → VExpansionPanels-6G1AUajL.css} +0 -0
  587. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.css.br → VExpansionPanels-6G1AUajL.css.br} +0 -0
  588. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.css.gz → VExpansionPanels-6G1AUajL.css.gz} +0 -0
  589. /codex/static_root/assets/{VForm-DxBt30-N.138c0b89b6fc.css → VForm-v1Gmu6E1.138c0b89b6fc.css} +0 -0
  590. /codex/static_root/assets/{VForm-DxBt30-N.138c0b89b6fc.css.br → VForm-v1Gmu6E1.138c0b89b6fc.css.br} +0 -0
  591. /codex/static_root/assets/{VForm-DxBt30-N.138c0b89b6fc.css.gz → VForm-v1Gmu6E1.138c0b89b6fc.css.gz} +0 -0
  592. /codex/static_root/assets/{VForm-DxBt30-N.css → VForm-v1Gmu6E1.css} +0 -0
  593. /codex/static_root/assets/{VForm-DxBt30-N.css.br → VForm-v1Gmu6E1.css.br} +0 -0
  594. /codex/static_root/assets/{VForm-DxBt30-N.css.gz → VForm-v1Gmu6E1.css.gz} +0 -0
  595. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.8e3741381961.css → VRadioGroup-i2qP9Wu9.8e3741381961.css} +0 -0
  596. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.8e3741381961.css.br → VRadioGroup-i2qP9Wu9.8e3741381961.css.br} +0 -0
  597. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.8e3741381961.css.gz → VRadioGroup-i2qP9Wu9.8e3741381961.css.gz} +0 -0
  598. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.css → VRadioGroup-i2qP9Wu9.css} +0 -0
  599. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.css.br → VRadioGroup-i2qP9Wu9.css.br} +0 -0
  600. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.css.gz → VRadioGroup-i2qP9Wu9.css.gz} +0 -0
  601. /codex/static_root/assets/{VSelect-CP_CVb8s.6309f7bf17bb.css → VSelect-8MFoaOUz.6309f7bf17bb.css} +0 -0
  602. /codex/static_root/assets/{VSelect-CP_CVb8s.6309f7bf17bb.css.br → VSelect-8MFoaOUz.6309f7bf17bb.css.br} +0 -0
  603. /codex/static_root/assets/{VSelect-CP_CVb8s.6309f7bf17bb.css.gz → VSelect-8MFoaOUz.6309f7bf17bb.css.gz} +0 -0
  604. /codex/static_root/assets/{VSelect-CP_CVb8s.css → VSelect-8MFoaOUz.css} +0 -0
  605. /codex/static_root/assets/{VSelect-CP_CVb8s.css.br → VSelect-8MFoaOUz.css.br} +0 -0
  606. /codex/static_root/assets/{VSelect-CP_CVb8s.css.gz → VSelect-8MFoaOUz.css.gz} +0 -0
  607. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.cc18de4e83f6.css → VSelectionControl-DLxcLoTI.cc18de4e83f6.css} +0 -0
  608. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.cc18de4e83f6.css.br → VSelectionControl-DLxcLoTI.cc18de4e83f6.css.br} +0 -0
  609. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.cc18de4e83f6.css.gz → VSelectionControl-DLxcLoTI.cc18de4e83f6.css.gz} +0 -0
  610. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.css → VSelectionControl-DLxcLoTI.css} +0 -0
  611. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.css.br → VSelectionControl-DLxcLoTI.css.br} +0 -0
  612. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.css.gz → VSelectionControl-DLxcLoTI.css.gz} +0 -0
  613. /codex/static_root/assets/{VTable-BnxSZ_W5.c36f0a6a30cf.css → VTable-Y5Sc3hJd.c36f0a6a30cf.css} +0 -0
  614. /codex/static_root/assets/{VTable-BnxSZ_W5.c36f0a6a30cf.css.br → VTable-Y5Sc3hJd.c36f0a6a30cf.css.br} +0 -0
  615. /codex/static_root/assets/{VTable-BnxSZ_W5.c36f0a6a30cf.css.gz → VTable-Y5Sc3hJd.c36f0a6a30cf.css.gz} +0 -0
  616. /codex/static_root/assets/{VTable-BnxSZ_W5.css → VTable-Y5Sc3hJd.css} +0 -0
  617. /codex/static_root/assets/{VTable-BnxSZ_W5.css.br → VTable-Y5Sc3hJd.css.br} +0 -0
  618. /codex/static_root/assets/{VTable-BnxSZ_W5.css.gz → VTable-Y5Sc3hJd.css.gz} +0 -0
  619. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.css → VWindowItem-ByIod57Y.css} +0 -0
  620. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.css.br → VWindowItem-ByIod57Y.css.br} +0 -0
  621. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.css.gz → VWindowItem-ByIod57Y.css.gz} +0 -0
  622. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.f7fb19752bf3.css → VWindowItem-ByIod57Y.f7fb19752bf3.css} +0 -0
  623. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.f7fb19752bf3.css.br → VWindowItem-ByIod57Y.f7fb19752bf3.css.br} +0 -0
  624. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.f7fb19752bf3.css.gz → VWindowItem-ByIod57Y.f7fb19752bf3.css.gz} +0 -0
  625. /codex/static_root/assets/{admin-C3iCIUnm.06cb213f624d.css → admin-VRLEt4I5.06cb213f624d.css} +0 -0
  626. /codex/static_root/assets/{admin-C3iCIUnm.06cb213f624d.css.br → admin-VRLEt4I5.06cb213f624d.css.br} +0 -0
  627. /codex/static_root/assets/{admin-C3iCIUnm.06cb213f624d.css.gz → admin-VRLEt4I5.06cb213f624d.css.gz} +0 -0
  628. /codex/static_root/assets/{admin-C3iCIUnm.css → admin-VRLEt4I5.css} +0 -0
  629. /codex/static_root/assets/{admin-C3iCIUnm.css.br → admin-VRLEt4I5.css.br} +0 -0
  630. /codex/static_root/assets/{admin-C3iCIUnm.css.gz → admin-VRLEt4I5.css.gz} +0 -0
  631. /codex/static_root/assets/{admin-menu-B3iXsOyy.c13b7df2ff57.css → admin-menu-B9bzD6hV.c13b7df2ff57.css} +0 -0
  632. /codex/static_root/assets/{admin-menu-B3iXsOyy.c13b7df2ff57.css.br → admin-menu-B9bzD6hV.c13b7df2ff57.css.br} +0 -0
  633. /codex/static_root/assets/{admin-menu-B3iXsOyy.c13b7df2ff57.css.gz → admin-menu-B9bzD6hV.c13b7df2ff57.css.gz} +0 -0
  634. /codex/static_root/assets/{admin-menu-B3iXsOyy.css → admin-menu-B9bzD6hV.css} +0 -0
  635. /codex/static_root/assets/{admin-menu-B3iXsOyy.css.br → admin-menu-B9bzD6hV.css.br} +0 -0
  636. /codex/static_root/assets/{admin-menu-B3iXsOyy.css.gz → admin-menu-B9bzD6hV.css.gz} +0 -0
  637. /codex/static_root/assets/{admin-settings-button-progress-BGB22oTD.2548c49a853e.css → admin-settings-button-progress-DUUQfVsZ.2548c49a853e.css} +0 -0
  638. /codex/static_root/assets/{admin-settings-button-progress-BGB22oTD.css → admin-settings-button-progress-DUUQfVsZ.css} +0 -0
  639. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.a30e68c6e303.css → change-password-dialog-C_EOKOn9.a30e68c6e303.css} +0 -0
  640. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.a30e68c6e303.css.br → change-password-dialog-C_EOKOn9.a30e68c6e303.css.br} +0 -0
  641. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.a30e68c6e303.css.gz → change-password-dialog-C_EOKOn9.a30e68c6e303.css.gz} +0 -0
  642. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.css → change-password-dialog-C_EOKOn9.css} +0 -0
  643. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.css.br → change-password-dialog-C_EOKOn9.css.br} +0 -0
  644. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.css.gz → change-password-dialog-C_EOKOn9.css.gz} +0 -0
  645. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.9b5915b112c0.css → confirm-dialog-54rblwf7.9b5915b112c0.css} +0 -0
  646. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.9b5915b112c0.css.br → confirm-dialog-54rblwf7.9b5915b112c0.css.br} +0 -0
  647. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.css → confirm-dialog-54rblwf7.css} +0 -0
  648. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.css.br → confirm-dialog-54rblwf7.css.br} +0 -0
  649. /codex/static_root/assets/{datetime-column-BavtvLnf.1f3bf499e063.css → datetime-column-DeCthByU.1f3bf499e063.css} +0 -0
  650. /codex/static_root/assets/{datetime-column-BavtvLnf.css → datetime-column-DeCthByU.css} +0 -0
  651. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.9b56b4459240.css → forwardRefs-zKOZsbbr.9b56b4459240.css} +0 -0
  652. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.9b56b4459240.css.br → forwardRefs-zKOZsbbr.9b56b4459240.css.br} +0 -0
  653. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.9b56b4459240.css.gz → forwardRefs-zKOZsbbr.9b56b4459240.css.gz} +0 -0
  654. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.css → forwardRefs-zKOZsbbr.css} +0 -0
  655. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.css.br → forwardRefs-zKOZsbbr.css.br} +0 -0
  656. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.css.gz → forwardRefs-zKOZsbbr.css.gz} +0 -0
  657. /codex/static_root/assets/{group-tab-_vKWzoyd.948e907b1e6b.css → group-tab-DkIN1Heu.948e907b1e6b.css} +0 -0
  658. /codex/static_root/assets/{group-tab-_vKWzoyd.948e907b1e6b.css.br → group-tab-DkIN1Heu.948e907b1e6b.css.br} +0 -0
  659. /codex/static_root/assets/{group-tab-_vKWzoyd.948e907b1e6b.css.gz → group-tab-DkIN1Heu.948e907b1e6b.css.gz} +0 -0
  660. /codex/static_root/assets/{group-tab-_vKWzoyd.css → group-tab-DkIN1Heu.css} +0 -0
  661. /codex/static_root/assets/{group-tab-_vKWzoyd.css.br → group-tab-DkIN1Heu.css.br} +0 -0
  662. /codex/static_root/assets/{group-tab-_vKWzoyd.css.gz → group-tab-DkIN1Heu.css.gz} +0 -0
  663. /codex/static_root/assets/{http-error-CODU7jcH.8c13689ae574.css → http-error-DEJmFobt.8c13689ae574.css} +0 -0
  664. /codex/static_root/assets/{http-error-CODU7jcH.8c13689ae574.css.br → http-error-DEJmFobt.8c13689ae574.css.br} +0 -0
  665. /codex/static_root/assets/{http-error-CODU7jcH.8c13689ae574.css.gz → http-error-DEJmFobt.8c13689ae574.css.gz} +0 -0
  666. /codex/static_root/assets/{http-error-CODU7jcH.css → http-error-DEJmFobt.css} +0 -0
  667. /codex/static_root/assets/{http-error-CODU7jcH.css.br → http-error-DEJmFobt.css.br} +0 -0
  668. /codex/static_root/assets/{http-error-CODU7jcH.css.gz → http-error-DEJmFobt.css.gz} +0 -0
  669. /codex/static_root/assets/{index-BHXJTQ4V.523d7b3d350f.css → index-CL_6g4tJ.523d7b3d350f.css} +0 -0
  670. /codex/static_root/assets/{index-BHXJTQ4V.523d7b3d350f.css.br → index-CL_6g4tJ.523d7b3d350f.css.br} +0 -0
  671. /codex/static_root/assets/{index-BHXJTQ4V.523d7b3d350f.css.gz → index-CL_6g4tJ.523d7b3d350f.css.gz} +0 -0
  672. /codex/static_root/assets/{index-BHXJTQ4V.css → index-CL_6g4tJ.css} +0 -0
  673. /codex/static_root/assets/{index-BHXJTQ4V.css.br → index-CL_6g4tJ.css.br} +0 -0
  674. /codex/static_root/assets/{index-BHXJTQ4V.css.gz → index-CL_6g4tJ.css.gz} +0 -0
  675. /codex/static_root/assets/{library-tab-CgsXOX_r.75baedb7e976.css → library-tab-Ce6qaeCV.75baedb7e976.css} +0 -0
  676. /codex/static_root/assets/{library-tab-CgsXOX_r.75baedb7e976.css.br → library-tab-Ce6qaeCV.75baedb7e976.css.br} +0 -0
  677. /codex/static_root/assets/{library-tab-CgsXOX_r.75baedb7e976.css.gz → library-tab-Ce6qaeCV.75baedb7e976.css.gz} +0 -0
  678. /codex/static_root/assets/{library-tab-CgsXOX_r.css → library-tab-Ce6qaeCV.css} +0 -0
  679. /codex/static_root/assets/{library-tab-CgsXOX_r.css.br → library-tab-Ce6qaeCV.css.br} +0 -0
  680. /codex/static_root/assets/{library-tab-CgsXOX_r.css.gz → library-tab-Ce6qaeCV.css.gz} +0 -0
  681. /codex/static_root/assets/{main-K8cER0IH.css → main-BZ73p_WW.css} +0 -0
  682. /codex/static_root/assets/{main-K8cER0IH.css.br → main-BZ73p_WW.css.br} +0 -0
  683. /codex/static_root/assets/{main-K8cER0IH.css.gz → main-BZ73p_WW.css.gz} +0 -0
  684. /codex/static_root/assets/{main-K8cER0IH.d529e8b3f52a.css → main-BZ73p_WW.d529e8b3f52a.css} +0 -0
  685. /codex/static_root/assets/{main-K8cER0IH.d529e8b3f52a.css.br → main-BZ73p_WW.d529e8b3f52a.css.br} +0 -0
  686. /codex/static_root/assets/{main-K8cER0IH.d529e8b3f52a.css.gz → main-BZ73p_WW.d529e8b3f52a.css.gz} +0 -0
  687. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.css → pagination-toolbar-DSe0TkMm.css} +0 -0
  688. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.css.br → pagination-toolbar-DSe0TkMm.css.br} +0 -0
  689. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.css.gz → pagination-toolbar-DSe0TkMm.css.gz} +0 -0
  690. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.dcb0eba65827.css → pagination-toolbar-DSe0TkMm.dcb0eba65827.css} +0 -0
  691. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.dcb0eba65827.css.br → pagination-toolbar-DSe0TkMm.dcb0eba65827.css.br} +0 -0
  692. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.dcb0eba65827.css.gz → pagination-toolbar-DSe0TkMm.dcb0eba65827.css.gz} +0 -0
  693. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.b94aac7e3313.css → pdf-doc-CG5-AZ2M.b94aac7e3313.css} +0 -0
  694. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.b94aac7e3313.css.br → pdf-doc-CG5-AZ2M.b94aac7e3313.css.br} +0 -0
  695. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.b94aac7e3313.css.gz → pdf-doc-CG5-AZ2M.b94aac7e3313.css.gz} +0 -0
  696. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.css → pdf-doc-CG5-AZ2M.css} +0 -0
  697. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.css.br → pdf-doc-CG5-AZ2M.css.br} +0 -0
  698. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.css.gz → pdf-doc-CG5-AZ2M.css.gz} +0 -0
  699. /codex/static_root/assets/{reader-D_3ruSqa.2ed32f08e906.css → reader-B3hgta6g.2ed32f08e906.css} +0 -0
  700. /codex/static_root/assets/{reader-D_3ruSqa.2ed32f08e906.css.br → reader-B3hgta6g.2ed32f08e906.css.br} +0 -0
  701. /codex/static_root/assets/{reader-D_3ruSqa.2ed32f08e906.css.gz → reader-B3hgta6g.2ed32f08e906.css.gz} +0 -0
  702. /codex/static_root/assets/{reader-D_3ruSqa.css → reader-B3hgta6g.css} +0 -0
  703. /codex/static_root/assets/{reader-D_3ruSqa.css.br → reader-B3hgta6g.css.br} +0 -0
  704. /codex/static_root/assets/{reader-D_3ruSqa.css.gz → reader-B3hgta6g.css.gz} +0 -0
  705. /codex/static_root/assets/{relation-chips-DpbzrZxT.01269a188e01.css → relation-chips-ByfWwuQc.01269a188e01.css} +0 -0
  706. /codex/static_root/assets/{relation-chips-DpbzrZxT.01269a188e01.css.br → relation-chips-ByfWwuQc.01269a188e01.css.br} +0 -0
  707. /codex/static_root/assets/{relation-chips-DpbzrZxT.01269a188e01.css.gz → relation-chips-ByfWwuQc.01269a188e01.css.gz} +0 -0
  708. /codex/static_root/assets/{relation-chips-DpbzrZxT.css → relation-chips-ByfWwuQc.css} +0 -0
  709. /codex/static_root/assets/{relation-chips-DpbzrZxT.css.br → relation-chips-ByfWwuQc.css.br} +0 -0
  710. /codex/static_root/assets/{relation-chips-DpbzrZxT.css.gz → relation-chips-ByfWwuQc.css.gz} +0 -0
  711. /codex/static_root/assets/{settings-drawer-DMSsWF8c.75a6ea969e71.css → settings-drawer-CqJ4gXLq.75a6ea969e71.css} +0 -0
  712. /codex/static_root/assets/{settings-drawer-DMSsWF8c.75a6ea969e71.css.br → settings-drawer-CqJ4gXLq.75a6ea969e71.css.br} +0 -0
  713. /codex/static_root/assets/{settings-drawer-DMSsWF8c.75a6ea969e71.css.gz → settings-drawer-CqJ4gXLq.75a6ea969e71.css.gz} +0 -0
  714. /codex/static_root/assets/{settings-drawer-DMSsWF8c.css → settings-drawer-CqJ4gXLq.css} +0 -0
  715. /codex/static_root/assets/{settings-drawer-DMSsWF8c.css.br → settings-drawer-CqJ4gXLq.css.br} +0 -0
  716. /codex/static_root/assets/{settings-drawer-DMSsWF8c.css.gz → settings-drawer-CqJ4gXLq.css.gz} +0 -0
  717. /codex/static_root/assets/{stats-tab-WvF2acoZ.9fdb0106124d.css → stats-tab-BlXGStge.9fdb0106124d.css} +0 -0
  718. /codex/static_root/assets/{stats-tab-WvF2acoZ.9fdb0106124d.css.br → stats-tab-BlXGStge.9fdb0106124d.css.br} +0 -0
  719. /codex/static_root/assets/{stats-tab-WvF2acoZ.9fdb0106124d.css.gz → stats-tab-BlXGStge.9fdb0106124d.css.gz} +0 -0
  720. /codex/static_root/assets/{stats-tab-WvF2acoZ.css → stats-tab-BlXGStge.css} +0 -0
  721. /codex/static_root/assets/{stats-tab-WvF2acoZ.css.br → stats-tab-BlXGStge.css.br} +0 -0
  722. /codex/static_root/assets/{stats-tab-WvF2acoZ.css.gz → stats-tab-BlXGStge.css.gz} +0 -0
  723. /codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css → task-tab-EGlhcKTH.478e74041f80.css} +0 -0
  724. /codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css.br → task-tab-EGlhcKTH.478e74041f80.css.br} +0 -0
  725. /codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css.gz → task-tab-EGlhcKTH.478e74041f80.css.gz} +0 -0
  726. /codex/static_root/assets/{task-tab-DfdUY9Rc.css → task-tab-EGlhcKTH.css} +0 -0
  727. /codex/static_root/assets/{task-tab-DfdUY9Rc.css.br → task-tab-EGlhcKTH.css.br} +0 -0
  728. /codex/static_root/assets/{task-tab-DfdUY9Rc.css.gz → task-tab-EGlhcKTH.css.gz} +0 -0
  729. /codex/static_root/assets/{unauthorized-CsSak07X.c5536d9dae75.css → unauthorized-VnIXUO1w.c5536d9dae75.css} +0 -0
  730. /codex/static_root/assets/{unauthorized-CsSak07X.c5536d9dae75.css.br → unauthorized-VnIXUO1w.c5536d9dae75.css.br} +0 -0
  731. /codex/static_root/assets/{unauthorized-CsSak07X.c5536d9dae75.css.gz → unauthorized-VnIXUO1w.c5536d9dae75.css.gz} +0 -0
  732. /codex/static_root/assets/{unauthorized-CsSak07X.css → unauthorized-VnIXUO1w.css} +0 -0
  733. /codex/static_root/assets/{unauthorized-CsSak07X.css.br → unauthorized-VnIXUO1w.css.br} +0 -0
  734. /codex/static_root/assets/{unauthorized-CsSak07X.css.gz → unauthorized-VnIXUO1w.css.gz} +0 -0
  735. {codex-1.7.3.dist-info → codex-1.7.3a1.dist-info}/LICENSE +0 -0
  736. {codex-1.7.3.dist-info → codex-1.7.3a1.dist-info}/entry_points.txt +0 -0
codex/asgi.py CHANGED
@@ -1,5 +1,4 @@
1
- """
2
- ASGI config for codex project.
1
+ """ASGI config for codex project.
3
2
 
4
3
  It exposes the ASGI callable as a module-level variable named ``DJANGO_APPLICATION``.
5
4
 
codex/choices.py CHANGED
@@ -93,6 +93,7 @@ BROWSER_DEFAULTS = MappingProxyType(
93
93
  "order_by": "sort_name",
94
94
  "order_reverse": False,
95
95
  "q": "",
96
+ # "search_results_limit": 100,
96
97
  "show": _DEFAULT_SHOW,
97
98
  "top_group": "p",
98
99
  "twenty_four_hour_time": False,
@@ -390,9 +391,11 @@ ADMIN_TASK_GROUPS = MappingProxyType(
390
391
 
391
392
  def _group_task_values(groups):
392
393
  """Extract values into sorted tuple."""
393
- return tuple(
394
- sorted([item["value"] for group in groups["tasks"] for item in group["tasks"]])
395
- )
394
+ values = []
395
+ for group in groups["tasks"]:
396
+ for item in group["tasks"]:
397
+ values.append(item["value"])
398
+ return tuple(sorted(values))
396
399
 
397
400
 
398
401
  ADMIN_TASKS = _group_task_values(ADMIN_TASK_GROUPS)
codex/choices_to_json.py CHANGED
@@ -18,7 +18,6 @@ from codex.choices import (
18
18
  READER_DEFAULTS,
19
19
  WEBSOCKET_MESSAGES,
20
20
  )
21
- from codex.serializers.route import RouteSerializer
22
21
 
23
22
  _DEFAULTS = MappingProxyType(
24
23
  {"browser-choices.json": BROWSER_DEFAULTS, "reader-choices.json": READER_DEFAULTS}
@@ -69,11 +68,12 @@ def _make_json_serializable(data):
69
68
  if isinstance(data, Mapping):
70
69
  json_dict = {}
71
70
  for key, value in data.items():
72
- if key == "breadcrumbs":
73
- json_value = tuple(RouteSerializer(dict(route)).data for route in value)
71
+ if key == "pks":
72
+ # Special route serializer
73
+ # XXX possibly should use actual route serializer for route not just pks
74
+ json_dict[key] = ",".join(str(pk) for pk in sorted(value))
74
75
  else:
75
- json_value = _make_json_serializable(value)
76
- json_dict[_json_key(key)] = json_value
76
+ json_dict[_json_key(key)] = _make_json_serializable(value)
77
77
  return json_dict
78
78
  if isinstance(data, list | tuple | frozenset | set):
79
79
  return [_make_json_serializable(item) for item in data]
@@ -93,7 +93,7 @@ def _to_vuetify_dict(fn, data):
93
93
  return vuetify_data
94
94
 
95
95
 
96
- def _dump(parent_path, fn, data, vuetify):
96
+ def _dump(parent_path, fn, data, vuetify=True):
97
97
  """Dump data to json file."""
98
98
  vuetify_data = (
99
99
  _to_vuetify_dict(fn, data) if vuetify else _make_json_serializable(data)
@@ -112,10 +112,10 @@ def main():
112
112
  parent_path = Path(parent_path)
113
113
  parent_path.mkdir(exist_ok=True)
114
114
  for fn, data in _DUMPS.items():
115
- _dump(parent_path, fn, data, vuetify=True)
115
+ _dump(parent_path, fn, data)
116
116
 
117
117
  for fn, data in _MAP_DUMPS.items():
118
- _dump(parent_path, fn, data, vuetify=False)
118
+ _dump(parent_path, fn, data, False)
119
119
 
120
120
 
121
121
  if __name__ == "__main__":
codex/db.py CHANGED
@@ -62,7 +62,7 @@ def _backup_db_before_migration():
62
62
  """If there are migrations to do, backup the db."""
63
63
  backup_path = _get_backup_db_path(f"before-v{VERSION}")
64
64
  janitor = Janitor(LOG_QUEUE, LIBRARIAN_QUEUE)
65
- janitor.backup_db(show_status=False, backup_path=backup_path)
65
+ janitor.backup_db(backup_path, show_status=False)
66
66
  LOG.info("Backed up database before migrations")
67
67
 
68
68
 
@@ -71,7 +71,7 @@ def _repair_db():
71
71
  if FIX_FOREIGN_KEYS:
72
72
  fix_foreign_keys()
73
73
  if INTEGRITY_CHECK:
74
- integrity_check(long=True)
74
+ integrity_check()
75
75
  success = fts_integrity_check() if FTS_INTEGRITY_CHECK else True
76
76
  if FTS_REBUILD or not success:
77
77
  fts_rebuild()
codex/exceptions.py CHANGED
@@ -1,8 +1,8 @@
1
1
  """Special Redirect Error."""
2
2
 
3
- from collections.abc import Mapping
4
3
  from copy import deepcopy
5
4
  from pprint import pformat
5
+ from typing import TYPE_CHECKING
6
6
 
7
7
  from django.core.validators import EMPTY_VALUES
8
8
  from django.shortcuts import redirect
@@ -17,6 +17,10 @@ from codex.serializers.fields import BreadcrumbsField
17
17
  from codex.serializers.route import RouteSerializer
18
18
  from codex.views.util import pop_name
19
19
 
20
+ if TYPE_CHECKING:
21
+ from collections.abc import Mapping
22
+
23
+
20
24
  LOG = get_logger(__name__)
21
25
  _OPDS_REDIRECT_SETTINGS_KEYS = ("order_by", "top_group")
22
26
  _REDIRECT_SETTINGS_KEYS = ("breadcrumbs", *_OPDS_REDIRECT_SETTINGS_KEYS)
@@ -67,10 +71,7 @@ class SeeOtherRedirectError(APIException):
67
71
  def _add_query_params(self, url):
68
72
  """Change OPDS settings like the frontend does with error.detail."""
69
73
  query_params = {}
70
- if isinstance(self.detail, Mapping):
71
- settings = self.detail.get("settings", {})
72
- else:
73
- settings = {}
74
+ settings: Mapping = self.detail.get("settings", {}) # type: ignore
74
75
  for key in _OPDS_REDIRECT_SETTINGS_KEYS:
75
76
  value = settings.get(key)
76
77
  if value not in EMPTY_VALUES:
@@ -21,19 +21,15 @@ class BookmarkThread(AggregateMessageQueuedThread, BookmarkUpdate):
21
21
  else:
22
22
  self.log.warning(f"Unknown Bookmark task {item}")
23
23
 
24
- def _send_item(self, filters, updates):
25
- """Process one item."""
26
- auth_filter, comic_pks = filters
27
- auth_filter = dict(auth_filter)
28
- self.update_bookmarks(auth_filter, comic_pks, updates, self.log)
29
- self.log.debug(f"updated {auth_filter} pk__in={comic_pks}")
30
-
31
24
  def send_all_items(self):
32
25
  """Run the task method."""
33
26
  cleanup = set()
34
27
  for filters, updates in self.cache.items():
35
28
  try:
36
- self._send_item(filters, updates)
29
+ auth_filter, comic_pks = filters
30
+ auth_filter = dict(auth_filter)
31
+ self.update_bookmarks(auth_filter, comic_pks, updates, self.log)
32
+ self.log.debug(f"updated {auth_filter} pk__in={comic_pks}")
37
33
  cleanup.add(filters)
38
34
  except Exception:
39
35
  self.log.exception("Updating bookmarks")
@@ -120,7 +120,7 @@ class BookmarkUpdate(GroupACLMixin):
120
120
  Bookmark.objects.bulk_create(
121
121
  create_bookmarks,
122
122
  update_fields=tuple(_BOOKMARK_UPDATE_FIELDS),
123
- unique_fields=Bookmark._meta.unique_together[0],
123
+ unique_fields=Bookmark._meta.unique_together[0], # type: ignore
124
124
  )
125
125
  return count
126
126
 
@@ -131,7 +131,7 @@ class BookmarkUpdate(GroupACLMixin):
131
131
  try:
132
132
  UserActive.objects.update_or_create(user=user)
133
133
  except Exception as exc:
134
- reason = f"Update user activity {exc}"
134
+ reason = f"update user activity {exc}"
135
135
  log.warning(reason)
136
136
 
137
137
  @classmethod
@@ -32,7 +32,7 @@ class CoverCreateThread(QueuedThread, CoverPathMixin):
32
32
  with Image.open(image_io) as cover_image:
33
33
  cover_image.thumbnail(
34
34
  _THUMBNAIL_SIZE,
35
- Image.Resampling.LANCZOS,
35
+ Image.Resampling.LANCZOS, # type: ignore
36
36
  reducing_gap=3.0,
37
37
  )
38
38
  cover_image.save(cover_thumb_buffer, "WEBP", method=6)
@@ -41,8 +41,7 @@ class CoverCreateThread(QueuedThread, CoverPathMixin):
41
41
 
42
42
  @classmethod
43
43
  def _get_comic_cover_image(cls, comic_path):
44
- """
45
- Create comic cover if none exists.
44
+ """Create comic cover if none exists.
46
45
 
47
46
  Return image thumb data or path to missing file thumb.
48
47
  """
@@ -60,9 +59,8 @@ class CoverCreateThread(QueuedThread, CoverPathMixin):
60
59
  return f.read()
61
60
 
62
61
  @classmethod
63
- def create_cover_from_path(cls, pk, cover_path, log, librarian_queue, custom):
64
- """
65
- Create cover for path.
62
+ def create_cover_from_path(cls, pk, cover_path, log, librarian_queue, custom=False):
63
+ """Create cover for path.
66
64
 
67
65
  Called from views/cover.
68
66
  """
@@ -97,7 +95,7 @@ class CoverCreateThread(QueuedThread, CoverPathMixin):
97
95
  # zero length file is code for missing.
98
96
  cover_path.touch()
99
97
 
100
- def _bulk_create_comic_covers(self, pks, custom):
98
+ def _bulk_create_comic_covers(self, pks, custom=False):
101
99
  """Create bulk comic covers."""
102
100
  num_comics = len(pks)
103
101
  if not num_comics:
@@ -117,7 +115,7 @@ class CoverCreateThread(QueuedThread, CoverPathMixin):
117
115
  else:
118
116
  # bulk contributor creates covers inline
119
117
  data = self.create_cover_from_path(
120
- pk, cover_path, self.log, self.librarian_queue, custom=False
118
+ pk, cover_path, self.log, self.librarian_queue
121
119
  )
122
120
  if data:
123
121
  data.close()
@@ -136,6 +134,6 @@ class CoverCreateThread(QueuedThread, CoverPathMixin):
136
134
  def create_all_covers(self):
137
135
  """Create all covers for all libraries."""
138
136
  pks = CustomCover.objects.values_list("pk", flat=True)
139
- self._bulk_create_comic_covers(pks, custom=True)
137
+ self._bulk_create_comic_covers(pks, True)
140
138
  pks = Comic.objects.values_list("pk", flat=True)
141
- self._bulk_create_comic_covers(pks, custom=False)
139
+ self._bulk_create_comic_covers(pks, False)
@@ -21,21 +21,20 @@ class CoverPathMixin:
21
21
  """Translate an integer into an efficient filesystem path."""
22
22
  fnv = fnv1a_32(bytes(str(pk).zfill(cls._ZFILL), "utf-8"))
23
23
  hex_str = format(fnv, f"0{cls._ZFILL}x")
24
- parts = [
25
- hex_str[i : i + cls._PATH_STEP]
26
- for i in range(0, len(hex_str), cls._PATH_STEP)
27
- ]
24
+ parts = []
25
+ for i in range(0, len(hex_str), cls._PATH_STEP):
26
+ parts.append(hex_str[i : i + cls._PATH_STEP])
28
27
  return Path("/".join(parts))
29
28
 
30
29
  @classmethod
31
- def get_cover_path(cls, pk, custom):
30
+ def get_cover_path(cls, pk, custom=False):
32
31
  """Get cover path for comic pk."""
33
32
  cover_path = cls._hex_path(pk)
34
33
  root = cls.CUSTOM_COVERS_ROOT if custom else cls.COVERS_ROOT
35
34
  return root / cover_path.with_suffix(".webp")
36
35
 
37
36
  @classmethod
38
- def get_cover_paths(cls, pks, custom):
37
+ def get_cover_paths(cls, pks, custom=False):
39
38
  """Get cover paths for many comic pks."""
40
39
  cover_paths = set()
41
40
  for pk in pks:
@@ -67,7 +67,7 @@ class CoverPurgeThread(CoverCreateThread):
67
67
  self.log.info("Removed entire comic cover cache.")
68
68
  shutil.rmtree(self.CUSTOM_COVERS_ROOT)
69
69
  self.log.info("Removed entire custom cover cache.")
70
- except OSError as exc:
70
+ except Exception as exc:
71
71
  self.log.warning(exc)
72
72
  librarian_queue.put(LIBRARY_CHANGED_TASK)
73
73
 
@@ -77,7 +77,7 @@ class CoverPurgeThread(CoverCreateThread):
77
77
  self.log.debug(f"Removing covers from missing {name}.")
78
78
  self.status_controller.start_many(self._CLEANUP_STATUS_MAP)
79
79
  pks = cover_class.objects.all().values_list("pk", flat=True)
80
- db_cover_paths = self.get_cover_paths(pks, custom=False)
80
+ db_cover_paths = self.get_cover_paths(pks)
81
81
 
82
82
  orphan_cover_paths = set()
83
83
  for root, _, filenames in os.walk(cover_root):
@@ -222,10 +222,10 @@ class AggregateMetadataImporter(ExtractMetadataImporter):
222
222
  if self.task.force_import_metadata:
223
223
  import_metadata = True
224
224
  else:
225
- key = AdminFlag.FlagChoices.IMPORT_METADATA.value
225
+ key = AdminFlag.FlagChoices.IMPORT_METADATA.value # type: ignore
226
226
  import_metadata = AdminFlag.objects.get(key=key).on
227
227
  if not import_metadata:
228
- self.log.warning("Admin flag set to NOT import metadata.")
228
+ self.log.warn("Admin flag set to NOT import metadata.")
229
229
 
230
230
  # Init metadata, extract and aggregate
231
231
  self.metadata[MDS] = {}
@@ -73,6 +73,7 @@ class CacheUpdateImporter(InitImporter):
73
73
  try:
74
74
  log_list = []
75
75
  for model in GROUP_MODELS:
76
+ # self.log.debug(f"Updating timestamps for {model.__name__}s...")
76
77
  count = self._update_group_model(
77
78
  force_update_group_map, model, start_time, log_list
78
79
  )
@@ -84,7 +85,9 @@ class CacheUpdateImporter(InitImporter):
84
85
 
85
86
  if total_count:
86
87
  groups_log = ", ".join(log_list)
87
- self.log.info(f"Updated timestamps for {groups_log}.")
88
+ self.log.info( # type: ignore
89
+ f"Updated timestamps for {groups_log}."
90
+ )
88
91
  self.changed += total_count
89
92
  finally:
90
93
  self.status_controller.finish(status)
@@ -78,7 +78,7 @@ class CreateComicsImporter(LinkComicsImporter):
78
78
  Comic.objects.bulk_update(update_comics, BULK_UPDATE_COMIC_FIELDS)
79
79
  count = len(update_comics)
80
80
 
81
- self._remove_covers(comic_pks, custom=False)
81
+ self._remove_covers(comic_pks, False) # type: ignore
82
82
  self.log.debug(f"Purging covers for {len(comic_pks)} updated comics.")
83
83
  if count:
84
84
  self.log.info(f"Updated {count} comics.")
@@ -126,7 +126,7 @@ class CreateComicsImporter(LinkComicsImporter):
126
126
  create_comics,
127
127
  update_conflicts=True,
128
128
  update_fields=BULK_CREATE_COMIC_FIELDS,
129
- unique_fields=Comic._meta.unique_together[0],
129
+ unique_fields=Comic._meta.unique_together[0], # type: ignore
130
130
  )
131
131
  count = len(create_comics)
132
132
  if count:
@@ -43,7 +43,7 @@ class CreateCoversImporter(CreateComicsImporter):
43
43
  if LINK_COVER_PKS not in self.metadata:
44
44
  self.metadata[LINK_COVER_PKS] = set()
45
45
  self.metadata[LINK_COVER_PKS].update(update_cover_pks)
46
- self._remove_covers(update_cover_pks, custom=True)
46
+ self._remove_covers(update_cover_pks, custom=True) # type: ignore
47
47
  count = len(update_covers)
48
48
  if status:
49
49
  status.add_complete(count)
@@ -1,5 +1,4 @@
1
- """
2
- Create all missing comic foreign keys for an import.
1
+ """Create all missing comic foreign keys for an import.
3
2
 
4
3
  So we may safely create the comics next.
5
4
  """
@@ -190,7 +189,7 @@ class CreateForeignKeysImporter(CreateCoversImporter):
190
189
  create_folders,
191
190
  update_conflicts=True,
192
191
  update_fields=BULK_UPDATE_FOLDER_FIELDS,
193
- unique_fields=Folder._meta.unique_together[0],
192
+ unique_fields=Folder._meta.unique_together[0], # type: ignore
194
193
  )
195
194
  count = len(create_folders)
196
195
  status.add_complete(count)
@@ -297,7 +296,7 @@ class CreateForeignKeysImporter(CreateCoversImporter):
297
296
  create_objs,
298
297
  update_conflicts=True,
299
298
  update_fields=CREATE_DICT_UPDATE_FIELDS[model],
300
- unique_fields=model._meta.unique_together[0],
299
+ unique_fields=model._meta.unique_together[0], # type: ignore
301
300
  )
302
301
  count = len(create_objs)
303
302
  if count:
@@ -13,7 +13,7 @@ from codex.status import Status
13
13
  class DeletedImporter(CacheUpdateImporter):
14
14
  """Clean up database methods."""
15
15
 
16
- def _remove_covers(self, delete_pks, custom: bool):
16
+ def _remove_covers(self, delete_pks, custom=False):
17
17
  task = CoverRemoveTask(delete_pks, custom)
18
18
  self.librarian_queue.put(task)
19
19
 
@@ -34,7 +34,7 @@ class DeletedImporter(CacheUpdateImporter):
34
34
  )
35
35
  folders.delete()
36
36
 
37
- self._remove_covers(delete_comic_pks, custom=False)
37
+ self._remove_covers(delete_comic_pks)
38
38
 
39
39
  count = len(delete_comic_pks)
40
40
  if count:
@@ -96,7 +96,7 @@ class DeletedImporter(CacheUpdateImporter):
96
96
  delete_comic_pks = frozenset(delete_qs.values_list("pk", flat=True))
97
97
  delete_qs.delete()
98
98
 
99
- self._remove_covers(delete_comic_pks, custom=False)
99
+ self._remove_covers(delete_comic_pks)
100
100
 
101
101
  count = len(delete_comic_pks)
102
102
  if count:
@@ -94,7 +94,7 @@ class ExtractMetadataImporter(QueryForeignKeysImporter):
94
94
 
95
95
  @classmethod
96
96
  def _clean_decimal(cls, value, field_name: str):
97
- field: DecimalField = Comic._meta.get_field(field_name) # type: ignore[reportAssignmentType]
97
+ field: DecimalField = Comic._meta.get_field(field_name) # type: ignore
98
98
  try:
99
99
  quantize_str = Decimal(f"1e-{field.decimal_places}")
100
100
  value = value.quantize(quantize_str, rounding=ROUND_DOWN)
@@ -147,7 +147,7 @@ class ExtractMetadataImporter(QueryForeignKeysImporter):
147
147
  @staticmethod
148
148
  def _clean_charfield(model, field_name, value):
149
149
  try:
150
- field: CharField = model._meta.get_field(field_name) # type: ignore[reportAssignmentType]
150
+ field: CharField = model._meta.get_field(field_name) # type: ignore
151
151
  if value:
152
152
  value = value[: field.max_length].strip()
153
153
  if not value:
@@ -120,7 +120,7 @@ class FailedImportsImporter(DeletedImporter):
120
120
  create_objs,
121
121
  update_conflicts=True,
122
122
  update_fields=_BULK_UPDATE_FAILED_IMPORT_FIELDS,
123
- unique_fields=FailedImport._meta.unique_together[0],
123
+ unique_fields=FailedImport._meta.unique_together[0], # type: ignore
124
124
  )
125
125
  count = len(create_objs)
126
126
  if count:
@@ -43,9 +43,7 @@ class ComicImporter(MovedImporter):
43
43
 
44
44
  # Wait to start the search index update in case more updates are incoming.
45
45
  until = time() + 1
46
- delayed_search_task = DelayedTasks(
47
- until, (SearchIndexUpdateTask(rebuild=False),)
48
- )
46
+ delayed_search_task = DelayedTasks(until, (SearchIndexUpdateTask(False),))
49
47
  self.librarian_queue.put(delayed_search_task)
50
48
  else:
51
49
  self.log.info("No updates neccissary.")
@@ -35,7 +35,7 @@ class ComicImporterThread(QueuedThread):
35
35
  import_comics = Comic.objects.filter(pk__in=task.pks).only("path", "library_id")
36
36
  library_path_map = {}
37
37
  for import_comic in import_comics:
38
- library_id = import_comic.library_id # type: ignore[reportAttributeAccessIssue]
38
+ library_id = import_comic.library_id # type: ignore
39
39
  if library_id not in library_path_map:
40
40
  library_path_map[library_id] = set()
41
41
  library_path_map[library_id].add(import_comic.path)
@@ -89,7 +89,7 @@ class ComicImporterThread(QueuedThread):
89
89
  importer.bulk_folders_moved()
90
90
  return True
91
91
 
92
- def _adopt_orphan_folders(self, janitor: bool):
92
+ def _adopt_orphan_folders(self, janitor=False):
93
93
  """Find orphan folders and move them into their correct place."""
94
94
  status = Status(ImportStatusTypes.ADOPT_FOLDERS)
95
95
  moved_status = Status(ImportStatusTypes.DIRS_MOVED)
@@ -118,6 +118,6 @@ class ComicImporterThread(QueuedThread):
118
118
  elif isinstance(task, UpdateGroupsTask):
119
119
  self._update_groups(task)
120
120
  elif isinstance(task, AdoptOrphanFoldersTask):
121
- self._adopt_orphan_folders(janitor=task.janitor)
121
+ self._adopt_orphan_folders(task.janitor)
122
122
  else:
123
123
  self.log.warning(f"Bad task sent to library updater {task}")
@@ -186,8 +186,7 @@ class LinkComicsImporter(LinkCoversImporter):
186
186
  return tms, all_del_pks
187
187
 
188
188
  def bulk_fix_comic_m2m_field(self, field_name, m2m_links, status):
189
- """
190
- Recreate an m2m field for a set of comics.
189
+ """Recreate an m2m field for a set of comics.
191
190
 
192
191
  Since we can't bulk_update or bulk_create m2m fields use a trick.
193
192
  bulk_create() on the through table:
@@ -46,7 +46,9 @@ class MovedImporter(AggregateMetadataImporter):
46
46
  new_path = self.task.files_moved[comic.path]
47
47
  comic.path = new_path
48
48
  new_path = Path(new_path)
49
- comic.parent_folder = Folder.objects.get(path=new_path.parent)
49
+ comic.parent_folder = Folder.objects.get( # type: ignore
50
+ path=new_path.parent
51
+ )
50
52
  comic.updated_at = Now()
51
53
  comic.presave()
52
54
  folder_m2m_links[comic.pk] = Folder.objects.filter(
@@ -135,7 +137,7 @@ class MovedImporter(AggregateMetadataImporter):
135
137
  f"Unlinked {len(unlink_groups)} {model.__name__} moved custom covers."
136
138
  )
137
139
 
138
- self._remove_covers(unlink_pks, custom=True)
140
+ self._remove_covers(unlink_pks, custom=True) # type: ignore
139
141
 
140
142
  def _bulk_covers_moved(self, status=None):
141
143
  """Move covers."""
@@ -192,6 +194,8 @@ class MovedImporter(AggregateMetadataImporter):
192
194
  folder.updated_at = Now()
193
195
  update_folders.append(folder)
194
196
 
197
+ # delete_folders = Folder.objects.filter(library=self.library, path__in=new_paths)
198
+
195
199
  update_folders = sorted(update_folders, key=lambda x: len(Path(x.path).parts))
196
200
 
197
201
  Folder.objects.bulk_update(update_folders, MOVED_BULK_FOLDER_UPDATE_FIELDS)
@@ -208,6 +212,7 @@ class MovedImporter(AggregateMetadataImporter):
208
212
  """Move folders under existing folders."""
209
213
  while True:
210
214
  # Get existing parent folders
215
+ # dest_parent_paths = tuple(str(path) for path in dest_parent_folder_paths_map)
211
216
  dest_parent_paths = tuple(dest_parent_folder_paths_map.keys())
212
217
  extant_parent_folders = Folder.objects.filter(
213
218
  library=self.library, path__in=dest_parent_paths
@@ -229,7 +229,9 @@ class QueryForeignKeysImporter(QueryCustomCoversImporter):
229
229
 
230
230
  group_filter = Q()
231
231
  for group_tree, count_value in update_group_trees.items():
232
- compare_filter = dict(zip(compare_fields, group_tree, strict=False))
232
+ compare_filter = {}
233
+ for field_name, value in zip(compare_fields, group_tree, strict=False):
234
+ compare_filter[field_name] = value
233
235
  compare_filter[count_field_name] = count_value
234
236
  group_filter |= Q(**compare_filter)
235
237
  return group_filter
@@ -492,6 +494,7 @@ class QueryForeignKeysImporter(QueryCustomCoversImporter):
492
494
 
493
495
  def _query_missing_simple_models(self, names, fk_data, status):
494
496
  """Find missing named models and folders."""
497
+ # count = 0
495
498
  if not names:
496
499
  return 0
497
500
  create_fks, base_cls, field, fk_field = fk_data
@@ -18,7 +18,7 @@ class ImportDBDiffTask(ImportTask):
18
18
 
19
19
  dirs_moved: Mapping[str, str] = field(default_factory=dict)
20
20
  dirs_modified: frozenset[str] = frozenset()
21
- # dirs_created: frozenset[str] | None = frozenset() # noqa: ERA001
21
+ # dirs_created: frozenset[str] | None = frozenset()
22
22
  dirs_deleted: frozenset[str] = frozenset()
23
23
 
24
24
  files_moved: Mapping[str, str] = field(default_factory=dict)