codex 1.7.9__py3-none-any.whl → 1.7.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (649) hide show
  1. codex/choices/admin.py +20 -47
  2. codex/choices/reader.py +3 -3
  3. codex/db.py +1 -1
  4. codex/exceptions.py +1 -1
  5. codex/librarian/bookmark/tasks.py +1 -1
  6. codex/librarian/covers/status.py +2 -2
  7. codex/librarian/covers/tasks.py +0 -7
  8. codex/librarian/cron/crond.py +2 -2
  9. codex/librarian/importer/link_comics.py +3 -2
  10. codex/librarian/importer/query_covers.py +1 -1
  11. codex/librarian/importer/query_fks.py +1 -1
  12. codex/librarian/importer/status.py +2 -2
  13. codex/librarian/janitor/integrity.py +1 -1
  14. codex/librarian/janitor/status.py +2 -2
  15. codex/librarian/search/status.py +2 -2
  16. codex/librarian/telemeter/stats.py +1 -1
  17. codex/librarian/telemeter/telemeter.py +9 -14
  18. codex/librarian/watchdog/events.py +1 -1
  19. codex/librarian/watchdog/observers.py +1 -1
  20. codex/librarian/watchdog/status.py +2 -2
  21. codex/logger/{logging.py → logger.py} +2 -2
  22. codex/logger_base.py +1 -1
  23. codex/middleware.py +1 -1
  24. codex/migrations/0001_init.py +1 -1
  25. codex/migrations/0033_alter_librarianstatus_status_type.py +68 -0
  26. codex/models/admin.py +6 -15
  27. codex/models/bookmark.py +2 -2
  28. codex/models/comic.py +4 -4
  29. codex/models/groups.py +1 -1
  30. codex/models/named.py +1 -1
  31. codex/models/paths.py +2 -3
  32. codex/run.py +1 -1
  33. codex/serializers/browser/mixins.py +1 -1
  34. codex/serializers/fields/__init__.py +10 -10
  35. codex/serializers/fields/auth.py +1 -1
  36. codex/serializers/fields/browser.py +1 -1
  37. codex/serializers/fields/stats.py +1 -1
  38. codex/serializers/fields/vuetify.py +1 -1
  39. codex/serializers/models/pycountry.py +1 -1
  40. codex/serializers/opds/v2/progression.py +4 -4
  41. codex/signals/django_signals.py +1 -1
  42. codex/signals/os_signals.py +1 -1
  43. codex/startup.py +4 -8
  44. codex/static_root/assets/VCheckbox-BWg23XH7.1d0de86f89e8.js +1 -0
  45. codex/static_root/assets/VCheckbox-BWg23XH7.1d0de86f89e8.js.br +0 -0
  46. codex/static_root/assets/VCheckbox-BWg23XH7.1d0de86f89e8.js.gz +0 -0
  47. codex/static_root/assets/VCheckbox-BWg23XH7.js +1 -0
  48. codex/static_root/assets/VCheckbox-BWg23XH7.js.br +0 -0
  49. codex/static_root/assets/VCheckbox-BWg23XH7.js.gz +0 -0
  50. codex/static_root/assets/{VCheckboxBtn-gRk-tQmL.a387d0cc758b.js → VCheckboxBtn-wiuE0DJ7.7bf28584c99f.js} +1 -1
  51. codex/static_root/assets/VCheckboxBtn-wiuE0DJ7.7bf28584c99f.js.br +0 -0
  52. codex/static_root/assets/VCheckboxBtn-wiuE0DJ7.7bf28584c99f.js.gz +0 -0
  53. codex/static_root/assets/{VCheckboxBtn-gRk-tQmL.js → VCheckboxBtn-wiuE0DJ7.js} +1 -1
  54. codex/static_root/assets/VCheckboxBtn-wiuE0DJ7.js.br +0 -0
  55. codex/static_root/assets/VCheckboxBtn-wiuE0DJ7.js.gz +0 -0
  56. codex/static_root/assets/VCombobox-x6zK3RJ3.c7241fcc5a64.js +1 -0
  57. codex/static_root/assets/VCombobox-x6zK3RJ3.c7241fcc5a64.js.br +0 -0
  58. codex/static_root/assets/VCombobox-x6zK3RJ3.c7241fcc5a64.js.gz +0 -0
  59. codex/static_root/assets/VCombobox-x6zK3RJ3.js +1 -0
  60. codex/static_root/assets/VCombobox-x6zK3RJ3.js.br +0 -0
  61. codex/static_root/assets/VCombobox-x6zK3RJ3.js.gz +0 -0
  62. codex/static_root/assets/{VDialog-BQWGxOC0.557592e1297d.css → VDialog-DYkXmPin.3991696c6a81.css} +1 -1
  63. codex/static_root/assets/VDialog-DYkXmPin.3991696c6a81.css.br +0 -0
  64. codex/static_root/assets/VDialog-DYkXmPin.3991696c6a81.css.gz +0 -0
  65. codex/static_root/assets/{VDialog-BQWGxOC0.css → VDialog-DYkXmPin.css} +1 -1
  66. codex/static_root/assets/VDialog-DYkXmPin.css.br +0 -0
  67. codex/static_root/assets/VDialog-DYkXmPin.css.gz +0 -0
  68. codex/static_root/assets/VDialog-OthWhLDZ.deedc659cbb7.js +1 -0
  69. codex/static_root/assets/VDialog-OthWhLDZ.deedc659cbb7.js.br +0 -0
  70. codex/static_root/assets/VDialog-OthWhLDZ.deedc659cbb7.js.gz +0 -0
  71. codex/static_root/assets/VDialog-OthWhLDZ.js +1 -0
  72. codex/static_root/assets/VDialog-OthWhLDZ.js.br +0 -0
  73. codex/static_root/assets/VDialog-OthWhLDZ.js.gz +0 -0
  74. codex/static_root/assets/VDivider-JdO15t-G.37359224a349.js +1 -0
  75. codex/static_root/assets/VDivider-JdO15t-G.37359224a349.js.br +0 -0
  76. codex/static_root/assets/VDivider-JdO15t-G.37359224a349.js.gz +0 -0
  77. codex/static_root/assets/VDivider-JdO15t-G.js +1 -0
  78. codex/static_root/assets/VDivider-JdO15t-G.js.br +0 -0
  79. codex/static_root/assets/VDivider-JdO15t-G.js.gz +0 -0
  80. codex/static_root/assets/{VExpansionPanels-_1cO0EuX.1894a1e0b739.js → VExpansionPanels-vIBE1NDV.6a3323984fb8.js} +1 -1
  81. codex/static_root/assets/VExpansionPanels-vIBE1NDV.6a3323984fb8.js.br +0 -0
  82. codex/static_root/assets/VExpansionPanels-vIBE1NDV.6a3323984fb8.js.gz +0 -0
  83. codex/static_root/assets/{VExpansionPanels-_1cO0EuX.js → VExpansionPanels-vIBE1NDV.js} +1 -1
  84. codex/static_root/assets/VExpansionPanels-vIBE1NDV.js.br +0 -0
  85. codex/static_root/assets/VExpansionPanels-vIBE1NDV.js.gz +0 -0
  86. codex/static_root/assets/VForm-dmDeV5_M.d487bb4a6a43.js +1 -0
  87. codex/static_root/assets/VForm-dmDeV5_M.d487bb4a6a43.js.br +0 -0
  88. codex/static_root/assets/VForm-dmDeV5_M.d487bb4a6a43.js.gz +0 -0
  89. codex/static_root/assets/VForm-dmDeV5_M.js +1 -0
  90. codex/static_root/assets/VForm-dmDeV5_M.js.br +0 -0
  91. codex/static_root/assets/VForm-dmDeV5_M.js.gz +0 -0
  92. codex/static_root/assets/VRadioGroup-D-95qXAG.a1e32c668c7b.js +1 -0
  93. codex/static_root/assets/VRadioGroup-D-95qXAG.a1e32c668c7b.js.br +0 -0
  94. codex/static_root/assets/VRadioGroup-D-95qXAG.a1e32c668c7b.js.gz +0 -0
  95. codex/static_root/assets/VRadioGroup-D-95qXAG.js +1 -0
  96. codex/static_root/assets/VRadioGroup-D-95qXAG.js.br +0 -0
  97. codex/static_root/assets/VRadioGroup-D-95qXAG.js.gz +0 -0
  98. codex/static_root/assets/VSelect-CQoVHUk_.b126cfd240df.js +1 -0
  99. codex/static_root/assets/VSelect-CQoVHUk_.b126cfd240df.js.br +0 -0
  100. codex/static_root/assets/VSelect-CQoVHUk_.b126cfd240df.js.gz +0 -0
  101. codex/static_root/assets/VSelect-CQoVHUk_.js +1 -0
  102. codex/static_root/assets/VSelect-CQoVHUk_.js.br +0 -0
  103. codex/static_root/assets/VSelect-CQoVHUk_.js.gz +0 -0
  104. codex/static_root/assets/VSelectionControl-DR3WB2kF.8e2b62af4420.js +1 -0
  105. codex/static_root/assets/VSelectionControl-DR3WB2kF.8e2b62af4420.js.br +0 -0
  106. codex/static_root/assets/VSelectionControl-DR3WB2kF.8e2b62af4420.js.gz +0 -0
  107. codex/static_root/assets/VSelectionControl-DR3WB2kF.js +1 -0
  108. codex/static_root/assets/VSelectionControl-DR3WB2kF.js.br +0 -0
  109. codex/static_root/assets/VSelectionControl-DR3WB2kF.js.gz +0 -0
  110. codex/static_root/assets/VSelectionControl-DtEh26JD.css +1 -0
  111. codex/static_root/assets/VSelectionControl-DtEh26JD.css.br +0 -0
  112. codex/static_root/assets/VSelectionControl-DtEh26JD.css.gz +0 -0
  113. codex/static_root/assets/VSelectionControl-DtEh26JD.eec621947209.css +1 -0
  114. codex/static_root/assets/VSelectionControl-DtEh26JD.eec621947209.css.br +0 -0
  115. codex/static_root/assets/VSelectionControl-DtEh26JD.eec621947209.css.gz +0 -0
  116. codex/static_root/assets/VTable-DdAIbK7T.297df0a81277.js +1 -0
  117. codex/static_root/assets/VTable-DdAIbK7T.297df0a81277.js.br +0 -0
  118. codex/static_root/assets/VTable-DdAIbK7T.297df0a81277.js.gz +0 -0
  119. codex/static_root/assets/VTable-DdAIbK7T.js +1 -0
  120. codex/static_root/assets/VTable-DdAIbK7T.js.br +0 -0
  121. codex/static_root/assets/VTable-DdAIbK7T.js.gz +0 -0
  122. codex/static_root/assets/{VWindowItem--fSJo-3a.a813df7e5399.js → VWindowItem-DDjwD_H9.712a45940238.js} +1 -1
  123. codex/static_root/assets/VWindowItem-DDjwD_H9.712a45940238.js.br +0 -0
  124. codex/static_root/assets/VWindowItem-DDjwD_H9.712a45940238.js.gz +0 -0
  125. codex/static_root/assets/{VWindowItem--fSJo-3a.js → VWindowItem-DDjwD_H9.js} +1 -1
  126. codex/static_root/assets/VWindowItem-DDjwD_H9.js.br +0 -0
  127. codex/static_root/assets/VWindowItem-DDjwD_H9.js.gz +0 -0
  128. codex/static_root/assets/{admin-DSf9mKpY.b127f911852f.js → admin-DD2SkqRx.039722adfae5.js} +1 -1
  129. codex/static_root/assets/admin-DD2SkqRx.039722adfae5.js.br +0 -0
  130. codex/static_root/assets/admin-DD2SkqRx.039722adfae5.js.gz +0 -0
  131. codex/static_root/assets/{admin-DSf9mKpY.js → admin-DD2SkqRx.js} +1 -1
  132. codex/static_root/assets/admin-DD2SkqRx.js.br +0 -0
  133. codex/static_root/assets/admin-DD2SkqRx.js.gz +0 -0
  134. codex/static_root/assets/{admin-BQnJdQdA.81c79d104ff0.js → admin-i6V__Ibr.022e55cde6a4.js} +1 -1
  135. codex/static_root/assets/admin-i6V__Ibr.022e55cde6a4.js.br +0 -0
  136. codex/static_root/assets/admin-i6V__Ibr.022e55cde6a4.js.gz +0 -0
  137. codex/static_root/assets/{admin-BQnJdQdA.js → admin-i6V__Ibr.js} +1 -1
  138. codex/static_root/assets/admin-i6V__Ibr.js.br +0 -0
  139. codex/static_root/assets/admin-i6V__Ibr.js.gz +0 -0
  140. codex/static_root/assets/admin-menu-B4SzsUdK.6639a1cbf4e7.js +1 -0
  141. codex/static_root/assets/admin-menu-B4SzsUdK.6639a1cbf4e7.js.br +0 -0
  142. codex/static_root/assets/admin-menu-B4SzsUdK.6639a1cbf4e7.js.gz +0 -0
  143. codex/static_root/assets/admin-menu-B4SzsUdK.js +1 -0
  144. codex/static_root/assets/admin-menu-B4SzsUdK.js.br +0 -0
  145. codex/static_root/assets/admin-menu-B4SzsUdK.js.gz +0 -0
  146. codex/static_root/assets/admin-settings-button-progress-DhAZCqmL.04743416c2a4.js +1 -0
  147. codex/static_root/assets/admin-settings-button-progress-DhAZCqmL.04743416c2a4.js.br +0 -0
  148. codex/static_root/assets/admin-settings-button-progress-DhAZCqmL.04743416c2a4.js.gz +0 -0
  149. codex/static_root/assets/admin-settings-button-progress-DhAZCqmL.js +1 -0
  150. codex/static_root/assets/admin-settings-button-progress-DhAZCqmL.js.br +0 -0
  151. codex/static_root/assets/admin-settings-button-progress-DhAZCqmL.js.gz +0 -0
  152. codex/static_root/assets/admin-settings-button-progress-XVi7SeHr.435dc945daf1.css +1 -0
  153. codex/static_root/assets/admin-settings-button-progress-XVi7SeHr.css +1 -0
  154. codex/static_root/assets/browser-BJ95cpa4.e30f8b92b0c7.js +1 -0
  155. codex/static_root/assets/browser-BJ95cpa4.e30f8b92b0c7.js.br +0 -0
  156. codex/static_root/assets/browser-BJ95cpa4.e30f8b92b0c7.js.gz +0 -0
  157. codex/static_root/assets/browser-BJ95cpa4.js +1 -0
  158. codex/static_root/assets/browser-BJ95cpa4.js.br +0 -0
  159. codex/static_root/assets/browser-BJ95cpa4.js.gz +0 -0
  160. codex/static_root/assets/{browser-CECBMxOy.a750213334d5.css → browser-Bf8JG2CE.3af978c1f766.css} +1 -1
  161. codex/static_root/assets/browser-Bf8JG2CE.3af978c1f766.css.br +0 -0
  162. codex/static_root/assets/browser-Bf8JG2CE.3af978c1f766.css.gz +0 -0
  163. codex/static_root/assets/{browser-CECBMxOy.css → browser-Bf8JG2CE.css} +1 -1
  164. codex/static_root/assets/browser-Bf8JG2CE.css.br +0 -0
  165. codex/static_root/assets/browser-Bf8JG2CE.css.gz +0 -0
  166. codex/static_root/assets/{change-password-dialog-DWFtOUJt.18015223f76b.js → change-password-dialog-By3fj_TQ.c5eac945e204.js} +1 -1
  167. codex/static_root/assets/change-password-dialog-By3fj_TQ.c5eac945e204.js.br +0 -0
  168. codex/static_root/assets/change-password-dialog-By3fj_TQ.c5eac945e204.js.gz +0 -0
  169. codex/static_root/assets/{change-password-dialog-DWFtOUJt.js → change-password-dialog-By3fj_TQ.js} +1 -1
  170. codex/static_root/assets/change-password-dialog-By3fj_TQ.js.br +0 -0
  171. codex/static_root/assets/change-password-dialog-By3fj_TQ.js.gz +0 -0
  172. codex/static_root/assets/confirm-dialog-dLx7MoUh.06fae90da0ac.js +1 -0
  173. codex/static_root/assets/confirm-dialog-dLx7MoUh.06fae90da0ac.js.br +0 -0
  174. codex/static_root/assets/confirm-dialog-dLx7MoUh.06fae90da0ac.js.gz +0 -0
  175. codex/static_root/assets/confirm-dialog-dLx7MoUh.js +1 -0
  176. codex/static_root/assets/confirm-dialog-dLx7MoUh.js.br +0 -0
  177. codex/static_root/assets/confirm-dialog-dLx7MoUh.js.gz +0 -0
  178. codex/static_root/assets/datetime-column-CYEe6t74.2500e9a7b4a4.js +1 -0
  179. codex/static_root/assets/datetime-column-CYEe6t74.2500e9a7b4a4.js.br +0 -0
  180. codex/static_root/assets/datetime-column-CYEe6t74.2500e9a7b4a4.js.gz +0 -0
  181. codex/static_root/assets/datetime-column-CYEe6t74.js +1 -0
  182. codex/static_root/assets/datetime-column-CYEe6t74.js.br +0 -0
  183. codex/static_root/assets/datetime-column-CYEe6t74.js.gz +0 -0
  184. codex/static_root/assets/filter-CX5R_mAN.0fd3b1a14779.js +1 -0
  185. codex/static_root/assets/filter-CX5R_mAN.0fd3b1a14779.js.br +0 -0
  186. codex/static_root/assets/filter-CX5R_mAN.0fd3b1a14779.js.gz +0 -0
  187. codex/static_root/assets/filter-CX5R_mAN.js +1 -0
  188. codex/static_root/assets/filter-CX5R_mAN.js.br +0 -0
  189. codex/static_root/assets/filter-CX5R_mAN.js.gz +0 -0
  190. codex/static_root/assets/{flag-tab-CqtkOuiR.2c865d108820.js → flag-tab-ElQxMWbZ.e5ba707bac09.js} +1 -1
  191. codex/static_root/assets/flag-tab-ElQxMWbZ.e5ba707bac09.js.br +0 -0
  192. codex/static_root/assets/flag-tab-ElQxMWbZ.e5ba707bac09.js.gz +0 -0
  193. codex/static_root/assets/{flag-tab-CqtkOuiR.js → flag-tab-ElQxMWbZ.js} +1 -1
  194. codex/static_root/assets/flag-tab-ElQxMWbZ.js.br +0 -0
  195. codex/static_root/assets/flag-tab-ElQxMWbZ.js.gz +0 -0
  196. codex/static_root/assets/forwardRefs-DlsL_f4M.662d81eac923.js +1 -0
  197. codex/static_root/assets/forwardRefs-DlsL_f4M.662d81eac923.js.br +0 -0
  198. codex/static_root/assets/forwardRefs-DlsL_f4M.662d81eac923.js.gz +0 -0
  199. codex/static_root/assets/forwardRefs-DlsL_f4M.js +1 -0
  200. codex/static_root/assets/forwardRefs-DlsL_f4M.js.br +0 -0
  201. codex/static_root/assets/forwardRefs-DlsL_f4M.js.gz +0 -0
  202. codex/static_root/assets/{group-tab-zhr0Gxv-.93393ff22310.js → group-tab-CqVQHStZ.4c72ec7c5179.js} +1 -1
  203. codex/static_root/assets/group-tab-CqVQHStZ.4c72ec7c5179.js.br +0 -0
  204. codex/static_root/assets/group-tab-CqVQHStZ.4c72ec7c5179.js.gz +0 -0
  205. codex/static_root/assets/{group-tab-zhr0Gxv-.js → group-tab-CqVQHStZ.js} +1 -1
  206. codex/static_root/assets/group-tab-CqVQHStZ.js.br +0 -0
  207. codex/static_root/assets/group-tab-CqVQHStZ.js.gz +0 -0
  208. codex/static_root/assets/http-error-D9X2r_ts.71a1241440db.js +1 -0
  209. codex/static_root/assets/http-error-D9X2r_ts.71a1241440db.js.br +0 -0
  210. codex/static_root/assets/http-error-D9X2r_ts.71a1241440db.js.gz +0 -0
  211. codex/static_root/assets/http-error-D9X2r_ts.js +1 -0
  212. codex/static_root/assets/http-error-D9X2r_ts.js.br +0 -0
  213. codex/static_root/assets/http-error-D9X2r_ts.js.gz +0 -0
  214. codex/static_root/assets/index-Ciy2g1_l.a4d7e7a1851a.js +1 -0
  215. codex/static_root/assets/index-Ciy2g1_l.a4d7e7a1851a.js.br +0 -0
  216. codex/static_root/assets/index-Ciy2g1_l.a4d7e7a1851a.js.gz +0 -0
  217. codex/static_root/assets/index-Ciy2g1_l.js +1 -0
  218. codex/static_root/assets/index-Ciy2g1_l.js.br +0 -0
  219. codex/static_root/assets/index-Ciy2g1_l.js.gz +0 -0
  220. codex/static_root/assets/{library-tab-thTonyXr.58b745660d42.css → library-tab-DLpvMqPW.2989f610950b.css} +1 -1
  221. codex/static_root/assets/library-tab-DLpvMqPW.2989f610950b.css.br +0 -0
  222. codex/static_root/assets/library-tab-DLpvMqPW.2989f610950b.css.gz +0 -0
  223. codex/static_root/assets/{library-tab-thTonyXr.css → library-tab-DLpvMqPW.css} +1 -1
  224. codex/static_root/assets/library-tab-DLpvMqPW.css.br +0 -0
  225. codex/static_root/assets/library-tab-DLpvMqPW.css.gz +0 -0
  226. codex/static_root/assets/library-tab-gTOFQ_iR.43484dac2129.js +1 -0
  227. codex/static_root/assets/library-tab-gTOFQ_iR.43484dac2129.js.br +0 -0
  228. codex/static_root/assets/library-tab-gTOFQ_iR.43484dac2129.js.gz +0 -0
  229. codex/static_root/assets/library-tab-gTOFQ_iR.js +1 -0
  230. codex/static_root/assets/library-tab-gTOFQ_iR.js.br +0 -0
  231. codex/static_root/assets/library-tab-gTOFQ_iR.js.gz +0 -0
  232. codex/static_root/assets/main-Bh4TRBe6.eabe3bd7c355.js +35 -0
  233. codex/static_root/assets/main-Bh4TRBe6.eabe3bd7c355.js.br +0 -0
  234. codex/static_root/assets/main-Bh4TRBe6.eabe3bd7c355.js.gz +0 -0
  235. codex/static_root/assets/main-Bh4TRBe6.js +35 -0
  236. codex/static_root/assets/main-Bh4TRBe6.js.br +0 -0
  237. codex/static_root/assets/main-Bh4TRBe6.js.gz +0 -0
  238. codex/static_root/assets/pager-full-pdf-BJ2ugo4Y.fb70d1a2caab.js +1 -0
  239. codex/static_root/assets/pager-full-pdf-BJ2ugo4Y.fb70d1a2caab.js.br +0 -0
  240. codex/static_root/assets/pager-full-pdf-BJ2ugo4Y.fb70d1a2caab.js.gz +0 -0
  241. codex/static_root/assets/pager-full-pdf-BJ2ugo4Y.js +1 -0
  242. codex/static_root/assets/pager-full-pdf-BJ2ugo4Y.js.br +0 -0
  243. codex/static_root/assets/pager-full-pdf-BJ2ugo4Y.js.gz +0 -0
  244. codex/static_root/assets/pagination-toolbar-BwTjydSq.3086700f965d.js +1 -0
  245. codex/static_root/assets/pagination-toolbar-BwTjydSq.3086700f965d.js.br +0 -0
  246. codex/static_root/assets/pagination-toolbar-BwTjydSq.3086700f965d.js.gz +0 -0
  247. codex/static_root/assets/pagination-toolbar-BwTjydSq.js +1 -0
  248. codex/static_root/assets/pagination-toolbar-BwTjydSq.js.br +0 -0
  249. codex/static_root/assets/pagination-toolbar-BwTjydSq.js.gz +0 -0
  250. codex/static_root/assets/{pagination-toolbar-CpIvhu_T.0e1a1bac9f65.css → pagination-toolbar-CzT9Hc3f.487e647604e2.css} +1 -1
  251. codex/static_root/assets/pagination-toolbar-CzT9Hc3f.487e647604e2.css.br +0 -0
  252. codex/static_root/assets/{pagination-toolbar-CpIvhu_T.0e1a1bac9f65.css.gz → pagination-toolbar-CzT9Hc3f.487e647604e2.css.gz} +0 -0
  253. codex/static_root/assets/{pagination-toolbar-CpIvhu_T.css → pagination-toolbar-CzT9Hc3f.css} +1 -1
  254. codex/static_root/assets/pagination-toolbar-CzT9Hc3f.css.br +0 -0
  255. codex/static_root/assets/{pagination-toolbar-CpIvhu_T.css.gz → pagination-toolbar-CzT9Hc3f.css.gz} +0 -0
  256. codex/static_root/assets/pdf-doc-DxqOo2k2.42496ffbf35b.css +1 -0
  257. codex/static_root/assets/pdf-doc-DxqOo2k2.42496ffbf35b.css.br +0 -0
  258. codex/static_root/assets/pdf-doc-DxqOo2k2.42496ffbf35b.css.gz +0 -0
  259. codex/static_root/assets/pdf-doc-DxqOo2k2.css +1 -0
  260. codex/static_root/assets/pdf-doc-DxqOo2k2.css.br +0 -0
  261. codex/static_root/assets/pdf-doc-DxqOo2k2.css.gz +0 -0
  262. codex/static_root/assets/pdf-doc-cr8rSW0K.42089de27088.js +372 -0
  263. codex/static_root/assets/pdf-doc-cr8rSW0K.42089de27088.js.br +0 -0
  264. codex/static_root/assets/pdf-doc-cr8rSW0K.42089de27088.js.gz +0 -0
  265. codex/static_root/assets/pdf-doc-cr8rSW0K.js +372 -0
  266. codex/static_root/assets/pdf-doc-cr8rSW0K.js.br +0 -0
  267. codex/static_root/assets/pdf-doc-cr8rSW0K.js.gz +0 -0
  268. codex/static_root/assets/{reader-vxxoy39S.js → reader-B2vknx-p.b97c9147c346.js} +2 -2
  269. codex/static_root/assets/reader-B2vknx-p.b97c9147c346.js.br +0 -0
  270. codex/static_root/assets/reader-B2vknx-p.b97c9147c346.js.gz +0 -0
  271. codex/static_root/assets/{reader-vxxoy39S.5a306c3b0f19.js → reader-B2vknx-p.js} +2 -2
  272. codex/static_root/assets/reader-B2vknx-p.js.br +0 -0
  273. codex/static_root/assets/reader-B2vknx-p.js.gz +0 -0
  274. codex/static_root/assets/{reader-Bcw698_5.b73e2757553f.css → reader-DdWNjEED.97c15f661faf.css} +1 -1
  275. codex/static_root/assets/reader-DdWNjEED.97c15f661faf.css.br +0 -0
  276. codex/static_root/assets/reader-DdWNjEED.97c15f661faf.css.gz +0 -0
  277. codex/static_root/assets/{reader-Bcw698_5.css → reader-DdWNjEED.css} +1 -1
  278. codex/static_root/assets/reader-DdWNjEED.css.br +0 -0
  279. codex/static_root/assets/reader-DdWNjEED.css.gz +0 -0
  280. codex/static_root/assets/relation-chips-BJETO4cu.5cc9f906ae86.js +1 -0
  281. codex/static_root/assets/relation-chips-BJETO4cu.5cc9f906ae86.js.br +0 -0
  282. codex/static_root/assets/relation-chips-BJETO4cu.5cc9f906ae86.js.gz +0 -0
  283. codex/static_root/assets/relation-chips-BJETO4cu.js +1 -0
  284. codex/static_root/assets/relation-chips-BJETO4cu.js.br +0 -0
  285. codex/static_root/assets/relation-chips-BJETO4cu.js.gz +0 -0
  286. codex/static_root/assets/{relation-chips-CifZPloM.css → relation-chips-eQkZvJcT.6b52d3f66aed.css} +1 -1
  287. codex/static_root/assets/relation-chips-eQkZvJcT.6b52d3f66aed.css.br +0 -0
  288. codex/static_root/assets/relation-chips-eQkZvJcT.6b52d3f66aed.css.gz +0 -0
  289. codex/static_root/assets/{relation-chips-CifZPloM.e1f40ac9ae8b.css → relation-chips-eQkZvJcT.css} +1 -1
  290. codex/static_root/assets/relation-chips-eQkZvJcT.css.br +0 -0
  291. codex/static_root/assets/relation-chips-eQkZvJcT.css.gz +0 -0
  292. codex/static_root/assets/settings-drawer-DGxdcvk4.30900a8bc3ff.js +2 -0
  293. codex/static_root/assets/settings-drawer-DGxdcvk4.30900a8bc3ff.js.br +0 -0
  294. codex/static_root/assets/settings-drawer-DGxdcvk4.30900a8bc3ff.js.gz +0 -0
  295. codex/static_root/assets/settings-drawer-DGxdcvk4.js +2 -0
  296. codex/static_root/assets/settings-drawer-DGxdcvk4.js.br +0 -0
  297. codex/static_root/assets/settings-drawer-DGxdcvk4.js.gz +0 -0
  298. codex/static_root/assets/{settings-drawer-Bl-6rF9E.7ace6186c209.css → settings-drawer-WyG6HLH-.css} +1 -1
  299. codex/static_root/assets/settings-drawer-WyG6HLH-.css.br +0 -0
  300. codex/static_root/assets/settings-drawer-WyG6HLH-.css.gz +0 -0
  301. codex/static_root/assets/{settings-drawer-Bl-6rF9E.css → settings-drawer-WyG6HLH-.fe251f6d0a75.css} +1 -1
  302. codex/static_root/assets/settings-drawer-WyG6HLH-.fe251f6d0a75.css.br +0 -0
  303. codex/static_root/assets/settings-drawer-WyG6HLH-.fe251f6d0a75.css.gz +0 -0
  304. codex/static_root/assets/{ssrBoot-D0SN4REy.6200754b59d8.js → ssrBoot-CAsgsyDf.726bc1a727b7.js} +1 -1
  305. codex/static_root/assets/ssrBoot-CAsgsyDf.726bc1a727b7.js.br +0 -0
  306. codex/static_root/assets/ssrBoot-CAsgsyDf.726bc1a727b7.js.gz +0 -0
  307. codex/static_root/assets/{ssrBoot-D0SN4REy.js → ssrBoot-CAsgsyDf.js} +1 -1
  308. codex/static_root/assets/ssrBoot-CAsgsyDf.js.br +0 -0
  309. codex/static_root/assets/ssrBoot-CAsgsyDf.js.gz +0 -0
  310. codex/static_root/assets/stats-tab-B2rq8Yvl.3d1cb4751160.js +1 -0
  311. codex/static_root/assets/stats-tab-B2rq8Yvl.3d1cb4751160.js.br +0 -0
  312. codex/static_root/assets/stats-tab-B2rq8Yvl.3d1cb4751160.js.gz +0 -0
  313. codex/static_root/assets/stats-tab-B2rq8Yvl.js +1 -0
  314. codex/static_root/assets/stats-tab-B2rq8Yvl.js.br +0 -0
  315. codex/static_root/assets/stats-tab-B2rq8Yvl.js.gz +0 -0
  316. codex/static_root/assets/task-tab-DL6WROkd.6c75d2f501ad.js +1 -0
  317. codex/static_root/assets/task-tab-DL6WROkd.6c75d2f501ad.js.br +0 -0
  318. codex/static_root/assets/task-tab-DL6WROkd.6c75d2f501ad.js.gz +0 -0
  319. codex/static_root/assets/task-tab-DL6WROkd.js +1 -0
  320. codex/static_root/assets/task-tab-DL6WROkd.js.br +0 -0
  321. codex/static_root/assets/task-tab-DL6WROkd.js.gz +0 -0
  322. codex/static_root/assets/{unauthorized-BJ-YJYOs.6c0a0813ec2e.js → unauthorized-CGmdx8H3.88f8cccac020.js} +1 -1
  323. codex/static_root/assets/unauthorized-CGmdx8H3.88f8cccac020.js.br +0 -0
  324. codex/static_root/assets/unauthorized-CGmdx8H3.88f8cccac020.js.gz +0 -0
  325. codex/static_root/assets/{unauthorized-BJ-YJYOs.js → unauthorized-CGmdx8H3.js} +1 -1
  326. codex/static_root/assets/unauthorized-CGmdx8H3.js.br +0 -0
  327. codex/static_root/assets/unauthorized-CGmdx8H3.js.gz +0 -0
  328. codex/static_root/assets/user-tab-pnWYdoCh.b8b1c35dc74b.js +1 -0
  329. codex/static_root/assets/user-tab-pnWYdoCh.b8b1c35dc74b.js.br +0 -0
  330. codex/static_root/assets/user-tab-pnWYdoCh.b8b1c35dc74b.js.gz +0 -0
  331. codex/static_root/assets/user-tab-pnWYdoCh.js +1 -0
  332. codex/static_root/assets/user-tab-pnWYdoCh.js.br +0 -0
  333. codex/static_root/assets/user-tab-pnWYdoCh.js.gz +0 -0
  334. codex/static_root/manifest.b023317c84d2.json +757 -0
  335. codex/static_root/manifest.b023317c84d2.json.br +0 -0
  336. codex/static_root/manifest.b023317c84d2.json.gz +0 -0
  337. codex/static_root/manifest.json +338 -338
  338. codex/static_root/manifest.json.br +0 -0
  339. codex/static_root/manifest.json.gz +0 -0
  340. codex/static_root/staticfiles.json +1 -1
  341. codex/templates/pwa/serviceworker-register.js +0 -1
  342. codex/urls/converters.py +1 -1
  343. codex/views/admin/flag.py +1 -1
  344. codex/views/admin/group.py +1 -1
  345. codex/views/admin/library.py +1 -1
  346. codex/views/admin/stats.py +1 -1
  347. codex/views/admin/tasks.py +1 -1
  348. codex/views/admin/user.py +1 -1
  349. codex/views/auth.py +1 -1
  350. codex/views/bookmark.py +2 -2
  351. codex/views/browser/annotate/bookmark.py +1 -1
  352. codex/views/browser/annotate/card.py +1 -1
  353. codex/views/browser/annotate/order.py +1 -1
  354. codex/views/browser/bookmark.py +1 -1
  355. codex/views/browser/breadcrumbs.py +5 -3
  356. codex/views/browser/browser.py +1 -1
  357. codex/views/browser/choices.py +1 -1
  358. codex/views/browser/cover.py +1 -1
  359. codex/views/browser/download.py +1 -1
  360. codex/views/browser/filters/filter.py +1 -1
  361. codex/views/browser/filters/search/field/column.py +1 -1
  362. codex/views/browser/filters/search/field/expression.py +1 -1
  363. codex/views/browser/filters/search/field/filter.py +1 -1
  364. codex/views/browser/filters/search/fts.py +1 -1
  365. codex/views/browser/filters/search/parse.py +2 -2
  366. codex/views/browser/group_mtime.py +1 -1
  367. codex/views/browser/metadata/metadata.py +1 -1
  368. codex/views/browser/mtime.py +1 -1
  369. codex/views/browser/order_by.py +2 -4
  370. codex/views/browser/page_in_bounds.py +1 -1
  371. codex/views/browser/paginate.py +1 -1
  372. codex/views/browser/validate.py +1 -1
  373. codex/views/mixins.py +1 -1
  374. codex/views/opds/v1/entry/entry.py +1 -1
  375. codex/views/opds/v1/entry/links.py +1 -1
  376. codex/views/opds/v1/facets.py +2 -5
  377. codex/views/opds/v1/feed.py +1 -1
  378. codex/views/opds/v1/links.py +1 -1
  379. codex/views/opds/v2/feed.py +1 -1
  380. codex/views/opds/v2/progression.py +1 -1
  381. codex/views/public.py +1 -1
  382. codex/views/reader/page.py +1 -1
  383. codex/views/reader/params.py +1 -1
  384. codex/views/reader/reader.py +1 -1
  385. codex/views/session.py +1 -1
  386. codex/views/timezone.py +1 -1
  387. codex/websockets/consumers.py +1 -1
  388. {codex-1.7.9.dist-info → codex-1.7.11.dist-info}/METADATA +17 -8
  389. {codex-1.7.9.dist-info → codex-1.7.11.dist-info}/RECORD +394 -393
  390. {codex-1.7.9.dist-info → codex-1.7.11.dist-info}/WHEEL +1 -1
  391. codex/static_root/assets/VCheckbox-LVWiZ44B.eb8618ce7e3b.js +0 -1
  392. codex/static_root/assets/VCheckbox-LVWiZ44B.eb8618ce7e3b.js.br +0 -0
  393. codex/static_root/assets/VCheckbox-LVWiZ44B.eb8618ce7e3b.js.gz +0 -0
  394. codex/static_root/assets/VCheckbox-LVWiZ44B.js +0 -1
  395. codex/static_root/assets/VCheckbox-LVWiZ44B.js.br +0 -0
  396. codex/static_root/assets/VCheckbox-LVWiZ44B.js.gz +0 -0
  397. codex/static_root/assets/VCheckboxBtn-gRk-tQmL.a387d0cc758b.js.br +0 -0
  398. codex/static_root/assets/VCheckboxBtn-gRk-tQmL.a387d0cc758b.js.gz +0 -0
  399. codex/static_root/assets/VCheckboxBtn-gRk-tQmL.js.br +0 -0
  400. codex/static_root/assets/VCheckboxBtn-gRk-tQmL.js.gz +0 -0
  401. codex/static_root/assets/VCombobox-jQrh5qob.6c207fd6e025.js +0 -1
  402. codex/static_root/assets/VCombobox-jQrh5qob.6c207fd6e025.js.br +0 -0
  403. codex/static_root/assets/VCombobox-jQrh5qob.6c207fd6e025.js.gz +0 -0
  404. codex/static_root/assets/VCombobox-jQrh5qob.js +0 -1
  405. codex/static_root/assets/VCombobox-jQrh5qob.js.br +0 -0
  406. codex/static_root/assets/VCombobox-jQrh5qob.js.gz +0 -0
  407. codex/static_root/assets/VDialog-BQWGxOC0.557592e1297d.css.br +0 -0
  408. codex/static_root/assets/VDialog-BQWGxOC0.557592e1297d.css.gz +0 -0
  409. codex/static_root/assets/VDialog-BQWGxOC0.css.br +0 -0
  410. codex/static_root/assets/VDialog-BQWGxOC0.css.gz +0 -0
  411. codex/static_root/assets/VDialog-Z7zDn7KN.3abbe97d56e8.js +0 -1
  412. codex/static_root/assets/VDialog-Z7zDn7KN.3abbe97d56e8.js.br +0 -0
  413. codex/static_root/assets/VDialog-Z7zDn7KN.3abbe97d56e8.js.gz +0 -0
  414. codex/static_root/assets/VDialog-Z7zDn7KN.js +0 -1
  415. codex/static_root/assets/VDialog-Z7zDn7KN.js.br +0 -0
  416. codex/static_root/assets/VDialog-Z7zDn7KN.js.gz +0 -0
  417. codex/static_root/assets/VDivider-Nn4Fa5-R.572a9a554615.js +0 -1
  418. codex/static_root/assets/VDivider-Nn4Fa5-R.572a9a554615.js.br +0 -0
  419. codex/static_root/assets/VDivider-Nn4Fa5-R.572a9a554615.js.gz +0 -0
  420. codex/static_root/assets/VDivider-Nn4Fa5-R.js +0 -1
  421. codex/static_root/assets/VDivider-Nn4Fa5-R.js.br +0 -0
  422. codex/static_root/assets/VDivider-Nn4Fa5-R.js.gz +0 -0
  423. codex/static_root/assets/VExpansionPanels-_1cO0EuX.1894a1e0b739.js.br +0 -0
  424. codex/static_root/assets/VExpansionPanels-_1cO0EuX.1894a1e0b739.js.gz +0 -0
  425. codex/static_root/assets/VExpansionPanels-_1cO0EuX.js.br +0 -0
  426. codex/static_root/assets/VExpansionPanels-_1cO0EuX.js.gz +0 -0
  427. codex/static_root/assets/VForm-CVsL2Cxt.7d56b07f9bf7.js +0 -1
  428. codex/static_root/assets/VForm-CVsL2Cxt.7d56b07f9bf7.js.br +0 -0
  429. codex/static_root/assets/VForm-CVsL2Cxt.7d56b07f9bf7.js.gz +0 -0
  430. codex/static_root/assets/VForm-CVsL2Cxt.js +0 -1
  431. codex/static_root/assets/VForm-CVsL2Cxt.js.br +0 -0
  432. codex/static_root/assets/VForm-CVsL2Cxt.js.gz +0 -0
  433. codex/static_root/assets/VRadioGroup-B0OEyAiT.1371f03dda54.js +0 -1
  434. codex/static_root/assets/VRadioGroup-B0OEyAiT.1371f03dda54.js.br +0 -0
  435. codex/static_root/assets/VRadioGroup-B0OEyAiT.1371f03dda54.js.gz +0 -0
  436. codex/static_root/assets/VRadioGroup-B0OEyAiT.js +0 -1
  437. codex/static_root/assets/VRadioGroup-B0OEyAiT.js.br +0 -0
  438. codex/static_root/assets/VRadioGroup-B0OEyAiT.js.gz +0 -0
  439. codex/static_root/assets/VSelect-CyG4ax1z.bf63a0b16754.js +0 -1
  440. codex/static_root/assets/VSelect-CyG4ax1z.bf63a0b16754.js.br +0 -0
  441. codex/static_root/assets/VSelect-CyG4ax1z.bf63a0b16754.js.gz +0 -0
  442. codex/static_root/assets/VSelect-CyG4ax1z.js +0 -1
  443. codex/static_root/assets/VSelect-CyG4ax1z.js.br +0 -0
  444. codex/static_root/assets/VSelect-CyG4ax1z.js.gz +0 -0
  445. codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css +0 -1
  446. codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css.br +0 -0
  447. codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css.gz +0 -0
  448. codex/static_root/assets/VSelectionControl-DPpfgCW2.css +0 -1
  449. codex/static_root/assets/VSelectionControl-DPpfgCW2.css.br +0 -0
  450. codex/static_root/assets/VSelectionControl-DPpfgCW2.css.gz +0 -0
  451. codex/static_root/assets/VSelectionControl-dirzqbsX.4027f5ec6485.js +0 -1
  452. codex/static_root/assets/VSelectionControl-dirzqbsX.4027f5ec6485.js.br +0 -0
  453. codex/static_root/assets/VSelectionControl-dirzqbsX.4027f5ec6485.js.gz +0 -0
  454. codex/static_root/assets/VSelectionControl-dirzqbsX.js +0 -1
  455. codex/static_root/assets/VSelectionControl-dirzqbsX.js.br +0 -0
  456. codex/static_root/assets/VSelectionControl-dirzqbsX.js.gz +0 -0
  457. codex/static_root/assets/VTable-C5cDzOH4.18cd77d58541.js +0 -1
  458. codex/static_root/assets/VTable-C5cDzOH4.18cd77d58541.js.br +0 -0
  459. codex/static_root/assets/VTable-C5cDzOH4.18cd77d58541.js.gz +0 -0
  460. codex/static_root/assets/VTable-C5cDzOH4.js +0 -1
  461. codex/static_root/assets/VTable-C5cDzOH4.js.br +0 -0
  462. codex/static_root/assets/VTable-C5cDzOH4.js.gz +0 -0
  463. codex/static_root/assets/VWindowItem--fSJo-3a.a813df7e5399.js.br +0 -0
  464. codex/static_root/assets/VWindowItem--fSJo-3a.a813df7e5399.js.gz +0 -0
  465. codex/static_root/assets/VWindowItem--fSJo-3a.js.br +0 -0
  466. codex/static_root/assets/VWindowItem--fSJo-3a.js.gz +0 -0
  467. codex/static_root/assets/admin-BQnJdQdA.81c79d104ff0.js.br +0 -0
  468. codex/static_root/assets/admin-BQnJdQdA.81c79d104ff0.js.gz +0 -0
  469. codex/static_root/assets/admin-BQnJdQdA.js.br +0 -0
  470. codex/static_root/assets/admin-BQnJdQdA.js.gz +0 -0
  471. codex/static_root/assets/admin-DSf9mKpY.b127f911852f.js.br +0 -0
  472. codex/static_root/assets/admin-DSf9mKpY.b127f911852f.js.gz +0 -0
  473. codex/static_root/assets/admin-DSf9mKpY.js.br +0 -0
  474. codex/static_root/assets/admin-DSf9mKpY.js.gz +0 -0
  475. codex/static_root/assets/admin-menu-CKCjLT04.51b56cb91f67.js +0 -1
  476. codex/static_root/assets/admin-menu-CKCjLT04.51b56cb91f67.js.br +0 -0
  477. codex/static_root/assets/admin-menu-CKCjLT04.51b56cb91f67.js.gz +0 -0
  478. codex/static_root/assets/admin-menu-CKCjLT04.js +0 -1
  479. codex/static_root/assets/admin-menu-CKCjLT04.js.br +0 -0
  480. codex/static_root/assets/admin-menu-CKCjLT04.js.gz +0 -0
  481. codex/static_root/assets/admin-settings-button-progress-BGB22oTD.2548c49a853e.css +0 -1
  482. codex/static_root/assets/admin-settings-button-progress-BGB22oTD.css +0 -1
  483. codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.210930191fa0.js +0 -1
  484. codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.210930191fa0.js.br +0 -0
  485. codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.210930191fa0.js.gz +0 -0
  486. codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.js +0 -1
  487. codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.js.br +0 -0
  488. codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.js.gz +0 -0
  489. codex/static_root/assets/browser-CECBMxOy.a750213334d5.css.br +0 -0
  490. codex/static_root/assets/browser-CECBMxOy.a750213334d5.css.gz +0 -0
  491. codex/static_root/assets/browser-CECBMxOy.css.br +0 -0
  492. codex/static_root/assets/browser-CECBMxOy.css.gz +0 -0
  493. codex/static_root/assets/browser-zmau8SdP.62ab5052ac3c.js +0 -1
  494. codex/static_root/assets/browser-zmau8SdP.62ab5052ac3c.js.br +0 -0
  495. codex/static_root/assets/browser-zmau8SdP.62ab5052ac3c.js.gz +0 -0
  496. codex/static_root/assets/browser-zmau8SdP.js +0 -1
  497. codex/static_root/assets/browser-zmau8SdP.js.br +0 -0
  498. codex/static_root/assets/browser-zmau8SdP.js.gz +0 -0
  499. codex/static_root/assets/change-password-dialog-DWFtOUJt.18015223f76b.js.br +0 -0
  500. codex/static_root/assets/change-password-dialog-DWFtOUJt.18015223f76b.js.gz +0 -0
  501. codex/static_root/assets/change-password-dialog-DWFtOUJt.js.br +0 -0
  502. codex/static_root/assets/change-password-dialog-DWFtOUJt.js.gz +0 -0
  503. codex/static_root/assets/confirm-dialog-Blv3xlBT.2671b8037712.js +0 -1
  504. codex/static_root/assets/confirm-dialog-Blv3xlBT.2671b8037712.js.br +0 -0
  505. codex/static_root/assets/confirm-dialog-Blv3xlBT.2671b8037712.js.gz +0 -0
  506. codex/static_root/assets/confirm-dialog-Blv3xlBT.js +0 -1
  507. codex/static_root/assets/confirm-dialog-Blv3xlBT.js.br +0 -0
  508. codex/static_root/assets/confirm-dialog-Blv3xlBT.js.gz +0 -0
  509. codex/static_root/assets/datetime-column-DOcyrUSv.66a2bc8ebff0.js +0 -1
  510. codex/static_root/assets/datetime-column-DOcyrUSv.66a2bc8ebff0.js.br +0 -3
  511. codex/static_root/assets/datetime-column-DOcyrUSv.66a2bc8ebff0.js.gz +0 -0
  512. codex/static_root/assets/datetime-column-DOcyrUSv.js +0 -1
  513. codex/static_root/assets/datetime-column-DOcyrUSv.js.br +0 -3
  514. codex/static_root/assets/datetime-column-DOcyrUSv.js.gz +0 -0
  515. codex/static_root/assets/filter-DZR8HlwW.3fa01f2d0459.js +0 -1
  516. codex/static_root/assets/filter-DZR8HlwW.3fa01f2d0459.js.br +0 -0
  517. codex/static_root/assets/filter-DZR8HlwW.3fa01f2d0459.js.gz +0 -0
  518. codex/static_root/assets/filter-DZR8HlwW.js +0 -1
  519. codex/static_root/assets/filter-DZR8HlwW.js.br +0 -0
  520. codex/static_root/assets/filter-DZR8HlwW.js.gz +0 -0
  521. codex/static_root/assets/flag-tab-CqtkOuiR.2c865d108820.js.br +0 -0
  522. codex/static_root/assets/flag-tab-CqtkOuiR.2c865d108820.js.gz +0 -0
  523. codex/static_root/assets/flag-tab-CqtkOuiR.js.br +0 -0
  524. codex/static_root/assets/flag-tab-CqtkOuiR.js.gz +0 -0
  525. codex/static_root/assets/forwardRefs--sLajfbv.8fdce7299c72.js +0 -1
  526. codex/static_root/assets/forwardRefs--sLajfbv.8fdce7299c72.js.br +0 -0
  527. codex/static_root/assets/forwardRefs--sLajfbv.8fdce7299c72.js.gz +0 -0
  528. codex/static_root/assets/forwardRefs--sLajfbv.js +0 -1
  529. codex/static_root/assets/forwardRefs--sLajfbv.js.br +0 -0
  530. codex/static_root/assets/forwardRefs--sLajfbv.js.gz +0 -0
  531. codex/static_root/assets/group-tab-zhr0Gxv-.93393ff22310.js.br +0 -0
  532. codex/static_root/assets/group-tab-zhr0Gxv-.93393ff22310.js.gz +0 -0
  533. codex/static_root/assets/group-tab-zhr0Gxv-.js.br +0 -0
  534. codex/static_root/assets/group-tab-zhr0Gxv-.js.gz +0 -0
  535. codex/static_root/assets/http-error-BqTrEaZd.248d35eeef8f.js +0 -1
  536. codex/static_root/assets/http-error-BqTrEaZd.248d35eeef8f.js.br +0 -0
  537. codex/static_root/assets/http-error-BqTrEaZd.248d35eeef8f.js.gz +0 -0
  538. codex/static_root/assets/http-error-BqTrEaZd.js +0 -1
  539. codex/static_root/assets/http-error-BqTrEaZd.js.br +0 -0
  540. codex/static_root/assets/http-error-BqTrEaZd.js.gz +0 -0
  541. codex/static_root/assets/index-CJNrYOQJ.c5c902cfc3c3.js +0 -1
  542. codex/static_root/assets/index-CJNrYOQJ.c5c902cfc3c3.js.br +0 -0
  543. codex/static_root/assets/index-CJNrYOQJ.c5c902cfc3c3.js.gz +0 -0
  544. codex/static_root/assets/index-CJNrYOQJ.js +0 -1
  545. codex/static_root/assets/index-CJNrYOQJ.js.br +0 -0
  546. codex/static_root/assets/index-CJNrYOQJ.js.gz +0 -0
  547. codex/static_root/assets/library-tab-Dhvdk6l9.0575d2955138.js +0 -1
  548. codex/static_root/assets/library-tab-Dhvdk6l9.0575d2955138.js.br +0 -0
  549. codex/static_root/assets/library-tab-Dhvdk6l9.0575d2955138.js.gz +0 -0
  550. codex/static_root/assets/library-tab-Dhvdk6l9.js +0 -1
  551. codex/static_root/assets/library-tab-Dhvdk6l9.js.br +0 -0
  552. codex/static_root/assets/library-tab-Dhvdk6l9.js.gz +0 -0
  553. codex/static_root/assets/library-tab-thTonyXr.58b745660d42.css.br +0 -0
  554. codex/static_root/assets/library-tab-thTonyXr.58b745660d42.css.gz +0 -0
  555. codex/static_root/assets/library-tab-thTonyXr.css.br +0 -0
  556. codex/static_root/assets/library-tab-thTonyXr.css.gz +0 -0
  557. codex/static_root/assets/main-B0XsokNO.34ba83f18255.js +0 -35
  558. codex/static_root/assets/main-B0XsokNO.34ba83f18255.js.br +0 -0
  559. codex/static_root/assets/main-B0XsokNO.34ba83f18255.js.gz +0 -0
  560. codex/static_root/assets/main-B0XsokNO.js +0 -35
  561. codex/static_root/assets/main-B0XsokNO.js.br +0 -0
  562. codex/static_root/assets/main-B0XsokNO.js.gz +0 -0
  563. codex/static_root/assets/pager-full-pdf--ImbPFNz.5396f602799c.js +0 -1
  564. codex/static_root/assets/pager-full-pdf--ImbPFNz.5396f602799c.js.br +0 -0
  565. codex/static_root/assets/pager-full-pdf--ImbPFNz.5396f602799c.js.gz +0 -0
  566. codex/static_root/assets/pager-full-pdf--ImbPFNz.js +0 -1
  567. codex/static_root/assets/pager-full-pdf--ImbPFNz.js.br +0 -0
  568. codex/static_root/assets/pager-full-pdf--ImbPFNz.js.gz +0 -0
  569. codex/static_root/assets/pagination-toolbar-CPK5eUAA.fe243c256d1d.js +0 -1
  570. codex/static_root/assets/pagination-toolbar-CPK5eUAA.fe243c256d1d.js.br +0 -0
  571. codex/static_root/assets/pagination-toolbar-CPK5eUAA.fe243c256d1d.js.gz +0 -0
  572. codex/static_root/assets/pagination-toolbar-CPK5eUAA.js +0 -1
  573. codex/static_root/assets/pagination-toolbar-CPK5eUAA.js.br +0 -0
  574. codex/static_root/assets/pagination-toolbar-CPK5eUAA.js.gz +0 -0
  575. codex/static_root/assets/pagination-toolbar-CpIvhu_T.0e1a1bac9f65.css.br +0 -0
  576. codex/static_root/assets/pagination-toolbar-CpIvhu_T.css.br +0 -0
  577. codex/static_root/assets/pdf-doc-4bYH6sHd.935dcd9613fa.js +0 -348
  578. codex/static_root/assets/pdf-doc-4bYH6sHd.935dcd9613fa.js.br +0 -0
  579. codex/static_root/assets/pdf-doc-4bYH6sHd.935dcd9613fa.js.gz +0 -0
  580. codex/static_root/assets/pdf-doc-4bYH6sHd.js +0 -348
  581. codex/static_root/assets/pdf-doc-4bYH6sHd.js.br +0 -0
  582. codex/static_root/assets/pdf-doc-4bYH6sHd.js.gz +0 -0
  583. codex/static_root/assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css +0 -1
  584. codex/static_root/assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css.br +0 -1
  585. codex/static_root/assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css.gz +0 -0
  586. codex/static_root/assets/pdf-doc-B4cGW_Hl.css +0 -1
  587. codex/static_root/assets/pdf-doc-B4cGW_Hl.css.br +0 -1
  588. codex/static_root/assets/pdf-doc-B4cGW_Hl.css.gz +0 -0
  589. codex/static_root/assets/reader-Bcw698_5.b73e2757553f.css.br +0 -0
  590. codex/static_root/assets/reader-Bcw698_5.b73e2757553f.css.gz +0 -0
  591. codex/static_root/assets/reader-Bcw698_5.css.br +0 -0
  592. codex/static_root/assets/reader-Bcw698_5.css.gz +0 -0
  593. codex/static_root/assets/reader-vxxoy39S.5a306c3b0f19.js.br +0 -0
  594. codex/static_root/assets/reader-vxxoy39S.5a306c3b0f19.js.gz +0 -0
  595. codex/static_root/assets/reader-vxxoy39S.js.br +0 -0
  596. codex/static_root/assets/reader-vxxoy39S.js.gz +0 -0
  597. codex/static_root/assets/relation-chips-CifZPloM.css.br +0 -0
  598. codex/static_root/assets/relation-chips-CifZPloM.css.gz +0 -0
  599. codex/static_root/assets/relation-chips-CifZPloM.e1f40ac9ae8b.css.br +0 -0
  600. codex/static_root/assets/relation-chips-CifZPloM.e1f40ac9ae8b.css.gz +0 -0
  601. codex/static_root/assets/relation-chips-DcMagp92.717b74d488c5.js +0 -1
  602. codex/static_root/assets/relation-chips-DcMagp92.717b74d488c5.js.br +0 -0
  603. codex/static_root/assets/relation-chips-DcMagp92.717b74d488c5.js.gz +0 -0
  604. codex/static_root/assets/relation-chips-DcMagp92.js +0 -1
  605. codex/static_root/assets/relation-chips-DcMagp92.js.br +0 -0
  606. codex/static_root/assets/relation-chips-DcMagp92.js.gz +0 -0
  607. codex/static_root/assets/settings-drawer-Bl-6rF9E.7ace6186c209.css.br +0 -0
  608. codex/static_root/assets/settings-drawer-Bl-6rF9E.7ace6186c209.css.gz +0 -0
  609. codex/static_root/assets/settings-drawer-Bl-6rF9E.css.br +0 -0
  610. codex/static_root/assets/settings-drawer-Bl-6rF9E.css.gz +0 -0
  611. codex/static_root/assets/settings-drawer-CtD2JCdS.b8ebde9f153d.js +0 -2
  612. codex/static_root/assets/settings-drawer-CtD2JCdS.b8ebde9f153d.js.br +0 -0
  613. codex/static_root/assets/settings-drawer-CtD2JCdS.b8ebde9f153d.js.gz +0 -0
  614. codex/static_root/assets/settings-drawer-CtD2JCdS.js +0 -2
  615. codex/static_root/assets/settings-drawer-CtD2JCdS.js.br +0 -0
  616. codex/static_root/assets/settings-drawer-CtD2JCdS.js.gz +0 -0
  617. codex/static_root/assets/ssrBoot-D0SN4REy.6200754b59d8.js.br +0 -0
  618. codex/static_root/assets/ssrBoot-D0SN4REy.6200754b59d8.js.gz +0 -0
  619. codex/static_root/assets/ssrBoot-D0SN4REy.js.br +0 -0
  620. codex/static_root/assets/ssrBoot-D0SN4REy.js.gz +0 -0
  621. codex/static_root/assets/stats-tab-Dg7gtbyv.4450fc041bf2.js +0 -1
  622. codex/static_root/assets/stats-tab-Dg7gtbyv.4450fc041bf2.js.br +0 -0
  623. codex/static_root/assets/stats-tab-Dg7gtbyv.4450fc041bf2.js.gz +0 -0
  624. codex/static_root/assets/stats-tab-Dg7gtbyv.js +0 -1
  625. codex/static_root/assets/stats-tab-Dg7gtbyv.js.br +0 -0
  626. codex/static_root/assets/stats-tab-Dg7gtbyv.js.gz +0 -0
  627. codex/static_root/assets/task-tab-CKmCn8Wb.166b1bde5e7b.js +0 -1
  628. codex/static_root/assets/task-tab-CKmCn8Wb.166b1bde5e7b.js.br +0 -0
  629. codex/static_root/assets/task-tab-CKmCn8Wb.166b1bde5e7b.js.gz +0 -0
  630. codex/static_root/assets/task-tab-CKmCn8Wb.js +0 -1
  631. codex/static_root/assets/task-tab-CKmCn8Wb.js.br +0 -0
  632. codex/static_root/assets/task-tab-CKmCn8Wb.js.gz +0 -0
  633. codex/static_root/assets/unauthorized-BJ-YJYOs.6c0a0813ec2e.js.br +0 -0
  634. codex/static_root/assets/unauthorized-BJ-YJYOs.6c0a0813ec2e.js.gz +0 -0
  635. codex/static_root/assets/unauthorized-BJ-YJYOs.js.br +0 -0
  636. codex/static_root/assets/unauthorized-BJ-YJYOs.js.gz +0 -0
  637. codex/static_root/assets/user-tab-hFUG7l6x.dcfed4901e67.js +0 -1
  638. codex/static_root/assets/user-tab-hFUG7l6x.dcfed4901e67.js.br +0 -0
  639. codex/static_root/assets/user-tab-hFUG7l6x.dcfed4901e67.js.gz +0 -0
  640. codex/static_root/assets/user-tab-hFUG7l6x.js +0 -1
  641. codex/static_root/assets/user-tab-hFUG7l6x.js.br +0 -0
  642. codex/static_root/assets/user-tab-hFUG7l6x.js.gz +0 -0
  643. codex/static_root/manifest.694a3146beb9.json +0 -757
  644. codex/static_root/manifest.694a3146beb9.json.br +0 -0
  645. codex/static_root/manifest.694a3146beb9.json.gz +0 -0
  646. /codex/librarian/janitor/{time.py → scheduled_time.py} +0 -0
  647. /codex/librarian/telemeter/{time.py → scheduled_time.py} +0 -0
  648. {codex-1.7.9.dist-info → codex-1.7.11.dist-info}/LICENSE +0 -0
  649. {codex-1.7.9.dist-info → codex-1.7.11.dist-info}/entry_points.txt +0 -0
