codex 1.7.4__py3-none-any.whl → 1.7.5__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 (471) hide show
  1. codex/choices/__init__.py +1 -0
  2. codex/{choices.py → choices/admin.py} +47 -146
  3. codex/choices/browser.py +85 -0
  4. codex/{choices_to_json.py → choices/choices_to_json.py} +18 -12
  5. codex/choices/notifications.py +16 -0
  6. codex/choices/reader.py +33 -0
  7. codex/exceptions.py +1 -1
  8. codex/librarian/bookmark/update.py +2 -1
  9. codex/librarian/covers/purge.py +2 -2
  10. codex/librarian/importer/importer.py +5 -2
  11. codex/librarian/janitor/update.py +3 -0
  12. codex/librarian/notifier/tasks.py +17 -3
  13. codex/serializers/admin/tasks.py +12 -2
  14. codex/serializers/browser/settings.py +1 -1
  15. codex/serializers/fields/browser.py +1 -1
  16. codex/serializers/fields/group.py +1 -1
  17. codex/serializers/fields/session.py +2 -1
  18. codex/serializers/fields/vuetify.py +1 -1
  19. codex/startup.py +2 -2
  20. codex/static_root/assets/{VCheckbox-CtTi6T7d.87331fa7e77f.js → VCheckbox-CWBDr4kF.6da5bf3a4d90.js} +1 -1
  21. codex/static_root/assets/VCheckbox-CWBDr4kF.6da5bf3a4d90.js.br +0 -0
  22. codex/static_root/assets/VCheckbox-CWBDr4kF.6da5bf3a4d90.js.gz +0 -0
  23. codex/static_root/assets/{VCheckbox-CtTi6T7d.js → VCheckbox-CWBDr4kF.js} +1 -1
  24. codex/static_root/assets/VCheckbox-CWBDr4kF.js.br +0 -0
  25. codex/static_root/assets/VCheckbox-CWBDr4kF.js.gz +0 -0
  26. codex/static_root/assets/{VCheckboxBtn-DQafuWTH.dada5e0634ef.js → VCheckboxBtn-COaoh3uF.fc880a386827.js} +1 -1
  27. codex/static_root/assets/VCheckboxBtn-COaoh3uF.fc880a386827.js.br +0 -0
  28. codex/static_root/assets/VCheckboxBtn-COaoh3uF.fc880a386827.js.gz +0 -0
  29. codex/static_root/assets/{VCheckboxBtn-DQafuWTH.js → VCheckboxBtn-COaoh3uF.js} +1 -1
  30. codex/static_root/assets/VCheckboxBtn-COaoh3uF.js.br +0 -0
  31. codex/static_root/assets/VCheckboxBtn-COaoh3uF.js.gz +0 -0
  32. codex/static_root/assets/{VCombobox-C6TX3Dhp.e619423a6463.js → VCombobox-DkOruNH0.f30f163ee632.js} +1 -1
  33. codex/static_root/assets/VCombobox-DkOruNH0.f30f163ee632.js.br +0 -0
  34. codex/static_root/assets/VCombobox-DkOruNH0.f30f163ee632.js.gz +0 -0
  35. codex/static_root/assets/{VCombobox-C6TX3Dhp.js → VCombobox-DkOruNH0.js} +1 -1
  36. codex/static_root/assets/VCombobox-DkOruNH0.js.br +0 -0
  37. codex/static_root/assets/VCombobox-DkOruNH0.js.gz +0 -0
  38. codex/static_root/assets/{VDialog-CknWq2kd.b2d301ec6ac5.js → VDialog-Dr7SuC2S.b6ec7df390f4.js} +1 -1
  39. codex/static_root/assets/VDialog-Dr7SuC2S.b6ec7df390f4.js.br +0 -0
  40. codex/static_root/assets/VDialog-Dr7SuC2S.b6ec7df390f4.js.gz +0 -0
  41. codex/static_root/assets/{VDialog-CknWq2kd.js → VDialog-Dr7SuC2S.js} +1 -1
  42. codex/static_root/assets/VDialog-Dr7SuC2S.js.br +0 -0
  43. codex/static_root/assets/VDialog-Dr7SuC2S.js.gz +0 -0
  44. codex/static_root/assets/{VDivider-F4DUgr74.62bc92cab97d.js → VDivider-By4u2EsM.fd5ee9cce906.js} +1 -1
  45. codex/static_root/assets/VDivider-By4u2EsM.fd5ee9cce906.js.br +0 -0
  46. codex/static_root/assets/VDivider-By4u2EsM.fd5ee9cce906.js.gz +0 -0
  47. codex/static_root/assets/{VDivider-F4DUgr74.js → VDivider-By4u2EsM.js} +1 -1
  48. codex/static_root/assets/VDivider-By4u2EsM.js.br +0 -0
  49. codex/static_root/assets/VDivider-By4u2EsM.js.gz +0 -0
  50. codex/static_root/assets/{VExpansionPanels-CprYUTGT.39b8a50cde43.js → VExpansionPanels-BhO9oj0a.e99bea455c78.js} +1 -1
  51. codex/static_root/assets/VExpansionPanels-BhO9oj0a.e99bea455c78.js.br +0 -0
  52. codex/static_root/assets/VExpansionPanels-BhO9oj0a.e99bea455c78.js.gz +0 -0
  53. codex/static_root/assets/{VExpansionPanels-CprYUTGT.js → VExpansionPanels-BhO9oj0a.js} +1 -1
  54. codex/static_root/assets/VExpansionPanels-BhO9oj0a.js.br +0 -0
  55. codex/static_root/assets/VExpansionPanels-BhO9oj0a.js.gz +0 -0
  56. codex/static_root/assets/VForm-XhA6T0Lc.70c9c6fcb9e3.js +1 -0
  57. codex/static_root/assets/VForm-XhA6T0Lc.70c9c6fcb9e3.js.br +0 -0
  58. codex/static_root/assets/VForm-XhA6T0Lc.70c9c6fcb9e3.js.gz +0 -0
  59. codex/static_root/assets/VForm-XhA6T0Lc.js +1 -0
  60. codex/static_root/assets/VForm-XhA6T0Lc.js.br +0 -0
  61. codex/static_root/assets/VForm-XhA6T0Lc.js.gz +0 -0
  62. codex/static_root/assets/{VRadioGroup-D71Rszum.befc87b0c476.js → VRadioGroup-C1WCG0rO.6ebc88e4f144.js} +1 -1
  63. codex/static_root/assets/VRadioGroup-C1WCG0rO.6ebc88e4f144.js.br +3 -0
  64. codex/static_root/assets/VRadioGroup-C1WCG0rO.6ebc88e4f144.js.gz +0 -0
  65. codex/static_root/assets/{VRadioGroup-D71Rszum.js → VRadioGroup-C1WCG0rO.js} +1 -1
  66. codex/static_root/assets/VRadioGroup-C1WCG0rO.js.br +3 -0
  67. codex/static_root/assets/VRadioGroup-C1WCG0rO.js.gz +0 -0
  68. codex/static_root/assets/VSelect-Bbt1vrBg.ec45ee26818a.js +1 -0
  69. codex/static_root/assets/VSelect-Bbt1vrBg.ec45ee26818a.js.br +0 -0
  70. codex/static_root/assets/VSelect-Bbt1vrBg.ec45ee26818a.js.gz +0 -0
  71. codex/static_root/assets/VSelect-Bbt1vrBg.js +1 -0
  72. codex/static_root/assets/VSelect-Bbt1vrBg.js.br +0 -0
  73. codex/static_root/assets/VSelect-Bbt1vrBg.js.gz +0 -0
  74. codex/static_root/assets/{VSelectionControl-It389cbo.ac75aee480a0.js → VSelectionControl-BkZZAsWo.ba6eca944e2e.js} +1 -1
  75. codex/static_root/assets/VSelectionControl-BkZZAsWo.ba6eca944e2e.js.br +0 -0
  76. codex/static_root/assets/VSelectionControl-BkZZAsWo.ba6eca944e2e.js.gz +0 -0
  77. codex/static_root/assets/{VSelectionControl-It389cbo.js → VSelectionControl-BkZZAsWo.js} +1 -1
  78. codex/static_root/assets/VSelectionControl-BkZZAsWo.js.br +0 -0
  79. codex/static_root/assets/VSelectionControl-BkZZAsWo.js.gz +0 -0
  80. codex/static_root/assets/{VTable-D9e3lKk6.7cd0760008c7.js → VTable-D7P2eIc2.5e94bf2a515b.js} +1 -1
  81. codex/static_root/assets/VTable-D7P2eIc2.5e94bf2a515b.js.br +0 -0
  82. codex/static_root/assets/VTable-D7P2eIc2.5e94bf2a515b.js.gz +0 -0
  83. codex/static_root/assets/{VTable-D9e3lKk6.js → VTable-D7P2eIc2.js} +1 -1
  84. codex/static_root/assets/VTable-D7P2eIc2.js.br +0 -0
  85. codex/static_root/assets/VTable-D7P2eIc2.js.gz +0 -0
  86. codex/static_root/assets/VWindowItem-Dm2szrjK.e77444188aa3.js +1 -0
  87. codex/static_root/assets/VWindowItem-Dm2szrjK.e77444188aa3.js.br +0 -0
  88. codex/static_root/assets/VWindowItem-Dm2szrjK.e77444188aa3.js.gz +0 -0
  89. codex/static_root/assets/VWindowItem-Dm2szrjK.js +1 -0
  90. codex/static_root/assets/VWindowItem-Dm2szrjK.js.br +0 -0
  91. codex/static_root/assets/VWindowItem-Dm2szrjK.js.gz +0 -0
  92. codex/static_root/assets/{admin-CFTKGwmx.18915c5df4d3.js → admin-B4z2nA5P.da0c92500311.js} +1 -1
  93. codex/static_root/assets/admin-B4z2nA5P.da0c92500311.js.br +0 -0
  94. codex/static_root/assets/admin-B4z2nA5P.da0c92500311.js.gz +0 -0
  95. codex/static_root/assets/{admin-CFTKGwmx.js → admin-B4z2nA5P.js} +1 -1
  96. codex/static_root/assets/admin-B4z2nA5P.js.br +0 -0
  97. codex/static_root/assets/admin-B4z2nA5P.js.gz +0 -0
  98. codex/static_root/assets/admin-BhW3PNO0.e444048e548d.js +1 -0
  99. codex/static_root/assets/admin-BhW3PNO0.e444048e548d.js.br +0 -0
  100. codex/static_root/assets/admin-BhW3PNO0.e444048e548d.js.gz +0 -0
  101. codex/static_root/assets/admin-BhW3PNO0.js +1 -0
  102. codex/static_root/assets/admin-BhW3PNO0.js.br +0 -0
  103. codex/static_root/assets/admin-BhW3PNO0.js.gz +0 -0
  104. codex/static_root/assets/{admin-menu-CxZqtPES.7b3a06ce4b92.js → admin-menu-CL7S-xqR.92b6d84c4b70.js} +1 -1
  105. codex/static_root/assets/admin-menu-CL7S-xqR.92b6d84c4b70.js.br +0 -0
  106. codex/static_root/assets/admin-menu-CL7S-xqR.92b6d84c4b70.js.gz +0 -0
  107. codex/static_root/assets/{admin-menu-CxZqtPES.js → admin-menu-CL7S-xqR.js} +1 -1
  108. codex/static_root/assets/admin-menu-CL7S-xqR.js.br +0 -0
  109. codex/static_root/assets/admin-menu-CL7S-xqR.js.gz +0 -0
  110. codex/static_root/assets/{admin-settings-button-progress-D2TfW_5T.8a9d411ee79d.js → admin-settings-button-progress-BgBgdELw.52d052e38bc1.js} +1 -1
  111. codex/static_root/assets/admin-settings-button-progress-BgBgdELw.52d052e38bc1.js.br +0 -0
  112. codex/static_root/assets/admin-settings-button-progress-BgBgdELw.52d052e38bc1.js.gz +0 -0
  113. codex/static_root/assets/{admin-settings-button-progress-D2TfW_5T.js → admin-settings-button-progress-BgBgdELw.js} +1 -1
  114. codex/static_root/assets/admin-settings-button-progress-BgBgdELw.js.br +0 -0
  115. codex/static_root/assets/admin-settings-button-progress-BgBgdELw.js.gz +0 -0
  116. codex/static_root/assets/browser-Bi5ov5k8.a4af87c2a667.js +1 -0
  117. codex/static_root/assets/browser-Bi5ov5k8.a4af87c2a667.js.br +0 -0
  118. codex/static_root/assets/browser-Bi5ov5k8.a4af87c2a667.js.gz +0 -0
  119. codex/static_root/assets/browser-Bi5ov5k8.js +1 -0
  120. codex/static_root/assets/browser-Bi5ov5k8.js.br +0 -0
  121. codex/static_root/assets/browser-Bi5ov5k8.js.gz +0 -0
  122. codex/static_root/assets/{change-password-dialog-CSylx5Qb.319466c891c9.js → change-password-dialog-BKar2Bhb.3dbc2feb3c5a.js} +1 -1
  123. codex/static_root/assets/change-password-dialog-BKar2Bhb.3dbc2feb3c5a.js.br +0 -0
  124. codex/static_root/assets/change-password-dialog-BKar2Bhb.3dbc2feb3c5a.js.gz +0 -0
  125. codex/static_root/assets/{change-password-dialog-CSylx5Qb.js → change-password-dialog-BKar2Bhb.js} +1 -1
  126. codex/static_root/assets/change-password-dialog-BKar2Bhb.js.br +0 -0
  127. codex/static_root/assets/change-password-dialog-BKar2Bhb.js.gz +0 -0
  128. codex/static_root/assets/{confirm-dialog-Bx2R2vgR.d42b6449c495.js → confirm-dialog-BoBL4OoS.abef9614fea9.js} +1 -1
  129. codex/static_root/assets/confirm-dialog-BoBL4OoS.abef9614fea9.js.br +0 -0
  130. codex/static_root/assets/confirm-dialog-BoBL4OoS.abef9614fea9.js.gz +0 -0
  131. codex/static_root/assets/{confirm-dialog-Bx2R2vgR.js → confirm-dialog-BoBL4OoS.js} +1 -1
  132. codex/static_root/assets/confirm-dialog-BoBL4OoS.js.br +0 -0
  133. codex/static_root/assets/confirm-dialog-BoBL4OoS.js.gz +0 -0
  134. codex/static_root/assets/{datetime-column-sOrWMDcU.9ad225af18db.js → datetime-column-BsiYRUKO.cadd764c06f4.js} +1 -1
  135. codex/static_root/assets/datetime-column-BsiYRUKO.cadd764c06f4.js.br +0 -0
  136. codex/static_root/assets/datetime-column-BsiYRUKO.cadd764c06f4.js.gz +0 -0
  137. codex/static_root/assets/{datetime-column-sOrWMDcU.js → datetime-column-BsiYRUKO.js} +1 -1
  138. codex/static_root/assets/datetime-column-BsiYRUKO.js.br +0 -0
  139. codex/static_root/assets/datetime-column-BsiYRUKO.js.gz +0 -0
  140. codex/static_root/assets/{filter-SgjvoAvL.094069d6978d.js → filter-HnY0knto.07f807227dcc.js} +1 -1
  141. codex/static_root/assets/filter-HnY0knto.07f807227dcc.js.br +0 -0
  142. codex/static_root/assets/filter-HnY0knto.07f807227dcc.js.gz +0 -0
  143. codex/static_root/assets/{filter-SgjvoAvL.js → filter-HnY0knto.js} +1 -1
  144. codex/static_root/assets/filter-HnY0knto.js.br +0 -0
  145. codex/static_root/assets/filter-HnY0knto.js.gz +0 -0
  146. codex/static_root/assets/{flag-tab-B_0tGWPg.e46d1782b327.js → flag-tab-CcS5pve2.a1df5d92e222.js} +1 -1
  147. codex/static_root/assets/flag-tab-CcS5pve2.a1df5d92e222.js.br +0 -0
  148. codex/static_root/assets/flag-tab-CcS5pve2.a1df5d92e222.js.gz +0 -0
  149. codex/static_root/assets/{flag-tab-B_0tGWPg.js → flag-tab-CcS5pve2.js} +1 -1
  150. codex/static_root/assets/flag-tab-CcS5pve2.js.br +0 -0
  151. codex/static_root/assets/flag-tab-CcS5pve2.js.gz +0 -0
  152. codex/static_root/assets/{forwardRefs-DqbPK1-k.bb9d6863ac16.js → forwardRefs-i80xmxX3.db393aeef392.js} +1 -1
  153. codex/static_root/assets/forwardRefs-i80xmxX3.db393aeef392.js.br +0 -0
  154. codex/static_root/assets/forwardRefs-i80xmxX3.db393aeef392.js.gz +0 -0
  155. codex/static_root/assets/{forwardRefs-DqbPK1-k.js → forwardRefs-i80xmxX3.js} +1 -1
  156. codex/static_root/assets/forwardRefs-i80xmxX3.js.br +0 -0
  157. codex/static_root/assets/forwardRefs-i80xmxX3.js.gz +0 -0
  158. codex/static_root/assets/group-tab-SY0gxmHW.f72e944c0ff1.js +1 -0
  159. codex/static_root/assets/group-tab-SY0gxmHW.f72e944c0ff1.js.br +0 -0
  160. codex/static_root/assets/group-tab-SY0gxmHW.f72e944c0ff1.js.gz +0 -0
  161. codex/static_root/assets/group-tab-SY0gxmHW.js +1 -0
  162. codex/static_root/assets/group-tab-SY0gxmHW.js.br +0 -0
  163. codex/static_root/assets/group-tab-SY0gxmHW.js.gz +0 -0
  164. codex/static_root/assets/http-error-EE8gtq5A.07e291d9d955.js +1 -0
  165. codex/static_root/assets/http-error-EE8gtq5A.07e291d9d955.js.br +0 -0
  166. codex/static_root/assets/http-error-EE8gtq5A.07e291d9d955.js.gz +0 -0
  167. codex/static_root/assets/http-error-EE8gtq5A.js +1 -0
  168. codex/static_root/assets/http-error-EE8gtq5A.js.br +0 -0
  169. codex/static_root/assets/http-error-EE8gtq5A.js.gz +0 -0
  170. codex/static_root/assets/{index-DK0lSHDP.86f18c078fa9.js → index-gVdawuuE.a940fadbac00.js} +1 -1
  171. codex/static_root/assets/index-gVdawuuE.a940fadbac00.js.br +0 -0
  172. codex/static_root/assets/index-gVdawuuE.a940fadbac00.js.gz +0 -0
  173. codex/static_root/assets/{index-DK0lSHDP.js → index-gVdawuuE.js} +1 -1
  174. codex/static_root/assets/index-gVdawuuE.js.br +0 -0
  175. codex/static_root/assets/index-gVdawuuE.js.gz +0 -0
  176. codex/static_root/assets/library-tab-BkDIAvyS.4b4c606b77d6.js +1 -0
  177. codex/static_root/assets/library-tab-BkDIAvyS.4b4c606b77d6.js.br +0 -0
  178. codex/static_root/assets/library-tab-BkDIAvyS.4b4c606b77d6.js.gz +0 -0
  179. codex/static_root/assets/library-tab-BkDIAvyS.js +1 -0
  180. codex/static_root/assets/library-tab-BkDIAvyS.js.br +0 -0
  181. codex/static_root/assets/library-tab-BkDIAvyS.js.gz +0 -0
  182. codex/static_root/assets/main-B5uflU6E.77f3fcd6873f.js +35 -0
  183. codex/static_root/assets/main-B5uflU6E.77f3fcd6873f.js.br +0 -0
  184. codex/static_root/assets/main-B5uflU6E.77f3fcd6873f.js.gz +0 -0
  185. codex/static_root/assets/main-B5uflU6E.js +35 -0
  186. codex/static_root/assets/main-B5uflU6E.js.br +0 -0
  187. codex/static_root/assets/main-B5uflU6E.js.gz +0 -0
  188. codex/static_root/assets/pager-full-pdf-wuQbceLs.111d9b9d4133.js +1 -0
  189. codex/static_root/assets/pager-full-pdf-wuQbceLs.111d9b9d4133.js.br +0 -0
  190. codex/static_root/assets/pager-full-pdf-wuQbceLs.111d9b9d4133.js.gz +0 -0
  191. codex/static_root/assets/pager-full-pdf-wuQbceLs.js +1 -0
  192. codex/static_root/assets/pager-full-pdf-wuQbceLs.js.br +0 -0
  193. codex/static_root/assets/pager-full-pdf-wuQbceLs.js.gz +0 -0
  194. codex/static_root/assets/{pagination-toolbar-CeWXU_qA.abe0805da1cc.js → pagination-toolbar-D3JQmDiD.8513a4db85f0.js} +1 -1
  195. codex/static_root/assets/pagination-toolbar-D3JQmDiD.8513a4db85f0.js.br +0 -0
  196. codex/static_root/assets/pagination-toolbar-D3JQmDiD.8513a4db85f0.js.gz +0 -0
  197. codex/static_root/assets/{pagination-toolbar-CeWXU_qA.js → pagination-toolbar-D3JQmDiD.js} +1 -1
  198. codex/static_root/assets/pagination-toolbar-D3JQmDiD.js.br +0 -0
  199. codex/static_root/assets/pagination-toolbar-D3JQmDiD.js.gz +0 -0
  200. codex/static_root/assets/{pdf-doc-Dws_otkd.d215eca27da5.js → pdf-doc-DRBtl9_2.225a6d89e842.js} +1 -1
  201. codex/static_root/assets/pdf-doc-DRBtl9_2.225a6d89e842.js.br +0 -0
  202. codex/static_root/assets/pdf-doc-DRBtl9_2.225a6d89e842.js.gz +0 -0
  203. codex/static_root/assets/{pdf-doc-Dws_otkd.js → pdf-doc-DRBtl9_2.js} +1 -1
  204. codex/static_root/assets/pdf-doc-DRBtl9_2.js.br +0 -0
  205. codex/static_root/assets/pdf-doc-DRBtl9_2.js.gz +0 -0
  206. codex/static_root/assets/reader-DycvjN42.3e2b4f43235e.js +2 -0
  207. codex/static_root/assets/reader-DycvjN42.3e2b4f43235e.js.br +0 -0
  208. codex/static_root/assets/reader-DycvjN42.3e2b4f43235e.js.gz +0 -0
  209. codex/static_root/assets/reader-DycvjN42.js +2 -0
  210. codex/static_root/assets/reader-DycvjN42.js.br +0 -0
  211. codex/static_root/assets/reader-DycvjN42.js.gz +0 -0
  212. codex/static_root/assets/{relation-chips-DNRRCvrw.js → relation-chips-CeHIEjvZ.04d302f4fa89.js} +1 -1
  213. codex/static_root/assets/relation-chips-CeHIEjvZ.04d302f4fa89.js.br +0 -0
  214. codex/static_root/assets/relation-chips-CeHIEjvZ.04d302f4fa89.js.gz +0 -0
  215. codex/static_root/assets/{relation-chips-DNRRCvrw.b1bc75fb9349.js → relation-chips-CeHIEjvZ.js} +1 -1
  216. codex/static_root/assets/relation-chips-CeHIEjvZ.js.br +0 -0
  217. codex/static_root/assets/relation-chips-CeHIEjvZ.js.gz +0 -0
  218. codex/static_root/assets/settings-drawer-DY8o-jF3.48dfaafaa00e.js +2 -0
  219. codex/static_root/assets/settings-drawer-DY8o-jF3.48dfaafaa00e.js.br +0 -0
  220. codex/static_root/assets/settings-drawer-DY8o-jF3.48dfaafaa00e.js.gz +0 -0
  221. codex/static_root/assets/settings-drawer-DY8o-jF3.js +2 -0
  222. codex/static_root/assets/settings-drawer-DY8o-jF3.js.br +0 -0
  223. codex/static_root/assets/settings-drawer-DY8o-jF3.js.gz +0 -0
  224. codex/static_root/assets/ssrBoot-DRKt_yWP.3b5868abdd61.js +1 -0
  225. codex/static_root/assets/ssrBoot-DRKt_yWP.3b5868abdd61.js.br +0 -0
  226. codex/static_root/assets/ssrBoot-DRKt_yWP.3b5868abdd61.js.gz +0 -0
  227. codex/static_root/assets/ssrBoot-DRKt_yWP.js +1 -0
  228. codex/static_root/assets/ssrBoot-DRKt_yWP.js.br +0 -0
  229. codex/static_root/assets/ssrBoot-DRKt_yWP.js.gz +0 -0
  230. codex/static_root/assets/{stats-tab-D0zymxU6.d5267113b51e.js → stats-tab-C1XYGBKj.812896e1d09c.js} +1 -1
  231. codex/static_root/assets/stats-tab-C1XYGBKj.812896e1d09c.js.br +0 -0
  232. codex/static_root/assets/stats-tab-C1XYGBKj.812896e1d09c.js.gz +0 -0
  233. codex/static_root/assets/{stats-tab-D0zymxU6.js → stats-tab-C1XYGBKj.js} +1 -1
  234. codex/static_root/assets/stats-tab-C1XYGBKj.js.br +0 -0
  235. codex/static_root/assets/stats-tab-C1XYGBKj.js.gz +0 -0
  236. codex/static_root/assets/task-tab-CW4DQ3KN.81812f9208e5.css +1 -0
  237. codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css.br → task-tab-CW4DQ3KN.81812f9208e5.css.br} +1 -1
  238. codex/static_root/assets/task-tab-CW4DQ3KN.81812f9208e5.css.gz +0 -0
  239. codex/static_root/assets/task-tab-CW4DQ3KN.css +1 -0
  240. codex/static_root/assets/{task-tab-DfdUY9Rc.css.br → task-tab-CW4DQ3KN.css.br} +1 -1
  241. codex/static_root/assets/task-tab-CW4DQ3KN.css.gz +0 -0
  242. codex/static_root/assets/task-tab-lFRZ0NMd.6b90f40a1a9f.js +1 -0
  243. codex/static_root/assets/task-tab-lFRZ0NMd.6b90f40a1a9f.js.br +0 -0
  244. codex/static_root/assets/task-tab-lFRZ0NMd.6b90f40a1a9f.js.gz +0 -0
  245. codex/static_root/assets/task-tab-lFRZ0NMd.js +1 -0
  246. codex/static_root/assets/task-tab-lFRZ0NMd.js.br +0 -0
  247. codex/static_root/assets/task-tab-lFRZ0NMd.js.gz +0 -0
  248. codex/static_root/assets/unauthorized-Dld9cV8d.4e675fd9991c.js +1 -0
  249. codex/static_root/assets/unauthorized-Dld9cV8d.4e675fd9991c.js.br +0 -0
  250. codex/static_root/assets/unauthorized-Dld9cV8d.4e675fd9991c.js.gz +0 -0
  251. codex/static_root/assets/unauthorized-Dld9cV8d.js +1 -0
  252. codex/static_root/assets/unauthorized-Dld9cV8d.js.br +0 -0
  253. codex/static_root/assets/unauthorized-Dld9cV8d.js.gz +0 -0
  254. codex/static_root/assets/user-tab-CN9nBOMS.f88d8b1c8afe.js +1 -0
  255. codex/static_root/assets/user-tab-CN9nBOMS.f88d8b1c8afe.js.br +0 -0
  256. codex/static_root/assets/user-tab-CN9nBOMS.f88d8b1c8afe.js.gz +0 -0
  257. codex/static_root/assets/user-tab-CN9nBOMS.js +1 -0
  258. codex/static_root/assets/user-tab-CN9nBOMS.js.br +0 -0
  259. codex/static_root/assets/user-tab-CN9nBOMS.js.gz +0 -0
  260. codex/static_root/{manifest.514e63b9f805.json → manifest.66d7229aa07a.json} +295 -275
  261. codex/static_root/manifest.66d7229aa07a.json.br +0 -0
  262. codex/static_root/manifest.66d7229aa07a.json.gz +0 -0
  263. codex/static_root/manifest.json +295 -275
  264. codex/static_root/manifest.json.br +0 -0
  265. codex/static_root/manifest.json.gz +0 -0
  266. codex/static_root/staticfiles.json +1 -1
  267. codex/status_controller.py +1 -1
  268. codex/views/admin/flag.py +2 -2
  269. codex/views/admin/group.py +2 -2
  270. codex/views/admin/tasks.py +23 -4
  271. codex/views/admin/user.py +36 -10
  272. codex/views/browser/choices.py +1 -1
  273. codex/views/browser/validate.py +1 -1
  274. codex/views/opds/urls.py +1 -1
  275. codex/views/opds/util.py +1 -1
  276. codex/views/opds/v2/links.py +18 -11
  277. codex/views/public.py +1 -1
  278. codex/views/session.py +2 -1
  279. {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/METADATA +1 -1
  280. {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/RECORD +283 -273
  281. codex/static_root/assets/VCheckbox-CtTi6T7d.87331fa7e77f.js.br +0 -0
  282. codex/static_root/assets/VCheckbox-CtTi6T7d.87331fa7e77f.js.gz +0 -0
  283. codex/static_root/assets/VCheckbox-CtTi6T7d.js.br +0 -0
  284. codex/static_root/assets/VCheckbox-CtTi6T7d.js.gz +0 -0
  285. codex/static_root/assets/VCheckboxBtn-DQafuWTH.dada5e0634ef.js.br +0 -0
  286. codex/static_root/assets/VCheckboxBtn-DQafuWTH.dada5e0634ef.js.gz +0 -0
  287. codex/static_root/assets/VCheckboxBtn-DQafuWTH.js.br +0 -0
  288. codex/static_root/assets/VCheckboxBtn-DQafuWTH.js.gz +0 -0
  289. codex/static_root/assets/VCombobox-C6TX3Dhp.e619423a6463.js.br +0 -0
  290. codex/static_root/assets/VCombobox-C6TX3Dhp.e619423a6463.js.gz +0 -0
  291. codex/static_root/assets/VCombobox-C6TX3Dhp.js.br +0 -0
  292. codex/static_root/assets/VCombobox-C6TX3Dhp.js.gz +0 -0
  293. codex/static_root/assets/VDialog-CknWq2kd.b2d301ec6ac5.js.br +0 -0
  294. codex/static_root/assets/VDialog-CknWq2kd.b2d301ec6ac5.js.gz +0 -0
  295. codex/static_root/assets/VDialog-CknWq2kd.js.br +0 -0
  296. codex/static_root/assets/VDialog-CknWq2kd.js.gz +0 -0
  297. codex/static_root/assets/VDivider-F4DUgr74.62bc92cab97d.js.br +0 -0
  298. codex/static_root/assets/VDivider-F4DUgr74.62bc92cab97d.js.gz +0 -0
  299. codex/static_root/assets/VDivider-F4DUgr74.js.br +0 -0
  300. codex/static_root/assets/VDivider-F4DUgr74.js.gz +0 -0
  301. codex/static_root/assets/VExpansionPanels-CprYUTGT.39b8a50cde43.js.br +0 -0
  302. codex/static_root/assets/VExpansionPanels-CprYUTGT.39b8a50cde43.js.gz +0 -0
  303. codex/static_root/assets/VExpansionPanels-CprYUTGT.js.br +0 -0
  304. codex/static_root/assets/VExpansionPanels-CprYUTGT.js.gz +0 -0
  305. codex/static_root/assets/VForm-DnWAUsrl.4ab0786d658e.js +0 -1
  306. codex/static_root/assets/VForm-DnWAUsrl.4ab0786d658e.js.br +0 -0
  307. codex/static_root/assets/VForm-DnWAUsrl.4ab0786d658e.js.gz +0 -0
  308. codex/static_root/assets/VForm-DnWAUsrl.js +0 -1
  309. codex/static_root/assets/VForm-DnWAUsrl.js.br +0 -0
  310. codex/static_root/assets/VForm-DnWAUsrl.js.gz +0 -0
  311. codex/static_root/assets/VRadioGroup-D71Rszum.befc87b0c476.js.br +0 -0
  312. codex/static_root/assets/VRadioGroup-D71Rszum.befc87b0c476.js.gz +0 -0
  313. codex/static_root/assets/VRadioGroup-D71Rszum.js.br +0 -0
  314. codex/static_root/assets/VRadioGroup-D71Rszum.js.gz +0 -0
  315. codex/static_root/assets/VSelect-CbPDrHNj.4809fbbf00f0.js +0 -1
  316. codex/static_root/assets/VSelect-CbPDrHNj.4809fbbf00f0.js.br +0 -0
  317. codex/static_root/assets/VSelect-CbPDrHNj.4809fbbf00f0.js.gz +0 -0
  318. codex/static_root/assets/VSelect-CbPDrHNj.js +0 -1
  319. codex/static_root/assets/VSelect-CbPDrHNj.js.br +0 -0
  320. codex/static_root/assets/VSelect-CbPDrHNj.js.gz +0 -0
  321. codex/static_root/assets/VSelectionControl-It389cbo.ac75aee480a0.js.br +0 -0
  322. codex/static_root/assets/VSelectionControl-It389cbo.ac75aee480a0.js.gz +0 -0
  323. codex/static_root/assets/VSelectionControl-It389cbo.js.br +0 -0
  324. codex/static_root/assets/VSelectionControl-It389cbo.js.gz +0 -0
  325. codex/static_root/assets/VTable-D9e3lKk6.7cd0760008c7.js.br +0 -0
  326. codex/static_root/assets/VTable-D9e3lKk6.7cd0760008c7.js.gz +0 -0
  327. codex/static_root/assets/VTable-D9e3lKk6.js.br +0 -0
  328. codex/static_root/assets/VTable-D9e3lKk6.js.gz +0 -0
  329. codex/static_root/assets/VWindowItem-B4VZ37cq.e45c5018cc73.js +0 -1
  330. codex/static_root/assets/VWindowItem-B4VZ37cq.e45c5018cc73.js.br +0 -0
  331. codex/static_root/assets/VWindowItem-B4VZ37cq.e45c5018cc73.js.gz +0 -0
  332. codex/static_root/assets/VWindowItem-B4VZ37cq.js +0 -1
  333. codex/static_root/assets/VWindowItem-B4VZ37cq.js.br +0 -0
  334. codex/static_root/assets/VWindowItem-B4VZ37cq.js.gz +0 -0
  335. codex/static_root/assets/admin-Bkd8zuSF.2a29386f3488.js +0 -1
  336. codex/static_root/assets/admin-Bkd8zuSF.2a29386f3488.js.br +0 -0
  337. codex/static_root/assets/admin-Bkd8zuSF.2a29386f3488.js.gz +0 -0
  338. codex/static_root/assets/admin-Bkd8zuSF.js +0 -1
  339. codex/static_root/assets/admin-Bkd8zuSF.js.br +0 -0
  340. codex/static_root/assets/admin-Bkd8zuSF.js.gz +0 -0
  341. codex/static_root/assets/admin-CFTKGwmx.18915c5df4d3.js.br +0 -0
  342. codex/static_root/assets/admin-CFTKGwmx.18915c5df4d3.js.gz +0 -0
  343. codex/static_root/assets/admin-CFTKGwmx.js.br +0 -0
  344. codex/static_root/assets/admin-CFTKGwmx.js.gz +0 -0
  345. codex/static_root/assets/admin-menu-CxZqtPES.7b3a06ce4b92.js.br +0 -0
  346. codex/static_root/assets/admin-menu-CxZqtPES.7b3a06ce4b92.js.gz +0 -0
  347. codex/static_root/assets/admin-menu-CxZqtPES.js.br +0 -0
  348. codex/static_root/assets/admin-menu-CxZqtPES.js.gz +0 -0
  349. codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.8a9d411ee79d.js.br +0 -0
  350. codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.8a9d411ee79d.js.gz +0 -0
  351. codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.js.br +0 -0
  352. codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.js.gz +0 -0
  353. codex/static_root/assets/browser-Br2DgAdi.433cca495d61.js +0 -1
  354. codex/static_root/assets/browser-Br2DgAdi.433cca495d61.js.br +0 -0
  355. codex/static_root/assets/browser-Br2DgAdi.433cca495d61.js.gz +0 -0
  356. codex/static_root/assets/browser-Br2DgAdi.js +0 -1
  357. codex/static_root/assets/browser-Br2DgAdi.js.br +0 -0
  358. codex/static_root/assets/browser-Br2DgAdi.js.gz +0 -0
  359. codex/static_root/assets/change-password-dialog-CSylx5Qb.319466c891c9.js.br +0 -0
  360. codex/static_root/assets/change-password-dialog-CSylx5Qb.319466c891c9.js.gz +0 -0
  361. codex/static_root/assets/change-password-dialog-CSylx5Qb.js.br +0 -0
  362. codex/static_root/assets/change-password-dialog-CSylx5Qb.js.gz +0 -0
  363. codex/static_root/assets/confirm-dialog-Bx2R2vgR.d42b6449c495.js.br +0 -0
  364. codex/static_root/assets/confirm-dialog-Bx2R2vgR.d42b6449c495.js.gz +0 -0
  365. codex/static_root/assets/confirm-dialog-Bx2R2vgR.js.br +0 -0
  366. codex/static_root/assets/confirm-dialog-Bx2R2vgR.js.gz +0 -0
  367. codex/static_root/assets/datetime-column-sOrWMDcU.9ad225af18db.js.br +0 -2
  368. codex/static_root/assets/datetime-column-sOrWMDcU.9ad225af18db.js.gz +0 -0
  369. codex/static_root/assets/datetime-column-sOrWMDcU.js.br +0 -2
  370. codex/static_root/assets/datetime-column-sOrWMDcU.js.gz +0 -0
  371. codex/static_root/assets/filter-SgjvoAvL.094069d6978d.js.br +0 -0
  372. codex/static_root/assets/filter-SgjvoAvL.094069d6978d.js.gz +0 -0
  373. codex/static_root/assets/filter-SgjvoAvL.js.br +0 -0
  374. codex/static_root/assets/filter-SgjvoAvL.js.gz +0 -0
  375. codex/static_root/assets/flag-tab-B_0tGWPg.e46d1782b327.js.br +0 -0
  376. codex/static_root/assets/flag-tab-B_0tGWPg.e46d1782b327.js.gz +0 -0
  377. codex/static_root/assets/flag-tab-B_0tGWPg.js.br +0 -0
  378. codex/static_root/assets/flag-tab-B_0tGWPg.js.gz +0 -0
  379. codex/static_root/assets/forwardRefs-DqbPK1-k.bb9d6863ac16.js.br +0 -0
  380. codex/static_root/assets/forwardRefs-DqbPK1-k.bb9d6863ac16.js.gz +0 -0
  381. codex/static_root/assets/forwardRefs-DqbPK1-k.js.br +0 -0
  382. codex/static_root/assets/forwardRefs-DqbPK1-k.js.gz +0 -0
  383. codex/static_root/assets/group-tab-DXxQUa6C.f1f12f39b167.js +0 -1
  384. codex/static_root/assets/group-tab-DXxQUa6C.f1f12f39b167.js.br +0 -0
  385. codex/static_root/assets/group-tab-DXxQUa6C.f1f12f39b167.js.gz +0 -0
  386. codex/static_root/assets/group-tab-DXxQUa6C.js +0 -1
  387. codex/static_root/assets/group-tab-DXxQUa6C.js.br +0 -0
  388. codex/static_root/assets/group-tab-DXxQUa6C.js.gz +0 -0
  389. codex/static_root/assets/http-error-BVMwwrFo.a7be6a26c9eb.js +0 -1
  390. codex/static_root/assets/http-error-BVMwwrFo.a7be6a26c9eb.js.br +0 -0
  391. codex/static_root/assets/http-error-BVMwwrFo.a7be6a26c9eb.js.gz +0 -0
  392. codex/static_root/assets/http-error-BVMwwrFo.js +0 -1
  393. codex/static_root/assets/http-error-BVMwwrFo.js.br +0 -0
  394. codex/static_root/assets/http-error-BVMwwrFo.js.gz +0 -0
  395. codex/static_root/assets/index-DK0lSHDP.86f18c078fa9.js.br +0 -0
  396. codex/static_root/assets/index-DK0lSHDP.86f18c078fa9.js.gz +0 -0
  397. codex/static_root/assets/index-DK0lSHDP.js.br +0 -0
  398. codex/static_root/assets/index-DK0lSHDP.js.gz +0 -0
  399. codex/static_root/assets/library-tab-NhXuvZ4F.1e8ac3b7c168.js +0 -1
  400. codex/static_root/assets/library-tab-NhXuvZ4F.1e8ac3b7c168.js.br +0 -0
  401. codex/static_root/assets/library-tab-NhXuvZ4F.1e8ac3b7c168.js.gz +0 -0
  402. codex/static_root/assets/library-tab-NhXuvZ4F.js +0 -1
  403. codex/static_root/assets/library-tab-NhXuvZ4F.js.br +0 -0
  404. codex/static_root/assets/library-tab-NhXuvZ4F.js.gz +0 -0
  405. codex/static_root/assets/main-CYgubU7H.50aa39cf9565.js +0 -35
  406. codex/static_root/assets/main-CYgubU7H.50aa39cf9565.js.br +0 -0
  407. codex/static_root/assets/main-CYgubU7H.50aa39cf9565.js.gz +0 -0
  408. codex/static_root/assets/main-CYgubU7H.js +0 -35
  409. codex/static_root/assets/main-CYgubU7H.js.br +0 -0
  410. codex/static_root/assets/main-CYgubU7H.js.gz +0 -0
  411. codex/static_root/assets/pager-full-pdf---TZiAf5.a6269ab85085.js +0 -1
  412. codex/static_root/assets/pager-full-pdf---TZiAf5.a6269ab85085.js.br +0 -0
  413. codex/static_root/assets/pager-full-pdf---TZiAf5.a6269ab85085.js.gz +0 -0
  414. codex/static_root/assets/pager-full-pdf---TZiAf5.js +0 -1
  415. codex/static_root/assets/pager-full-pdf---TZiAf5.js.br +0 -0
  416. codex/static_root/assets/pager-full-pdf---TZiAf5.js.gz +0 -0
  417. codex/static_root/assets/pagination-toolbar-CeWXU_qA.abe0805da1cc.js.br +0 -0
  418. codex/static_root/assets/pagination-toolbar-CeWXU_qA.abe0805da1cc.js.gz +0 -0
  419. codex/static_root/assets/pagination-toolbar-CeWXU_qA.js.br +0 -0
  420. codex/static_root/assets/pagination-toolbar-CeWXU_qA.js.gz +0 -0
  421. codex/static_root/assets/pdf-doc-Dws_otkd.d215eca27da5.js.br +0 -0
  422. codex/static_root/assets/pdf-doc-Dws_otkd.d215eca27da5.js.gz +0 -0
  423. codex/static_root/assets/pdf-doc-Dws_otkd.js.br +0 -0
  424. codex/static_root/assets/pdf-doc-Dws_otkd.js.gz +0 -0
  425. codex/static_root/assets/reader-BCxYgZHF.dde3c4ac39a5.js +0 -2
  426. codex/static_root/assets/reader-BCxYgZHF.dde3c4ac39a5.js.br +0 -0
  427. codex/static_root/assets/reader-BCxYgZHF.dde3c4ac39a5.js.gz +0 -0
  428. codex/static_root/assets/reader-BCxYgZHF.js +0 -2
  429. codex/static_root/assets/reader-BCxYgZHF.js.br +0 -0
  430. codex/static_root/assets/reader-BCxYgZHF.js.gz +0 -0
  431. codex/static_root/assets/relation-chips-DNRRCvrw.b1bc75fb9349.js.br +0 -0
  432. codex/static_root/assets/relation-chips-DNRRCvrw.b1bc75fb9349.js.gz +0 -0
  433. codex/static_root/assets/relation-chips-DNRRCvrw.js.br +0 -0
  434. codex/static_root/assets/relation-chips-DNRRCvrw.js.gz +0 -0
  435. codex/static_root/assets/settings-drawer-BuB29L5p.fe2eeea0058f.js +0 -2
  436. codex/static_root/assets/settings-drawer-BuB29L5p.fe2eeea0058f.js.br +0 -0
  437. codex/static_root/assets/settings-drawer-BuB29L5p.fe2eeea0058f.js.gz +0 -0
  438. codex/static_root/assets/settings-drawer-BuB29L5p.js +0 -2
  439. codex/static_root/assets/settings-drawer-BuB29L5p.js.br +0 -0
  440. codex/static_root/assets/settings-drawer-BuB29L5p.js.gz +0 -0
  441. codex/static_root/assets/stats-tab-D0zymxU6.d5267113b51e.js.br +0 -0
  442. codex/static_root/assets/stats-tab-D0zymxU6.d5267113b51e.js.gz +0 -0
  443. codex/static_root/assets/stats-tab-D0zymxU6.js.br +0 -0
  444. codex/static_root/assets/stats-tab-D0zymxU6.js.gz +0 -0
  445. codex/static_root/assets/task-tab-CI9RLdMS.120f395dc9c6.js +0 -1
  446. codex/static_root/assets/task-tab-CI9RLdMS.120f395dc9c6.js.br +0 -0
  447. codex/static_root/assets/task-tab-CI9RLdMS.120f395dc9c6.js.gz +0 -0
  448. codex/static_root/assets/task-tab-CI9RLdMS.js +0 -1
  449. codex/static_root/assets/task-tab-CI9RLdMS.js.br +0 -0
  450. codex/static_root/assets/task-tab-CI9RLdMS.js.gz +0 -0
  451. codex/static_root/assets/task-tab-DfdUY9Rc.478e74041f80.css +0 -1
  452. codex/static_root/assets/task-tab-DfdUY9Rc.478e74041f80.css.gz +0 -0
  453. codex/static_root/assets/task-tab-DfdUY9Rc.css +0 -1
  454. codex/static_root/assets/task-tab-DfdUY9Rc.css.gz +0 -0
  455. codex/static_root/assets/unauthorized-BNwg_Xvu.a894b96156e0.js +0 -1
  456. codex/static_root/assets/unauthorized-BNwg_Xvu.a894b96156e0.js.br +0 -0
  457. codex/static_root/assets/unauthorized-BNwg_Xvu.a894b96156e0.js.gz +0 -0
  458. codex/static_root/assets/unauthorized-BNwg_Xvu.js +0 -1
  459. codex/static_root/assets/unauthorized-BNwg_Xvu.js.br +0 -0
  460. codex/static_root/assets/unauthorized-BNwg_Xvu.js.gz +0 -0
  461. codex/static_root/assets/user-tab-w9LgIMMi.4a89c7b37486.js +0 -1
  462. codex/static_root/assets/user-tab-w9LgIMMi.4a89c7b37486.js.br +0 -0
  463. codex/static_root/assets/user-tab-w9LgIMMi.4a89c7b37486.js.gz +0 -0
  464. codex/static_root/assets/user-tab-w9LgIMMi.js +0 -1
  465. codex/static_root/assets/user-tab-w9LgIMMi.js.br +0 -0
  466. codex/static_root/assets/user-tab-w9LgIMMi.js.gz +0 -0
  467. codex/static_root/manifest.514e63b9f805.json.br +0 -0
  468. codex/static_root/manifest.514e63b9f805.json.gz +0 -0
  469. {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/LICENSE +0 -0
  470. {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/WHEEL +0 -0
  471. {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1 @@
1
+ """Enums and Choices for models and Seralizers."""
@@ -1,116 +1,7 @@
1
- """Frontend Choices, Defaults and Messages."""
1
+ """Admin Choices."""
2
2
 
3
3
  from types import MappingProxyType
4
4
 
5
- BROWSER_BOOKMARK_FILTER_CHOICES = MappingProxyType(
6
- {
7
- "": "All",
8
- "IN_PROGRESS": "In Progress",
9
- "READ": "Read",
10
- "UNREAD": "Unread",
11
- },
12
- )
13
- BROWSER_ORDER_BY_CHOICES = MappingProxyType(
14
- {
15
- "created_at": "Added Time",
16
- "age_rating": "Age Rating",
17
- "child_count": "Child Count",
18
- "community_rating": "Community Rating",
19
- "critical_rating": "Critical Rating",
20
- "filename": "Filename",
21
- "size": "File Size",
22
- "bookmark_updated_at": "Last Read",
23
- "sort_name": "Name",
24
- "page_count": "Page Count",
25
- "date": "Publish Date",
26
- "search_score": "Search Score",
27
- "story_arc_number": "Story Arc Number",
28
- "updated_at": "Updated Time",
29
- }
30
- )
31
- _GROUP_NAMES = MappingProxyType(
32
- {
33
- "p": "Publishers",
34
- "i": "Imprints",
35
- "s": "Series",
36
- "v": "Volumes",
37
- }
38
- )
39
- BROWSER_TOP_GROUP_CHOICES = MappingProxyType(
40
- {
41
- **_GROUP_NAMES,
42
- "c": "Issues",
43
- "f": "Folders",
44
- "a": "Story Arcs",
45
- },
46
- )
47
- BROWSER_GROUP_CHOICES = MappingProxyType({**BROWSER_TOP_GROUP_CHOICES, "r": "Root"})
48
- VUETIFY_NULL_CODE = -1
49
- BROWSER_CHOICES = MappingProxyType(
50
- {
51
- "bookmark_filter": BROWSER_BOOKMARK_FILTER_CHOICES,
52
- "order_by": BROWSER_ORDER_BY_CHOICES,
53
- "top_group": BROWSER_TOP_GROUP_CHOICES,
54
- "vuetify_null_code": VUETIFY_NULL_CODE,
55
- "settings_group": {**_GROUP_NAMES},
56
- "identifier_types": {
57
- "comicvine": "Comic Vine",
58
- "comixology": "Comixology",
59
- "asin": "Amazon",
60
- "gtin": "GTIN",
61
- "isbn": "ISBN",
62
- "upc": "UPC",
63
- },
64
- }
65
- )
66
-
67
- READER_CHOICES = MappingProxyType(
68
- {
69
- "fit_to": MappingProxyType(
70
- {
71
- "H": "Fit to Height",
72
- "O": "Original Size",
73
- "S": "Fit to Screen",
74
- "W": "Fit to Width",
75
- }
76
- ),
77
- "reading_direction": MappingProxyType(
78
- {
79
- "btt": "Bottom to Top",
80
- "ltr": "Left to Right",
81
- "rtl": "Right to Left",
82
- "ttb": "Top to Bottom",
83
- }
84
- ),
85
- }
86
- )
87
- DEFAULT_BROWSER_ROUTE = MappingProxyType({"group": "r", "pks": (0,), "page": 1})
88
- _DEFAULT_BROWSER_BREADCRUMBS = (DEFAULT_BROWSER_ROUTE,)
89
- _DEFAULT_SHOW = MappingProxyType({"i": False, "p": True, "s": True, "v": False})
90
- BROWSER_DEFAULTS = MappingProxyType(
91
- {
92
- "bookmark_filter": "",
93
- "breadcrumbs": _DEFAULT_BROWSER_BREADCRUMBS,
94
- "custom_covers": True,
95
- "dynamic_covers": True,
96
- "order_by": "sort_name",
97
- "order_reverse": False,
98
- "q": "",
99
- "show": _DEFAULT_SHOW,
100
- "top_group": "p",
101
- "twenty_four_hour_time": False,
102
- }
103
- )
104
- READER_DEFAULTS = MappingProxyType(
105
- {
106
- "finish_on_last_page": True,
107
- "fit_to": "S",
108
- "reading_direction": "ltr",
109
- "read_rtl_in_reverse": False,
110
- "two_pages": False,
111
- }
112
- )
113
-
114
5
  ADMIN_FLAG_CHOICES = MappingProxyType(
115
6
  {
116
7
  "AU": "Auto Update",
@@ -325,21 +216,6 @@ ADMIN_TASK_GROUPS = MappingProxyType(
325
216
  },
326
217
  ],
327
218
  },
328
- {
329
- "title": "Notify",
330
- "tasks": [
331
- {
332
- "value": "notify_library_changed",
333
- "title": "Notify Library Changed ",
334
- "desc": "Signal all clients that the libraries have changed and the browser should fetch new data.",
335
- },
336
- {
337
- "value": "notify_librarian_status",
338
- "title": "Notify Librarian Status",
339
- "desc": "Signal Admin clients to fetch librarian status.",
340
- },
341
- ],
342
- },
343
219
  {
344
220
  "title": "Cleanup",
345
221
  "tasks": [
@@ -386,26 +262,51 @@ ADMIN_TASK_GROUPS = MappingProxyType(
386
262
  },
387
263
  ],
388
264
  },
389
- )
390
- }
391
- )
392
-
393
-
394
- def _group_task_values(groups):
395
- """Extract values into sorted tuple."""
396
- return tuple(
397
- sorted([item["value"] for group in groups["tasks"] for item in group["tasks"]])
398
- )
399
-
400
-
401
- ADMIN_TASKS = _group_task_values(ADMIN_TASK_GROUPS)
402
- WEBSOCKET_MESSAGES = MappingProxyType(
403
- {
404
- "messages": {
405
- "FAILED_IMPORTS": "FAILED_IMPORTS",
406
- "LIBRARY_CHANGED": "LIBRARY_CHANGED",
407
- "LIBRARIAN_STATUS": "LIBRARIAN_STATUS",
408
- }
265
+ {
266
+ "title": "Notify",
267
+ "tasks": [
268
+ {
269
+ "value": "notify_admin_flags_changed",
270
+ "title": "Notify Admin Flags Changed",
271
+ "desc": "Notify all users that admin flags have changed.",
272
+ },
273
+ {
274
+ "value": "notify_bookmark_changed",
275
+ "title": "Notify Bookmark Changed",
276
+ "desc": "Notify only your user that a bookmark changed.",
277
+ },
278
+ {
279
+ "value": "notify_covers_changed",
280
+ "title": "Notify Covers Changed",
281
+ "desc": "Notify all users that covers have changed.",
282
+ },
283
+ {
284
+ "value": "notify_failed_imports_changed",
285
+ "title": "Notify Failed Imports Changed",
286
+ "desc": "Notify admin users that failed imports have changed",
287
+ },
288
+ {
289
+ "value": "notify_groups_changed",
290
+ "title": "Notify Groups Changed",
291
+ "desc": "Notify all users that ACL groups have changed.",
292
+ },
293
+ {
294
+ "value": "notify_library_changed",
295
+ "title": "Notify Library Changed ",
296
+ "desc": "Notify all users libraries have changed.",
297
+ },
298
+ {
299
+ "value": "notify_librarian_status",
300
+ "title": "Notify Librarian Status",
301
+ "desc": "Notify admin users that a librarian job status changed..",
302
+ },
303
+ {
304
+ "value": "notify_users_changed",
305
+ "title": "Notify Users Changed",
306
+ "desc": "Notify one user that their users changed or all users if a user was deleted.",
307
+ },
308
+ ],
309
+ },
310
+ ),
409
311
  }
410
312
  )
411
- DUMMY_NULL_NAME = "_none_"
@@ -0,0 +1,85 @@
1
+ """Browser Choices."""
2
+
3
+ from types import MappingProxyType
4
+
5
+ BROWSER_BOOKMARK_FILTER_CHOICES = MappingProxyType(
6
+ {
7
+ "": "All",
8
+ "IN_PROGRESS": "In Progress",
9
+ "READ": "Read",
10
+ "UNREAD": "Unread",
11
+ },
12
+ )
13
+ BROWSER_ORDER_BY_CHOICES = MappingProxyType(
14
+ {
15
+ "created_at": "Added Time",
16
+ "age_rating": "Age Rating",
17
+ "child_count": "Child Count",
18
+ "community_rating": "Community Rating",
19
+ "critical_rating": "Critical Rating",
20
+ "filename": "Filename",
21
+ "size": "File Size",
22
+ "bookmark_updated_at": "Last Read",
23
+ "sort_name": "Name",
24
+ "page_count": "Page Count",
25
+ "date": "Publish Date",
26
+ "search_score": "Search Score",
27
+ "story_arc_number": "Story Arc Number",
28
+ "updated_at": "Updated Time",
29
+ }
30
+ )
31
+ _GROUP_NAMES = MappingProxyType(
32
+ {
33
+ "p": "Publishers",
34
+ "i": "Imprints",
35
+ "s": "Series",
36
+ "v": "Volumes",
37
+ }
38
+ )
39
+ BROWSER_TOP_GROUP_CHOICES = MappingProxyType(
40
+ {
41
+ **_GROUP_NAMES,
42
+ "c": "Issues",
43
+ "f": "Folders",
44
+ "a": "Story Arcs",
45
+ },
46
+ )
47
+ BROWSER_GROUP_CHOICES = MappingProxyType({**BROWSER_TOP_GROUP_CHOICES, "r": "Root"})
48
+ VUETIFY_NULL_CODE = -1
49
+ BROWSER_CHOICES = MappingProxyType(
50
+ {
51
+ "bookmark_filter": BROWSER_BOOKMARK_FILTER_CHOICES,
52
+ "order_by": BROWSER_ORDER_BY_CHOICES,
53
+ "top_group": BROWSER_TOP_GROUP_CHOICES,
54
+ "vuetify_null_code": VUETIFY_NULL_CODE,
55
+ "settings_group": {**_GROUP_NAMES},
56
+ "identifier_types": {
57
+ "comicvine": "Comic Vine",
58
+ "comixology": "Comixology",
59
+ "asin": "Amazon",
60
+ "gtin": "GTIN",
61
+ "isbn": "ISBN",
62
+ "upc": "UPC",
63
+ },
64
+ }
65
+ )
66
+
67
+ DEFAULT_BROWSER_ROUTE = MappingProxyType({"group": "r", "pks": (0,), "page": 1})
68
+ _DEFAULT_BROWSER_BREADCRUMBS = (DEFAULT_BROWSER_ROUTE,)
69
+ _DEFAULT_SHOW = MappingProxyType({"i": False, "p": True, "s": True, "v": False})
70
+ BROWSER_DEFAULTS = MappingProxyType(
71
+ {
72
+ "bookmark_filter": "",
73
+ "breadcrumbs": _DEFAULT_BROWSER_BREADCRUMBS,
74
+ "custom_covers": True,
75
+ "dynamic_covers": True,
76
+ "order_by": "sort_name",
77
+ "order_reverse": False,
78
+ "q": "",
79
+ "show": _DEFAULT_SHOW,
80
+ "top_group": "p",
81
+ "twenty_four_hour_time": False,
82
+ }
83
+ )
84
+
85
+ DUMMY_NULL_NAME = "_none_"
@@ -8,16 +8,14 @@ from types import MappingProxyType
8
8
 
9
9
  from caseconverter import camelcase
10
10
 
11
- from codex.choices import (
11
+ from codex.choices.admin import (
12
12
  ADMIN_FLAG_CHOICES,
13
13
  ADMIN_STATUS_TITLES,
14
14
  ADMIN_TASK_GROUPS,
15
- BROWSER_CHOICES,
16
- BROWSER_DEFAULTS,
17
- READER_CHOICES,
18
- READER_DEFAULTS,
19
- WEBSOCKET_MESSAGES,
20
15
  )
16
+ from codex.choices.browser import BROWSER_CHOICES, BROWSER_DEFAULTS
17
+ from codex.choices.notifications import Notifications
18
+ from codex.choices.reader import READER_CHOICES, READER_DEFAULTS
21
19
  from codex.serializers.route import RouteSerializer
22
20
 
23
21
  _DEFAULTS = MappingProxyType(
@@ -39,12 +37,11 @@ _MAP_DUMPS = MappingProxyType(
39
37
  "browser-defaults.json": BROWSER_DEFAULTS,
40
38
  "browser-map.json": BROWSER_CHOICES,
41
39
  "reader-map.json": READER_CHOICES,
42
- "websocket-messages.json": WEBSOCKET_MESSAGES,
43
40
  }
44
41
  )
45
42
 
46
43
 
47
- def _to_vuetify_choices(defaults, key, obj_map):
44
+ def _to_vuetify_choices(defaults, key: str, obj_map):
48
45
  """Transform a dict into a list of vuetify choices."""
49
46
  default = defaults.get(key)
50
47
  vuetify_list = []
@@ -59,7 +56,7 @@ def _to_vuetify_choices(defaults, key, obj_map):
59
56
  return vuetify_list
60
57
 
61
58
 
62
- def _json_key(key):
59
+ def _json_key(key: str):
63
60
  """Transform key to json version."""
64
61
  return key if key.upper() == key else camelcase(key)
65
62
 
@@ -80,7 +77,7 @@ def _make_json_serializable(data):
80
77
  return data
81
78
 
82
79
 
83
- def _to_vuetify_dict(fn, data):
80
+ def _to_vuetify_dict(fn: str, data):
84
81
  """Convert mappings to vuetify dict list."""
85
82
  vuetify_data = {}
86
83
  defaults = _DEFAULTS.get(fn) or {}
@@ -93,17 +90,23 @@ def _to_vuetify_dict(fn, data):
93
90
  return vuetify_data
94
91
 
95
92
 
96
- def _dump(parent_path, fn, data, vuetify):
93
+ def _dump(parent_path: Path, fn: str, data, vuetify: bool):
97
94
  """Dump data to json file."""
98
95
  vuetify_data = (
99
96
  _to_vuetify_dict(fn, data) if vuetify else _make_json_serializable(data)
100
97
  )
101
- path = parent_path / Path(fn)
98
+ path = parent_path / fn
102
99
  with path.open("w") as json_file:
103
100
  json.dump(vuetify_data, json_file, indent=2)
104
101
  json_file.write("\n")
105
102
 
106
103
 
104
+ def _make_websocket_messages():
105
+ return MappingProxyType(
106
+ {"messages": {msg.name: msg.value for msg in Notifications}}
107
+ )
108
+
109
+
107
110
  def main():
108
111
  """Dump all files."""
109
112
  import sys
@@ -117,6 +120,9 @@ def main():
117
120
  for fn, data in _MAP_DUMPS.items():
118
121
  _dump(parent_path, fn, data, vuetify=False)
119
122
 
123
+ ws_messages = _make_websocket_messages()
124
+ _dump(parent_path, "websocket-messages.json", ws_messages, vuetify=False)
125
+
120
126
 
121
127
  if __name__ == "__main__":
122
128
  main()
@@ -0,0 +1,16 @@
1
+ """Notification messages."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class Notifications(Enum):
7
+ """Websocket Notifications."""
8
+
9
+ ADMIN_FLAGS = "ADMIN_FLAGS_CHANGED"
10
+ BOOKMARK = "BOOKMARK_CHANGED"
11
+ COVERS = "COVERS_CHANGED"
12
+ FAILED_IMPORTS = "FAILED_IMPORTS"
13
+ GROUPS = "GROUPS_CHANGED"
14
+ LIBRARY = "LIBRARY_CHANGED"
15
+ LIBRARIAN_STATUS = "LIBRARIAN_STATUS"
16
+ USERS = "USERS_CHANGED"
@@ -0,0 +1,33 @@
1
+ """Frontend Choices, Defaults and Messages."""
2
+
3
+ from types import MappingProxyType
4
+
5
+ READER_CHOICES = MappingProxyType(
6
+ {
7
+ "fit_to": MappingProxyType(
8
+ {
9
+ "H": "Fit to Height",
10
+ "O": "Original Size",
11
+ "S": "Fit to Screen",
12
+ "W": "Fit to Width",
13
+ }
14
+ ),
15
+ "reading_direction": MappingProxyType(
16
+ {
17
+ "btt": "Bottom to Top",
18
+ "ltr": "Left to Right",
19
+ "rtl": "Right to Left",
20
+ "ttb": "Top to Bottom",
21
+ }
22
+ ),
23
+ }
24
+ )
25
+ READER_DEFAULTS = MappingProxyType(
26
+ {
27
+ "finish_on_last_page": True,
28
+ "fit_to": "S",
29
+ "reading_direction": "ltr",
30
+ "read_rtl_in_reverse": False,
31
+ "two_pages": False,
32
+ }
33
+ )
codex/exceptions.py CHANGED
@@ -11,7 +11,7 @@ from django.utils.http import urlencode
11
11
  from rest_framework.exceptions import APIException
12
12
  from rest_framework.status import HTTP_303_SEE_OTHER
13
13
 
14
- from codex.choices import DEFAULT_BROWSER_ROUTE
14
+ from codex.choices.browser import DEFAULT_BROWSER_ROUTE
15
15
  from codex.logger.logging import get_logger
16
16
  from codex.serializers.fields.browser import BreadcrumbsField
17
17
  from codex.serializers.route import RouteSerializer
@@ -5,6 +5,7 @@ from django.db.models.expressions import F
5
5
  from django.db.models.functions import Now
6
6
  from django.db.models.query import Q
7
7
 
8
+ from codex.choices.notifications import Notifications
8
9
  from codex.librarian.mp_queue import LIBRARIAN_QUEUE
9
10
  from codex.librarian.notifier.tasks import NotifierTask
10
11
  from codex.models import Bookmark, Comic
@@ -84,7 +85,7 @@ class BookmarkUpdate(GroupACLMixin):
84
85
  def _notify_library_changed(uid):
85
86
  """Notify one user that their library changed."""
86
87
  group = f"user_{uid}"
87
- task = NotifierTask("LIBRARY_CHANGED", group)
88
+ task = NotifierTask(Notifications.BOOKMARK.value, group)
88
89
  LIBRARIAN_QUEUE.put(task)
89
90
 
90
91
  @classmethod
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
 
7
7
  from codex.librarian.covers.create import CoverCreateThread
8
8
  from codex.librarian.covers.status import CoverStatusTypes
9
- from codex.librarian.notifier.tasks import LIBRARY_CHANGED_TASK
9
+ from codex.librarian.notifier.tasks import COVERS_CHANGED_TASK
10
10
  from codex.models import Comic
11
11
  from codex.models.paths import CustomCover
12
12
  from codex.status import Status
@@ -69,7 +69,7 @@ class CoverPurgeThread(CoverCreateThread):
69
69
  self.log.info("Removed entire custom cover cache.")
70
70
  except OSError as exc:
71
71
  self.log.warning(exc)
72
- librarian_queue.put(LIBRARY_CHANGED_TASK)
72
+ librarian_queue.put(COVERS_CHANGED_TASK)
73
73
 
74
74
  def _cleanup_orphan_covers(self, cover_class, cover_root, name):
75
75
  """Remove all orphan cover thumbs."""
@@ -7,7 +7,10 @@ from humanize import naturaldelta
7
7
 
8
8
  from codex.librarian.importer.moved import MovedImporter
9
9
  from codex.librarian.importer.status import ImportStatusTypes
10
- from codex.librarian.notifier.tasks import FAILED_IMPORTS_TASK, LIBRARY_CHANGED_TASK
10
+ from codex.librarian.notifier.tasks import (
11
+ FAILED_IMPORTS_CHANGED_TASK,
12
+ LIBRARY_CHANGED_TASK,
13
+ )
11
14
  from codex.librarian.search.tasks import SearchIndexUpdateTask
12
15
  from codex.librarian.tasks import DelayedTasks
13
16
 
@@ -50,7 +53,7 @@ class ComicImporter(MovedImporter):
50
53
  else:
51
54
  self.log.info("No updates neccissary.")
52
55
  if new_failed_imports:
53
- self.librarian_queue.put(FAILED_IMPORTS_TASK)
56
+ self.librarian_queue.put(FAILED_IMPORTS_CHANGED_TASK)
54
57
 
55
58
  def apply(self):
56
59
  """Bulk import comics."""
@@ -22,6 +22,9 @@ class UpdateMixin(WorkerBaseMixin):
22
22
  def _is_outdated(self):
23
23
  """Is codex outdated."""
24
24
  result = False
25
+ if VERSION is None:
26
+ self.log.warning("Cannot determine installed Codex version.")
27
+ return result
25
28
  ts = Timestamp.objects.get(key=Timestamp.TimestampChoices.CODEX_VERSION.value)
26
29
  latest_version = ts.version
27
30
  versio_latest_version = Version(latest_version)
@@ -2,6 +2,7 @@
2
2
 
3
3
  from dataclasses import dataclass
4
4
 
5
+ from codex.choices.notifications import Notifications
5
6
  from codex.websockets.consumers import ChannelGroups
6
7
 
7
8
 
@@ -13,6 +14,19 @@ class NotifierTask:
13
14
  group: str
14
15
 
15
16
 
16
- LIBRARY_CHANGED_TASK = NotifierTask("LIBRARY_CHANGED", ChannelGroups.ALL.name)
17
- LIBRARIAN_STATUS_TASK = NotifierTask("LIBRARIAN_STATUS", ChannelGroups.ADMIN.name)
18
- FAILED_IMPORTS_TASK = NotifierTask("FAILED_IMPORTS", ChannelGroups.ADMIN.name)
17
+ ADMIN_FLAGS_CHANGED_TASK = NotifierTask(
18
+ Notifications.ADMIN_FLAGS.value, ChannelGroups.ALL.name
19
+ )
20
+ COVERS_CHANGED_TASK = NotifierTask(Notifications.COVERS.value, ChannelGroups.ALL.name)
21
+ FAILED_IMPORTS_CHANGED_TASK = NotifierTask(
22
+ Notifications.FAILED_IMPORTS.value, ChannelGroups.ADMIN.name
23
+ )
24
+ GROUPS_CHANGED_TASK = NotifierTask(Notifications.GROUPS.value, ChannelGroups.ALL.name)
25
+ LIBRARIAN_STATUS_TASK = NotifierTask(
26
+ Notifications.LIBRARIAN_STATUS.value, ChannelGroups.ADMIN.name
27
+ )
28
+ LIBRARY_CHANGED_TASK = NotifierTask(Notifications.LIBRARY.value, ChannelGroups.ALL.name)
29
+ USERS_CHANGED_TASK = NotifierTask(Notifications.USERS.value, ChannelGroups.ALL.name)
30
+ ADMIN_USERS_CHANGED_TASK = NotifierTask(
31
+ Notifications.USERS.value, ChannelGroups.ADMIN.name
32
+ )
@@ -6,11 +6,21 @@ from rest_framework.serializers import (
6
6
  Serializer,
7
7
  )
8
8
 
9
- from codex.choices import ADMIN_TASKS
9
+ from codex.choices.admin import ADMIN_TASK_GROUPS
10
+
11
+ _ADMIN_TASK_CHOICES = tuple(
12
+ sorted(
13
+ [
14
+ item["value"]
15
+ for group in ADMIN_TASK_GROUPS["tasks"]
16
+ for item in group["tasks"]
17
+ ]
18
+ )
19
+ )
10
20
 
11
21
 
12
22
  class AdminLibrarianTaskSerializer(Serializer):
13
23
  """Get tasks from front end."""
14
24
 
15
- task = ChoiceField(choices=ADMIN_TASKS)
25
+ task = ChoiceField(choices=_ADMIN_TASK_CHOICES)
16
26
  library_id = IntegerField(required=False)
@@ -8,7 +8,7 @@ from rest_framework.serializers import (
8
8
  Serializer,
9
9
  )
10
10
 
11
- from codex.choices import BROWSER_ORDER_BY_CHOICES
11
+ from codex.choices.browser import BROWSER_ORDER_BY_CHOICES
12
12
  from codex.serializers.browser.filters import BrowserSettingsFilterInputSerializer
13
13
  from codex.serializers.fields import TimestampField
14
14
  from codex.serializers.fields.browser import BreadcrumbsField, TopGroupField
@@ -8,7 +8,7 @@ from rest_framework.serializers import (
8
8
  ListField,
9
9
  )
10
10
 
11
- from codex.choices import (
11
+ from codex.choices.browser import (
12
12
  BROWSER_BOOKMARK_FILTER_CHOICES,
13
13
  BROWSER_TOP_GROUP_CHOICES,
14
14
  DUMMY_NULL_NAME,
@@ -2,7 +2,7 @@
2
2
 
3
3
  from rest_framework.fields import ChoiceField
4
4
 
5
- from codex.choices import BROWSER_GROUP_CHOICES
5
+ from codex.choices.browser import BROWSER_GROUP_CHOICES
6
6
 
7
7
 
8
8
  class BrowseGroupField(ChoiceField):
@@ -2,7 +2,8 @@
2
2
 
3
3
  from rest_framework.fields import ChoiceField
4
4
 
5
- from codex.choices import BROWSER_DEFAULTS, READER_DEFAULTS
5
+ from codex.choices.browser import BROWSER_DEFAULTS
6
+ from codex.choices.reader import READER_DEFAULTS
6
7
 
7
8
  _SESSION_KEYS = (*READER_DEFAULTS.keys(), *BROWSER_DEFAULTS.keys(), "filters")
8
9
 
@@ -9,7 +9,7 @@ from rest_framework.serializers import (
9
9
  IntegerField,
10
10
  )
11
11
 
12
- from codex.choices import VUETIFY_NULL_CODE
12
+ from codex.choices.browser import VUETIFY_NULL_CODE
13
13
  from codex.logger.logging import get_logger
14
14
 
15
15
  LOG = get_logger(__name__)
codex/startup.py CHANGED
@@ -6,7 +6,7 @@ from django.core.cache import cache
6
6
  from django.db.models import F, Q
7
7
  from django.db.models.functions import Now
8
8
 
9
- from codex.choices import ADMIN_FLAG_CHOICES, ADMIN_STATUS_TITLES
9
+ from codex.choices.admin import ADMIN_FLAG_CHOICES, ADMIN_STATUS_TITLES
10
10
  from codex.db import ensure_db_schema
11
11
  from codex.logger.logging import get_logger
12
12
  from codex.models import AdminFlag, CustomCover, LibrarianStatus, Library, Timestamp
@@ -30,7 +30,7 @@ def ensure_superuser():
30
30
  if RESET_ADMIN or not User.objects.filter(is_superuser=True).exists():
31
31
  admin_user, created = User.objects.update_or_create(
32
32
  username="admin",
33
- defaults={"is_staff": True, "is_superuser": True},
33
+ defaults={"is_staff": True, "is_superuser": True, "is_active": True},
34
34
  )
35
35
  admin_user.set_password("admin")
36
36
  admin_user.save()
@@ -1 +1 @@
1
- import{m as A,V as t}from"./VCheckboxBtn-DQafuWTH.js";import{g as F,u as I,h as l}from"./VSelectionControl-It389cbo.js";import{p as B,o as U,g as R,b as D,bu as M,c as N,u as $,bv as j,a as u,m as r}from"./main-CYgubU7H.js";const q=B({...F(),...U(A(),["inline"])},"VCheckbox"),G=R()({name:"VCheckbox",inheritAttrs:!1,props:q(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(e,c){let{attrs:d,slots:a}=c;const s=D(e,"modelValue"),{isFocused:n,focus:i,blur:m}=I(e),V=M(),b=N(()=>e.id||`checkbox-${V}`);return $(()=>{const[p,v]=j(d),f=l.filterProps(e),k=t.filterProps(e);return u(l,r({class:["v-checkbox",e.class]},p,f,{modelValue:s.value,"onUpdate:modelValue":o=>s.value=o,id:b.value,focused:n.value,style:e.style}),{...a,default:o=>{let{id:h,messagesId:x,isDisabled:P,isReadonly:C,isValid:g}=o;return u(t,r(k,{id:h.value,"aria-describedby":x.value,disabled:P.value,readonly:C.value},v,{error:g.value===!1,modelValue:s.value,"onUpdate:modelValue":y=>s.value=y,onFocus:i,onBlur:m}),a)}})}),{}}});export{G as V};
1
+ import{m as A,V as t}from"./VCheckboxBtn-COaoh3uF.js";import{g as F,u as I,h as l}from"./VSelectionControl-BkZZAsWo.js";import{p as B,o as U,g as R,b as D,bu as M,c as N,u as $,bv as j,a as u,m as r}from"./main-B5uflU6E.js";const q=B({...F(),...U(A(),["inline"])},"VCheckbox"),G=R()({name:"VCheckbox",inheritAttrs:!1,props:q(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(e,c){let{attrs:d,slots:a}=c;const s=D(e,"modelValue"),{isFocused:n,focus:i,blur:m}=I(e),V=M(),b=N(()=>e.id||`checkbox-${V}`);return $(()=>{const[p,v]=j(d),f=l.filterProps(e),k=t.filterProps(e);return u(l,r({class:["v-checkbox",e.class]},p,f,{modelValue:s.value,"onUpdate:modelValue":o=>s.value=o,id:b.value,focused:n.value,style:e.style}),{...a,default:o=>{let{id:h,messagesId:x,isDisabled:P,isReadonly:C,isValid:g}=o;return u(t,r(k,{id:h.value,"aria-describedby":x.value,disabled:P.value,readonly:C.value},v,{error:g.value===!1,modelValue:s.value,"onUpdate:modelValue":y=>s.value=y,onFocus:i,onBlur:m}),a)}})}),{}}});export{G as V};
@@ -1 +1 @@
1
- import{m as A,V as t}from"./VCheckboxBtn-DQafuWTH.js";import{g as F,u as I,h as l}from"./VSelectionControl-It389cbo.js";import{p as B,o as U,g as R,b as D,bu as M,c as N,u as $,bv as j,a as u,m as r}from"./main-CYgubU7H.js";const q=B({...F(),...U(A(),["inline"])},"VCheckbox"),G=R()({name:"VCheckbox",inheritAttrs:!1,props:q(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(e,c){let{attrs:d,slots:a}=c;const s=D(e,"modelValue"),{isFocused:n,focus:i,blur:m}=I(e),V=M(),b=N(()=>e.id||`checkbox-${V}`);return $(()=>{const[p,v]=j(d),f=l.filterProps(e),k=t.filterProps(e);return u(l,r({class:["v-checkbox",e.class]},p,f,{modelValue:s.value,"onUpdate:modelValue":o=>s.value=o,id:b.value,focused:n.value,style:e.style}),{...a,default:o=>{let{id:h,messagesId:x,isDisabled:P,isReadonly:C,isValid:g}=o;return u(t,r(k,{id:h.value,"aria-describedby":x.value,disabled:P.value,readonly:C.value},v,{error:g.value===!1,modelValue:s.value,"onUpdate:modelValue":y=>s.value=y,onFocus:i,onBlur:m}),a)}})}),{}}});export{G as V};
1
+ import{m as A,V as t}from"./VCheckboxBtn-COaoh3uF.js";import{g as F,u as I,h as l}from"./VSelectionControl-BkZZAsWo.js";import{p as B,o as U,g as R,b as D,bu as M,c as N,u as $,bv as j,a as u,m as r}from"./main-B5uflU6E.js";const q=B({...F(),...U(A(),["inline"])},"VCheckbox"),G=R()({name:"VCheckbox",inheritAttrs:!1,props:q(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(e,c){let{attrs:d,slots:a}=c;const s=D(e,"modelValue"),{isFocused:n,focus:i,blur:m}=I(e),V=M(),b=N(()=>e.id||`checkbox-${V}`);return $(()=>{const[p,v]=j(d),f=l.filterProps(e),k=t.filterProps(e);return u(l,r({class:["v-checkbox",e.class]},p,f,{modelValue:s.value,"onUpdate:modelValue":o=>s.value=o,id:b.value,focused:n.value,style:e.style}),{...a,default:o=>{let{id:h,messagesId:x,isDisabled:P,isReadonly:C,isValid:g}=o;return u(t,r(k,{id:h.value,"aria-describedby":x.value,disabled:P.value,readonly:C.value},v,{error:g.value===!1,modelValue:s.value,"onUpdate:modelValue":y=>s.value=y,onFocus:i,onBlur:m}),a)}})}),{}}});export{G as V};