codex 1.7.9__py3-none-any.whl → 1.7.11a0__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/admin.py +20 -47
- codex/choices/reader.py +3 -3
- codex/db.py +1 -1
- codex/exceptions.py +1 -1
- codex/librarian/bookmark/tasks.py +1 -1
- codex/librarian/covers/status.py +2 -2
- codex/librarian/covers/tasks.py +0 -7
- codex/librarian/cron/crond.py +2 -2
- codex/librarian/importer/link_comics.py +3 -2
- codex/librarian/importer/query_covers.py +1 -1
- codex/librarian/importer/query_fks.py +1 -1
- codex/librarian/importer/status.py +2 -2
- codex/librarian/janitor/integrity.py +1 -1
- codex/librarian/janitor/status.py +2 -2
- codex/librarian/search/status.py +2 -2
- codex/librarian/telemeter/stats.py +1 -1
- codex/librarian/telemeter/telemeter.py +9 -14
- codex/librarian/watchdog/events.py +1 -1
- codex/librarian/watchdog/observers.py +1 -1
- codex/librarian/watchdog/status.py +2 -2
- codex/logger/{logging.py → logger.py} +2 -2
- codex/logger_base.py +1 -1
- codex/middleware.py +1 -1
- codex/migrations/0001_init.py +1 -1
- codex/migrations/0033_alter_librarianstatus_status_type.py +68 -0
- codex/models/admin.py +6 -15
- codex/models/bookmark.py +2 -2
- codex/models/comic.py +4 -4
- codex/models/groups.py +1 -1
- codex/models/named.py +1 -1
- codex/models/paths.py +2 -3
- codex/run.py +1 -1
- codex/serializers/browser/mixins.py +1 -1
- codex/serializers/fields/__init__.py +10 -10
- codex/serializers/fields/auth.py +1 -1
- codex/serializers/fields/browser.py +1 -1
- codex/serializers/fields/stats.py +1 -1
- codex/serializers/fields/vuetify.py +1 -1
- codex/serializers/models/pycountry.py +1 -1
- codex/serializers/opds/v2/progression.py +4 -4
- codex/signals/django_signals.py +1 -1
- codex/signals/os_signals.py +1 -1
- codex/startup.py +4 -8
- codex/static_root/assets/VCheckbox-t1haz9-P.38cb3995b2f3.js +1 -0
- codex/static_root/assets/VCheckbox-t1haz9-P.38cb3995b2f3.js.br +0 -0
- codex/static_root/assets/VCheckbox-t1haz9-P.38cb3995b2f3.js.gz +0 -0
- codex/static_root/assets/VCheckbox-t1haz9-P.js +1 -0
- codex/static_root/assets/VCheckbox-t1haz9-P.js.br +0 -0
- codex/static_root/assets/VCheckbox-t1haz9-P.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-gRk-tQmL.a387d0cc758b.js → VCheckboxBtn-1PexCc2F.ac78c4bfe6bd.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-1PexCc2F.ac78c4bfe6bd.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-1PexCc2F.ac78c4bfe6bd.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-gRk-tQmL.js → VCheckboxBtn-1PexCc2F.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-1PexCc2F.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-1PexCc2F.js.gz +0 -0
- codex/static_root/assets/VCombobox-DpadV2-4.ea605785117d.js +1 -0
- codex/static_root/assets/VCombobox-DpadV2-4.ea605785117d.js.br +0 -0
- codex/static_root/assets/VCombobox-DpadV2-4.ea605785117d.js.gz +0 -0
- codex/static_root/assets/VCombobox-DpadV2-4.js +1 -0
- codex/static_root/assets/VCombobox-DpadV2-4.js.br +0 -0
- codex/static_root/assets/VCombobox-DpadV2-4.js.gz +0 -0
- codex/static_root/assets/VDialog-BR4MrJeK.a2c876dbfac0.js +1 -0
- codex/static_root/assets/VDialog-BR4MrJeK.a2c876dbfac0.js.br +0 -0
- codex/static_root/assets/VDialog-BR4MrJeK.a2c876dbfac0.js.gz +0 -0
- codex/static_root/assets/VDialog-BR4MrJeK.js +1 -0
- codex/static_root/assets/VDialog-BR4MrJeK.js.br +0 -0
- codex/static_root/assets/VDialog-BR4MrJeK.js.gz +0 -0
- codex/static_root/assets/{VDialog-BQWGxOC0.557592e1297d.css → VDialog-DYkXmPin.3991696c6a81.css} +1 -1
- codex/static_root/assets/VDialog-DYkXmPin.3991696c6a81.css.br +0 -0
- codex/static_root/assets/VDialog-DYkXmPin.3991696c6a81.css.gz +0 -0
- codex/static_root/assets/{VDialog-BQWGxOC0.css → VDialog-DYkXmPin.css} +1 -1
- codex/static_root/assets/VDialog-DYkXmPin.css.br +0 -0
- codex/static_root/assets/VDialog-DYkXmPin.css.gz +0 -0
- codex/static_root/assets/VDivider-CGYMLgJf.fbcb910c5e2b.js +1 -0
- codex/static_root/assets/VDivider-CGYMLgJf.fbcb910c5e2b.js.br +0 -0
- codex/static_root/assets/VDivider-CGYMLgJf.fbcb910c5e2b.js.gz +0 -0
- codex/static_root/assets/VDivider-CGYMLgJf.js +1 -0
- codex/static_root/assets/VDivider-CGYMLgJf.js.br +0 -0
- codex/static_root/assets/VDivider-CGYMLgJf.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-_1cO0EuX.1894a1e0b739.js → VExpansionPanels-ape8k2o6.235735bba3cc.js} +1 -1
- codex/static_root/assets/VExpansionPanels-ape8k2o6.235735bba3cc.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-ape8k2o6.235735bba3cc.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-_1cO0EuX.js → VExpansionPanels-ape8k2o6.js} +1 -1
- codex/static_root/assets/VExpansionPanels-ape8k2o6.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-ape8k2o6.js.gz +0 -0
- codex/static_root/assets/VForm-ZManiwIB.a4ee873a7650.js +1 -0
- codex/static_root/assets/VForm-ZManiwIB.a4ee873a7650.js.br +0 -0
- codex/static_root/assets/VForm-ZManiwIB.a4ee873a7650.js.gz +0 -0
- codex/static_root/assets/VForm-ZManiwIB.js +1 -0
- codex/static_root/assets/VForm-ZManiwIB.js.br +0 -0
- codex/static_root/assets/VForm-ZManiwIB.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-BqJIH3Pa.22a036a63862.js +1 -0
- codex/static_root/assets/VRadioGroup-BqJIH3Pa.22a036a63862.js.br +0 -0
- codex/static_root/assets/VRadioGroup-BqJIH3Pa.22a036a63862.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-BqJIH3Pa.js +1 -0
- codex/static_root/assets/VRadioGroup-BqJIH3Pa.js.br +0 -0
- codex/static_root/assets/VRadioGroup-BqJIH3Pa.js.gz +0 -0
- codex/static_root/assets/VSelect-Bi5KABMc.1268bafd6469.js +1 -0
- codex/static_root/assets/VSelect-Bi5KABMc.1268bafd6469.js.br +0 -0
- codex/static_root/assets/VSelect-Bi5KABMc.1268bafd6469.js.gz +0 -0
- codex/static_root/assets/VSelect-Bi5KABMc.js +1 -0
- codex/static_root/assets/VSelect-Bi5KABMc.js.br +0 -0
- codex/static_root/assets/VSelect-Bi5KABMc.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-CRVWANOr.bac2136c7c25.js +1 -0
- codex/static_root/assets/VSelectionControl-CRVWANOr.bac2136c7c25.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CRVWANOr.bac2136c7c25.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-CRVWANOr.js +1 -0
- codex/static_root/assets/VSelectionControl-CRVWANOr.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CRVWANOr.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-DtEh26JD.css +1 -0
- codex/static_root/assets/VSelectionControl-DtEh26JD.css.br +0 -0
- codex/static_root/assets/VSelectionControl-DtEh26JD.css.gz +0 -0
- codex/static_root/assets/VSelectionControl-DtEh26JD.eec621947209.css +1 -0
- codex/static_root/assets/VSelectionControl-DtEh26JD.eec621947209.css.br +0 -0
- codex/static_root/assets/VSelectionControl-DtEh26JD.eec621947209.css.gz +0 -0
- codex/static_root/assets/VTable-DWCA1lvG.1562d6d70dbe.js +1 -0
- codex/static_root/assets/VTable-DWCA1lvG.1562d6d70dbe.js.br +0 -0
- codex/static_root/assets/VTable-DWCA1lvG.1562d6d70dbe.js.gz +0 -0
- codex/static_root/assets/VTable-DWCA1lvG.js +1 -0
- codex/static_root/assets/VTable-DWCA1lvG.js.br +0 -0
- codex/static_root/assets/VTable-DWCA1lvG.js.gz +0 -0
- codex/static_root/assets/{VWindowItem--fSJo-3a.a813df7e5399.js → VWindowItem-DSXaWHkP.89ac2ece629a.js} +1 -1
- codex/static_root/assets/VWindowItem-DSXaWHkP.89ac2ece629a.js.br +0 -0
- codex/static_root/assets/VWindowItem-DSXaWHkP.89ac2ece629a.js.gz +0 -0
- codex/static_root/assets/{VWindowItem--fSJo-3a.js → VWindowItem-DSXaWHkP.js} +1 -1
- codex/static_root/assets/VWindowItem-DSXaWHkP.js.br +0 -0
- codex/static_root/assets/VWindowItem-DSXaWHkP.js.gz +0 -0
- codex/static_root/assets/{admin-DSf9mKpY.b127f911852f.js → admin-Bxwc8451.b2a8c85c5c82.js} +1 -1
- codex/static_root/assets/admin-Bxwc8451.b2a8c85c5c82.js.br +0 -0
- codex/static_root/assets/admin-Bxwc8451.b2a8c85c5c82.js.gz +0 -0
- codex/static_root/assets/{admin-DSf9mKpY.js → admin-Bxwc8451.js} +1 -1
- codex/static_root/assets/admin-Bxwc8451.js.br +0 -0
- codex/static_root/assets/admin-Bxwc8451.js.gz +0 -0
- codex/static_root/assets/{admin-BQnJdQdA.81c79d104ff0.js → admin-C81J8xOG.772d05753583.js} +1 -1
- codex/static_root/assets/admin-C81J8xOG.772d05753583.js.br +0 -0
- codex/static_root/assets/admin-C81J8xOG.772d05753583.js.gz +0 -0
- codex/static_root/assets/{admin-BQnJdQdA.js → admin-C81J8xOG.js} +1 -1
- codex/static_root/assets/admin-C81J8xOG.js.br +0 -0
- codex/static_root/assets/admin-C81J8xOG.js.gz +0 -0
- codex/static_root/assets/admin-menu-Bts5DypF.83389408d5df.js +1 -0
- codex/static_root/assets/admin-menu-Bts5DypF.83389408d5df.js.br +0 -0
- codex/static_root/assets/admin-menu-Bts5DypF.83389408d5df.js.gz +0 -0
- codex/static_root/assets/admin-menu-Bts5DypF.js +1 -0
- codex/static_root/assets/admin-menu-Bts5DypF.js.br +0 -0
- codex/static_root/assets/admin-menu-Bts5DypF.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-CLrIYn4d.cec2cfd322a1.js +1 -0
- codex/static_root/assets/admin-settings-button-progress-CLrIYn4d.cec2cfd322a1.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-CLrIYn4d.cec2cfd322a1.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-CLrIYn4d.js +1 -0
- codex/static_root/assets/admin-settings-button-progress-CLrIYn4d.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-CLrIYn4d.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-XVi7SeHr.435dc945daf1.css +1 -0
- codex/static_root/assets/admin-settings-button-progress-XVi7SeHr.css +1 -0
- codex/static_root/assets/{browser-CECBMxOy.a750213334d5.css → browser-Bf8JG2CE.3af978c1f766.css} +1 -1
- codex/static_root/assets/browser-Bf8JG2CE.3af978c1f766.css.br +0 -0
- codex/static_root/assets/browser-Bf8JG2CE.3af978c1f766.css.gz +0 -0
- codex/static_root/assets/{browser-CECBMxOy.css → browser-Bf8JG2CE.css} +1 -1
- codex/static_root/assets/browser-Bf8JG2CE.css.br +0 -0
- codex/static_root/assets/browser-Bf8JG2CE.css.gz +0 -0
- codex/static_root/assets/browser-yJ6Noi8Y.624ef6fbd20b.js +1 -0
- codex/static_root/assets/browser-yJ6Noi8Y.624ef6fbd20b.js.br +0 -0
- codex/static_root/assets/browser-yJ6Noi8Y.624ef6fbd20b.js.gz +0 -0
- codex/static_root/assets/browser-yJ6Noi8Y.js +1 -0
- codex/static_root/assets/browser-yJ6Noi8Y.js.br +0 -0
- codex/static_root/assets/browser-yJ6Noi8Y.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-DWFtOUJt.18015223f76b.js → change-password-dialog-Bw5_buVm.d199b40591de.js} +1 -1
- codex/static_root/assets/change-password-dialog-Bw5_buVm.d199b40591de.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Bw5_buVm.d199b40591de.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-DWFtOUJt.js → change-password-dialog-Bw5_buVm.js} +1 -1
- codex/static_root/assets/change-password-dialog-Bw5_buVm.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Bw5_buVm.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-CDmsC-9_.cb51658bfb81.js +1 -0
- codex/static_root/assets/confirm-dialog-CDmsC-9_.cb51658bfb81.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CDmsC-9_.cb51658bfb81.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-CDmsC-9_.js +1 -0
- codex/static_root/assets/confirm-dialog-CDmsC-9_.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CDmsC-9_.js.gz +0 -0
- codex/static_root/assets/datetime-column-PBwaoZso.4b7946b97468.js +1 -0
- codex/static_root/assets/datetime-column-PBwaoZso.4b7946b97468.js.br +1 -0
- codex/static_root/assets/datetime-column-PBwaoZso.4b7946b97468.js.gz +0 -0
- codex/static_root/assets/datetime-column-PBwaoZso.js +1 -0
- codex/static_root/assets/datetime-column-PBwaoZso.js.br +1 -0
- codex/static_root/assets/datetime-column-PBwaoZso.js.gz +0 -0
- codex/static_root/assets/filter-D2ELuNq3.2b1c1f24a6b4.js +1 -0
- codex/static_root/assets/filter-D2ELuNq3.2b1c1f24a6b4.js.br +0 -0
- codex/static_root/assets/filter-D2ELuNq3.2b1c1f24a6b4.js.gz +0 -0
- codex/static_root/assets/filter-D2ELuNq3.js +1 -0
- codex/static_root/assets/filter-D2ELuNq3.js.br +0 -0
- codex/static_root/assets/filter-D2ELuNq3.js.gz +0 -0
- codex/static_root/assets/{flag-tab-CqtkOuiR.2c865d108820.js → flag-tab-Bfd3wqbW.eb77780e8a45.js} +1 -1
- codex/static_root/assets/flag-tab-Bfd3wqbW.eb77780e8a45.js.br +0 -0
- codex/static_root/assets/flag-tab-Bfd3wqbW.eb77780e8a45.js.gz +0 -0
- codex/static_root/assets/{flag-tab-CqtkOuiR.js → flag-tab-Bfd3wqbW.js} +1 -1
- codex/static_root/assets/flag-tab-Bfd3wqbW.js.br +0 -0
- codex/static_root/assets/flag-tab-Bfd3wqbW.js.gz +0 -0
- codex/static_root/assets/forwardRefs-Cvn3Vptr.26250646de8c.js +1 -0
- codex/static_root/assets/forwardRefs-Cvn3Vptr.26250646de8c.js.br +0 -0
- codex/static_root/assets/forwardRefs-Cvn3Vptr.26250646de8c.js.gz +0 -0
- codex/static_root/assets/forwardRefs-Cvn3Vptr.js +1 -0
- codex/static_root/assets/forwardRefs-Cvn3Vptr.js.br +0 -0
- codex/static_root/assets/forwardRefs-Cvn3Vptr.js.gz +0 -0
- codex/static_root/assets/{group-tab-zhr0Gxv-.93393ff22310.js → group-tab-J2MqClVb.ff59e8269756.js} +1 -1
- codex/static_root/assets/group-tab-J2MqClVb.ff59e8269756.js.br +0 -0
- codex/static_root/assets/group-tab-J2MqClVb.ff59e8269756.js.gz +0 -0
- codex/static_root/assets/{group-tab-zhr0Gxv-.js → group-tab-J2MqClVb.js} +1 -1
- codex/static_root/assets/group-tab-J2MqClVb.js.br +0 -0
- codex/static_root/assets/group-tab-J2MqClVb.js.gz +0 -0
- codex/static_root/assets/http-error-BYu6Kcz7.9e6d6753260e.js +1 -0
- codex/static_root/assets/http-error-BYu6Kcz7.9e6d6753260e.js.br +0 -0
- codex/static_root/assets/http-error-BYu6Kcz7.9e6d6753260e.js.gz +0 -0
- codex/static_root/assets/http-error-BYu6Kcz7.js +1 -0
- codex/static_root/assets/http-error-BYu6Kcz7.js.br +0 -0
- codex/static_root/assets/http-error-BYu6Kcz7.js.gz +0 -0
- codex/static_root/assets/index-70Ak1yZF.6341f252a26f.js +1 -0
- codex/static_root/assets/index-70Ak1yZF.6341f252a26f.js.br +0 -0
- codex/static_root/assets/index-70Ak1yZF.6341f252a26f.js.gz +0 -0
- codex/static_root/assets/index-70Ak1yZF.js +1 -0
- codex/static_root/assets/index-70Ak1yZF.js.br +0 -0
- codex/static_root/assets/index-70Ak1yZF.js.gz +0 -0
- codex/static_root/assets/library-tab-B5EpvS2Z.ce7f598b989c.js +1 -0
- codex/static_root/assets/library-tab-B5EpvS2Z.ce7f598b989c.js.br +0 -0
- codex/static_root/assets/library-tab-B5EpvS2Z.ce7f598b989c.js.gz +0 -0
- codex/static_root/assets/library-tab-B5EpvS2Z.js +1 -0
- codex/static_root/assets/library-tab-B5EpvS2Z.js.br +0 -0
- codex/static_root/assets/library-tab-B5EpvS2Z.js.gz +0 -0
- codex/static_root/assets/{library-tab-thTonyXr.58b745660d42.css → library-tab-DLpvMqPW.2989f610950b.css} +1 -1
- codex/static_root/assets/library-tab-DLpvMqPW.2989f610950b.css.br +0 -0
- codex/static_root/assets/library-tab-DLpvMqPW.2989f610950b.css.gz +0 -0
- codex/static_root/assets/{library-tab-thTonyXr.css → library-tab-DLpvMqPW.css} +1 -1
- codex/static_root/assets/library-tab-DLpvMqPW.css.br +0 -0
- codex/static_root/assets/library-tab-DLpvMqPW.css.gz +0 -0
- codex/static_root/assets/main-nb_FhQoD.5279ea775ff6.js +35 -0
- codex/static_root/assets/main-nb_FhQoD.5279ea775ff6.js.br +0 -0
- codex/static_root/assets/main-nb_FhQoD.5279ea775ff6.js.gz +0 -0
- codex/static_root/assets/main-nb_FhQoD.js +35 -0
- codex/static_root/assets/main-nb_FhQoD.js.br +0 -0
- codex/static_root/assets/main-nb_FhQoD.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-vSb0Gv-4.015647f33ab1.js +1 -0
- codex/static_root/assets/pager-full-pdf-vSb0Gv-4.015647f33ab1.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-vSb0Gv-4.015647f33ab1.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-vSb0Gv-4.js +1 -0
- codex/static_root/assets/pager-full-pdf-vSb0Gv-4.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-vSb0Gv-4.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-2endB3w1.f94e6a3535e4.js +1 -0
- codex/static_root/assets/pagination-toolbar-2endB3w1.f94e6a3535e4.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-2endB3w1.f94e6a3535e4.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-2endB3w1.js +1 -0
- codex/static_root/assets/pagination-toolbar-2endB3w1.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-2endB3w1.js.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-CpIvhu_T.0e1a1bac9f65.css → pagination-toolbar-CzT9Hc3f.487e647604e2.css} +1 -1
- codex/static_root/assets/pagination-toolbar-CzT9Hc3f.487e647604e2.css.br +0 -0
- codex/static_root/assets/{pagination-toolbar-CpIvhu_T.0e1a1bac9f65.css.gz → pagination-toolbar-CzT9Hc3f.487e647604e2.css.gz} +0 -0
- codex/static_root/assets/{pagination-toolbar-CpIvhu_T.css → pagination-toolbar-CzT9Hc3f.css} +1 -1
- codex/static_root/assets/pagination-toolbar-CzT9Hc3f.css.br +0 -0
- codex/static_root/assets/{pagination-toolbar-CpIvhu_T.css.gz → pagination-toolbar-CzT9Hc3f.css.gz} +0 -0
- codex/static_root/assets/pdf-doc-CW06S-ga.e7c567b9d4cd.js +372 -0
- codex/static_root/assets/pdf-doc-CW06S-ga.e7c567b9d4cd.js.br +0 -0
- codex/static_root/assets/pdf-doc-CW06S-ga.e7c567b9d4cd.js.gz +0 -0
- codex/static_root/assets/pdf-doc-CW06S-ga.js +372 -0
- codex/static_root/assets/pdf-doc-CW06S-ga.js.br +0 -0
- codex/static_root/assets/pdf-doc-CW06S-ga.js.gz +0 -0
- codex/static_root/assets/pdf-doc-DxqOo2k2.42496ffbf35b.css +1 -0
- codex/static_root/assets/pdf-doc-DxqOo2k2.42496ffbf35b.css.br +0 -0
- codex/static_root/assets/pdf-doc-DxqOo2k2.42496ffbf35b.css.gz +0 -0
- codex/static_root/assets/pdf-doc-DxqOo2k2.css +1 -0
- codex/static_root/assets/pdf-doc-DxqOo2k2.css.br +0 -0
- codex/static_root/assets/pdf-doc-DxqOo2k2.css.gz +0 -0
- codex/static_root/assets/{reader-Bcw698_5.b73e2757553f.css → reader-DdWNjEED.97c15f661faf.css} +1 -1
- codex/static_root/assets/reader-DdWNjEED.97c15f661faf.css.br +0 -0
- codex/static_root/assets/reader-DdWNjEED.97c15f661faf.css.gz +0 -0
- codex/static_root/assets/{reader-Bcw698_5.css → reader-DdWNjEED.css} +1 -1
- codex/static_root/assets/reader-DdWNjEED.css.br +0 -0
- codex/static_root/assets/reader-DdWNjEED.css.gz +0 -0
- codex/static_root/assets/{reader-vxxoy39S.js → reader-myd-70jV.2a363255ca47.js} +2 -2
- codex/static_root/assets/reader-myd-70jV.2a363255ca47.js.br +0 -0
- codex/static_root/assets/reader-myd-70jV.2a363255ca47.js.gz +0 -0
- codex/static_root/assets/{reader-vxxoy39S.5a306c3b0f19.js → reader-myd-70jV.js} +2 -2
- codex/static_root/assets/reader-myd-70jV.js.br +0 -0
- codex/static_root/assets/reader-myd-70jV.js.gz +0 -0
- codex/static_root/assets/relation-chips-Bd8Jicbj.35d8fe15b532.js +1 -0
- codex/static_root/assets/relation-chips-Bd8Jicbj.35d8fe15b532.js.br +0 -0
- codex/static_root/assets/relation-chips-Bd8Jicbj.35d8fe15b532.js.gz +0 -0
- codex/static_root/assets/relation-chips-Bd8Jicbj.js +1 -0
- codex/static_root/assets/relation-chips-Bd8Jicbj.js.br +0 -0
- codex/static_root/assets/relation-chips-Bd8Jicbj.js.gz +0 -0
- codex/static_root/assets/{relation-chips-CifZPloM.css → relation-chips-eQkZvJcT.6b52d3f66aed.css} +1 -1
- codex/static_root/assets/relation-chips-eQkZvJcT.6b52d3f66aed.css.br +0 -0
- codex/static_root/assets/relation-chips-eQkZvJcT.6b52d3f66aed.css.gz +0 -0
- codex/static_root/assets/{relation-chips-CifZPloM.e1f40ac9ae8b.css → relation-chips-eQkZvJcT.css} +1 -1
- codex/static_root/assets/relation-chips-eQkZvJcT.css.br +0 -0
- codex/static_root/assets/relation-chips-eQkZvJcT.css.gz +0 -0
- codex/static_root/assets/settings-drawer-DBftv9u0.afd25184f6d8.js +2 -0
- codex/static_root/assets/settings-drawer-DBftv9u0.afd25184f6d8.js.br +0 -0
- codex/static_root/assets/settings-drawer-DBftv9u0.afd25184f6d8.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DBftv9u0.js +2 -0
- codex/static_root/assets/settings-drawer-DBftv9u0.js.br +0 -0
- codex/static_root/assets/settings-drawer-DBftv9u0.js.gz +0 -0
- codex/static_root/assets/{settings-drawer-Bl-6rF9E.7ace6186c209.css → settings-drawer-WyG6HLH-.css} +1 -1
- codex/static_root/assets/settings-drawer-WyG6HLH-.css.br +0 -0
- codex/static_root/assets/settings-drawer-WyG6HLH-.css.gz +0 -0
- codex/static_root/assets/{settings-drawer-Bl-6rF9E.css → settings-drawer-WyG6HLH-.fe251f6d0a75.css} +1 -1
- codex/static_root/assets/settings-drawer-WyG6HLH-.fe251f6d0a75.css.br +0 -0
- codex/static_root/assets/settings-drawer-WyG6HLH-.fe251f6d0a75.css.gz +0 -0
- codex/static_root/assets/{ssrBoot-D0SN4REy.6200754b59d8.js → ssrBoot-B6yWBylJ.27fba7483f5d.js} +1 -1
- codex/static_root/assets/ssrBoot-B6yWBylJ.27fba7483f5d.js.br +0 -0
- codex/static_root/assets/ssrBoot-B6yWBylJ.27fba7483f5d.js.gz +0 -0
- codex/static_root/assets/{ssrBoot-D0SN4REy.js → ssrBoot-B6yWBylJ.js} +1 -1
- codex/static_root/assets/ssrBoot-B6yWBylJ.js.br +0 -0
- codex/static_root/assets/ssrBoot-B6yWBylJ.js.gz +0 -0
- codex/static_root/assets/stats-tab-DC24C65C.58280bd367e1.js +1 -0
- codex/static_root/assets/stats-tab-DC24C65C.58280bd367e1.js.br +0 -0
- codex/static_root/assets/stats-tab-DC24C65C.58280bd367e1.js.gz +0 -0
- codex/static_root/assets/stats-tab-DC24C65C.js +1 -0
- codex/static_root/assets/stats-tab-DC24C65C.js.br +0 -0
- codex/static_root/assets/stats-tab-DC24C65C.js.gz +0 -0
- codex/static_root/assets/task-tab-DI9bXb-m.52aad0736a2b.js +1 -0
- codex/static_root/assets/task-tab-DI9bXb-m.52aad0736a2b.js.br +0 -0
- codex/static_root/assets/task-tab-DI9bXb-m.52aad0736a2b.js.gz +0 -0
- codex/static_root/assets/task-tab-DI9bXb-m.js +1 -0
- codex/static_root/assets/task-tab-DI9bXb-m.js.br +0 -0
- codex/static_root/assets/task-tab-DI9bXb-m.js.gz +0 -0
- codex/static_root/assets/{unauthorized-BJ-YJYOs.6c0a0813ec2e.js → unauthorized-C0p00au3.983dc96cbe2b.js} +1 -1
- codex/static_root/assets/unauthorized-C0p00au3.983dc96cbe2b.js.br +0 -0
- codex/static_root/assets/unauthorized-C0p00au3.983dc96cbe2b.js.gz +0 -0
- codex/static_root/assets/{unauthorized-BJ-YJYOs.js → unauthorized-C0p00au3.js} +1 -1
- codex/static_root/assets/unauthorized-C0p00au3.js.br +0 -0
- codex/static_root/assets/unauthorized-C0p00au3.js.gz +0 -0
- codex/static_root/assets/user-tab-B7e9oz0-.03fd3875c9e3.js +1 -0
- codex/static_root/assets/user-tab-B7e9oz0-.03fd3875c9e3.js.br +0 -0
- codex/static_root/assets/user-tab-B7e9oz0-.03fd3875c9e3.js.gz +0 -0
- codex/static_root/assets/user-tab-B7e9oz0-.js +1 -0
- codex/static_root/assets/user-tab-B7e9oz0-.js.br +0 -0
- codex/static_root/assets/user-tab-B7e9oz0-.js.gz +0 -0
- codex/static_root/manifest.fd580176863a.json +757 -0
- codex/static_root/manifest.fd580176863a.json.br +0 -0
- codex/static_root/manifest.fd580176863a.json.gz +0 -0
- codex/static_root/manifest.json +341 -341
- codex/static_root/manifest.json.br +0 -0
- codex/static_root/manifest.json.gz +0 -0
- codex/static_root/staticfiles.json +1 -1
- codex/templates/pwa/serviceworker-register.js +0 -1
- codex/urls/converters.py +1 -1
- codex/views/admin/flag.py +1 -1
- codex/views/admin/group.py +1 -1
- codex/views/admin/library.py +1 -1
- codex/views/admin/stats.py +1 -1
- codex/views/admin/tasks.py +1 -1
- codex/views/admin/user.py +1 -1
- codex/views/auth.py +1 -1
- codex/views/bookmark.py +2 -2
- codex/views/browser/annotate/bookmark.py +1 -1
- codex/views/browser/annotate/card.py +1 -1
- codex/views/browser/annotate/order.py +1 -1
- codex/views/browser/bookmark.py +1 -1
- codex/views/browser/breadcrumbs.py +5 -3
- codex/views/browser/browser.py +1 -1
- codex/views/browser/choices.py +1 -1
- codex/views/browser/cover.py +1 -1
- codex/views/browser/download.py +1 -1
- codex/views/browser/filters/filter.py +1 -1
- codex/views/browser/filters/search/field/column.py +1 -1
- codex/views/browser/filters/search/field/expression.py +1 -1
- codex/views/browser/filters/search/field/filter.py +1 -1
- codex/views/browser/filters/search/fts.py +1 -1
- codex/views/browser/filters/search/parse.py +2 -2
- codex/views/browser/group_mtime.py +1 -1
- codex/views/browser/metadata/metadata.py +1 -1
- codex/views/browser/mtime.py +1 -1
- codex/views/browser/order_by.py +2 -4
- codex/views/browser/page_in_bounds.py +1 -1
- codex/views/browser/paginate.py +1 -1
- codex/views/browser/validate.py +1 -1
- codex/views/mixins.py +1 -1
- codex/views/opds/v1/entry/entry.py +1 -1
- codex/views/opds/v1/entry/links.py +1 -1
- codex/views/opds/v1/facets.py +2 -5
- codex/views/opds/v1/feed.py +1 -1
- codex/views/opds/v1/links.py +1 -1
- codex/views/opds/v2/feed.py +1 -1
- codex/views/opds/v2/progression.py +1 -1
- codex/views/public.py +1 -1
- codex/views/reader/page.py +1 -1
- codex/views/reader/params.py +1 -1
- codex/views/reader/reader.py +1 -1
- codex/views/session.py +1 -1
- codex/views/timezone.py +1 -1
- codex/websockets/consumers.py +1 -1
- {codex-1.7.9.dist-info → codex-1.7.11a0.dist-info}/METADATA +17 -8
- {codex-1.7.9.dist-info → codex-1.7.11a0.dist-info}/RECORD +394 -393
- {codex-1.7.9.dist-info → codex-1.7.11a0.dist-info}/WHEEL +1 -1
- codex/static_root/assets/VCheckbox-LVWiZ44B.eb8618ce7e3b.js +0 -1
- codex/static_root/assets/VCheckbox-LVWiZ44B.eb8618ce7e3b.js.br +0 -0
- codex/static_root/assets/VCheckbox-LVWiZ44B.eb8618ce7e3b.js.gz +0 -0
- codex/static_root/assets/VCheckbox-LVWiZ44B.js +0 -1
- codex/static_root/assets/VCheckbox-LVWiZ44B.js.br +0 -0
- codex/static_root/assets/VCheckbox-LVWiZ44B.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-gRk-tQmL.a387d0cc758b.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-gRk-tQmL.a387d0cc758b.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-gRk-tQmL.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-gRk-tQmL.js.gz +0 -0
- codex/static_root/assets/VCombobox-jQrh5qob.6c207fd6e025.js +0 -1
- codex/static_root/assets/VCombobox-jQrh5qob.6c207fd6e025.js.br +0 -0
- codex/static_root/assets/VCombobox-jQrh5qob.6c207fd6e025.js.gz +0 -0
- codex/static_root/assets/VCombobox-jQrh5qob.js +0 -1
- codex/static_root/assets/VCombobox-jQrh5qob.js.br +0 -0
- codex/static_root/assets/VCombobox-jQrh5qob.js.gz +0 -0
- codex/static_root/assets/VDialog-BQWGxOC0.557592e1297d.css.br +0 -0
- codex/static_root/assets/VDialog-BQWGxOC0.557592e1297d.css.gz +0 -0
- codex/static_root/assets/VDialog-BQWGxOC0.css.br +0 -0
- codex/static_root/assets/VDialog-BQWGxOC0.css.gz +0 -0
- codex/static_root/assets/VDialog-Z7zDn7KN.3abbe97d56e8.js +0 -1
- codex/static_root/assets/VDialog-Z7zDn7KN.3abbe97d56e8.js.br +0 -0
- codex/static_root/assets/VDialog-Z7zDn7KN.3abbe97d56e8.js.gz +0 -0
- codex/static_root/assets/VDialog-Z7zDn7KN.js +0 -1
- codex/static_root/assets/VDialog-Z7zDn7KN.js.br +0 -0
- codex/static_root/assets/VDialog-Z7zDn7KN.js.gz +0 -0
- codex/static_root/assets/VDivider-Nn4Fa5-R.572a9a554615.js +0 -1
- codex/static_root/assets/VDivider-Nn4Fa5-R.572a9a554615.js.br +0 -0
- codex/static_root/assets/VDivider-Nn4Fa5-R.572a9a554615.js.gz +0 -0
- codex/static_root/assets/VDivider-Nn4Fa5-R.js +0 -1
- codex/static_root/assets/VDivider-Nn4Fa5-R.js.br +0 -0
- codex/static_root/assets/VDivider-Nn4Fa5-R.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-_1cO0EuX.1894a1e0b739.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-_1cO0EuX.1894a1e0b739.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-_1cO0EuX.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-_1cO0EuX.js.gz +0 -0
- codex/static_root/assets/VForm-CVsL2Cxt.7d56b07f9bf7.js +0 -1
- codex/static_root/assets/VForm-CVsL2Cxt.7d56b07f9bf7.js.br +0 -0
- codex/static_root/assets/VForm-CVsL2Cxt.7d56b07f9bf7.js.gz +0 -0
- codex/static_root/assets/VForm-CVsL2Cxt.js +0 -1
- codex/static_root/assets/VForm-CVsL2Cxt.js.br +0 -0
- codex/static_root/assets/VForm-CVsL2Cxt.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-B0OEyAiT.1371f03dda54.js +0 -1
- codex/static_root/assets/VRadioGroup-B0OEyAiT.1371f03dda54.js.br +0 -0
- codex/static_root/assets/VRadioGroup-B0OEyAiT.1371f03dda54.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-B0OEyAiT.js +0 -1
- codex/static_root/assets/VRadioGroup-B0OEyAiT.js.br +0 -0
- codex/static_root/assets/VRadioGroup-B0OEyAiT.js.gz +0 -0
- codex/static_root/assets/VSelect-CyG4ax1z.bf63a0b16754.js +0 -1
- codex/static_root/assets/VSelect-CyG4ax1z.bf63a0b16754.js.br +0 -0
- codex/static_root/assets/VSelect-CyG4ax1z.bf63a0b16754.js.gz +0 -0
- codex/static_root/assets/VSelect-CyG4ax1z.js +0 -1
- codex/static_root/assets/VSelect-CyG4ax1z.js.br +0 -0
- codex/static_root/assets/VSelect-CyG4ax1z.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css +0 -1
- codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css.br +0 -0
- codex/static_root/assets/VSelectionControl-DPpfgCW2.cc18de4e83f6.css.gz +0 -0
- codex/static_root/assets/VSelectionControl-DPpfgCW2.css +0 -1
- codex/static_root/assets/VSelectionControl-DPpfgCW2.css.br +0 -0
- codex/static_root/assets/VSelectionControl-DPpfgCW2.css.gz +0 -0
- codex/static_root/assets/VSelectionControl-dirzqbsX.4027f5ec6485.js +0 -1
- codex/static_root/assets/VSelectionControl-dirzqbsX.4027f5ec6485.js.br +0 -0
- codex/static_root/assets/VSelectionControl-dirzqbsX.4027f5ec6485.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-dirzqbsX.js +0 -1
- codex/static_root/assets/VSelectionControl-dirzqbsX.js.br +0 -0
- codex/static_root/assets/VSelectionControl-dirzqbsX.js.gz +0 -0
- codex/static_root/assets/VTable-C5cDzOH4.18cd77d58541.js +0 -1
- codex/static_root/assets/VTable-C5cDzOH4.18cd77d58541.js.br +0 -0
- codex/static_root/assets/VTable-C5cDzOH4.18cd77d58541.js.gz +0 -0
- codex/static_root/assets/VTable-C5cDzOH4.js +0 -1
- codex/static_root/assets/VTable-C5cDzOH4.js.br +0 -0
- codex/static_root/assets/VTable-C5cDzOH4.js.gz +0 -0
- codex/static_root/assets/VWindowItem--fSJo-3a.a813df7e5399.js.br +0 -0
- codex/static_root/assets/VWindowItem--fSJo-3a.a813df7e5399.js.gz +0 -0
- codex/static_root/assets/VWindowItem--fSJo-3a.js.br +0 -0
- codex/static_root/assets/VWindowItem--fSJo-3a.js.gz +0 -0
- codex/static_root/assets/admin-BQnJdQdA.81c79d104ff0.js.br +0 -0
- codex/static_root/assets/admin-BQnJdQdA.81c79d104ff0.js.gz +0 -0
- codex/static_root/assets/admin-BQnJdQdA.js.br +0 -0
- codex/static_root/assets/admin-BQnJdQdA.js.gz +0 -0
- codex/static_root/assets/admin-DSf9mKpY.b127f911852f.js.br +0 -0
- codex/static_root/assets/admin-DSf9mKpY.b127f911852f.js.gz +0 -0
- codex/static_root/assets/admin-DSf9mKpY.js.br +0 -0
- codex/static_root/assets/admin-DSf9mKpY.js.gz +0 -0
- codex/static_root/assets/admin-menu-CKCjLT04.51b56cb91f67.js +0 -1
- codex/static_root/assets/admin-menu-CKCjLT04.51b56cb91f67.js.br +0 -0
- codex/static_root/assets/admin-menu-CKCjLT04.51b56cb91f67.js.gz +0 -0
- codex/static_root/assets/admin-menu-CKCjLT04.js +0 -1
- codex/static_root/assets/admin-menu-CKCjLT04.js.br +0 -0
- codex/static_root/assets/admin-menu-CKCjLT04.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-BGB22oTD.2548c49a853e.css +0 -1
- codex/static_root/assets/admin-settings-button-progress-BGB22oTD.css +0 -1
- codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.210930191fa0.js +0 -1
- codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.210930191fa0.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.210930191fa0.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.js +0 -1
- codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-Dsj9f3z2.js.gz +0 -0
- codex/static_root/assets/browser-CECBMxOy.a750213334d5.css.br +0 -0
- codex/static_root/assets/browser-CECBMxOy.a750213334d5.css.gz +0 -0
- codex/static_root/assets/browser-CECBMxOy.css.br +0 -0
- codex/static_root/assets/browser-CECBMxOy.css.gz +0 -0
- codex/static_root/assets/browser-zmau8SdP.62ab5052ac3c.js +0 -1
- codex/static_root/assets/browser-zmau8SdP.62ab5052ac3c.js.br +0 -0
- codex/static_root/assets/browser-zmau8SdP.62ab5052ac3c.js.gz +0 -0
- codex/static_root/assets/browser-zmau8SdP.js +0 -1
- codex/static_root/assets/browser-zmau8SdP.js.br +0 -0
- codex/static_root/assets/browser-zmau8SdP.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-DWFtOUJt.18015223f76b.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DWFtOUJt.18015223f76b.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-DWFtOUJt.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DWFtOUJt.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-Blv3xlBT.2671b8037712.js +0 -1
- codex/static_root/assets/confirm-dialog-Blv3xlBT.2671b8037712.js.br +0 -0
- codex/static_root/assets/confirm-dialog-Blv3xlBT.2671b8037712.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-Blv3xlBT.js +0 -1
- codex/static_root/assets/confirm-dialog-Blv3xlBT.js.br +0 -0
- codex/static_root/assets/confirm-dialog-Blv3xlBT.js.gz +0 -0
- codex/static_root/assets/datetime-column-DOcyrUSv.66a2bc8ebff0.js +0 -1
- codex/static_root/assets/datetime-column-DOcyrUSv.66a2bc8ebff0.js.br +0 -3
- codex/static_root/assets/datetime-column-DOcyrUSv.66a2bc8ebff0.js.gz +0 -0
- codex/static_root/assets/datetime-column-DOcyrUSv.js +0 -1
- codex/static_root/assets/datetime-column-DOcyrUSv.js.br +0 -3
- codex/static_root/assets/datetime-column-DOcyrUSv.js.gz +0 -0
- codex/static_root/assets/filter-DZR8HlwW.3fa01f2d0459.js +0 -1
- codex/static_root/assets/filter-DZR8HlwW.3fa01f2d0459.js.br +0 -0
- codex/static_root/assets/filter-DZR8HlwW.3fa01f2d0459.js.gz +0 -0
- codex/static_root/assets/filter-DZR8HlwW.js +0 -1
- codex/static_root/assets/filter-DZR8HlwW.js.br +0 -0
- codex/static_root/assets/filter-DZR8HlwW.js.gz +0 -0
- codex/static_root/assets/flag-tab-CqtkOuiR.2c865d108820.js.br +0 -0
- codex/static_root/assets/flag-tab-CqtkOuiR.2c865d108820.js.gz +0 -0
- codex/static_root/assets/flag-tab-CqtkOuiR.js.br +0 -0
- codex/static_root/assets/flag-tab-CqtkOuiR.js.gz +0 -0
- codex/static_root/assets/forwardRefs--sLajfbv.8fdce7299c72.js +0 -1
- codex/static_root/assets/forwardRefs--sLajfbv.8fdce7299c72.js.br +0 -0
- codex/static_root/assets/forwardRefs--sLajfbv.8fdce7299c72.js.gz +0 -0
- codex/static_root/assets/forwardRefs--sLajfbv.js +0 -1
- codex/static_root/assets/forwardRefs--sLajfbv.js.br +0 -0
- codex/static_root/assets/forwardRefs--sLajfbv.js.gz +0 -0
- codex/static_root/assets/group-tab-zhr0Gxv-.93393ff22310.js.br +0 -0
- codex/static_root/assets/group-tab-zhr0Gxv-.93393ff22310.js.gz +0 -0
- codex/static_root/assets/group-tab-zhr0Gxv-.js.br +0 -0
- codex/static_root/assets/group-tab-zhr0Gxv-.js.gz +0 -0
- codex/static_root/assets/http-error-BqTrEaZd.248d35eeef8f.js +0 -1
- codex/static_root/assets/http-error-BqTrEaZd.248d35eeef8f.js.br +0 -0
- codex/static_root/assets/http-error-BqTrEaZd.248d35eeef8f.js.gz +0 -0
- codex/static_root/assets/http-error-BqTrEaZd.js +0 -1
- codex/static_root/assets/http-error-BqTrEaZd.js.br +0 -0
- codex/static_root/assets/http-error-BqTrEaZd.js.gz +0 -0
- codex/static_root/assets/index-CJNrYOQJ.c5c902cfc3c3.js +0 -1
- codex/static_root/assets/index-CJNrYOQJ.c5c902cfc3c3.js.br +0 -0
- codex/static_root/assets/index-CJNrYOQJ.c5c902cfc3c3.js.gz +0 -0
- codex/static_root/assets/index-CJNrYOQJ.js +0 -1
- codex/static_root/assets/index-CJNrYOQJ.js.br +0 -0
- codex/static_root/assets/index-CJNrYOQJ.js.gz +0 -0
- codex/static_root/assets/library-tab-Dhvdk6l9.0575d2955138.js +0 -1
- codex/static_root/assets/library-tab-Dhvdk6l9.0575d2955138.js.br +0 -0
- codex/static_root/assets/library-tab-Dhvdk6l9.0575d2955138.js.gz +0 -0
- codex/static_root/assets/library-tab-Dhvdk6l9.js +0 -1
- codex/static_root/assets/library-tab-Dhvdk6l9.js.br +0 -0
- codex/static_root/assets/library-tab-Dhvdk6l9.js.gz +0 -0
- codex/static_root/assets/library-tab-thTonyXr.58b745660d42.css.br +0 -0
- codex/static_root/assets/library-tab-thTonyXr.58b745660d42.css.gz +0 -0
- codex/static_root/assets/library-tab-thTonyXr.css.br +0 -0
- codex/static_root/assets/library-tab-thTonyXr.css.gz +0 -0
- codex/static_root/assets/main-B0XsokNO.34ba83f18255.js +0 -35
- codex/static_root/assets/main-B0XsokNO.34ba83f18255.js.br +0 -0
- codex/static_root/assets/main-B0XsokNO.34ba83f18255.js.gz +0 -0
- codex/static_root/assets/main-B0XsokNO.js +0 -35
- codex/static_root/assets/main-B0XsokNO.js.br +0 -0
- codex/static_root/assets/main-B0XsokNO.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf--ImbPFNz.5396f602799c.js +0 -1
- codex/static_root/assets/pager-full-pdf--ImbPFNz.5396f602799c.js.br +0 -0
- codex/static_root/assets/pager-full-pdf--ImbPFNz.5396f602799c.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf--ImbPFNz.js +0 -1
- codex/static_root/assets/pager-full-pdf--ImbPFNz.js.br +0 -0
- codex/static_root/assets/pager-full-pdf--ImbPFNz.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CPK5eUAA.fe243c256d1d.js +0 -1
- codex/static_root/assets/pagination-toolbar-CPK5eUAA.fe243c256d1d.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-CPK5eUAA.fe243c256d1d.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CPK5eUAA.js +0 -1
- codex/static_root/assets/pagination-toolbar-CPK5eUAA.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-CPK5eUAA.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CpIvhu_T.0e1a1bac9f65.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-CpIvhu_T.css.br +0 -0
- codex/static_root/assets/pdf-doc-4bYH6sHd.935dcd9613fa.js +0 -348
- codex/static_root/assets/pdf-doc-4bYH6sHd.935dcd9613fa.js.br +0 -0
- codex/static_root/assets/pdf-doc-4bYH6sHd.935dcd9613fa.js.gz +0 -0
- codex/static_root/assets/pdf-doc-4bYH6sHd.js +0 -348
- codex/static_root/assets/pdf-doc-4bYH6sHd.js.br +0 -0
- codex/static_root/assets/pdf-doc-4bYH6sHd.js.gz +0 -0
- codex/static_root/assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css +0 -1
- codex/static_root/assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css.br +0 -1
- codex/static_root/assets/pdf-doc-B4cGW_Hl.b94aac7e3313.css.gz +0 -0
- codex/static_root/assets/pdf-doc-B4cGW_Hl.css +0 -1
- codex/static_root/assets/pdf-doc-B4cGW_Hl.css.br +0 -1
- codex/static_root/assets/pdf-doc-B4cGW_Hl.css.gz +0 -0
- codex/static_root/assets/reader-Bcw698_5.b73e2757553f.css.br +0 -0
- codex/static_root/assets/reader-Bcw698_5.b73e2757553f.css.gz +0 -0
- codex/static_root/assets/reader-Bcw698_5.css.br +0 -0
- codex/static_root/assets/reader-Bcw698_5.css.gz +0 -0
- codex/static_root/assets/reader-vxxoy39S.5a306c3b0f19.js.br +0 -0
- codex/static_root/assets/reader-vxxoy39S.5a306c3b0f19.js.gz +0 -0
- codex/static_root/assets/reader-vxxoy39S.js.br +0 -0
- codex/static_root/assets/reader-vxxoy39S.js.gz +0 -0
- codex/static_root/assets/relation-chips-CifZPloM.css.br +0 -0
- codex/static_root/assets/relation-chips-CifZPloM.css.gz +0 -0
- codex/static_root/assets/relation-chips-CifZPloM.e1f40ac9ae8b.css.br +0 -0
- codex/static_root/assets/relation-chips-CifZPloM.e1f40ac9ae8b.css.gz +0 -0
- codex/static_root/assets/relation-chips-DcMagp92.717b74d488c5.js +0 -1
- codex/static_root/assets/relation-chips-DcMagp92.717b74d488c5.js.br +0 -0
- codex/static_root/assets/relation-chips-DcMagp92.717b74d488c5.js.gz +0 -0
- codex/static_root/assets/relation-chips-DcMagp92.js +0 -1
- codex/static_root/assets/relation-chips-DcMagp92.js.br +0 -0
- codex/static_root/assets/relation-chips-DcMagp92.js.gz +0 -0
- codex/static_root/assets/settings-drawer-Bl-6rF9E.7ace6186c209.css.br +0 -0
- codex/static_root/assets/settings-drawer-Bl-6rF9E.7ace6186c209.css.gz +0 -0
- codex/static_root/assets/settings-drawer-Bl-6rF9E.css.br +0 -0
- codex/static_root/assets/settings-drawer-Bl-6rF9E.css.gz +0 -0
- codex/static_root/assets/settings-drawer-CtD2JCdS.b8ebde9f153d.js +0 -2
- codex/static_root/assets/settings-drawer-CtD2JCdS.b8ebde9f153d.js.br +0 -0
- codex/static_root/assets/settings-drawer-CtD2JCdS.b8ebde9f153d.js.gz +0 -0
- codex/static_root/assets/settings-drawer-CtD2JCdS.js +0 -2
- codex/static_root/assets/settings-drawer-CtD2JCdS.js.br +0 -0
- codex/static_root/assets/settings-drawer-CtD2JCdS.js.gz +0 -0
- codex/static_root/assets/ssrBoot-D0SN4REy.6200754b59d8.js.br +0 -0
- codex/static_root/assets/ssrBoot-D0SN4REy.6200754b59d8.js.gz +0 -0
- codex/static_root/assets/ssrBoot-D0SN4REy.js.br +0 -0
- codex/static_root/assets/ssrBoot-D0SN4REy.js.gz +0 -0
- codex/static_root/assets/stats-tab-Dg7gtbyv.4450fc041bf2.js +0 -1
- codex/static_root/assets/stats-tab-Dg7gtbyv.4450fc041bf2.js.br +0 -0
- codex/static_root/assets/stats-tab-Dg7gtbyv.4450fc041bf2.js.gz +0 -0
- codex/static_root/assets/stats-tab-Dg7gtbyv.js +0 -1
- codex/static_root/assets/stats-tab-Dg7gtbyv.js.br +0 -0
- codex/static_root/assets/stats-tab-Dg7gtbyv.js.gz +0 -0
- codex/static_root/assets/task-tab-CKmCn8Wb.166b1bde5e7b.js +0 -1
- codex/static_root/assets/task-tab-CKmCn8Wb.166b1bde5e7b.js.br +0 -0
- codex/static_root/assets/task-tab-CKmCn8Wb.166b1bde5e7b.js.gz +0 -0
- codex/static_root/assets/task-tab-CKmCn8Wb.js +0 -1
- codex/static_root/assets/task-tab-CKmCn8Wb.js.br +0 -0
- codex/static_root/assets/task-tab-CKmCn8Wb.js.gz +0 -0
- codex/static_root/assets/unauthorized-BJ-YJYOs.6c0a0813ec2e.js.br +0 -0
- codex/static_root/assets/unauthorized-BJ-YJYOs.6c0a0813ec2e.js.gz +0 -0
- codex/static_root/assets/unauthorized-BJ-YJYOs.js.br +0 -0
- codex/static_root/assets/unauthorized-BJ-YJYOs.js.gz +0 -0
- codex/static_root/assets/user-tab-hFUG7l6x.dcfed4901e67.js +0 -1
- codex/static_root/assets/user-tab-hFUG7l6x.dcfed4901e67.js.br +0 -0
- codex/static_root/assets/user-tab-hFUG7l6x.dcfed4901e67.js.gz +0 -0
- codex/static_root/assets/user-tab-hFUG7l6x.js +0 -1
- codex/static_root/assets/user-tab-hFUG7l6x.js.br +0 -0
- codex/static_root/assets/user-tab-hFUG7l6x.js.gz +0 -0
- codex/static_root/manifest.694a3146beb9.json +0 -757
- codex/static_root/manifest.694a3146beb9.json.br +0 -0
- codex/static_root/manifest.694a3146beb9.json.gz +0 -0
- /codex/librarian/janitor/{time.py → scheduled_time.py} +0 -0
- /codex/librarian/telemeter/{time.py → scheduled_time.py} +0 -0
- {codex-1.7.9.dist-info → codex-1.7.11a0.dist-info}/LICENSE +0 -0
- {codex-1.7.9.dist-info → codex-1.7.11a0.dist-info}/entry_points.txt +0 -0
codex/choices/admin.py
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
from types import MappingProxyType
|
|
4
4
|
|
|
5
|
+
from bidict import frozenbidict
|
|
6
|
+
|
|
7
|
+
from codex.librarian.covers.status import CoverStatusTypes
|
|
8
|
+
from codex.librarian.importer.status import ImportStatusTypes
|
|
9
|
+
from codex.librarian.janitor.status import JanitorStatusTypes
|
|
10
|
+
from codex.librarian.search.status import SearchIndexStatusTypes
|
|
11
|
+
from codex.librarian.watchdog.status import WatchdogStatusTypes
|
|
12
|
+
|
|
5
13
|
ADMIN_FLAG_CHOICES = MappingProxyType(
|
|
6
14
|
{
|
|
7
15
|
"AU": "Auto Update",
|
|
@@ -14,53 +22,18 @@ ADMIN_FLAG_CHOICES = MappingProxyType(
|
|
|
14
22
|
}
|
|
15
23
|
)
|
|
16
24
|
|
|
17
|
-
ADMIN_STATUS_TITLES =
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"IDD": "Remove Folders",
|
|
30
|
-
"IDM": "Move Folders",
|
|
31
|
-
"IDU": "Modify Folders",
|
|
32
|
-
"IFC": "Create Books",
|
|
33
|
-
"IFD": "Remove Books",
|
|
34
|
-
"IFI": "Record Failed Imports",
|
|
35
|
-
"IFM": "Move Books",
|
|
36
|
-
"IFU": "Modify Books",
|
|
37
|
-
"IGU": "Update First Covers",
|
|
38
|
-
"IMC": "Link Books to Tags",
|
|
39
|
-
"IMQ": "Prepare Tags for Linking",
|
|
40
|
-
"ITC": "Create Missing Tags",
|
|
41
|
-
"ITQ": "Discover Missing Tags",
|
|
42
|
-
"ITR": "Read Book Tags",
|
|
43
|
-
"JCB": "Cleanup Orphan Bookmarks",
|
|
44
|
-
"JCD": "Cleanup Custom Covers",
|
|
45
|
-
"JCR": "Restart Codex",
|
|
46
|
-
"JCS": "Stop Codex",
|
|
47
|
-
"JCU": "Update Codex Software",
|
|
48
|
-
"JDB": "Backup Database",
|
|
49
|
-
"JDO": "Optimize Database",
|
|
50
|
-
"JFC": "Search Index Integrity Check",
|
|
51
|
-
"JFR": "Search Index Repair",
|
|
52
|
-
"JIC": "Database Integrity Check",
|
|
53
|
-
"JIF": "Database Foreign Key Check",
|
|
54
|
-
"JLV": "Check Codex Latest Version",
|
|
55
|
-
"JSD": "Cleanup Expired Sessions",
|
|
56
|
-
"JTD": "Cleanup Stale Tags",
|
|
57
|
-
"SIC": "Search Index Create",
|
|
58
|
-
"SID": "Search Index Remove Stale Records",
|
|
59
|
-
"SIO": "Search Index Optimize",
|
|
60
|
-
"SIU": "Search Index Update",
|
|
61
|
-
"SIX": "Search Index Clear",
|
|
62
|
-
"WPO": "Poll Library",
|
|
63
|
-
}
|
|
25
|
+
ADMIN_STATUS_TITLES = frozenbidict(
|
|
26
|
+
sorted(
|
|
27
|
+
(key, val)
|
|
28
|
+
for status_types in (
|
|
29
|
+
CoverStatusTypes,
|
|
30
|
+
ImportStatusTypes,
|
|
31
|
+
JanitorStatusTypes,
|
|
32
|
+
SearchIndexStatusTypes,
|
|
33
|
+
WatchdogStatusTypes,
|
|
34
|
+
)
|
|
35
|
+
for key, val in status_types.choices
|
|
36
|
+
)
|
|
64
37
|
)
|
|
65
38
|
|
|
66
39
|
# Easier to store in vuetify format
|
codex/choices/reader.py
CHANGED
|
@@ -6,18 +6,18 @@ READER_CHOICES = MappingProxyType(
|
|
|
6
6
|
{
|
|
7
7
|
"fit_to": MappingProxyType(
|
|
8
8
|
{
|
|
9
|
-
"H": "Fit to Height",
|
|
10
|
-
"O": "Original Size",
|
|
11
9
|
"S": "Fit to Screen",
|
|
12
10
|
"W": "Fit to Width",
|
|
11
|
+
"H": "Fit to Height",
|
|
12
|
+
"O": "Original Size",
|
|
13
13
|
}
|
|
14
14
|
),
|
|
15
15
|
"reading_direction": MappingProxyType(
|
|
16
16
|
{
|
|
17
|
-
"btt": "Bottom to Top",
|
|
18
17
|
"ltr": "Left to Right",
|
|
19
18
|
"rtl": "Right to Left",
|
|
20
19
|
"ttb": "Top to Bottom",
|
|
20
|
+
"btt": "Bottom to Top",
|
|
21
21
|
}
|
|
22
22
|
),
|
|
23
23
|
}
|
codex/db.py
CHANGED
|
@@ -16,7 +16,7 @@ from codex.librarian.janitor.integrity import (
|
|
|
16
16
|
)
|
|
17
17
|
from codex.librarian.janitor.janitor import Janitor
|
|
18
18
|
from codex.librarian.mp_queue import LIBRARIAN_QUEUE
|
|
19
|
-
from codex.logger.
|
|
19
|
+
from codex.logger.logger import get_logger
|
|
20
20
|
from codex.logger.mp_queue import LOG_QUEUE
|
|
21
21
|
from codex.settings.settings import (
|
|
22
22
|
BACKUP_DB_PATH,
|
codex/exceptions.py
CHANGED
|
@@ -12,7 +12,7 @@ from rest_framework.exceptions import APIException
|
|
|
12
12
|
from rest_framework.status import HTTP_303_SEE_OTHER
|
|
13
13
|
|
|
14
14
|
from codex.choices.browser import DEFAULT_BROWSER_ROUTE
|
|
15
|
-
from codex.logger.
|
|
15
|
+
from codex.logger.logger import get_logger
|
|
16
16
|
from codex.serializers.fields.browser import BreadcrumbsField
|
|
17
17
|
from codex.serializers.route import RouteSerializer
|
|
18
18
|
from codex.views.util import pop_name
|
codex/librarian/covers/status.py
CHANGED
codex/librarian/covers/tasks.py
CHANGED
|
@@ -18,13 +18,6 @@ class CoverRemoveOrphansTask(CoverTask):
|
|
|
18
18
|
"""Clean up covers from missing comics."""
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
@dataclass
|
|
22
|
-
class LibrariesTask:
|
|
23
|
-
"""Tasks over a set of libraries."""
|
|
24
|
-
|
|
25
|
-
library_ids: frozenset
|
|
26
|
-
|
|
27
|
-
|
|
28
21
|
@dataclass
|
|
29
22
|
class CoverRemoveTask(CoverTask):
|
|
30
23
|
"""Purge a set of comic covers."""
|
codex/librarian/cron/crond.py
CHANGED
|
@@ -6,10 +6,10 @@ from types import MappingProxyType
|
|
|
6
6
|
|
|
7
7
|
from django.utils import timezone as django_timezone
|
|
8
8
|
|
|
9
|
+
from codex.librarian.janitor.scheduled_time import get_janitor_time
|
|
9
10
|
from codex.librarian.janitor.tasks import JanitorNightlyTask
|
|
10
|
-
from codex.librarian.
|
|
11
|
+
from codex.librarian.telemeter.scheduled_time import get_telemeter_time
|
|
11
12
|
from codex.librarian.telemeter.tasks import TelemeterTask
|
|
12
|
-
from codex.librarian.telemeter.time import get_telemeter_time
|
|
13
13
|
from codex.threads import NamedThread
|
|
14
14
|
|
|
15
15
|
_TASK_TIME_FUNCTION_MAP = MappingProxyType(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Bulk update m2m fields."""
|
|
2
2
|
|
|
3
|
+
from collections.abc import Mapping
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
from django.db.models import Q
|
|
@@ -126,13 +127,13 @@ class LinkComicsImporter(LinkCoversImporter):
|
|
|
126
127
|
result = frozenset(pks)
|
|
127
128
|
all_m2m_links[key][comic_pk] = result
|
|
128
129
|
|
|
129
|
-
def _link_comic_m2m_fields(self):
|
|
130
|
+
def _link_comic_m2m_fields(self) -> tuple[Mapping, int]:
|
|
130
131
|
"""Get the complete m2m field data to create."""
|
|
131
132
|
total = 0
|
|
132
133
|
all_m2m_links = {}
|
|
133
134
|
comic_paths = frozenset(self.metadata.get(M2M_MDS, {}).keys())
|
|
134
135
|
if not comic_paths:
|
|
135
|
-
return all_m2m_links
|
|
136
|
+
return all_m2m_links, total
|
|
136
137
|
comics = Comic.objects.filter(path__in=comic_paths).values_list("pk", "path")
|
|
137
138
|
for comic_pk, comic_path in comics:
|
|
138
139
|
md = self.metadata[M2M_MDS][comic_path]
|
|
@@ -6,7 +6,7 @@ from codex.librarian.importer.const import (
|
|
|
6
6
|
)
|
|
7
7
|
from codex.librarian.importer.create_fks import CreateForeignKeysImporter
|
|
8
8
|
from codex.librarian.importer.status import ImportStatusTypes
|
|
9
|
-
from codex.logger.
|
|
9
|
+
from codex.logger.logger import get_logger
|
|
10
10
|
from codex.models.paths import CustomCover
|
|
11
11
|
from codex.status import Status
|
|
12
12
|
|
|
@@ -35,7 +35,7 @@ from codex.librarian.importer.const import (
|
|
|
35
35
|
)
|
|
36
36
|
from codex.librarian.importer.query_covers import QueryCustomCoversImporter
|
|
37
37
|
from codex.librarian.importer.status import ImportStatusTypes
|
|
38
|
-
from codex.logger.
|
|
38
|
+
from codex.logger.logger import get_logger
|
|
39
39
|
from codex.models import (
|
|
40
40
|
Comic,
|
|
41
41
|
Contributor,
|
|
@@ -11,7 +11,7 @@ from django.db.utils import OperationalError
|
|
|
11
11
|
|
|
12
12
|
from codex.librarian.janitor.status import JanitorStatusTypes
|
|
13
13
|
from codex.librarian.janitor.tasks import JanitorFTSRebuildTask
|
|
14
|
-
from codex.logger.
|
|
14
|
+
from codex.logger.logger import get_logger
|
|
15
15
|
from codex.settings.settings import (
|
|
16
16
|
CONFIG_PATH,
|
|
17
17
|
CUSTOM_COVERS_DIR,
|
codex/librarian/search/status.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""Search Index Status Types."""
|
|
2
2
|
|
|
3
|
-
from django.db.models import
|
|
3
|
+
from django.db.models import TextChoices
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class SearchIndexStatusTypes(
|
|
6
|
+
class SearchIndexStatusTypes(TextChoices):
|
|
7
7
|
"""Search Index Status Types."""
|
|
8
8
|
|
|
9
9
|
SEARCH_INDEX_CLEAR = "SIX"
|
|
@@ -9,7 +9,7 @@ from caseconverter import snakecase
|
|
|
9
9
|
from django.contrib.sessions.models import Session
|
|
10
10
|
from django.db.models import Count
|
|
11
11
|
|
|
12
|
-
from codex.logger.
|
|
12
|
+
from codex.logger.logger import get_logger
|
|
13
13
|
from codex.models import (
|
|
14
14
|
Comic,
|
|
15
15
|
Library,
|
|
@@ -10,7 +10,6 @@ from requests import Session
|
|
|
10
10
|
|
|
11
11
|
from codex.librarian.telemeter.stats import CodexStats
|
|
12
12
|
from codex.models.admin import AdminFlag, Timestamp
|
|
13
|
-
from codex.settings.settings import DEBUG
|
|
14
13
|
|
|
15
14
|
# Version
|
|
16
15
|
_APP_NAME = "codex"
|
|
@@ -43,23 +42,19 @@ def get_telemeter_timestamp():
|
|
|
43
42
|
return ts
|
|
44
43
|
|
|
45
44
|
|
|
46
|
-
def _post_stats(
|
|
45
|
+
def _post_stats(data):
|
|
47
46
|
"""Post telemetry to endpoint."""
|
|
48
47
|
data_json = json.dumps(data)
|
|
49
48
|
json_bytes = data_json.encode()
|
|
50
49
|
compressed_data = compress(json_bytes)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
response = session.post(
|
|
57
|
-
_POST, data=compressed_data, headers=_HEADERS, timeout=_TIMEOUT
|
|
58
|
-
)
|
|
59
|
-
response.raise_for_status()
|
|
50
|
+
with Session() as session:
|
|
51
|
+
response = session.post(
|
|
52
|
+
_POST, data=compressed_data, headers=_HEADERS, timeout=_TIMEOUT
|
|
53
|
+
)
|
|
54
|
+
response.raise_for_status()
|
|
60
55
|
|
|
61
56
|
|
|
62
|
-
def _send_telemetry(
|
|
57
|
+
def _send_telemetry():
|
|
63
58
|
"""Send telemetry to server."""
|
|
64
59
|
if not AdminFlag.objects.get(key=AdminFlag.FlagChoices.SEND_TELEMETRY.value).on:
|
|
65
60
|
reason = "Send Telemetry flag is off."
|
|
@@ -67,13 +62,13 @@ def _send_telemetry(log):
|
|
|
67
62
|
ts = get_telemeter_timestamp()
|
|
68
63
|
stats = CodexStats().get()
|
|
69
64
|
data = {"stats": stats, "uuid": ts.version}
|
|
70
|
-
_post_stats(
|
|
65
|
+
_post_stats(data)
|
|
71
66
|
ts.save() # update updated_at
|
|
72
67
|
|
|
73
68
|
|
|
74
69
|
def send_telemetry(log):
|
|
75
70
|
"""Send anonymous telemetry during one window per week."""
|
|
76
71
|
try:
|
|
77
|
-
_send_telemetry(
|
|
72
|
+
_send_telemetry()
|
|
78
73
|
except Exception as exc:
|
|
79
74
|
log.debug(f"Failed to send anonyomous stats: {exc}")
|
|
@@ -22,7 +22,7 @@ from watchdog.events import (
|
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
from codex.librarian.watchdog.tasks import WatchdogEventTask
|
|
25
|
-
from codex.logger.
|
|
25
|
+
from codex.logger.logger import get_logger
|
|
26
26
|
from codex.logger_base import LoggerBaseMixin
|
|
27
27
|
from codex.models import CustomCover
|
|
28
28
|
from codex.settings.settings import CUSTOM_COVERS_DIR, CUSTOM_COVERS_GROUP_DIRS
|
|
@@ -182,7 +182,7 @@ class LibraryPollingObserver(UatuMixin):
|
|
|
182
182
|
"""Put a dummy event on the queue that blocks forever."""
|
|
183
183
|
# The global timeout is None because the emitters have their own
|
|
184
184
|
# per watch timeout. This makes self.dispatch_events() block
|
|
185
|
-
# forever on the queue. Sending it an event
|
|
185
|
+
# forever on the queue. Sending it an event makes it check the
|
|
186
186
|
# shutdown event next.
|
|
187
187
|
self.event_queue.put(self._SHUTDOWN_EVENT)
|
|
188
188
|
super().on_thread_stop()
|
|
@@ -20,7 +20,7 @@ class CodexQueueHandler(QueueHandler):
|
|
|
20
20
|
super().enqueue(record)
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
_LOG_HANDLER = CodexQueueHandler(LOG_QUEUE)
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
def _ensure_handler(logger, queue):
|
|
@@ -33,7 +33,7 @@ def _ensure_handler(logger, queue):
|
|
|
33
33
|
logger.removeHandler(handler)
|
|
34
34
|
|
|
35
35
|
if not logger.handlers:
|
|
36
|
-
handler =
|
|
36
|
+
handler = _LOG_HANDLER if queue == LOG_QUEUE else CodexQueueHandler(queue)
|
|
37
37
|
logger.addHandler(handler)
|
|
38
38
|
|
|
39
39
|
|
codex/logger_base.py
CHANGED
codex/middleware.py
CHANGED
|
@@ -5,7 +5,7 @@ from time import time
|
|
|
5
5
|
from django.db import connection
|
|
6
6
|
from django.utils import timezone
|
|
7
7
|
|
|
8
|
-
from codex.logger.
|
|
8
|
+
from codex.logger.logger import get_logger
|
|
9
9
|
from codex.settings.settings import LOG_RESPONSE_TIME, SLOW_QUERY_LIMIT
|
|
10
10
|
|
|
11
11
|
LOG = get_logger(__name__)
|
codex/migrations/0001_init.py
CHANGED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Generated by Django 5.1.4 on 2024-12-21 03:50."""
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
"""Migrate DB."""
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
("codex", "0032_alter_librarianstatus_preactive"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name="librarianstatus",
|
|
16
|
+
name="status_type",
|
|
17
|
+
field=models.CharField(
|
|
18
|
+
choices=[
|
|
19
|
+
("CCC", "Create Covers"),
|
|
20
|
+
("CCD", "Purge Covers"),
|
|
21
|
+
("CFO", "Find Orphan"),
|
|
22
|
+
("IAF", "Adopt Folders"),
|
|
23
|
+
("ICC", "Covers Created"),
|
|
24
|
+
("ICD", "Covers Deleted"),
|
|
25
|
+
("ICL", "Covers Link"),
|
|
26
|
+
("ICM", "Covers Moved"),
|
|
27
|
+
("ICQ", "Query Missing Covers"),
|
|
28
|
+
("ICU", "Covers Modified"),
|
|
29
|
+
("IDD", "Dirs Deleted"),
|
|
30
|
+
("IDM", "Dirs Moved"),
|
|
31
|
+
("IDU", "Dirs Modified"),
|
|
32
|
+
("IFC", "Files Created"),
|
|
33
|
+
("IFD", "Files Deleted"),
|
|
34
|
+
("IFI", "Failed Imports"),
|
|
35
|
+
("IFM", "Files Moved"),
|
|
36
|
+
("IFU", "Files Modified"),
|
|
37
|
+
("IGU", "Group Update"),
|
|
38
|
+
("IMC", "Link M2M Fields"),
|
|
39
|
+
("IMQ", "Query M2M Fields"),
|
|
40
|
+
("ITC", "Create Fks"),
|
|
41
|
+
("ITQ", "Query Missing Fks"),
|
|
42
|
+
("ITR", "Aggregate Tags"),
|
|
43
|
+
("JCB", "Cleanup Bookmarks"),
|
|
44
|
+
("JCD", "Cleanup Covers"),
|
|
45
|
+
("JCR", "Codex Restart"),
|
|
46
|
+
("JCS", "Codex Stop"),
|
|
47
|
+
("JCU", "Codex Update"),
|
|
48
|
+
("JDB", "Db Backup"),
|
|
49
|
+
("JDO", "Db Optimize"),
|
|
50
|
+
("JFC", "Fts Integrity Check"),
|
|
51
|
+
("JFR", "Fts Rebuild"),
|
|
52
|
+
("JIC", "Integrity Check"),
|
|
53
|
+
("JIF", "Integrity Fk"),
|
|
54
|
+
("JLV", "Codex Latest Version"),
|
|
55
|
+
("JSD", "Cleanup Sessions"),
|
|
56
|
+
("JTD", "Cleanup Fk"),
|
|
57
|
+
("SIC", "Search Index Create"),
|
|
58
|
+
("SID", "Search Index Remove"),
|
|
59
|
+
("SIO", "Search Index Optimize"),
|
|
60
|
+
("SIU", "Search Index Update"),
|
|
61
|
+
("SIX", "Search Index Clear"),
|
|
62
|
+
("WPO", "Poll"),
|
|
63
|
+
],
|
|
64
|
+
db_index=True,
|
|
65
|
+
max_length=3,
|
|
66
|
+
),
|
|
67
|
+
),
|
|
68
|
+
]
|
codex/models/admin.py
CHANGED
|
@@ -9,7 +9,6 @@ from django.db.models import (
|
|
|
9
9
|
CASCADE,
|
|
10
10
|
BooleanField,
|
|
11
11
|
CharField,
|
|
12
|
-
Choices,
|
|
13
12
|
DateTimeField,
|
|
14
13
|
OneToOneField,
|
|
15
14
|
PositiveSmallIntegerField,
|
|
@@ -17,11 +16,7 @@ from django.db.models import (
|
|
|
17
16
|
)
|
|
18
17
|
from django.utils.translation import gettext_lazy as _
|
|
19
18
|
|
|
20
|
-
from codex.
|
|
21
|
-
from codex.librarian.importer.status import ImportStatusTypes
|
|
22
|
-
from codex.librarian.janitor.status import JanitorStatusTypes
|
|
23
|
-
from codex.librarian.search.status import SearchIndexStatusTypes
|
|
24
|
-
from codex.librarian.watchdog.status import WatchdogStatusTypes
|
|
19
|
+
from codex.choices.admin import ADMIN_STATUS_TITLES
|
|
25
20
|
from codex.models.base import MAX_FIELD_LEN, MAX_NAME_LEN, BaseModel, max_choices_len
|
|
26
21
|
|
|
27
22
|
__all__ = ("AdminFlag", "LibrarianStatus", "Timestamp", "UserActive")
|
|
@@ -30,7 +25,7 @@ __all__ = ("AdminFlag", "LibrarianStatus", "Timestamp", "UserActive")
|
|
|
30
25
|
class AdminFlag(BaseModel):
|
|
31
26
|
"""Flags set by administrators."""
|
|
32
27
|
|
|
33
|
-
class FlagChoices(
|
|
28
|
+
class FlagChoices(TextChoices):
|
|
34
29
|
"""Choices for Admin Flags."""
|
|
35
30
|
|
|
36
31
|
FOLDER_VIEW = "FV"
|
|
@@ -60,16 +55,12 @@ class AdminFlag(BaseModel):
|
|
|
60
55
|
class LibrarianStatus(BaseModel):
|
|
61
56
|
"""Active Library Tasks."""
|
|
62
57
|
|
|
63
|
-
CHOICES =
|
|
64
|
-
CoverStatusTypes.choices
|
|
65
|
-
+ ImportStatusTypes.choices
|
|
66
|
-
+ JanitorStatusTypes.choices
|
|
67
|
-
+ SearchIndexStatusTypes.choices
|
|
68
|
-
+ WatchdogStatusTypes.choices
|
|
69
|
-
)
|
|
58
|
+
CHOICES = TextChoices("LibrarianStatusTypes", ADMIN_STATUS_TITLES.inverse)
|
|
70
59
|
|
|
71
60
|
status_type = CharField(
|
|
72
|
-
db_index=True,
|
|
61
|
+
db_index=True,
|
|
62
|
+
max_length=max_choices_len(CHOICES),
|
|
63
|
+
choices=CHOICES.choices,
|
|
73
64
|
)
|
|
74
65
|
subtitle = CharField(db_index=True, max_length=MAX_NAME_LEN)
|
|
75
66
|
complete = PositiveSmallIntegerField(null=True, default=None)
|
codex/models/bookmark.py
CHANGED
|
@@ -6,9 +6,9 @@ from django.db.models import (
|
|
|
6
6
|
CASCADE,
|
|
7
7
|
BooleanField,
|
|
8
8
|
CharField,
|
|
9
|
-
Choices,
|
|
10
9
|
ForeignKey,
|
|
11
10
|
PositiveSmallIntegerField,
|
|
11
|
+
TextChoices,
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
from codex.models.base import BaseModel, max_choices_len
|
|
@@ -49,7 +49,7 @@ def cascade_if_user_null(
|
|
|
49
49
|
class Bookmark(BaseModel):
|
|
50
50
|
"""Persist user's bookmarks and settings."""
|
|
51
51
|
|
|
52
|
-
class FitTo(
|
|
52
|
+
class FitTo(TextChoices):
|
|
53
53
|
"""Identifiers for Readder fit_to choices."""
|
|
54
54
|
|
|
55
55
|
SCREEN = "S"
|
codex/models/comic.py
CHANGED
|
@@ -6,12 +6,11 @@ import re
|
|
|
6
6
|
from datetime import MAXYEAR, MINYEAR, date
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
-
from comicbox.fields.
|
|
9
|
+
from comicbox.fields.enum_fields import ReadingDirectionEnum
|
|
10
10
|
from django.db.models import (
|
|
11
11
|
CASCADE,
|
|
12
12
|
BooleanField,
|
|
13
13
|
CharField,
|
|
14
|
-
Choices,
|
|
15
14
|
DateField,
|
|
16
15
|
DateTimeField,
|
|
17
16
|
DecimalField,
|
|
@@ -20,6 +19,7 @@ from django.db.models import (
|
|
|
20
19
|
OneToOneField,
|
|
21
20
|
PositiveIntegerField,
|
|
22
21
|
PositiveSmallIntegerField,
|
|
22
|
+
TextChoices,
|
|
23
23
|
TextField,
|
|
24
24
|
)
|
|
25
25
|
|
|
@@ -59,7 +59,7 @@ from codex.models.named import (
|
|
|
59
59
|
__all__ = ("Comic",)
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
class ReadingDirection(
|
|
62
|
+
class ReadingDirection(TextChoices):
|
|
63
63
|
"""Reading direction choices."""
|
|
64
64
|
|
|
65
65
|
LTR = ReadingDirectionEnum.LTR.value
|
|
@@ -68,7 +68,7 @@ class ReadingDirection(Choices):
|
|
|
68
68
|
BTT = ReadingDirectionEnum.BTT.value
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
class FileType(
|
|
71
|
+
class FileType(TextChoices):
|
|
72
72
|
"""Identifiers for file formats."""
|
|
73
73
|
|
|
74
74
|
CBZ = "CBZ"
|
codex/models/groups.py
CHANGED
|
@@ -11,7 +11,7 @@ from codex.models.base import MAX_NAME_LEN, BaseModel
|
|
|
11
11
|
from codex.models.paths import CustomCover, WatchedPath
|
|
12
12
|
from codex.models.util import get_sort_name
|
|
13
13
|
|
|
14
|
-
__all__ = ("BrowserGroupModel", "
|
|
14
|
+
__all__ = ("BrowserGroupModel", "Folder", "Imprint", "Publisher", "Series", "Volume")
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class BrowserGroupModel(BaseModel):
|
codex/models/named.py
CHANGED
codex/models/paths.py
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
from types import MappingProxyType
|
|
5
5
|
|
|
6
|
-
from django.db.models import CASCADE, CharField, ForeignKey, JSONField
|
|
7
|
-
from django.db.models.enums import Choices
|
|
6
|
+
from django.db.models import CASCADE, CharField, ForeignKey, JSONField, TextChoices
|
|
8
7
|
|
|
9
8
|
from codex.models.base import MAX_NAME_LEN, BaseModel, max_choices_len
|
|
10
9
|
from codex.models.library import MAX_PATH_LEN, Library
|
|
@@ -81,7 +80,7 @@ class FailedImport(WatchedPath):
|
|
|
81
80
|
class CustomCover(WatchedPath):
|
|
82
81
|
"""Custom Cover Image."""
|
|
83
82
|
|
|
84
|
-
class GroupChoice(
|
|
83
|
+
class GroupChoice(TextChoices):
|
|
85
84
|
"""Reading direction choices."""
|
|
86
85
|
|
|
87
86
|
P = "p"
|
codex/run.py
CHANGED
|
@@ -11,8 +11,8 @@ from hypercorn.asyncio import serve
|
|
|
11
11
|
from codex.asgi import application
|
|
12
12
|
from codex.librarian.librariand import LibrarianDaemon
|
|
13
13
|
from codex.librarian.mp_queue import LIBRARIAN_QUEUE
|
|
14
|
+
from codex.logger.logger import get_logger
|
|
14
15
|
from codex.logger.loggerd import CodexLogQueueListener
|
|
15
|
-
from codex.logger.logging import get_logger
|
|
16
16
|
from codex.logger.mp_queue import LOG_QUEUE
|
|
17
17
|
from codex.settings.settings import HYPERCORN_CONFIG
|
|
18
18
|
from codex.signals.os_signals import RESTART_EVENT, SHUTDOWN_EVENT
|
|
@@ -12,7 +12,7 @@ from rest_framework.serializers import (
|
|
|
12
12
|
SerializerMethodField,
|
|
13
13
|
)
|
|
14
14
|
|
|
15
|
-
from codex.logger.
|
|
15
|
+
from codex.logger.logger import get_logger
|
|
16
16
|
from codex.serializers.fields.browser import TopGroupField
|
|
17
17
|
from codex.util import max_none
|
|
18
18
|
from codex.views.const import EPOCH_START
|