codex 1.5.7rc1__py3-none-any.whl → 1.5.9__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-DXUwafcN.5d4577e0b16d.js → VCheckbox-RPeBWFgy.c0e3c4c4deaa.js} +1 -1
- codex/static_root/assets/VCheckbox-RPeBWFgy.c0e3c4c4deaa.js.br +0 -0
- codex/static_root/assets/VCheckbox-RPeBWFgy.c0e3c4c4deaa.js.gz +0 -0
- codex/static_root/assets/{VCheckbox-DXUwafcN.js → VCheckbox-RPeBWFgy.js} +1 -1
- codex/static_root/assets/VCheckbox-RPeBWFgy.js.br +0 -0
- codex/static_root/assets/VCheckbox-RPeBWFgy.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js → VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-DtrZ6IUL.js → VCheckboxBtn-CwKlKk7z.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-CwKlKk7z.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-CwKlKk7z.js.gz +0 -0
- codex/static_root/assets/{VCombobox-p6JaNJiS.08de72bf3f1d.js → VCombobox-DgVMswtt.5685f334102a.js} +1 -1
- codex/static_root/assets/VCombobox-DgVMswtt.5685f334102a.js.br +0 -0
- codex/static_root/assets/VCombobox-DgVMswtt.5685f334102a.js.gz +0 -0
- codex/static_root/assets/{VCombobox-p6JaNJiS.js → VCombobox-DgVMswtt.js} +1 -1
- codex/static_root/assets/VCombobox-DgVMswtt.js.br +0 -0
- codex/static_root/assets/VCombobox-DgVMswtt.js.gz +0 -0
- codex/static_root/assets/{VDataTableVirtual-Bak8sUxr.0f131a181de8.js → VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js} +1 -1
- codex/static_root/assets/VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js.gz +0 -0
- codex/static_root/assets/{VDataTableVirtual-Bak8sUxr.js → VDataTableVirtual-CYU6VHSb.js} +1 -1
- codex/static_root/assets/VDataTableVirtual-CYU6VHSb.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-CYU6VHSb.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanel-BrGvn58l.4330794fe673.js → VExpansionPanel-B2jVSe6n.709be0bfd8a9.js} +1 -1
- codex/static_root/assets/VExpansionPanel-B2jVSe6n.709be0bfd8a9.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-B2jVSe6n.709be0bfd8a9.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanel-BrGvn58l.js → VExpansionPanel-B2jVSe6n.js} +1 -1
- codex/static_root/assets/VExpansionPanel-B2jVSe6n.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-B2jVSe6n.js.gz +0 -0
- codex/static_root/assets/VExpansionPanel-DsEXVcCv.20b475255e66.css +1 -0
- codex/static_root/assets/VExpansionPanel-DsEXVcCv.20b475255e66.css.br +0 -0
- codex/static_root/assets/VExpansionPanel-DsEXVcCv.20b475255e66.css.gz +0 -0
- codex/static_root/assets/VExpansionPanel-DsEXVcCv.css +1 -0
- codex/static_root/assets/VExpansionPanel-DsEXVcCv.css.br +0 -0
- codex/static_root/assets/VExpansionPanel-DsEXVcCv.css.gz +0 -0
- codex/static_root/assets/{VMain-CuWbokFS.25c97b3ec973.js → VMain-DUot655v.58737665d0c0.js} +1 -1
- codex/static_root/assets/VMain-DUot655v.58737665d0c0.js.br +0 -0
- codex/static_root/assets/VMain-DUot655v.58737665d0c0.js.gz +0 -0
- codex/static_root/assets/{VMain-CuWbokFS.js → VMain-DUot655v.js} +1 -1
- codex/static_root/assets/VMain-DUot655v.js.br +0 -0
- codex/static_root/assets/VMain-DUot655v.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-DYMjLsVk.c4d81d70bec4.js → VRadioGroup-e5ZzndXH.545e89fea1a2.js} +1 -1
- codex/static_root/assets/VRadioGroup-e5ZzndXH.545e89fea1a2.js.br +0 -0
- codex/static_root/assets/VRadioGroup-e5ZzndXH.545e89fea1a2.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-DYMjLsVk.js → VRadioGroup-e5ZzndXH.js} +1 -1
- codex/static_root/assets/VRadioGroup-e5ZzndXH.js.br +0 -0
- codex/static_root/assets/VRadioGroup-e5ZzndXH.js.gz +0 -0
- codex/static_root/assets/VSelect-BdGop3V2.604c1785fbff.css +1 -0
- codex/static_root/assets/VSelect-BdGop3V2.604c1785fbff.css.br +0 -0
- codex/static_root/assets/VSelect-BdGop3V2.604c1785fbff.css.gz +0 -0
- codex/static_root/assets/VSelect-BdGop3V2.css +1 -0
- codex/static_root/assets/VSelect-BdGop3V2.css.br +0 -0
- codex/static_root/assets/VSelect-BdGop3V2.css.gz +0 -0
- codex/static_root/assets/{VSelect-CgOC_YIA.js → VSelect-CxY8UVRq.dc3019941096.js} +1 -1
- codex/static_root/assets/VSelect-CxY8UVRq.dc3019941096.js.br +0 -0
- codex/static_root/assets/VSelect-CxY8UVRq.dc3019941096.js.gz +0 -0
- codex/static_root/assets/{VSelect-CgOC_YIA.3d63f40c8ea4.js → VSelect-CxY8UVRq.js} +1 -1
- codex/static_root/assets/VSelect-CxY8UVRq.js.br +0 -0
- codex/static_root/assets/VSelect-CxY8UVRq.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js +1 -0
- codex/static_root/assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js.br +0 -0
- codex/static_root/assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-DsJeRYlc.js +1 -0
- codex/static_root/assets/VSelectionControl-DsJeRYlc.js.br +0 -0
- codex/static_root/assets/VSelectionControl-DsJeRYlc.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-C3lY91uv.css +1 -0
- codex/static_root/assets/VSlideGroup-C3lY91uv.css.br +0 -0
- codex/static_root/assets/VSlideGroup-C3lY91uv.css.gz +0 -0
- codex/static_root/assets/VSlideGroup-C3lY91uv.d268067bd078.css +1 -0
- codex/static_root/assets/VSlideGroup-C3lY91uv.d268067bd078.css.br +0 -0
- codex/static_root/assets/VSlideGroup-C3lY91uv.d268067bd078.css.gz +0 -0
- codex/static_root/assets/{VSlideGroup-Bssf4EBT.fc0918385f7e.js → VSlideGroup-VeMEwEff.3d72e1175a80.js} +1 -1
- codex/static_root/assets/VSlideGroup-VeMEwEff.3d72e1175a80.js.br +0 -0
- codex/static_root/assets/VSlideGroup-VeMEwEff.3d72e1175a80.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-Bssf4EBT.js → VSlideGroup-VeMEwEff.js} +1 -1
- codex/static_root/assets/VSlideGroup-VeMEwEff.js.br +0 -0
- codex/static_root/assets/VSlideGroup-VeMEwEff.js.gz +0 -0
- codex/static_root/assets/{VTable-DqraBe83.1f53f4e0e79f.js → VTable-CAK_p0Il.c1781e76e150.js} +1 -1
- codex/static_root/assets/VTable-CAK_p0Il.c1781e76e150.js.br +0 -0
- codex/static_root/assets/VTable-CAK_p0Il.c1781e76e150.js.gz +0 -0
- codex/static_root/assets/{VTable-DqraBe83.js → VTable-CAK_p0Il.js} +1 -1
- codex/static_root/assets/VTable-CAK_p0Il.js.br +0 -0
- codex/static_root/assets/VTable-CAK_p0Il.js.gz +0 -0
- codex/static_root/assets/{VToolbar-kI3X77C7.54fc7a9541e0.js → VToolbar-Dyufo4_P.24ef4946e516.js} +2 -2
- codex/static_root/assets/VToolbar-Dyufo4_P.24ef4946e516.js.br +0 -0
- codex/static_root/assets/{VToolbar-kI3X77C7.js.gz → VToolbar-Dyufo4_P.24ef4946e516.js.gz} +0 -0
- codex/static_root/assets/{VToolbar-kI3X77C7.js → VToolbar-Dyufo4_P.js} +2 -2
- codex/static_root/assets/VToolbar-Dyufo4_P.js.br +0 -0
- codex/static_root/assets/{VToolbar-kI3X77C7.54fc7a9541e0.js.gz → VToolbar-Dyufo4_P.js.gz} +0 -0
- codex/static_root/assets/{VWindowItem-DiY3uz1L.569d029cc939.js → VWindowItem-BNlHE64F.3d075bae3388.js} +1 -1
- codex/static_root/assets/VWindowItem-BNlHE64F.3d075bae3388.js.br +0 -0
- codex/static_root/assets/VWindowItem-BNlHE64F.3d075bae3388.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-DiY3uz1L.js → VWindowItem-BNlHE64F.js} +1 -1
- codex/static_root/assets/VWindowItem-BNlHE64F.js.br +0 -0
- codex/static_root/assets/VWindowItem-BNlHE64F.js.gz +0 -0
- codex/static_root/assets/{admin-BW3Yp8Zu.bdbca238dcd4.js → admin-DjnFySLh.3a08126dc39c.js} +1 -1
- codex/static_root/assets/admin-DjnFySLh.3a08126dc39c.js.br +0 -0
- codex/static_root/assets/admin-DjnFySLh.3a08126dc39c.js.gz +0 -0
- codex/static_root/assets/{admin-BW3Yp8Zu.js → admin-DjnFySLh.js} +1 -1
- codex/static_root/assets/admin-DjnFySLh.js.br +0 -0
- codex/static_root/assets/admin-DjnFySLh.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js → admin-drawer-panel-DY_fALho.4d912224504e.js} +8 -8
- codex/static_root/assets/admin-drawer-panel-DY_fALho.4d912224504e.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-DY_fALho.4d912224504e.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-CJ7EZ2DP.js → admin-drawer-panel-DY_fALho.js} +8 -8
- codex/static_root/assets/admin-drawer-panel-DY_fALho.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-DY_fALho.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.512d367edaca.css → admin-drawer-panel-s72VfDNy.css} +1 -1
- codex/static_root/assets/admin-drawer-panel-s72VfDNy.css.br +0 -0
- codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.512d367edaca.css.gz → admin-drawer-panel-s72VfDNy.css.gz} +0 -0
- codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.css → admin-drawer-panel-s72VfDNy.ef6cb7221a44.css} +1 -1
- codex/static_root/assets/admin-drawer-panel-s72VfDNy.ef6cb7221a44.css.br +0 -0
- codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.css.gz → admin-drawer-panel-s72VfDNy.ef6cb7221a44.css.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-B8cDJ5-w.150cd5de25bc.js +1 -0
- codex/static_root/assets/browser-B8cDJ5-w.150cd5de25bc.js.br +0 -0
- codex/static_root/assets/browser-B8cDJ5-w.150cd5de25bc.js.gz +0 -0
- codex/static_root/assets/browser-B8cDJ5-w.js +1 -0
- codex/static_root/assets/browser-B8cDJ5-w.js.br +0 -0
- codex/static_root/assets/browser-B8cDJ5-w.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-DvdVuJbx.ea31df1541a2.js → change-password-dialog-DgDGjI2a.d9af24abb0b9.js} +1 -1
- codex/static_root/assets/change-password-dialog-DgDGjI2a.d9af24abb0b9.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DgDGjI2a.d9af24abb0b9.js.gz +0 -0
- codex/static_root/assets/{change-password-dialog-DvdVuJbx.js → change-password-dialog-DgDGjI2a.js} +1 -1
- codex/static_root/assets/change-password-dialog-DgDGjI2a.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DgDGjI2a.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-oqU_wtjV.38d99c746057.js → confirm-dialog-GVok5hYU.0df954b875de.js} +1 -1
- codex/static_root/assets/confirm-dialog-GVok5hYU.0df954b875de.js.br +2 -0
- codex/static_root/assets/confirm-dialog-GVok5hYU.0df954b875de.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-oqU_wtjV.js → confirm-dialog-GVok5hYU.js} +1 -1
- codex/static_root/assets/confirm-dialog-GVok5hYU.js.br +2 -0
- codex/static_root/assets/confirm-dialog-GVok5hYU.js.gz +0 -0
- codex/static_root/assets/{confirm-footer-R7VhDN1M.js → confirm-footer-CWKcBA7p.fe0ccb86962b.js} +1 -1
- codex/static_root/assets/confirm-footer-CWKcBA7p.fe0ccb86962b.js.br +0 -0
- codex/static_root/assets/confirm-footer-CWKcBA7p.fe0ccb86962b.js.gz +0 -0
- codex/static_root/assets/{confirm-footer-R7VhDN1M.67adfe281d35.js → confirm-footer-CWKcBA7p.js} +1 -1
- codex/static_root/assets/confirm-footer-CWKcBA7p.js.br +0 -0
- codex/static_root/assets/confirm-footer-CWKcBA7p.js.gz +0 -0
- codex/static_root/assets/{datetime-column-CN_zeeDb.1cf9fd3f22d2.js → datetime-column-BRV63LgW.f23352488b87.js} +1 -1
- codex/static_root/assets/datetime-column-BRV63LgW.f23352488b87.js.br +0 -0
- codex/static_root/assets/datetime-column-BRV63LgW.f23352488b87.js.gz +0 -0
- codex/static_root/assets/{datetime-column-CN_zeeDb.js → datetime-column-BRV63LgW.js} +1 -1
- codex/static_root/assets/datetime-column-BRV63LgW.js.br +0 -0
- codex/static_root/assets/datetime-column-BRV63LgW.js.gz +0 -0
- codex/static_root/assets/{filter-DhorJRK4.f9bf91b3928c.js → filter-Cq-w9FH_.c04d9050f1a2.js} +1 -1
- codex/static_root/assets/filter-Cq-w9FH_.c04d9050f1a2.js.br +0 -0
- codex/static_root/assets/filter-Cq-w9FH_.c04d9050f1a2.js.gz +0 -0
- codex/static_root/assets/{filter-DhorJRK4.js → filter-Cq-w9FH_.js} +1 -1
- codex/static_root/assets/filter-Cq-w9FH_.js.br +0 -0
- codex/static_root/assets/filter-Cq-w9FH_.js.gz +0 -0
- codex/static_root/assets/flag-tab-D4WJek8g.c59cde03b73d.js +1 -0
- codex/static_root/assets/flag-tab-D4WJek8g.c59cde03b73d.js.br +0 -0
- codex/static_root/assets/flag-tab-D4WJek8g.c59cde03b73d.js.gz +0 -0
- codex/static_root/assets/flag-tab-D4WJek8g.js +1 -0
- codex/static_root/assets/flag-tab-D4WJek8g.js.br +0 -0
- codex/static_root/assets/flag-tab-D4WJek8g.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-_H9JlSpl.6c9b686b8f94.js → group-tab-CHIOVL3t.43f1b2e737d0.js} +1 -1
- codex/static_root/assets/group-tab-CHIOVL3t.43f1b2e737d0.js.br +0 -0
- codex/static_root/assets/group-tab-CHIOVL3t.43f1b2e737d0.js.gz +0 -0
- codex/static_root/assets/{group-tab-_H9JlSpl.js → group-tab-CHIOVL3t.js} +1 -1
- codex/static_root/assets/group-tab-CHIOVL3t.js.br +0 -0
- codex/static_root/assets/group-tab-CHIOVL3t.js.gz +0 -0
- codex/static_root/assets/{http-error-CV1CbTnY.fed9281e2348.js → http-error-Mg4IhB2h.19679151549b.js} +1 -1
- codex/static_root/assets/http-error-Mg4IhB2h.19679151549b.js.br +3 -0
- codex/static_root/assets/http-error-Mg4IhB2h.19679151549b.js.gz +0 -0
- codex/static_root/assets/{http-error-CV1CbTnY.js → http-error-Mg4IhB2h.js} +1 -1
- codex/static_root/assets/http-error-Mg4IhB2h.js.br +3 -0
- codex/static_root/assets/http-error-Mg4IhB2h.js.gz +0 -0
- codex/static_root/assets/{library-tab-D6k-bjIz.cbd8944c48f1.js → library-tab-CiF2Hc5t.a6628c68d738.js} +1 -1
- codex/static_root/assets/library-tab-CiF2Hc5t.a6628c68d738.js.br +0 -0
- codex/static_root/assets/library-tab-CiF2Hc5t.a6628c68d738.js.gz +0 -0
- codex/static_root/assets/{library-tab-D6k-bjIz.js → library-tab-CiF2Hc5t.js} +1 -1
- codex/static_root/assets/library-tab-CiF2Hc5t.js.br +0 -0
- codex/static_root/assets/library-tab-CiF2Hc5t.js.gz +0 -0
- codex/static_root/assets/{main-C8c_Yy_E.js → main-Dz9u71DQ.2f4e5662224c.js} +4 -4
- codex/static_root/assets/main-Dz9u71DQ.2f4e5662224c.js.br +0 -0
- codex/static_root/assets/main-Dz9u71DQ.2f4e5662224c.js.gz +0 -0
- codex/static_root/assets/{main-C8c_Yy_E.16ff3f5c3880.js → main-Dz9u71DQ.js} +4 -4
- codex/static_root/assets/main-Dz9u71DQ.js.br +0 -0
- codex/static_root/assets/main-Dz9u71DQ.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/metadata-dialog-D-XX9wAf.cd5465341ca1.js +1 -0
- codex/static_root/assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js.br +0 -0
- codex/static_root/assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-D-XX9wAf.js +1 -0
- codex/static_root/assets/metadata-dialog-D-XX9wAf.js.br +0 -0
- codex/static_root/assets/metadata-dialog-D-XX9wAf.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-DOq4qvUr.89d991424d2f.js → pdf-doc-a-oCC_tG.f8ec02f0e84b.js} +1 -1
- codex/static_root/assets/pdf-doc-a-oCC_tG.f8ec02f0e84b.js.br +0 -0
- codex/static_root/assets/pdf-doc-a-oCC_tG.f8ec02f0e84b.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-DOq4qvUr.js → pdf-doc-a-oCC_tG.js} +1 -1
- codex/static_root/assets/pdf-doc-a-oCC_tG.js.br +0 -0
- codex/static_root/assets/pdf-doc-a-oCC_tG.js.gz +0 -0
- codex/static_root/assets/reader-D205EQd-.f7b10abbf5ca.js +7 -0
- codex/static_root/assets/reader-D205EQd-.f7b10abbf5ca.js.br +0 -0
- codex/static_root/assets/reader-D205EQd-.f7b10abbf5ca.js.gz +0 -0
- codex/static_root/assets/reader-D205EQd-.js +7 -0
- codex/static_root/assets/reader-D205EQd-.js.br +0 -0
- codex/static_root/assets/reader-D205EQd-.js.gz +0 -0
- codex/static_root/assets/{stats-tab-VaVi9-_s.186447352c39.js → stats-tab-ZJVUN0Bb.46124f9c673f.js} +1 -1
- codex/static_root/assets/stats-tab-ZJVUN0Bb.46124f9c673f.js.br +0 -0
- codex/static_root/assets/stats-tab-ZJVUN0Bb.46124f9c673f.js.gz +0 -0
- codex/static_root/assets/{stats-tab-VaVi9-_s.js → stats-tab-ZJVUN0Bb.js} +1 -1
- codex/static_root/assets/stats-tab-ZJVUN0Bb.js.br +0 -0
- codex/static_root/assets/stats-tab-ZJVUN0Bb.js.gz +0 -0
- codex/static_root/assets/{task-tab-C0L1rPrr.249d29a1eb6b.js → task-tab-48ysPp-X.d48d8675190c.js} +1 -1
- codex/static_root/assets/task-tab-48ysPp-X.d48d8675190c.js.br +0 -0
- codex/static_root/assets/task-tab-48ysPp-X.d48d8675190c.js.gz +0 -0
- codex/static_root/assets/{task-tab-C0L1rPrr.js → task-tab-48ysPp-X.js} +1 -1
- codex/static_root/assets/task-tab-48ysPp-X.js.br +0 -0
- codex/static_root/assets/task-tab-48ysPp-X.js.gz +0 -0
- codex/static_root/assets/{user-tab-Cj-rHVvF.cbb1700e110d.js → user-tab-rG7-IzRY.d3e8fa81914d.js} +1 -1
- codex/static_root/assets/user-tab-rG7-IzRY.d3e8fa81914d.js.br +0 -0
- codex/static_root/assets/user-tab-rG7-IzRY.d3e8fa81914d.js.gz +0 -0
- codex/static_root/assets/{user-tab-Cj-rHVvF.js → user-tab-rG7-IzRY.js} +1 -1
- codex/static_root/assets/user-tab-rG7-IzRY.js.br +0 -0
- codex/static_root/assets/user-tab-rG7-IzRY.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.4609de9a4d51.json → manifest.d1d6846d318a.json} +217 -217
- codex/static_root/manifest.d1d6846d318a.json.br +0 -0
- codex/static_root/manifest.d1d6846d318a.json.gz +0 -0
- codex/static_root/manifest.json +217 -217
- 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 +26 -21
- codex/views/browser/browser_annotations.py +0 -1
- 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.7rc1.dist-info → codex-1.5.9.dist-info}/METADATA +1 -1
- {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/RECORD +267 -267
- codex/static_root/assets/VCheckbox-DXUwafcN.5d4577e0b16d.js.br +0 -0
- codex/static_root/assets/VCheckbox-DXUwafcN.5d4577e0b16d.js.gz +0 -0
- codex/static_root/assets/VCheckbox-DXUwafcN.js.br +0 -0
- codex/static_root/assets/VCheckbox-DXUwafcN.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.js.gz +0 -0
- codex/static_root/assets/VCombobox-p6JaNJiS.08de72bf3f1d.js.br +0 -0
- codex/static_root/assets/VCombobox-p6JaNJiS.08de72bf3f1d.js.gz +0 -0
- codex/static_root/assets/VCombobox-p6JaNJiS.js.br +0 -0
- codex/static_root/assets/VCombobox-p6JaNJiS.js.gz +0 -0
- codex/static_root/assets/VDataTableVirtual-Bak8sUxr.0f131a181de8.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-Bak8sUxr.0f131a181de8.js.gz +0 -0
- codex/static_root/assets/VDataTableVirtual-Bak8sUxr.js.br +0 -0
- codex/static_root/assets/VDataTableVirtual-Bak8sUxr.js.gz +0 -0
- codex/static_root/assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css +0 -1
- codex/static_root/assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css.br +0 -0
- codex/static_root/assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css.gz +0 -0
- codex/static_root/assets/VExpansionPanel-BgvW2DKJ.css +0 -1
- codex/static_root/assets/VExpansionPanel-BgvW2DKJ.css.br +0 -0
- codex/static_root/assets/VExpansionPanel-BgvW2DKJ.css.gz +0 -0
- codex/static_root/assets/VExpansionPanel-BrGvn58l.4330794fe673.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-BrGvn58l.4330794fe673.js.gz +0 -0
- codex/static_root/assets/VExpansionPanel-BrGvn58l.js.br +0 -0
- codex/static_root/assets/VExpansionPanel-BrGvn58l.js.gz +0 -0
- codex/static_root/assets/VMain-CuWbokFS.25c97b3ec973.js.br +0 -0
- codex/static_root/assets/VMain-CuWbokFS.25c97b3ec973.js.gz +0 -0
- codex/static_root/assets/VMain-CuWbokFS.js.br +0 -0
- codex/static_root/assets/VMain-CuWbokFS.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-DYMjLsVk.c4d81d70bec4.js.br +0 -0
- codex/static_root/assets/VRadioGroup-DYMjLsVk.c4d81d70bec4.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-DYMjLsVk.js.br +0 -0
- codex/static_root/assets/VRadioGroup-DYMjLsVk.js.gz +0 -0
- codex/static_root/assets/VSelect-CgOC_YIA.3d63f40c8ea4.js.br +0 -0
- codex/static_root/assets/VSelect-CgOC_YIA.3d63f40c8ea4.js.gz +0 -0
- codex/static_root/assets/VSelect-CgOC_YIA.js.br +0 -0
- codex/static_root/assets/VSelect-CgOC_YIA.js.gz +0 -0
- codex/static_root/assets/VSelect-udkSZJsa.1873bae92d9d.css +0 -1
- codex/static_root/assets/VSelect-udkSZJsa.1873bae92d9d.css.br +0 -0
- codex/static_root/assets/VSelect-udkSZJsa.1873bae92d9d.css.gz +0 -0
- codex/static_root/assets/VSelect-udkSZJsa.css +0 -1
- codex/static_root/assets/VSelect-udkSZJsa.css.br +0 -0
- codex/static_root/assets/VSelect-udkSZJsa.css.gz +0 -0
- codex/static_root/assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js +0 -1
- codex/static_root/assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-CD7bn0s_.js +0 -1
- codex/static_root/assets/VSelectionControl-CD7bn0s_.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CD7bn0s_.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-Bssf4EBT.fc0918385f7e.js.br +0 -0
- codex/static_root/assets/VSlideGroup-Bssf4EBT.fc0918385f7e.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-Bssf4EBT.js.br +0 -0
- codex/static_root/assets/VSlideGroup-Bssf4EBT.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css +0 -1
- codex/static_root/assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css.br +0 -0
- codex/static_root/assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css.gz +0 -0
- codex/static_root/assets/VSlideGroup-rAVUcz72.css +0 -1
- codex/static_root/assets/VSlideGroup-rAVUcz72.css.br +0 -0
- codex/static_root/assets/VSlideGroup-rAVUcz72.css.gz +0 -0
- codex/static_root/assets/VTable-DqraBe83.1f53f4e0e79f.js.br +0 -0
- codex/static_root/assets/VTable-DqraBe83.1f53f4e0e79f.js.gz +0 -0
- codex/static_root/assets/VTable-DqraBe83.js.br +0 -0
- codex/static_root/assets/VTable-DqraBe83.js.gz +0 -0
- codex/static_root/assets/VToolbar-kI3X77C7.54fc7a9541e0.js.br +0 -0
- codex/static_root/assets/VToolbar-kI3X77C7.js.br +0 -0
- codex/static_root/assets/VWindowItem-DiY3uz1L.569d029cc939.js.br +0 -0
- codex/static_root/assets/VWindowItem-DiY3uz1L.569d029cc939.js.gz +0 -0
- codex/static_root/assets/VWindowItem-DiY3uz1L.js.br +0 -0
- codex/static_root/assets/VWindowItem-DiY3uz1L.js.gz +0 -0
- codex/static_root/assets/admin-BW3Yp8Zu.bdbca238dcd4.js.br +0 -0
- codex/static_root/assets/admin-BW3Yp8Zu.bdbca238dcd4.js.gz +0 -0
- codex/static_root/assets/admin-BW3Yp8Zu.js.br +0 -0
- codex/static_root/assets/admin-BW3Yp8Zu.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-DEYM8FWr.512d367edaca.css.br +0 -0
- codex/static_root/assets/admin-drawer-panel-DEYM8FWr.css.br +0 -0
- codex/static_root/assets/browser-BQuqhnNc.df377a24a88a.js +0 -1
- codex/static_root/assets/browser-BQuqhnNc.df377a24a88a.js.br +0 -0
- codex/static_root/assets/browser-BQuqhnNc.df377a24a88a.js.gz +0 -0
- codex/static_root/assets/browser-BQuqhnNc.js +0 -1
- codex/static_root/assets/browser-BQuqhnNc.js.br +0 -0
- codex/static_root/assets/browser-BQuqhnNc.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/change-password-dialog-DvdVuJbx.ea31df1541a2.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DvdVuJbx.ea31df1541a2.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-DvdVuJbx.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DvdVuJbx.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-oqU_wtjV.38d99c746057.js.br +0 -0
- codex/static_root/assets/confirm-dialog-oqU_wtjV.38d99c746057.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-oqU_wtjV.js.br +0 -0
- codex/static_root/assets/confirm-dialog-oqU_wtjV.js.gz +0 -0
- codex/static_root/assets/confirm-footer-R7VhDN1M.67adfe281d35.js.br +0 -0
- codex/static_root/assets/confirm-footer-R7VhDN1M.67adfe281d35.js.gz +0 -0
- codex/static_root/assets/confirm-footer-R7VhDN1M.js.br +0 -0
- codex/static_root/assets/confirm-footer-R7VhDN1M.js.gz +0 -0
- codex/static_root/assets/datetime-column-CN_zeeDb.1cf9fd3f22d2.js.br +0 -0
- codex/static_root/assets/datetime-column-CN_zeeDb.1cf9fd3f22d2.js.gz +0 -0
- codex/static_root/assets/datetime-column-CN_zeeDb.js.br +0 -0
- codex/static_root/assets/datetime-column-CN_zeeDb.js.gz +0 -0
- codex/static_root/assets/filter-DhorJRK4.f9bf91b3928c.js.br +0 -0
- codex/static_root/assets/filter-DhorJRK4.f9bf91b3928c.js.gz +0 -0
- codex/static_root/assets/filter-DhorJRK4.js.br +0 -0
- codex/static_root/assets/filter-DhorJRK4.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-C-ZU-QYU.c190eb30e5d5.js +0 -1
- codex/static_root/assets/flag-tab-C-ZU-QYU.c190eb30e5d5.js.br +0 -0
- codex/static_root/assets/flag-tab-C-ZU-QYU.c190eb30e5d5.js.gz +0 -0
- codex/static_root/assets/flag-tab-C-ZU-QYU.js +0 -1
- codex/static_root/assets/flag-tab-C-ZU-QYU.js.br +0 -0
- codex/static_root/assets/flag-tab-C-ZU-QYU.js.gz +0 -0
- codex/static_root/assets/group-tab-_H9JlSpl.6c9b686b8f94.js.br +0 -0
- codex/static_root/assets/group-tab-_H9JlSpl.6c9b686b8f94.js.gz +0 -0
- codex/static_root/assets/group-tab-_H9JlSpl.js.br +0 -0
- codex/static_root/assets/group-tab-_H9JlSpl.js.gz +0 -0
- codex/static_root/assets/http-error-CV1CbTnY.fed9281e2348.js.br +0 -0
- codex/static_root/assets/http-error-CV1CbTnY.fed9281e2348.js.gz +0 -0
- codex/static_root/assets/http-error-CV1CbTnY.js.br +0 -0
- codex/static_root/assets/http-error-CV1CbTnY.js.gz +0 -0
- codex/static_root/assets/library-tab-D6k-bjIz.cbd8944c48f1.js.br +0 -0
- codex/static_root/assets/library-tab-D6k-bjIz.cbd8944c48f1.js.gz +0 -0
- codex/static_root/assets/library-tab-D6k-bjIz.js.br +0 -0
- codex/static_root/assets/library-tab-D6k-bjIz.js.gz +0 -0
- codex/static_root/assets/main-C8c_Yy_E.16ff3f5c3880.js.br +0 -0
- codex/static_root/assets/main-C8c_Yy_E.16ff3f5c3880.js.gz +0 -0
- codex/static_root/assets/main-C8c_Yy_E.js.br +0 -0
- codex/static_root/assets/main-C8c_Yy_E.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-B9q6Xpe7.103141664cd0.js +0 -1
- codex/static_root/assets/metadata-dialog-B9q6Xpe7.103141664cd0.js.br +0 -0
- codex/static_root/assets/metadata-dialog-B9q6Xpe7.103141664cd0.js.gz +0 -0
- codex/static_root/assets/metadata-dialog-B9q6Xpe7.js +0 -1
- codex/static_root/assets/metadata-dialog-B9q6Xpe7.js.br +0 -0
- codex/static_root/assets/metadata-dialog-B9q6Xpe7.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-DOq4qvUr.89d991424d2f.js.br +0 -0
- codex/static_root/assets/pdf-doc-DOq4qvUr.89d991424d2f.js.gz +0 -0
- codex/static_root/assets/pdf-doc-DOq4qvUr.js.br +0 -0
- codex/static_root/assets/pdf-doc-DOq4qvUr.js.gz +0 -0
- codex/static_root/assets/reader-BWdhR39E.8f8a692077dc.js +0 -7
- codex/static_root/assets/reader-BWdhR39E.8f8a692077dc.js.br +0 -0
- codex/static_root/assets/reader-BWdhR39E.8f8a692077dc.js.gz +0 -0
- codex/static_root/assets/reader-BWdhR39E.js +0 -7
- codex/static_root/assets/reader-BWdhR39E.js.br +0 -0
- codex/static_root/assets/reader-BWdhR39E.js.gz +0 -0
- codex/static_root/assets/stats-tab-VaVi9-_s.186447352c39.js.br +0 -0
- codex/static_root/assets/stats-tab-VaVi9-_s.186447352c39.js.gz +0 -0
- codex/static_root/assets/stats-tab-VaVi9-_s.js.br +0 -0
- codex/static_root/assets/stats-tab-VaVi9-_s.js.gz +0 -0
- codex/static_root/assets/task-tab-C0L1rPrr.249d29a1eb6b.js.br +0 -0
- codex/static_root/assets/task-tab-C0L1rPrr.249d29a1eb6b.js.gz +0 -0
- codex/static_root/assets/task-tab-C0L1rPrr.js.br +0 -0
- codex/static_root/assets/task-tab-C0L1rPrr.js.gz +0 -0
- codex/static_root/assets/user-tab-Cj-rHVvF.cbb1700e110d.js.br +0 -0
- codex/static_root/assets/user-tab-Cj-rHVvF.cbb1700e110d.js.gz +0 -0
- codex/static_root/assets/user-tab-Cj-rHVvF.js.br +0 -0
- codex/static_root/assets/user-tab-Cj-rHVvF.js.gz +0 -0
- codex/static_root/js/choices-admin.3a2cdebdbfba.json.br +0 -0
- codex/static_root/manifest.4609de9a4d51.json.br +0 -0
- codex/static_root/manifest.4609de9a4d51.json.gz +0 -0
- {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/LICENSE +0 -0
- {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/WHEEL +0 -0
- {codex-1.5.7rc1.dist-info → codex-1.5.9.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/task-tab-48ysPp-X.js": "assets/task-tab-48ysPp-X.d48d8675190c.js", "assets/confirm-footer-CWKcBA7p.js": "assets/confirm-footer-CWKcBA7p.fe0ccb86962b.js", "assets/VExpansionPanel-B2jVSe6n.js": "assets/VExpansionPanel-B2jVSe6n.709be0bfd8a9.js", "assets/user-tab-rG7-IzRY.js": "assets/user-tab-rG7-IzRY.d3e8fa81914d.js", "assets/VExpansionPanel-DsEXVcCv.css": "assets/VExpansionPanel-DsEXVcCv.20b475255e66.css", "assets/stats-tab-ZJVUN0Bb.js": "assets/stats-tab-ZJVUN0Bb.46124f9c673f.js", "assets/change-password-dialog-DgDGjI2a.js": "assets/change-password-dialog-DgDGjI2a.d9af24abb0b9.js", "assets/datetime-column-BWWfvyhn.css": "assets/datetime-column-BWWfvyhn.a4a94ba57c73.css", "assets/VDataTableVirtual-CYU6VHSb.js": "assets/VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js", "assets/group-tab-CHIOVL3t.js": "assets/group-tab-CHIOVL3t.43f1b2e737d0.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSlideGroup-VeMEwEff.js": "assets/VSlideGroup-VeMEwEff.3d72e1175a80.js", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/VSelectionControl-DsJeRYlc.js": "assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js", "assets/VSlideGroup-C3lY91uv.css": "assets/VSlideGroup-C3lY91uv.d268067bd078.css", "assets/VMain-Byt37V4c.css": "assets/VMain-Byt37V4c.a00e206f3cfa.css", "assets/datetime-column-BRV63LgW.js": "assets/datetime-column-BRV63LgW.f23352488b87.js", "assets/VCheckboxBtn-CwKlKk7z.js": "assets/VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js", "assets/stats-tab-BTZLMBCU.css": "assets/stats-tab-BTZLMBCU.7e0a9547c12e.css", "assets/confirm-footer-VFepxcJs.css": "assets/confirm-footer-VFepxcJs.4150131304bd.css", "assets/VCombobox-DgVMswtt.js": "assets/VCombobox-DgVMswtt.5685f334102a.js", "assets/flag-tab-D4WJek8g.js": "assets/flag-tab-D4WJek8g.c59cde03b73d.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/VTable-CAK_p0Il.js": "assets/VTable-CAK_p0Il.c1781e76e150.js", "assets/main-CacfwsKA.css": "assets/main-CacfwsKA.4f849ef1c5db.css", "assets/metadata-dialog-BGJasBRy.css": "assets/metadata-dialog-BGJasBRy.0553851658b5.css", "assets/confirm-dialog-GVok5hYU.js": "assets/confirm-dialog-GVok5hYU.0df954b875de.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/admin-drawer-panel-DY_fALho.js": "assets/admin-drawer-panel-DY_fALho.4d912224504e.js", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/VToolbar-Dyufo4_P.js": "assets/VToolbar-Dyufo4_P.24ef4946e516.js", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/browser-2i0QA4La.css": "assets/browser-2i0QA4La.587673ac534c.css", "assets/library-tab-CiF2Hc5t.js": "assets/library-tab-CiF2Hc5t.a6628c68d738.js", "assets/admin-drawer-panel-s72VfDNy.css": "assets/admin-drawer-panel-s72VfDNy.ef6cb7221a44.css", "assets/VRadioGroup-e5ZzndXH.js": "assets/VRadioGroup-e5ZzndXH.545e89fea1a2.js", "assets/pdf-doc-a-oCC_tG.js": "assets/pdf-doc-a-oCC_tG.f8ec02f0e84b.js", "assets/reader-D205EQd-.js": "assets/reader-D205EQd-.f7b10abbf5ca.js", "assets/filter-Cq-w9FH_.js": "assets/filter-Cq-w9FH_.c04d9050f1a2.js", "assets/metadata-dialog-D-XX9wAf.js": "assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/admin-DjnFySLh.js": "assets/admin-DjnFySLh.3a08126dc39c.js", "assets/reader-CG6zrLXl.css": "assets/reader-CG6zrLXl.ed017042cd53.css", "assets/VWindowItem-BNlHE64F.js": "assets/VWindowItem-BNlHE64F.3d075bae3388.js", "assets/task-tab-DoX9OA37.css": "assets/task-tab-DoX9OA37.9bb355f36dbf.css", "assets/VDataTableVirtual-Cbj7IGxa.css": "assets/VDataTableVirtual-Cbj7IGxa.24039b2ebc61.css", "assets/browser-B8cDJ5-w.js": "assets/browser-B8cDJ5-w.150cd5de25bc.js", "assets/index-DUjeNg4x.js": "assets/index-DUjeNg4x.36d50c91b2c1.js", "assets/http-error-Mg4IhB2h.js": "assets/http-error-Mg4IhB2h.19679151549b.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "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/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VSelect-CxY8UVRq.js": "assets/VSelect-CxY8UVRq.dc3019941096.js", "assets/VSelect-BdGop3V2.css": "assets/VSelect-BdGop3V2.604c1785fbff.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/main-Dz9u71DQ.js": "assets/main-Dz9u71DQ.2f4e5662224c.js", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/group-tab-3DXxSetf.css": "assets/group-tab-3DXxSetf.5fc2cfa31669.css", "assets/VMain-DUot655v.js": "assets/VMain-DUot655v.58737665d0c0.js", "assets/VCheckbox-RPeBWFgy.js": "assets/VCheckbox-RPeBWFgy.c0e3c4c4deaa.js", "assets/admin-Df82-Qcj.css": "assets/admin-Df82-Qcj.4c3f0406ee54.css", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.d1d6846d318a.json"}, "version": "1.1", "hash": "38719676d715"}
|
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(
|
|
@@ -83,7 +80,7 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
83
80
|
is_opds_2_acquisition = False
|
|
84
81
|
|
|
85
82
|
def _annotate_group_names(self, queryset, model):
|
|
86
|
-
"""Annotate name fields."""
|
|
83
|
+
"""Annotate name fields by hoisting them up."""
|
|
87
84
|
# Optimized to only lookup what is used on the frontend
|
|
88
85
|
group_names = {}
|
|
89
86
|
if model == Comic:
|
|
@@ -100,16 +97,15 @@ class BrowserView(BrowserAnnotationsView):
|
|
|
100
97
|
group_names["publisher_name"] = F("publisher__name")
|
|
101
98
|
return queryset.annotate(**group_names)
|
|
102
99
|
|
|
100
|
+
def _annotate_group(self, queryset, model):
|
|
101
|
+
"""Annotate Group."""
|
|
102
|
+
value = "c" if model == Comic else self.model_group
|
|
103
|
+
return queryset.annotate(group=Value(value, CharField(max_length=1)))
|
|
104
|
+
|
|
103
105
|
def _add_annotations(self, queryset, model, search_scores: dict):
|
|
104
106
|
"""Annotations for display and sorting."""
|
|
105
107
|
queryset = self.annotate_common_aggregates(queryset, model, search_scores)
|
|
106
|
-
|
|
107
|
-
# Annotate Group
|
|
108
|
-
self.model_group = self._MODEL_GROUP_MAP[model]
|
|
109
|
-
queryset = queryset.annotate(
|
|
110
|
-
group=Value(self.model_group, CharField(max_length=1))
|
|
111
|
-
)
|
|
112
|
-
# Hoist Group Names
|
|
108
|
+
queryset = self._annotate_group(queryset, model)
|
|
113
109
|
return self._annotate_group_names(queryset, model)
|
|
114
110
|
|
|
115
111
|
def _get_model_group(self):
|
|
@@ -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,
|