codex 1.6.1__py3-none-any.whl → 1.6.3__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/exceptions.py +42 -16
- codex/librarian/search/update.py +1 -1
- codex/serializers/admin/__init__.py +1 -0
- codex/serializers/admin/flags.py +15 -0
- codex/serializers/admin/groups.py +38 -0
- codex/serializers/admin/libraries.py +90 -0
- codex/serializers/admin/stats.py +114 -0
- codex/serializers/admin/tasks.py +16 -0
- codex/serializers/admin/users.py +40 -0
- codex/serializers/fields.py +7 -0
- codex/serializers/reader.py +8 -3
- codex/static_root/assets/VCheckbox-CXQlndFT.c17c006a62e6.js +1 -0
- codex/static_root/assets/VCheckbox-CXQlndFT.c17c006a62e6.js.br +0 -0
- codex/static_root/assets/VCheckbox-CXQlndFT.c17c006a62e6.js.gz +0 -0
- codex/static_root/assets/VCheckbox-CXQlndFT.js +1 -0
- codex/static_root/assets/VCheckbox-CXQlndFT.js.br +0 -0
- codex/static_root/assets/VCheckbox-CXQlndFT.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js +1 -0
- codex/static_root/assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DB72Bclg.ab414c6ae2b8.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DB72Bclg.js +1 -0
- codex/static_root/assets/VCheckboxBtn-DB72Bclg.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DB72Bclg.js.gz +0 -0
- codex/static_root/assets/{VCombobox-pHa6iBaZ.ff88fede19d6.js → VCombobox-BDcFPzYf.0b80447cd638.js} +1 -1
- codex/static_root/assets/VCombobox-BDcFPzYf.0b80447cd638.js.br +0 -0
- codex/static_root/assets/VCombobox-BDcFPzYf.0b80447cd638.js.gz +0 -0
- codex/static_root/assets/{VCombobox-pHa6iBaZ.js → VCombobox-BDcFPzYf.js} +1 -1
- codex/static_root/assets/VCombobox-BDcFPzYf.js.br +0 -0
- codex/static_root/assets/VCombobox-BDcFPzYf.js.gz +0 -0
- codex/static_root/assets/VDialog-BB4zqrGw.2decc14ea597.js +1 -0
- codex/static_root/assets/VDialog-BB4zqrGw.2decc14ea597.js.br +0 -0
- codex/static_root/assets/VDialog-BB4zqrGw.2decc14ea597.js.gz +0 -0
- codex/static_root/assets/VDialog-BB4zqrGw.js +1 -0
- codex/static_root/assets/VDialog-BB4zqrGw.js.br +0 -0
- codex/static_root/assets/VDialog-BB4zqrGw.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-SZc735F5.19004a0eba16.js +1 -0
- codex/static_root/assets/VExpansionPanels-SZc735F5.19004a0eba16.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-SZc735F5.19004a0eba16.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-SZc735F5.js +1 -0
- codex/static_root/assets/VExpansionPanels-SZc735F5.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-SZc735F5.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-tFEuhFRq.774e14a4945a.js +1 -0
- codex/static_root/assets/VRadioGroup-tFEuhFRq.774e14a4945a.js.br +0 -0
- codex/static_root/assets/VRadioGroup-tFEuhFRq.774e14a4945a.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-tFEuhFRq.js +1 -0
- codex/static_root/assets/VRadioGroup-tFEuhFRq.js.br +0 -0
- codex/static_root/assets/VRadioGroup-tFEuhFRq.js.gz +0 -0
- codex/static_root/assets/VSelect-Dd5Zy8Uy.f225abf824ff.js +1 -0
- codex/static_root/assets/VSelect-Dd5Zy8Uy.f225abf824ff.js.br +0 -0
- codex/static_root/assets/VSelect-Dd5Zy8Uy.f225abf824ff.js.gz +0 -0
- codex/static_root/assets/VSelect-Dd5Zy8Uy.js +1 -0
- codex/static_root/assets/VSelect-Dd5Zy8Uy.js.br +0 -0
- codex/static_root/assets/VSelect-Dd5Zy8Uy.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-D4e-QshF.js → VSelectionControl-DImIQPJV.1f14d2113063.js} +1 -1
- codex/static_root/assets/VSelectionControl-DImIQPJV.1f14d2113063.js.br +0 -0
- codex/static_root/assets/VSelectionControl-DImIQPJV.1f14d2113063.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-D4e-QshF.38721ba52d00.js → VSelectionControl-DImIQPJV.js} +1 -1
- codex/static_root/assets/VSelectionControl-DImIQPJV.js.br +0 -0
- codex/static_root/assets/VSelectionControl-DImIQPJV.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-BQv5m0ZY.2adc55157521.js → VSlideGroup-CDaAHRAK.783800d70a8a.js} +1 -1
- codex/static_root/assets/VSlideGroup-CDaAHRAK.783800d70a8a.js.br +0 -0
- codex/static_root/assets/VSlideGroup-CDaAHRAK.783800d70a8a.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-BQv5m0ZY.js → VSlideGroup-CDaAHRAK.js} +1 -1
- codex/static_root/assets/VSlideGroup-CDaAHRAK.js.br +0 -0
- codex/static_root/assets/VSlideGroup-CDaAHRAK.js.gz +0 -0
- codex/static_root/assets/{VTable-BPFJigN3.2b5f59873063.js → VTable-CkCZonsu.81e34381271f.js} +1 -1
- codex/static_root/assets/VTable-CkCZonsu.81e34381271f.js.br +0 -0
- codex/static_root/assets/VTable-CkCZonsu.81e34381271f.js.gz +0 -0
- codex/static_root/assets/{VTable-BPFJigN3.js → VTable-CkCZonsu.js} +1 -1
- codex/static_root/assets/VTable-CkCZonsu.js.br +0 -0
- codex/static_root/assets/VTable-CkCZonsu.js.gz +0 -0
- codex/static_root/assets/VTextField-fNAzFu1M.00dec8623f18.js +1 -0
- codex/static_root/assets/VTextField-fNAzFu1M.00dec8623f18.js.br +0 -0
- codex/static_root/assets/VTextField-fNAzFu1M.00dec8623f18.js.gz +0 -0
- codex/static_root/assets/VTextField-fNAzFu1M.js +1 -0
- codex/static_root/assets/VTextField-fNAzFu1M.js.br +0 -0
- codex/static_root/assets/VTextField-fNAzFu1M.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-C1xK_Fwc.6a80dfed4beb.js → VWindowItem-_YBMW1SU.0836924f8c12.js} +1 -1
- codex/static_root/assets/VWindowItem-_YBMW1SU.0836924f8c12.js.br +0 -0
- codex/static_root/assets/VWindowItem-_YBMW1SU.0836924f8c12.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-C1xK_Fwc.js → VWindowItem-_YBMW1SU.js} +1 -1
- codex/static_root/assets/VWindowItem-_YBMW1SU.js.br +0 -0
- codex/static_root/assets/VWindowItem-_YBMW1SU.js.gz +0 -0
- codex/static_root/assets/{admin-B8Bp2Uih.82c98714bcf1.css → admin-D4sw3N4T.b590f88a62cf.css} +1 -1
- codex/static_root/assets/admin-D4sw3N4T.b590f88a62cf.css.br +0 -0
- codex/static_root/assets/admin-D4sw3N4T.b590f88a62cf.css.gz +0 -0
- codex/static_root/assets/{admin-B8Bp2Uih.css → admin-D4sw3N4T.css} +1 -1
- codex/static_root/assets/admin-D4sw3N4T.css.br +0 -0
- codex/static_root/assets/admin-D4sw3N4T.css.gz +0 -0
- codex/static_root/assets/admin-DYmGyJVg.262e6032ee86.js +1 -0
- codex/static_root/assets/admin-DYmGyJVg.262e6032ee86.js.br +0 -0
- codex/static_root/assets/admin-DYmGyJVg.262e6032ee86.js.gz +0 -0
- codex/static_root/assets/admin-DYmGyJVg.js +1 -0
- codex/static_root/assets/admin-DYmGyJVg.js.br +0 -0
- codex/static_root/assets/admin-DYmGyJVg.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js +56 -0
- codex/static_root/assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-c3f3H29x.fa2b12c75b06.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-c3f3H29x.js +56 -0
- codex/static_root/assets/admin-drawer-panel-c3f3H29x.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-c3f3H29x.js.gz +0 -0
- codex/static_root/assets/browser-Ck3zWCOk.d98c77747e6d.js +1 -0
- codex/static_root/assets/browser-Ck3zWCOk.d98c77747e6d.js.br +0 -0
- codex/static_root/assets/browser-Ck3zWCOk.d98c77747e6d.js.gz +0 -0
- codex/static_root/assets/browser-Ck3zWCOk.js +1 -0
- codex/static_root/assets/browser-Ck3zWCOk.js.br +0 -0
- codex/static_root/assets/browser-Ck3zWCOk.js.gz +0 -0
- codex/static_root/assets/{browser-DP9eEJ0M.276e8636f8fc.css → browser-DgawKPSA.c7cf59dc4b21.css} +1 -1
- codex/static_root/assets/browser-DgawKPSA.c7cf59dc4b21.css.br +0 -0
- codex/static_root/assets/browser-DgawKPSA.c7cf59dc4b21.css.gz +0 -0
- codex/static_root/assets/{browser-DP9eEJ0M.css → browser-DgawKPSA.css} +1 -1
- codex/static_root/assets/browser-DgawKPSA.css.br +0 -0
- codex/static_root/assets/browser-DgawKPSA.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js +1 -0
- codex/static_root/assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BbIO0YI5.2bb0a5dfb190.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-BbIO0YI5.js +1 -0
- codex/static_root/assets/change-password-dialog-BbIO0YI5.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BbIO0YI5.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js +1 -0
- codex/static_root/assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BrzuoYAT.a0a1b6364708.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-BrzuoYAT.js +1 -0
- codex/static_root/assets/confirm-dialog-BrzuoYAT.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BrzuoYAT.js.gz +0 -0
- codex/static_root/assets/{datetime-column-CYmuurug.0f5658d9b9e2.js → datetime-column-D8-UeX_p.e33b1556805b.js} +1 -1
- codex/static_root/assets/datetime-column-D8-UeX_p.e33b1556805b.js.br +0 -0
- codex/static_root/assets/datetime-column-D8-UeX_p.e33b1556805b.js.gz +0 -0
- codex/static_root/assets/{datetime-column-CYmuurug.js → datetime-column-D8-UeX_p.js} +1 -1
- codex/static_root/assets/datetime-column-D8-UeX_p.js.br +0 -0
- codex/static_root/assets/datetime-column-D8-UeX_p.js.gz +0 -0
- codex/static_root/assets/{filter-D0YNadTH.e6ee9bc95c0f.js → filter-XMAX5Nmg.c6ed87350f7d.js} +1 -1
- codex/static_root/assets/filter-XMAX5Nmg.c6ed87350f7d.js.br +0 -0
- codex/static_root/assets/filter-XMAX5Nmg.c6ed87350f7d.js.gz +0 -0
- codex/static_root/assets/{filter-D0YNadTH.js → filter-XMAX5Nmg.js} +1 -1
- codex/static_root/assets/filter-XMAX5Nmg.js.br +0 -0
- codex/static_root/assets/filter-XMAX5Nmg.js.gz +0 -0
- codex/static_root/assets/flag-tab-BLEUVMot.c14936c90346.js +1 -0
- codex/static_root/assets/flag-tab-BLEUVMot.c14936c90346.js.br +0 -0
- codex/static_root/assets/flag-tab-BLEUVMot.c14936c90346.js.gz +0 -0
- codex/static_root/assets/flag-tab-BLEUVMot.js +1 -0
- codex/static_root/assets/flag-tab-BLEUVMot.js.br +0 -0
- codex/static_root/assets/flag-tab-BLEUVMot.js.gz +0 -0
- codex/static_root/assets/group-tab-D9n5gZCA.634223001c44.js +1 -0
- codex/static_root/assets/group-tab-D9n5gZCA.634223001c44.js.br +0 -0
- codex/static_root/assets/group-tab-D9n5gZCA.634223001c44.js.gz +0 -0
- codex/static_root/assets/group-tab-D9n5gZCA.js +1 -0
- codex/static_root/assets/group-tab-D9n5gZCA.js.br +0 -0
- codex/static_root/assets/group-tab-D9n5gZCA.js.gz +0 -0
- codex/static_root/assets/http-error-C_EFLi0c.c7e906206b62.js +1 -0
- codex/static_root/assets/http-error-C_EFLi0c.c7e906206b62.js.br +0 -0
- codex/static_root/assets/http-error-C_EFLi0c.c7e906206b62.js.gz +0 -0
- codex/static_root/assets/http-error-C_EFLi0c.js +1 -0
- codex/static_root/assets/http-error-C_EFLi0c.js.br +0 -0
- codex/static_root/assets/http-error-C_EFLi0c.js.gz +0 -0
- codex/static_root/assets/{library-tab-BN0SfPcH.913e236f625e.css → library-tab-BygwYPnO.94e92aa60bf2.css} +1 -1
- codex/static_root/assets/library-tab-BygwYPnO.94e92aa60bf2.css.br +0 -0
- codex/static_root/assets/library-tab-BygwYPnO.94e92aa60bf2.css.gz +0 -0
- codex/static_root/assets/{library-tab-BN0SfPcH.css → library-tab-BygwYPnO.css} +1 -1
- codex/static_root/assets/library-tab-BygwYPnO.css.br +0 -0
- codex/static_root/assets/library-tab-BygwYPnO.css.gz +0 -0
- codex/static_root/assets/library-tab-fDxuhPBs.285b36d9cec0.js +1 -0
- codex/static_root/assets/library-tab-fDxuhPBs.285b36d9cec0.js.br +0 -0
- codex/static_root/assets/library-tab-fDxuhPBs.285b36d9cec0.js.gz +0 -0
- codex/static_root/assets/library-tab-fDxuhPBs.js +1 -0
- codex/static_root/assets/library-tab-fDxuhPBs.js.br +0 -0
- codex/static_root/assets/library-tab-fDxuhPBs.js.gz +0 -0
- codex/static_root/assets/main-B3MfqYNN.30d1310fc082.js +6 -0
- codex/static_root/assets/main-B3MfqYNN.30d1310fc082.js.br +0 -0
- codex/static_root/assets/main-B3MfqYNN.30d1310fc082.js.gz +0 -0
- codex/static_root/assets/main-B3MfqYNN.js +6 -0
- codex/static_root/assets/main-B3MfqYNN.js.br +0 -0
- codex/static_root/assets/main-B3MfqYNN.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js +1 -0
- codex/static_root/assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-BD6nzIKF.f3ca4874c203.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-BD6nzIKF.js +1 -0
- codex/static_root/assets/pagination-toolbar-BD6nzIKF.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-BD6nzIKF.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-MjpbXXnS.85038ab4cb8e.js → pdf-doc-iF15lKRp.de9a9d394438.js} +1 -1
- codex/static_root/assets/pdf-doc-iF15lKRp.de9a9d394438.js.br +0 -0
- codex/static_root/assets/pdf-doc-iF15lKRp.de9a9d394438.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-MjpbXXnS.js → pdf-doc-iF15lKRp.js} +1 -1
- codex/static_root/assets/pdf-doc-iF15lKRp.js.br +0 -0
- codex/static_root/assets/pdf-doc-iF15lKRp.js.gz +0 -0
- codex/static_root/assets/reader-5Ja_bAaT.2fe33a3891f6.js +2 -0
- codex/static_root/assets/reader-5Ja_bAaT.2fe33a3891f6.js.br +0 -0
- codex/static_root/assets/reader-5Ja_bAaT.2fe33a3891f6.js.gz +0 -0
- codex/static_root/assets/reader-5Ja_bAaT.js +2 -0
- codex/static_root/assets/reader-5Ja_bAaT.js.br +0 -0
- codex/static_root/assets/reader-5Ja_bAaT.js.gz +0 -0
- codex/static_root/assets/{reader-DOQuhDYO.css → reader-YbzUiD0T.css} +1 -1
- codex/static_root/assets/reader-YbzUiD0T.css.br +0 -0
- codex/static_root/assets/reader-YbzUiD0T.css.gz +0 -0
- codex/static_root/assets/{reader-DOQuhDYO.df559ad29ab3.css → reader-YbzUiD0T.efb15835b39d.css} +1 -1
- codex/static_root/assets/reader-YbzUiD0T.efb15835b39d.css.br +0 -0
- codex/static_root/assets/reader-YbzUiD0T.efb15835b39d.css.gz +0 -0
- codex/static_root/assets/{relation-chips-Bsc-gUxE.98e65384c3c9.css → relation-chips-BGitp3yx.b3e7d178a615.css} +1 -1
- codex/static_root/assets/relation-chips-BGitp3yx.b3e7d178a615.css.br +0 -0
- codex/static_root/assets/relation-chips-BGitp3yx.b3e7d178a615.css.gz +0 -0
- codex/static_root/assets/{relation-chips-Bsc-gUxE.css → relation-chips-BGitp3yx.css} +1 -1
- codex/static_root/assets/relation-chips-BGitp3yx.css.br +0 -0
- codex/static_root/assets/relation-chips-BGitp3yx.css.gz +0 -0
- codex/static_root/assets/relation-chips-CUWkvLNo.3d18d0c09d39.js +1 -0
- codex/static_root/assets/relation-chips-CUWkvLNo.3d18d0c09d39.js.br +0 -0
- codex/static_root/assets/relation-chips-CUWkvLNo.3d18d0c09d39.js.gz +0 -0
- codex/static_root/assets/relation-chips-CUWkvLNo.js +1 -0
- codex/static_root/assets/relation-chips-CUWkvLNo.js.br +0 -0
- codex/static_root/assets/relation-chips-CUWkvLNo.js.gz +0 -0
- codex/static_root/assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js +2 -0
- codex/static_root/assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js.br +0 -0
- codex/static_root/assets/settings-drawer-rn3JdMxA.a9d7b45c2138.js.gz +0 -0
- codex/static_root/assets/settings-drawer-rn3JdMxA.js +2 -0
- codex/static_root/assets/settings-drawer-rn3JdMxA.js.br +0 -0
- codex/static_root/assets/settings-drawer-rn3JdMxA.js.gz +0 -0
- codex/static_root/assets/stats-tab-B6L-YFRA.1c90593f7b5c.css +1 -0
- codex/static_root/assets/stats-tab-B6L-YFRA.1c90593f7b5c.css.br +0 -0
- codex/static_root/assets/stats-tab-B6L-YFRA.1c90593f7b5c.css.gz +0 -0
- codex/static_root/assets/stats-tab-B6L-YFRA.css +1 -0
- codex/static_root/assets/stats-tab-B6L-YFRA.css.br +0 -0
- codex/static_root/assets/stats-tab-B6L-YFRA.css.gz +0 -0
- codex/static_root/assets/stats-tab-zts2Xsmg.9fb959ccf4da.js +1 -0
- codex/static_root/assets/stats-tab-zts2Xsmg.9fb959ccf4da.js.br +0 -0
- codex/static_root/assets/stats-tab-zts2Xsmg.9fb959ccf4da.js.gz +0 -0
- codex/static_root/assets/stats-tab-zts2Xsmg.js +1 -0
- codex/static_root/assets/stats-tab-zts2Xsmg.js.br +0 -0
- codex/static_root/assets/stats-tab-zts2Xsmg.js.gz +0 -0
- codex/static_root/assets/task-tab-CbzDX0IR.7b43bdf9cf42.js +1 -0
- codex/static_root/assets/task-tab-CbzDX0IR.7b43bdf9cf42.js.br +0 -0
- codex/static_root/assets/task-tab-CbzDX0IR.7b43bdf9cf42.js.gz +0 -0
- codex/static_root/assets/task-tab-CbzDX0IR.js +1 -0
- codex/static_root/assets/task-tab-CbzDX0IR.js.br +0 -0
- codex/static_root/assets/task-tab-CbzDX0IR.js.gz +0 -0
- codex/static_root/assets/unauthorized-CllrtnFV.2a18fab3dd41.js +1 -0
- codex/static_root/assets/unauthorized-CllrtnFV.2a18fab3dd41.js.br +0 -0
- codex/static_root/assets/unauthorized-CllrtnFV.2a18fab3dd41.js.gz +0 -0
- codex/static_root/assets/unauthorized-CllrtnFV.js +1 -0
- codex/static_root/assets/unauthorized-CllrtnFV.js.br +0 -0
- codex/static_root/assets/unauthorized-CllrtnFV.js.gz +0 -0
- codex/static_root/assets/user-tab-FY1xALpi.05a88f51df4f.js +1 -0
- codex/static_root/assets/user-tab-FY1xALpi.05a88f51df4f.js.br +0 -0
- codex/static_root/assets/user-tab-FY1xALpi.05a88f51df4f.js.gz +0 -0
- codex/static_root/assets/user-tab-FY1xALpi.js +1 -0
- codex/static_root/assets/user-tab-FY1xALpi.js.br +0 -0
- codex/static_root/assets/user-tab-FY1xALpi.js.gz +0 -0
- codex/static_root/{manifest.c852d4a311e1.json → manifest.166aa32817b1.json} +229 -241
- codex/static_root/manifest.166aa32817b1.json.br +0 -0
- codex/static_root/manifest.166aa32817b1.json.gz +0 -0
- codex/static_root/manifest.json +229 -241
- codex/static_root/manifest.json.br +0 -0
- codex/static_root/manifest.json.gz +0 -0
- codex/static_root/staticfiles.json +1 -1
- codex/views/admin/api_key.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 +41 -7
- codex/views/admin/tasks.py +1 -1
- codex/views/admin/user.py +1 -1
- codex/views/browser/annotations.py +7 -4
- codex/views/browser/browser.py +8 -5
- codex/views/browser/cover.py +0 -2
- codex/views/browser/filters/field.py +15 -6
- codex/views/browser/metadata.py +6 -9
- codex/views/browser/paginate.py +61 -11
- codex/views/browser/validate.py +7 -5
- codex/views/opds/binary.py +1 -3
- codex/views/opds/const.py +10 -0
- codex/views/opds/util.py +10 -0
- codex/views/opds/v1/feed.py +5 -23
- codex/views/reader/arcs.py +64 -53
- codex/views/reader/books.py +38 -38
- codex/views/reader/init.py +7 -5
- codex/views/reader/reader.py +0 -2
- {codex-1.6.1.dist-info → codex-1.6.3.dist-info}/METADATA +1 -1
- {codex-1.6.1.dist-info → codex-1.6.3.dist-info}/RECORD +279 -275
- codex/serializers/admin.py +0 -268
- codex/static_root/assets/VCheckbox-fu1ny9Cc.7f2b43d1ce47.js +0 -1
- codex/static_root/assets/VCheckbox-fu1ny9Cc.7f2b43d1ce47.js.br +0 -0
- codex/static_root/assets/VCheckbox-fu1ny9Cc.7f2b43d1ce47.js.gz +0 -0
- codex/static_root/assets/VCheckbox-fu1ny9Cc.js +0 -1
- codex/static_root/assets/VCheckbox-fu1ny9Cc.js.br +0 -0
- codex/static_root/assets/VCheckbox-fu1ny9Cc.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-ssJU_z8r.7469708eff4e.js +0 -1
- codex/static_root/assets/VCheckboxBtn-ssJU_z8r.7469708eff4e.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-ssJU_z8r.7469708eff4e.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-ssJU_z8r.js +0 -1
- codex/static_root/assets/VCheckboxBtn-ssJU_z8r.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-ssJU_z8r.js.gz +0 -0
- codex/static_root/assets/VCombobox-pHa6iBaZ.ff88fede19d6.js.br +0 -0
- codex/static_root/assets/VCombobox-pHa6iBaZ.ff88fede19d6.js.gz +0 -0
- codex/static_root/assets/VCombobox-pHa6iBaZ.js.br +0 -0
- codex/static_root/assets/VCombobox-pHa6iBaZ.js.gz +0 -0
- codex/static_root/assets/VDialog-PmbYIKIh.c0fb4c6eb906.js +0 -1
- codex/static_root/assets/VDialog-PmbYIKIh.c0fb4c6eb906.js.br +0 -0
- codex/static_root/assets/VDialog-PmbYIKIh.c0fb4c6eb906.js.gz +0 -0
- codex/static_root/assets/VDialog-PmbYIKIh.js +0 -1
- codex/static_root/assets/VDialog-PmbYIKIh.js.br +0 -0
- codex/static_root/assets/VDialog-PmbYIKIh.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-DhRGJRFB.d1fb2c18424b.js +0 -1
- codex/static_root/assets/VExpansionPanels-DhRGJRFB.d1fb2c18424b.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-DhRGJRFB.d1fb2c18424b.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-DhRGJRFB.js +0 -1
- codex/static_root/assets/VExpansionPanels-DhRGJRFB.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-DhRGJRFB.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-ClT4cR8E.1aa488b49221.js +0 -1
- codex/static_root/assets/VRadioGroup-ClT4cR8E.1aa488b49221.js.br +0 -0
- codex/static_root/assets/VRadioGroup-ClT4cR8E.1aa488b49221.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-ClT4cR8E.js +0 -1
- codex/static_root/assets/VRadioGroup-ClT4cR8E.js.br +0 -0
- codex/static_root/assets/VRadioGroup-ClT4cR8E.js.gz +0 -0
- codex/static_root/assets/VSelect-BBy4FHPj.7421f9feb46b.js +0 -1
- codex/static_root/assets/VSelect-BBy4FHPj.7421f9feb46b.js.br +0 -0
- codex/static_root/assets/VSelect-BBy4FHPj.7421f9feb46b.js.gz +0 -0
- codex/static_root/assets/VSelect-BBy4FHPj.js +0 -1
- codex/static_root/assets/VSelect-BBy4FHPj.js.br +0 -0
- codex/static_root/assets/VSelect-BBy4FHPj.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-D4e-QshF.38721ba52d00.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D4e-QshF.38721ba52d00.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-D4e-QshF.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D4e-QshF.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-BQv5m0ZY.2adc55157521.js.br +0 -0
- codex/static_root/assets/VSlideGroup-BQv5m0ZY.2adc55157521.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-BQv5m0ZY.js.br +0 -0
- codex/static_root/assets/VSlideGroup-BQv5m0ZY.js.gz +0 -0
- codex/static_root/assets/VTable-BPFJigN3.2b5f59873063.js.br +0 -0
- codex/static_root/assets/VTable-BPFJigN3.2b5f59873063.js.gz +0 -0
- codex/static_root/assets/VTable-BPFJigN3.js.br +0 -0
- codex/static_root/assets/VTable-BPFJigN3.js.gz +0 -0
- codex/static_root/assets/VTextField-DuT-8VmG.04e65c2610a4.js +0 -1
- codex/static_root/assets/VTextField-DuT-8VmG.04e65c2610a4.js.br +0 -0
- codex/static_root/assets/VTextField-DuT-8VmG.04e65c2610a4.js.gz +0 -0
- codex/static_root/assets/VTextField-DuT-8VmG.js +0 -1
- codex/static_root/assets/VTextField-DuT-8VmG.js.br +0 -0
- codex/static_root/assets/VTextField-DuT-8VmG.js.gz +0 -0
- codex/static_root/assets/VWindowItem-C1xK_Fwc.6a80dfed4beb.js.br +0 -0
- codex/static_root/assets/VWindowItem-C1xK_Fwc.6a80dfed4beb.js.gz +0 -0
- codex/static_root/assets/VWindowItem-C1xK_Fwc.js.br +0 -0
- codex/static_root/assets/VWindowItem-C1xK_Fwc.js.gz +0 -0
- codex/static_root/assets/admin-B8Bp2Uih.82c98714bcf1.css.br +0 -0
- codex/static_root/assets/admin-B8Bp2Uih.82c98714bcf1.css.gz +0 -0
- codex/static_root/assets/admin-B8Bp2Uih.css.br +0 -0
- codex/static_root/assets/admin-B8Bp2Uih.css.gz +0 -0
- codex/static_root/assets/admin-DAexM4mM.2fa224507884.js +0 -1
- codex/static_root/assets/admin-DAexM4mM.2fa224507884.js.br +0 -0
- codex/static_root/assets/admin-DAexM4mM.2fa224507884.js.gz +0 -0
- codex/static_root/assets/admin-DAexM4mM.js +0 -1
- codex/static_root/assets/admin-DAexM4mM.js.br +0 -0
- codex/static_root/assets/admin-DAexM4mM.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-SpPhIMP4.b9a6113090c9.js +0 -30
- codex/static_root/assets/admin-drawer-panel-SpPhIMP4.b9a6113090c9.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-SpPhIMP4.b9a6113090c9.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-SpPhIMP4.js +0 -30
- codex/static_root/assets/admin-drawer-panel-SpPhIMP4.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-SpPhIMP4.js.gz +0 -0
- codex/static_root/assets/browser-CWfL6gLS.92842e328420.js +0 -1
- codex/static_root/assets/browser-CWfL6gLS.92842e328420.js.br +0 -0
- codex/static_root/assets/browser-CWfL6gLS.92842e328420.js.gz +0 -0
- codex/static_root/assets/browser-CWfL6gLS.js +0 -1
- codex/static_root/assets/browser-CWfL6gLS.js.br +0 -0
- codex/static_root/assets/browser-CWfL6gLS.js.gz +0 -0
- codex/static_root/assets/browser-DP9eEJ0M.276e8636f8fc.css.br +0 -0
- codex/static_root/assets/browser-DP9eEJ0M.276e8636f8fc.css.gz +0 -0
- codex/static_root/assets/browser-DP9eEJ0M.css.br +0 -0
- codex/static_root/assets/browser-DP9eEJ0M.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-BJHFtdXE.0a718e633507.js +0 -1
- codex/static_root/assets/change-password-dialog-BJHFtdXE.0a718e633507.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BJHFtdXE.0a718e633507.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-BJHFtdXE.js +0 -1
- codex/static_root/assets/change-password-dialog-BJHFtdXE.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BJHFtdXE.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-BEiVusri.e3d017feba41.js +0 -1
- codex/static_root/assets/confirm-dialog-BEiVusri.e3d017feba41.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BEiVusri.e3d017feba41.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-BEiVusri.js +0 -1
- codex/static_root/assets/confirm-dialog-BEiVusri.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BEiVusri.js.gz +0 -0
- codex/static_root/assets/datetime-column-CYmuurug.0f5658d9b9e2.js.br +0 -0
- codex/static_root/assets/datetime-column-CYmuurug.0f5658d9b9e2.js.gz +0 -0
- codex/static_root/assets/datetime-column-CYmuurug.js.br +0 -0
- codex/static_root/assets/datetime-column-CYmuurug.js.gz +0 -0
- codex/static_root/assets/filter-D0YNadTH.e6ee9bc95c0f.js.br +0 -0
- codex/static_root/assets/filter-D0YNadTH.e6ee9bc95c0f.js.gz +0 -0
- codex/static_root/assets/filter-D0YNadTH.js.br +0 -0
- codex/static_root/assets/filter-D0YNadTH.js.gz +0 -0
- codex/static_root/assets/flag-tab-CAsMFvQO.9cc9cd124ee9.js +0 -1
- codex/static_root/assets/flag-tab-CAsMFvQO.9cc9cd124ee9.js.br +0 -0
- codex/static_root/assets/flag-tab-CAsMFvQO.9cc9cd124ee9.js.gz +0 -0
- codex/static_root/assets/flag-tab-CAsMFvQO.js +0 -1
- codex/static_root/assets/flag-tab-CAsMFvQO.js.br +0 -0
- codex/static_root/assets/flag-tab-CAsMFvQO.js.gz +0 -0
- codex/static_root/assets/group-tab-Cr0hebSY.22e6025c588f.js +0 -1
- codex/static_root/assets/group-tab-Cr0hebSY.22e6025c588f.js.br +0 -0
- codex/static_root/assets/group-tab-Cr0hebSY.22e6025c588f.js.gz +0 -0
- codex/static_root/assets/group-tab-Cr0hebSY.js +0 -1
- codex/static_root/assets/group-tab-Cr0hebSY.js.br +0 -0
- codex/static_root/assets/group-tab-Cr0hebSY.js.gz +0 -0
- codex/static_root/assets/http-error-BkvLxw68.a5f561d36571.js +0 -1
- codex/static_root/assets/http-error-BkvLxw68.a5f561d36571.js.br +0 -0
- codex/static_root/assets/http-error-BkvLxw68.a5f561d36571.js.gz +0 -0
- codex/static_root/assets/http-error-BkvLxw68.js +0 -1
- codex/static_root/assets/http-error-BkvLxw68.js.br +0 -0
- codex/static_root/assets/http-error-BkvLxw68.js.gz +0 -0
- codex/static_root/assets/library-tab-BN0SfPcH.913e236f625e.css.br +0 -0
- codex/static_root/assets/library-tab-BN0SfPcH.913e236f625e.css.gz +0 -0
- codex/static_root/assets/library-tab-BN0SfPcH.css.br +0 -0
- codex/static_root/assets/library-tab-BN0SfPcH.css.gz +0 -0
- codex/static_root/assets/library-tab-r6YdFmlk.d136e20e3501.js +0 -1
- codex/static_root/assets/library-tab-r6YdFmlk.d136e20e3501.js.br +0 -0
- codex/static_root/assets/library-tab-r6YdFmlk.d136e20e3501.js.gz +0 -0
- codex/static_root/assets/library-tab-r6YdFmlk.js +0 -1
- codex/static_root/assets/library-tab-r6YdFmlk.js.br +0 -0
- codex/static_root/assets/library-tab-r6YdFmlk.js.gz +0 -0
- codex/static_root/assets/main-BMxHA4IB.19ea7128bc87.js +0 -32
- codex/static_root/assets/main-BMxHA4IB.19ea7128bc87.js.br +0 -0
- codex/static_root/assets/main-BMxHA4IB.19ea7128bc87.js.gz +0 -0
- codex/static_root/assets/main-BMxHA4IB.js +0 -32
- codex/static_root/assets/main-BMxHA4IB.js.br +0 -0
- codex/static_root/assets/main-BMxHA4IB.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-BO02XyZj.b1574d505e3c.js +0 -1
- codex/static_root/assets/pagination-toolbar-BO02XyZj.b1574d505e3c.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-BO02XyZj.b1574d505e3c.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-BO02XyZj.js +0 -1
- codex/static_root/assets/pagination-toolbar-BO02XyZj.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-BO02XyZj.js.gz +0 -0
- codex/static_root/assets/pdf-doc-MjpbXXnS.85038ab4cb8e.js.br +0 -0
- codex/static_root/assets/pdf-doc-MjpbXXnS.85038ab4cb8e.js.gz +0 -0
- codex/static_root/assets/pdf-doc-MjpbXXnS.js.br +0 -0
- codex/static_root/assets/pdf-doc-MjpbXXnS.js.gz +0 -0
- codex/static_root/assets/reader-AMeiJSE6.556392e64785.js +0 -2
- codex/static_root/assets/reader-AMeiJSE6.556392e64785.js.br +0 -0
- codex/static_root/assets/reader-AMeiJSE6.556392e64785.js.gz +0 -0
- codex/static_root/assets/reader-AMeiJSE6.js +0 -2
- codex/static_root/assets/reader-AMeiJSE6.js.br +0 -0
- codex/static_root/assets/reader-AMeiJSE6.js.gz +0 -0
- codex/static_root/assets/reader-DOQuhDYO.css.br +0 -0
- codex/static_root/assets/reader-DOQuhDYO.css.gz +0 -0
- codex/static_root/assets/reader-DOQuhDYO.df559ad29ab3.css.br +0 -0
- codex/static_root/assets/reader-DOQuhDYO.df559ad29ab3.css.gz +0 -0
- codex/static_root/assets/relation-chips-Bsc-gUxE.98e65384c3c9.css.br +0 -0
- codex/static_root/assets/relation-chips-Bsc-gUxE.98e65384c3c9.css.gz +0 -0
- codex/static_root/assets/relation-chips-Bsc-gUxE.css.br +0 -0
- codex/static_root/assets/relation-chips-Bsc-gUxE.css.gz +0 -0
- codex/static_root/assets/relation-chips-DKzjmNPq.de2203c11719.js +0 -1
- codex/static_root/assets/relation-chips-DKzjmNPq.de2203c11719.js.br +0 -0
- codex/static_root/assets/relation-chips-DKzjmNPq.de2203c11719.js.gz +0 -0
- codex/static_root/assets/relation-chips-DKzjmNPq.js +0 -1
- codex/static_root/assets/relation-chips-DKzjmNPq.js.br +0 -0
- codex/static_root/assets/relation-chips-DKzjmNPq.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DuR_I-os.d1754da85f24.js +0 -2
- codex/static_root/assets/settings-drawer-DuR_I-os.d1754da85f24.js.br +0 -0
- codex/static_root/assets/settings-drawer-DuR_I-os.d1754da85f24.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DuR_I-os.js +0 -2
- codex/static_root/assets/settings-drawer-DuR_I-os.js.br +0 -0
- codex/static_root/assets/settings-drawer-DuR_I-os.js.gz +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css +0 -1
- codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css.br +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css.gz +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.css +0 -1
- codex/static_root/assets/stats-tab-B4yKuY0c.css.br +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.css.gz +0 -0
- codex/static_root/assets/stats-tab-CgBniikR.ce1c6941c844.js +0 -1
- codex/static_root/assets/stats-tab-CgBniikR.ce1c6941c844.js.br +0 -0
- codex/static_root/assets/stats-tab-CgBniikR.ce1c6941c844.js.gz +0 -0
- codex/static_root/assets/stats-tab-CgBniikR.js +0 -1
- codex/static_root/assets/stats-tab-CgBniikR.js.br +0 -0
- codex/static_root/assets/stats-tab-CgBniikR.js.gz +0 -0
- codex/static_root/assets/task-tab-JjKaS7pI.c01782978325.js +0 -1
- codex/static_root/assets/task-tab-JjKaS7pI.c01782978325.js.br +0 -0
- codex/static_root/assets/task-tab-JjKaS7pI.c01782978325.js.gz +0 -0
- codex/static_root/assets/task-tab-JjKaS7pI.js +0 -1
- codex/static_root/assets/task-tab-JjKaS7pI.js.br +0 -0
- codex/static_root/assets/task-tab-JjKaS7pI.js.gz +0 -0
- codex/static_root/assets/to-case-CMMdeNjM.64cd6ddff339.js +0 -1
- codex/static_root/assets/to-case-CMMdeNjM.js +0 -1
- codex/static_root/assets/unauthorized-Cz-M4lP9.d11776d78241.js +0 -1
- codex/static_root/assets/unauthorized-Cz-M4lP9.d11776d78241.js.br +0 -0
- codex/static_root/assets/unauthorized-Cz-M4lP9.d11776d78241.js.gz +0 -0
- codex/static_root/assets/unauthorized-Cz-M4lP9.js +0 -1
- codex/static_root/assets/unauthorized-Cz-M4lP9.js.br +0 -0
- codex/static_root/assets/unauthorized-Cz-M4lP9.js.gz +0 -0
- codex/static_root/assets/user-tab-HnLW9C3q.7f44c7f960c2.js +0 -1
- codex/static_root/assets/user-tab-HnLW9C3q.7f44c7f960c2.js.br +0 -0
- codex/static_root/assets/user-tab-HnLW9C3q.7f44c7f960c2.js.gz +0 -0
- codex/static_root/assets/user-tab-HnLW9C3q.js +0 -1
- codex/static_root/assets/user-tab-HnLW9C3q.js.br +0 -0
- codex/static_root/assets/user-tab-HnLW9C3q.js.gz +0 -0
- codex/static_root/manifest.c852d4a311e1.json.br +0 -0
- codex/static_root/manifest.c852d4a311e1.json.gz +0 -0
- {codex-1.6.1.dist-info → codex-1.6.3.dist-info}/LICENSE +0 -0
- {codex-1.6.1.dist-info → codex-1.6.3.dist-info}/WHEEL +0 -0
- {codex-1.6.1.dist-info → codex-1.6.3.dist-info}/entry_points.txt +0 -0
codex/views/reader/arcs.py
CHANGED
|
@@ -4,7 +4,10 @@ from types import MappingProxyType
|
|
|
4
4
|
|
|
5
5
|
from codex.models import AdminFlag
|
|
6
6
|
from codex.util import max_none
|
|
7
|
-
from codex.views.const import
|
|
7
|
+
from codex.views.const import (
|
|
8
|
+
FOLDER_GROUP,
|
|
9
|
+
STORY_ARC_GROUP,
|
|
10
|
+
)
|
|
8
11
|
from codex.views.reader.books import ReaderBooksView
|
|
9
12
|
|
|
10
13
|
|
|
@@ -16,77 +19,85 @@ class ReaderArcsView(ReaderBooksView):
|
|
|
16
19
|
super().__init__(*args, **kwargs)
|
|
17
20
|
self.params: MappingProxyType = MappingProxyType({})
|
|
18
21
|
|
|
19
|
-
def _get_group_arc(self, book, attr):
|
|
20
|
-
"""
|
|
22
|
+
def _get_group_arc(self, book, attr, browser_arc_group, arcs, max_mtime): # noqa: PLR0913
|
|
23
|
+
"""Append the volume arc."""
|
|
24
|
+
if browser_arc_group == attr[0]:
|
|
25
|
+
return None, max_mtime
|
|
21
26
|
group = getattr(book, attr, None)
|
|
22
27
|
if not group:
|
|
23
|
-
return None
|
|
28
|
+
return None, max_mtime
|
|
24
29
|
|
|
25
30
|
_, arc_pks = self.get_group_pks_from_breadcrumbs([group])
|
|
26
31
|
if group.pk not in arc_pks:
|
|
27
32
|
arc_pks = (group.pk,)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
arcs.append(
|
|
34
|
+
{
|
|
35
|
+
"group": attr[0],
|
|
36
|
+
"pks": arc_pks,
|
|
37
|
+
"name": group.name,
|
|
38
|
+
"mtime": group.updated_at,
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
return max_none(max_mtime, group.updated_at)
|
|
34
42
|
|
|
35
|
-
def _get_folder_arc(self, book):
|
|
36
|
-
"""
|
|
43
|
+
def _get_folder_arc(self, book, browser_arc_group, arcs, max_mtime):
|
|
44
|
+
"""Append the folder arc."""
|
|
37
45
|
efv_flag = (
|
|
38
46
|
AdminFlag.objects.only("on")
|
|
39
47
|
.get(key=AdminFlag.FlagChoices.FOLDER_VIEW.value)
|
|
40
48
|
.on
|
|
41
49
|
)
|
|
42
|
-
if not efv_flag:
|
|
43
|
-
return None
|
|
50
|
+
if not efv_flag or browser_arc_group == FOLDER_GROUP:
|
|
51
|
+
return None, max_mtime
|
|
44
52
|
|
|
45
53
|
folder = book.parent_folder
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
arcs.append(
|
|
55
|
+
{
|
|
56
|
+
"group": FOLDER_GROUP,
|
|
57
|
+
"pks": (folder.pk,),
|
|
58
|
+
"name": folder.name,
|
|
59
|
+
"mtime": folder.updated_at,
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
return max_none(max_mtime, folder.updated_at)
|
|
63
|
+
|
|
64
|
+
def _get_story_arcs(self, book, browser_arc, arcs, max_mtime):
|
|
65
|
+
"""Append the story arcs."""
|
|
66
|
+
if browser_arc.get("group") == STORY_ARC_GROUP:
|
|
67
|
+
browser_arc_pks = frozenset(browser_arc.get("pks", ()))
|
|
68
|
+
else:
|
|
69
|
+
browser_arc_pks = frozenset()
|
|
52
70
|
|
|
53
|
-
|
|
54
|
-
"""Create story arcs."""
|
|
55
|
-
sas = []
|
|
56
|
-
for san in book.story_arc_numbers.all():
|
|
71
|
+
for san in book.story_arc_numbers.all().order_by("story_arc__name"):
|
|
57
72
|
sa = san.story_arc
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
73
|
+
if not browser_arc_pks or sa.pk not in browser_arc_pks:
|
|
74
|
+
arc = {
|
|
75
|
+
"group": "a",
|
|
76
|
+
"pks": (sa.pk,),
|
|
77
|
+
"name": sa.name,
|
|
78
|
+
"mtime": sa.updated_at,
|
|
79
|
+
}
|
|
80
|
+
arcs.append(arc)
|
|
81
|
+
max_mtime = max_none(max_mtime, sa.updated_at)
|
|
82
|
+
return max_mtime
|
|
66
83
|
|
|
67
84
|
def get_arcs(self, book):
|
|
68
85
|
"""Get all series/folder/story arcs."""
|
|
69
|
-
# create top arcs
|
|
70
86
|
arcs = []
|
|
71
|
-
top_group = self.params.get("top_group")
|
|
72
|
-
arc = None
|
|
73
|
-
if series_arc := self._get_group_arc(book, "series"):
|
|
74
|
-
arcs.append(series_arc)
|
|
75
|
-
arc = series_arc
|
|
76
|
-
if volume_arc := self._get_group_arc(book, "volume"):
|
|
77
|
-
arcs.append(volume_arc)
|
|
78
|
-
if not arc:
|
|
79
|
-
arc = volume_arc
|
|
80
|
-
if folder_arc := self._get_folder_arc(book):
|
|
81
|
-
arcs.append(folder_arc)
|
|
82
|
-
if top_group == FOLDER_GROUP:
|
|
83
|
-
arc = folder_arc
|
|
84
|
-
if story_arcs := self._get_story_arcs(book):
|
|
85
|
-
arcs = [*arcs, *story_arcs]
|
|
86
|
-
if top_group == STORY_ARC_GROUP:
|
|
87
|
-
arc = story_arcs[0]
|
|
88
|
-
|
|
89
87
|
max_mtime = None
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
|
|
89
|
+
if browser_arc := self.params.get("browser_arc", {}):
|
|
90
|
+
arcs.append(browser_arc)
|
|
91
|
+
max_mtime = max_none(max_mtime, browser_arc.get("mtime", max_mtime))
|
|
92
|
+
|
|
93
|
+
browser_arc_group = browser_arc.get("group", "")
|
|
94
|
+
max_mtime = self._get_group_arc(
|
|
95
|
+
book, "series", browser_arc_group, arcs, max_mtime
|
|
96
|
+
)
|
|
97
|
+
max_mtime = self._get_group_arc(
|
|
98
|
+
book, "volume", browser_arc_group, arcs, max_mtime
|
|
99
|
+
)
|
|
100
|
+
max_mtime = self._get_folder_arc(book, browser_arc_group, arcs, max_mtime)
|
|
101
|
+
max_mtime = self._get_story_arcs(book, browser_arc, arcs, max_mtime)
|
|
102
|
+
|
|
92
103
|
return arcs, max_mtime
|
codex/views/reader/books.py
CHANGED
|
@@ -6,7 +6,14 @@ from django.db.models import F
|
|
|
6
6
|
|
|
7
7
|
from codex.models import Bookmark, Comic
|
|
8
8
|
from codex.views.bookmark import BookmarkBaseView
|
|
9
|
-
from codex.views.
|
|
9
|
+
from codex.views.browser.filters.field import ComicFieldFilterView
|
|
10
|
+
from codex.views.const import (
|
|
11
|
+
FOLDER_GROUP,
|
|
12
|
+
GROUP_MODEL_MAP,
|
|
13
|
+
GROUP_RELATION,
|
|
14
|
+
NONE_INTEGERFIELD,
|
|
15
|
+
STORY_ARC_GROUP,
|
|
16
|
+
)
|
|
10
17
|
from codex.views.mixins import SharedAnnotationsMixin
|
|
11
18
|
from codex.views.reader.init import ReaderInitView
|
|
12
19
|
|
|
@@ -57,45 +64,30 @@ class ReaderBooksView(BookmarkBaseView, ReaderInitView, SharedAnnotationsMixin):
|
|
|
57
64
|
|
|
58
65
|
def _get_comics_list(self):
|
|
59
66
|
"""Get the reader naviation group filter."""
|
|
60
|
-
select_related = ("series", "volume")
|
|
61
|
-
prefetch_related = ()
|
|
62
|
-
|
|
63
67
|
arc: Mapping = self.params.get("arc", {}) # type: ignore
|
|
64
68
|
|
|
65
|
-
arc_group = arc.get("group", "
|
|
66
|
-
if arc_group
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
arc_group = arc.get("group", "")
|
|
70
|
+
if not GROUP_MODEL_MAP.get(arc_group):
|
|
71
|
+
arc_group = "s"
|
|
72
|
+
|
|
73
|
+
rel = GROUP_RELATION[arc_group]
|
|
74
|
+
fields = _COMIC_FIELDS
|
|
75
|
+
arc_pk_rel = rel + "__pk"
|
|
76
|
+
arc_index = NONE_INTEGERFIELD
|
|
77
|
+
ordering = ()
|
|
78
|
+
arc_pk_select_related = (rel,)
|
|
79
|
+
select_related = ()
|
|
80
|
+
prefetch_related = ()
|
|
81
|
+
|
|
82
|
+
if arc_group == STORY_ARC_GROUP:
|
|
83
|
+
prefetch_related = (*prefetch_related, rel)
|
|
72
84
|
arc_index = F("story_arc_numbers__number")
|
|
73
85
|
ordering = ("arc_index", "date", "pk")
|
|
74
86
|
arc_pk_select_related = ()
|
|
75
87
|
elif arc_group == FOLDER_GROUP:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
fields = (*_COMIC_FIELDS, "parent_folder")
|
|
79
|
-
arc_pk_rel = "parent_folder__pk"
|
|
80
|
-
arc_index = NONE_INTEGERFIELD
|
|
88
|
+
select_related = (rel,)
|
|
89
|
+
fields = (*_COMIC_FIELDS, rel)
|
|
81
90
|
ordering = ("path", "pk")
|
|
82
|
-
arc_pk_select_related = ("parent_folder",)
|
|
83
|
-
elif arc_group == "v":
|
|
84
|
-
# volume
|
|
85
|
-
rel = "volume"
|
|
86
|
-
fields = _COMIC_FIELDS
|
|
87
|
-
arc_pk_rel = "volume__pk"
|
|
88
|
-
arc_index = NONE_INTEGERFIELD
|
|
89
|
-
ordering = ()
|
|
90
|
-
arc_pk_select_related = ("volume",)
|
|
91
|
-
else:
|
|
92
|
-
# series
|
|
93
|
-
rel = "series"
|
|
94
|
-
fields = _COMIC_FIELDS
|
|
95
|
-
arc_pk_rel = "series__pk"
|
|
96
|
-
arc_index = NONE_INTEGERFIELD
|
|
97
|
-
ordering = ()
|
|
98
|
-
arc_pk_select_related = ("series",)
|
|
99
91
|
|
|
100
92
|
arc_pks = self._get_reader_arc_pks(
|
|
101
93
|
arc, arc_pk_select_related, prefetch_related, arc_pk_rel, arc_group
|
|
@@ -103,12 +95,20 @@ class ReaderBooksView(BookmarkBaseView, ReaderInitView, SharedAnnotationsMixin):
|
|
|
103
95
|
nav_filter = {f"{rel}__in": arc_pks}
|
|
104
96
|
group_acl_filter = self.get_group_acl_filter(Comic)
|
|
105
97
|
|
|
98
|
+
qs = Comic.objects.filter(group_acl_filter).filter(**nav_filter)
|
|
99
|
+
if browser_filters := arc.get("filters"):
|
|
100
|
+
# no search at this time.
|
|
101
|
+
field_filters = ComicFieldFilterView.get_all_comic_field_filters(
|
|
102
|
+
"", browser_filters
|
|
103
|
+
)
|
|
104
|
+
qs = qs.filter(field_filters)
|
|
105
|
+
|
|
106
|
+
if select_related:
|
|
107
|
+
qs = qs.select_related(*select_related)
|
|
108
|
+
if prefetch_related:
|
|
109
|
+
qs = qs.prefetch_related(*prefetch_related)
|
|
106
110
|
qs = (
|
|
107
|
-
|
|
108
|
-
.filter(**nav_filter)
|
|
109
|
-
.select_related(*select_related)
|
|
110
|
-
.prefetch_related(*prefetch_related)
|
|
111
|
-
.only(*fields)
|
|
111
|
+
qs.only(*fields)
|
|
112
112
|
.annotate(
|
|
113
113
|
issue_count=F("volume__issue_count"),
|
|
114
114
|
)
|
codex/views/reader/init.py
CHANGED
|
@@ -13,8 +13,8 @@ from codex.views.session import SessionView
|
|
|
13
13
|
from codex.views.util import reparse_json_query_params
|
|
14
14
|
|
|
15
15
|
LOG = get_logger(__name__)
|
|
16
|
-
VALID_ARC_GROUPS =
|
|
17
|
-
_JSON_KEYS = frozenset({"arc", "breadcrumbs", "show"})
|
|
16
|
+
VALID_ARC_GROUPS = "pisvfa"
|
|
17
|
+
_JSON_KEYS = frozenset({"arc", "breadcrumbs", "browser_arc", "show"})
|
|
18
18
|
_BROWSER_SESSION_DEFAULTS = SessionView.SESSION_DEFAULTS[
|
|
19
19
|
SessionView.BROWSER_SESSION_KEY
|
|
20
20
|
]
|
|
@@ -89,12 +89,14 @@ class ReaderInitView(SessionView):
|
|
|
89
89
|
# Can't be in the serializer
|
|
90
90
|
arc = params.get("arc", {})
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
arc_group = arc.get("group", "")
|
|
93
|
+
arc_pks = arc.get("pks", ())
|
|
94
|
+
if arc_group not in VALID_ARC_GROUPS or not arc_pks:
|
|
93
95
|
top_group = params["top_group"]
|
|
94
|
-
if top_group in
|
|
96
|
+
if top_group in FOLDER_GROUP + STORY_ARC_GROUP:
|
|
95
97
|
search_groups = (top_group,)
|
|
96
98
|
else:
|
|
97
|
-
search_groups =
|
|
99
|
+
search_groups = "vsip"
|
|
98
100
|
|
|
99
101
|
group, pks = self.get_group_pks_from_breadcrumbs(search_groups)
|
|
100
102
|
if not group:
|
codex/views/reader/reader.py
CHANGED
|
@@ -12,7 +12,6 @@ from codex.logger.logging import get_logger
|
|
|
12
12
|
from codex.serializers.reader import ReaderComicsSerializer, ReaderViewInputSerializer
|
|
13
13
|
from codex.serializers.redirect import ReaderRedirectSerializer
|
|
14
14
|
from codex.views.reader.arcs import ReaderArcsView
|
|
15
|
-
from codex.views.util import pop_name
|
|
16
15
|
|
|
17
16
|
LOG = get_logger(__name__)
|
|
18
17
|
|
|
@@ -90,7 +89,6 @@ class ReaderView(ReaderArcsView):
|
|
|
90
89
|
arc["count"] = current.arc_count # type: ignore
|
|
91
90
|
|
|
92
91
|
close_route = self.get_last_route()
|
|
93
|
-
close_route = pop_name(close_route)
|
|
94
92
|
|
|
95
93
|
return {
|
|
96
94
|
"books": books,
|