codex/choices/admin.py CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  from types import MappingProxyType
4
4
 
5
+ from bidict import frozenbidict
6
+
7
+ from codex.librarian.covers.status import CoverStatusTypes
8
+ from codex.librarian.importer.status import ImportStatusTypes
9
+ from codex.librarian.janitor.status import JanitorStatusTypes
10
+ from codex.librarian.search.status import SearchIndexStatusTypes
11
+ from codex.librarian.watchdog.status import WatchdogStatusTypes
12
+
5
13
  ADMIN_FLAG_CHOICES = MappingProxyType(
6
14
  {
7
15
  "AU": "Auto Update",
@@ -14,53 +22,18 @@ ADMIN_FLAG_CHOICES = MappingProxyType(
14
22
  }
15
23
  )
16
24
 
17
- ADMIN_STATUS_TITLES = MappingProxyType(
18
- {
19
- "CCC": "Create Covers",
20
- "CCD": "Remove Covers",
21
- "CFO": "Find Orphan Covers",
22
- "IAF": "Adopt Orphan Folders",
23
- "ICC": "Create Custom Covers",
24
- "ICD": "Delete Custom Covers",
25
- "ICL": "Link Custom Covers",
26
- "ICM": "Custom Covers Moved",
27
- "ICQ": "Discover Missing Custom Covers",
28
- "ICU": "Modify Custom Covers",
29
- "IDD": "Remove Folders",
30
- "IDM": "Move Folders",
31
- "IDU": "Modify Folders",
32
- "IFC": "Create Books",
33
- "IFD": "Remove Books",
34
- "IFI": "Record Failed Imports",
35
- "IFM": "Move Books",
36
- "IFU": "Modify Books",
37
- "IGU": "Update First Covers",
38
- "IMC": "Link Books to Tags",
39
- "IMQ": "Prepare Tags for Linking",
40
- "ITC": "Create Missing Tags",
41
- "ITQ": "Discover Missing Tags",
42
- "ITR": "Read Book Tags",
43
- "JCB": "Cleanup Orphan Bookmarks",
44
- "JCD": "Cleanup Custom Covers",
45
- "JCR": "Restart Codex",
46
- "JCS": "Stop Codex",
47
- "JCU": "Update Codex Software",
48
- "JDB": "Backup Database",
49
- "JDO": "Optimize Database",
50
- "JFC": "Search Index Integrity Check",
51
- "JFR": "Search Index Repair",
52
- "JIC": "Database Integrity Check",
53
- "JIF": "Database Foreign Key Check",
54
- "JLV": "Check Codex Latest Version",
55
- "JSD": "Cleanup Expired Sessions",
56
- "JTD": "Cleanup Stale Tags",
57
- "SIC": "Search Index Create",
58
- "SID": "Search Index Remove Stale Records",
59
- "SIO": "Search Index Optimize",
60
- "SIU": "Search Index Update",
61
- "SIX": "Search Index Clear",
62
- "WPO": "Poll Library",
63
- }
25
+ ADMIN_STATUS_TITLES = frozenbidict(
26
+ sorted(
27
+ (key, val)
28
+ for status_types in (
29
+ CoverStatusTypes,
30
+ ImportStatusTypes,
31
+ JanitorStatusTypes,
32
+ SearchIndexStatusTypes,
33
+ WatchdogStatusTypes,
34
+ )
35
+ for key, val in status_types.choices
36
+ )
64
37
  )
65
38
 
66
39
  # Easier to store in vuetify format
codex/choices/reader.py CHANGED
@@ -6,18 +6,18 @@ READER_CHOICES = MappingProxyType(
6
6
  {
7
7
  "fit_to": MappingProxyType(
8
8
  {
9
- "H": "Fit to Height",
10
- "O": "Original Size",
11
9
  "S": "Fit to Screen",
12
10
  "W": "Fit to Width",
11
+ "H": "Fit to Height",
12
+ "O": "Original Size",
13
13
  }
14
14
  ),
15
15
  "reading_direction": MappingProxyType(
16
16
  {
17
- "btt": "Bottom to Top",
18
17
  "ltr": "Left to Right",
19
18
  "rtl": "Right to Left",
20
19
  "ttb": "Top to Bottom",
20
+ "btt": "Bottom to Top",
21
21
  }
22
22
  ),
23
23
  }
codex/db.py CHANGED
@@ -16,7 +16,7 @@ from codex.librarian.janitor.integrity import (
16
16
  )
17
17
  from codex.librarian.janitor.janitor import Janitor
18
18
  from codex.librarian.mp_queue import LIBRARIAN_QUEUE
19
- from codex.logger.logging import get_logger
19
+ from codex.logger.logger import get_logger
20
20
  from codex.logger.mp_queue import LOG_QUEUE
21
21
  from codex.settings.settings import (
22
22
  BACKUP_DB_PATH,
codex/exceptions.py CHANGED
@@ -12,7 +12,7 @@ from rest_framework.exceptions import APIException
12
12
  from rest_framework.status import HTTP_303_SEE_OTHER
13
13
 
14
14
  from codex.choices.browser import DEFAULT_BROWSER_ROUTE
15
- from codex.logger.logging import get_logger
15
+ from codex.logger.logger import get_logger
16
16
  from codex.serializers.fields.browser import BreadcrumbsField
17
17
  from codex.serializers.route import RouteSerializer
18
18
  from codex.views.util import pop_name
@@ -14,6 +14,6 @@ class BookmarkTask:
14
14
  class BookmarkUpdateTask(BookmarkTask):
15
15
  """Bookmark a page."""
16
16
 
17
- auth_filter: Mapping[str, int | str]
17
+ auth_filter: Mapping[str, int | str | None]
18
18
  comic_pks: tuple[int]
19
19
  updates: Mapping[str, Any]
@@ -1,9 +1,9 @@
1
1
  """Cover status types."""
2
2
 
3
- from django.db.models import Choices
3
+ from django.db.models import TextChoices
4
4
 
5
5
 
6
- class CoverStatusTypes(Choices):
6
+ class CoverStatusTypes(TextChoices):
7
7
  """Cover Types."""
8
8
 
9
9
  CREATE_COVERS = "CCC"
@@ -18,13 +18,6 @@ class CoverRemoveOrphansTask(CoverTask):
18
18
  """Clean up covers from missing comics."""
19
19
 
20
20
 
21
- @dataclass
22
- class LibrariesTask:
23
- """Tasks over a set of libraries."""
24
-
25
- library_ids: frozenset
26
-
27
-
28
21
  @dataclass
29
22
  class CoverRemoveTask(CoverTask):
30
23
  """Purge a set of comic covers."""
@@ -6,10 +6,10 @@ from types import MappingProxyType
6
6
 
7
7
  from django.utils import timezone as django_timezone
8
8
 
9
+ from codex.librarian.janitor.scheduled_time import get_janitor_time
9
10
  from codex.librarian.janitor.tasks import JanitorNightlyTask
10
- from codex.librarian.janitor.time import get_janitor_time
11
+ from codex.librarian.telemeter.scheduled_time import get_telemeter_time
11
12
  from codex.librarian.telemeter.tasks import TelemeterTask
12
- from codex.librarian.telemeter.time import get_telemeter_time
13
13
  from codex.threads import NamedThread
14
14
 
15
15
  _TASK_TIME_FUNCTION_MAP = MappingProxyType(
@@ -1,5 +1,6 @@
1
1
  """Bulk update m2m fields."""
2
2
 
3
+ from collections.abc import Mapping
3
4
  from pathlib import Path
4
5
 
5
6
  from django.db.models import Q
@@ -126,13 +127,13 @@ class LinkComicsImporter(LinkCoversImporter):
126
127
  result = frozenset(pks)
127
128
  all_m2m_links[key][comic_pk] = result
128
129
 
129
- def _link_comic_m2m_fields(self):
130
+ def _link_comic_m2m_fields(self) -> tuple[Mapping, int]:
130
131
  """Get the complete m2m field data to create."""
131
132
  total = 0
132
133
  all_m2m_links = {}
133
134
  comic_paths = frozenset(self.metadata.get(M2M_MDS, {}).keys())
134
135
  if not comic_paths:
135
- return all_m2m_links
136
+ return all_m2m_links, total
136
137
  comics = Comic.objects.filter(path__in=comic_paths).values_list("pk", "path")
137
138
  for comic_pk, comic_path in comics:
138
139
  md = self.metadata[M2M_MDS][comic_path]
@@ -6,7 +6,7 @@ from codex.librarian.importer.const import (
6
6
  )
7
7
  from codex.librarian.importer.create_fks import CreateForeignKeysImporter
8
8
  from codex.librarian.importer.status import ImportStatusTypes
9
- from codex.logger.logging import get_logger
9
+ from codex.logger.logger import get_logger
10
10
  from codex.models.paths import CustomCover
11
11
  from codex.status import Status
12
12
 
@@ -35,7 +35,7 @@ from codex.librarian.importer.const import (
35
35
  )
36
36
  from codex.librarian.importer.query_covers import QueryCustomCoversImporter
37
37
  from codex.librarian.importer.status import ImportStatusTypes
38
- from codex.logger.logging import get_logger
38
+ from codex.logger.logger import get_logger
39
39
  from codex.models import (
40
40
  Comic,
41
41
  Contributor,
@@ -1,9 +1,9 @@
1
1
  """Librarian Status for imports."""
2
2
 
3
- from django.db.models import Choices
3
+ from django.db.models import TextChoices
4
4
 
5
5
 
6
- class ImportStatusTypes(Choices):
6
+ class ImportStatusTypes(TextChoices):
7
7
  """Keys for Import tasks."""
8
8
 
9
9
  DIRS_MOVED = "IDM"
@@ -11,7 +11,7 @@ from django.db.utils import OperationalError
11
11
 
12
12
  from codex.librarian.janitor.status import JanitorStatusTypes
13
13
  from codex.librarian.janitor.tasks import JanitorFTSRebuildTask
14
- from codex.logger.logging import get_logger
14
+ from codex.logger.logger import get_logger
15
15
  from codex.settings.settings import (
16
16
  CONFIG_PATH,
17
17
  CUSTOM_COVERS_DIR,
@@ -1,9 +1,9 @@
1
1
  """Janitor Status Types."""
2
2
 
3
- from django.db.models import Choices
3
+ from django.db.models import TextChoices
4
4
 
5
5
 
6
- class JanitorStatusTypes(Choices):
6
+ class JanitorStatusTypes(TextChoices):
7
7
  """Janitor Status Types."""
8
8
 
9
9
  CLEANUP_FK = "JTD"
@@ -1,9 +1,9 @@
1
1
  """Search Index Status Types."""
2
2
 
3
- from django.db.models import Choices
3
+ from django.db.models import TextChoices
4
4
 
5
5
 
6
- class SearchIndexStatusTypes(Choices):
6
+ class SearchIndexStatusTypes(TextChoices):
7
7
  """Search Index Status Types."""
8
8
 
9
9
  SEARCH_INDEX_CLEAR = "SIX"
@@ -9,7 +9,7 @@ from caseconverter import snakecase
9
9
  from django.contrib.sessions.models import Session
10
10
  from django.db.models import Count
11
11
 
12
- from codex.logger.logging import get_logger
12
+ from codex.logger.logger import get_logger
13
13
  from codex.models import (
14
14
  Comic,
15
15
  Library,
@@ -10,7 +10,6 @@ from requests import Session
10
10
 
11
11
  from codex.librarian.telemeter.stats import CodexStats
12
12
  from codex.models.admin import AdminFlag, Timestamp
13
- from codex.settings.settings import DEBUG
14
13
 
15
14
  # Version
16
15
  _APP_NAME = "codex"
@@ -43,23 +42,19 @@ def get_telemeter_timestamp():
43
42
  return ts
44
43
 
45
44
 
46
- def _post_stats(log, data):
45
+ def _post_stats(data):
47
46
  """Post telemetry to endpoint."""
48
47
  data_json = json.dumps(data)
49
48
  json_bytes = data_json.encode()
50
49
  compressed_data = compress(json_bytes)
51
- if DEBUG:
52
- msg = f"{_POST} {len(compressed_data)}, {_HEADERS}, {_TIMEOUT}"
53
- log.debug(msg)
54
- else:
55
- with Session() as session:
56
- response = session.post(
57
- _POST, data=compressed_data, headers=_HEADERS, timeout=_TIMEOUT
58
- )
59
- response.raise_for_status()
50
+ with Session() as session:
51
+ response = session.post(
52
+ _POST, data=compressed_data, headers=_HEADERS, timeout=_TIMEOUT
53
+ )
54
+ response.raise_for_status()
60
55
 
61
56
 
62
- def _send_telemetry(log):
57
+ def _send_telemetry():
63
58
  """Send telemetry to server."""
64
59
  if not AdminFlag.objects.get(key=AdminFlag.FlagChoices.SEND_TELEMETRY.value).on:
65
60
  reason = "Send Telemetry flag is off."
@@ -67,13 +62,13 @@ def _send_telemetry(log):
67
62
  ts = get_telemeter_timestamp()
68
63
  stats = CodexStats().get()
69
64
  data = {"stats": stats, "uuid": ts.version}
70
- _post_stats(log, data)
65
+ _post_stats(data)
71
66
  ts.save() # update updated_at
72
67
 
73
68
 
74
69
  def send_telemetry(log):
75
70
  """Send anonymous telemetry during one window per week."""
76
71
  try:
77
- _send_telemetry(log)
72
+ _send_telemetry()
78
73
  except Exception as exc:
79
74
  log.debug(f"Failed to send anonyomous stats: {exc}")
@@ -22,7 +22,7 @@ from watchdog.events import (
22
22
  )
23
23
 
24
24
  from codex.librarian.watchdog.tasks import WatchdogEventTask
25
- from codex.logger.logging import get_logger
25
+ from codex.logger.logger import get_logger
26
26
  from codex.logger_base import LoggerBaseMixin
27
27
  from codex.models import CustomCover
28
28
  from codex.settings.settings import CUSTOM_COVERS_DIR, CUSTOM_COVERS_GROUP_DIRS
@@ -182,7 +182,7 @@ class LibraryPollingObserver(UatuMixin):
182
182
  """Put a dummy event on the queue that blocks forever."""
183
183
  # The global timeout is None because the emitters have their own
184
184
  # per watch timeout. This makes self.dispatch_events() block
185
- # forever on the queue. Sending it an event lets it check the
185
+ # forever on the queue. Sending it an event makes it check the
186
186
  # shutdown event next.
187
187
  self.event_queue.put(self._SHUTDOWN_EVENT)
188
188
  super().on_thread_stop()
@@ -1,9 +1,9 @@
1
1
  """Watchdog Status Types."""
2
2
 
3
- from django.db.models import Choices
3
+ from django.db.models import TextChoices
4
4
 
5
5
 
6
- class WatchdogStatusTypes(Choices):
6
+ class WatchdogStatusTypes(TextChoices):
7
7
  """Watchdog Status Types."""
8
8
 
9
9
  POLL = "WPO"
@@ -20,7 +20,7 @@ class CodexQueueHandler(QueueHandler):
20
20
  super().enqueue(record)
21
21
 
22
22
 
23
- LOG_HANDLER = CodexQueueHandler(LOG_QUEUE)
23
+ _LOG_HANDLER = CodexQueueHandler(LOG_QUEUE)
24
24
 
25
25
 
26
26
  def _ensure_handler(logger, queue):
@@ -33,7 +33,7 @@ def _ensure_handler(logger, queue):
33
33
  logger.removeHandler(handler)
34
34
 
35
35
  if not logger.handlers:
36
- handler = LOG_HANDLER if queue == LOG_QUEUE else CodexQueueHandler(queue)
36
+ handler = _LOG_HANDLER if queue == LOG_QUEUE else CodexQueueHandler(queue)
37
37
  logger.addHandler(handler)
38
38
 
39
39
 
codex/logger_base.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Class to run librarian tasks inline without a thread."""
2
2
 
3
- from codex.logger.logging import get_logger
3
+ from codex.logger.logger import get_logger
4
4
 
5
5
 
6
6
  class LoggerBaseMixin:
codex/middleware.py CHANGED
@@ -5,7 +5,7 @@ from time import time
5
5
  from django.db import connection
6
6
  from django.utils import timezone
7
7
 
8
- from codex.logger.logging import get_logger
8
+ from codex.logger.logger import get_logger
9
9
  from codex.settings.settings import LOG_RESPONSE_TIME, SLOW_QUERY_LIMIT
10
10
 
11
11
  LOG = get_logger(__name__)
@@ -473,7 +473,7 @@ class Migration(migrations.Migration):
473
473
  models.DecimalField(
474
474
  db_index=True,
475
475
  decimal_places=2,
476
- default=Decimal(0.0),
476
+ default=Decimal("0.0"),
477
477
  max_digits=6,
478
478
  ),
479
479
  ),
@@ -0,0 +1,68 @@
1
+ """Generated by Django 5.1.4 on 2024-12-21 03:50."""
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ """Migrate DB."""
8
+
9
+ dependencies = [
10
+ ("codex", "0032_alter_librarianstatus_preactive"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="librarianstatus",
16
+ name="status_type",
17
+ field=models.CharField(
18
+ choices=[
19
+ ("CCC", "Create Covers"),
20
+ ("CCD", "Purge Covers"),
21
+ ("CFO", "Find Orphan"),
22
+ ("IAF", "Adopt Folders"),
23
+ ("ICC", "Covers Created"),
24
+ ("ICD", "Covers Deleted"),
25
+ ("ICL", "Covers Link"),
26
+ ("ICM", "Covers Moved"),
27
+ ("ICQ", "Query Missing Covers"),
28
+ ("ICU", "Covers Modified"),
29
+ ("IDD", "Dirs Deleted"),
30
+ ("IDM", "Dirs Moved"),
31
+ ("IDU", "Dirs Modified"),
32
+ ("IFC", "Files Created"),
33
+ ("IFD", "Files Deleted"),
34
+ ("IFI", "Failed Imports"),
35
+ ("IFM", "Files Moved"),
36
+ ("IFU", "Files Modified"),
37
+ ("IGU", "Group Update"),
38
+ ("IMC", "Link M2M Fields"),
39
+ ("IMQ", "Query M2M Fields"),
40
+ ("ITC", "Create Fks"),
41
+ ("ITQ", "Query Missing Fks"),
42
+ ("ITR", "Aggregate Tags"),
43
+ ("JCB", "Cleanup Bookmarks"),
44
+ ("JCD", "Cleanup Covers"),
45
+ ("JCR", "Codex Restart"),
46
+ ("JCS", "Codex Stop"),
47
+ ("JCU", "Codex Update"),
48
+ ("JDB", "Db Backup"),
49
+ ("JDO", "Db Optimize"),
50
+ ("JFC", "Fts Integrity Check"),
51
+ ("JFR", "Fts Rebuild"),
52
+ ("JIC", "Integrity Check"),
53
+ ("JIF", "Integrity Fk"),
54
+ ("JLV", "Codex Latest Version"),
55
+ ("JSD", "Cleanup Sessions"),
56
+ ("JTD", "Cleanup Fk"),
57
+ ("SIC", "Search Index Create"),
58
+ ("SID", "Search Index Remove"),
59
+ ("SIO", "Search Index Optimize"),
60
+ ("SIU", "Search Index Update"),
61
+ ("SIX", "Search Index Clear"),
62
+ ("WPO", "Poll"),
63
+ ],
64
+ db_index=True,
65
+ max_length=3,
66
+ ),
67
+ ),
68
+ ]
codex/models/admin.py CHANGED
@@ -9,7 +9,6 @@ from django.db.models import (
9
9
  CASCADE,
10
10
  BooleanField,
11
11
  CharField,
12
- Choices,
13
12
  DateTimeField,
14
13
  OneToOneField,
15
14
  PositiveSmallIntegerField,
@@ -17,11 +16,7 @@ from django.db.models import (
17
16
  )
18
17
  from django.utils.translation import gettext_lazy as _
19
18
 
20
- from codex.librarian.covers.status import CoverStatusTypes
21
- from codex.librarian.importer.status import ImportStatusTypes
22
- from codex.librarian.janitor.status import JanitorStatusTypes
23
- from codex.librarian.search.status import SearchIndexStatusTypes
24
- from codex.librarian.watchdog.status import WatchdogStatusTypes
19
+ from codex.choices.admin import ADMIN_STATUS_TITLES
25
20
  from codex.models.base import MAX_FIELD_LEN, MAX_NAME_LEN, BaseModel, max_choices_len
26
21
 
27
22
  __all__ = ("AdminFlag", "LibrarianStatus", "Timestamp", "UserActive")
@@ -30,7 +25,7 @@ __all__ = ("AdminFlag", "LibrarianStatus", "Timestamp", "UserActive")
30
25
  class AdminFlag(BaseModel):
31
26
  """Flags set by administrators."""
32
27
 
33
- class FlagChoices(Choices):
28
+ class FlagChoices(TextChoices):
34
29
  """Choices for Admin Flags."""
35
30
 
36
31
  FOLDER_VIEW = "FV"
@@ -60,16 +55,12 @@ class AdminFlag(BaseModel):
60
55
  class LibrarianStatus(BaseModel):
61
56
  """Active Library Tasks."""
62
57
 
63
- CHOICES = tuple(
64
- CoverStatusTypes.choices
65
- + ImportStatusTypes.choices
66
- + JanitorStatusTypes.choices
67
- + SearchIndexStatusTypes.choices
68
- + WatchdogStatusTypes.choices
69
- )
58
+ CHOICES = TextChoices("LibrarianStatusTypes", ADMIN_STATUS_TITLES.inverse)
70
59
 
71
60
  status_type = CharField(
72
- db_index=True, max_length=max_choices_len(CHOICES), choices=CHOICES
61
+ db_index=True,
62
+ max_length=max_choices_len(CHOICES),
63
+ choices=CHOICES.choices,
73
64
  )
74
65
  subtitle = CharField(db_index=True, max_length=MAX_NAME_LEN)
75
66
  complete = PositiveSmallIntegerField(null=True, default=None)
codex/models/bookmark.py CHANGED
@@ -6,9 +6,9 @@ from django.db.models import (
6
6
  CASCADE,
7
7
  BooleanField,
8
8
  CharField,
9
- Choices,
10
9
  ForeignKey,
11
10
  PositiveSmallIntegerField,
11
+ TextChoices,
12
12
  )
13
13
 
14
14
  from codex.models.base import BaseModel, max_choices_len
@@ -49,7 +49,7 @@ def cascade_if_user_null(
49
49
  class Bookmark(BaseModel):
50
50
  """Persist user's bookmarks and settings."""
51
51
 
52
- class FitTo(Choices):
52
+ class FitTo(TextChoices):
53
53
  """Identifiers for Readder fit_to choices."""
54
54
 
55
55
  SCREEN = "S"
codex/models/comic.py CHANGED
@@ -6,12 +6,11 @@ import re
6
6
  from datetime import MAXYEAR, MINYEAR, date
7
7
  from pathlib import Path
8
8
 
9
- from comicbox.fields.enum import ReadingDirectionEnum
9
+ from comicbox.fields.enum_fields import ReadingDirectionEnum
10
10
  from django.db.models import (
11
11
  CASCADE,
12
12
  BooleanField,
13
13
  CharField,
14
- Choices,
15
14
  DateField,
16
15
  DateTimeField,
17
16
  DecimalField,
@@ -20,6 +19,7 @@ from django.db.models import (
20
19
  OneToOneField,
21
20
  PositiveIntegerField,
22
21
  PositiveSmallIntegerField,
22
+ TextChoices,
23
23
  TextField,
24
24
  )
25
25
 
@@ -59,7 +59,7 @@ from codex.models.named import (
59
59
  __all__ = ("Comic",)
60
60
 
61
61
 
62
- class ReadingDirection(Choices):
62
+ class ReadingDirection(TextChoices):
63
63
  """Reading direction choices."""
64
64
 
65
65
  LTR = ReadingDirectionEnum.LTR.value
@@ -68,7 +68,7 @@ class ReadingDirection(Choices):
68
68
  BTT = ReadingDirectionEnum.BTT.value
69
69
 
70
70
 
71
- class FileType(Choices):
71
+ class FileType(TextChoices):
72
72
  """Identifiers for file formats."""
73
73
 
74
74
  CBZ = "CBZ"
codex/models/groups.py CHANGED
@@ -11,7 +11,7 @@ from codex.models.base import MAX_NAME_LEN, BaseModel
11
11
  from codex.models.paths import CustomCover, WatchedPath
12
12
  from codex.models.util import get_sort_name
13
13
 
14
- __all__ = ("BrowserGroupModel", "Publisher", "Imprint", "Series", "Volume", "Folder")
14
+ __all__ = ("BrowserGroupModel", "Folder", "Imprint", "Publisher", "Series", "Volume")
15
15
 
16
16
 
17
17
  class BrowserGroupModel(BaseModel):
codex/models/named.py CHANGED
@@ -14,9 +14,9 @@ from codex.models.groups import BrowserGroupModel
14
14
  __all__ = (
15
15
  "AgeRating",
16
16
  "Character",
17
+ "Contributor",
17
18
  "ContributorPerson",
18
19
  "ContributorRole",
19
- "Contributor",
20
20
  "Country",
21
21
  "Genre",
22
22
  "Identifier",
codex/models/paths.py CHANGED
@@ -3,8 +3,7 @@
3
3
  from pathlib import Path
4
4
  from types import MappingProxyType
5
5
 
6
- from django.db.models import CASCADE, CharField, ForeignKey, JSONField
7
- from django.db.models.enums import Choices
6
+ from django.db.models import CASCADE, CharField, ForeignKey, JSONField, TextChoices
8
7
 
9
8
  from codex.models.base import MAX_NAME_LEN, BaseModel, max_choices_len
10
9
  from codex.models.library import MAX_PATH_LEN, Library
@@ -81,7 +80,7 @@ class FailedImport(WatchedPath):
81
80
  class CustomCover(WatchedPath):
82
81
  """Custom Cover Image."""
83
82
 
84
- class GroupChoice(Choices):
83
+ class GroupChoice(TextChoices):
85
84
  """Reading direction choices."""
86
85
 
87
86
  P = "p"
codex/run.py CHANGED
@@ -11,8 +11,8 @@ from hypercorn.asyncio import serve
11
11
  from codex.asgi import application
12
12
  from codex.librarian.librariand import LibrarianDaemon
13
13
  from codex.librarian.mp_queue import LIBRARIAN_QUEUE
14
+ from codex.logger.logger import get_logger
14
15
  from codex.logger.loggerd import CodexLogQueueListener
15
- from codex.logger.logging import get_logger
16
16
  from codex.logger.mp_queue import LOG_QUEUE
17
17
  from codex.settings.settings import HYPERCORN_CONFIG
18
18
  from codex.signals.os_signals import RESTART_EVENT, SHUTDOWN_EVENT
@@ -12,7 +12,7 @@ from rest_framework.serializers import (
12
12
  SerializerMethodField,
13
13
  )
14
14
 
15
- from codex.logger.logging import get_logger
15
+ from codex.logger.logger import get_logger
16
16
  from codex.serializers.fields.browser import TopGroupField
17
17
  from codex.util import max_none
18
18
  from codex.views.const import EPOCH_START