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.
- codex/choices/__init__.py +1 -0
- codex/{choices.py → choices/admin.py} +47 -146
- codex/choices/browser.py +85 -0
- codex/{choices_to_json.py → choices/choices_to_json.py} +18 -12
- codex/choices/notifications.py +16 -0
- codex/choices/reader.py +33 -0
- codex/exceptions.py +1 -1
- codex/librarian/bookmark/update.py +2 -1
- codex/librarian/covers/purge.py +2 -2
- codex/librarian/importer/importer.py +5 -2
- codex/librarian/janitor/update.py +3 -0
- codex/librarian/notifier/tasks.py +17 -3
- codex/serializers/admin/tasks.py +12 -2
- codex/serializers/browser/settings.py +1 -1
- codex/serializers/fields/browser.py +1 -1
- codex/serializers/fields/group.py +1 -1
- codex/serializers/fields/session.py +2 -1
- codex/serializers/fields/vuetify.py +1 -1
- codex/startup.py +2 -2
- codex/static_root/assets/{VCheckbox-CtTi6T7d.87331fa7e77f.js → VCheckbox-CWBDr4kF.6da5bf3a4d90.js} +1 -1
- codex/static_root/assets/VCheckbox-CWBDr4kF.6da5bf3a4d90.js.br +0 -0
- codex/static_root/assets/VCheckbox-CWBDr4kF.6da5bf3a4d90.js.gz +0 -0
- codex/static_root/assets/{VCheckbox-CtTi6T7d.js → VCheckbox-CWBDr4kF.js} +1 -1
- codex/static_root/assets/VCheckbox-CWBDr4kF.js.br +0 -0
- codex/static_root/assets/VCheckbox-CWBDr4kF.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-DQafuWTH.dada5e0634ef.js → VCheckboxBtn-COaoh3uF.fc880a386827.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-COaoh3uF.fc880a386827.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-COaoh3uF.fc880a386827.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-DQafuWTH.js → VCheckboxBtn-COaoh3uF.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-COaoh3uF.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-COaoh3uF.js.gz +0 -0
- codex/static_root/assets/{VCombobox-C6TX3Dhp.e619423a6463.js → VCombobox-DkOruNH0.f30f163ee632.js} +1 -1
- codex/static_root/assets/VCombobox-DkOruNH0.f30f163ee632.js.br +0 -0
- codex/static_root/assets/VCombobox-DkOruNH0.f30f163ee632.js.gz +0 -0
- codex/static_root/assets/{VCombobox-C6TX3Dhp.js → VCombobox-DkOruNH0.js} +1 -1
- codex/static_root/assets/VCombobox-DkOruNH0.js.br +0 -0
- codex/static_root/assets/VCombobox-DkOruNH0.js.gz +0 -0
- codex/static_root/assets/{VDialog-CknWq2kd.b2d301ec6ac5.js → VDialog-Dr7SuC2S.b6ec7df390f4.js} +1 -1
- codex/static_root/assets/VDialog-Dr7SuC2S.b6ec7df390f4.js.br +0 -0
- codex/static_root/assets/VDialog-Dr7SuC2S.b6ec7df390f4.js.gz +0 -0
- codex/static_root/assets/{VDialog-CknWq2kd.js → VDialog-Dr7SuC2S.js} +1 -1
- codex/static_root/assets/VDialog-Dr7SuC2S.js.br +0 -0
- codex/static_root/assets/VDialog-Dr7SuC2S.js.gz +0 -0
- codex/static_root/assets/{VDivider-F4DUgr74.62bc92cab97d.js → VDivider-By4u2EsM.fd5ee9cce906.js} +1 -1
- codex/static_root/assets/VDivider-By4u2EsM.fd5ee9cce906.js.br +0 -0
- codex/static_root/assets/VDivider-By4u2EsM.fd5ee9cce906.js.gz +0 -0
- codex/static_root/assets/{VDivider-F4DUgr74.js → VDivider-By4u2EsM.js} +1 -1
- codex/static_root/assets/VDivider-By4u2EsM.js.br +0 -0
- codex/static_root/assets/VDivider-By4u2EsM.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-CprYUTGT.39b8a50cde43.js → VExpansionPanels-BhO9oj0a.e99bea455c78.js} +1 -1
- codex/static_root/assets/VExpansionPanels-BhO9oj0a.e99bea455c78.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-BhO9oj0a.e99bea455c78.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-CprYUTGT.js → VExpansionPanels-BhO9oj0a.js} +1 -1
- codex/static_root/assets/VExpansionPanels-BhO9oj0a.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-BhO9oj0a.js.gz +0 -0
- codex/static_root/assets/VForm-XhA6T0Lc.70c9c6fcb9e3.js +1 -0
- codex/static_root/assets/VForm-XhA6T0Lc.70c9c6fcb9e3.js.br +0 -0
- codex/static_root/assets/VForm-XhA6T0Lc.70c9c6fcb9e3.js.gz +0 -0
- codex/static_root/assets/VForm-XhA6T0Lc.js +1 -0
- codex/static_root/assets/VForm-XhA6T0Lc.js.br +0 -0
- codex/static_root/assets/VForm-XhA6T0Lc.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-D71Rszum.befc87b0c476.js → VRadioGroup-C1WCG0rO.6ebc88e4f144.js} +1 -1
- codex/static_root/assets/VRadioGroup-C1WCG0rO.6ebc88e4f144.js.br +3 -0
- codex/static_root/assets/VRadioGroup-C1WCG0rO.6ebc88e4f144.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-D71Rszum.js → VRadioGroup-C1WCG0rO.js} +1 -1
- codex/static_root/assets/VRadioGroup-C1WCG0rO.js.br +3 -0
- codex/static_root/assets/VRadioGroup-C1WCG0rO.js.gz +0 -0
- codex/static_root/assets/VSelect-Bbt1vrBg.ec45ee26818a.js +1 -0
- codex/static_root/assets/VSelect-Bbt1vrBg.ec45ee26818a.js.br +0 -0
- codex/static_root/assets/VSelect-Bbt1vrBg.ec45ee26818a.js.gz +0 -0
- codex/static_root/assets/VSelect-Bbt1vrBg.js +1 -0
- codex/static_root/assets/VSelect-Bbt1vrBg.js.br +0 -0
- codex/static_root/assets/VSelect-Bbt1vrBg.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-It389cbo.ac75aee480a0.js → VSelectionControl-BkZZAsWo.ba6eca944e2e.js} +1 -1
- codex/static_root/assets/VSelectionControl-BkZZAsWo.ba6eca944e2e.js.br +0 -0
- codex/static_root/assets/VSelectionControl-BkZZAsWo.ba6eca944e2e.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-It389cbo.js → VSelectionControl-BkZZAsWo.js} +1 -1
- codex/static_root/assets/VSelectionControl-BkZZAsWo.js.br +0 -0
- codex/static_root/assets/VSelectionControl-BkZZAsWo.js.gz +0 -0
- codex/static_root/assets/{VTable-D9e3lKk6.7cd0760008c7.js → VTable-D7P2eIc2.5e94bf2a515b.js} +1 -1
- codex/static_root/assets/VTable-D7P2eIc2.5e94bf2a515b.js.br +0 -0
- codex/static_root/assets/VTable-D7P2eIc2.5e94bf2a515b.js.gz +0 -0
- codex/static_root/assets/{VTable-D9e3lKk6.js → VTable-D7P2eIc2.js} +1 -1
- codex/static_root/assets/VTable-D7P2eIc2.js.br +0 -0
- codex/static_root/assets/VTable-D7P2eIc2.js.gz +0 -0
- codex/static_root/assets/VWindowItem-Dm2szrjK.e77444188aa3.js +1 -0
- codex/static_root/assets/VWindowItem-Dm2szrjK.e77444188aa3.js.br +0 -0
- codex/static_root/assets/VWindowItem-Dm2szrjK.e77444188aa3.js.gz +0 -0
- codex/static_root/assets/VWindowItem-Dm2szrjK.js +1 -0
- codex/static_root/assets/VWindowItem-Dm2szrjK.js.br +0 -0
- codex/static_root/assets/VWindowItem-Dm2szrjK.js.gz +0 -0
- codex/static_root/assets/{admin-CFTKGwmx.18915c5df4d3.js → admin-B4z2nA5P.da0c92500311.js} +1 -1
- codex/static_root/assets/admin-B4z2nA5P.da0c92500311.js.br +0 -0
- codex/static_root/assets/admin-B4z2nA5P.da0c92500311.js.gz +0 -0
- codex/static_root/assets/{admin-CFTKGwmx.js → admin-B4z2nA5P.js} +1 -1
- codex/static_root/assets/admin-B4z2nA5P.js.br +0 -0
- codex/static_root/assets/admin-B4z2nA5P.js.gz +0 -0
- codex/static_root/assets/admin-BhW3PNO0.e444048e548d.js +1 -0
- codex/static_root/assets/admin-BhW3PNO0.e444048e548d.js.br +0 -0
- codex/static_root/assets/admin-BhW3PNO0.e444048e548d.js.gz +0 -0
- codex/static_root/assets/admin-BhW3PNO0.js +1 -0
- codex/static_root/assets/admin-BhW3PNO0.js.br +0 -0
- codex/static_root/assets/admin-BhW3PNO0.js.gz +0 -0
- codex/static_root/assets/{admin-menu-CxZqtPES.7b3a06ce4b92.js → admin-menu-CL7S-xqR.92b6d84c4b70.js} +1 -1
- codex/static_root/assets/admin-menu-CL7S-xqR.92b6d84c4b70.js.br +0 -0
- codex/static_root/assets/admin-menu-CL7S-xqR.92b6d84c4b70.js.gz +0 -0
- codex/static_root/assets/{admin-menu-CxZqtPES.js → admin-menu-CL7S-xqR.js} +1 -1
- codex/static_root/assets/admin-menu-CL7S-xqR.js.br +0 -0
- codex/static_root/assets/admin-menu-CL7S-xqR.js.gz +0 -0
- codex/static_root/assets/{admin-settings-button-progress-D2TfW_5T.8a9d411ee79d.js → admin-settings-button-progress-BgBgdELw.52d052e38bc1.js} +1 -1
- codex/static_root/assets/admin-settings-button-progress-BgBgdELw.52d052e38bc1.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-BgBgdELw.52d052e38bc1.js.gz +0 -0
- codex/static_root/assets/{admin-settings-button-progress-D2TfW_5T.js → admin-settings-button-progress-BgBgdELw.js} +1 -1
- codex/static_root/assets/admin-settings-button-progress-BgBgdELw.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-BgBgdELw.js.gz +0 -0
- codex/static_root/assets/browser-Bi5ov5k8.a4af87c2a667.js +1 -0
- codex/static_root/assets/browser-Bi5ov5k8.a4af87c2a667.js.br +0 -0
- codex/static_root/assets/browser-Bi5ov5k8.a4af87c2a667.js.gz +0 -0
- codex/static_root/assets/browser-Bi5ov5k8.js +1 -0
- codex/static_root/assets/browser-Bi5ov5k8.js.br +0 -0
- codex/static_root/assets/browser-Bi5ov5k8.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-CSylx5Qb.319466c891c9.js → change-password-dialog-BKar2Bhb.3dbc2feb3c5a.js} +1 -1
- codex/static_root/assets/change-password-dialog-BKar2Bhb.3dbc2feb3c5a.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BKar2Bhb.3dbc2feb3c5a.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-CSylx5Qb.js → change-password-dialog-BKar2Bhb.js} +1 -1
- codex/static_root/assets/change-password-dialog-BKar2Bhb.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BKar2Bhb.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-Bx2R2vgR.d42b6449c495.js → confirm-dialog-BoBL4OoS.abef9614fea9.js} +1 -1
- codex/static_root/assets/confirm-dialog-BoBL4OoS.abef9614fea9.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BoBL4OoS.abef9614fea9.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-Bx2R2vgR.js → confirm-dialog-BoBL4OoS.js} +1 -1
- codex/static_root/assets/confirm-dialog-BoBL4OoS.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BoBL4OoS.js.gz +0 -0
- codex/static_root/assets/{datetime-column-sOrWMDcU.9ad225af18db.js → datetime-column-BsiYRUKO.cadd764c06f4.js} +1 -1
- codex/static_root/assets/datetime-column-BsiYRUKO.cadd764c06f4.js.br +0 -0
- codex/static_root/assets/datetime-column-BsiYRUKO.cadd764c06f4.js.gz +0 -0
- codex/static_root/assets/{datetime-column-sOrWMDcU.js → datetime-column-BsiYRUKO.js} +1 -1
- codex/static_root/assets/datetime-column-BsiYRUKO.js.br +0 -0
- codex/static_root/assets/datetime-column-BsiYRUKO.js.gz +0 -0
- codex/static_root/assets/{filter-SgjvoAvL.094069d6978d.js → filter-HnY0knto.07f807227dcc.js} +1 -1
- codex/static_root/assets/filter-HnY0knto.07f807227dcc.js.br +0 -0
- codex/static_root/assets/filter-HnY0knto.07f807227dcc.js.gz +0 -0
- codex/static_root/assets/{filter-SgjvoAvL.js → filter-HnY0knto.js} +1 -1
- codex/static_root/assets/filter-HnY0knto.js.br +0 -0
- codex/static_root/assets/filter-HnY0knto.js.gz +0 -0
- codex/static_root/assets/{flag-tab-B_0tGWPg.e46d1782b327.js → flag-tab-CcS5pve2.a1df5d92e222.js} +1 -1
- codex/static_root/assets/flag-tab-CcS5pve2.a1df5d92e222.js.br +0 -0
- codex/static_root/assets/flag-tab-CcS5pve2.a1df5d92e222.js.gz +0 -0
- codex/static_root/assets/{flag-tab-B_0tGWPg.js → flag-tab-CcS5pve2.js} +1 -1
- codex/static_root/assets/flag-tab-CcS5pve2.js.br +0 -0
- codex/static_root/assets/flag-tab-CcS5pve2.js.gz +0 -0
- codex/static_root/assets/{forwardRefs-DqbPK1-k.bb9d6863ac16.js → forwardRefs-i80xmxX3.db393aeef392.js} +1 -1
- codex/static_root/assets/forwardRefs-i80xmxX3.db393aeef392.js.br +0 -0
- codex/static_root/assets/forwardRefs-i80xmxX3.db393aeef392.js.gz +0 -0
- codex/static_root/assets/{forwardRefs-DqbPK1-k.js → forwardRefs-i80xmxX3.js} +1 -1
- codex/static_root/assets/forwardRefs-i80xmxX3.js.br +0 -0
- codex/static_root/assets/forwardRefs-i80xmxX3.js.gz +0 -0
- codex/static_root/assets/group-tab-SY0gxmHW.f72e944c0ff1.js +1 -0
- codex/static_root/assets/group-tab-SY0gxmHW.f72e944c0ff1.js.br +0 -0
- codex/static_root/assets/group-tab-SY0gxmHW.f72e944c0ff1.js.gz +0 -0
- codex/static_root/assets/group-tab-SY0gxmHW.js +1 -0
- codex/static_root/assets/group-tab-SY0gxmHW.js.br +0 -0
- codex/static_root/assets/group-tab-SY0gxmHW.js.gz +0 -0
- codex/static_root/assets/http-error-EE8gtq5A.07e291d9d955.js +1 -0
- codex/static_root/assets/http-error-EE8gtq5A.07e291d9d955.js.br +0 -0
- codex/static_root/assets/http-error-EE8gtq5A.07e291d9d955.js.gz +0 -0
- codex/static_root/assets/http-error-EE8gtq5A.js +1 -0
- codex/static_root/assets/http-error-EE8gtq5A.js.br +0 -0
- codex/static_root/assets/http-error-EE8gtq5A.js.gz +0 -0
- codex/static_root/assets/{index-DK0lSHDP.86f18c078fa9.js → index-gVdawuuE.a940fadbac00.js} +1 -1
- codex/static_root/assets/index-gVdawuuE.a940fadbac00.js.br +0 -0
- codex/static_root/assets/index-gVdawuuE.a940fadbac00.js.gz +0 -0
- codex/static_root/assets/{index-DK0lSHDP.js → index-gVdawuuE.js} +1 -1
- codex/static_root/assets/index-gVdawuuE.js.br +0 -0
- codex/static_root/assets/index-gVdawuuE.js.gz +0 -0
- codex/static_root/assets/library-tab-BkDIAvyS.4b4c606b77d6.js +1 -0
- codex/static_root/assets/library-tab-BkDIAvyS.4b4c606b77d6.js.br +0 -0
- codex/static_root/assets/library-tab-BkDIAvyS.4b4c606b77d6.js.gz +0 -0
- codex/static_root/assets/library-tab-BkDIAvyS.js +1 -0
- codex/static_root/assets/library-tab-BkDIAvyS.js.br +0 -0
- codex/static_root/assets/library-tab-BkDIAvyS.js.gz +0 -0
- codex/static_root/assets/main-B5uflU6E.77f3fcd6873f.js +35 -0
- codex/static_root/assets/main-B5uflU6E.77f3fcd6873f.js.br +0 -0
- codex/static_root/assets/main-B5uflU6E.77f3fcd6873f.js.gz +0 -0
- codex/static_root/assets/main-B5uflU6E.js +35 -0
- codex/static_root/assets/main-B5uflU6E.js.br +0 -0
- codex/static_root/assets/main-B5uflU6E.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-wuQbceLs.111d9b9d4133.js +1 -0
- codex/static_root/assets/pager-full-pdf-wuQbceLs.111d9b9d4133.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-wuQbceLs.111d9b9d4133.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-wuQbceLs.js +1 -0
- codex/static_root/assets/pager-full-pdf-wuQbceLs.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-wuQbceLs.js.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-CeWXU_qA.abe0805da1cc.js → pagination-toolbar-D3JQmDiD.8513a4db85f0.js} +1 -1
- codex/static_root/assets/pagination-toolbar-D3JQmDiD.8513a4db85f0.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-D3JQmDiD.8513a4db85f0.js.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-CeWXU_qA.js → pagination-toolbar-D3JQmDiD.js} +1 -1
- codex/static_root/assets/pagination-toolbar-D3JQmDiD.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-D3JQmDiD.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-Dws_otkd.d215eca27da5.js → pdf-doc-DRBtl9_2.225a6d89e842.js} +1 -1
- codex/static_root/assets/pdf-doc-DRBtl9_2.225a6d89e842.js.br +0 -0
- codex/static_root/assets/pdf-doc-DRBtl9_2.225a6d89e842.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-Dws_otkd.js → pdf-doc-DRBtl9_2.js} +1 -1
- codex/static_root/assets/pdf-doc-DRBtl9_2.js.br +0 -0
- codex/static_root/assets/pdf-doc-DRBtl9_2.js.gz +0 -0
- codex/static_root/assets/reader-DycvjN42.3e2b4f43235e.js +2 -0
- codex/static_root/assets/reader-DycvjN42.3e2b4f43235e.js.br +0 -0
- codex/static_root/assets/reader-DycvjN42.3e2b4f43235e.js.gz +0 -0
- codex/static_root/assets/reader-DycvjN42.js +2 -0
- codex/static_root/assets/reader-DycvjN42.js.br +0 -0
- codex/static_root/assets/reader-DycvjN42.js.gz +0 -0
- codex/static_root/assets/{relation-chips-DNRRCvrw.js → relation-chips-CeHIEjvZ.04d302f4fa89.js} +1 -1
- codex/static_root/assets/relation-chips-CeHIEjvZ.04d302f4fa89.js.br +0 -0
- codex/static_root/assets/relation-chips-CeHIEjvZ.04d302f4fa89.js.gz +0 -0
- codex/static_root/assets/{relation-chips-DNRRCvrw.b1bc75fb9349.js → relation-chips-CeHIEjvZ.js} +1 -1
- codex/static_root/assets/relation-chips-CeHIEjvZ.js.br +0 -0
- codex/static_root/assets/relation-chips-CeHIEjvZ.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DY8o-jF3.48dfaafaa00e.js +2 -0
- codex/static_root/assets/settings-drawer-DY8o-jF3.48dfaafaa00e.js.br +0 -0
- codex/static_root/assets/settings-drawer-DY8o-jF3.48dfaafaa00e.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DY8o-jF3.js +2 -0
- codex/static_root/assets/settings-drawer-DY8o-jF3.js.br +0 -0
- codex/static_root/assets/settings-drawer-DY8o-jF3.js.gz +0 -0
- codex/static_root/assets/ssrBoot-DRKt_yWP.3b5868abdd61.js +1 -0
- codex/static_root/assets/ssrBoot-DRKt_yWP.3b5868abdd61.js.br +0 -0
- codex/static_root/assets/ssrBoot-DRKt_yWP.3b5868abdd61.js.gz +0 -0
- codex/static_root/assets/ssrBoot-DRKt_yWP.js +1 -0
- codex/static_root/assets/ssrBoot-DRKt_yWP.js.br +0 -0
- codex/static_root/assets/ssrBoot-DRKt_yWP.js.gz +0 -0
- codex/static_root/assets/{stats-tab-D0zymxU6.d5267113b51e.js → stats-tab-C1XYGBKj.812896e1d09c.js} +1 -1
- codex/static_root/assets/stats-tab-C1XYGBKj.812896e1d09c.js.br +0 -0
- codex/static_root/assets/stats-tab-C1XYGBKj.812896e1d09c.js.gz +0 -0
- codex/static_root/assets/{stats-tab-D0zymxU6.js → stats-tab-C1XYGBKj.js} +1 -1
- codex/static_root/assets/stats-tab-C1XYGBKj.js.br +0 -0
- codex/static_root/assets/stats-tab-C1XYGBKj.js.gz +0 -0
- codex/static_root/assets/task-tab-CW4DQ3KN.81812f9208e5.css +1 -0
- codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css.br → task-tab-CW4DQ3KN.81812f9208e5.css.br} +1 -1
- codex/static_root/assets/task-tab-CW4DQ3KN.81812f9208e5.css.gz +0 -0
- codex/static_root/assets/task-tab-CW4DQ3KN.css +1 -0
- codex/static_root/assets/{task-tab-DfdUY9Rc.css.br → task-tab-CW4DQ3KN.css.br} +1 -1
- codex/static_root/assets/task-tab-CW4DQ3KN.css.gz +0 -0
- codex/static_root/assets/task-tab-lFRZ0NMd.6b90f40a1a9f.js +1 -0
- codex/static_root/assets/task-tab-lFRZ0NMd.6b90f40a1a9f.js.br +0 -0
- codex/static_root/assets/task-tab-lFRZ0NMd.6b90f40a1a9f.js.gz +0 -0
- codex/static_root/assets/task-tab-lFRZ0NMd.js +1 -0
- codex/static_root/assets/task-tab-lFRZ0NMd.js.br +0 -0
- codex/static_root/assets/task-tab-lFRZ0NMd.js.gz +0 -0
- codex/static_root/assets/unauthorized-Dld9cV8d.4e675fd9991c.js +1 -0
- codex/static_root/assets/unauthorized-Dld9cV8d.4e675fd9991c.js.br +0 -0
- codex/static_root/assets/unauthorized-Dld9cV8d.4e675fd9991c.js.gz +0 -0
- codex/static_root/assets/unauthorized-Dld9cV8d.js +1 -0
- codex/static_root/assets/unauthorized-Dld9cV8d.js.br +0 -0
- codex/static_root/assets/unauthorized-Dld9cV8d.js.gz +0 -0
- codex/static_root/assets/user-tab-CN9nBOMS.f88d8b1c8afe.js +1 -0
- codex/static_root/assets/user-tab-CN9nBOMS.f88d8b1c8afe.js.br +0 -0
- codex/static_root/assets/user-tab-CN9nBOMS.f88d8b1c8afe.js.gz +0 -0
- codex/static_root/assets/user-tab-CN9nBOMS.js +1 -0
- codex/static_root/assets/user-tab-CN9nBOMS.js.br +0 -0
- codex/static_root/assets/user-tab-CN9nBOMS.js.gz +0 -0
- codex/static_root/{manifest.514e63b9f805.json → manifest.66d7229aa07a.json} +295 -275
- codex/static_root/manifest.66d7229aa07a.json.br +0 -0
- codex/static_root/manifest.66d7229aa07a.json.gz +0 -0
- codex/static_root/manifest.json +295 -275
- codex/static_root/manifest.json.br +0 -0
- codex/static_root/manifest.json.gz +0 -0
- codex/static_root/staticfiles.json +1 -1
- codex/status_controller.py +1 -1
- codex/views/admin/flag.py +2 -2
- codex/views/admin/group.py +2 -2
- codex/views/admin/tasks.py +23 -4
- codex/views/admin/user.py +36 -10
- codex/views/browser/choices.py +1 -1
- codex/views/browser/validate.py +1 -1
- codex/views/opds/urls.py +1 -1
- codex/views/opds/util.py +1 -1
- codex/views/opds/v2/links.py +18 -11
- codex/views/public.py +1 -1
- codex/views/session.py +2 -1
- {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/METADATA +1 -1
- {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/RECORD +283 -273
- codex/static_root/assets/VCheckbox-CtTi6T7d.87331fa7e77f.js.br +0 -0
- codex/static_root/assets/VCheckbox-CtTi6T7d.87331fa7e77f.js.gz +0 -0
- codex/static_root/assets/VCheckbox-CtTi6T7d.js.br +0 -0
- codex/static_root/assets/VCheckbox-CtTi6T7d.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DQafuWTH.dada5e0634ef.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DQafuWTH.dada5e0634ef.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DQafuWTH.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DQafuWTH.js.gz +0 -0
- codex/static_root/assets/VCombobox-C6TX3Dhp.e619423a6463.js.br +0 -0
- codex/static_root/assets/VCombobox-C6TX3Dhp.e619423a6463.js.gz +0 -0
- codex/static_root/assets/VCombobox-C6TX3Dhp.js.br +0 -0
- codex/static_root/assets/VCombobox-C6TX3Dhp.js.gz +0 -0
- codex/static_root/assets/VDialog-CknWq2kd.b2d301ec6ac5.js.br +0 -0
- codex/static_root/assets/VDialog-CknWq2kd.b2d301ec6ac5.js.gz +0 -0
- codex/static_root/assets/VDialog-CknWq2kd.js.br +0 -0
- codex/static_root/assets/VDialog-CknWq2kd.js.gz +0 -0
- codex/static_root/assets/VDivider-F4DUgr74.62bc92cab97d.js.br +0 -0
- codex/static_root/assets/VDivider-F4DUgr74.62bc92cab97d.js.gz +0 -0
- codex/static_root/assets/VDivider-F4DUgr74.js.br +0 -0
- codex/static_root/assets/VDivider-F4DUgr74.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-CprYUTGT.39b8a50cde43.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-CprYUTGT.39b8a50cde43.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-CprYUTGT.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-CprYUTGT.js.gz +0 -0
- codex/static_root/assets/VForm-DnWAUsrl.4ab0786d658e.js +0 -1
- codex/static_root/assets/VForm-DnWAUsrl.4ab0786d658e.js.br +0 -0
- codex/static_root/assets/VForm-DnWAUsrl.4ab0786d658e.js.gz +0 -0
- codex/static_root/assets/VForm-DnWAUsrl.js +0 -1
- codex/static_root/assets/VForm-DnWAUsrl.js.br +0 -0
- codex/static_root/assets/VForm-DnWAUsrl.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-D71Rszum.befc87b0c476.js.br +0 -0
- codex/static_root/assets/VRadioGroup-D71Rszum.befc87b0c476.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-D71Rszum.js.br +0 -0
- codex/static_root/assets/VRadioGroup-D71Rszum.js.gz +0 -0
- codex/static_root/assets/VSelect-CbPDrHNj.4809fbbf00f0.js +0 -1
- codex/static_root/assets/VSelect-CbPDrHNj.4809fbbf00f0.js.br +0 -0
- codex/static_root/assets/VSelect-CbPDrHNj.4809fbbf00f0.js.gz +0 -0
- codex/static_root/assets/VSelect-CbPDrHNj.js +0 -1
- codex/static_root/assets/VSelect-CbPDrHNj.js.br +0 -0
- codex/static_root/assets/VSelect-CbPDrHNj.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-It389cbo.ac75aee480a0.js.br +0 -0
- codex/static_root/assets/VSelectionControl-It389cbo.ac75aee480a0.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-It389cbo.js.br +0 -0
- codex/static_root/assets/VSelectionControl-It389cbo.js.gz +0 -0
- codex/static_root/assets/VTable-D9e3lKk6.7cd0760008c7.js.br +0 -0
- codex/static_root/assets/VTable-D9e3lKk6.7cd0760008c7.js.gz +0 -0
- codex/static_root/assets/VTable-D9e3lKk6.js.br +0 -0
- codex/static_root/assets/VTable-D9e3lKk6.js.gz +0 -0
- codex/static_root/assets/VWindowItem-B4VZ37cq.e45c5018cc73.js +0 -1
- codex/static_root/assets/VWindowItem-B4VZ37cq.e45c5018cc73.js.br +0 -0
- codex/static_root/assets/VWindowItem-B4VZ37cq.e45c5018cc73.js.gz +0 -0
- codex/static_root/assets/VWindowItem-B4VZ37cq.js +0 -1
- codex/static_root/assets/VWindowItem-B4VZ37cq.js.br +0 -0
- codex/static_root/assets/VWindowItem-B4VZ37cq.js.gz +0 -0
- codex/static_root/assets/admin-Bkd8zuSF.2a29386f3488.js +0 -1
- codex/static_root/assets/admin-Bkd8zuSF.2a29386f3488.js.br +0 -0
- codex/static_root/assets/admin-Bkd8zuSF.2a29386f3488.js.gz +0 -0
- codex/static_root/assets/admin-Bkd8zuSF.js +0 -1
- codex/static_root/assets/admin-Bkd8zuSF.js.br +0 -0
- codex/static_root/assets/admin-Bkd8zuSF.js.gz +0 -0
- codex/static_root/assets/admin-CFTKGwmx.18915c5df4d3.js.br +0 -0
- codex/static_root/assets/admin-CFTKGwmx.18915c5df4d3.js.gz +0 -0
- codex/static_root/assets/admin-CFTKGwmx.js.br +0 -0
- codex/static_root/assets/admin-CFTKGwmx.js.gz +0 -0
- codex/static_root/assets/admin-menu-CxZqtPES.7b3a06ce4b92.js.br +0 -0
- codex/static_root/assets/admin-menu-CxZqtPES.7b3a06ce4b92.js.gz +0 -0
- codex/static_root/assets/admin-menu-CxZqtPES.js.br +0 -0
- codex/static_root/assets/admin-menu-CxZqtPES.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.8a9d411ee79d.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.8a9d411ee79d.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-D2TfW_5T.js.gz +0 -0
- codex/static_root/assets/browser-Br2DgAdi.433cca495d61.js +0 -1
- codex/static_root/assets/browser-Br2DgAdi.433cca495d61.js.br +0 -0
- codex/static_root/assets/browser-Br2DgAdi.433cca495d61.js.gz +0 -0
- codex/static_root/assets/browser-Br2DgAdi.js +0 -1
- codex/static_root/assets/browser-Br2DgAdi.js.br +0 -0
- codex/static_root/assets/browser-Br2DgAdi.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-CSylx5Qb.319466c891c9.js.br +0 -0
- codex/static_root/assets/change-password-dialog-CSylx5Qb.319466c891c9.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-CSylx5Qb.js.br +0 -0
- codex/static_root/assets/change-password-dialog-CSylx5Qb.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-Bx2R2vgR.d42b6449c495.js.br +0 -0
- codex/static_root/assets/confirm-dialog-Bx2R2vgR.d42b6449c495.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-Bx2R2vgR.js.br +0 -0
- codex/static_root/assets/confirm-dialog-Bx2R2vgR.js.gz +0 -0
- codex/static_root/assets/datetime-column-sOrWMDcU.9ad225af18db.js.br +0 -2
- codex/static_root/assets/datetime-column-sOrWMDcU.9ad225af18db.js.gz +0 -0
- codex/static_root/assets/datetime-column-sOrWMDcU.js.br +0 -2
- codex/static_root/assets/datetime-column-sOrWMDcU.js.gz +0 -0
- codex/static_root/assets/filter-SgjvoAvL.094069d6978d.js.br +0 -0
- codex/static_root/assets/filter-SgjvoAvL.094069d6978d.js.gz +0 -0
- codex/static_root/assets/filter-SgjvoAvL.js.br +0 -0
- codex/static_root/assets/filter-SgjvoAvL.js.gz +0 -0
- codex/static_root/assets/flag-tab-B_0tGWPg.e46d1782b327.js.br +0 -0
- codex/static_root/assets/flag-tab-B_0tGWPg.e46d1782b327.js.gz +0 -0
- codex/static_root/assets/flag-tab-B_0tGWPg.js.br +0 -0
- codex/static_root/assets/flag-tab-B_0tGWPg.js.gz +0 -0
- codex/static_root/assets/forwardRefs-DqbPK1-k.bb9d6863ac16.js.br +0 -0
- codex/static_root/assets/forwardRefs-DqbPK1-k.bb9d6863ac16.js.gz +0 -0
- codex/static_root/assets/forwardRefs-DqbPK1-k.js.br +0 -0
- codex/static_root/assets/forwardRefs-DqbPK1-k.js.gz +0 -0
- codex/static_root/assets/group-tab-DXxQUa6C.f1f12f39b167.js +0 -1
- codex/static_root/assets/group-tab-DXxQUa6C.f1f12f39b167.js.br +0 -0
- codex/static_root/assets/group-tab-DXxQUa6C.f1f12f39b167.js.gz +0 -0
- codex/static_root/assets/group-tab-DXxQUa6C.js +0 -1
- codex/static_root/assets/group-tab-DXxQUa6C.js.br +0 -0
- codex/static_root/assets/group-tab-DXxQUa6C.js.gz +0 -0
- codex/static_root/assets/http-error-BVMwwrFo.a7be6a26c9eb.js +0 -1
- codex/static_root/assets/http-error-BVMwwrFo.a7be6a26c9eb.js.br +0 -0
- codex/static_root/assets/http-error-BVMwwrFo.a7be6a26c9eb.js.gz +0 -0
- codex/static_root/assets/http-error-BVMwwrFo.js +0 -1
- codex/static_root/assets/http-error-BVMwwrFo.js.br +0 -0
- codex/static_root/assets/http-error-BVMwwrFo.js.gz +0 -0
- codex/static_root/assets/index-DK0lSHDP.86f18c078fa9.js.br +0 -0
- codex/static_root/assets/index-DK0lSHDP.86f18c078fa9.js.gz +0 -0
- codex/static_root/assets/index-DK0lSHDP.js.br +0 -0
- codex/static_root/assets/index-DK0lSHDP.js.gz +0 -0
- codex/static_root/assets/library-tab-NhXuvZ4F.1e8ac3b7c168.js +0 -1
- codex/static_root/assets/library-tab-NhXuvZ4F.1e8ac3b7c168.js.br +0 -0
- codex/static_root/assets/library-tab-NhXuvZ4F.1e8ac3b7c168.js.gz +0 -0
- codex/static_root/assets/library-tab-NhXuvZ4F.js +0 -1
- codex/static_root/assets/library-tab-NhXuvZ4F.js.br +0 -0
- codex/static_root/assets/library-tab-NhXuvZ4F.js.gz +0 -0
- codex/static_root/assets/main-CYgubU7H.50aa39cf9565.js +0 -35
- codex/static_root/assets/main-CYgubU7H.50aa39cf9565.js.br +0 -0
- codex/static_root/assets/main-CYgubU7H.50aa39cf9565.js.gz +0 -0
- codex/static_root/assets/main-CYgubU7H.js +0 -35
- codex/static_root/assets/main-CYgubU7H.js.br +0 -0
- codex/static_root/assets/main-CYgubU7H.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf---TZiAf5.a6269ab85085.js +0 -1
- codex/static_root/assets/pager-full-pdf---TZiAf5.a6269ab85085.js.br +0 -0
- codex/static_root/assets/pager-full-pdf---TZiAf5.a6269ab85085.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf---TZiAf5.js +0 -1
- codex/static_root/assets/pager-full-pdf---TZiAf5.js.br +0 -0
- codex/static_root/assets/pager-full-pdf---TZiAf5.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CeWXU_qA.abe0805da1cc.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-CeWXU_qA.abe0805da1cc.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CeWXU_qA.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-CeWXU_qA.js.gz +0 -0
- codex/static_root/assets/pdf-doc-Dws_otkd.d215eca27da5.js.br +0 -0
- codex/static_root/assets/pdf-doc-Dws_otkd.d215eca27da5.js.gz +0 -0
- codex/static_root/assets/pdf-doc-Dws_otkd.js.br +0 -0
- codex/static_root/assets/pdf-doc-Dws_otkd.js.gz +0 -0
- codex/static_root/assets/reader-BCxYgZHF.dde3c4ac39a5.js +0 -2
- codex/static_root/assets/reader-BCxYgZHF.dde3c4ac39a5.js.br +0 -0
- codex/static_root/assets/reader-BCxYgZHF.dde3c4ac39a5.js.gz +0 -0
- codex/static_root/assets/reader-BCxYgZHF.js +0 -2
- codex/static_root/assets/reader-BCxYgZHF.js.br +0 -0
- codex/static_root/assets/reader-BCxYgZHF.js.gz +0 -0
- codex/static_root/assets/relation-chips-DNRRCvrw.b1bc75fb9349.js.br +0 -0
- codex/static_root/assets/relation-chips-DNRRCvrw.b1bc75fb9349.js.gz +0 -0
- codex/static_root/assets/relation-chips-DNRRCvrw.js.br +0 -0
- codex/static_root/assets/relation-chips-DNRRCvrw.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BuB29L5p.fe2eeea0058f.js +0 -2
- codex/static_root/assets/settings-drawer-BuB29L5p.fe2eeea0058f.js.br +0 -0
- codex/static_root/assets/settings-drawer-BuB29L5p.fe2eeea0058f.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BuB29L5p.js +0 -2
- codex/static_root/assets/settings-drawer-BuB29L5p.js.br +0 -0
- codex/static_root/assets/settings-drawer-BuB29L5p.js.gz +0 -0
- codex/static_root/assets/stats-tab-D0zymxU6.d5267113b51e.js.br +0 -0
- codex/static_root/assets/stats-tab-D0zymxU6.d5267113b51e.js.gz +0 -0
- codex/static_root/assets/stats-tab-D0zymxU6.js.br +0 -0
- codex/static_root/assets/stats-tab-D0zymxU6.js.gz +0 -0
- codex/static_root/assets/task-tab-CI9RLdMS.120f395dc9c6.js +0 -1
- codex/static_root/assets/task-tab-CI9RLdMS.120f395dc9c6.js.br +0 -0
- codex/static_root/assets/task-tab-CI9RLdMS.120f395dc9c6.js.gz +0 -0
- codex/static_root/assets/task-tab-CI9RLdMS.js +0 -1
- codex/static_root/assets/task-tab-CI9RLdMS.js.br +0 -0
- codex/static_root/assets/task-tab-CI9RLdMS.js.gz +0 -0
- codex/static_root/assets/task-tab-DfdUY9Rc.478e74041f80.css +0 -1
- codex/static_root/assets/task-tab-DfdUY9Rc.478e74041f80.css.gz +0 -0
- codex/static_root/assets/task-tab-DfdUY9Rc.css +0 -1
- codex/static_root/assets/task-tab-DfdUY9Rc.css.gz +0 -0
- codex/static_root/assets/unauthorized-BNwg_Xvu.a894b96156e0.js +0 -1
- codex/static_root/assets/unauthorized-BNwg_Xvu.a894b96156e0.js.br +0 -0
- codex/static_root/assets/unauthorized-BNwg_Xvu.a894b96156e0.js.gz +0 -0
- codex/static_root/assets/unauthorized-BNwg_Xvu.js +0 -1
- codex/static_root/assets/unauthorized-BNwg_Xvu.js.br +0 -0
- codex/static_root/assets/unauthorized-BNwg_Xvu.js.gz +0 -0
- codex/static_root/assets/user-tab-w9LgIMMi.4a89c7b37486.js +0 -1
- codex/static_root/assets/user-tab-w9LgIMMi.4a89c7b37486.js.br +0 -0
- codex/static_root/assets/user-tab-w9LgIMMi.4a89c7b37486.js.gz +0 -0
- codex/static_root/assets/user-tab-w9LgIMMi.js +0 -1
- codex/static_root/assets/user-tab-w9LgIMMi.js.br +0 -0
- codex/static_root/assets/user-tab-w9LgIMMi.js.gz +0 -0
- codex/static_root/manifest.514e63b9f805.json.br +0 -0
- codex/static_root/manifest.514e63b9f805.json.gz +0 -0
- {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/LICENSE +0 -0
- {codex-1.7.4.dist-info → codex-1.7.5.dist-info}/WHEEL +0 -0
- {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
|
-
"""
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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_"
|
codex/choices/browser.py
ADDED
|
@@ -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 /
|
|
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"
|
codex/choices/reader.py
ADDED
|
@@ -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(
|
|
88
|
+
task = NotifierTask(Notifications.BOOKMARK.value, group)
|
|
88
89
|
LIBRARIAN_QUEUE.put(task)
|
|
89
90
|
|
|
90
91
|
@classmethod
|
codex/librarian/covers/purge.py
CHANGED
|
@@ -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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
+
)
|
codex/serializers/admin/tasks.py
CHANGED
|
@@ -6,11 +6,21 @@ from rest_framework.serializers import (
|
|
|
6
6
|
Serializer,
|
|
7
7
|
)
|
|
8
8
|
|
|
9
|
-
from codex.choices import
|
|
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=
|
|
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
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from rest_framework.fields import ChoiceField
|
|
4
4
|
|
|
5
|
-
from codex.choices import BROWSER_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
|
|
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()
|
codex/static_root/assets/{VCheckbox-CtTi6T7d.87331fa7e77f.js → VCheckbox-CWBDr4kF.6da5bf3a4d90.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as A,V as t}from"./VCheckboxBtn-
|
|
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};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as A,V as t}from"./VCheckboxBtn-
|
|
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};
|
|
Binary file
|