codex 1.8.6__py3-none-any.whl → 1.8.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/choices/admin.py +1 -0
- codex/librarian/scribe/importer/const.py +7 -3
- codex/librarian/scribe/importer/create/comics.py +0 -3
- codex/librarian/scribe/importer/delete/comics.py +5 -2
- codex/librarian/scribe/importer/delete/folders.py +2 -1
- codex/librarian/scribe/importer/link/many_to_many.py +1 -0
- codex/librarian/scribe/importer/link/prepare.py +6 -1
- codex/librarian/scribe/importer/query/update_comics.py +22 -12
- codex/librarian/scribe/importer/read/aggregate_path.py +53 -13
- codex/librarian/scribe/importer/read/extract.py +16 -13
- codex/librarian/scribe/importer/search/prepare.py +1 -8
- codex/librarian/scribe/importer/search/sync_m2m.py +2 -1
- codex/librarian/scribe/importer/search/update.py +28 -86
- codex/librarian/scribe/{importer/search → search}/const.py +1 -13
- codex/librarian/scribe/search/prepare.py +162 -0
- codex/librarian/scribe/search/remove.py +22 -2
- codex/librarian/scribe/search/sync.py +47 -134
- codex/migrations/0035_fts_optmize.py +136 -0
- codex/models/comic.py +0 -16
- codex/models/functions.py +3 -1
- codex/serializers/admin/tasks.py +1 -1
- codex/settings/__init__.py +17 -1
- codex/static_root/assets/VCheckbox-BI6iNIZR.0d8e2dbdeb09.js +1 -0
- codex/static_root/assets/VCheckbox-BI6iNIZR.0d8e2dbdeb09.js.br +0 -0
- codex/static_root/assets/VCheckbox-BI6iNIZR.0d8e2dbdeb09.js.gz +0 -0
- codex/static_root/assets/VCheckbox-BI6iNIZR.js +1 -0
- codex/static_root/assets/VCheckbox-BI6iNIZR.js.br +0 -0
- codex/static_root/assets/VCheckbox-BI6iNIZR.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-BzgViWAb.1400a41af9da.js → VCheckboxBtn-D_jRtvPm.7d253b804bed.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-D_jRtvPm.7d253b804bed.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-D_jRtvPm.7d253b804bed.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-BzgViWAb.js → VCheckboxBtn-D_jRtvPm.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-D_jRtvPm.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-D_jRtvPm.js.gz +0 -0
- codex/static_root/assets/VCombobox-lKOmP-Yq.85384eec8906.js +1 -0
- codex/static_root/assets/VCombobox-lKOmP-Yq.85384eec8906.js.br +0 -0
- codex/static_root/assets/VCombobox-lKOmP-Yq.85384eec8906.js.gz +0 -0
- codex/static_root/assets/VCombobox-lKOmP-Yq.js +1 -0
- codex/static_root/assets/VCombobox-lKOmP-Yq.js.br +0 -0
- codex/static_root/assets/VCombobox-lKOmP-Yq.js.gz +0 -0
- codex/static_root/assets/VDialog-DwpHVF2o.f988d86f776c.js +1 -0
- codex/static_root/assets/VDialog-DwpHVF2o.f988d86f776c.js.br +0 -0
- codex/static_root/assets/VDialog-DwpHVF2o.f988d86f776c.js.gz +0 -0
- codex/static_root/assets/VDialog-DwpHVF2o.js +1 -0
- codex/static_root/assets/VDialog-DwpHVF2o.js.br +0 -0
- codex/static_root/assets/VDialog-DwpHVF2o.js.gz +0 -0
- codex/static_root/assets/{VDivider-CSRFyKQO.5f8e1ffafbaf.js → VDivider-CGh9hHPI.8fac42f0d85c.js} +1 -1
- codex/static_root/assets/VDivider-CGh9hHPI.8fac42f0d85c.js.br +0 -0
- codex/static_root/assets/VDivider-CGh9hHPI.8fac42f0d85c.js.gz +0 -0
- codex/static_root/assets/{VDivider-CSRFyKQO.js → VDivider-CGh9hHPI.js} +1 -1
- codex/static_root/assets/VDivider-CGh9hHPI.js.br +0 -0
- codex/static_root/assets/VDivider-CGh9hHPI.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-82Ocr2Kh.1ccaea91f07c.js → VExpansionPanels-DFd72CFw.b232fadc31db.js} +1 -1
- codex/static_root/assets/VExpansionPanels-DFd72CFw.b232fadc31db.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-DFd72CFw.b232fadc31db.js.gz +0 -0
- codex/static_root/assets/{VExpansionPanels-82Ocr2Kh.js → VExpansionPanels-DFd72CFw.js} +1 -1
- codex/static_root/assets/VExpansionPanels-DFd72CFw.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-DFd72CFw.js.gz +0 -0
- codex/static_root/assets/{VForm-BaeKMRS9.be058cf1518f.js → VForm-C7W9kTbJ.02412068f578.js} +1 -1
- codex/static_root/assets/VForm-C7W9kTbJ.02412068f578.js.br +0 -0
- codex/static_root/assets/VForm-C7W9kTbJ.02412068f578.js.gz +0 -0
- codex/static_root/assets/{VForm-BaeKMRS9.js → VForm-C7W9kTbJ.js} +1 -1
- codex/static_root/assets/VForm-C7W9kTbJ.js.br +0 -0
- codex/static_root/assets/VForm-C7W9kTbJ.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-DeB10IRm.4ea874709ffb.js → VRadioGroup-E0wBXF2E.fd8052060d44.js} +1 -1
- codex/static_root/assets/VRadioGroup-E0wBXF2E.fd8052060d44.js.br +0 -0
- codex/static_root/assets/VRadioGroup-E0wBXF2E.fd8052060d44.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-DeB10IRm.js → VRadioGroup-E0wBXF2E.js} +1 -1
- codex/static_root/assets/VRadioGroup-E0wBXF2E.js.br +0 -0
- codex/static_root/assets/VRadioGroup-E0wBXF2E.js.gz +0 -0
- codex/static_root/assets/VSelect-DLKX5Mr6.d84e1c59fa18.js +1 -0
- codex/static_root/assets/VSelect-DLKX5Mr6.d84e1c59fa18.js.br +0 -0
- codex/static_root/assets/VSelect-DLKX5Mr6.d84e1c59fa18.js.gz +0 -0
- codex/static_root/assets/VSelect-DLKX5Mr6.js +1 -0
- codex/static_root/assets/VSelect-DLKX5Mr6.js.br +0 -0
- codex/static_root/assets/VSelect-DLKX5Mr6.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-B8hJUO0p.1dda62fe0677.js +1 -0
- codex/static_root/assets/VSelectionControl-B8hJUO0p.1dda62fe0677.js.br +0 -0
- codex/static_root/assets/VSelectionControl-B8hJUO0p.1dda62fe0677.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-B8hJUO0p.js +1 -0
- codex/static_root/assets/VSelectionControl-B8hJUO0p.js.br +0 -0
- codex/static_root/assets/VSelectionControl-B8hJUO0p.js.gz +0 -0
- codex/static_root/assets/VTable-BsI6FsWH.css +1 -0
- codex/static_root/assets/VTable-BsI6FsWH.css.br +0 -0
- codex/static_root/assets/VTable-BsI6FsWH.css.gz +0 -0
- codex/static_root/assets/VTable-BsI6FsWH.d4c54d44a5ab.css +1 -0
- codex/static_root/assets/VTable-BsI6FsWH.d4c54d44a5ab.css.br +0 -0
- codex/static_root/assets/VTable-BsI6FsWH.d4c54d44a5ab.css.gz +0 -0
- codex/static_root/assets/VTable-D0uqeonL.a9897896b818.js +1 -0
- codex/static_root/assets/VTable-D0uqeonL.a9897896b818.js.br +0 -0
- codex/static_root/assets/VTable-D0uqeonL.a9897896b818.js.gz +0 -0
- codex/static_root/assets/VTable-D0uqeonL.js +1 -0
- codex/static_root/assets/VTable-D0uqeonL.js.br +0 -0
- codex/static_root/assets/VTable-D0uqeonL.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-Dwb7oeu0.6a4505330db3.js → VWindowItem-DnxUM-gG.242f232488e3.js} +1 -1
- codex/static_root/assets/VWindowItem-DnxUM-gG.242f232488e3.js.br +0 -0
- codex/static_root/assets/VWindowItem-DnxUM-gG.242f232488e3.js.gz +0 -0
- codex/static_root/assets/{VWindowItem-Dwb7oeu0.js → VWindowItem-DnxUM-gG.js} +1 -1
- codex/static_root/assets/VWindowItem-DnxUM-gG.js.br +0 -0
- codex/static_root/assets/VWindowItem-DnxUM-gG.js.gz +0 -0
- codex/static_root/assets/VWindowItem-QQWUVqMX.c22e707ac99c.css +1 -0
- codex/static_root/assets/VWindowItem-QQWUVqMX.c22e707ac99c.css.br +5 -0
- codex/static_root/assets/VWindowItem-QQWUVqMX.c22e707ac99c.css.gz +0 -0
- codex/static_root/assets/VWindowItem-QQWUVqMX.css +1 -0
- codex/static_root/assets/VWindowItem-QQWUVqMX.css.br +5 -0
- codex/static_root/assets/VWindowItem-QQWUVqMX.css.gz +0 -0
- codex/static_root/assets/{admin-mQ-F7brp.cc388b064f3a.js → admin-B9U01BEM.7c8747c54803.js} +1 -1
- codex/static_root/assets/admin-B9U01BEM.7c8747c54803.js.br +0 -0
- codex/static_root/assets/admin-B9U01BEM.7c8747c54803.js.gz +0 -0
- codex/static_root/assets/{admin-mQ-F7brp.js → admin-B9U01BEM.js} +1 -1
- codex/static_root/assets/admin-B9U01BEM.js.br +0 -0
- codex/static_root/assets/admin-B9U01BEM.js.gz +0 -0
- codex/static_root/assets/{admin-nYIgbfe8.d2acbae0b198.js → admin-DmYMMUnm.58b7b9f4dadf.js} +1 -1
- codex/static_root/assets/admin-DmYMMUnm.58b7b9f4dadf.js.br +0 -0
- codex/static_root/assets/admin-DmYMMUnm.58b7b9f4dadf.js.gz +0 -0
- codex/static_root/assets/{admin-nYIgbfe8.js → admin-DmYMMUnm.js} +1 -1
- codex/static_root/assets/admin-DmYMMUnm.js.br +0 -0
- codex/static_root/assets/admin-DmYMMUnm.js.gz +0 -0
- codex/static_root/assets/admin-menu-CuNW4Urn.25020f907bb8.js +1 -0
- codex/static_root/assets/admin-menu-CuNW4Urn.25020f907bb8.js.br +0 -0
- codex/static_root/assets/admin-menu-CuNW4Urn.25020f907bb8.js.gz +0 -0
- codex/static_root/assets/admin-menu-CuNW4Urn.js +1 -0
- codex/static_root/assets/admin-menu-CuNW4Urn.js.br +0 -0
- codex/static_root/assets/admin-menu-CuNW4Urn.js.gz +0 -0
- codex/static_root/assets/{admin-settings-button-progress-BBRW69l3.697026d00887.js → admin-settings-button-progress-Bzr-gkG2.b17f5bcba7bb.js} +1 -1
- codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.b17f5bcba7bb.js.br +3 -0
- codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.b17f5bcba7bb.js.gz +0 -0
- codex/static_root/assets/{admin-settings-button-progress-BBRW69l3.js → admin-settings-button-progress-Bzr-gkG2.js} +1 -1
- codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.js.br +3 -0
- codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.js.gz +0 -0
- codex/static_root/assets/browser-CIw7xQ-1.8d16d2b270d5.js +1 -0
- codex/static_root/assets/browser-CIw7xQ-1.8d16d2b270d5.js.br +0 -0
- codex/static_root/assets/browser-CIw7xQ-1.8d16d2b270d5.js.gz +0 -0
- codex/static_root/assets/browser-CIw7xQ-1.js +1 -0
- codex/static_root/assets/browser-CIw7xQ-1.js.br +0 -0
- codex/static_root/assets/browser-CIw7xQ-1.js.gz +0 -0
- codex/static_root/assets/{browser-Cdi7U5ku.bab9fccf0326.css → browser-TRzEFz_k.css} +1 -1
- codex/static_root/assets/browser-TRzEFz_k.css.br +0 -0
- codex/static_root/assets/browser-TRzEFz_k.css.gz +0 -0
- codex/static_root/assets/{browser-Cdi7U5ku.css → browser-TRzEFz_k.e8ae750c4a41.css} +1 -1
- codex/static_root/assets/browser-TRzEFz_k.e8ae750c4a41.css.br +0 -0
- codex/static_root/assets/browser-TRzEFz_k.e8ae750c4a41.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-CXaB7k3y.01788b2cb59e.js +1 -0
- codex/static_root/assets/change-password-dialog-CXaB7k3y.01788b2cb59e.js.br +0 -0
- codex/static_root/assets/change-password-dialog-CXaB7k3y.01788b2cb59e.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-CXaB7k3y.js +1 -0
- codex/static_root/assets/change-password-dialog-CXaB7k3y.js.br +0 -0
- codex/static_root/assets/change-password-dialog-CXaB7k3y.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-uoXMmYq3.0ec4c4eba588.js → confirm-dialog-gXeRF5bD.4ae6e7a9790a.js} +1 -1
- codex/static_root/assets/confirm-dialog-gXeRF5bD.4ae6e7a9790a.js.br +0 -0
- codex/static_root/assets/confirm-dialog-gXeRF5bD.4ae6e7a9790a.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-uoXMmYq3.js → confirm-dialog-gXeRF5bD.js} +1 -1
- codex/static_root/assets/confirm-dialog-gXeRF5bD.js.br +0 -0
- codex/static_root/assets/confirm-dialog-gXeRF5bD.js.gz +0 -0
- codex/static_root/assets/{datetime-column-GkTrMP1-.bf4adfaa4e02.js → datetime-column-C5ZBHxV-.35957e684ec2.js} +1 -1
- codex/static_root/assets/datetime-column-C5ZBHxV-.35957e684ec2.js.br +0 -0
- codex/static_root/assets/datetime-column-C5ZBHxV-.35957e684ec2.js.gz +0 -0
- codex/static_root/assets/{datetime-column-GkTrMP1-.js → datetime-column-C5ZBHxV-.js} +1 -1
- codex/static_root/assets/datetime-column-C5ZBHxV-.js.br +0 -0
- codex/static_root/assets/datetime-column-C5ZBHxV-.js.gz +0 -0
- codex/static_root/assets/{filter-CRnAKgPp.cc654b8f8155.js → filter-CQ83UjMF.7cd979df64da.js} +1 -1
- codex/static_root/assets/filter-CQ83UjMF.7cd979df64da.js.br +0 -0
- codex/static_root/assets/filter-CQ83UjMF.7cd979df64da.js.gz +0 -0
- codex/static_root/assets/{filter-CRnAKgPp.js → filter-CQ83UjMF.js} +1 -1
- codex/static_root/assets/filter-CQ83UjMF.js.br +0 -0
- codex/static_root/assets/filter-CQ83UjMF.js.gz +0 -0
- codex/static_root/assets/{flag-tab-BA4kiUXn.408cc0a71ec1.js → flag-tab-CN3Y0PZS.f5f7122a015e.js} +1 -1
- codex/static_root/assets/flag-tab-CN3Y0PZS.f5f7122a015e.js.br +0 -0
- codex/static_root/assets/flag-tab-CN3Y0PZS.f5f7122a015e.js.gz +0 -0
- codex/static_root/assets/{flag-tab-BA4kiUXn.js → flag-tab-CN3Y0PZS.js} +1 -1
- codex/static_root/assets/flag-tab-CN3Y0PZS.js.br +0 -0
- codex/static_root/assets/flag-tab-CN3Y0PZS.js.gz +0 -0
- codex/static_root/assets/{forwardRefs-B_sUWZn6.css → forwardRefs-C3Z4qL85.48fb131ece85.css} +1 -1
- codex/static_root/assets/forwardRefs-C3Z4qL85.48fb131ece85.css.br +0 -0
- codex/static_root/assets/forwardRefs-C3Z4qL85.48fb131ece85.css.gz +0 -0
- codex/static_root/assets/{forwardRefs-B_sUWZn6.5114f206ca9c.css → forwardRefs-C3Z4qL85.css} +1 -1
- codex/static_root/assets/forwardRefs-C3Z4qL85.css.br +0 -0
- codex/static_root/assets/forwardRefs-C3Z4qL85.css.gz +0 -0
- codex/static_root/assets/forwardRefs-DBxFdh0r.03d9552a8e4c.js +1 -0
- codex/static_root/assets/forwardRefs-DBxFdh0r.03d9552a8e4c.js.br +0 -0
- codex/static_root/assets/forwardRefs-DBxFdh0r.03d9552a8e4c.js.gz +0 -0
- codex/static_root/assets/forwardRefs-DBxFdh0r.js +1 -0
- codex/static_root/assets/forwardRefs-DBxFdh0r.js.br +0 -0
- codex/static_root/assets/forwardRefs-DBxFdh0r.js.gz +0 -0
- codex/static_root/assets/{group-tab-BD9iJZwB.b3e2b1b68d3a.js → group-tab-DMPL6FiK.82f53e5c353a.js} +1 -1
- codex/static_root/assets/group-tab-DMPL6FiK.82f53e5c353a.js.br +0 -0
- codex/static_root/assets/group-tab-DMPL6FiK.82f53e5c353a.js.gz +0 -0
- codex/static_root/assets/{group-tab-BD9iJZwB.js → group-tab-DMPL6FiK.js} +1 -1
- codex/static_root/assets/group-tab-DMPL6FiK.js.br +0 -0
- codex/static_root/assets/group-tab-DMPL6FiK.js.gz +0 -0
- codex/static_root/assets/http-error-DgJ8-SFZ.da2fe4d026ce.js +1 -0
- codex/static_root/assets/http-error-DgJ8-SFZ.da2fe4d026ce.js.br +0 -0
- codex/static_root/assets/http-error-DgJ8-SFZ.da2fe4d026ce.js.gz +0 -0
- codex/static_root/assets/http-error-DgJ8-SFZ.js +1 -0
- codex/static_root/assets/http-error-DgJ8-SFZ.js.br +0 -0
- codex/static_root/assets/http-error-DgJ8-SFZ.js.gz +0 -0
- codex/static_root/assets/{index-DCZ6v5x6.848976e7722c.js → index-CQ0ue0KC.b38e465abad4.js} +1 -1
- codex/static_root/assets/index-CQ0ue0KC.b38e465abad4.js.br +0 -0
- codex/static_root/assets/index-CQ0ue0KC.b38e465abad4.js.gz +0 -0
- codex/static_root/assets/{index-DCZ6v5x6.js → index-CQ0ue0KC.js} +1 -1
- codex/static_root/assets/index-CQ0ue0KC.js.br +0 -0
- codex/static_root/assets/index-CQ0ue0KC.js.gz +0 -0
- codex/static_root/assets/library-tab-CfuZgnol.880ba8bd0149.js +1 -0
- codex/static_root/assets/library-tab-CfuZgnol.880ba8bd0149.js.br +0 -0
- codex/static_root/assets/library-tab-CfuZgnol.880ba8bd0149.js.gz +0 -0
- codex/static_root/assets/library-tab-CfuZgnol.js +1 -0
- codex/static_root/assets/library-tab-CfuZgnol.js.br +0 -0
- codex/static_root/assets/library-tab-CfuZgnol.js.gz +0 -0
- codex/static_root/assets/{main-Bmi4BPiO.d75c8b55081b.js → main-G8n9PNCf.cad6fa53a574.js} +16 -16
- codex/static_root/assets/main-G8n9PNCf.cad6fa53a574.js.br +0 -0
- codex/static_root/assets/main-G8n9PNCf.cad6fa53a574.js.gz +0 -0
- codex/static_root/assets/{main-Bmi4BPiO.js → main-G8n9PNCf.js} +16 -16
- codex/static_root/assets/main-G8n9PNCf.js.br +0 -0
- codex/static_root/assets/main-G8n9PNCf.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-BKZayLN3.4b724ad0595f.js +1 -0
- codex/static_root/assets/pager-full-pdf-BKZayLN3.4b724ad0595f.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-BKZayLN3.4b724ad0595f.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-BKZayLN3.js +1 -0
- codex/static_root/assets/pager-full-pdf-BKZayLN3.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-BKZayLN3.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-0vkF7yjo.d32720f76776.js +1 -0
- codex/static_root/assets/pagination-toolbar-0vkF7yjo.d32720f76776.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-0vkF7yjo.d32720f76776.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-0vkF7yjo.js +1 -0
- codex/static_root/assets/pagination-toolbar-0vkF7yjo.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-0vkF7yjo.js.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-741OafNw.4f9155469274.css → pagination-toolbar-rUdD4-Qi.3a224c7806a5.css} +1 -1
- codex/static_root/assets/pagination-toolbar-rUdD4-Qi.3a224c7806a5.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-rUdD4-Qi.3a224c7806a5.css.gz +0 -0
- codex/static_root/assets/{pagination-toolbar-741OafNw.css → pagination-toolbar-rUdD4-Qi.css} +1 -1
- codex/static_root/assets/pagination-toolbar-rUdD4-Qi.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-rUdD4-Qi.css.gz +0 -0
- codex/static_root/assets/{pdf-doc-DQBmNe4l.8dbdebf30643.js → pdf-doc-CHmFdwy6.4142a4f31d20.js} +1 -1
- codex/static_root/assets/pdf-doc-CHmFdwy6.4142a4f31d20.js.br +0 -0
- codex/static_root/assets/pdf-doc-CHmFdwy6.4142a4f31d20.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-DQBmNe4l.js → pdf-doc-CHmFdwy6.js} +1 -1
- codex/static_root/assets/pdf-doc-CHmFdwy6.js.br +0 -0
- codex/static_root/assets/pdf-doc-CHmFdwy6.js.gz +0 -0
- codex/static_root/assets/reader-YIWmNjj6.c96fc7891aec.js +2 -0
- codex/static_root/assets/reader-YIWmNjj6.c96fc7891aec.js.br +0 -0
- codex/static_root/assets/reader-YIWmNjj6.c96fc7891aec.js.gz +0 -0
- codex/static_root/assets/reader-YIWmNjj6.js +2 -0
- codex/static_root/assets/reader-YIWmNjj6.js.br +0 -0
- codex/static_root/assets/reader-YIWmNjj6.js.gz +0 -0
- codex/static_root/assets/{relation-chips-CcFgPQOM.0b468249b62e.css → relation-chips-CpiT_4k-.b72d78f512e6.css} +1 -1
- codex/static_root/assets/relation-chips-CpiT_4k-.b72d78f512e6.css.br +0 -0
- codex/static_root/assets/relation-chips-CpiT_4k-.b72d78f512e6.css.gz +0 -0
- codex/static_root/assets/{relation-chips-CcFgPQOM.css → relation-chips-CpiT_4k-.css} +1 -1
- codex/static_root/assets/relation-chips-CpiT_4k-.css.br +0 -0
- codex/static_root/assets/relation-chips-CpiT_4k-.css.gz +0 -0
- codex/static_root/assets/relation-chips-DzoiGrOj.95f663c6c18d.js +1 -0
- codex/static_root/assets/relation-chips-DzoiGrOj.95f663c6c18d.js.br +0 -0
- codex/static_root/assets/relation-chips-DzoiGrOj.95f663c6c18d.js.gz +0 -0
- codex/static_root/assets/relation-chips-DzoiGrOj.js +1 -0
- codex/static_root/assets/relation-chips-DzoiGrOj.js.br +0 -0
- codex/static_root/assets/relation-chips-DzoiGrOj.js.gz +0 -0
- codex/static_root/assets/settings-drawer-CUC-r4sg.e019f5467d25.js +2 -0
- codex/static_root/assets/settings-drawer-CUC-r4sg.e019f5467d25.js.br +0 -0
- codex/static_root/assets/settings-drawer-CUC-r4sg.e019f5467d25.js.gz +0 -0
- codex/static_root/assets/settings-drawer-CUC-r4sg.js +2 -0
- codex/static_root/assets/settings-drawer-CUC-r4sg.js.br +0 -0
- codex/static_root/assets/settings-drawer-CUC-r4sg.js.gz +0 -0
- codex/static_root/assets/{ssrBoot-B6P0M2z2.38ab2f4bde57.js → ssrBoot-D7foQ-7h.31c07ef6f646.js} +1 -1
- codex/static_root/assets/ssrBoot-D7foQ-7h.31c07ef6f646.js.br +0 -0
- codex/static_root/assets/ssrBoot-D7foQ-7h.31c07ef6f646.js.gz +0 -0
- codex/static_root/assets/{ssrBoot-B6P0M2z2.js → ssrBoot-D7foQ-7h.js} +1 -1
- codex/static_root/assets/ssrBoot-D7foQ-7h.js.br +0 -0
- codex/static_root/assets/ssrBoot-D7foQ-7h.js.gz +0 -0
- codex/static_root/assets/{stats-tab-C5m62fu3.8482d96809e9.js → stats-tab-BSy-9tZm.2a7560872f5c.js} +1 -1
- codex/static_root/assets/stats-tab-BSy-9tZm.2a7560872f5c.js.br +0 -0
- codex/static_root/assets/stats-tab-BSy-9tZm.2a7560872f5c.js.gz +0 -0
- codex/static_root/assets/{stats-tab-C5m62fu3.js → stats-tab-BSy-9tZm.js} +1 -1
- codex/static_root/assets/stats-tab-BSy-9tZm.js.br +0 -0
- codex/static_root/assets/stats-tab-BSy-9tZm.js.gz +0 -0
- codex/static_root/assets/task-tab-Sp49fYRT.3a1aab3f3716.js +1 -0
- codex/static_root/assets/task-tab-Sp49fYRT.3a1aab3f3716.js.br +0 -0
- codex/static_root/assets/task-tab-Sp49fYRT.3a1aab3f3716.js.gz +0 -0
- codex/static_root/assets/task-tab-Sp49fYRT.js +1 -0
- codex/static_root/assets/task-tab-Sp49fYRT.js.br +0 -0
- codex/static_root/assets/task-tab-Sp49fYRT.js.gz +0 -0
- codex/static_root/assets/{unauthorized-DXoWE_v2.19c70a140f9b.js → unauthorized-BM6KzvCy.4c114d9693c1.js} +1 -1
- codex/static_root/assets/unauthorized-BM6KzvCy.4c114d9693c1.js.br +0 -0
- codex/static_root/assets/unauthorized-BM6KzvCy.4c114d9693c1.js.gz +0 -0
- codex/static_root/assets/{unauthorized-DXoWE_v2.js → unauthorized-BM6KzvCy.js} +1 -1
- codex/static_root/assets/unauthorized-BM6KzvCy.js.br +0 -0
- codex/static_root/assets/unauthorized-BM6KzvCy.js.gz +0 -0
- codex/static_root/assets/user-tab-yQ60jtVd.ad593cc6e6ea.js +1 -0
- codex/static_root/assets/user-tab-yQ60jtVd.ad593cc6e6ea.js.br +0 -0
- codex/static_root/assets/user-tab-yQ60jtVd.ad593cc6e6ea.js.gz +0 -0
- codex/static_root/assets/user-tab-yQ60jtVd.js +1 -0
- codex/static_root/assets/user-tab-yQ60jtVd.js.br +0 -0
- codex/static_root/assets/user-tab-yQ60jtVd.js.gz +0 -0
- codex/static_root/{manifest.db295ed1ca03.json → manifest.a059c4dc5443.json} +308 -308
- codex/static_root/manifest.a059c4dc5443.json.br +0 -0
- codex/static_root/manifest.a059c4dc5443.json.gz +0 -0
- codex/static_root/manifest.json +308 -308
- codex/static_root/manifest.json.br +0 -0
- codex/static_root/manifest.json.gz +0 -0
- codex/static_root/staticfiles.json +1 -1
- codex/views/browser/filters/filter.py +1 -1
- codex/views/browser/filters/search/field/column.py +3 -3
- codex/views/browser/filters/search/parse.py +15 -10
- {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/METADATA +5 -5
- {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/RECORD +307 -305
- codex/static_root/assets/VCheckbox--IZv20K5.121e571f623b.js +0 -1
- codex/static_root/assets/VCheckbox--IZv20K5.121e571f623b.js.br +0 -0
- codex/static_root/assets/VCheckbox--IZv20K5.121e571f623b.js.gz +0 -0
- codex/static_root/assets/VCheckbox--IZv20K5.js +0 -1
- codex/static_root/assets/VCheckbox--IZv20K5.js.br +0 -0
- codex/static_root/assets/VCheckbox--IZv20K5.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-BzgViWAb.1400a41af9da.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-BzgViWAb.1400a41af9da.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-BzgViWAb.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-BzgViWAb.js.gz +0 -0
- codex/static_root/assets/VCombobox-0VKjtXTP.f7c9bb8e7f77.js +0 -1
- codex/static_root/assets/VCombobox-0VKjtXTP.f7c9bb8e7f77.js.br +0 -0
- codex/static_root/assets/VCombobox-0VKjtXTP.f7c9bb8e7f77.js.gz +0 -0
- codex/static_root/assets/VCombobox-0VKjtXTP.js +0 -1
- codex/static_root/assets/VCombobox-0VKjtXTP.js.br +0 -0
- codex/static_root/assets/VCombobox-0VKjtXTP.js.gz +0 -0
- codex/static_root/assets/VDialog-Oz6-kM3S.2244675141c7.js +0 -1
- codex/static_root/assets/VDialog-Oz6-kM3S.2244675141c7.js.br +0 -0
- codex/static_root/assets/VDialog-Oz6-kM3S.2244675141c7.js.gz +0 -0
- codex/static_root/assets/VDialog-Oz6-kM3S.js +0 -1
- codex/static_root/assets/VDialog-Oz6-kM3S.js.br +0 -0
- codex/static_root/assets/VDialog-Oz6-kM3S.js.gz +0 -0
- codex/static_root/assets/VDivider-CSRFyKQO.5f8e1ffafbaf.js.br +0 -0
- codex/static_root/assets/VDivider-CSRFyKQO.5f8e1ffafbaf.js.gz +0 -0
- codex/static_root/assets/VDivider-CSRFyKQO.js.br +0 -0
- codex/static_root/assets/VDivider-CSRFyKQO.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-82Ocr2Kh.1ccaea91f07c.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-82Ocr2Kh.1ccaea91f07c.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-82Ocr2Kh.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-82Ocr2Kh.js.gz +0 -0
- codex/static_root/assets/VForm-BaeKMRS9.be058cf1518f.js.br +0 -0
- codex/static_root/assets/VForm-BaeKMRS9.be058cf1518f.js.gz +0 -0
- codex/static_root/assets/VForm-BaeKMRS9.js.br +0 -0
- codex/static_root/assets/VForm-BaeKMRS9.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-DeB10IRm.4ea874709ffb.js.br +0 -0
- codex/static_root/assets/VRadioGroup-DeB10IRm.4ea874709ffb.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-DeB10IRm.js.br +0 -0
- codex/static_root/assets/VRadioGroup-DeB10IRm.js.gz +0 -0
- codex/static_root/assets/VSelect-4ozzBEef.36f749b6f4ab.js +0 -1
- codex/static_root/assets/VSelect-4ozzBEef.36f749b6f4ab.js.br +0 -0
- codex/static_root/assets/VSelect-4ozzBEef.36f749b6f4ab.js.gz +0 -0
- codex/static_root/assets/VSelect-4ozzBEef.js +0 -1
- codex/static_root/assets/VSelect-4ozzBEef.js.br +0 -0
- codex/static_root/assets/VSelect-4ozzBEef.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-D3h7FjSM.6cf4ba197995.js +0 -1
- codex/static_root/assets/VSelectionControl-D3h7FjSM.6cf4ba197995.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D3h7FjSM.6cf4ba197995.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-D3h7FjSM.js +0 -1
- codex/static_root/assets/VSelectionControl-D3h7FjSM.js.br +0 -0
- codex/static_root/assets/VSelectionControl-D3h7FjSM.js.gz +0 -0
- codex/static_root/assets/VTable-CQyv0wyO.1740239d481b.css +0 -1
- codex/static_root/assets/VTable-CQyv0wyO.1740239d481b.css.br +0 -0
- codex/static_root/assets/VTable-CQyv0wyO.1740239d481b.css.gz +0 -0
- codex/static_root/assets/VTable-CQyv0wyO.css +0 -1
- codex/static_root/assets/VTable-CQyv0wyO.css.br +0 -0
- codex/static_root/assets/VTable-CQyv0wyO.css.gz +0 -0
- codex/static_root/assets/VTable-Dj5EC5Aq.7abc9daf78be.js +0 -1
- codex/static_root/assets/VTable-Dj5EC5Aq.7abc9daf78be.js.br +0 -0
- codex/static_root/assets/VTable-Dj5EC5Aq.7abc9daf78be.js.gz +0 -0
- codex/static_root/assets/VTable-Dj5EC5Aq.js +0 -1
- codex/static_root/assets/VTable-Dj5EC5Aq.js.br +0 -0
- codex/static_root/assets/VTable-Dj5EC5Aq.js.gz +0 -0
- codex/static_root/assets/VWindowItem-ChYLiXSE.a9c679a2977e.css +0 -1
- codex/static_root/assets/VWindowItem-ChYLiXSE.a9c679a2977e.css.br +0 -0
- codex/static_root/assets/VWindowItem-ChYLiXSE.a9c679a2977e.css.gz +0 -0
- codex/static_root/assets/VWindowItem-ChYLiXSE.css +0 -1
- codex/static_root/assets/VWindowItem-ChYLiXSE.css.br +0 -0
- codex/static_root/assets/VWindowItem-ChYLiXSE.css.gz +0 -0
- codex/static_root/assets/VWindowItem-Dwb7oeu0.6a4505330db3.js.br +0 -0
- codex/static_root/assets/VWindowItem-Dwb7oeu0.6a4505330db3.js.gz +0 -0
- codex/static_root/assets/VWindowItem-Dwb7oeu0.js.br +0 -0
- codex/static_root/assets/VWindowItem-Dwb7oeu0.js.gz +0 -0
- codex/static_root/assets/admin-mQ-F7brp.cc388b064f3a.js.br +0 -0
- codex/static_root/assets/admin-mQ-F7brp.cc388b064f3a.js.gz +0 -0
- codex/static_root/assets/admin-mQ-F7brp.js.br +0 -0
- codex/static_root/assets/admin-mQ-F7brp.js.gz +0 -0
- codex/static_root/assets/admin-menu-CfGPKhvz.1e224da855f5.js +0 -1
- codex/static_root/assets/admin-menu-CfGPKhvz.1e224da855f5.js.br +0 -0
- codex/static_root/assets/admin-menu-CfGPKhvz.1e224da855f5.js.gz +0 -0
- codex/static_root/assets/admin-menu-CfGPKhvz.js +0 -1
- codex/static_root/assets/admin-menu-CfGPKhvz.js.br +0 -0
- codex/static_root/assets/admin-menu-CfGPKhvz.js.gz +0 -0
- codex/static_root/assets/admin-nYIgbfe8.d2acbae0b198.js.br +0 -0
- codex/static_root/assets/admin-nYIgbfe8.d2acbae0b198.js.gz +0 -0
- codex/static_root/assets/admin-nYIgbfe8.js.br +0 -0
- codex/static_root/assets/admin-nYIgbfe8.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-BBRW69l3.697026d00887.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-BBRW69l3.697026d00887.js.gz +0 -0
- codex/static_root/assets/admin-settings-button-progress-BBRW69l3.js.br +0 -0
- codex/static_root/assets/admin-settings-button-progress-BBRW69l3.js.gz +0 -0
- codex/static_root/assets/browser-BzV_-1Jg.e39184a92bab.js +0 -1
- codex/static_root/assets/browser-BzV_-1Jg.e39184a92bab.js.br +0 -0
- codex/static_root/assets/browser-BzV_-1Jg.e39184a92bab.js.gz +0 -0
- codex/static_root/assets/browser-BzV_-1Jg.js +0 -1
- codex/static_root/assets/browser-BzV_-1Jg.js.br +0 -0
- codex/static_root/assets/browser-BzV_-1Jg.js.gz +0 -0
- codex/static_root/assets/browser-Cdi7U5ku.bab9fccf0326.css.br +0 -0
- codex/static_root/assets/browser-Cdi7U5ku.bab9fccf0326.css.gz +0 -0
- codex/static_root/assets/browser-Cdi7U5ku.css.br +0 -0
- codex/static_root/assets/browser-Cdi7U5ku.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-DpqXgZ53.3f22c3114669.js +0 -1
- codex/static_root/assets/change-password-dialog-DpqXgZ53.3f22c3114669.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DpqXgZ53.3f22c3114669.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-DpqXgZ53.js +0 -1
- codex/static_root/assets/change-password-dialog-DpqXgZ53.js.br +0 -0
- codex/static_root/assets/change-password-dialog-DpqXgZ53.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-uoXMmYq3.0ec4c4eba588.js.br +0 -0
- codex/static_root/assets/confirm-dialog-uoXMmYq3.0ec4c4eba588.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-uoXMmYq3.js.br +0 -0
- codex/static_root/assets/confirm-dialog-uoXMmYq3.js.gz +0 -0
- codex/static_root/assets/datetime-column-GkTrMP1-.bf4adfaa4e02.js.br +0 -0
- codex/static_root/assets/datetime-column-GkTrMP1-.bf4adfaa4e02.js.gz +0 -0
- codex/static_root/assets/datetime-column-GkTrMP1-.js.br +0 -0
- codex/static_root/assets/datetime-column-GkTrMP1-.js.gz +0 -0
- codex/static_root/assets/filter-CRnAKgPp.cc654b8f8155.js.br +0 -0
- codex/static_root/assets/filter-CRnAKgPp.cc654b8f8155.js.gz +0 -0
- codex/static_root/assets/filter-CRnAKgPp.js.br +0 -0
- codex/static_root/assets/filter-CRnAKgPp.js.gz +0 -0
- codex/static_root/assets/flag-tab-BA4kiUXn.408cc0a71ec1.js.br +0 -0
- codex/static_root/assets/flag-tab-BA4kiUXn.408cc0a71ec1.js.gz +0 -0
- codex/static_root/assets/flag-tab-BA4kiUXn.js.br +0 -0
- codex/static_root/assets/flag-tab-BA4kiUXn.js.gz +0 -0
- codex/static_root/assets/forwardRefs-B_sUWZn6.5114f206ca9c.css.br +0 -0
- codex/static_root/assets/forwardRefs-B_sUWZn6.5114f206ca9c.css.gz +0 -0
- codex/static_root/assets/forwardRefs-B_sUWZn6.css.br +0 -0
- codex/static_root/assets/forwardRefs-B_sUWZn6.css.gz +0 -0
- codex/static_root/assets/forwardRefs-FxOC1qa_.6e14881eedf1.js +0 -1
- codex/static_root/assets/forwardRefs-FxOC1qa_.6e14881eedf1.js.br +0 -0
- codex/static_root/assets/forwardRefs-FxOC1qa_.6e14881eedf1.js.gz +0 -0
- codex/static_root/assets/forwardRefs-FxOC1qa_.js +0 -1
- codex/static_root/assets/forwardRefs-FxOC1qa_.js.br +0 -0
- codex/static_root/assets/forwardRefs-FxOC1qa_.js.gz +0 -0
- codex/static_root/assets/group-tab-BD9iJZwB.b3e2b1b68d3a.js.br +0 -0
- codex/static_root/assets/group-tab-BD9iJZwB.b3e2b1b68d3a.js.gz +0 -0
- codex/static_root/assets/group-tab-BD9iJZwB.js.br +0 -0
- codex/static_root/assets/group-tab-BD9iJZwB.js.gz +0 -0
- codex/static_root/assets/http-error-D-b5OfHC.e661fa6e0000.js +0 -1
- codex/static_root/assets/http-error-D-b5OfHC.e661fa6e0000.js.br +0 -2
- codex/static_root/assets/http-error-D-b5OfHC.e661fa6e0000.js.gz +0 -0
- codex/static_root/assets/http-error-D-b5OfHC.js +0 -1
- codex/static_root/assets/http-error-D-b5OfHC.js.br +0 -2
- codex/static_root/assets/http-error-D-b5OfHC.js.gz +0 -0
- codex/static_root/assets/index-DCZ6v5x6.848976e7722c.js.br +0 -0
- codex/static_root/assets/index-DCZ6v5x6.848976e7722c.js.gz +0 -0
- codex/static_root/assets/index-DCZ6v5x6.js.br +0 -0
- codex/static_root/assets/index-DCZ6v5x6.js.gz +0 -0
- codex/static_root/assets/library-tab-ju4WtRth.97949bf344d7.js +0 -1
- codex/static_root/assets/library-tab-ju4WtRth.97949bf344d7.js.br +0 -0
- codex/static_root/assets/library-tab-ju4WtRth.97949bf344d7.js.gz +0 -0
- codex/static_root/assets/library-tab-ju4WtRth.js +0 -1
- codex/static_root/assets/library-tab-ju4WtRth.js.br +0 -0
- codex/static_root/assets/library-tab-ju4WtRth.js.gz +0 -0
- codex/static_root/assets/main-Bmi4BPiO.d75c8b55081b.js.br +0 -0
- codex/static_root/assets/main-Bmi4BPiO.d75c8b55081b.js.gz +0 -0
- codex/static_root/assets/main-Bmi4BPiO.js.br +0 -0
- codex/static_root/assets/main-Bmi4BPiO.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-BjSr3CzH.ffbe3d735455.js +0 -1
- codex/static_root/assets/pager-full-pdf-BjSr3CzH.ffbe3d735455.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-BjSr3CzH.ffbe3d735455.js.gz +0 -0
- codex/static_root/assets/pager-full-pdf-BjSr3CzH.js +0 -1
- codex/static_root/assets/pager-full-pdf-BjSr3CzH.js.br +0 -0
- codex/static_root/assets/pager-full-pdf-BjSr3CzH.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-741OafNw.4f9155469274.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-741OafNw.4f9155469274.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-741OafNw.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-741OafNw.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-DpMVSiz_.86ce692ff9b4.js +0 -1
- codex/static_root/assets/pagination-toolbar-DpMVSiz_.86ce692ff9b4.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-DpMVSiz_.86ce692ff9b4.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-DpMVSiz_.js +0 -1
- codex/static_root/assets/pagination-toolbar-DpMVSiz_.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-DpMVSiz_.js.gz +0 -0
- codex/static_root/assets/pdf-doc-DQBmNe4l.8dbdebf30643.js.br +0 -0
- codex/static_root/assets/pdf-doc-DQBmNe4l.8dbdebf30643.js.gz +0 -0
- codex/static_root/assets/pdf-doc-DQBmNe4l.js.br +0 -0
- codex/static_root/assets/pdf-doc-DQBmNe4l.js.gz +0 -0
- codex/static_root/assets/reader-BQVYc_LF.e327430a14a1.js +0 -2
- codex/static_root/assets/reader-BQVYc_LF.e327430a14a1.js.br +0 -0
- codex/static_root/assets/reader-BQVYc_LF.e327430a14a1.js.gz +0 -0
- codex/static_root/assets/reader-BQVYc_LF.js +0 -2
- codex/static_root/assets/reader-BQVYc_LF.js.br +0 -0
- codex/static_root/assets/reader-BQVYc_LF.js.gz +0 -0
- codex/static_root/assets/relation-chips-CcFgPQOM.0b468249b62e.css.br +0 -0
- codex/static_root/assets/relation-chips-CcFgPQOM.0b468249b62e.css.gz +0 -0
- codex/static_root/assets/relation-chips-CcFgPQOM.css.br +0 -0
- codex/static_root/assets/relation-chips-CcFgPQOM.css.gz +0 -0
- codex/static_root/assets/relation-chips-TRmABTTI.918cb21596f9.js +0 -1
- codex/static_root/assets/relation-chips-TRmABTTI.918cb21596f9.js.br +0 -0
- codex/static_root/assets/relation-chips-TRmABTTI.918cb21596f9.js.gz +0 -0
- codex/static_root/assets/relation-chips-TRmABTTI.js +0 -1
- codex/static_root/assets/relation-chips-TRmABTTI.js.br +0 -0
- codex/static_root/assets/relation-chips-TRmABTTI.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BoAnrKCI.46b6a030c81f.js +0 -2
- codex/static_root/assets/settings-drawer-BoAnrKCI.46b6a030c81f.js.br +0 -0
- codex/static_root/assets/settings-drawer-BoAnrKCI.46b6a030c81f.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BoAnrKCI.js +0 -2
- codex/static_root/assets/settings-drawer-BoAnrKCI.js.br +0 -0
- codex/static_root/assets/settings-drawer-BoAnrKCI.js.gz +0 -0
- codex/static_root/assets/ssrBoot-B6P0M2z2.38ab2f4bde57.js.br +0 -0
- codex/static_root/assets/ssrBoot-B6P0M2z2.38ab2f4bde57.js.gz +0 -0
- codex/static_root/assets/ssrBoot-B6P0M2z2.js.br +0 -0
- codex/static_root/assets/ssrBoot-B6P0M2z2.js.gz +0 -0
- codex/static_root/assets/stats-tab-C5m62fu3.8482d96809e9.js.br +0 -0
- codex/static_root/assets/stats-tab-C5m62fu3.8482d96809e9.js.gz +0 -0
- codex/static_root/assets/stats-tab-C5m62fu3.js.br +0 -0
- codex/static_root/assets/stats-tab-C5m62fu3.js.gz +0 -0
- codex/static_root/assets/task-tab-B3WOGyYT.508fce185a28.js +0 -1
- codex/static_root/assets/task-tab-B3WOGyYT.508fce185a28.js.br +0 -0
- codex/static_root/assets/task-tab-B3WOGyYT.508fce185a28.js.gz +0 -0
- codex/static_root/assets/task-tab-B3WOGyYT.js +0 -1
- codex/static_root/assets/task-tab-B3WOGyYT.js.br +0 -0
- codex/static_root/assets/task-tab-B3WOGyYT.js.gz +0 -0
- codex/static_root/assets/unauthorized-DXoWE_v2.19c70a140f9b.js.br +0 -0
- codex/static_root/assets/unauthorized-DXoWE_v2.19c70a140f9b.js.gz +0 -0
- codex/static_root/assets/unauthorized-DXoWE_v2.js.br +0 -0
- codex/static_root/assets/unauthorized-DXoWE_v2.js.gz +0 -0
- codex/static_root/assets/user-tab-DhsQxTkZ.8a8167f9f2c4.js +0 -1
- codex/static_root/assets/user-tab-DhsQxTkZ.8a8167f9f2c4.js.br +0 -0
- codex/static_root/assets/user-tab-DhsQxTkZ.8a8167f9f2c4.js.gz +0 -0
- codex/static_root/assets/user-tab-DhsQxTkZ.js +0 -1
- codex/static_root/assets/user-tab-DhsQxTkZ.js.br +0 -0
- codex/static_root/assets/user-tab-DhsQxTkZ.js.gz +0 -0
- codex/static_root/manifest.db295ed1ca03.json.br +0 -0
- codex/static_root/manifest.db295ed1ca03.json.gz +0 -0
- {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/WHEEL +0 -0
- {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/entry_points.txt +0 -0
- {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/licenses/LICENSE +0 -0
codex/choices/admin.py
CHANGED
|
@@ -109,6 +109,7 @@ ADMIN_TASK_GROUPS: MappingProxyType[
|
|
|
109
109
|
"value": "search_index_clear",
|
|
110
110
|
"title": "Clear Search Index",
|
|
111
111
|
"desc": "of all entries",
|
|
112
|
+
"confirm": "Are you sure? Resyncing the search index can take a while.",
|
|
112
113
|
},
|
|
113
114
|
{
|
|
114
115
|
"value": "db_fts_integrity_check",
|
|
@@ -52,24 +52,29 @@ PARENT_FOLDER_FIELD_NAME = "parent_folder"
|
|
|
52
52
|
VOLUME_COUNT_FIELD_NAME = "volume_count"
|
|
53
53
|
ISSUE_COUNT_FIELD_NAME = "issue_count"
|
|
54
54
|
PATH_FIELD_NAME = "path"
|
|
55
|
+
IDENTIFIERS_FIELD_NAME = "identifiers"
|
|
55
56
|
NON_FTS_FIELDS = frozenset(
|
|
56
57
|
{
|
|
57
58
|
# Attributes
|
|
58
59
|
"critical_rating",
|
|
59
60
|
"day",
|
|
61
|
+
"file_type",
|
|
62
|
+
"issue_number",
|
|
63
|
+
"issue_suffix",
|
|
60
64
|
"metadata_mtime",
|
|
61
65
|
"monochrome",
|
|
62
66
|
"month",
|
|
67
|
+
"notes",
|
|
63
68
|
"page_count",
|
|
64
69
|
"path",
|
|
70
|
+
"reading_direction",
|
|
65
71
|
"year",
|
|
66
|
-
"issue_number",
|
|
67
|
-
"issue_suffix",
|
|
68
72
|
# FKs
|
|
69
73
|
PARENT_FOLDER_FIELD_NAME,
|
|
70
74
|
VOLUME_FIELD_NAME,
|
|
71
75
|
# M2Ms
|
|
72
76
|
FOLDERS_FIELD_NAME,
|
|
77
|
+
IDENTIFIERS_FIELD_NAME,
|
|
73
78
|
}
|
|
74
79
|
)
|
|
75
80
|
|
|
@@ -127,7 +132,6 @@ CREDIT_ROLE_FIELD_NAME = "role"
|
|
|
127
132
|
STORY_ARC_NUMBERS_FIELD_NAME = "story_arc_numbers"
|
|
128
133
|
STORY_ARC_FIELD_NAME = "story_arc"
|
|
129
134
|
NUMBER_FIELD_NAME = "number"
|
|
130
|
-
IDENTIFIERS_FIELD_NAME = "identifiers"
|
|
131
135
|
IDENTIFIER_SOURCE_FIELD_NAME = "source"
|
|
132
136
|
IDENTIFIER_TYPE_FIELD_NAME = "id_type"
|
|
133
137
|
IDENTIFIER_ID_KEY_FIELD_NAME = "key"
|
|
@@ -34,9 +34,6 @@ class CreateComicsImporter(CreateForeignKeyLinksImporter):
|
|
|
34
34
|
if field_name not in NON_FTS_FIELDS:
|
|
35
35
|
self.metadata[key][sub_key][field_name] = (value,)
|
|
36
36
|
|
|
37
|
-
issue = (str(md.get("issue_number", "")) + md.get("issue_suffix", ""),)
|
|
38
|
-
self.metadata[key][sub_key]["issue"] = issue
|
|
39
|
-
|
|
40
37
|
def _update_comic_values(self, comic: Comic, update_comics: list, comic_pks: list):
|
|
41
38
|
md = self.metadata[UPDATE_COMICS].pop(comic.pk, {})
|
|
42
39
|
for field_name, value in md.items():
|
|
@@ -47,10 +47,12 @@ class DeletedComicsImporter(DeletedCoversImporter):
|
|
|
47
47
|
|
|
48
48
|
def bulk_comics_deleted(self, **kwargs) -> tuple[int, dict]:
|
|
49
49
|
"""Bulk delete comics found missing from the filesystem."""
|
|
50
|
+
count = 0
|
|
51
|
+
deleted_comic_groups = {}
|
|
50
52
|
status = ImporterRemoveComicsStatus(0, len(self.task.files_deleted))
|
|
51
53
|
try:
|
|
52
54
|
if not self.task.files_deleted:
|
|
53
|
-
return
|
|
55
|
+
return count, deleted_comic_groups
|
|
54
56
|
self.status_controller.start(status)
|
|
55
57
|
delete_qs = Comic.objects.filter(
|
|
56
58
|
library=self.library, path__in=self.task.files_deleted
|
|
@@ -60,7 +62,8 @@ class DeletedComicsImporter(DeletedCoversImporter):
|
|
|
60
62
|
deleted_comic_groups = self._populate_deleted_comic_groups(delete_qs)
|
|
61
63
|
|
|
62
64
|
delete_comic_pks = frozenset(delete_qs.values_list("pk", flat=True))
|
|
63
|
-
|
|
65
|
+
delete_qs.delete()
|
|
66
|
+
count = len(delete_comic_pks)
|
|
64
67
|
|
|
65
68
|
self.remove_covers(delete_comic_pks, custom=False)
|
|
66
69
|
finally:
|
|
@@ -25,7 +25,8 @@ class DeletedFoldersImporter(DeletedComicsImporter):
|
|
|
25
25
|
.distinct()
|
|
26
26
|
.values_list("pk", flat=True)
|
|
27
27
|
)
|
|
28
|
-
|
|
28
|
+
folders.delete()
|
|
29
|
+
count = len(delete_comic_pks)
|
|
29
30
|
|
|
30
31
|
self.remove_covers(delete_comic_pks, custom=False)
|
|
31
32
|
finally:
|
|
@@ -11,6 +11,7 @@ from codex.librarian.scribe.importer.const import (
|
|
|
11
11
|
FTS_CREATED_M2MS,
|
|
12
12
|
IDENTIFIERS_FIELD_NAME,
|
|
13
13
|
LINK_M2MS,
|
|
14
|
+
NON_FTS_FIELDS,
|
|
14
15
|
)
|
|
15
16
|
from codex.librarian.scribe.importer.link.const import COMPLEX_MODEL_FIELD_NAMES
|
|
16
17
|
from codex.librarian.scribe.importer.link.covers import (
|
|
@@ -47,9 +48,13 @@ class LinkComicsImporterPrepare(LinkCoversImporter):
|
|
|
47
48
|
):
|
|
48
49
|
if field_name == IDENTIFIERS_FIELD_NAME:
|
|
49
50
|
# sources extracton must come before identifiers is minified
|
|
50
|
-
|
|
51
|
+
# but now identifiers is not indexed at all, yet sources are.
|
|
52
|
+
sources = tuple(sorted({subvalues[0] for subvalues in values}))
|
|
51
53
|
self.add_links_to_fts(comic_pk, "sources", sources)
|
|
52
54
|
|
|
55
|
+
if field_name in NON_FTS_FIELDS:
|
|
56
|
+
return
|
|
57
|
+
|
|
53
58
|
field_name, fts_values = self.minify_complex_link_to_fts_tuple(
|
|
54
59
|
field_name, values
|
|
55
60
|
)
|
|
@@ -13,12 +13,31 @@ from codex.librarian.scribe.importer.statii.create import (
|
|
|
13
13
|
ImporterUpdateComicsStatus,
|
|
14
14
|
)
|
|
15
15
|
from codex.librarian.scribe.importer.statii.query import ImporterQueryComicUpdatesStatus
|
|
16
|
+
from codex.librarian.status import Status
|
|
16
17
|
from codex.models import Comic
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
class QueryUpdateComics(QueryForeignKeysQueryImporter):
|
|
20
21
|
"""Move comics that need only updating into correct structure."""
|
|
21
22
|
|
|
23
|
+
def _query_update_comic(self, comic: Comic, status: Status):
|
|
24
|
+
"""Query for update one comic."""
|
|
25
|
+
proposed_comic_dict = self.metadata[CREATE_COMICS].pop(comic.path, None)
|
|
26
|
+
if not proposed_comic_dict:
|
|
27
|
+
self.log.warning(
|
|
28
|
+
f"{comic.path} can be updated, but the update metadata was not found."
|
|
29
|
+
)
|
|
30
|
+
return
|
|
31
|
+
update_comic_dict = {
|
|
32
|
+
key: value
|
|
33
|
+
for key, value in proposed_comic_dict.items()
|
|
34
|
+
if getattr(comic, key) != value
|
|
35
|
+
}
|
|
36
|
+
# Update even if update_comic_dict is empty to set stat
|
|
37
|
+
self.metadata[UPDATE_COMICS][comic.pk] = update_comic_dict
|
|
38
|
+
status.increment_complete()
|
|
39
|
+
self.status_controller.update(status)
|
|
40
|
+
|
|
22
41
|
def query_update_comics(self):
|
|
23
42
|
"""Pop existing comics from create & move to update if needed."""
|
|
24
43
|
paths = tuple(self.metadata[CREATE_COMICS].keys())
|
|
@@ -34,18 +53,9 @@ class QueryUpdateComics(QueryForeignKeysQueryImporter):
|
|
|
34
53
|
status.increment_complete(len(paths) - comics.count())
|
|
35
54
|
|
|
36
55
|
for comic in comics:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
update_comic_dict = {
|
|
41
|
-
key: value
|
|
42
|
-
for key, value in proposed_comic_dict.items()
|
|
43
|
-
if getattr(comic, key) != value
|
|
44
|
-
}
|
|
45
|
-
if update_comic_dict:
|
|
46
|
-
self.metadata[UPDATE_COMICS][comic.pk] = update_comic_dict
|
|
47
|
-
status.increment_complete()
|
|
48
|
-
self.status_controller.update(status)
|
|
56
|
+
self._query_update_comic(comic, status)
|
|
57
|
+
if self.abort_event.is_set():
|
|
58
|
+
return
|
|
49
59
|
|
|
50
60
|
create_status = ImporterCreateComicsStatus(
|
|
51
61
|
None, len(self.metadata[CREATE_COMICS])
|
|
@@ -23,17 +23,56 @@ from codex.librarian.scribe.importer.statii.failed import (
|
|
|
23
23
|
)
|
|
24
24
|
from codex.librarian.scribe.importer.statii.read import ImporterAggregateStatus
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
_USED_COMICBOX_FIELDS = frozenset(
|
|
27
|
+
{
|
|
28
|
+
# "alternate_images",
|
|
29
|
+
"age_rating",
|
|
30
|
+
"arcs",
|
|
31
|
+
# "bookmark",
|
|
32
|
+
"characters",
|
|
33
|
+
"collection_title",
|
|
34
|
+
"country",
|
|
35
|
+
"credits",
|
|
36
|
+
# "credit_primaries",
|
|
37
|
+
"critical_rating",
|
|
38
|
+
"date",
|
|
39
|
+
# "ext",
|
|
40
|
+
"file_type", # extra
|
|
41
|
+
"genres",
|
|
42
|
+
"identifiers",
|
|
43
|
+
# "identifier_primary_source",
|
|
44
|
+
"imprint",
|
|
45
|
+
"issue",
|
|
46
|
+
"language",
|
|
47
|
+
"locations",
|
|
48
|
+
"metadata_mtime", # extra
|
|
49
|
+
"monochrome",
|
|
50
|
+
"notes",
|
|
51
|
+
"original_format",
|
|
52
|
+
"path", # extra
|
|
53
|
+
# "pages",
|
|
54
|
+
"page_count",
|
|
55
|
+
"protagonist",
|
|
56
|
+
# "prices",
|
|
57
|
+
"publisher",
|
|
58
|
+
"reading_direction",
|
|
59
|
+
# "remainders",
|
|
60
|
+
# "reprints",
|
|
61
|
+
"review",
|
|
62
|
+
# "rights",
|
|
63
|
+
"scan_info",
|
|
64
|
+
"series",
|
|
65
|
+
"series_groups",
|
|
66
|
+
"stories",
|
|
67
|
+
"summary",
|
|
68
|
+
"tagger",
|
|
69
|
+
"tags",
|
|
70
|
+
"teams",
|
|
71
|
+
"title",
|
|
72
|
+
"universes",
|
|
73
|
+
# "updated_at",
|
|
74
|
+
"volume",
|
|
75
|
+
}
|
|
37
76
|
)
|
|
38
77
|
|
|
39
78
|
|
|
@@ -42,8 +81,9 @@ class AggregateMetadataImporter(AggregatePathMetadataImporter):
|
|
|
42
81
|
|
|
43
82
|
@staticmethod
|
|
44
83
|
def _transform_metadata(md):
|
|
45
|
-
for key in
|
|
46
|
-
|
|
84
|
+
for key in tuple(md.keys()):
|
|
85
|
+
if key not in _USED_COMICBOX_FIELDS:
|
|
86
|
+
md.pop(key, None)
|
|
47
87
|
|
|
48
88
|
if date := md.pop(DATE_KEY, None):
|
|
49
89
|
date.pop(COVER_DATE_KEY, None)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Extract metadata from comic archive."""
|
|
2
2
|
|
|
3
|
-
from datetime import datetime
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
4
|
from tarfile import TarError
|
|
5
5
|
from zipfile import BadZipFile, LargeZipFile
|
|
6
6
|
|
|
@@ -29,7 +29,10 @@ class ExtractMetadataImporter(AggregateMetadataImporter):
|
|
|
29
29
|
comic = Comic.objects.get(path=path)
|
|
30
30
|
except Comic.DoesNotExist:
|
|
31
31
|
return None
|
|
32
|
-
|
|
32
|
+
mtime = comic.metadata_mtime
|
|
33
|
+
if mtime and (mtime.tzinfo is None or mtime.tzinfo.utcoffset(mtime) is None):
|
|
34
|
+
mtime = mtime.replace(tzinfo=timezone.utc)
|
|
35
|
+
return mtime
|
|
33
36
|
|
|
34
37
|
def _set_import_metadata_flag(self):
|
|
35
38
|
"""Set import_metadata flag."""
|
|
@@ -50,17 +53,17 @@ class ExtractMetadataImporter(AggregateMetadataImporter):
|
|
|
50
53
|
with Comicbox(path, config=COMICBOX_CONFIG, logger=self.log) as cb:
|
|
51
54
|
if import_metadata:
|
|
52
55
|
new_md_mtime = cb.get_metadata_mtime()
|
|
53
|
-
if
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
if (
|
|
57
|
+
not self.task.check_metadata_mtime
|
|
58
|
+
or not new_md_mtime
|
|
59
|
+
or not (old_md_mtime := self._metadata_mtime(path))
|
|
60
|
+
or (new_md_mtime > old_md_mtime)
|
|
61
|
+
):
|
|
62
|
+
md = cb.to_dict()
|
|
63
|
+
md = md.get("comicbox", {})
|
|
64
|
+
md["metadata_mtime"] = new_md_mtime
|
|
65
|
+
else:
|
|
66
|
+
md["page_count"] = cb.get_page_count()
|
|
64
67
|
else:
|
|
65
68
|
md["page_count"] = cb.get_page_count()
|
|
66
69
|
md["file_type"] = cb.get_file_type()
|
|
@@ -6,7 +6,6 @@ from codex.librarian.scribe.importer.const import (
|
|
|
6
6
|
FTS_CREATED_M2MS,
|
|
7
7
|
FTS_EXISTING_M2MS,
|
|
8
8
|
FTS_UPDATE,
|
|
9
|
-
IDENTIFIERS_FIELD_NAME,
|
|
10
9
|
NON_FTS_FIELDS,
|
|
11
10
|
STORY_ARC_FIELD_NAME,
|
|
12
11
|
STORY_ARC_NUMBERS_FIELD_NAME,
|
|
@@ -25,8 +24,6 @@ class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter):
|
|
|
25
24
|
"""Only store the fts relevant parts of complex links."""
|
|
26
25
|
if field_name == CREDITS_FIELD_NAME:
|
|
27
26
|
values = tuple(subvalues[0] for subvalues in values)
|
|
28
|
-
if field_name == IDENTIFIERS_FIELD_NAME:
|
|
29
|
-
values = tuple(subvalues[-1] for subvalues in values)
|
|
30
27
|
elif field_name == STORY_ARC_NUMBERS_FIELD_NAME:
|
|
31
28
|
field_name = STORY_ARC_FIELD_NAME + "s"
|
|
32
29
|
return field_name, tuple(values)
|
|
@@ -41,10 +38,6 @@ class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter):
|
|
|
41
38
|
"""Add the existing values for creating a changed search entry."""
|
|
42
39
|
if field_name in NON_FTS_FIELDS or not values:
|
|
43
40
|
return
|
|
44
|
-
if field_name == IDENTIFIERS_FIELD_NAME:
|
|
45
|
-
# sources extracton must come before identifiers is minified
|
|
46
|
-
sources = tuple(subvalues[0] for subvalues in values)
|
|
47
|
-
self.add_to_fts_existing(pk, "sources", sources)
|
|
48
41
|
field_name, values = self.minify_complex_link_to_fts_tuple(field_name, values)
|
|
49
42
|
fts_values = self._to_fts_tuple(values)
|
|
50
43
|
if not fts_values:
|
|
@@ -72,7 +65,7 @@ class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter):
|
|
|
72
65
|
self.metadata[key] = {}
|
|
73
66
|
if sub_key not in self.metadata[key]:
|
|
74
67
|
self.metadata[key][sub_key] = {}
|
|
75
|
-
self.log.
|
|
68
|
+
self.log.debug(
|
|
76
69
|
f"FTS import anomaly, attempting FTS update for comic {sub_key} {field_name}"
|
|
77
70
|
)
|
|
78
71
|
# Alternative might be kicking off an FTS sync
|
|
@@ -52,7 +52,8 @@ class SearchIndexSyncManyToManyImporter(FinishImporter):
|
|
|
52
52
|
.only(*update_fields)
|
|
53
53
|
)
|
|
54
54
|
for comicfts in comicftss:
|
|
55
|
-
|
|
55
|
+
value = comicfts.fts_value.strip(",") # pyright: ignore[reportAttributeAccessIssue]
|
|
56
|
+
setattr(comicfts, field_name, value)
|
|
56
57
|
comicfts.updated_at = Now()
|
|
57
58
|
update_objs.append(comicfts)
|
|
58
59
|
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"""Search Index update."""
|
|
2
2
|
|
|
3
|
-
from contextlib import suppress
|
|
4
3
|
from time import time
|
|
5
4
|
|
|
6
|
-
from comicbox.enums.comicbox import IdSources
|
|
7
|
-
from comicbox.enums.maps.identifiers import ID_SOURCE_NAME_MAP
|
|
8
|
-
from django.db.models.functions.datetime import Now
|
|
9
5
|
from humanize import naturaldelta
|
|
10
6
|
|
|
11
7
|
from codex.librarian.scribe.importer.const import (
|
|
@@ -13,10 +9,6 @@ from codex.librarian.scribe.importer.const import (
|
|
|
13
9
|
FTS_EXISTING_M2MS,
|
|
14
10
|
FTS_UPDATE,
|
|
15
11
|
)
|
|
16
|
-
from codex.librarian.scribe.importer.search.const import (
|
|
17
|
-
COMICFTS_UPDATE_FIELDS,
|
|
18
|
-
PYCOUNTRY_FIELDS,
|
|
19
|
-
)
|
|
20
12
|
from codex.librarian.scribe.importer.search.sync_m2m import (
|
|
21
13
|
SearchIndexSyncManyToManyImporter,
|
|
22
14
|
)
|
|
@@ -25,6 +17,8 @@ from codex.librarian.scribe.importer.statii.search import (
|
|
|
25
17
|
ImporterFTSStatus,
|
|
26
18
|
ImporterFTSUpdateStatus,
|
|
27
19
|
)
|
|
20
|
+
from codex.librarian.scribe.search.const import COMICFTS_UPDATE_FIELDS
|
|
21
|
+
from codex.librarian.scribe.search.prepare import SearchEntryPrepare
|
|
28
22
|
from codex.librarian.status import Status
|
|
29
23
|
from codex.models.comic import ComicFTS
|
|
30
24
|
|
|
@@ -32,73 +26,20 @@ from codex.models.comic import ComicFTS
|
|
|
32
26
|
class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
|
|
33
27
|
"""Search Index update methods."""
|
|
34
28
|
|
|
35
|
-
@staticmethod
|
|
36
|
-
def _get_pycountry_fts_field(entry, field_name) -> str:
|
|
37
|
-
iso_code = entry.get(field_name)
|
|
38
|
-
if not iso_code:
|
|
39
|
-
return ""
|
|
40
|
-
field = PYCOUNTRY_FIELDS[field_name]
|
|
41
|
-
return ",".join((iso_code, field.to_representation(iso_code)))
|
|
42
|
-
|
|
43
|
-
@staticmethod
|
|
44
|
-
def _get_sources_fts_field(entry) -> tuple[str, ...]:
|
|
45
|
-
sources = entry.get("sources", ())
|
|
46
|
-
names = []
|
|
47
|
-
for source_str in sources:
|
|
48
|
-
names.append(source_str)
|
|
49
|
-
with suppress(ValueError):
|
|
50
|
-
id_source = IdSources(source_str)
|
|
51
|
-
if long_name := ID_SOURCE_NAME_MAP.get(id_source):
|
|
52
|
-
names.append(long_name)
|
|
53
|
-
return tuple(names)
|
|
54
|
-
|
|
55
|
-
@staticmethod
|
|
56
|
-
def _create_comicfts_entry_attributes(entry, *, create: bool):
|
|
57
|
-
now = Now()
|
|
58
|
-
entry["updated_at"] = now
|
|
59
|
-
if create:
|
|
60
|
-
entry["created_at"] = now
|
|
61
|
-
|
|
62
|
-
@classmethod
|
|
63
|
-
def _create_comicfts_entry_fks(cls, entry):
|
|
64
|
-
entry["country"] = cls._get_pycountry_fts_field(entry, "country")
|
|
65
|
-
entry["language"] = cls._get_pycountry_fts_field(entry, "language")
|
|
66
|
-
|
|
67
|
-
@staticmethod
|
|
68
|
-
def _to_fts_values(value):
|
|
69
|
-
"""Create a tuple of fts value strings."""
|
|
70
|
-
return tuple(
|
|
71
|
-
subvalue
|
|
72
|
-
for values_tuple in value
|
|
73
|
-
for subvalue in values_tuple
|
|
74
|
-
if isinstance(subvalue, str)
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
def _create_comicfts_entry_m2ms(self, pk: int, entry):
|
|
78
|
-
if sources := self._get_sources_fts_field(entry):
|
|
79
|
-
entry["sources"] = sources
|
|
80
|
-
if existing_values := self.metadata[FTS_EXISTING_M2MS].get(pk):
|
|
81
|
-
for field_name in tuple(existing_values.keys()):
|
|
82
|
-
if values := existing_values.get(field_name):
|
|
83
|
-
entry[field_name] = entry.get(field_name, ()) + values
|
|
84
|
-
|
|
85
29
|
def _create_comicfts_entry(
|
|
86
30
|
self,
|
|
87
|
-
pk,
|
|
88
|
-
entry,
|
|
31
|
+
pk: int,
|
|
32
|
+
entry: dict,
|
|
89
33
|
obj_list: list[ComicFTS],
|
|
90
34
|
status: Status,
|
|
91
35
|
):
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
comicfts = ComicFTS(comic_id=pk, **entry)
|
|
100
|
-
obj_list.append(comicfts)
|
|
101
|
-
status.increment_complete()
|
|
36
|
+
if entry:
|
|
37
|
+
existing_m2m_values = self.metadata[FTS_EXISTING_M2MS].get(pk)
|
|
38
|
+
SearchEntryPrepare.prepare_import_fts_entry(
|
|
39
|
+
pk, entry, existing_m2m_values, None, obj_list, status, create=True
|
|
40
|
+
)
|
|
41
|
+
else:
|
|
42
|
+
status.decrement_total()
|
|
102
43
|
self.status_controller.update(status)
|
|
103
44
|
|
|
104
45
|
def _update_comicfts_entry(
|
|
@@ -108,18 +49,19 @@ class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
|
|
|
108
49
|
status: Status,
|
|
109
50
|
):
|
|
110
51
|
comic_id = comicfts.comic_id # pyright:ignore[reportAttributeAccessIssue], # ty: ignore[unresolved-attribute]
|
|
111
|
-
entry
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
52
|
+
if entry := self.metadata[FTS_UPDATE].pop(comic_id):
|
|
53
|
+
existing_m2m_values = self.metadata[FTS_EXISTING_M2MS].get(comic_id)
|
|
54
|
+
SearchEntryPrepare.prepare_import_fts_entry(
|
|
55
|
+
comic_id,
|
|
56
|
+
entry,
|
|
57
|
+
existing_m2m_values,
|
|
58
|
+
comicfts,
|
|
59
|
+
obj_list,
|
|
60
|
+
status,
|
|
61
|
+
create=False,
|
|
62
|
+
)
|
|
63
|
+
else:
|
|
64
|
+
status.decrement_total()
|
|
123
65
|
self.status_controller.update(status)
|
|
124
66
|
|
|
125
67
|
def _update_search_index_operate_get_status(
|
|
@@ -134,9 +76,9 @@ class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
|
|
|
134
76
|
entries = self.metadata.pop(FTS_CREATE, {})
|
|
135
77
|
pks = tuple(sorted(entries.keys()))
|
|
136
78
|
obj_list = []
|
|
79
|
+
if self.abort_event.is_set():
|
|
80
|
+
return tuple(obj_list), ()
|
|
137
81
|
for pk in pks:
|
|
138
|
-
if self.abort_event.is_set():
|
|
139
|
-
return tuple(obj_list), ()
|
|
140
82
|
entry = entries.pop(pk)
|
|
141
83
|
self._create_comicfts_entry(pk, entry, obj_list, status)
|
|
142
84
|
return tuple(obj_list), pks
|
|
@@ -147,9 +89,9 @@ class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
|
|
|
147
89
|
obj_list = []
|
|
148
90
|
if pks := tuple(sorted(self.metadata.get(FTS_UPDATE, {}).keys())):
|
|
149
91
|
comicftss = ComicFTS.objects.filter(comic_id__in=pks)
|
|
92
|
+
if self.abort_event.is_set():
|
|
93
|
+
return tuple(obj_list), ()
|
|
150
94
|
for comicfts in comicftss:
|
|
151
|
-
if self.abort_event.is_set():
|
|
152
|
-
return tuple(obj_list), ()
|
|
153
95
|
self._update_comicfts_entry(comicfts, obj_list, status)
|
|
154
96
|
if self.metadata[FTS_UPDATE]:
|
|
155
97
|
# If updates not popped, turn them into creates.
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
from types import MappingProxyType
|
|
4
|
-
|
|
5
|
-
from codex.serializers.fields.browser import CountryField, LanguageField
|
|
1
|
+
"""FTS constants."""
|
|
6
2
|
|
|
7
3
|
_COMICFTS_ATTRIBUTES = (
|
|
8
4
|
"collection_title",
|
|
9
|
-
"file_type",
|
|
10
|
-
"issue",
|
|
11
5
|
"name",
|
|
12
|
-
"notes",
|
|
13
|
-
"reading_direction",
|
|
14
6
|
"review",
|
|
15
7
|
"summary",
|
|
16
8
|
"updated_at",
|
|
@@ -30,7 +22,6 @@ _COMICFTS_M2MS = (
|
|
|
30
22
|
"characters",
|
|
31
23
|
"credits",
|
|
32
24
|
"genres",
|
|
33
|
-
"identifiers",
|
|
34
25
|
"locations",
|
|
35
26
|
"series_groups",
|
|
36
27
|
"sources",
|
|
@@ -45,6 +36,3 @@ COMICFTS_UPDATE_FIELDS = (
|
|
|
45
36
|
*_COMICFTS_FKS,
|
|
46
37
|
*_COMICFTS_M2MS,
|
|
47
38
|
)
|
|
48
|
-
PYCOUNTRY_FIELDS = MappingProxyType(
|
|
49
|
-
{"country": CountryField(), "language": LanguageField()}
|
|
50
|
-
)
|