codex 1.6.19__py3-none-any.whl → 1.7.0a0__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/db.py +119 -0
- codex/librarian/covers/purge.py +1 -1
- codex/librarian/importer/const.py +7 -1
- codex/librarian/importer/create_fks.py +5 -2
- codex/librarian/importer/importerd.py +17 -12
- codex/librarian/importer/moved.py +44 -13
- codex/librarian/importer/tasks.py +2 -0
- codex/librarian/janitor/cleanup.py +21 -8
- codex/librarian/janitor/integrity.py +369 -0
- codex/librarian/janitor/janitor.py +50 -15
- codex/librarian/janitor/latest_version.py +2 -1
- codex/librarian/janitor/status.py +5 -0
- codex/librarian/janitor/tasks.py +37 -0
- codex/librarian/janitor/update.py +1 -1
- codex/librarian/librariand.py +32 -24
- codex/librarian/search/optimize.py +43 -0
- codex/librarian/search/remove.py +18 -46
- codex/librarian/search/searchd.py +14 -17
- codex/librarian/search/status.py +2 -1
- codex/librarian/search/tasks.py +4 -9
- codex/librarian/search/update.py +223 -301
- codex/librarian/watchdog/observers.py +2 -1
- codex/migrations/0029_comicfts.py +58 -0
- codex/migrations/0030_nocase_collation_day_month_indexes_status_types.py +198 -0
- codex/models/admin.py +15 -6
- codex/models/base.py +9 -0
- codex/models/bookmark.py +3 -3
- codex/models/comic.py +68 -16
- codex/models/functions.py +59 -2
- codex/models/groups.py +6 -1
- codex/models/library.py +1 -3
- codex/models/paths.py +9 -3
- codex/serializers/browser/page.py +2 -0
- codex/settings/settings.py +16 -17
- codex/signals/django_signals.py +4 -10
- codex/startup.py +1 -35
- codex/static_root/assets/{VCheckbox-Cko1sQK-.170726b3b8a1.js → VCheckbox-CWiqcZ7a.3feebd47daab.js} +1 -1
- codex/static_root/assets/VCheckbox-CWiqcZ7a.3feebd47daab.js.br +0 -0
- codex/static_root/assets/VCheckbox-CWiqcZ7a.3feebd47daab.js.gz +0 -0
- codex/static_root/assets/{VCheckbox-Cko1sQK-.js → VCheckbox-CWiqcZ7a.js} +1 -1
- codex/static_root/assets/VCheckbox-CWiqcZ7a.js.br +0 -0
- codex/static_root/assets/VCheckbox-CWiqcZ7a.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-CO3-aqQL.c9b8062fd66f.js → VCheckboxBtn-Dk3iB62X.bc66d5351baa.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-Dk3iB62X.bc66d5351baa.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-Dk3iB62X.bc66d5351baa.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-CO3-aqQL.js → VCheckboxBtn-Dk3iB62X.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-Dk3iB62X.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-Dk3iB62X.js.gz +0 -0
- codex/static_root/assets/{VCombobox-Bjp6lffE.js → VCombobox-D1_KU27A.b1d30587a973.js} +1 -1
- codex/static_root/assets/VCombobox-D1_KU27A.b1d30587a973.js.br +0 -0
- codex/static_root/assets/VCombobox-D1_KU27A.b1d30587a973.js.gz +0 -0
- codex/static_root/assets/{VCombobox-Bjp6lffE.caf59fba486e.js → VCombobox-D1_KU27A.js} +1 -1
- codex/static_root/assets/VCombobox-D1_KU27A.js.br +0 -0
- codex/static_root/assets/VCombobox-D1_KU27A.js.gz +0 -0
- codex/static_root/assets/{VDialog-BkpVGB70.6eea3ca762a5.js → VDialog-GbxvFMMN.594fb3a39ced.js} +1 -1
- codex/static_root/assets/VDialog-GbxvFMMN.594fb3a39ced.js.br +0 -0
- codex/static_root/assets/VDialog-GbxvFMMN.594fb3a39ced.js.gz +0 -0
- codex/static_root/assets/{VDialog-BkpVGB70.js → VDialog-GbxvFMMN.js} +1 -1
- codex/static_root/assets/VDialog-GbxvFMMN.js.br +0 -0
- codex/static_root/assets/VDialog-GbxvFMMN.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-Ci2-j8XX.9c55db4ef49e.js → VExpansionPanels-Cywv_bEj.a762e63858e5.js} +1 -1
- codex/static_root/assets/VExpansionPanels-Cywv_bEj.a762e63858e5.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-Cywv_bEj.a762e63858e5.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-Ci2-j8XX.js → VExpansionPanels-Cywv_bEj.js} +1 -1
- codex/static_root/assets/VExpansionPanels-Cywv_bEj.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-Cywv_bEj.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-D3Py5BfQ.a4f25edb86d3.js → VRadioGroup-C0etmxpZ.0eb3009a6300.js} +1 -1
- codex/static_root/assets/VRadioGroup-C0etmxpZ.0eb3009a6300.js.br +0 -0
- codex/static_root/assets/VRadioGroup-C0etmxpZ.0eb3009a6300.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-D3Py5BfQ.js → VRadioGroup-C0etmxpZ.js} +1 -1
- codex/static_root/assets/VRadioGroup-C0etmxpZ.js.br +0 -0
- codex/static_root/assets/VRadioGroup-C0etmxpZ.js.gz +0 -0
- codex/static_root/assets/{VSelect-DtvZsYZz.e98745d858eb.js → VSelect-txrnRiNJ.a5625760018c.js} +1 -1
- codex/static_root/assets/VSelect-txrnRiNJ.a5625760018c.js.br +0 -0
- codex/static_root/assets/VSelect-txrnRiNJ.a5625760018c.js.gz +0 -0
- codex/static_root/assets/{VSelect-DtvZsYZz.js → VSelect-txrnRiNJ.js} +1 -1
- codex/static_root/assets/VSelect-txrnRiNJ.js.br +0 -0
- codex/static_root/assets/VSelect-txrnRiNJ.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-D6kmykQW.1e1fda62ceba.js → VSelectionControl-CY6RmcvW.7e8824224f6c.js} +1 -1
- codex/static_root/assets/VSelectionControl-CY6RmcvW.7e8824224f6c.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CY6RmcvW.7e8824224f6c.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-D6kmykQW.js → VSelectionControl-CY6RmcvW.js} +1 -1
- codex/static_root/assets/VSelectionControl-CY6RmcvW.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CY6RmcvW.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-UGZWxpF5.360bdefcd215.js → VSlideGroup-DtEQMwY1.6c72325635ed.js} +1 -1
- codex/static_root/assets/VSlideGroup-DtEQMwY1.6c72325635ed.js.br +0 -0
- codex/static_root/assets/VSlideGroup-DtEQMwY1.6c72325635ed.js.gz +0 -0
- codex/static_root/assets/{VSlideGroup-UGZWxpF5.js → VSlideGroup-DtEQMwY1.js} +1 -1
- codex/static_root/assets/VSlideGroup-DtEQMwY1.js.br +0 -0
- codex/static_root/assets/VSlideGroup-DtEQMwY1.js.gz +0 -0
- codex/static_root/assets/{VTable-DXH_yQ0o.1149f56ad566.js → VTable-2af995xo.6c5bf36631b2.js} +1 -1
- codex/static_root/assets/VTable-2af995xo.6c5bf36631b2.js.br +0 -0
- codex/static_root/assets/VTable-2af995xo.6c5bf36631b2.js.gz +0 -0
- codex/static_root/assets/{VTable-DXH_yQ0o.js → VTable-2af995xo.js} +1 -1
- codex/static_root/assets/VTable-2af995xo.js.br +0 -0
- codex/static_root/assets/VTable-2af995xo.js.gz +0 -0
- codex/static_root/assets/{VTextField-Blqy56_L.26d8761e0155.js → VTextField-G6CMj7yO.657a130dd302.js} +1 -1
- codex/static_root/assets/VTextField-G6CMj7yO.657a130dd302.js.br +0 -0
- codex/static_root/assets/VTextField-G6CMj7yO.657a130dd302.js.gz +0 -0
- codex/static_root/assets/{VTextField-Blqy56_L.js → VTextField-G6CMj7yO.js} +1 -1
- codex/static_root/assets/VTextField-G6CMj7yO.js.br +0 -0
- codex/static_root/assets/VTextField-G6CMj7yO.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-C8_ovV7e.afbc08414765.js → VWindowItem-CzoGd6Ul.721e5da11ad4.js} +1 -1
- codex/static_root/assets/VWindowItem-CzoGd6Ul.721e5da11ad4.js.br +0 -0
- codex/static_root/assets/VWindowItem-CzoGd6Ul.721e5da11ad4.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-C8_ovV7e.js → VWindowItem-CzoGd6Ul.js} +1 -1
- codex/static_root/assets/VWindowItem-CzoGd6Ul.js.br +0 -0
- codex/static_root/assets/VWindowItem-CzoGd6Ul.js.gz +0 -0
- codex/static_root/assets/{admin-DTRn8bBs.d031ea42d8d0.js → admin-CsPAIQeG.5175467148a3.js} +1 -1
- codex/static_root/assets/admin-CsPAIQeG.5175467148a3.js.br +0 -0
- codex/static_root/assets/admin-CsPAIQeG.5175467148a3.js.gz +0 -0
- codex/static_root/assets/{admin-DTRn8bBs.js → admin-CsPAIQeG.js} +1 -1
- codex/static_root/assets/admin-CsPAIQeG.js.br +0 -0
- codex/static_root/assets/admin-CsPAIQeG.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-BaXFOcru.b1a44b05f482.js → admin-drawer-panel-BAT7GA64.73a064628c19.js} +11 -11
- codex/static_root/assets/admin-drawer-panel-BAT7GA64.73a064628c19.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-BAT7GA64.73a064628c19.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-BaXFOcru.js → admin-drawer-panel-BAT7GA64.js} +11 -11
- codex/static_root/assets/admin-drawer-panel-BAT7GA64.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-BAT7GA64.js.gz +0 -0
- codex/static_root/assets/browser-C18l93yc.923860009ef4.js +1 -0
- codex/static_root/assets/browser-C18l93yc.923860009ef4.js.br +0 -0
- codex/static_root/assets/browser-C18l93yc.923860009ef4.js.gz +0 -0
- codex/static_root/assets/browser-C18l93yc.js +1 -0
- codex/static_root/assets/browser-C18l93yc.js.br +0 -0
- codex/static_root/assets/browser-C18l93yc.js.gz +0 -0
- codex/static_root/assets/browser-DaAqlBYO.708ecf0904bb.css +1 -0
- codex/static_root/assets/browser-DaAqlBYO.708ecf0904bb.css.br +0 -0
- codex/static_root/assets/browser-DaAqlBYO.708ecf0904bb.css.gz +0 -0
- codex/static_root/assets/browser-DaAqlBYO.css +1 -0
- codex/static_root/assets/browser-DaAqlBYO.css.br +0 -0
- codex/static_root/assets/browser-DaAqlBYO.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-BazJdNs9.0a4e02656a35.js +1 -0
- codex/static_root/assets/change-password-dialog-BazJdNs9.0a4e02656a35.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BazJdNs9.0a4e02656a35.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-BazJdNs9.js +1 -0
- codex/static_root/assets/change-password-dialog-BazJdNs9.js.br +0 -0
- codex/static_root/assets/change-password-dialog-BazJdNs9.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-Mlmvz8_4.111421f51e79.css +1 -0
- codex/static_root/assets/change-password-dialog-Mlmvz8_4.111421f51e79.css.br +0 -0
- codex/static_root/assets/change-password-dialog-Mlmvz8_4.111421f51e79.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-Mlmvz8_4.css +1 -0
- codex/static_root/assets/change-password-dialog-Mlmvz8_4.css.br +0 -0
- codex/static_root/assets/change-password-dialog-Mlmvz8_4.css.gz +0 -0
- codex/static_root/assets/{confirm-dialog-D3_s2DQy.9dde66036c72.js → confirm-dialog-CbW3hlOp.9dd39b443c31.js} +1 -1
- codex/static_root/assets/confirm-dialog-CbW3hlOp.9dd39b443c31.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CbW3hlOp.9dd39b443c31.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-D3_s2DQy.js → confirm-dialog-CbW3hlOp.js} +1 -1
- codex/static_root/assets/confirm-dialog-CbW3hlOp.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CbW3hlOp.js.gz +0 -0
- codex/static_root/assets/{datetime-column-BxC1Li9e.3dc314b3295d.js → datetime-column-uSqKZU37.b157b0743db5.js} +1 -1
- codex/static_root/assets/datetime-column-uSqKZU37.b157b0743db5.js.br +0 -0
- codex/static_root/assets/datetime-column-uSqKZU37.b157b0743db5.js.gz +0 -0
- codex/static_root/assets/{datetime-column-BxC1Li9e.js → datetime-column-uSqKZU37.js} +1 -1
- codex/static_root/assets/datetime-column-uSqKZU37.js.br +0 -0
- codex/static_root/assets/datetime-column-uSqKZU37.js.gz +0 -0
- codex/static_root/assets/{filter-Bzk7x841.d0c3b602e62d.js → filter-CBl5KEsB.845a81573c2e.js} +1 -1
- codex/static_root/assets/filter-CBl5KEsB.845a81573c2e.js.br +0 -0
- codex/static_root/assets/filter-CBl5KEsB.845a81573c2e.js.gz +0 -0
- codex/static_root/assets/{filter-Bzk7x841.js → filter-CBl5KEsB.js} +1 -1
- codex/static_root/assets/filter-CBl5KEsB.js.br +0 -0
- codex/static_root/assets/filter-CBl5KEsB.js.gz +0 -0
- codex/static_root/assets/flag-tab-CT8pqM4r.ecb6eee2e7a0.js +1 -0
- codex/static_root/assets/flag-tab-CT8pqM4r.ecb6eee2e7a0.js.br +0 -0
- codex/static_root/assets/flag-tab-CT8pqM4r.ecb6eee2e7a0.js.gz +0 -0
- codex/static_root/assets/flag-tab-CT8pqM4r.js +1 -0
- codex/static_root/assets/flag-tab-CT8pqM4r.js.br +0 -0
- codex/static_root/assets/flag-tab-CT8pqM4r.js.gz +0 -0
- codex/static_root/assets/{group-tab-5esH4lwX.a81fdd258117.js → group-tab-BOW9kigw.7e5007596367.js} +1 -1
- codex/static_root/assets/group-tab-BOW9kigw.7e5007596367.js.br +0 -0
- codex/static_root/assets/group-tab-BOW9kigw.7e5007596367.js.gz +0 -0
- codex/static_root/assets/{group-tab-5esH4lwX.js → group-tab-BOW9kigw.js} +1 -1
- codex/static_root/assets/group-tab-BOW9kigw.js.br +0 -0
- codex/static_root/assets/group-tab-BOW9kigw.js.gz +0 -0
- codex/static_root/assets/{http-error-BTOBfcGY.52ced6f28420.js → http-error-C6yuLApo.45cf99eb7a70.js} +1 -1
- codex/static_root/assets/http-error-C6yuLApo.45cf99eb7a70.js.br +4 -0
- codex/static_root/assets/http-error-C6yuLApo.45cf99eb7a70.js.gz +0 -0
- codex/static_root/assets/{http-error-BTOBfcGY.js → http-error-C6yuLApo.js} +1 -1
- codex/static_root/assets/http-error-C6yuLApo.js.br +4 -0
- codex/static_root/assets/http-error-C6yuLApo.js.gz +0 -0
- codex/static_root/assets/{library-tab-DiPEdOF7.ece2d642a9dc.js → library-tab-D3WOtpE0.9af34e6e7235.js} +1 -1
- codex/static_root/assets/library-tab-D3WOtpE0.9af34e6e7235.js.br +0 -0
- codex/static_root/assets/library-tab-D3WOtpE0.9af34e6e7235.js.gz +0 -0
- codex/static_root/assets/{library-tab-DiPEdOF7.js → library-tab-D3WOtpE0.js} +1 -1
- codex/static_root/assets/library-tab-D3WOtpE0.js.br +0 -0
- codex/static_root/assets/library-tab-D3WOtpE0.js.gz +0 -0
- codex/static_root/assets/main-CmjU2oTp.6a471f6900e5.js +6 -0
- codex/static_root/assets/main-CmjU2oTp.6a471f6900e5.js.br +0 -0
- codex/static_root/assets/main-CmjU2oTp.6a471f6900e5.js.gz +0 -0
- codex/static_root/assets/main-CmjU2oTp.js +6 -0
- codex/static_root/assets/main-CmjU2oTp.js.br +0 -0
- codex/static_root/assets/main-CmjU2oTp.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-BH54_5f6.6e92d0555cd7.js +1 -0
- codex/static_root/assets/pager-full-pdf-BH54_5f6.6e92d0555cd7.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-BH54_5f6.6e92d0555cd7.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-BH54_5f6.js +1 -0
- codex/static_root/assets/pager-full-pdf-BH54_5f6.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-BH54_5f6.js.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-C45-onwe.4722195bb60b.css → pagination-toolbar-DGrxp2OD.css} +1 -1
- codex/static_root/assets/pagination-toolbar-DGrxp2OD.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-DGrxp2OD.css.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-C45-onwe.css → pagination-toolbar-DGrxp2OD.f960a624f04f.css} +1 -1
- codex/static_root/assets/pagination-toolbar-DGrxp2OD.f960a624f04f.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-DGrxp2OD.f960a624f04f.css.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-CkIzuyx1.00c354a82e6e.js → pagination-toolbar-JH3Kbffr.451171f7ac33.js} +1 -1
- codex/static_root/assets/pagination-toolbar-JH3Kbffr.451171f7ac33.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-JH3Kbffr.451171f7ac33.js.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-CkIzuyx1.js → pagination-toolbar-JH3Kbffr.js} +1 -1
- codex/static_root/assets/pagination-toolbar-JH3Kbffr.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-JH3Kbffr.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-BjlRPuf4.0f056fa321b6.js → pdf-doc-BcRNpoaW.882f6e967869.js} +1 -1
- codex/static_root/assets/pdf-doc-BcRNpoaW.882f6e967869.js.br +0 -0
- codex/static_root/assets/pdf-doc-BcRNpoaW.882f6e967869.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-BjlRPuf4.js → pdf-doc-BcRNpoaW.js} +1 -1
- codex/static_root/assets/pdf-doc-BcRNpoaW.js.br +0 -0
- codex/static_root/assets/pdf-doc-BcRNpoaW.js.gz +0 -0
- codex/static_root/assets/reader-DIPRg2VB.900370e097aa.js +2 -0
- codex/static_root/assets/reader-DIPRg2VB.900370e097aa.js.br +0 -0
- codex/static_root/assets/reader-DIPRg2VB.900370e097aa.js.gz +0 -0
- codex/static_root/assets/reader-DIPRg2VB.js +2 -0
- codex/static_root/assets/reader-DIPRg2VB.js.br +0 -0
- codex/static_root/assets/reader-DIPRg2VB.js.gz +0 -0
- codex/static_root/assets/reader-DveZZr9x.7b21b9f8f628.css +1 -0
- codex/static_root/assets/reader-DveZZr9x.7b21b9f8f628.css.br +0 -0
- codex/static_root/assets/reader-DveZZr9x.7b21b9f8f628.css.gz +0 -0
- codex/static_root/assets/reader-DveZZr9x.css +1 -0
- codex/static_root/assets/reader-DveZZr9x.css.br +0 -0
- codex/static_root/assets/reader-DveZZr9x.css.gz +0 -0
- codex/static_root/assets/{relation-chips-CUSatZET.js → relation-chips-3tTlR5QH.71f18bc92adc.js} +1 -1
- codex/static_root/assets/relation-chips-3tTlR5QH.71f18bc92adc.js.br +0 -0
- codex/static_root/assets/relation-chips-3tTlR5QH.71f18bc92adc.js.gz +0 -0
- codex/static_root/assets/{relation-chips-CUSatZET.a58031ff8141.js → relation-chips-3tTlR5QH.js} +1 -1
- codex/static_root/assets/relation-chips-3tTlR5QH.js.br +0 -0
- codex/static_root/assets/relation-chips-3tTlR5QH.js.gz +0 -0
- codex/static_root/assets/{settings-drawer-BSHTAsJ9.js → settings-drawer-BdyFhA_r.151f4c3061ed.js} +2 -2
- codex/static_root/assets/settings-drawer-BdyFhA_r.151f4c3061ed.js.br +0 -0
- codex/static_root/assets/settings-drawer-BdyFhA_r.151f4c3061ed.js.gz +0 -0
- codex/static_root/assets/{settings-drawer-BSHTAsJ9.1d07ce084fc9.js → settings-drawer-BdyFhA_r.js} +2 -2
- codex/static_root/assets/settings-drawer-BdyFhA_r.js.br +0 -0
- codex/static_root/assets/settings-drawer-BdyFhA_r.js.gz +0 -0
- codex/static_root/assets/stats-tab-DeKjwvmh.7557c71b4cfa.js +1 -0
- codex/static_root/assets/stats-tab-DeKjwvmh.7557c71b4cfa.js.br +0 -0
- codex/static_root/assets/stats-tab-DeKjwvmh.7557c71b4cfa.js.gz +0 -0
- codex/static_root/assets/stats-tab-DeKjwvmh.js +1 -0
- codex/static_root/assets/stats-tab-DeKjwvmh.js.br +0 -0
- codex/static_root/assets/stats-tab-DeKjwvmh.js.gz +0 -0
- codex/static_root/assets/{stats-tab-BXGisn5N.9b7a71e7fe28.css → stats-tab-DpfGsVX3.1cb66f2649a9.css} +1 -1
- codex/static_root/assets/stats-tab-DpfGsVX3.1cb66f2649a9.css.br +0 -0
- codex/static_root/assets/stats-tab-DpfGsVX3.1cb66f2649a9.css.gz +0 -0
- codex/static_root/assets/{stats-tab-BXGisn5N.css → stats-tab-DpfGsVX3.css} +1 -1
- codex/static_root/assets/stats-tab-DpfGsVX3.css.br +0 -0
- codex/static_root/assets/stats-tab-DpfGsVX3.css.gz +0 -0
- codex/static_root/assets/{task-tab-NORFAa9p.97e07e366ddd.js → task-tab-C8D0qRP_.d4ab174c69a3.js} +1 -1
- codex/static_root/assets/task-tab-C8D0qRP_.d4ab174c69a3.js.br +0 -0
- codex/static_root/assets/task-tab-C8D0qRP_.d4ab174c69a3.js.gz +0 -0
- codex/static_root/assets/{task-tab-NORFAa9p.js → task-tab-C8D0qRP_.js} +1 -1
- codex/static_root/assets/task-tab-C8D0qRP_.js.br +0 -0
- codex/static_root/assets/task-tab-C8D0qRP_.js.gz +0 -0
- codex/static_root/assets/unauthorized-BHgBRF4z.8e5c1b9e52b0.js +1 -0
- codex/static_root/assets/unauthorized-BHgBRF4z.8e5c1b9e52b0.js.br +0 -0
- codex/static_root/assets/unauthorized-BHgBRF4z.8e5c1b9e52b0.js.gz +0 -0
- codex/static_root/assets/unauthorized-BHgBRF4z.js +1 -0
- codex/static_root/assets/unauthorized-BHgBRF4z.js.br +0 -0
- codex/static_root/assets/unauthorized-BHgBRF4z.js.gz +0 -0
- codex/static_root/assets/{unauthorized-muDsv-rC.css → unauthorized-BjhIc97q.728511c92cd0.css} +1 -1
- codex/static_root/assets/unauthorized-BjhIc97q.728511c92cd0.css.br +0 -0
- codex/static_root/assets/unauthorized-BjhIc97q.728511c92cd0.css.gz +0 -0
- codex/static_root/assets/{unauthorized-muDsv-rC.2166ec8b3a32.css → unauthorized-BjhIc97q.css} +1 -1
- codex/static_root/assets/unauthorized-BjhIc97q.css.br +0 -0
- codex/static_root/assets/unauthorized-BjhIc97q.css.gz +0 -0
- codex/static_root/assets/{user-tab-CHbyN1EW.e7206db08680.js → user-tab-BU31Z92y.35613c713faf.js} +1 -1
- codex/static_root/assets/user-tab-BU31Z92y.35613c713faf.js.br +0 -0
- codex/static_root/assets/user-tab-BU31Z92y.35613c713faf.js.gz +0 -0
- codex/static_root/assets/{user-tab-CHbyN1EW.js → user-tab-BU31Z92y.js} +1 -1
- codex/static_root/assets/user-tab-BU31Z92y.js.br +0 -0
- codex/static_root/assets/user-tab-BU31Z92y.js.gz +0 -0
- codex/static_root/js/choices-admin.8aa64c911203.json +1 -0
- codex/static_root/js/choices-admin.8aa64c911203.json.br +0 -0
- codex/static_root/js/choices-admin.8aa64c911203.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.45cb46e19686.json +635 -0
- codex/static_root/manifest.45cb46e19686.json.br +0 -0
- codex/static_root/manifest.45cb46e19686.json.gz +0 -0
- codex/static_root/manifest.json +248 -248
- codex/static_root/manifest.json.br +0 -0
- codex/static_root/manifest.json.gz +0 -0
- codex/static_root/staticfiles.json +1 -1
- codex/status_controller.py +10 -4
- codex/views/admin/tasks.py +46 -40
- codex/views/auth.py +15 -4
- codex/views/browser/annotations.py +94 -51
- codex/views/browser/base.py +1 -2
- codex/views/browser/browser.py +52 -21
- codex/views/browser/cover.py +8 -4
- codex/views/browser/filters/annotations.py +28 -6
- codex/views/browser/filters/search/__init__.py +1 -0
- codex/views/browser/filters/search/aliases.py +81 -0
- codex/views/browser/filters/search/field/__init__.py +1 -0
- codex/views/browser/filters/search/field/column.py +53 -0
- codex/views/browser/filters/search/field/expression.py +177 -0
- codex/views/browser/filters/search/field/filter.py +70 -0
- codex/views/browser/filters/search/field/optimize.py +71 -0
- codex/views/browser/filters/search/field/parse.py +187 -0
- codex/views/browser/filters/search/fts.py +38 -0
- codex/views/browser/filters/search/parse.py +220 -0
- codex/views/browser/order_by.py +8 -2
- codex/views/browser/page_in_bounds.py +88 -0
- codex/views/browser/paginate.py +28 -113
- codex/views/const.py +0 -1
- codex/views/opds/v1/feed.py +2 -1
- codex/views/opds/v2/feed.py +2 -1
- codex/views/opds/v2/links.py +1 -1
- codex/views/reader/books.py +1 -1
- codex/views/reader/page.py +3 -3
- {codex-1.6.19.dist-info → codex-1.7.0a0.dist-info}/METADATA +18 -10
- {codex-1.6.19.dist-info → codex-1.7.0a0.dist-info}/RECORD +321 -372
- codex/_vendor/__init__.py +0 -0
- codex/_vendor/django_haystack-3.2.1.dist-info/AUTHORS +0 -127
- codex/_vendor/django_haystack-3.2.1.dist-info/INSTALLER +0 -1
- codex/_vendor/django_haystack-3.2.1.dist-info/LICENSE +0 -31
- codex/_vendor/django_haystack-3.2.1.dist-info/METADATA +0 -98
- codex/_vendor/django_haystack-3.2.1.dist-info/RECORD +0 -97
- codex/_vendor/django_haystack-3.2.1.dist-info/REQUESTED +0 -0
- codex/_vendor/django_haystack-3.2.1.dist-info/WHEEL +0 -5
- codex/_vendor/django_haystack-3.2.1.dist-info/top_level.txt +0 -1
- codex/_vendor/haystack/__init__.py +0 -80
- codex/_vendor/haystack/admin.py +0 -163
- codex/_vendor/haystack/apps.py +0 -31
- codex/_vendor/haystack/backends/__init__.py +0 -1109
- codex/_vendor/haystack/backends/elasticsearch2_backend.py +0 -390
- codex/_vendor/haystack/backends/elasticsearch5_backend.py +0 -483
- codex/_vendor/haystack/backends/elasticsearch7_backend.py +0 -586
- codex/_vendor/haystack/backends/elasticsearch_backend.py +0 -1141
- codex/_vendor/haystack/backends/simple_backend.py +0 -132
- codex/_vendor/haystack/backends/solr_backend.py +0 -991
- codex/_vendor/haystack/backends/whoosh_backend.py +0 -1104
- codex/_vendor/haystack/constants.py +0 -57
- codex/_vendor/haystack/exceptions.py +0 -57
- codex/_vendor/haystack/fields.py +0 -562
- codex/_vendor/haystack/forms.py +0 -135
- codex/_vendor/haystack/generic_views.py +0 -141
- codex/_vendor/haystack/indexes.py +0 -548
- codex/_vendor/haystack/inputs.py +0 -169
- codex/_vendor/haystack/management/__init__.py +0 -0
- codex/_vendor/haystack/management/commands/__init__.py +0 -0
- codex/_vendor/haystack/management/commands/build_solr_schema.py +0 -187
- codex/_vendor/haystack/management/commands/clear_index.py +0 -67
- codex/_vendor/haystack/management/commands/haystack_info.py +0 -22
- codex/_vendor/haystack/management/commands/rebuild_index.py +0 -65
- codex/_vendor/haystack/management/commands/update_index.py +0 -438
- codex/_vendor/haystack/manager.py +0 -105
- codex/_vendor/haystack/models.py +0 -257
- codex/_vendor/haystack/panels.py +0 -89
- codex/_vendor/haystack/query.py +0 -771
- codex/_vendor/haystack/routers.py +0 -14
- codex/_vendor/haystack/signals.py +0 -88
- codex/_vendor/haystack/templates/panels/haystack.html +0 -33
- codex/_vendor/haystack/templates/search_configuration/schema.xml +0 -1056
- codex/_vendor/haystack/templates/search_configuration/solrconfig.xml +0 -1446
- codex/_vendor/haystack/templatetags/__init__.py +0 -0
- codex/_vendor/haystack/templatetags/highlight.py +0 -131
- codex/_vendor/haystack/templatetags/more_like_this.py +0 -119
- codex/_vendor/haystack/urls.py +0 -5
- codex/_vendor/haystack/utils/__init__.py +0 -84
- codex/_vendor/haystack/utils/app_loading.py +0 -34
- codex/_vendor/haystack/utils/geo.py +0 -71
- codex/_vendor/haystack/utils/highlighting.py +0 -165
- codex/_vendor/haystack/utils/loading.py +0 -374
- codex/_vendor/haystack/utils/log.py +0 -21
- codex/_vendor/haystack/version.py +0 -16
- codex/_vendor/haystack/views.py +0 -253
- codex/integrity.py +0 -492
- codex/librarian/search/merge.py +0 -86
- codex/librarian/search/version.py +0 -63
- codex/search/__init__.py +0 -1
- codex/search/backend.py +0 -524
- codex/search/backend_search.py +0 -229
- codex/search/engine.py +0 -33
- codex/search/indexes.py +0 -79
- codex/search/query.py +0 -67
- codex/search/writing.py +0 -180
- codex/static_root/assets/VCheckbox-Cko1sQK-.170726b3b8a1.js.br +0 -0
- codex/static_root/assets/VCheckbox-Cko1sQK-.170726b3b8a1.js.gz +0 -0
- codex/static_root/assets/VCheckbox-Cko1sQK-.js.br +0 -0
- codex/static_root/assets/VCheckbox-Cko1sQK-.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-CO3-aqQL.c9b8062fd66f.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-CO3-aqQL.c9b8062fd66f.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-CO3-aqQL.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-CO3-aqQL.js.gz +0 -0
- codex/static_root/assets/VCombobox-Bjp6lffE.caf59fba486e.js.br +0 -0
- codex/static_root/assets/VCombobox-Bjp6lffE.caf59fba486e.js.gz +0 -0
- codex/static_root/assets/VCombobox-Bjp6lffE.js.br +0 -0
- codex/static_root/assets/VCombobox-Bjp6lffE.js.gz +0 -0
- codex/static_root/assets/VDialog-BkpVGB70.6eea3ca762a5.js.br +0 -0
- codex/static_root/assets/VDialog-BkpVGB70.6eea3ca762a5.js.gz +0 -0
- codex/static_root/assets/VDialog-BkpVGB70.js.br +0 -0
- codex/static_root/assets/VDialog-BkpVGB70.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-Ci2-j8XX.9c55db4ef49e.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-Ci2-j8XX.9c55db4ef49e.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-Ci2-j8XX.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-Ci2-j8XX.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-D3Py5BfQ.a4f25edb86d3.js.br +0 -0
- codex/static_root/assets/VRadioGroup-D3Py5BfQ.a4f25edb86d3.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-D3Py5BfQ.js.br +0 -0
- codex/static_root/assets/VRadioGroup-D3Py5BfQ.js.gz +0 -0
- codex/static_root/assets/VSelect-DtvZsYZz.e98745d858eb.js.br +0 -0
- codex/static_root/assets/VSelect-DtvZsYZz.e98745d858eb.js.gz +0 -0
- codex/static_root/assets/VSelect-DtvZsYZz.js.br +0 -0
- codex/static_root/assets/VSelect-DtvZsYZz.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-D6kmykQW.1e1fda62ceba.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D6kmykQW.1e1fda62ceba.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-D6kmykQW.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D6kmykQW.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-UGZWxpF5.360bdefcd215.js.br +0 -0
- codex/static_root/assets/VSlideGroup-UGZWxpF5.360bdefcd215.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-UGZWxpF5.js.br +0 -0
- codex/static_root/assets/VSlideGroup-UGZWxpF5.js.gz +0 -0
- codex/static_root/assets/VTable-DXH_yQ0o.1149f56ad566.js.br +0 -0
- codex/static_root/assets/VTable-DXH_yQ0o.1149f56ad566.js.gz +0 -0
- codex/static_root/assets/VTable-DXH_yQ0o.js.br +0 -0
- codex/static_root/assets/VTable-DXH_yQ0o.js.gz +0 -0
- codex/static_root/assets/VTextField-Blqy56_L.26d8761e0155.js.br +0 -0
- codex/static_root/assets/VTextField-Blqy56_L.26d8761e0155.js.gz +0 -0
- codex/static_root/assets/VTextField-Blqy56_L.js.br +0 -0
- codex/static_root/assets/VTextField-Blqy56_L.js.gz +0 -0
- codex/static_root/assets/VWindowItem-C8_ovV7e.afbc08414765.js.br +0 -0
- codex/static_root/assets/VWindowItem-C8_ovV7e.afbc08414765.js.gz +0 -0
- codex/static_root/assets/VWindowItem-C8_ovV7e.js.br +0 -0
- codex/static_root/assets/VWindowItem-C8_ovV7e.js.gz +0 -0
- codex/static_root/assets/admin-DTRn8bBs.d031ea42d8d0.js.br +0 -0
- codex/static_root/assets/admin-DTRn8bBs.d031ea42d8d0.js.gz +0 -0
- codex/static_root/assets/admin-DTRn8bBs.js.br +0 -0
- codex/static_root/assets/admin-DTRn8bBs.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-BaXFOcru.b1a44b05f482.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-BaXFOcru.b1a44b05f482.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-BaXFOcru.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-BaXFOcru.js.gz +0 -0
- codex/static_root/assets/browser-BBpUyGmz.c1cb9e2d463b.js +0 -1
- codex/static_root/assets/browser-BBpUyGmz.c1cb9e2d463b.js.br +0 -0
- codex/static_root/assets/browser-BBpUyGmz.c1cb9e2d463b.js.gz +0 -0
- codex/static_root/assets/browser-BBpUyGmz.js +0 -1
- codex/static_root/assets/browser-BBpUyGmz.js.br +0 -0
- codex/static_root/assets/browser-BBpUyGmz.js.gz +0 -0
- codex/static_root/assets/browser-Binc3n9H.313722d27ca3.css +0 -1
- codex/static_root/assets/browser-Binc3n9H.313722d27ca3.css.br +0 -0
- codex/static_root/assets/browser-Binc3n9H.313722d27ca3.css.gz +0 -0
- codex/static_root/assets/browser-Binc3n9H.css +0 -1
- codex/static_root/assets/browser-Binc3n9H.css.br +0 -0
- codex/static_root/assets/browser-Binc3n9H.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-Cebek1-c.aff2975e31f8.css +0 -1
- codex/static_root/assets/change-password-dialog-Cebek1-c.aff2975e31f8.css.br +0 -0
- codex/static_root/assets/change-password-dialog-Cebek1-c.aff2975e31f8.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-Cebek1-c.css +0 -1
- codex/static_root/assets/change-password-dialog-Cebek1-c.css.br +0 -0
- codex/static_root/assets/change-password-dialog-Cebek1-c.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-DlHoLhDF.76ab4a29bb9b.js +0 -1
- codex/static_root/assets/change-password-dialog-DlHoLhDF.76ab4a29bb9b.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DlHoLhDF.76ab4a29bb9b.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-DlHoLhDF.js +0 -1
- codex/static_root/assets/change-password-dialog-DlHoLhDF.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DlHoLhDF.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-D3_s2DQy.9dde66036c72.js.br +0 -0
- codex/static_root/assets/confirm-dialog-D3_s2DQy.9dde66036c72.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-D3_s2DQy.js.br +0 -0
- codex/static_root/assets/confirm-dialog-D3_s2DQy.js.gz +0 -0
- codex/static_root/assets/datetime-column-BxC1Li9e.3dc314b3295d.js.br +0 -0
- codex/static_root/assets/datetime-column-BxC1Li9e.3dc314b3295d.js.gz +0 -0
- codex/static_root/assets/datetime-column-BxC1Li9e.js.br +0 -0
- codex/static_root/assets/datetime-column-BxC1Li9e.js.gz +0 -0
- codex/static_root/assets/filter-Bzk7x841.d0c3b602e62d.js.br +0 -0
- codex/static_root/assets/filter-Bzk7x841.d0c3b602e62d.js.gz +0 -0
- codex/static_root/assets/filter-Bzk7x841.js.br +0 -0
- codex/static_root/assets/filter-Bzk7x841.js.gz +0 -0
- codex/static_root/assets/flag-tab-C2bI5zq3.8f8c297600a6.js +0 -1
- codex/static_root/assets/flag-tab-C2bI5zq3.8f8c297600a6.js.br +0 -0
- codex/static_root/assets/flag-tab-C2bI5zq3.8f8c297600a6.js.gz +0 -0
- codex/static_root/assets/flag-tab-C2bI5zq3.js +0 -1
- codex/static_root/assets/flag-tab-C2bI5zq3.js.br +0 -0
- codex/static_root/assets/flag-tab-C2bI5zq3.js.gz +0 -0
- codex/static_root/assets/group-tab-5esH4lwX.a81fdd258117.js.br +0 -0
- codex/static_root/assets/group-tab-5esH4lwX.a81fdd258117.js.gz +0 -0
- codex/static_root/assets/group-tab-5esH4lwX.js.br +0 -0
- codex/static_root/assets/group-tab-5esH4lwX.js.gz +0 -0
- codex/static_root/assets/http-error-BTOBfcGY.52ced6f28420.js.br +0 -0
- codex/static_root/assets/http-error-BTOBfcGY.52ced6f28420.js.gz +0 -0
- codex/static_root/assets/http-error-BTOBfcGY.js.br +0 -0
- codex/static_root/assets/http-error-BTOBfcGY.js.gz +0 -0
- codex/static_root/assets/library-tab-DiPEdOF7.ece2d642a9dc.js.br +0 -0
- codex/static_root/assets/library-tab-DiPEdOF7.ece2d642a9dc.js.gz +0 -0
- codex/static_root/assets/library-tab-DiPEdOF7.js.br +0 -0
- codex/static_root/assets/library-tab-DiPEdOF7.js.gz +0 -0
- codex/static_root/assets/main-BPIPjzsc.66def8991e38.js +0 -6
- codex/static_root/assets/main-BPIPjzsc.66def8991e38.js.br +0 -0
- codex/static_root/assets/main-BPIPjzsc.66def8991e38.js.gz +0 -0
- codex/static_root/assets/main-BPIPjzsc.js +0 -6
- codex/static_root/assets/main-BPIPjzsc.js.br +0 -0
- codex/static_root/assets/main-BPIPjzsc.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-CiyC6Al9.278b9978f36f.js +0 -1
- codex/static_root/assets/pager-full-pdf-CiyC6Al9.278b9978f36f.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-CiyC6Al9.278b9978f36f.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-CiyC6Al9.js +0 -1
- codex/static_root/assets/pager-full-pdf-CiyC6Al9.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-CiyC6Al9.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-C45-onwe.4722195bb60b.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-C45-onwe.4722195bb60b.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-C45-onwe.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-C45-onwe.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CkIzuyx1.00c354a82e6e.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-CkIzuyx1.00c354a82e6e.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-CkIzuyx1.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-CkIzuyx1.js.gz +0 -0
- codex/static_root/assets/pdf-doc-BjlRPuf4.0f056fa321b6.js.br +0 -0
- codex/static_root/assets/pdf-doc-BjlRPuf4.0f056fa321b6.js.gz +0 -0
- codex/static_root/assets/pdf-doc-BjlRPuf4.js.br +0 -0
- codex/static_root/assets/pdf-doc-BjlRPuf4.js.gz +0 -0
- codex/static_root/assets/reader-_stAWL-4.5089e9144795.css +0 -1
- codex/static_root/assets/reader-_stAWL-4.5089e9144795.css.br +0 -0
- codex/static_root/assets/reader-_stAWL-4.5089e9144795.css.gz +0 -0
- codex/static_root/assets/reader-_stAWL-4.css +0 -1
- codex/static_root/assets/reader-_stAWL-4.css.br +0 -0
- codex/static_root/assets/reader-_stAWL-4.css.gz +0 -0
- codex/static_root/assets/reader-ucxnLi2K.d0fbce0f03c1.js +0 -2
- codex/static_root/assets/reader-ucxnLi2K.d0fbce0f03c1.js.br +0 -0
- codex/static_root/assets/reader-ucxnLi2K.d0fbce0f03c1.js.gz +0 -0
- codex/static_root/assets/reader-ucxnLi2K.js +0 -2
- codex/static_root/assets/reader-ucxnLi2K.js.br +0 -0
- codex/static_root/assets/reader-ucxnLi2K.js.gz +0 -0
- codex/static_root/assets/relation-chips-CUSatZET.a58031ff8141.js.br +0 -0
- codex/static_root/assets/relation-chips-CUSatZET.a58031ff8141.js.gz +0 -0
- codex/static_root/assets/relation-chips-CUSatZET.js.br +0 -0
- codex/static_root/assets/relation-chips-CUSatZET.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BSHTAsJ9.1d07ce084fc9.js.br +0 -0
- codex/static_root/assets/settings-drawer-BSHTAsJ9.1d07ce084fc9.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BSHTAsJ9.js.br +0 -0
- codex/static_root/assets/settings-drawer-BSHTAsJ9.js.gz +0 -0
- codex/static_root/assets/stats-tab-BXGisn5N.9b7a71e7fe28.css.br +0 -0
- codex/static_root/assets/stats-tab-BXGisn5N.9b7a71e7fe28.css.gz +0 -0
- codex/static_root/assets/stats-tab-BXGisn5N.css.br +0 -0
- codex/static_root/assets/stats-tab-BXGisn5N.css.gz +0 -0
- codex/static_root/assets/stats-tab-DKXVB2Cc.0a3de58bf5ee.js +0 -1
- codex/static_root/assets/stats-tab-DKXVB2Cc.0a3de58bf5ee.js.br +0 -0
- codex/static_root/assets/stats-tab-DKXVB2Cc.0a3de58bf5ee.js.gz +0 -0
- codex/static_root/assets/stats-tab-DKXVB2Cc.js +0 -1
- codex/static_root/assets/stats-tab-DKXVB2Cc.js.br +0 -0
- codex/static_root/assets/stats-tab-DKXVB2Cc.js.gz +0 -0
- codex/static_root/assets/task-tab-NORFAa9p.97e07e366ddd.js.br +0 -0
- codex/static_root/assets/task-tab-NORFAa9p.97e07e366ddd.js.gz +0 -0
- codex/static_root/assets/task-tab-NORFAa9p.js.br +0 -0
- codex/static_root/assets/task-tab-NORFAa9p.js.gz +0 -0
- codex/static_root/assets/unauthorized-RHaQZRfr.a234e9403f60.js +0 -1
- codex/static_root/assets/unauthorized-RHaQZRfr.a234e9403f60.js.br +0 -0
- codex/static_root/assets/unauthorized-RHaQZRfr.a234e9403f60.js.gz +0 -0
- codex/static_root/assets/unauthorized-RHaQZRfr.js +0 -1
- codex/static_root/assets/unauthorized-RHaQZRfr.js.br +0 -0
- codex/static_root/assets/unauthorized-RHaQZRfr.js.gz +0 -0
- codex/static_root/assets/unauthorized-muDsv-rC.2166ec8b3a32.css.br +0 -0
- codex/static_root/assets/unauthorized-muDsv-rC.2166ec8b3a32.css.gz +0 -0
- codex/static_root/assets/unauthorized-muDsv-rC.css.br +0 -0
- codex/static_root/assets/unauthorized-muDsv-rC.css.gz +0 -0
- codex/static_root/assets/user-tab-CHbyN1EW.e7206db08680.js.br +0 -0
- codex/static_root/assets/user-tab-CHbyN1EW.e7206db08680.js.gz +0 -0
- codex/static_root/assets/user-tab-CHbyN1EW.js.br +0 -0
- codex/static_root/assets/user-tab-CHbyN1EW.js.gz +0 -0
- codex/static_root/js/choices-admin.1a20a5648f20.json +0 -1
- codex/static_root/js/choices-admin.1a20a5648f20.json.br +0 -0
- codex/static_root/js/choices-admin.1a20a5648f20.json.gz +0 -0
- codex/static_root/manifest.0fe31a6cb99f.json +0 -635
- codex/static_root/manifest.0fe31a6cb99f.json.br +0 -0
- codex/static_root/manifest.0fe31a6cb99f.json.gz +0 -0
- codex/templates/search/indexes/codex/comic_text.txt +0 -47
- codex/views/browser/filters/search.py +0 -196
- {codex-1.6.19.dist-info → codex-1.7.0a0.dist-info}/LICENSE +0 -0
- {codex-1.6.19.dist-info → codex-1.7.0a0.dist-info}/WHEEL +0 -0
- {codex-1.6.19.dist-info → codex-1.7.0a0.dist-info}/entry_points.txt +0 -0
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import os
|
|
4
|
-
import time
|
|
5
|
-
from datetime import timedelta
|
|
6
|
-
|
|
7
|
-
from django.core.management.base import BaseCommand, CommandError
|
|
8
|
-
from django.db import close_old_connections, reset_queries
|
|
9
|
-
from django.utils.encoding import force_str, smart_bytes
|
|
10
|
-
from django.utils.timezone import now
|
|
11
|
-
|
|
12
|
-
from ....haystack import connections as haystack_connections
|
|
13
|
-
from ....haystack.exceptions import NotHandled
|
|
14
|
-
from ....haystack.query import SearchQuerySet
|
|
15
|
-
from ....haystack.utils.app_loading import haystack_get_models, haystack_load_apps
|
|
16
|
-
|
|
17
|
-
DEFAULT_BATCH_SIZE = None
|
|
18
|
-
DEFAULT_AGE = None
|
|
19
|
-
DEFAULT_MAX_RETRIES = 5
|
|
20
|
-
|
|
21
|
-
LOG = multiprocessing.log_to_stderr(level=logging.WARNING)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def update_worker(args):
|
|
25
|
-
if len(args) != 10:
|
|
26
|
-
LOG.error("update_worker received incorrect arguments: %r", args)
|
|
27
|
-
raise ValueError("update_worker received incorrect arguments")
|
|
28
|
-
|
|
29
|
-
(
|
|
30
|
-
model,
|
|
31
|
-
start,
|
|
32
|
-
end,
|
|
33
|
-
total,
|
|
34
|
-
using,
|
|
35
|
-
start_date,
|
|
36
|
-
end_date,
|
|
37
|
-
verbosity,
|
|
38
|
-
commit,
|
|
39
|
-
max_retries,
|
|
40
|
-
) = args
|
|
41
|
-
|
|
42
|
-
# FIXME: confirm that this is still relevant with modern versions of Django:
|
|
43
|
-
# We need to reset the connections, otherwise the different processes
|
|
44
|
-
# will try to share the connection, which causes things to blow up.
|
|
45
|
-
from django.db import connections
|
|
46
|
-
|
|
47
|
-
for alias, info in connections.databases.items():
|
|
48
|
-
# We need to also tread lightly with SQLite, because blindly wiping
|
|
49
|
-
# out connections (via ``... = {}``) destroys in-memory DBs.
|
|
50
|
-
if "sqlite3" not in info["ENGINE"]:
|
|
51
|
-
try:
|
|
52
|
-
close_old_connections()
|
|
53
|
-
if isinstance(connections._connections, dict):
|
|
54
|
-
del connections._connections[alias]
|
|
55
|
-
else:
|
|
56
|
-
delattr(connections._connections, alias)
|
|
57
|
-
except KeyError:
|
|
58
|
-
pass
|
|
59
|
-
|
|
60
|
-
# Request that the connection clear out any transient sessions, file handles, etc.
|
|
61
|
-
haystack_connections[using].reset_sessions()
|
|
62
|
-
|
|
63
|
-
unified_index = haystack_connections[using].get_unified_index()
|
|
64
|
-
index = unified_index.get_index(model)
|
|
65
|
-
backend = haystack_connections[using].get_backend()
|
|
66
|
-
|
|
67
|
-
qs = index.build_queryset(using=using, start_date=start_date, end_date=end_date)
|
|
68
|
-
do_update(backend, index, qs, start, end, total, verbosity, commit, max_retries)
|
|
69
|
-
return args
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
def do_update(
|
|
73
|
-
backend,
|
|
74
|
-
index,
|
|
75
|
-
qs,
|
|
76
|
-
start,
|
|
77
|
-
end,
|
|
78
|
-
total,
|
|
79
|
-
verbosity=1,
|
|
80
|
-
commit=True,
|
|
81
|
-
max_retries=DEFAULT_MAX_RETRIES,
|
|
82
|
-
last_max_pk=None,
|
|
83
|
-
):
|
|
84
|
-
|
|
85
|
-
# Get a clone of the QuerySet so that the cache doesn't bloat up
|
|
86
|
-
# in memory. Useful when reindexing large amounts of data.
|
|
87
|
-
# the query must be ordered by PK in order to get the max PK in each batch
|
|
88
|
-
small_cache_qs = qs.all().order_by("pk")
|
|
89
|
-
|
|
90
|
-
# If we got the max seen PK from last batch, use it to restrict the qs
|
|
91
|
-
# to values above; this optimises the query for Postgres as not to
|
|
92
|
-
# devolve into multi-second run time at large offsets.
|
|
93
|
-
if last_max_pk is not None:
|
|
94
|
-
current_qs = small_cache_qs.filter(pk__gt=last_max_pk)[: end - start]
|
|
95
|
-
else:
|
|
96
|
-
current_qs = small_cache_qs[start:end]
|
|
97
|
-
|
|
98
|
-
# Remember maximum PK seen so far
|
|
99
|
-
max_pk = None
|
|
100
|
-
current_qs = list(current_qs)
|
|
101
|
-
if current_qs:
|
|
102
|
-
max_pk = current_qs[-1].pk
|
|
103
|
-
|
|
104
|
-
is_parent_process = hasattr(os, "getppid") and os.getpid() == os.getppid()
|
|
105
|
-
|
|
106
|
-
if verbosity >= 2:
|
|
107
|
-
if is_parent_process:
|
|
108
|
-
print(" indexed %s - %d of %d." % (start + 1, end, total))
|
|
109
|
-
else:
|
|
110
|
-
print(
|
|
111
|
-
" indexed %s - %d of %d (worker PID: %s)."
|
|
112
|
-
% (start + 1, end, total, os.getpid())
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
retries = 0
|
|
116
|
-
while retries < max_retries:
|
|
117
|
-
try:
|
|
118
|
-
# FIXME: Get the right backend.
|
|
119
|
-
backend.update(index, current_qs, commit=commit)
|
|
120
|
-
if verbosity >= 2 and retries:
|
|
121
|
-
print(
|
|
122
|
-
"Completed indexing {} - {}, tried {}/{} times".format(
|
|
123
|
-
start + 1, end, retries + 1, max_retries
|
|
124
|
-
)
|
|
125
|
-
)
|
|
126
|
-
break
|
|
127
|
-
except Exception as exc:
|
|
128
|
-
# Catch all exceptions which do not normally trigger a system exit, excluding SystemExit and
|
|
129
|
-
# KeyboardInterrupt. This avoids needing to import the backend-specific exception subclasses
|
|
130
|
-
# from pysolr, elasticsearch, whoosh, requests, etc.
|
|
131
|
-
retries += 1
|
|
132
|
-
|
|
133
|
-
error_context = {
|
|
134
|
-
"start": start + 1,
|
|
135
|
-
"end": end,
|
|
136
|
-
"retries": retries,
|
|
137
|
-
"max_retries": max_retries,
|
|
138
|
-
"pid": os.getpid(),
|
|
139
|
-
"exc": exc,
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
error_msg = "Failed indexing %(start)s - %(end)s (retry %(retries)s/%(max_retries)s): %(exc)s"
|
|
143
|
-
if not is_parent_process:
|
|
144
|
-
error_msg += " (pid %(pid)s): %(exc)s"
|
|
145
|
-
|
|
146
|
-
if retries >= max_retries:
|
|
147
|
-
LOG.error(error_msg, error_context, exc_info=True)
|
|
148
|
-
raise
|
|
149
|
-
elif verbosity >= 2:
|
|
150
|
-
LOG.warning(error_msg, error_context, exc_info=True)
|
|
151
|
-
|
|
152
|
-
# If going to try again, sleep a bit before
|
|
153
|
-
time.sleep(2**retries)
|
|
154
|
-
|
|
155
|
-
# Clear out the DB connections queries because it bloats up RAM.
|
|
156
|
-
reset_queries()
|
|
157
|
-
return max_pk
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
class Command(BaseCommand):
|
|
161
|
-
help = "Freshens the index for the given app(s)." # noqa A003
|
|
162
|
-
|
|
163
|
-
def add_arguments(self, parser):
|
|
164
|
-
parser.add_argument(
|
|
165
|
-
"app_label",
|
|
166
|
-
nargs="*",
|
|
167
|
-
help="App label of an application to update the search index.",
|
|
168
|
-
)
|
|
169
|
-
parser.add_argument(
|
|
170
|
-
"-m",
|
|
171
|
-
"--minutes",
|
|
172
|
-
type=int,
|
|
173
|
-
help="Number of minutes back to consider objects new.",
|
|
174
|
-
)
|
|
175
|
-
parser.add_argument(
|
|
176
|
-
"-a",
|
|
177
|
-
"--age",
|
|
178
|
-
type=int,
|
|
179
|
-
default=DEFAULT_AGE,
|
|
180
|
-
help="Number of hours back to consider objects new.",
|
|
181
|
-
)
|
|
182
|
-
parser.add_argument(
|
|
183
|
-
"-s",
|
|
184
|
-
"--start",
|
|
185
|
-
dest="start_date",
|
|
186
|
-
help="The start date for indexing. Can be any dateutil-parsable string;"
|
|
187
|
-
" YYYY-MM-DDTHH:MM:SS is recommended to avoid confusion",
|
|
188
|
-
)
|
|
189
|
-
parser.add_argument(
|
|
190
|
-
"-e",
|
|
191
|
-
"--end",
|
|
192
|
-
dest="end_date",
|
|
193
|
-
help="The end date for indexing. Can be any dateutil-parsable string;"
|
|
194
|
-
" YYYY-MM-DDTHH:MM:SS is recommended to avoid confusion",
|
|
195
|
-
)
|
|
196
|
-
parser.add_argument(
|
|
197
|
-
"-b",
|
|
198
|
-
"--batch-size",
|
|
199
|
-
dest="batchsize",
|
|
200
|
-
type=int,
|
|
201
|
-
help="Number of items to index at once.",
|
|
202
|
-
)
|
|
203
|
-
parser.add_argument(
|
|
204
|
-
"-r",
|
|
205
|
-
"--remove",
|
|
206
|
-
action="store_true",
|
|
207
|
-
default=False,
|
|
208
|
-
help="Remove objects from the index that are no longer present in the database.",
|
|
209
|
-
)
|
|
210
|
-
parser.add_argument(
|
|
211
|
-
"-u",
|
|
212
|
-
"--using",
|
|
213
|
-
action="append",
|
|
214
|
-
default=[],
|
|
215
|
-
help="Update only the named backend (can be used multiple times). "
|
|
216
|
-
"By default all backends will be updated.",
|
|
217
|
-
)
|
|
218
|
-
parser.add_argument(
|
|
219
|
-
"-k",
|
|
220
|
-
"--workers",
|
|
221
|
-
type=int,
|
|
222
|
-
default=0,
|
|
223
|
-
help="Allows for the use multiple workers to parallelize indexing.",
|
|
224
|
-
)
|
|
225
|
-
parser.add_argument(
|
|
226
|
-
"--nocommit",
|
|
227
|
-
action="store_false",
|
|
228
|
-
dest="commit",
|
|
229
|
-
default=True,
|
|
230
|
-
help="Will pass commit=False to the backend.",
|
|
231
|
-
)
|
|
232
|
-
parser.add_argument(
|
|
233
|
-
"-t",
|
|
234
|
-
"--max-retries",
|
|
235
|
-
action="store",
|
|
236
|
-
dest="max_retries",
|
|
237
|
-
type=int,
|
|
238
|
-
default=DEFAULT_MAX_RETRIES,
|
|
239
|
-
help="Maximum number of attempts to write to the backend when an error occurs.",
|
|
240
|
-
)
|
|
241
|
-
|
|
242
|
-
def handle(self, **options):
|
|
243
|
-
self.verbosity = int(options.get("verbosity", 1))
|
|
244
|
-
self.batchsize = options.get("batchsize", DEFAULT_BATCH_SIZE)
|
|
245
|
-
self.start_date = None
|
|
246
|
-
self.end_date = None
|
|
247
|
-
self.remove = options.get("remove", False)
|
|
248
|
-
self.workers = options.get("workers", 0)
|
|
249
|
-
self.commit = options.get("commit", True)
|
|
250
|
-
self.max_retries = options.get("max_retries", DEFAULT_MAX_RETRIES)
|
|
251
|
-
|
|
252
|
-
self.backends = options.get("using")
|
|
253
|
-
if not self.backends:
|
|
254
|
-
self.backends = haystack_connections.connections_info.keys()
|
|
255
|
-
|
|
256
|
-
age = options.get("age", DEFAULT_AGE)
|
|
257
|
-
minutes = options.get("minutes", DEFAULT_AGE)
|
|
258
|
-
start_date = options.get("start_date")
|
|
259
|
-
end_date = options.get("end_date")
|
|
260
|
-
|
|
261
|
-
if self.verbosity > 2:
|
|
262
|
-
LOG.setLevel(logging.DEBUG)
|
|
263
|
-
elif self.verbosity > 1:
|
|
264
|
-
LOG.setLevel(logging.INFO)
|
|
265
|
-
|
|
266
|
-
if (minutes and age) or (minutes and start_date) or (age and start_date):
|
|
267
|
-
raise CommandError(
|
|
268
|
-
"Minutes / age / start date options are mutually exclusive"
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
if minutes is not None:
|
|
272
|
-
self.start_date = now() - timedelta(minutes=minutes)
|
|
273
|
-
|
|
274
|
-
if age is not None:
|
|
275
|
-
self.start_date = now() - timedelta(hours=age)
|
|
276
|
-
|
|
277
|
-
if start_date is not None:
|
|
278
|
-
from dateutil.parser import parse as dateutil_parse
|
|
279
|
-
|
|
280
|
-
try:
|
|
281
|
-
self.start_date = dateutil_parse(start_date)
|
|
282
|
-
except ValueError:
|
|
283
|
-
pass
|
|
284
|
-
|
|
285
|
-
if end_date is not None:
|
|
286
|
-
from dateutil.parser import parse as dateutil_parse
|
|
287
|
-
|
|
288
|
-
try:
|
|
289
|
-
self.end_date = dateutil_parse(end_date)
|
|
290
|
-
except ValueError:
|
|
291
|
-
pass
|
|
292
|
-
|
|
293
|
-
labels = options.get("app_label") or haystack_load_apps()
|
|
294
|
-
for label in labels:
|
|
295
|
-
for using in self.backends:
|
|
296
|
-
try:
|
|
297
|
-
self.update_backend(label, using)
|
|
298
|
-
except Exception:
|
|
299
|
-
LOG.exception("Error updating %s using %s ", label, using)
|
|
300
|
-
raise
|
|
301
|
-
|
|
302
|
-
def update_backend(self, label, using):
|
|
303
|
-
backend = haystack_connections[using].get_backend()
|
|
304
|
-
unified_index = haystack_connections[using].get_unified_index()
|
|
305
|
-
|
|
306
|
-
for model in haystack_get_models(label):
|
|
307
|
-
try:
|
|
308
|
-
index = unified_index.get_index(model)
|
|
309
|
-
except NotHandled:
|
|
310
|
-
if self.verbosity >= 2:
|
|
311
|
-
self.stdout.write("Skipping '%s' - no index." % model)
|
|
312
|
-
continue
|
|
313
|
-
|
|
314
|
-
if self.workers > 0:
|
|
315
|
-
# workers resetting connections leads to references to models / connections getting
|
|
316
|
-
# stale and having their connection disconnected from under them. Resetting before
|
|
317
|
-
# the loop continues and it accesses the ORM makes it better.
|
|
318
|
-
close_old_connections()
|
|
319
|
-
|
|
320
|
-
qs = index.build_queryset(
|
|
321
|
-
using=using, start_date=self.start_date, end_date=self.end_date
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
total = qs.count()
|
|
325
|
-
|
|
326
|
-
if self.verbosity >= 1:
|
|
327
|
-
self.stdout.write(
|
|
328
|
-
"Indexing %d %s"
|
|
329
|
-
% (total, force_str(model._meta.verbose_name_plural))
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
batch_size = self.batchsize or backend.batch_size
|
|
333
|
-
|
|
334
|
-
if self.workers > 0:
|
|
335
|
-
ghetto_queue = []
|
|
336
|
-
|
|
337
|
-
max_pk = None
|
|
338
|
-
for start in range(0, total, batch_size):
|
|
339
|
-
end = min(start + batch_size, total)
|
|
340
|
-
|
|
341
|
-
if self.workers == 0:
|
|
342
|
-
max_pk = do_update(
|
|
343
|
-
backend,
|
|
344
|
-
index,
|
|
345
|
-
qs,
|
|
346
|
-
start,
|
|
347
|
-
end,
|
|
348
|
-
total,
|
|
349
|
-
verbosity=self.verbosity,
|
|
350
|
-
commit=self.commit,
|
|
351
|
-
max_retries=self.max_retries,
|
|
352
|
-
last_max_pk=max_pk,
|
|
353
|
-
)
|
|
354
|
-
else:
|
|
355
|
-
ghetto_queue.append(
|
|
356
|
-
(
|
|
357
|
-
model,
|
|
358
|
-
start,
|
|
359
|
-
end,
|
|
360
|
-
total,
|
|
361
|
-
using,
|
|
362
|
-
self.start_date,
|
|
363
|
-
self.end_date,
|
|
364
|
-
self.verbosity,
|
|
365
|
-
self.commit,
|
|
366
|
-
self.max_retries,
|
|
367
|
-
)
|
|
368
|
-
)
|
|
369
|
-
|
|
370
|
-
if self.workers > 0:
|
|
371
|
-
pool = multiprocessing.Pool(self.workers)
|
|
372
|
-
|
|
373
|
-
successful_tasks = pool.map(update_worker, ghetto_queue)
|
|
374
|
-
|
|
375
|
-
if len(ghetto_queue) != len(successful_tasks):
|
|
376
|
-
self.stderr.write(
|
|
377
|
-
"Queued %d tasks but only %d completed"
|
|
378
|
-
% (len(ghetto_queue), len(successful_tasks))
|
|
379
|
-
)
|
|
380
|
-
for i in ghetto_queue:
|
|
381
|
-
if i not in successful_tasks:
|
|
382
|
-
self.stderr.write("Incomplete task: %s" % repr(i))
|
|
383
|
-
|
|
384
|
-
pool.close()
|
|
385
|
-
pool.join()
|
|
386
|
-
|
|
387
|
-
if self.remove:
|
|
388
|
-
if self.start_date or self.end_date or total <= 0:
|
|
389
|
-
# They're using a reduced set, which may not incorporate
|
|
390
|
-
# all pks. Rebuild the list with everything.
|
|
391
|
-
qs = index.index_queryset(using=using).values_list("pk", flat=True)
|
|
392
|
-
database_pks = {smart_bytes(pk) for pk in qs}
|
|
393
|
-
else:
|
|
394
|
-
database_pks = {
|
|
395
|
-
smart_bytes(pk) for pk in qs.values_list("pk", flat=True)
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
# Since records may still be in the search index but not the local database
|
|
399
|
-
# we'll use that to create batches for processing.
|
|
400
|
-
# See https://github.com/django-haystack/django-haystack/issues/1186
|
|
401
|
-
index_total = (
|
|
402
|
-
SearchQuerySet(using=backend.connection_alias).models(model).count()
|
|
403
|
-
)
|
|
404
|
-
|
|
405
|
-
# Retrieve PKs from the index. Note that this cannot be a numeric range query because although
|
|
406
|
-
# pks are normally numeric they can be non-numeric UUIDs or other custom values. To reduce
|
|
407
|
-
# load on the search engine, we only retrieve the pk field, which will be checked against the
|
|
408
|
-
# full list obtained from the database, and the id field, which will be used to delete the
|
|
409
|
-
# record should it be found to be stale.
|
|
410
|
-
index_pks = SearchQuerySet(using=backend.connection_alias).models(model)
|
|
411
|
-
index_pks = index_pks.values_list("pk", "id")
|
|
412
|
-
|
|
413
|
-
# We'll collect all of the record IDs which are no longer present in the database and delete
|
|
414
|
-
# them after walking the entire index. This uses more memory than the incremental approach but
|
|
415
|
-
# avoids needing the pagination logic below to account for both commit modes:
|
|
416
|
-
stale_records = set()
|
|
417
|
-
|
|
418
|
-
for start in range(0, index_total, batch_size):
|
|
419
|
-
upper_bound = start + batch_size
|
|
420
|
-
|
|
421
|
-
# If the database pk is no longer present, queue the index key for removal:
|
|
422
|
-
for pk, rec_id in index_pks[start:upper_bound]:
|
|
423
|
-
if smart_bytes(pk) not in database_pks:
|
|
424
|
-
stale_records.add(rec_id)
|
|
425
|
-
|
|
426
|
-
if stale_records:
|
|
427
|
-
if self.verbosity >= 1:
|
|
428
|
-
self.stdout.write(
|
|
429
|
-
" removing %d stale records." % len(stale_records)
|
|
430
|
-
)
|
|
431
|
-
|
|
432
|
-
for rec_id in stale_records:
|
|
433
|
-
# Since the PK was not in the database list, we'll delete the record from the search
|
|
434
|
-
# index:
|
|
435
|
-
if self.verbosity >= 2:
|
|
436
|
-
self.stdout.write(" removing %s." % rec_id)
|
|
437
|
-
|
|
438
|
-
backend.remove(rec_id, commit=self.commit)
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
from ..haystack.query import EmptySearchQuerySet, SearchQuerySet
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class SearchIndexManager:
|
|
5
|
-
def __init__(self, using=None):
|
|
6
|
-
super().__init__()
|
|
7
|
-
self.using = using
|
|
8
|
-
|
|
9
|
-
def get_search_queryset(self):
|
|
10
|
-
"""Returns a new SearchQuerySet object. Subclasses can override this method
|
|
11
|
-
to easily customize the behavior of the Manager.
|
|
12
|
-
"""
|
|
13
|
-
return SearchQuerySet(using=self.using)
|
|
14
|
-
|
|
15
|
-
def get_empty_query_set(self):
|
|
16
|
-
return EmptySearchQuerySet(using=self.using)
|
|
17
|
-
|
|
18
|
-
def all(self): # noqa A003
|
|
19
|
-
return self.get_search_queryset()
|
|
20
|
-
|
|
21
|
-
def none(self):
|
|
22
|
-
return self.get_empty_query_set()
|
|
23
|
-
|
|
24
|
-
def filter(self, *args, **kwargs): # noqa A003
|
|
25
|
-
return self.get_search_queryset().filter(*args, **kwargs)
|
|
26
|
-
|
|
27
|
-
def exclude(self, *args, **kwargs):
|
|
28
|
-
return self.get_search_queryset().exclude(*args, **kwargs)
|
|
29
|
-
|
|
30
|
-
def filter_and(self, *args, **kwargs):
|
|
31
|
-
return self.get_search_queryset().filter_and(*args, **kwargs)
|
|
32
|
-
|
|
33
|
-
def filter_or(self, *args, **kwargs):
|
|
34
|
-
return self.get_search_queryset().filter_or(*args, **kwargs)
|
|
35
|
-
|
|
36
|
-
def order_by(self, *args):
|
|
37
|
-
return self.get_search_queryset().order_by(*args)
|
|
38
|
-
|
|
39
|
-
def highlight(self):
|
|
40
|
-
return self.get_search_queryset().highlight()
|
|
41
|
-
|
|
42
|
-
def boost(self, term, boost):
|
|
43
|
-
return self.get_search_queryset().boost(term, boost)
|
|
44
|
-
|
|
45
|
-
def facet(self, field):
|
|
46
|
-
return self.get_search_queryset().facet(field)
|
|
47
|
-
|
|
48
|
-
def within(self, field, point_1, point_2):
|
|
49
|
-
return self.get_search_queryset().within(field, point_1, point_2)
|
|
50
|
-
|
|
51
|
-
def dwithin(self, field, point, distance):
|
|
52
|
-
return self.get_search_queryset().dwithin(field, point, distance)
|
|
53
|
-
|
|
54
|
-
def distance(self, field, point):
|
|
55
|
-
return self.get_search_queryset().distance(field, point)
|
|
56
|
-
|
|
57
|
-
def date_facet(self, field, start_date, end_date, gap_by, gap_amount=1):
|
|
58
|
-
return self.get_search_queryset().date_facet(
|
|
59
|
-
field, start_date, end_date, gap_by, gap_amount=1
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
def query_facet(self, field, query):
|
|
63
|
-
return self.get_search_queryset().query_facet(field, query)
|
|
64
|
-
|
|
65
|
-
def narrow(self, query):
|
|
66
|
-
return self.get_search_queryset().narrow(query)
|
|
67
|
-
|
|
68
|
-
def raw_search(self, query_string, **kwargs):
|
|
69
|
-
return self.get_search_queryset().raw_search(query_string, **kwargs)
|
|
70
|
-
|
|
71
|
-
def load_all(self):
|
|
72
|
-
return self.get_search_queryset().load_all()
|
|
73
|
-
|
|
74
|
-
def auto_query(self, query_string, fieldname="content"):
|
|
75
|
-
return self.get_search_queryset().auto_query(query_string, fieldname=fieldname)
|
|
76
|
-
|
|
77
|
-
def autocomplete(self, **kwargs):
|
|
78
|
-
return self.get_search_queryset().autocomplete(**kwargs)
|
|
79
|
-
|
|
80
|
-
def using(self, connection_name):
|
|
81
|
-
return self.get_search_queryset().using(connection_name)
|
|
82
|
-
|
|
83
|
-
def count(self):
|
|
84
|
-
return self.get_search_queryset().count()
|
|
85
|
-
|
|
86
|
-
def best_match(self):
|
|
87
|
-
return self.get_search_queryset().best_match()
|
|
88
|
-
|
|
89
|
-
def latest(self, date_field):
|
|
90
|
-
return self.get_search_queryset().latest(date_field)
|
|
91
|
-
|
|
92
|
-
def more_like_this(self, model_instance):
|
|
93
|
-
return self.get_search_queryset().more_like_this(model_instance)
|
|
94
|
-
|
|
95
|
-
def facet_counts(self):
|
|
96
|
-
return self.get_search_queryset().facet_counts()
|
|
97
|
-
|
|
98
|
-
def spelling_suggestion(self, preferred_query=None):
|
|
99
|
-
return self.get_search_queryset().spelling_suggestion(preferred_query=None)
|
|
100
|
-
|
|
101
|
-
def values(self, *fields):
|
|
102
|
-
return self.get_search_queryset().values(*fields)
|
|
103
|
-
|
|
104
|
-
def values_list(self, *fields, **kwargs):
|
|
105
|
-
return self.get_search_queryset().values_list(*fields, **kwargs)
|