codex 1.5.7rc0__py3-none-any.whl → 1.5.8__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/librarian/importer/aggregate_metadata.py +12 -7
- codex/librarian/importer/importerd.py +36 -3
- codex/librarian/importer/tasks.py +8 -0
- codex/models/comic.py +9 -0
- codex/search/backend.py +21 -18
- codex/search/indexes.py +9 -4
- codex/serializers/browser/page.py +1 -0
- codex/static_root/assets/{VCheckbox-CSvjBFR1.531e0fc38f24.js → VCheckbox-CAnsONJ8.1d8ba3df8d9f.js} +1 -1
- codex/static_root/assets/VCheckbox-CAnsONJ8.1d8ba3df8d9f.js.br +0 -0
- codex/static_root/assets/VCheckbox-CAnsONJ8.1d8ba3df8d9f.js.gz +0 -0
- codex/static_root/assets/{VCheckbox-CSvjBFR1.js → VCheckbox-CAnsONJ8.js} +1 -1
- codex/static_root/assets/VCheckbox-CAnsONJ8.js.br +0 -0
- codex/static_root/assets/VCheckbox-CAnsONJ8.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-CQ4VhpyA.cb28dccb8bd0.js → VCheckboxBtn-DQTVBkac.93f2be0971d2.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-DQTVBkac.93f2be0971d2.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DQTVBkac.93f2be0971d2.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-CQ4VhpyA.js → VCheckboxBtn-DQTVBkac.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-DQTVBkac.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DQTVBkac.js.gz +0 -0
- codex/static_root/assets/{VCombobox-DmqwaLY4.d4e984321966.js → VCombobox-xgzcfu8j.85e27125105c.js} +1 -1
- codex/static_root/assets/VCombobox-xgzcfu8j.85e27125105c.js.br +0 -0
- codex/static_root/assets/VCombobox-xgzcfu8j.85e27125105c.js.gz +0 -0
- codex/static_root/assets/{VCombobox-DmqwaLY4.js → VCombobox-xgzcfu8j.js} +1 -1
- codex/static_root/assets/VCombobox-xgzcfu8j.js.br +0 -0
- codex/static_root/assets/VCombobox-xgzcfu8j.js.gz +0 -0
- codex/static_root/assets/{VDataTableVirtual-6f42V3Lt.7bd15f89e179.js → VDataTableVirtual-ohR-xfIW.54047fbf2e77.js} +1 -1
- codex/static_root/assets/VDataTableVirtual-ohR-xfIW.54047fbf2e77.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-ohR-xfIW.54047fbf2e77.js.gz +0 -0
- codex/static_root/assets/{VDataTableVirtual-6f42V3Lt.js → VDataTableVirtual-ohR-xfIW.js} +1 -1
- codex/static_root/assets/VDataTableVirtual-ohR-xfIW.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-ohR-xfIW.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanel-HxmPRHLI.2f46f7785043.js → VExpansionPanel-D77IHp4B.fe0052639210.js} +1 -1
- codex/static_root/assets/VExpansionPanel-D77IHp4B.fe0052639210.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-D77IHp4B.fe0052639210.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanel-HxmPRHLI.js → VExpansionPanel-D77IHp4B.js} +1 -1
- codex/static_root/assets/VExpansionPanel-D77IHp4B.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-D77IHp4B.js.gz +0 -0
- codex/static_root/assets/{VMain-C67fPCUj.c0f7b7a893b2.js → VMain-BcP4P6kJ.26ba71b71a30.js} +1 -1
- codex/static_root/assets/VMain-BcP4P6kJ.26ba71b71a30.js.br +0 -0
- codex/static_root/assets/VMain-BcP4P6kJ.26ba71b71a30.js.gz +0 -0
- codex/static_root/assets/{VMain-C67fPCUj.js → VMain-BcP4P6kJ.js} +1 -1
- codex/static_root/assets/VMain-BcP4P6kJ.js.br +0 -0
- codex/static_root/assets/VMain-BcP4P6kJ.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-DlFy7v1Z.9e5a0c60e667.js → VRadioGroup-DQQmB99C.8e62ca305d42.js} +1 -1
- codex/static_root/assets/VRadioGroup-DQQmB99C.8e62ca305d42.js.br +5 -0
- codex/static_root/assets/VRadioGroup-DQQmB99C.8e62ca305d42.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-DlFy7v1Z.js → VRadioGroup-DQQmB99C.js} +1 -1
- codex/static_root/assets/VRadioGroup-DQQmB99C.js.br +5 -0
- codex/static_root/assets/VRadioGroup-DQQmB99C.js.gz +0 -0
- codex/static_root/assets/{VSelect-O_Yn2sND.d7879a023bd9.js → VSelect-YSL0tIop.c23c0657cf17.js} +1 -1
- codex/static_root/assets/VSelect-YSL0tIop.c23c0657cf17.js.br +0 -0
- codex/static_root/assets/VSelect-YSL0tIop.c23c0657cf17.js.gz +0 -0
- codex/static_root/assets/{VSelect-O_Yn2sND.js → VSelect-YSL0tIop.js} +1 -1
- codex/static_root/assets/VSelect-YSL0tIop.js.br +0 -0
- codex/static_root/assets/VSelect-YSL0tIop.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-DP64P5MF.ca35648c092a.js → VSelectionControl-D0ha1VYk.60bd3aeb20e1.js} +1 -1
- codex/static_root/assets/VSelectionControl-D0ha1VYk.60bd3aeb20e1.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D0ha1VYk.60bd3aeb20e1.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-DP64P5MF.js → VSelectionControl-D0ha1VYk.js} +1 -1
- codex/static_root/assets/VSelectionControl-D0ha1VYk.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D0ha1VYk.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-DOKbHMCv.23352d03450c.js → VSlideGroup-BW6pFVGY.13cecf1a7794.js} +1 -1
- codex/static_root/assets/VSlideGroup-BW6pFVGY.13cecf1a7794.js.br +0 -0
- codex/static_root/assets/VSlideGroup-BW6pFVGY.13cecf1a7794.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-DOKbHMCv.js → VSlideGroup-BW6pFVGY.js} +1 -1
- codex/static_root/assets/VSlideGroup-BW6pFVGY.js.br +0 -0
- codex/static_root/assets/VSlideGroup-BW6pFVGY.js.gz +0 -0
- codex/static_root/assets/{VTable-CtRSR9wI.ab498162ec9a.js → VTable-CXI0Xaio.06b95b33adaf.js} +1 -1
- codex/static_root/assets/VTable-CXI0Xaio.06b95b33adaf.js.br +0 -0
- codex/static_root/assets/VTable-CXI0Xaio.06b95b33adaf.js.gz +0 -0
- codex/static_root/assets/{VTable-CtRSR9wI.js → VTable-CXI0Xaio.js} +1 -1
- codex/static_root/assets/VTable-CXI0Xaio.js.br +0 -0
- codex/static_root/assets/VTable-CXI0Xaio.js.gz +0 -0
- codex/static_root/assets/{VToolbar-C__BHwZO.js → VToolbar-CnoJq5Ck.5b3dcfbf1c77.js} +2 -2
- codex/static_root/assets/VToolbar-CnoJq5Ck.5b3dcfbf1c77.js.br +0 -0
- codex/static_root/assets/VToolbar-CnoJq5Ck.5b3dcfbf1c77.js.gz +0 -0
- codex/static_root/assets/{VToolbar-C__BHwZO.73f9b9fcc254.js → VToolbar-CnoJq5Ck.js} +2 -2
- codex/static_root/assets/VToolbar-CnoJq5Ck.js.br +0 -0
- codex/static_root/assets/VToolbar-CnoJq5Ck.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-BMdyDd7Q.e61cc304e3bc.js → VWindowItem-Cq-qPd5h.291287bcb566.js} +1 -1
- codex/static_root/assets/VWindowItem-Cq-qPd5h.291287bcb566.js.br +0 -0
- codex/static_root/assets/VWindowItem-Cq-qPd5h.291287bcb566.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-BMdyDd7Q.js → VWindowItem-Cq-qPd5h.js} +1 -1
- codex/static_root/assets/VWindowItem-Cq-qPd5h.js.br +0 -0
- codex/static_root/assets/VWindowItem-Cq-qPd5h.js.gz +0 -0
- codex/static_root/assets/{admin-D-946Bk9.1a17b45a08d8.js → admin-3sFieyVL.7a879e617e60.js} +1 -1
- codex/static_root/assets/admin-3sFieyVL.7a879e617e60.js.br +0 -0
- codex/static_root/assets/admin-3sFieyVL.7a879e617e60.js.gz +0 -0
- codex/static_root/assets/{admin-D-946Bk9.js → admin-3sFieyVL.js} +1 -1
- codex/static_root/assets/admin-3sFieyVL.js.br +0 -0
- codex/static_root/assets/admin-3sFieyVL.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-Bd9_K-7V.b774e66b1bc2.js → admin-drawer-panel-C5XtSLXl.f1df22cd1144.js} +2 -2
- codex/static_root/assets/admin-drawer-panel-C5XtSLXl.f1df22cd1144.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-C5XtSLXl.f1df22cd1144.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-Bd9_K-7V.js → admin-drawer-panel-C5XtSLXl.js} +2 -2
- codex/static_root/assets/admin-drawer-panel-C5XtSLXl.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-C5XtSLXl.js.gz +0 -0
- codex/static_root/assets/{browser-C8SJwVGz.0f7daf93b064.css → browser-2i0QA4La.587673ac534c.css} +1 -1
- codex/static_root/assets/browser-2i0QA4La.587673ac534c.css.br +0 -0
- codex/static_root/assets/browser-2i0QA4La.587673ac534c.css.gz +0 -0
- codex/static_root/assets/{browser-C8SJwVGz.css → browser-2i0QA4La.css} +1 -1
- codex/static_root/assets/browser-2i0QA4La.css.br +0 -0
- codex/static_root/assets/browser-2i0QA4La.css.gz +0 -0
- codex/static_root/assets/browser-I1ZoWm1m.76347934dab3.js +1 -0
- codex/static_root/assets/browser-I1ZoWm1m.76347934dab3.js.br +0 -0
- codex/static_root/assets/browser-I1ZoWm1m.76347934dab3.js.gz +0 -0
- codex/static_root/assets/browser-I1ZoWm1m.js +1 -0
- codex/static_root/assets/browser-I1ZoWm1m.js.br +0 -0
- codex/static_root/assets/browser-I1ZoWm1m.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-Du93DO_u.3a928f66b2c5.js → change-password-dialog-BkX8NP9F.6eec04396e20.js} +1 -1
- codex/static_root/assets/change-password-dialog-BkX8NP9F.6eec04396e20.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BkX8NP9F.6eec04396e20.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-Du93DO_u.js → change-password-dialog-BkX8NP9F.js} +1 -1
- codex/static_root/assets/change-password-dialog-BkX8NP9F.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BkX8NP9F.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-BSR80Q5F.96ab044bb178.js → confirm-dialog-CKiPNGTr.b80ae71d7170.js} +1 -1
- codex/static_root/assets/confirm-dialog-CKiPNGTr.b80ae71d7170.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CKiPNGTr.b80ae71d7170.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-BSR80Q5F.js → confirm-dialog-CKiPNGTr.js} +1 -1
- codex/static_root/assets/confirm-dialog-CKiPNGTr.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CKiPNGTr.js.gz +0 -0
- codex/static_root/assets/{confirm-footer-nURenNFu.js → confirm-footer-CP02GqhM.8ba00213022b.js} +1 -1
- codex/static_root/assets/confirm-footer-CP02GqhM.8ba00213022b.js.br +0 -0
- codex/static_root/assets/confirm-footer-CP02GqhM.8ba00213022b.js.gz +0 -0
- codex/static_root/assets/{confirm-footer-nURenNFu.4bb822f97114.js → confirm-footer-CP02GqhM.js} +1 -1
- codex/static_root/assets/confirm-footer-CP02GqhM.js.br +0 -0
- codex/static_root/assets/confirm-footer-CP02GqhM.js.gz +0 -0
- codex/static_root/assets/{datetime-column-CPhJtWvK.314a472a0e7f.js → datetime-column-BnilMk5Y.96201e187340.js} +1 -1
- codex/static_root/assets/datetime-column-BnilMk5Y.96201e187340.js.br +0 -0
- codex/static_root/assets/datetime-column-BnilMk5Y.96201e187340.js.gz +0 -0
- codex/static_root/assets/{datetime-column-CPhJtWvK.js → datetime-column-BnilMk5Y.js} +1 -1
- codex/static_root/assets/datetime-column-BnilMk5Y.js.br +0 -0
- codex/static_root/assets/datetime-column-BnilMk5Y.js.gz +0 -0
- codex/static_root/assets/{filter-tAmBa3uw.15b44720e800.js → filter-Dp8VoLoJ.7dcf871c2c5d.js} +1 -1
- codex/static_root/assets/filter-Dp8VoLoJ.7dcf871c2c5d.js.br +0 -0
- codex/static_root/assets/filter-Dp8VoLoJ.7dcf871c2c5d.js.gz +0 -0
- codex/static_root/assets/{filter-tAmBa3uw.js → filter-Dp8VoLoJ.js} +1 -1
- codex/static_root/assets/filter-Dp8VoLoJ.js.br +0 -0
- codex/static_root/assets/filter-Dp8VoLoJ.js.gz +0 -0
- codex/static_root/assets/flag-tab-BpATs2Vh.2ba1294488a2.js +1 -0
- codex/static_root/assets/flag-tab-BpATs2Vh.2ba1294488a2.js.br +0 -0
- codex/static_root/assets/flag-tab-BpATs2Vh.2ba1294488a2.js.gz +0 -0
- codex/static_root/assets/flag-tab-BpATs2Vh.js +1 -0
- codex/static_root/assets/flag-tab-BpATs2Vh.js.br +0 -0
- codex/static_root/assets/flag-tab-BpATs2Vh.js.gz +0 -0
- codex/static_root/assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css +1 -0
- codex/static_root/assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css.br +1 -0
- codex/static_root/assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css.gz +0 -0
- codex/static_root/assets/flag-tab-DUXtbpA2.css +1 -0
- codex/static_root/assets/flag-tab-DUXtbpA2.css.br +1 -0
- codex/static_root/assets/flag-tab-DUXtbpA2.css.gz +0 -0
- codex/static_root/assets/{group-tab-LuURRP5m.c03bbeac9517.js → group-tab-BMv-gfGN.08bf0e591bdd.js} +1 -1
- codex/static_root/assets/group-tab-BMv-gfGN.08bf0e591bdd.js.br +0 -0
- codex/static_root/assets/group-tab-BMv-gfGN.08bf0e591bdd.js.gz +0 -0
- codex/static_root/assets/{group-tab-LuURRP5m.js → group-tab-BMv-gfGN.js} +1 -1
- codex/static_root/assets/group-tab-BMv-gfGN.js.br +0 -0
- codex/static_root/assets/group-tab-BMv-gfGN.js.gz +0 -0
- codex/static_root/assets/{http-error-BmImTNGc.c47768a115e0.js → http-error-Cb6Mqj4J.064dffeb574f.js} +1 -1
- codex/static_root/assets/http-error-Cb6Mqj4J.064dffeb574f.js.br +0 -0
- codex/static_root/assets/http-error-Cb6Mqj4J.064dffeb574f.js.gz +0 -0
- codex/static_root/assets/{http-error-BmImTNGc.js → http-error-Cb6Mqj4J.js} +1 -1
- codex/static_root/assets/http-error-Cb6Mqj4J.js.br +0 -0
- codex/static_root/assets/http-error-Cb6Mqj4J.js.gz +0 -0
- codex/static_root/assets/{library-tab-Df9FgT1K.82069fa06937.js → library-tab-CqPR7agm.db811498ed9a.js} +1 -1
- codex/static_root/assets/library-tab-CqPR7agm.db811498ed9a.js.br +0 -0
- codex/static_root/assets/library-tab-CqPR7agm.db811498ed9a.js.gz +0 -0
- codex/static_root/assets/{library-tab-Df9FgT1K.js → library-tab-CqPR7agm.js} +1 -1
- codex/static_root/assets/library-tab-CqPR7agm.js.br +0 -0
- codex/static_root/assets/library-tab-CqPR7agm.js.gz +0 -0
- codex/static_root/assets/{main-B0Xaei3w.js → main-D1r3hZ0f.d05c749b9988.js} +4 -4
- codex/static_root/assets/main-D1r3hZ0f.d05c749b9988.js.br +0 -0
- codex/static_root/assets/main-D1r3hZ0f.d05c749b9988.js.gz +0 -0
- codex/static_root/assets/{main-B0Xaei3w.311de98197bd.js → main-D1r3hZ0f.js} +4 -4
- codex/static_root/assets/main-D1r3hZ0f.js.br +0 -0
- codex/static_root/assets/main-D1r3hZ0f.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-B8UtDnAu.f3947fec119f.js +1 -0
- codex/static_root/assets/metadata-dialog-B8UtDnAu.f3947fec119f.js.br +0 -0
- codex/static_root/assets/metadata-dialog-B8UtDnAu.f3947fec119f.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-B8UtDnAu.js +1 -0
- codex/static_root/assets/metadata-dialog-B8UtDnAu.js.br +0 -0
- codex/static_root/assets/metadata-dialog-B8UtDnAu.js.gz +0 -0
- codex/static_root/assets/{metadata-dialog-uikP6x2m.84a7b6c4b6b9.css → metadata-dialog-BGJasBRy.0553851658b5.css} +1 -1
- codex/static_root/assets/metadata-dialog-BGJasBRy.0553851658b5.css.br +0 -0
- codex/static_root/assets/metadata-dialog-BGJasBRy.0553851658b5.css.gz +0 -0
- codex/static_root/assets/{metadata-dialog-uikP6x2m.css → metadata-dialog-BGJasBRy.css} +1 -1
- codex/static_root/assets/metadata-dialog-BGJasBRy.css.br +0 -0
- codex/static_root/assets/metadata-dialog-BGJasBRy.css.gz +0 -0
- codex/static_root/assets/{pdf-doc-8cjxNrmX.fb89731e22ec.js → pdf-doc-DWjSqsgP.12c6022d08b7.js} +1 -1
- codex/static_root/assets/pdf-doc-DWjSqsgP.12c6022d08b7.js.br +0 -0
- codex/static_root/assets/pdf-doc-DWjSqsgP.12c6022d08b7.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-8cjxNrmX.js → pdf-doc-DWjSqsgP.js} +1 -1
- codex/static_root/assets/pdf-doc-DWjSqsgP.js.br +0 -0
- codex/static_root/assets/pdf-doc-DWjSqsgP.js.gz +0 -0
- codex/static_root/assets/reader-DsBRqChH.ae8ffff757c7.js +7 -0
- codex/static_root/assets/reader-DsBRqChH.ae8ffff757c7.js.br +0 -0
- codex/static_root/assets/reader-DsBRqChH.ae8ffff757c7.js.gz +0 -0
- codex/static_root/assets/reader-DsBRqChH.js +7 -0
- codex/static_root/assets/reader-DsBRqChH.js.br +0 -0
- codex/static_root/assets/reader-DsBRqChH.js.gz +0 -0
- codex/static_root/assets/{stats-tab-iyf0Qopa.319d016c0042.js → stats-tab-BFuWdQ3i.625b51e3ee5b.js} +1 -1
- codex/static_root/assets/stats-tab-BFuWdQ3i.625b51e3ee5b.js.br +0 -0
- codex/static_root/assets/stats-tab-BFuWdQ3i.625b51e3ee5b.js.gz +0 -0
- codex/static_root/assets/{stats-tab-iyf0Qopa.js → stats-tab-BFuWdQ3i.js} +1 -1
- codex/static_root/assets/stats-tab-BFuWdQ3i.js.br +0 -0
- codex/static_root/assets/stats-tab-BFuWdQ3i.js.gz +0 -0
- codex/static_root/assets/{task-tab-BaQoEc3u.836bc4466809.js → task-tab-DrTBYMCB.ac4473d3a137.js} +1 -1
- codex/static_root/assets/task-tab-DrTBYMCB.ac4473d3a137.js.br +0 -0
- codex/static_root/assets/task-tab-DrTBYMCB.ac4473d3a137.js.gz +0 -0
- codex/static_root/assets/{task-tab-BaQoEc3u.js → task-tab-DrTBYMCB.js} +1 -1
- codex/static_root/assets/task-tab-DrTBYMCB.js.br +0 -0
- codex/static_root/assets/task-tab-DrTBYMCB.js.gz +0 -0
- codex/static_root/assets/{user-tab-DPtaql0P.c5afb006dbe1.js → user-tab-CYzh_eX6.a2470464a951.js} +1 -1
- codex/static_root/assets/user-tab-CYzh_eX6.a2470464a951.js.br +0 -0
- codex/static_root/assets/user-tab-CYzh_eX6.a2470464a951.js.gz +0 -0
- codex/static_root/assets/{user-tab-DPtaql0P.js → user-tab-CYzh_eX6.js} +1 -1
- codex/static_root/assets/user-tab-CYzh_eX6.js.br +0 -0
- codex/static_root/assets/user-tab-CYzh_eX6.js.gz +0 -0
- codex/static_root/js/{choices-admin.3a2cdebdbfba.json → choices-admin.bb730e4f26ac.json} +1 -1
- codex/static_root/js/choices-admin.bb730e4f26ac.json.br +0 -0
- codex/static_root/js/{choices-admin.3a2cdebdbfba.json.gz → choices-admin.bb730e4f26ac.json.gz} +0 -0
- codex/static_root/js/choices-admin.json +1 -1
- codex/static_root/js/choices-admin.json.br +0 -0
- codex/static_root/js/choices-admin.json.gz +0 -0
- codex/static_root/{manifest.59b649b89398.json → manifest.07a0961655a3.json} +209 -209
- codex/static_root/manifest.07a0961655a3.json.br +0 -0
- codex/static_root/manifest.07a0961655a3.json.gz +0 -0
- codex/static_root/manifest.json +209 -209
- 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/search/indexes/codex/comic_text.txt +1 -1
- codex/views/browser/base.py +4 -1
- codex/views/browser/browser.py +19 -14
- codex/views/browser/choices.py +2 -0
- codex/views/browser/filters/search.py +3 -1
- codex/views/browser/metadata.py +12 -6
- codex/views/reader/reader.py +53 -5
- {codex-1.5.7rc0.dist-info → codex-1.5.8.dist-info}/METADATA +1 -1
- {codex-1.5.7rc0.dist-info → codex-1.5.8.dist-info}/RECORD +242 -242
- codex/static_root/assets/VCheckbox-CSvjBFR1.531e0fc38f24.js.br +0 -0
- codex/static_root/assets/VCheckbox-CSvjBFR1.531e0fc38f24.js.gz +0 -0
- codex/static_root/assets/VCheckbox-CSvjBFR1.js.br +0 -0
- codex/static_root/assets/VCheckbox-CSvjBFR1.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-CQ4VhpyA.cb28dccb8bd0.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-CQ4VhpyA.cb28dccb8bd0.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-CQ4VhpyA.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-CQ4VhpyA.js.gz +0 -0
- codex/static_root/assets/VCombobox-DmqwaLY4.d4e984321966.js.br +0 -0
- codex/static_root/assets/VCombobox-DmqwaLY4.d4e984321966.js.gz +0 -0
- codex/static_root/assets/VCombobox-DmqwaLY4.js.br +0 -0
- codex/static_root/assets/VCombobox-DmqwaLY4.js.gz +0 -0
- codex/static_root/assets/VDataTableVirtual-6f42V3Lt.7bd15f89e179.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-6f42V3Lt.7bd15f89e179.js.gz +0 -0
- codex/static_root/assets/VDataTableVirtual-6f42V3Lt.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-6f42V3Lt.js.gz +0 -0
- codex/static_root/assets/VExpansionPanel-HxmPRHLI.2f46f7785043.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-HxmPRHLI.2f46f7785043.js.gz +0 -0
- codex/static_root/assets/VExpansionPanel-HxmPRHLI.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-HxmPRHLI.js.gz +0 -0
- codex/static_root/assets/VMain-C67fPCUj.c0f7b7a893b2.js.br +0 -0
- codex/static_root/assets/VMain-C67fPCUj.c0f7b7a893b2.js.gz +0 -0
- codex/static_root/assets/VMain-C67fPCUj.js.br +0 -0
- codex/static_root/assets/VMain-C67fPCUj.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-DlFy7v1Z.9e5a0c60e667.js.br +0 -0
- codex/static_root/assets/VRadioGroup-DlFy7v1Z.9e5a0c60e667.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-DlFy7v1Z.js.br +0 -0
- codex/static_root/assets/VRadioGroup-DlFy7v1Z.js.gz +0 -0
- codex/static_root/assets/VSelect-O_Yn2sND.d7879a023bd9.js.br +0 -0
- codex/static_root/assets/VSelect-O_Yn2sND.d7879a023bd9.js.gz +0 -0
- codex/static_root/assets/VSelect-O_Yn2sND.js.br +0 -0
- codex/static_root/assets/VSelect-O_Yn2sND.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-DP64P5MF.ca35648c092a.js.br +0 -0
- codex/static_root/assets/VSelectionControl-DP64P5MF.ca35648c092a.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-DP64P5MF.js.br +0 -0
- codex/static_root/assets/VSelectionControl-DP64P5MF.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-DOKbHMCv.23352d03450c.js.br +0 -0
- codex/static_root/assets/VSlideGroup-DOKbHMCv.23352d03450c.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-DOKbHMCv.js.br +0 -0
- codex/static_root/assets/VSlideGroup-DOKbHMCv.js.gz +0 -0
- codex/static_root/assets/VTable-CtRSR9wI.ab498162ec9a.js.br +0 -0
- codex/static_root/assets/VTable-CtRSR9wI.ab498162ec9a.js.gz +0 -0
- codex/static_root/assets/VTable-CtRSR9wI.js.br +0 -0
- codex/static_root/assets/VTable-CtRSR9wI.js.gz +0 -0
- codex/static_root/assets/VToolbar-C__BHwZO.73f9b9fcc254.js.br +0 -0
- codex/static_root/assets/VToolbar-C__BHwZO.73f9b9fcc254.js.gz +0 -0
- codex/static_root/assets/VToolbar-C__BHwZO.js.br +0 -0
- codex/static_root/assets/VToolbar-C__BHwZO.js.gz +0 -0
- codex/static_root/assets/VWindowItem-BMdyDd7Q.e61cc304e3bc.js.br +0 -0
- codex/static_root/assets/VWindowItem-BMdyDd7Q.e61cc304e3bc.js.gz +0 -0
- codex/static_root/assets/VWindowItem-BMdyDd7Q.js.br +0 -0
- codex/static_root/assets/VWindowItem-BMdyDd7Q.js.gz +0 -0
- codex/static_root/assets/admin-D-946Bk9.1a17b45a08d8.js.br +0 -0
- codex/static_root/assets/admin-D-946Bk9.1a17b45a08d8.js.gz +0 -0
- codex/static_root/assets/admin-D-946Bk9.js.br +0 -0
- codex/static_root/assets/admin-D-946Bk9.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-Bd9_K-7V.b774e66b1bc2.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-Bd9_K-7V.b774e66b1bc2.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-Bd9_K-7V.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-Bd9_K-7V.js.gz +0 -0
- codex/static_root/assets/browser-C8SJwVGz.0f7daf93b064.css.br +0 -0
- codex/static_root/assets/browser-C8SJwVGz.0f7daf93b064.css.gz +0 -0
- codex/static_root/assets/browser-C8SJwVGz.css.br +0 -0
- codex/static_root/assets/browser-C8SJwVGz.css.gz +0 -0
- codex/static_root/assets/browser-DGl3vPo9.dcab8c37c67b.js +0 -1
- codex/static_root/assets/browser-DGl3vPo9.dcab8c37c67b.js.br +0 -0
- codex/static_root/assets/browser-DGl3vPo9.dcab8c37c67b.js.gz +0 -0
- codex/static_root/assets/browser-DGl3vPo9.js +0 -1
- codex/static_root/assets/browser-DGl3vPo9.js.br +0 -0
- codex/static_root/assets/browser-DGl3vPo9.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-Du93DO_u.3a928f66b2c5.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Du93DO_u.3a928f66b2c5.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-Du93DO_u.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Du93DO_u.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-BSR80Q5F.96ab044bb178.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BSR80Q5F.96ab044bb178.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-BSR80Q5F.js.br +0 -0
- codex/static_root/assets/confirm-dialog-BSR80Q5F.js.gz +0 -0
- codex/static_root/assets/confirm-footer-nURenNFu.4bb822f97114.js.br +0 -0
- codex/static_root/assets/confirm-footer-nURenNFu.4bb822f97114.js.gz +0 -0
- codex/static_root/assets/confirm-footer-nURenNFu.js.br +0 -0
- codex/static_root/assets/confirm-footer-nURenNFu.js.gz +0 -0
- codex/static_root/assets/datetime-column-CPhJtWvK.314a472a0e7f.js.br +0 -0
- codex/static_root/assets/datetime-column-CPhJtWvK.314a472a0e7f.js.gz +0 -0
- codex/static_root/assets/datetime-column-CPhJtWvK.js.br +0 -0
- codex/static_root/assets/datetime-column-CPhJtWvK.js.gz +0 -0
- codex/static_root/assets/filter-tAmBa3uw.15b44720e800.js.br +0 -0
- codex/static_root/assets/filter-tAmBa3uw.15b44720e800.js.gz +0 -0
- codex/static_root/assets/filter-tAmBa3uw.js.br +0 -0
- codex/static_root/assets/filter-tAmBa3uw.js.gz +0 -0
- codex/static_root/assets/flag-tab-BTiZcgOa.81b4fefa02e1.css +0 -1
- codex/static_root/assets/flag-tab-BTiZcgOa.81b4fefa02e1.css.br +0 -1
- codex/static_root/assets/flag-tab-BTiZcgOa.81b4fefa02e1.css.gz +0 -0
- codex/static_root/assets/flag-tab-BTiZcgOa.css +0 -1
- codex/static_root/assets/flag-tab-BTiZcgOa.css.br +0 -1
- codex/static_root/assets/flag-tab-BTiZcgOa.css.gz +0 -0
- codex/static_root/assets/flag-tab-DvygpEAZ.6406b06b01fc.js +0 -1
- codex/static_root/assets/flag-tab-DvygpEAZ.6406b06b01fc.js.br +0 -0
- codex/static_root/assets/flag-tab-DvygpEAZ.6406b06b01fc.js.gz +0 -0
- codex/static_root/assets/flag-tab-DvygpEAZ.js +0 -1
- codex/static_root/assets/flag-tab-DvygpEAZ.js.br +0 -0
- codex/static_root/assets/flag-tab-DvygpEAZ.js.gz +0 -0
- codex/static_root/assets/group-tab-LuURRP5m.c03bbeac9517.js.br +0 -0
- codex/static_root/assets/group-tab-LuURRP5m.c03bbeac9517.js.gz +0 -0
- codex/static_root/assets/group-tab-LuURRP5m.js.br +0 -0
- codex/static_root/assets/group-tab-LuURRP5m.js.gz +0 -0
- codex/static_root/assets/http-error-BmImTNGc.c47768a115e0.js.br +0 -0
- codex/static_root/assets/http-error-BmImTNGc.c47768a115e0.js.gz +0 -0
- codex/static_root/assets/http-error-BmImTNGc.js.br +0 -0
- codex/static_root/assets/http-error-BmImTNGc.js.gz +0 -0
- codex/static_root/assets/library-tab-Df9FgT1K.82069fa06937.js.br +0 -0
- codex/static_root/assets/library-tab-Df9FgT1K.82069fa06937.js.gz +0 -0
- codex/static_root/assets/library-tab-Df9FgT1K.js.br +0 -0
- codex/static_root/assets/library-tab-Df9FgT1K.js.gz +0 -0
- codex/static_root/assets/main-B0Xaei3w.311de98197bd.js.br +0 -0
- codex/static_root/assets/main-B0Xaei3w.311de98197bd.js.gz +0 -0
- codex/static_root/assets/main-B0Xaei3w.js.br +0 -0
- codex/static_root/assets/main-B0Xaei3w.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-MaFloIhA.95f94d1ee1a1.js +0 -1
- codex/static_root/assets/metadata-dialog-MaFloIhA.95f94d1ee1a1.js.br +0 -0
- codex/static_root/assets/metadata-dialog-MaFloIhA.95f94d1ee1a1.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-MaFloIhA.js +0 -1
- codex/static_root/assets/metadata-dialog-MaFloIhA.js.br +0 -0
- codex/static_root/assets/metadata-dialog-MaFloIhA.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-uikP6x2m.84a7b6c4b6b9.css.br +0 -0
- codex/static_root/assets/metadata-dialog-uikP6x2m.84a7b6c4b6b9.css.gz +0 -0
- codex/static_root/assets/metadata-dialog-uikP6x2m.css.br +0 -0
- codex/static_root/assets/metadata-dialog-uikP6x2m.css.gz +0 -0
- codex/static_root/assets/pdf-doc-8cjxNrmX.fb89731e22ec.js.br +0 -0
- codex/static_root/assets/pdf-doc-8cjxNrmX.fb89731e22ec.js.gz +0 -0
- codex/static_root/assets/pdf-doc-8cjxNrmX.js.br +0 -0
- codex/static_root/assets/pdf-doc-8cjxNrmX.js.gz +0 -0
- codex/static_root/assets/reader-T8uF7cx9.e29141aaba35.js +0 -7
- codex/static_root/assets/reader-T8uF7cx9.e29141aaba35.js.br +0 -0
- codex/static_root/assets/reader-T8uF7cx9.e29141aaba35.js.gz +0 -0
- codex/static_root/assets/reader-T8uF7cx9.js +0 -7
- codex/static_root/assets/reader-T8uF7cx9.js.br +0 -0
- codex/static_root/assets/reader-T8uF7cx9.js.gz +0 -0
- codex/static_root/assets/stats-tab-iyf0Qopa.319d016c0042.js.br +0 -0
- codex/static_root/assets/stats-tab-iyf0Qopa.319d016c0042.js.gz +0 -0
- codex/static_root/assets/stats-tab-iyf0Qopa.js.br +0 -0
- codex/static_root/assets/stats-tab-iyf0Qopa.js.gz +0 -0
- codex/static_root/assets/task-tab-BaQoEc3u.836bc4466809.js.br +0 -0
- codex/static_root/assets/task-tab-BaQoEc3u.836bc4466809.js.gz +0 -0
- codex/static_root/assets/task-tab-BaQoEc3u.js.br +0 -0
- codex/static_root/assets/task-tab-BaQoEc3u.js.gz +0 -0
- codex/static_root/assets/user-tab-DPtaql0P.c5afb006dbe1.js.br +0 -0
- codex/static_root/assets/user-tab-DPtaql0P.c5afb006dbe1.js.gz +0 -0
- codex/static_root/assets/user-tab-DPtaql0P.js.br +0 -0
- codex/static_root/assets/user-tab-DPtaql0P.js.gz +0 -0
- codex/static_root/js/choices-admin.3a2cdebdbfba.json.br +0 -0
- codex/static_root/manifest.59b649b89398.json.br +0 -0
- codex/static_root/manifest.59b649b89398.json.gz +0 -0
- {codex-1.5.7rc0.dist-info → codex-1.5.8.dist-info}/LICENSE +0 -0
- {codex-1.5.7rc0.dist-info → codex-1.5.8.dist-info}/WHEEL +0 -0
- {codex-1.5.7rc0.dist-info → codex-1.5.8.dist-info}/entry_points.txt +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "img/logo-maskable.svg": "img/logo-maskable.d618c2d7943f.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.201cbde62d55.webp", "img/logo.svg": "img/logo.3fb129bfbd92.svg", "img/missing-cover.webp": "img/missing-cover.8c8c1d4f6782.webp", "img/missing-page.svg": "img/missing-page.71bb10f7c72a.svg", "img/logo-32.webp": "img/logo-32.dbb98f6dfde4.webp", "js/choices.json": "js/choices.fedcbd1ec085.json", "js/choices-admin.json": "js/choices-admin.
|
|
1
|
+
{"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "img/logo-maskable.svg": "img/logo-maskable.d618c2d7943f.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.201cbde62d55.webp", "img/logo.svg": "img/logo.3fb129bfbd92.svg", "img/missing-cover.webp": "img/missing-cover.8c8c1d4f6782.webp", "img/missing-page.svg": "img/missing-page.71bb10f7c72a.svg", "img/logo-32.webp": "img/logo-32.dbb98f6dfde4.webp", "js/choices.json": "js/choices.fedcbd1ec085.json", "js/choices-admin.json": "js/choices-admin.bb730e4f26ac.json", "assets/stats-tab-BFuWdQ3i.js": "assets/stats-tab-BFuWdQ3i.625b51e3ee5b.js", "assets/VTable-CXI0Xaio.js": "assets/VTable-CXI0Xaio.06b95b33adaf.js", "assets/confirm-footer-CP02GqhM.js": "assets/confirm-footer-CP02GqhM.8ba00213022b.js", "assets/datetime-column-BnilMk5Y.js": "assets/datetime-column-BnilMk5Y.96201e187340.js", "assets/VSelectionControl-D0ha1VYk.js": "assets/VSelectionControl-D0ha1VYk.60bd3aeb20e1.js", "assets/admin-3sFieyVL.js": "assets/admin-3sFieyVL.7a879e617e60.js", "assets/user-tab-CYzh_eX6.js": "assets/user-tab-CYzh_eX6.a2470464a951.js", "assets/datetime-column-BWWfvyhn.css": "assets/datetime-column-BWWfvyhn.a4a94ba57c73.css", "assets/admin-drawer-panel-DEYM8FWr.css": "assets/admin-drawer-panel-DEYM8FWr.512d367edaca.css", "assets/task-tab-DrTBYMCB.js": "assets/task-tab-DrTBYMCB.ac4473d3a137.js", "assets/http-error-Cb6Mqj4J.js": "assets/http-error-Cb6Mqj4J.064dffeb574f.js", "assets/VDataTableVirtual-ohR-xfIW.js": "assets/VDataTableVirtual-ohR-xfIW.54047fbf2e77.js", "assets/VToolbar-CnoJq5Ck.js": "assets/VToolbar-CnoJq5Ck.5b3dcfbf1c77.js", "assets/VSelect-YSL0tIop.js": "assets/VSelect-YSL0tIop.c23c0657cf17.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/flag-tab-BpATs2Vh.js": "assets/flag-tab-BpATs2Vh.2ba1294488a2.js", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/VMain-Byt37V4c.css": "assets/VMain-Byt37V4c.a00e206f3cfa.css", "assets/VMain-BcP4P6kJ.js": "assets/VMain-BcP4P6kJ.26ba71b71a30.js", "assets/confirm-dialog-CKiPNGTr.js": "assets/confirm-dialog-CKiPNGTr.b80ae71d7170.js", "assets/pdf-doc-DWjSqsgP.js": "assets/pdf-doc-DWjSqsgP.12c6022d08b7.js", "assets/stats-tab-BTZLMBCU.css": "assets/stats-tab-BTZLMBCU.7e0a9547c12e.css", "assets/confirm-footer-VFepxcJs.css": "assets/confirm-footer-VFepxcJs.4150131304bd.css", "assets/VSlideGroup-BW6pFVGY.js": "assets/VSlideGroup-BW6pFVGY.13cecf1a7794.js", "assets/library-tab-CqPR7agm.js": "assets/library-tab-CqPR7agm.db811498ed9a.js", "assets/change-password-dialog-BRmvkNir.css": "assets/change-password-dialog-BRmvkNir.2fead58a78c7.css", "assets/library-tab-DZKDtQ5v.css": "assets/library-tab-DZKDtQ5v.c8123e4bc5a4.css", "assets/to-case-kUm8NPpW.js": "assets/to-case-kUm8NPpW.5b3369f511b8.js", "assets/browser-I1ZoWm1m.js": "assets/browser-I1ZoWm1m.76347934dab3.js", "assets/main-CacfwsKA.css": "assets/main-CacfwsKA.4f849ef1c5db.css", "assets/reader-DsBRqChH.js": "assets/reader-DsBRqChH.ae8ffff757c7.js", "assets/metadata-dialog-BGJasBRy.css": "assets/metadata-dialog-BGJasBRy.0553851658b5.css", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/admin-drawer-panel-C5XtSLXl.js": "assets/admin-drawer-panel-C5XtSLXl.f1df22cd1144.js", "assets/change-password-dialog-BkX8NP9F.js": "assets/change-password-dialog-BkX8NP9F.6eec04396e20.js", "assets/VExpansionPanel-D77IHp4B.js": "assets/VExpansionPanel-D77IHp4B.fe0052639210.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/browser-2i0QA4La.css": "assets/browser-2i0QA4La.587673ac534c.css", "assets/VWindowItem-Cq-qPd5h.js": "assets/VWindowItem-Cq-qPd5h.291287bcb566.js", "assets/main-D1r3hZ0f.js": "assets/main-D1r3hZ0f.d05c749b9988.js", "assets/VSelect-udkSZJsa.css": "assets/VSelect-udkSZJsa.1873bae92d9d.css", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/reader-CG6zrLXl.css": "assets/reader-CG6zrLXl.ed017042cd53.css", "assets/VCheckboxBtn-DQTVBkac.js": "assets/VCheckboxBtn-DQTVBkac.93f2be0971d2.js", "assets/task-tab-DoX9OA37.css": "assets/task-tab-DoX9OA37.9bb355f36dbf.css", "assets/VDataTableVirtual-Cbj7IGxa.css": "assets/VDataTableVirtual-Cbj7IGxa.24039b2ebc61.css", "assets/VRadioGroup-DQQmB99C.js": "assets/VRadioGroup-DQQmB99C.8e62ca305d42.js", "assets/metadata-dialog-B8UtDnAu.js": "assets/metadata-dialog-B8UtDnAu.f3947fec119f.js", "assets/index-DUjeNg4x.js": "assets/index-DUjeNg4x.36d50c91b2c1.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/VCheckbox-CAnsONJ8.js": "assets/VCheckbox-CAnsONJ8.1d8ba3df8d9f.js", "assets/VCombobox-xgzcfu8j.js": "assets/VCombobox-xgzcfu8j.85e27125105c.js", "assets/flag-tab-DUXtbpA2.css": "assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css", "assets/http-error-C25WdjWC.css": "assets/http-error-C25WdjWC.1c7337ad6e1d.css", "assets/VToolbar-BfNszTMd.css": "assets/VToolbar-BfNszTMd.111f25cdd6d8.css", "assets/VExpansionPanel-BgvW2DKJ.css": "assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/filter-Dp8VoLoJ.js": "assets/filter-Dp8VoLoJ.7dcf871c2c5d.js", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/VSlideGroup-rAVUcz72.css": "assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/group-tab-BMv-gfGN.js": "assets/group-tab-BMv-gfGN.08bf0e591bdd.js", "assets/group-tab-3DXxSetf.css": "assets/group-tab-3DXxSetf.5fc2cfa31669.css", "assets/admin-Df82-Qcj.css": "assets/admin-Df82-Qcj.4c3f0406ee54.css", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.07a0961655a3.json"}, "version": "1.1", "hash": "7eb757288772"}
|
codex/views/browser/base.py
CHANGED
|
@@ -6,6 +6,7 @@ from types import MappingProxyType
|
|
|
6
6
|
from urllib.parse import unquote_plus
|
|
7
7
|
|
|
8
8
|
from django.contrib.auth.models import User
|
|
9
|
+
from django.db.models import Q
|
|
9
10
|
from djangorestframework_camel_case.settings import api_settings
|
|
10
11
|
from djangorestframework_camel_case.util import underscoreize
|
|
11
12
|
|
|
@@ -71,8 +72,10 @@ class BrowserBaseView(
|
|
|
71
72
|
object_filter &= self.get_comic_field_filter(self.rel_prefix)
|
|
72
73
|
return object_filter
|
|
73
74
|
|
|
74
|
-
def get_query_filters(self, model, search_scores: dict, choices=False):
|
|
75
|
+
def get_query_filters(self, model, search_scores: dict | None, choices=False):
|
|
75
76
|
"""Return the main object filter and the one for aggregates."""
|
|
77
|
+
if search_scores is None:
|
|
78
|
+
return Q(False)
|
|
76
79
|
object_filter = self.get_query_filters_without_group(model, search_scores)
|
|
77
80
|
object_filter &= self.get_group_filter(choices)
|
|
78
81
|
return object_filter
|
codex/views/browser/browser.py
CHANGED
|
@@ -43,9 +43,6 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
43
43
|
serializer_class = BrowserPageSerializer
|
|
44
44
|
|
|
45
45
|
MAX_OBJ_PER_PAGE = 100
|
|
46
|
-
_MODEL_GROUP_MAP = MappingProxyType(
|
|
47
|
-
{v: k for k, v in BrowserAnnotationsView.GROUP_MODEL_MAP.items()}
|
|
48
|
-
)
|
|
49
46
|
_NAV_GROUPS = "rpisv"
|
|
50
47
|
|
|
51
48
|
_GROUP_INSTANCE_SELECT_RELATED = MappingProxyType(
|
|
@@ -105,7 +102,6 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
105
102
|
queryset = self.annotate_common_aggregates(queryset, model, search_scores)
|
|
106
103
|
|
|
107
104
|
# Annotate Group
|
|
108
|
-
self.model_group = self._MODEL_GROUP_MAP[model]
|
|
109
105
|
queryset = queryset.annotate(
|
|
110
106
|
group=Value(self.model_group, CharField(max_length=1))
|
|
111
107
|
)
|
|
@@ -133,15 +129,15 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
133
129
|
group = self.kwargs["group"]
|
|
134
130
|
self.group_class = self.GROUP_MODEL_MAP[group]
|
|
135
131
|
|
|
136
|
-
model_group = self._get_model_group()
|
|
137
|
-
self.model = self.GROUP_MODEL_MAP[model_group]
|
|
132
|
+
self.model_group = self._get_model_group()
|
|
133
|
+
self.model = self.GROUP_MODEL_MAP[self.model_group]
|
|
138
134
|
|
|
139
|
-
def _get_group_queryset(self, search_scores: dict):
|
|
135
|
+
def _get_group_queryset(self, search_scores: dict | None):
|
|
140
136
|
"""Create group queryset."""
|
|
141
137
|
if not self.model:
|
|
142
138
|
reason = "Model not set in browser."
|
|
143
139
|
raise ValueError(reason)
|
|
144
|
-
if self.model != Comic:
|
|
140
|
+
if self.model != Comic and search_scores is not None:
|
|
145
141
|
object_filter = self.get_query_filters(self.model, search_scores, False)
|
|
146
142
|
qs = self.model.objects.filter(object_filter)
|
|
147
143
|
qs = self._add_annotations(qs, self.model, search_scores)
|
|
@@ -150,9 +146,9 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
150
146
|
qs = self.model.objects.none()
|
|
151
147
|
return qs
|
|
152
148
|
|
|
153
|
-
def _get_book_queryset(self, search_scores: dict):
|
|
149
|
+
def _get_book_queryset(self, search_scores: dict | None):
|
|
154
150
|
"""Create book queryset."""
|
|
155
|
-
if self.model in (Comic, Folder):
|
|
151
|
+
if self.model in (Comic, Folder) and search_scores is not None:
|
|
156
152
|
object_filter = self.get_query_filters(Comic, search_scores, False)
|
|
157
153
|
qs = Comic.objects.filter(object_filter)
|
|
158
154
|
qs = self._add_annotations(qs, Comic, search_scores)
|
|
@@ -357,7 +353,7 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
357
353
|
self.set_rel_prefix(self.model)
|
|
358
354
|
self._set_group_instance() # Placed up here to invalidate earlier
|
|
359
355
|
# Create the main query with the filters
|
|
360
|
-
search_scores: dict = self.get_search_scores()
|
|
356
|
+
search_scores: dict | None = self.get_search_scores()
|
|
361
357
|
group = self.kwargs.get("group")
|
|
362
358
|
|
|
363
359
|
group_qs = self._get_group_queryset(search_scores)
|
|
@@ -380,9 +376,18 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
380
376
|
else:
|
|
381
377
|
up_route = {}
|
|
382
378
|
|
|
383
|
-
|
|
384
|
-
|
|
379
|
+
admin_flag_objs = AdminFlag.objects.only("on").filter(
|
|
380
|
+
key__in=(
|
|
381
|
+
AdminFlag.FlagChoices.FOLDER_VIEW.value,
|
|
382
|
+
AdminFlag.FlagChoices.IMPORT_METADATA.value,
|
|
383
|
+
)
|
|
385
384
|
)
|
|
385
|
+
admin_flags = {}
|
|
386
|
+
for flag in admin_flag_objs:
|
|
387
|
+
if flag.key == AdminFlag.FlagChoices.FOLDER_VIEW.value:
|
|
388
|
+
admin_flags["folder_view"] = flag.on
|
|
389
|
+
if flag.key == AdminFlag.FlagChoices.IMPORT_METADATA.value:
|
|
390
|
+
admin_flags["import_metadata"] = flag.on
|
|
386
391
|
|
|
387
392
|
libraries_exist = Library.objects.exists()
|
|
388
393
|
|
|
@@ -408,7 +413,7 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
408
413
|
"issue_number_max": issue_number_max,
|
|
409
414
|
"num_pages": num_pages,
|
|
410
415
|
"total_count": total_count,
|
|
411
|
-
"admin_flags":
|
|
416
|
+
"admin_flags": admin_flags,
|
|
412
417
|
"libraries_exist": libraries_exist,
|
|
413
418
|
"covers_timestamp": covers_timestamp,
|
|
414
419
|
}
|
codex/views/browser/choices.py
CHANGED
|
@@ -124,6 +124,8 @@ class BrowserChoicesViewBase(BrowserBaseView):
|
|
|
124
124
|
def get_object(self):
|
|
125
125
|
"""Get the comic subquery use for the choices."""
|
|
126
126
|
search_scores = self.get_search_scores()
|
|
127
|
+
if search_scores is None:
|
|
128
|
+
return self.model.objects.none() # type: ignore
|
|
127
129
|
object_filter = self.get_query_filters(self.model, search_scores, True)
|
|
128
130
|
return self.model.objects.filter(object_filter) # type: ignore
|
|
129
131
|
|
|
@@ -12,7 +12,7 @@ LOG = get_logger(__name__)
|
|
|
12
12
|
class SearchFilterMixin:
|
|
13
13
|
"""Search Filters Methods."""
|
|
14
14
|
|
|
15
|
-
def get_search_scores(self) -> dict:
|
|
15
|
+
def get_search_scores(self) -> dict | None:
|
|
16
16
|
"""Perform the search and return the scores as a dict."""
|
|
17
17
|
search_scores = {}
|
|
18
18
|
text = self.params.get("q", "") # type: ignore
|
|
@@ -32,6 +32,8 @@ class SearchFilterMixin:
|
|
|
32
32
|
LOG.warning("Search engine needs more memory, results truncated.")
|
|
33
33
|
except Exception:
|
|
34
34
|
LOG.exception("While Searching")
|
|
35
|
+
if not search_scores:
|
|
36
|
+
return None
|
|
35
37
|
return search_scores
|
|
36
38
|
|
|
37
39
|
def _get_search_query_filter(self, model, search_scores: dict):
|
codex/views/browser/metadata.py
CHANGED
|
@@ -227,6 +227,12 @@ class MetadataView(BrowserAnnotationsView):
|
|
|
227
227
|
|
|
228
228
|
return obj
|
|
229
229
|
|
|
230
|
+
def _raise_not_found(self, exc=None):
|
|
231
|
+
"""Raise an exception if the object is not found."""
|
|
232
|
+
pk = self.kwargs["pk"]
|
|
233
|
+
detail = f"Filtered metadata for {self.group}/{pk} not found"
|
|
234
|
+
raise NotFound(detail=detail) from exc
|
|
235
|
+
|
|
230
236
|
def get_object(self):
|
|
231
237
|
"""Create a comic-like object from the current browser group."""
|
|
232
238
|
# Comic model goes through the same code path as groups because
|
|
@@ -236,8 +242,10 @@ class MetadataView(BrowserAnnotationsView):
|
|
|
236
242
|
if self.model is None:
|
|
237
243
|
raise NotFound(detail=f"Cannot get metadata for {self.group=}")
|
|
238
244
|
|
|
239
|
-
search_scores: dict = self.get_search_scores()
|
|
240
|
-
|
|
245
|
+
search_scores: dict | None = self.get_search_scores()
|
|
246
|
+
if search_scores is None:
|
|
247
|
+
self._raise_not_found()
|
|
248
|
+
object_filter = self.get_query_filters_without_group(self.model, search_scores) # type: ignore
|
|
241
249
|
pk = self.kwargs["pk"]
|
|
242
250
|
qs = self.model.objects.filter(object_filter, pk=pk)
|
|
243
251
|
|
|
@@ -252,12 +260,10 @@ class MetadataView(BrowserAnnotationsView):
|
|
|
252
260
|
reason = "Empty obj"
|
|
253
261
|
raise ValueError(reason) # noqa TRY301
|
|
254
262
|
except (IndexError, ValueError) as exc:
|
|
255
|
-
|
|
256
|
-
detail=f"Filtered metadata for {self.group}/{pk} not found"
|
|
257
|
-
) from exc
|
|
263
|
+
self._raise_not_found(exc)
|
|
258
264
|
|
|
259
265
|
m2m_intersections = self._query_m2m_intersections(simple_qs)
|
|
260
|
-
return self._copy_annotations_into_comic_fields(obj, m2m_intersections)
|
|
266
|
+
return self._copy_annotations_into_comic_fields(obj, m2m_intersections) # type: ignore
|
|
261
267
|
|
|
262
268
|
def _is_enabled_folder_view(self):
|
|
263
269
|
if self._efv_flag is None:
|
codex/views/reader/reader.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Views for reading comic books."""
|
|
2
2
|
|
|
3
|
+
from comicbox.box import Comicbox
|
|
3
4
|
from django.db.models import F, IntegerField, Value
|
|
4
5
|
from django.urls import reverse
|
|
5
6
|
from drf_spectacular.types import OpenApiTypes
|
|
@@ -7,6 +8,8 @@ from drf_spectacular.utils import OpenApiParameter, extend_schema
|
|
|
7
8
|
from rest_framework.exceptions import NotFound
|
|
8
9
|
from rest_framework.response import Response
|
|
9
10
|
|
|
11
|
+
from codex.librarian.importer.tasks import LazyImportComicsTask
|
|
12
|
+
from codex.librarian.mp_queue import LIBRARIAN_QUEUE
|
|
10
13
|
from codex.logger.logging import get_logger
|
|
11
14
|
from codex.models import AdminFlag, Bookmark, Comic
|
|
12
15
|
from codex.serializers.reader import ReaderComicsSerializer
|
|
@@ -37,24 +40,32 @@ class ReaderView(BookmarkBaseView):
|
|
|
37
40
|
|
|
38
41
|
def _get_comics_list(self):
|
|
39
42
|
"""Get the reader naviation group filter."""
|
|
40
|
-
|
|
43
|
+
select_related = ("series", "volume")
|
|
44
|
+
prefetch_related = ()
|
|
41
45
|
|
|
46
|
+
arc_group = self.params.get("arc_group")
|
|
42
47
|
if arc_group == "a":
|
|
43
48
|
# for story arcs
|
|
44
49
|
rel = "story_arc_numbers__story_arc"
|
|
45
50
|
fields = self._COMIC_FIELDS
|
|
46
51
|
arc_name_rel = "story_arc_numbers__story_arc__name"
|
|
47
52
|
arc_pk_rel = "story_arc_numbers__story_arc__pk"
|
|
53
|
+
prefetch_related = (*prefetch_related, "story_arc_numbers__story_arc")
|
|
48
54
|
arc_index = F("story_arc_numbers__number")
|
|
49
55
|
ordering = ("arc_index", "date", *Comic.ORDERING)
|
|
56
|
+
arc_pk_select_related = ()
|
|
57
|
+
arc_pk_only = ("pk",)
|
|
50
58
|
elif arc_group == self.FOLDER_GROUP:
|
|
51
59
|
# folder mode
|
|
52
60
|
rel = "parent_folder"
|
|
53
61
|
fields = (*self._COMIC_FIELDS, "parent_folder")
|
|
54
62
|
arc_pk_rel = "parent_folder__pk"
|
|
55
63
|
arc_name_rel = "parent_folder__name"
|
|
64
|
+
select_related = (*select_related, "parent_folder")
|
|
56
65
|
arc_index = Value(None, IntegerField())
|
|
57
66
|
ordering = ("path", "pk")
|
|
67
|
+
arc_pk_select_related = ("parent_folder",)
|
|
68
|
+
arc_pk_only = arc_pk_select_related
|
|
58
69
|
else:
|
|
59
70
|
# browser mode.
|
|
60
71
|
rel = "series"
|
|
@@ -63,18 +74,29 @@ class ReaderView(BookmarkBaseView):
|
|
|
63
74
|
arc_name_rel = "series__name"
|
|
64
75
|
arc_index = Value(None, IntegerField())
|
|
65
76
|
ordering = Comic.ORDERING
|
|
77
|
+
arc_pk_select_related = ("series",)
|
|
78
|
+
arc_pk_only = arc_pk_select_related
|
|
66
79
|
|
|
67
|
-
group_acl_filter = self.get_group_acl_filter(Comic)
|
|
68
80
|
arc_pk = self.params.get("arc_pk")
|
|
69
81
|
if not arc_pk:
|
|
70
|
-
|
|
71
|
-
|
|
82
|
+
# Get the correct arc/folder/series if not submitted with a post.
|
|
83
|
+
pk = self.kwargs.get("pk")
|
|
84
|
+
arc_pk_qs = Comic.objects.filter(pk=pk)
|
|
85
|
+
arc_pk_qs = arc_pk_qs.select_related(*arc_pk_select_related)
|
|
86
|
+
arc_pk_qs = arc_pk_qs.prefetch_related(*prefetch_related)
|
|
87
|
+
arc_pk_comic = (
|
|
88
|
+
arc_pk_qs.annotate(arc_pk=F(arc_pk_rel)).only(*arc_pk_only).first()
|
|
89
|
+
)
|
|
90
|
+
arc_pk = arc_pk_comic.arc_pk # type: ignore
|
|
91
|
+
|
|
92
|
+
group_acl_filter = self.get_group_acl_filter(Comic)
|
|
72
93
|
nav_filter = {rel: arc_pk}
|
|
73
94
|
|
|
74
95
|
qs = (
|
|
75
96
|
Comic.objects.filter(group_acl_filter)
|
|
76
97
|
.filter(**nav_filter)
|
|
77
|
-
.
|
|
98
|
+
.select_related(*select_related)
|
|
99
|
+
.prefetch_related(*prefetch_related)
|
|
78
100
|
.only(*fields)
|
|
79
101
|
.annotate(
|
|
80
102
|
series_name=F("series__name"),
|
|
@@ -198,6 +220,30 @@ class ReaderView(BookmarkBaseView):
|
|
|
198
220
|
}
|
|
199
221
|
raise NotFound(detail=detail)
|
|
200
222
|
|
|
223
|
+
@staticmethod
|
|
224
|
+
def _lazy_metadata(current, prev_book, next_book):
|
|
225
|
+
"""Get reader metadata from comicbox if it's not in the db."""
|
|
226
|
+
import_pks = set()
|
|
227
|
+
if current and not (current.page_count and current.file_type):
|
|
228
|
+
with Comicbox(current.path) as cb:
|
|
229
|
+
current.file_type = cb.get_file_type()
|
|
230
|
+
current.page_count = cb.get_page_count()
|
|
231
|
+
import_pks.add(current.pk)
|
|
232
|
+
|
|
233
|
+
if prev_book and not prev_book.page_count:
|
|
234
|
+
with Comicbox(prev_book.path) as cb:
|
|
235
|
+
prev_book.page_count = cb.get_page_count()
|
|
236
|
+
import_pks.add(prev_book.pk)
|
|
237
|
+
|
|
238
|
+
if next_book and not next_book.page_count:
|
|
239
|
+
with Comicbox(next_book.path) as cb:
|
|
240
|
+
next_book.page_count = cb.get_page_count()
|
|
241
|
+
import_pks.add(next_book.pk)
|
|
242
|
+
|
|
243
|
+
if import_pks:
|
|
244
|
+
task = LazyImportComicsTask(frozenset(import_pks))
|
|
245
|
+
LIBRARIAN_QUEUE.put(task)
|
|
246
|
+
|
|
201
247
|
def get_object(self):
|
|
202
248
|
"""Get the previous and next comics in a group or story arc."""
|
|
203
249
|
# Books
|
|
@@ -209,6 +255,8 @@ class ReaderView(BookmarkBaseView):
|
|
|
209
255
|
|
|
210
256
|
prev_book = books.get("prev")
|
|
211
257
|
next_book = books.get("next")
|
|
258
|
+
self._lazy_metadata(current, prev_book, next_book)
|
|
259
|
+
|
|
212
260
|
books = {
|
|
213
261
|
"current": current,
|
|
214
262
|
"prev_book": prev_book,
|