codex 1.6.0a9__py3-none-any.whl → 1.6.0a11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of codex might be problematic. Click here for more details.
- codex/librarian/importer/cache.py +46 -133
- codex/librarian/importer/create_fks.py +3 -1
- codex/librarian/importer/importer.py +1 -1
- codex/librarian/importer/importerd.py +5 -5
- codex/librarian/importer/tasks.py +2 -2
- codex/librarian/janitor/janitor.py +0 -3
- codex/librarian/librariand.py +0 -2
- codex/librarian/notifier/notifierd.py +1 -1
- codex/librarian/notifier/tasks.py +4 -4
- codex/middleware.py +1 -2
- codex/migrations/0027_import_order_and_covers.py +1 -66
- codex/models/comic.py +0 -1
- codex/models/groups.py +0 -3
- codex/serializers/admin.py +41 -40
- codex/serializers/browser/choices.py +38 -10
- codex/serializers/browser/filters.py +2 -2
- codex/serializers/browser/metadata.py +45 -1
- codex/serializers/browser/mixins.py +35 -2
- codex/serializers/browser/page.py +2 -4
- codex/serializers/browser/settings.py +41 -14
- codex/serializers/choices.py +4 -0
- codex/serializers/fields.py +61 -1
- codex/serializers/models/pycountry.py +11 -51
- codex/serializers/reader.py +12 -1
- codex/serializers/route.py +1 -1
- codex/serializers/settings.py +12 -0
- codex/settings/settings.py +10 -1
- codex/static_root/assets/VCheckbox-BwDyxhU7.831b00df198a.js +1 -0
- codex/static_root/assets/VCheckbox-BwDyxhU7.831b00df198a.js.br +0 -0
- codex/static_root/assets/VCheckbox-BwDyxhU7.831b00df198a.js.gz +0 -0
- codex/static_root/assets/VCheckbox-BwDyxhU7.js +1 -0
- codex/static_root/assets/VCheckbox-BwDyxhU7.js.br +0 -0
- codex/static_root/assets/VCheckbox-BwDyxhU7.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-DLzF_WHB.9a47873b8548.js → VCheckboxBtn-DVq5lDK4.5e6464c8d80a.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-DVq5lDK4.5e6464c8d80a.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DVq5lDK4.5e6464c8d80a.js.gz +0 -0
- codex/static_root/assets/{VCheckboxBtn-DLzF_WHB.js → VCheckboxBtn-DVq5lDK4.js} +1 -1
- codex/static_root/assets/VCheckboxBtn-DVq5lDK4.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DVq5lDK4.js.gz +0 -0
- codex/static_root/assets/VCombobox-BASCOy0n.7801caa5e192.js +1 -0
- codex/static_root/assets/VCombobox-BASCOy0n.7801caa5e192.js.br +0 -0
- codex/static_root/assets/VCombobox-BASCOy0n.7801caa5e192.js.gz +0 -0
- codex/static_root/assets/VCombobox-BASCOy0n.js +1 -0
- codex/static_root/assets/VCombobox-BASCOy0n.js.br +0 -0
- codex/static_root/assets/VCombobox-BASCOy0n.js.gz +0 -0
- codex/static_root/assets/VDialog-DnbL_v_u.0bd289bda8e6.js +1 -0
- codex/static_root/assets/VDialog-DnbL_v_u.0bd289bda8e6.js.br +0 -0
- codex/static_root/assets/VDialog-DnbL_v_u.0bd289bda8e6.js.gz +0 -0
- codex/static_root/assets/VDialog-DnbL_v_u.js +1 -0
- codex/static_root/assets/VDialog-DnbL_v_u.js.br +0 -0
- codex/static_root/assets/VDialog-DnbL_v_u.js.gz +0 -0
- codex/static_root/assets/{VDialog-C5Nxd_zP.css → VDialog-lQ13FnRR.1c801ad756b2.css} +1 -1
- codex/static_root/assets/VDialog-lQ13FnRR.1c801ad756b2.css.br +0 -0
- codex/static_root/assets/VDialog-lQ13FnRR.1c801ad756b2.css.gz +0 -0
- codex/static_root/assets/{VDialog-C5Nxd_zP.d327f505ef0e.css → VDialog-lQ13FnRR.css} +1 -1
- codex/static_root/assets/VDialog-lQ13FnRR.css.br +0 -0
- codex/static_root/assets/VDialog-lQ13FnRR.css.gz +0 -0
- codex/static_root/assets/VExpansionPanels-B8nz8lN5.56e5adec4f62.js +1 -0
- codex/static_root/assets/VExpansionPanels-B8nz8lN5.56e5adec4f62.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-B8nz8lN5.56e5adec4f62.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-B8nz8lN5.js +1 -0
- codex/static_root/assets/VExpansionPanels-B8nz8lN5.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-B8nz8lN5.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-B--7K_v5.4a4e9c2d6c42.js → VRadioGroup-BgwJ_b94.55f84f3429b9.js} +1 -1
- codex/static_root/assets/VRadioGroup-BgwJ_b94.55f84f3429b9.js.br +0 -0
- codex/static_root/assets/VRadioGroup-BgwJ_b94.55f84f3429b9.js.gz +0 -0
- codex/static_root/assets/{VRadioGroup-B--7K_v5.js → VRadioGroup-BgwJ_b94.js} +1 -1
- codex/static_root/assets/VRadioGroup-BgwJ_b94.js.br +0 -0
- codex/static_root/assets/VRadioGroup-BgwJ_b94.js.gz +0 -0
- codex/static_root/assets/VSelect-BoKpXxwe.a88f065dfe3b.js +1 -0
- codex/static_root/assets/VSelect-BoKpXxwe.a88f065dfe3b.js.br +0 -0
- codex/static_root/assets/VSelect-BoKpXxwe.a88f065dfe3b.js.gz +0 -0
- codex/static_root/assets/VSelect-BoKpXxwe.js +1 -0
- codex/static_root/assets/VSelect-BoKpXxwe.js.br +0 -0
- codex/static_root/assets/VSelect-BoKpXxwe.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-CVQ9wkE2.c02186cceba6.js → VSelectionControl-BXJGg8No.0cb36d941d2a.js} +1 -1
- codex/static_root/assets/VSelectionControl-BXJGg8No.0cb36d941d2a.js.br +0 -0
- codex/static_root/assets/VSelectionControl-BXJGg8No.0cb36d941d2a.js.gz +0 -0
- codex/static_root/assets/{VSelectionControl-CVQ9wkE2.js → VSelectionControl-BXJGg8No.js} +1 -1
- codex/static_root/assets/VSelectionControl-BXJGg8No.js.br +0 -0
- codex/static_root/assets/VSelectionControl-BXJGg8No.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-C2TL5E34.775adeb5a973.js +1 -0
- codex/static_root/assets/VSlideGroup-C2TL5E34.775adeb5a973.js.br +0 -0
- codex/static_root/assets/VSlideGroup-C2TL5E34.775adeb5a973.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-C2TL5E34.js +1 -0
- codex/static_root/assets/VSlideGroup-C2TL5E34.js.br +0 -0
- codex/static_root/assets/VSlideGroup-C2TL5E34.js.gz +0 -0
- codex/static_root/assets/{VTable-CrWkhkiP.6d530eea0c09.js → VTable-C0FptljX.e4840b635c6e.js} +1 -1
- codex/static_root/assets/VTable-C0FptljX.e4840b635c6e.js.br +0 -0
- codex/static_root/assets/VTable-C0FptljX.e4840b635c6e.js.gz +0 -0
- codex/static_root/assets/{VTable-CrWkhkiP.js → VTable-C0FptljX.js} +1 -1
- codex/static_root/assets/VTable-C0FptljX.js.br +0 -0
- codex/static_root/assets/VTable-C0FptljX.js.gz +0 -0
- codex/static_root/assets/VTextField-Aw8nKhY6.428732ac22d7.js +1 -0
- codex/static_root/assets/VTextField-Aw8nKhY6.428732ac22d7.js.br +0 -0
- codex/static_root/assets/VTextField-Aw8nKhY6.428732ac22d7.js.gz +0 -0
- codex/static_root/assets/VTextField-Aw8nKhY6.js +1 -0
- codex/static_root/assets/VTextField-Aw8nKhY6.js.br +0 -0
- codex/static_root/assets/VTextField-Aw8nKhY6.js.gz +0 -0
- codex/static_root/assets/VWindowItem-D9j_u9MX.828acf3dee55.js +1 -0
- codex/static_root/assets/VWindowItem-D9j_u9MX.828acf3dee55.js.br +0 -0
- codex/static_root/assets/VWindowItem-D9j_u9MX.828acf3dee55.js.gz +0 -0
- codex/static_root/assets/VWindowItem-D9j_u9MX.js +1 -0
- codex/static_root/assets/VWindowItem-D9j_u9MX.js.br +0 -0
- codex/static_root/assets/VWindowItem-D9j_u9MX.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-Dmn4wEY3.af7e8490f0e3.js +30 -0
- codex/static_root/assets/admin-drawer-panel-Dmn4wEY3.af7e8490f0e3.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-Dmn4wEY3.af7e8490f0e3.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-Dmn4wEY3.js +30 -0
- codex/static_root/assets/admin-drawer-panel-Dmn4wEY3.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-Dmn4wEY3.js.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-o87BwD38.ce39427c8201.css → admin-drawer-panel-mne3FIj6.561b3f75fe65.css} +1 -1
- codex/static_root/assets/admin-drawer-panel-mne3FIj6.561b3f75fe65.css.br +0 -0
- codex/static_root/assets/admin-drawer-panel-mne3FIj6.561b3f75fe65.css.gz +0 -0
- codex/static_root/assets/{admin-drawer-panel-o87BwD38.css → admin-drawer-panel-mne3FIj6.css} +1 -1
- codex/static_root/assets/admin-drawer-panel-mne3FIj6.css.br +0 -0
- codex/static_root/assets/admin-drawer-panel-mne3FIj6.css.gz +0 -0
- codex/static_root/assets/admin-jf7zR2p_.4741813376d2.js +1 -0
- codex/static_root/assets/admin-jf7zR2p_.4741813376d2.js.br +0 -0
- codex/static_root/assets/admin-jf7zR2p_.4741813376d2.js.gz +0 -0
- codex/static_root/assets/admin-jf7zR2p_.js +1 -0
- codex/static_root/assets/admin-jf7zR2p_.js.br +0 -0
- codex/static_root/assets/admin-jf7zR2p_.js.gz +0 -0
- codex/static_root/assets/browser-BKZuypzF.86e5333bd7d6.js +1 -0
- codex/static_root/assets/browser-BKZuypzF.86e5333bd7d6.js.br +0 -0
- codex/static_root/assets/browser-BKZuypzF.86e5333bd7d6.js.gz +0 -0
- codex/static_root/assets/browser-BKZuypzF.js +1 -0
- codex/static_root/assets/browser-BKZuypzF.js.br +0 -0
- codex/static_root/assets/browser-BKZuypzF.js.gz +0 -0
- codex/static_root/assets/browser-D7xci5SY.css +1 -0
- codex/static_root/assets/browser-D7xci5SY.css.br +0 -0
- codex/static_root/assets/browser-D7xci5SY.css.gz +0 -0
- codex/static_root/assets/browser-D7xci5SY.fa305e14005c.css +1 -0
- codex/static_root/assets/browser-D7xci5SY.fa305e14005c.css.br +0 -0
- codex/static_root/assets/browser-D7xci5SY.fa305e14005c.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css +1 -0
- codex/static_root/assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css.br +0 -0
- codex/static_root/assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-0u6IJA87.css +1 -0
- codex/static_root/assets/change-password-dialog-0u6IJA87.css.br +0 -0
- codex/static_root/assets/change-password-dialog-0u6IJA87.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-Cc1e755p.b29d200537bf.js +1 -0
- codex/static_root/assets/change-password-dialog-Cc1e755p.b29d200537bf.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Cc1e755p.b29d200537bf.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-Cc1e755p.js +1 -0
- codex/static_root/assets/change-password-dialog-Cc1e755p.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Cc1e755p.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-jwL7B98r.1cfd579cbcfe.js → confirm-dialog-Cyr7HAAz.8ab1d8b6241a.js} +1 -1
- codex/static_root/assets/confirm-dialog-Cyr7HAAz.8ab1d8b6241a.js.br +0 -0
- codex/static_root/assets/confirm-dialog-Cyr7HAAz.8ab1d8b6241a.js.gz +0 -0
- codex/static_root/assets/{confirm-dialog-jwL7B98r.js → confirm-dialog-Cyr7HAAz.js} +1 -1
- codex/static_root/assets/confirm-dialog-Cyr7HAAz.js.br +0 -0
- codex/static_root/assets/confirm-dialog-Cyr7HAAz.js.gz +0 -0
- codex/static_root/assets/datetime-column-Cqi99Ze-.49d0ce340183.js +1 -0
- codex/static_root/assets/datetime-column-Cqi99Ze-.49d0ce340183.js.br +0 -0
- codex/static_root/assets/datetime-column-Cqi99Ze-.49d0ce340183.js.gz +0 -0
- codex/static_root/assets/datetime-column-Cqi99Ze-.js +1 -0
- codex/static_root/assets/datetime-column-Cqi99Ze-.js.br +0 -0
- codex/static_root/assets/datetime-column-Cqi99Ze-.js.gz +0 -0
- codex/static_root/assets/filter-CuocBoS2.885d1b8d44cc.js +1 -0
- codex/static_root/assets/filter-CuocBoS2.885d1b8d44cc.js.br +0 -0
- codex/static_root/assets/filter-CuocBoS2.885d1b8d44cc.js.gz +0 -0
- codex/static_root/assets/filter-CuocBoS2.js +1 -0
- codex/static_root/assets/filter-CuocBoS2.js.br +0 -0
- codex/static_root/assets/filter-CuocBoS2.js.gz +0 -0
- codex/static_root/assets/{flag-tab-Da2DBNyz.ffbe5ca37e1c.js → flag-tab-B5dRCBAt.e858f7ec9f55.js} +1 -1
- codex/static_root/assets/flag-tab-B5dRCBAt.e858f7ec9f55.js.br +0 -0
- codex/static_root/assets/flag-tab-B5dRCBAt.e858f7ec9f55.js.gz +0 -0
- codex/static_root/assets/{flag-tab-Da2DBNyz.js → flag-tab-B5dRCBAt.js} +1 -1
- codex/static_root/assets/flag-tab-B5dRCBAt.js.br +0 -0
- codex/static_root/assets/flag-tab-B5dRCBAt.js.gz +0 -0
- codex/static_root/assets/{group-tab-BONYWOc1.6ddf321a4a56.js → group-tab-_nT2o04v.c06032b254dc.js} +1 -1
- codex/static_root/assets/group-tab-_nT2o04v.c06032b254dc.js.br +0 -0
- codex/static_root/assets/group-tab-_nT2o04v.c06032b254dc.js.gz +0 -0
- codex/static_root/assets/{group-tab-BONYWOc1.js → group-tab-_nT2o04v.js} +1 -1
- codex/static_root/assets/group-tab-_nT2o04v.js.br +0 -0
- codex/static_root/assets/group-tab-_nT2o04v.js.gz +0 -0
- codex/static_root/assets/{http-error-D2Jnc20C.32846bc3a43d.js → http-error-CXo9qLiW.d5a337f399c9.js} +1 -1
- codex/static_root/assets/http-error-CXo9qLiW.d5a337f399c9.js.br +0 -0
- codex/static_root/assets/http-error-CXo9qLiW.d5a337f399c9.js.gz +0 -0
- codex/static_root/assets/{http-error-D2Jnc20C.js → http-error-CXo9qLiW.js} +1 -1
- codex/static_root/assets/http-error-CXo9qLiW.js.br +0 -0
- codex/static_root/assets/http-error-CXo9qLiW.js.gz +0 -0
- codex/static_root/assets/{library-tab-B419agXA.js → library-tab-lz5QMD4i.2f04b226ebe8.js} +1 -1
- codex/static_root/assets/library-tab-lz5QMD4i.2f04b226ebe8.js.br +0 -0
- codex/static_root/assets/library-tab-lz5QMD4i.2f04b226ebe8.js.gz +0 -0
- codex/static_root/assets/{library-tab-B419agXA.d4b778172aaa.js → library-tab-lz5QMD4i.js} +1 -1
- codex/static_root/assets/library-tab-lz5QMD4i.js.br +0 -0
- codex/static_root/assets/library-tab-lz5QMD4i.js.gz +0 -0
- codex/static_root/assets/main-17i0EBCp.7093c3f755f1.js +32 -0
- codex/static_root/assets/main-17i0EBCp.7093c3f755f1.js.br +0 -0
- codex/static_root/assets/main-17i0EBCp.7093c3f755f1.js.gz +0 -0
- codex/static_root/assets/main-17i0EBCp.js +32 -0
- codex/static_root/assets/main-17i0EBCp.js.br +0 -0
- codex/static_root/assets/main-17i0EBCp.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-BBvsIXTd.ad891da6617a.js +1 -0
- codex/static_root/assets/pagination-toolbar-BBvsIXTd.ad891da6617a.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-BBvsIXTd.ad891da6617a.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-BBvsIXTd.js +1 -0
- codex/static_root/assets/pagination-toolbar-BBvsIXTd.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-BBvsIXTd.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-B_zL7BQQ.css +1 -0
- codex/static_root/assets/pagination-toolbar-B_zL7BQQ.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-B_zL7BQQ.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-B_zL7BQQ.d1311bd41edc.css +1 -0
- codex/static_root/assets/pagination-toolbar-B_zL7BQQ.d1311bd41edc.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-B_zL7BQQ.d1311bd41edc.css.gz +0 -0
- codex/static_root/assets/{pdf-doc-8RVZqILx.2e7166dd26fb.js → pdf-doc-BpZdmj2g.93e86d9c7927.js} +1 -1
- codex/static_root/assets/pdf-doc-BpZdmj2g.93e86d9c7927.js.br +0 -0
- codex/static_root/assets/pdf-doc-BpZdmj2g.93e86d9c7927.js.gz +0 -0
- codex/static_root/assets/{pdf-doc-8RVZqILx.js → pdf-doc-BpZdmj2g.js} +1 -1
- codex/static_root/assets/pdf-doc-BpZdmj2g.js.br +0 -0
- codex/static_root/assets/pdf-doc-BpZdmj2g.js.gz +0 -0
- codex/static_root/assets/reader-CRJUR2qj.55d626f0f9fa.js +2 -0
- codex/static_root/assets/reader-CRJUR2qj.55d626f0f9fa.js.br +0 -0
- codex/static_root/assets/reader-CRJUR2qj.55d626f0f9fa.js.gz +0 -0
- codex/static_root/assets/reader-CRJUR2qj.js +2 -0
- codex/static_root/assets/reader-CRJUR2qj.js.br +0 -0
- codex/static_root/assets/reader-CRJUR2qj.js.gz +0 -0
- codex/static_root/assets/{reader-CCCfpM3x.1553e45bd775.css → reader-CqXFa_gE.78267e9de0c2.css} +1 -1
- codex/static_root/assets/reader-CqXFa_gE.78267e9de0c2.css.br +0 -0
- codex/static_root/assets/reader-CqXFa_gE.78267e9de0c2.css.gz +0 -0
- codex/static_root/assets/{reader-CCCfpM3x.css → reader-CqXFa_gE.css} +1 -1
- codex/static_root/assets/reader-CqXFa_gE.css.br +0 -0
- codex/static_root/assets/reader-CqXFa_gE.css.gz +0 -0
- codex/static_root/assets/relation-chips-NgDnInw_.3b5ba16f68f0.js +1 -0
- codex/static_root/assets/relation-chips-NgDnInw_.3b5ba16f68f0.js.br +0 -0
- codex/static_root/assets/relation-chips-NgDnInw_.3b5ba16f68f0.js.gz +0 -0
- codex/static_root/assets/relation-chips-NgDnInw_.js +1 -0
- codex/static_root/assets/relation-chips-NgDnInw_.js.br +0 -0
- codex/static_root/assets/relation-chips-NgDnInw_.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BaQT27kc.e43fc1527b66.js +2 -0
- codex/static_root/assets/settings-drawer-BaQT27kc.e43fc1527b66.js.br +0 -0
- codex/static_root/assets/settings-drawer-BaQT27kc.e43fc1527b66.js.gz +0 -0
- codex/static_root/assets/settings-drawer-BaQT27kc.js +2 -0
- codex/static_root/assets/settings-drawer-BaQT27kc.js.br +0 -0
- codex/static_root/assets/settings-drawer-BaQT27kc.js.gz +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css +1 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css.br +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.a5728396494b.css.gz +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.css +1 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.css.br +0 -0
- codex/static_root/assets/stats-tab-B4yKuY0c.css.gz +0 -0
- codex/static_root/assets/stats-tab-DoHb54IU.30d7deea7b9f.js +1 -0
- codex/static_root/assets/stats-tab-DoHb54IU.30d7deea7b9f.js.br +0 -0
- codex/static_root/assets/stats-tab-DoHb54IU.30d7deea7b9f.js.gz +0 -0
- codex/static_root/assets/stats-tab-DoHb54IU.js +1 -0
- codex/static_root/assets/stats-tab-DoHb54IU.js.br +0 -0
- codex/static_root/assets/stats-tab-DoHb54IU.js.gz +0 -0
- codex/static_root/assets/task-tab-B88ucu1U.4f240e3d82c4.js +1 -0
- codex/static_root/assets/task-tab-B88ucu1U.4f240e3d82c4.js.br +0 -0
- codex/static_root/assets/task-tab-B88ucu1U.4f240e3d82c4.js.gz +0 -0
- codex/static_root/assets/task-tab-B88ucu1U.js +1 -0
- codex/static_root/assets/task-tab-B88ucu1U.js.br +0 -0
- codex/static_root/assets/task-tab-B88ucu1U.js.gz +0 -0
- codex/static_root/assets/to-case-B7MjLIw-.08fc8412de69.js +1 -0
- codex/static_root/assets/to-case-B7MjLIw-.08fc8412de69.js.br +0 -0
- codex/static_root/assets/to-case-B7MjLIw-.js +1 -0
- codex/static_root/assets/to-case-B7MjLIw-.js.br +0 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.62ee74d4373c.js +1 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.62ee74d4373c.js.br +0 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.62ee74d4373c.js.gz +0 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.js +1 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.js.br +0 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.js.gz +0 -0
- codex/static_root/assets/{unauthorized-DHV6Q1n-.b7847b2872a1.css → unauthorized-CibJYD8o.4c2de98c2b53.css} +1 -1
- codex/static_root/assets/unauthorized-CibJYD8o.4c2de98c2b53.css.br +0 -0
- codex/static_root/assets/unauthorized-CibJYD8o.4c2de98c2b53.css.gz +0 -0
- codex/static_root/assets/{unauthorized-DHV6Q1n-.css → unauthorized-CibJYD8o.css} +1 -1
- codex/static_root/assets/unauthorized-CibJYD8o.css.br +0 -0
- codex/static_root/assets/unauthorized-CibJYD8o.css.gz +0 -0
- codex/static_root/assets/user-tab-BxtZ2u7W.161cc8f0dcce.js +1 -0
- codex/static_root/assets/user-tab-BxtZ2u7W.161cc8f0dcce.js.br +0 -0
- codex/static_root/assets/user-tab-BxtZ2u7W.161cc8f0dcce.js.gz +0 -0
- codex/static_root/assets/user-tab-BxtZ2u7W.js +1 -0
- codex/static_root/assets/user-tab-BxtZ2u7W.js.br +0 -0
- codex/static_root/assets/user-tab-BxtZ2u7W.js.gz +0 -0
- codex/static_root/js/choices-admin.3521e2a863df.json +1 -0
- codex/static_root/js/choices-admin.3521e2a863df.json.br +0 -0
- codex/static_root/js/choices-admin.3521e2a863df.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/js/{choices.a0aaaa6c7ef7.json → choices.2f6b0359e1ef.json} +1 -1
- codex/static_root/js/choices.2f6b0359e1ef.json.br +0 -0
- codex/static_root/js/choices.2f6b0359e1ef.json.gz +0 -0
- codex/static_root/js/choices.json +1 -1
- codex/static_root/js/choices.json.br +0 -0
- codex/static_root/js/choices.json.gz +0 -0
- codex/static_root/manifest.3851c028b0cb.json +622 -0
- codex/static_root/manifest.3851c028b0cb.json.br +0 -0
- codex/static_root/manifest.3851c028b0cb.json.gz +0 -0
- codex/static_root/manifest.json +245 -252
- codex/static_root/manifest.json.br +0 -0
- codex/static_root/manifest.json.gz +0 -0
- codex/static_root/staticfiles.json +1 -1
- codex/util.py +8 -6
- codex/views/admin/api_key.py +5 -2
- codex/views/admin/stats.py +13 -20
- codex/views/admin/tasks.py +2 -3
- codex/views/auth.py +1 -1
- codex/views/bookmark.py +49 -29
- codex/views/browser/annotations.py +11 -45
- codex/views/browser/base.py +22 -6
- codex/views/browser/breadcrumbs.py +5 -5
- codex/views/browser/browser.py +39 -27
- codex/views/browser/choices.py +22 -37
- codex/views/browser/cover.py +55 -65
- codex/views/browser/filters/annotations.py +33 -10
- codex/views/browser/filters/group.py +24 -15
- codex/views/browser/filters/search.py +3 -4
- codex/views/browser/metadata.py +98 -49
- codex/views/browser/mtime.py +3 -14
- codex/views/browser/order_by.py +1 -6
- codex/views/browser/settings.py +53 -0
- codex/views/browser/validate.py +3 -0
- codex/views/const.py +25 -2
- codex/views/opds/v1/feed.py +3 -5
- codex/views/opds/v2/feed.py +3 -3
- codex/views/reader/arcs.py +42 -51
- codex/views/reader/books.py +47 -63
- codex/views/reader/init.py +125 -0
- codex/views/reader/reader.py +9 -70
- codex/views/session.py +18 -12
- codex/views/settings.py +23 -10
- codex/views/util.py +2 -1
- codex/websockets/consumers.py +14 -10
- {codex-1.6.0a9.dist-info → codex-1.6.0a11.dist-info}/METADATA +1 -1
- {codex-1.6.0a9.dist-info → codex-1.6.0a11.dist-info}/RECORD +332 -328
- codex/static_root/assets/VCheckbox-eNspVUje.da8282a08876.js +0 -1
- codex/static_root/assets/VCheckbox-eNspVUje.da8282a08876.js.br +0 -0
- codex/static_root/assets/VCheckbox-eNspVUje.da8282a08876.js.gz +0 -0
- codex/static_root/assets/VCheckbox-eNspVUje.js +0 -1
- codex/static_root/assets/VCheckbox-eNspVUje.js.br +0 -0
- codex/static_root/assets/VCheckbox-eNspVUje.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DLzF_WHB.9a47873b8548.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DLzF_WHB.9a47873b8548.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-DLzF_WHB.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-DLzF_WHB.js.gz +0 -0
- codex/static_root/assets/VCombobox-BIO7lU_B.d607ada71b06.js +0 -1
- codex/static_root/assets/VCombobox-BIO7lU_B.d607ada71b06.js.br +0 -0
- codex/static_root/assets/VCombobox-BIO7lU_B.d607ada71b06.js.gz +0 -0
- codex/static_root/assets/VCombobox-BIO7lU_B.js +0 -1
- codex/static_root/assets/VCombobox-BIO7lU_B.js.br +0 -0
- codex/static_root/assets/VCombobox-BIO7lU_B.js.gz +0 -0
- codex/static_root/assets/VDialog-87AymJC5.4a46716358c0.js +0 -1
- codex/static_root/assets/VDialog-87AymJC5.4a46716358c0.js.br +0 -0
- codex/static_root/assets/VDialog-87AymJC5.4a46716358c0.js.gz +0 -0
- codex/static_root/assets/VDialog-87AymJC5.js +0 -1
- codex/static_root/assets/VDialog-87AymJC5.js.br +0 -0
- codex/static_root/assets/VDialog-87AymJC5.js.gz +0 -0
- codex/static_root/assets/VDialog-C5Nxd_zP.css.br +0 -0
- codex/static_root/assets/VDialog-C5Nxd_zP.css.gz +0 -0
- codex/static_root/assets/VDialog-C5Nxd_zP.d327f505ef0e.css.br +0 -0
- codex/static_root/assets/VDialog-C5Nxd_zP.d327f505ef0e.css.gz +0 -0
- codex/static_root/assets/VExpansionPanels-CgA3shsd.9e524c73726a.js +0 -1
- codex/static_root/assets/VExpansionPanels-CgA3shsd.9e524c73726a.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-CgA3shsd.9e524c73726a.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-CgA3shsd.js +0 -1
- codex/static_root/assets/VExpansionPanels-CgA3shsd.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-CgA3shsd.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-B--7K_v5.4a4e9c2d6c42.js.br +0 -0
- codex/static_root/assets/VRadioGroup-B--7K_v5.4a4e9c2d6c42.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-B--7K_v5.js.br +0 -0
- codex/static_root/assets/VRadioGroup-B--7K_v5.js.gz +0 -0
- codex/static_root/assets/VSelect-BoJq222l.fc714657e214.js +0 -1
- codex/static_root/assets/VSelect-BoJq222l.fc714657e214.js.br +0 -0
- codex/static_root/assets/VSelect-BoJq222l.fc714657e214.js.gz +0 -0
- codex/static_root/assets/VSelect-BoJq222l.js +0 -1
- codex/static_root/assets/VSelect-BoJq222l.js.br +0 -0
- codex/static_root/assets/VSelect-BoJq222l.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-CVQ9wkE2.c02186cceba6.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CVQ9wkE2.c02186cceba6.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-CVQ9wkE2.js.br +0 -0
- codex/static_root/assets/VSelectionControl-CVQ9wkE2.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-Ce0j2BKK.85e64443a928.js +0 -1
- codex/static_root/assets/VSlideGroup-Ce0j2BKK.85e64443a928.js.br +0 -0
- codex/static_root/assets/VSlideGroup-Ce0j2BKK.85e64443a928.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-Ce0j2BKK.js +0 -1
- codex/static_root/assets/VSlideGroup-Ce0j2BKK.js.br +0 -0
- codex/static_root/assets/VSlideGroup-Ce0j2BKK.js.gz +0 -0
- codex/static_root/assets/VTable-CrWkhkiP.6d530eea0c09.js.br +0 -0
- codex/static_root/assets/VTable-CrWkhkiP.6d530eea0c09.js.gz +0 -0
- codex/static_root/assets/VTable-CrWkhkiP.js.br +0 -0
- codex/static_root/assets/VTable-CrWkhkiP.js.gz +0 -0
- codex/static_root/assets/VTextField-CkWbil3K.2cac13161dfe.js +0 -1
- codex/static_root/assets/VTextField-CkWbil3K.2cac13161dfe.js.br +0 -0
- codex/static_root/assets/VTextField-CkWbil3K.2cac13161dfe.js.gz +0 -0
- codex/static_root/assets/VTextField-CkWbil3K.js +0 -1
- codex/static_root/assets/VTextField-CkWbil3K.js.br +0 -0
- codex/static_root/assets/VTextField-CkWbil3K.js.gz +0 -0
- codex/static_root/assets/VWindowItem-7z55Y4lK.98eb7487e039.js +0 -1
- codex/static_root/assets/VWindowItem-7z55Y4lK.98eb7487e039.js.br +0 -0
- codex/static_root/assets/VWindowItem-7z55Y4lK.98eb7487e039.js.gz +0 -0
- codex/static_root/assets/VWindowItem-7z55Y4lK.js +0 -1
- codex/static_root/assets/VWindowItem-7z55Y4lK.js.br +0 -0
- codex/static_root/assets/VWindowItem-7z55Y4lK.js.gz +0 -0
- codex/static_root/assets/admin-D3OK784R.f69891726ec5.js +0 -1
- codex/static_root/assets/admin-D3OK784R.f69891726ec5.js.br +0 -0
- codex/static_root/assets/admin-D3OK784R.f69891726ec5.js.gz +0 -0
- codex/static_root/assets/admin-D3OK784R.js +0 -1
- codex/static_root/assets/admin-D3OK784R.js.br +0 -0
- codex/static_root/assets/admin-D3OK784R.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-1pnfvY8O.5438f252970e.js +0 -30
- codex/static_root/assets/admin-drawer-panel-1pnfvY8O.5438f252970e.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-1pnfvY8O.5438f252970e.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-1pnfvY8O.js +0 -30
- codex/static_root/assets/admin-drawer-panel-1pnfvY8O.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-1pnfvY8O.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-o87BwD38.ce39427c8201.css.br +0 -0
- codex/static_root/assets/admin-drawer-panel-o87BwD38.ce39427c8201.css.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-o87BwD38.css.br +0 -0
- codex/static_root/assets/admin-drawer-panel-o87BwD38.css.gz +0 -0
- codex/static_root/assets/browser-BuU2x9y7.css +0 -1
- codex/static_root/assets/browser-BuU2x9y7.css.br +0 -0
- codex/static_root/assets/browser-BuU2x9y7.css.gz +0 -0
- codex/static_root/assets/browser-BuU2x9y7.f67595d24664.css +0 -1
- codex/static_root/assets/browser-BuU2x9y7.f67595d24664.css.br +0 -0
- codex/static_root/assets/browser-BuU2x9y7.f67595d24664.css.gz +0 -0
- codex/static_root/assets/browser-CO9EYHIr.be49367c6a75.js +0 -1
- codex/static_root/assets/browser-CO9EYHIr.be49367c6a75.js.br +0 -0
- codex/static_root/assets/browser-CO9EYHIr.be49367c6a75.js.gz +0 -0
- codex/static_root/assets/browser-CO9EYHIr.js +0 -1
- codex/static_root/assets/browser-CO9EYHIr.js.br +0 -0
- codex/static_root/assets/browser-CO9EYHIr.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-CjZdzaIk.188c765431ab.js +0 -1
- codex/static_root/assets/change-password-dialog-CjZdzaIk.188c765431ab.js.br +0 -0
- codex/static_root/assets/change-password-dialog-CjZdzaIk.188c765431ab.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-CjZdzaIk.js +0 -1
- codex/static_root/assets/change-password-dialog-CjZdzaIk.js.br +0 -0
- codex/static_root/assets/change-password-dialog-CjZdzaIk.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-HvIvmmIE.73be0c8a8278.css +0 -1
- codex/static_root/assets/change-password-dialog-HvIvmmIE.73be0c8a8278.css.br +0 -0
- codex/static_root/assets/change-password-dialog-HvIvmmIE.73be0c8a8278.css.gz +0 -0
- codex/static_root/assets/change-password-dialog-HvIvmmIE.css +0 -1
- codex/static_root/assets/change-password-dialog-HvIvmmIE.css.br +0 -0
- codex/static_root/assets/change-password-dialog-HvIvmmIE.css.gz +0 -0
- codex/static_root/assets/confirm-dialog-jwL7B98r.1cfd579cbcfe.js.br +0 -0
- codex/static_root/assets/confirm-dialog-jwL7B98r.1cfd579cbcfe.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-jwL7B98r.js.br +0 -0
- codex/static_root/assets/confirm-dialog-jwL7B98r.js.gz +0 -0
- codex/static_root/assets/datetime-column-9w3GcKvo.f9172256f091.js +0 -1
- codex/static_root/assets/datetime-column-9w3GcKvo.f9172256f091.js.br +0 -0
- codex/static_root/assets/datetime-column-9w3GcKvo.f9172256f091.js.gz +0 -0
- codex/static_root/assets/datetime-column-9w3GcKvo.js +0 -1
- codex/static_root/assets/datetime-column-9w3GcKvo.js.br +0 -0
- codex/static_root/assets/datetime-column-9w3GcKvo.js.gz +0 -0
- codex/static_root/assets/filter-C-pghOri.eeb7c2ecf398.js +0 -1
- codex/static_root/assets/filter-C-pghOri.eeb7c2ecf398.js.br +0 -0
- codex/static_root/assets/filter-C-pghOri.eeb7c2ecf398.js.gz +0 -0
- codex/static_root/assets/filter-C-pghOri.js +0 -1
- codex/static_root/assets/filter-C-pghOri.js.br +0 -0
- codex/static_root/assets/filter-C-pghOri.js.gz +0 -0
- codex/static_root/assets/flag-tab-Da2DBNyz.ffbe5ca37e1c.js.br +0 -0
- codex/static_root/assets/flag-tab-Da2DBNyz.ffbe5ca37e1c.js.gz +0 -0
- codex/static_root/assets/flag-tab-Da2DBNyz.js.br +0 -0
- codex/static_root/assets/flag-tab-Da2DBNyz.js.gz +0 -0
- codex/static_root/assets/group-tab-BONYWOc1.6ddf321a4a56.js.br +0 -0
- codex/static_root/assets/group-tab-BONYWOc1.6ddf321a4a56.js.gz +0 -0
- codex/static_root/assets/group-tab-BONYWOc1.js.br +0 -0
- codex/static_root/assets/group-tab-BONYWOc1.js.gz +0 -0
- codex/static_root/assets/http-error-D2Jnc20C.32846bc3a43d.js.br +0 -0
- codex/static_root/assets/http-error-D2Jnc20C.32846bc3a43d.js.gz +0 -0
- codex/static_root/assets/http-error-D2Jnc20C.js.br +0 -0
- codex/static_root/assets/http-error-D2Jnc20C.js.gz +0 -0
- codex/static_root/assets/library-tab-B419agXA.d4b778172aaa.js.br +0 -0
- codex/static_root/assets/library-tab-B419agXA.d4b778172aaa.js.gz +0 -0
- codex/static_root/assets/library-tab-B419agXA.js.br +0 -0
- codex/static_root/assets/library-tab-B419agXA.js.gz +0 -0
- codex/static_root/assets/main-CMQwJ9aG.9836fe81c80a.js +0 -32
- codex/static_root/assets/main-CMQwJ9aG.9836fe81c80a.js.br +0 -0
- codex/static_root/assets/main-CMQwJ9aG.9836fe81c80a.js.gz +0 -0
- codex/static_root/assets/main-CMQwJ9aG.js +0 -32
- codex/static_root/assets/main-CMQwJ9aG.js.br +0 -0
- codex/static_root/assets/main-CMQwJ9aG.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-DWdp_kmz.css +0 -1
- codex/static_root/assets/pagination-toolbar-DWdp_kmz.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-DWdp_kmz.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-DWdp_kmz.f98f47e87612.css +0 -1
- codex/static_root/assets/pagination-toolbar-DWdp_kmz.f98f47e87612.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-DWdp_kmz.f98f47e87612.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-LTuj5U-G.a295defbcd2f.js +0 -1
- codex/static_root/assets/pagination-toolbar-LTuj5U-G.a295defbcd2f.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-LTuj5U-G.a295defbcd2f.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-LTuj5U-G.js +0 -1
- codex/static_root/assets/pagination-toolbar-LTuj5U-G.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-LTuj5U-G.js.gz +0 -0
- codex/static_root/assets/pdf-doc-8RVZqILx.2e7166dd26fb.js.br +0 -0
- codex/static_root/assets/pdf-doc-8RVZqILx.2e7166dd26fb.js.gz +0 -0
- codex/static_root/assets/pdf-doc-8RVZqILx.js.br +0 -0
- codex/static_root/assets/pdf-doc-8RVZqILx.js.gz +0 -0
- codex/static_root/assets/reader-CCCfpM3x.1553e45bd775.css.br +0 -0
- codex/static_root/assets/reader-CCCfpM3x.1553e45bd775.css.gz +0 -0
- codex/static_root/assets/reader-CCCfpM3x.css.br +0 -0
- codex/static_root/assets/reader-CCCfpM3x.css.gz +0 -0
- codex/static_root/assets/reader-DNnK_Chr.114d0e321547.js +0 -2
- codex/static_root/assets/reader-DNnK_Chr.114d0e321547.js.br +0 -0
- codex/static_root/assets/reader-DNnK_Chr.114d0e321547.js.gz +0 -0
- codex/static_root/assets/reader-DNnK_Chr.js +0 -2
- codex/static_root/assets/reader-DNnK_Chr.js.br +0 -0
- codex/static_root/assets/reader-DNnK_Chr.js.gz +0 -0
- codex/static_root/assets/relation-chips-PYua7aXv.428ba0b5861e.js +0 -1
- codex/static_root/assets/relation-chips-PYua7aXv.428ba0b5861e.js.br +0 -0
- codex/static_root/assets/relation-chips-PYua7aXv.428ba0b5861e.js.gz +0 -0
- codex/static_root/assets/relation-chips-PYua7aXv.js +0 -1
- codex/static_root/assets/relation-chips-PYua7aXv.js.br +0 -0
- codex/static_root/assets/relation-chips-PYua7aXv.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DbN6ISRH.d14f525d8eee.js +0 -2
- codex/static_root/assets/settings-drawer-DbN6ISRH.d14f525d8eee.js.br +0 -0
- codex/static_root/assets/settings-drawer-DbN6ISRH.d14f525d8eee.js.gz +0 -0
- codex/static_root/assets/settings-drawer-DbN6ISRH.js +0 -2
- codex/static_root/assets/settings-drawer-DbN6ISRH.js.br +0 -0
- codex/static_root/assets/settings-drawer-DbN6ISRH.js.gz +0 -0
- codex/static_root/assets/stats-tab-DImNhH8O.d5026283841a.js +0 -1
- codex/static_root/assets/stats-tab-DImNhH8O.d5026283841a.js.br +0 -0
- codex/static_root/assets/stats-tab-DImNhH8O.d5026283841a.js.gz +0 -0
- codex/static_root/assets/stats-tab-DImNhH8O.js +0 -1
- codex/static_root/assets/stats-tab-DImNhH8O.js.br +0 -0
- codex/static_root/assets/stats-tab-DImNhH8O.js.gz +0 -0
- codex/static_root/assets/stats-tab-TsyG3wH_.b93c080356fc.css +0 -1
- codex/static_root/assets/stats-tab-TsyG3wH_.b93c080356fc.css.br +0 -2
- codex/static_root/assets/stats-tab-TsyG3wH_.b93c080356fc.css.gz +0 -0
- codex/static_root/assets/stats-tab-TsyG3wH_.css +0 -1
- codex/static_root/assets/stats-tab-TsyG3wH_.css.br +0 -2
- codex/static_root/assets/stats-tab-TsyG3wH_.css.gz +0 -0
- codex/static_root/assets/task-tab-DPD53kjv.e56a35ff1691.js +0 -1
- codex/static_root/assets/task-tab-DPD53kjv.e56a35ff1691.js.br +0 -0
- codex/static_root/assets/task-tab-DPD53kjv.e56a35ff1691.js.gz +0 -0
- codex/static_root/assets/task-tab-DPD53kjv.js +0 -1
- codex/static_root/assets/task-tab-DPD53kjv.js.br +0 -0
- codex/static_root/assets/task-tab-DPD53kjv.js.gz +0 -0
- codex/static_root/assets/to-case-ehC9Ccyj.a7b8e25b391f.js +0 -1
- codex/static_root/assets/to-case-ehC9Ccyj.js +0 -1
- codex/static_root/assets/unauthorized-BOIx7Y18.ee3961abfccb.js +0 -1
- codex/static_root/assets/unauthorized-BOIx7Y18.ee3961abfccb.js.br +0 -0
- codex/static_root/assets/unauthorized-BOIx7Y18.ee3961abfccb.js.gz +0 -0
- codex/static_root/assets/unauthorized-BOIx7Y18.js +0 -1
- codex/static_root/assets/unauthorized-BOIx7Y18.js.br +0 -0
- codex/static_root/assets/unauthorized-BOIx7Y18.js.gz +0 -0
- codex/static_root/assets/unauthorized-DHV6Q1n-.b7847b2872a1.css.br +0 -0
- codex/static_root/assets/unauthorized-DHV6Q1n-.b7847b2872a1.css.gz +0 -0
- codex/static_root/assets/unauthorized-DHV6Q1n-.css.br +0 -0
- codex/static_root/assets/unauthorized-DHV6Q1n-.css.gz +0 -0
- codex/static_root/assets/user-tab-BABwfxLO.37dd0440fbdd.js +0 -1
- codex/static_root/assets/user-tab-BABwfxLO.37dd0440fbdd.js.br +0 -0
- codex/static_root/assets/user-tab-BABwfxLO.37dd0440fbdd.js.gz +0 -0
- codex/static_root/assets/user-tab-BABwfxLO.js +0 -1
- codex/static_root/assets/user-tab-BABwfxLO.js.br +0 -0
- codex/static_root/assets/user-tab-BABwfxLO.js.gz +0 -0
- codex/static_root/js/choices-admin.d790df01c20a.json +0 -1
- codex/static_root/js/choices-admin.d790df01c20a.json.br +0 -0
- codex/static_root/js/choices-admin.d790df01c20a.json.gz +0 -0
- codex/static_root/js/choices.a0aaaa6c7ef7.json.br +0 -0
- codex/static_root/js/choices.a0aaaa6c7ef7.json.gz +0 -0
- codex/static_root/manifest.cbea5663003a.json +0 -629
- codex/static_root/manifest.cbea5663003a.json.br +0 -0
- codex/static_root/manifest.cbea5663003a.json.gz +0 -0
- {codex-1.6.0a9.dist-info → codex-1.6.0a11.dist-info}/LICENSE +0 -0
- {codex-1.6.0a9.dist-info → codex-1.6.0a11.dist-info}/WHEEL +0 -0
- {codex-1.6.0a9.dist-info → codex-1.6.0a11.dist-info}/entry_points.txt +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from types import MappingProxyType
|
|
4
4
|
|
|
5
|
+
from rest_framework.fields import SerializerMethodField
|
|
5
6
|
from rest_framework.serializers import (
|
|
6
7
|
BooleanField,
|
|
7
8
|
CharField,
|
|
@@ -10,19 +11,21 @@ from rest_framework.serializers import (
|
|
|
10
11
|
IntegerField,
|
|
11
12
|
Serializer,
|
|
12
13
|
)
|
|
14
|
+
from rest_framework.utils.serializer_helpers import ReturnList
|
|
13
15
|
|
|
14
|
-
from codex.serializers.browser.filters import
|
|
16
|
+
from codex.serializers.browser.filters import BrowserSettingsFilterSerializer
|
|
17
|
+
from codex.serializers.fields import (
|
|
15
18
|
BooleanListField,
|
|
16
|
-
BrowserSettingsFilterSerializer,
|
|
17
19
|
CharListField,
|
|
18
20
|
DecadeListField,
|
|
19
21
|
FloatListField,
|
|
20
22
|
IntListField,
|
|
21
23
|
)
|
|
24
|
+
from codex.serializers.models.pycountry import CountrySerializer, LanguageSerializer
|
|
22
25
|
|
|
23
26
|
|
|
24
27
|
class BrowserChoicesCharPkSerializer(Serializer):
|
|
25
|
-
"""Named Model
|
|
28
|
+
"""Named Model Serializer."""
|
|
26
29
|
|
|
27
30
|
pk = CharField(read_only=True)
|
|
28
31
|
name = CharField(read_only=True)
|
|
@@ -56,11 +59,36 @@ _CHOICES_TYPE_SERIALIZER_MAP = MappingProxyType(
|
|
|
56
59
|
IntListField: BrowserChoicesIntPkSerializer,
|
|
57
60
|
}
|
|
58
61
|
)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
CHOICES_SERIALIZER_CLASS_MAP = MappingProxyType(
|
|
62
|
-
{
|
|
63
|
-
name: _CHOICES_TYPE_SERIALIZER_MAP[field.__class__]
|
|
64
|
-
for name, field in _BSFS().fields.items() # type: ignore
|
|
65
|
-
}
|
|
62
|
+
_CHOICES_NAME_SERIALIZER_MAP = MappingProxyType(
|
|
63
|
+
{"country": CountrySerializer, "language": LanguageSerializer}
|
|
66
64
|
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _create_choices_field_serializer_map():
|
|
68
|
+
serializer_map = {}
|
|
69
|
+
for name, field in BrowserSettingsFilterSerializer().fields.items(): # type: ignore
|
|
70
|
+
serializer_class = _CHOICES_NAME_SERIALIZER_MAP.get(name)
|
|
71
|
+
if not serializer_class:
|
|
72
|
+
serializer_class = _CHOICES_TYPE_SERIALIZER_MAP[field.__class__]
|
|
73
|
+
serializer_map[name] = serializer_class
|
|
74
|
+
|
|
75
|
+
return MappingProxyType(serializer_map)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
_CHOICES_SERIALIZER_CLASS_MAP = _create_choices_field_serializer_map()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class BrowserChoicesFilterSerializer(Serializer):
|
|
82
|
+
"""Dynamic Serializer response by field type."""
|
|
83
|
+
|
|
84
|
+
choices = SerializerMethodField(read_only=True)
|
|
85
|
+
|
|
86
|
+
def get_choices(self, obj) -> ReturnList:
|
|
87
|
+
"""Dynamic Serializer response by field type."""
|
|
88
|
+
key = obj.get("field_name", "")
|
|
89
|
+
choices = obj.get("choices", [])
|
|
90
|
+
serializer_class = _CHOICES_SERIALIZER_CLASS_MAP.get(
|
|
91
|
+
key, BrowserChoicesCharPkSerializer
|
|
92
|
+
)
|
|
93
|
+
serializer = serializer_class(choices, many=True)
|
|
94
|
+
return serializer.data # type: ignore
|
|
@@ -53,14 +53,14 @@ class BrowserSettingsFilterSerializer(Serializer):
|
|
|
53
53
|
age_rating = CharListField(allow_blank=True, required=False)
|
|
54
54
|
characters = IntListField(required=False)
|
|
55
55
|
community_rating = FloatListField(required=False)
|
|
56
|
-
country =
|
|
56
|
+
country = IntListField(required=False)
|
|
57
57
|
contributors = IntListField(required=False)
|
|
58
58
|
critical_rating = FloatListField(required=False)
|
|
59
59
|
decade = DecadeListField(required=False)
|
|
60
60
|
file_type = CharListField(allow_blank=True, required=False)
|
|
61
61
|
genres = IntListField(required=False)
|
|
62
62
|
identifier_type = CharListField(allow_blank=True, required=False)
|
|
63
|
-
language =
|
|
63
|
+
language = IntListField(required=False)
|
|
64
64
|
locations = IntListField()
|
|
65
65
|
monochrome = BooleanListField(required=False)
|
|
66
66
|
original_format = CharListField(required=False, allow_blank=True)
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
"""Codex Serializers for the metadata box."""
|
|
2
2
|
|
|
3
|
-
from rest_framework.serializers import CharField, IntegerField
|
|
3
|
+
from rest_framework.serializers import CharField, IntegerField, ListField, Serializer
|
|
4
4
|
|
|
5
5
|
from codex.serializers.browser.mixins import BrowserAggregateSerializerMixin
|
|
6
6
|
from codex.serializers.models.comic import ComicSerializer
|
|
7
|
+
from codex.serializers.models.named import (
|
|
8
|
+
ContributorSerializer,
|
|
9
|
+
IdentifierSeralizer,
|
|
10
|
+
StoryArcNumberSerializer,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
PREFETCH_PREFIX = "attached_"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class GroupSerializer(Serializer):
|
|
17
|
+
"""Serialize a group pk and name."""
|
|
18
|
+
|
|
19
|
+
ids = ListField(child=IntegerField(), read_only=True)
|
|
20
|
+
name = CharField(read_only=True)
|
|
7
21
|
|
|
8
22
|
|
|
9
23
|
class MetadataSerializer(BrowserAggregateSerializerMixin, ComicSerializer):
|
|
@@ -13,3 +27,33 @@ class MetadataSerializer(BrowserAggregateSerializerMixin, ComicSerializer):
|
|
|
13
27
|
parent_folder_id = IntegerField(read_only=True, required=False)
|
|
14
28
|
series_volume_count = IntegerField(read_only=True)
|
|
15
29
|
volume_issue_count = IntegerField(read_only=True)
|
|
30
|
+
|
|
31
|
+
publisher_list = GroupSerializer(many=True, required=False)
|
|
32
|
+
imprint_list = GroupSerializer(many=True, required=False)
|
|
33
|
+
series_list = GroupSerializer(many=True, required=False)
|
|
34
|
+
volume_list = GroupSerializer(many=True, required=False)
|
|
35
|
+
publisher = None
|
|
36
|
+
imprint = None
|
|
37
|
+
series = None
|
|
38
|
+
volume = None
|
|
39
|
+
|
|
40
|
+
identifiers = IdentifierSeralizer(
|
|
41
|
+
source=f"{PREFETCH_PREFIX}identifiers", many=True, allow_null=True
|
|
42
|
+
)
|
|
43
|
+
contributors = ContributorSerializer(
|
|
44
|
+
source=f"{PREFETCH_PREFIX}contributors", many=True, allow_null=True
|
|
45
|
+
)
|
|
46
|
+
stroy_arc_numbers = StoryArcNumberSerializer(
|
|
47
|
+
source=f"{PREFETCH_PREFIX}story_arc_numbers", many=True, allow_null=True
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
class Meta(ComicSerializer.Meta):
|
|
51
|
+
"""Configure the model."""
|
|
52
|
+
|
|
53
|
+
exclude = (
|
|
54
|
+
*ComicSerializer.Meta.exclude,
|
|
55
|
+
"publisher",
|
|
56
|
+
"imprint",
|
|
57
|
+
"series",
|
|
58
|
+
"volume",
|
|
59
|
+
)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""Serializer mixins."""
|
|
2
2
|
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
|
|
3
5
|
from rest_framework.serializers import (
|
|
4
6
|
BooleanField,
|
|
5
7
|
CharField,
|
|
@@ -7,10 +9,14 @@ from rest_framework.serializers import (
|
|
|
7
9
|
DecimalField,
|
|
8
10
|
IntegerField,
|
|
9
11
|
Serializer,
|
|
12
|
+
SerializerMethodField,
|
|
10
13
|
)
|
|
11
14
|
|
|
15
|
+
from codex.logger.logging import get_logger
|
|
12
16
|
from codex.serializers.browser.filters import IntListField
|
|
13
|
-
from codex.
|
|
17
|
+
from codex.views.const import COMIC_GROUP, EPOCH_START
|
|
18
|
+
|
|
19
|
+
LOG = get_logger(__name__)
|
|
14
20
|
|
|
15
21
|
|
|
16
22
|
class BrowserAggregateSerializerMixin(Serializer):
|
|
@@ -21,7 +27,7 @@ class BrowserAggregateSerializerMixin(Serializer):
|
|
|
21
27
|
|
|
22
28
|
# Aggregate Annotations
|
|
23
29
|
child_count = IntegerField(read_only=True)
|
|
24
|
-
mtime =
|
|
30
|
+
mtime = SerializerMethodField(read_only=True)
|
|
25
31
|
|
|
26
32
|
# Bookmark annotations
|
|
27
33
|
page = IntegerField(read_only=True)
|
|
@@ -30,3 +36,30 @@ class BrowserAggregateSerializerMixin(Serializer):
|
|
|
30
36
|
progress = DecimalField(
|
|
31
37
|
max_digits=5, decimal_places=2, read_only=True, coerce_to_string=False
|
|
32
38
|
)
|
|
39
|
+
|
|
40
|
+
def get_mtime(self, obj) -> int:
|
|
41
|
+
"""Compute mtime from json array aggregates."""
|
|
42
|
+
mtime = EPOCH_START
|
|
43
|
+
for dt_str in obj.updated_ats:
|
|
44
|
+
if not dt_str:
|
|
45
|
+
continue
|
|
46
|
+
try:
|
|
47
|
+
dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S.%f").replace(
|
|
48
|
+
tzinfo=timezone.utc
|
|
49
|
+
)
|
|
50
|
+
except ValueError:
|
|
51
|
+
LOG.warning(
|
|
52
|
+
f"computing group mtime: {dt_str} is not a valid datetime string."
|
|
53
|
+
)
|
|
54
|
+
continue
|
|
55
|
+
|
|
56
|
+
if dt > mtime:
|
|
57
|
+
mtime = dt
|
|
58
|
+
|
|
59
|
+
if obj.group != COMIC_GROUP and (
|
|
60
|
+
mbua := getattr(obj, "max_bookmark_updated_at", None)
|
|
61
|
+
):
|
|
62
|
+
mtime = max(mtime, mbua)
|
|
63
|
+
|
|
64
|
+
# print(obj.group, obj.pk, obj.name, obj.updated_ats, obj.max_bookmark_updated_at, "max:", mtime)
|
|
65
|
+
return int(mtime.timestamp() * 1000)
|
|
@@ -5,15 +5,13 @@ from rest_framework.serializers import (
|
|
|
5
5
|
CharField,
|
|
6
6
|
DecimalField,
|
|
7
7
|
IntegerField,
|
|
8
|
-
ListSerializer,
|
|
9
8
|
Serializer,
|
|
10
9
|
)
|
|
11
10
|
|
|
12
11
|
from codex.serializers.browser.mixins import (
|
|
13
12
|
BrowserAggregateSerializerMixin,
|
|
14
13
|
)
|
|
15
|
-
from codex.serializers.fields import TimestampField
|
|
16
|
-
from codex.serializers.route import RouteSerializer
|
|
14
|
+
from codex.serializers.fields import BreadcrumbsField, TimestampField
|
|
17
15
|
|
|
18
16
|
|
|
19
17
|
class BrowserCardSerializer(BrowserAggregateSerializerMixin):
|
|
@@ -54,7 +52,7 @@ class BrowserPageSerializer(Serializer):
|
|
|
54
52
|
"""The main browse list."""
|
|
55
53
|
|
|
56
54
|
admin_flags = BrowserAdminFlagsSerializer(read_only=True)
|
|
57
|
-
breadcrumbs =
|
|
55
|
+
breadcrumbs = BreadcrumbsField(read_only=True)
|
|
58
56
|
title = BrowserTitleSerializer(read_only=True)
|
|
59
57
|
zero_pad = IntegerField(read_only=True)
|
|
60
58
|
libraries_exist = BooleanField(read_only=True)
|
|
@@ -10,7 +10,8 @@ from rest_framework.serializers import (
|
|
|
10
10
|
|
|
11
11
|
from codex.serializers.browser.filters import BrowserSettingsFilterSerializer
|
|
12
12
|
from codex.serializers.choices import CHOICES, VUETIFY_NULL_CODE
|
|
13
|
-
from codex.serializers.fields import TimestampField
|
|
13
|
+
from codex.serializers.fields import BreadcrumbsField, TimestampField, TopGroupField
|
|
14
|
+
from codex.serializers.route import SimpleRouteSerializer
|
|
14
15
|
|
|
15
16
|
VUETIFY_NULL_CODE_STR = str(VUETIFY_NULL_CODE)
|
|
16
17
|
|
|
@@ -24,24 +25,50 @@ class BrowserSettingsShowGroupFlagsSerializer(Serializer):
|
|
|
24
25
|
v = BooleanField()
|
|
25
26
|
|
|
26
27
|
|
|
27
|
-
class
|
|
28
|
-
"""Browser Settings
|
|
29
|
-
|
|
30
|
-
This is the only browse serializer that's submitted.
|
|
31
|
-
It is also sent to the browser as part of BrowserOpenedSerializer.
|
|
32
|
-
"""
|
|
28
|
+
class BrowserFilterChoicesInputSerilalizer(Serializer):
|
|
29
|
+
"""Browser Settings for the filter choices response."""
|
|
33
30
|
|
|
34
31
|
filters = BrowserSettingsFilterSerializer(required=False)
|
|
32
|
+
q = CharField(allow_blank=True, required=False)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class BrowserCoverInputSerializerBase(BrowserFilterChoicesInputSerilalizer):
|
|
36
|
+
"""Base Serializer for Cover and Settings."""
|
|
37
|
+
|
|
38
|
+
custom_covers = BooleanField(required=False)
|
|
39
|
+
dynamic_covers = BooleanField(required=False)
|
|
35
40
|
order_by = ChoiceField(choices=tuple(CHOICES["orderBy"].keys()), required=False)
|
|
36
41
|
order_reverse = BooleanField(required=False)
|
|
37
|
-
q = CharField(allow_blank=True, required=False)
|
|
38
|
-
query = CharField(allow_blank=True, required=False) # OPDS 2.0
|
|
39
42
|
show = BrowserSettingsShowGroupFlagsSerializer(required=False)
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class BrowserCoverInputSerializer(BrowserCoverInputSerializerBase):
|
|
46
|
+
"""Browser Settings for the cover response."""
|
|
47
|
+
|
|
48
|
+
parent = SimpleRouteSerializer(required=False)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class BrowserSettingsSerializerBase(BrowserCoverInputSerializerBase):
|
|
52
|
+
"""Base Serializer for Browser & OPDS Settings."""
|
|
53
|
+
|
|
42
54
|
# search_results_limit = IntegerField(required=False)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
55
|
+
top_group = TopGroupField(required=False)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class OPDSSettingsSerializer(BrowserSettingsSerializerBase):
|
|
59
|
+
"""Browser Settings for the OPDS."""
|
|
60
|
+
|
|
46
61
|
limit = IntegerField(required=False)
|
|
62
|
+
opds_metadata = BooleanField(required=False)
|
|
63
|
+
query = CharField(allow_blank=True, required=False) # OPDS 2.0
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class BrowserSettingsSerializer(BrowserSettingsSerializerBase):
|
|
67
|
+
"""Browser Settings that the user can change.
|
|
68
|
+
|
|
69
|
+
This is the only browse serializer that's submitted.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
breadcrumbs = BreadcrumbsField(required=False)
|
|
47
73
|
mtime = TimestampField(read_only=True)
|
|
74
|
+
twenty_four_hour_time = BooleanField(required=False)
|
codex/serializers/choices.py
CHANGED
|
@@ -53,10 +53,13 @@ _SINGLE_VALUE_KEYS = frozenset(
|
|
|
53
53
|
{
|
|
54
54
|
"customCovers",
|
|
55
55
|
"dynamicCovers",
|
|
56
|
+
"finishOnLastPage",
|
|
56
57
|
"orderReverse",
|
|
57
58
|
"q",
|
|
59
|
+
"readRtlInReverse",
|
|
58
60
|
"searchResultsLimit",
|
|
59
61
|
"twentyFourHourTime",
|
|
62
|
+
"twoPages",
|
|
60
63
|
}
|
|
61
64
|
)
|
|
62
65
|
|
|
@@ -65,6 +68,7 @@ CHOICES = {}
|
|
|
65
68
|
DEFAULTS = {}
|
|
66
69
|
WEBSOCKET_MESSAGES = {}
|
|
67
70
|
VUETIFY_NULL_CODE = -1
|
|
71
|
+
DUMMY_NULL_NAME = "_none_"
|
|
68
72
|
|
|
69
73
|
|
|
70
74
|
def _find_filename_regex(js_root, module_name):
|
codex/serializers/fields.py
CHANGED
|
@@ -3,20 +3,25 @@
|
|
|
3
3
|
from abc import ABC
|
|
4
4
|
from datetime import datetime, timezone
|
|
5
5
|
|
|
6
|
+
import pycountry
|
|
6
7
|
from django.core.exceptions import ValidationError
|
|
7
8
|
from django.utils.translation import gettext_lazy as _
|
|
8
9
|
from rest_framework.fields import Field
|
|
9
10
|
from rest_framework.serializers import (
|
|
10
11
|
BooleanField,
|
|
11
12
|
CharField,
|
|
13
|
+
ChoiceField,
|
|
12
14
|
FloatField,
|
|
13
15
|
IntegerField,
|
|
14
16
|
ListField,
|
|
15
17
|
)
|
|
16
18
|
|
|
17
|
-
from codex.
|
|
19
|
+
from codex.logger.logging import get_logger
|
|
20
|
+
from codex.serializers.choices import CHOICES, DUMMY_NULL_NAME, VUETIFY_NULL_CODE
|
|
21
|
+
from codex.serializers.route import RouteSerializer
|
|
18
22
|
|
|
19
23
|
VUETIFY_NULL_CODE_STR = str(VUETIFY_NULL_CODE)
|
|
24
|
+
LOG = get_logger(__name__)
|
|
20
25
|
|
|
21
26
|
|
|
22
27
|
class TimestampField(IntegerField):
|
|
@@ -120,3 +125,58 @@ class BooleanListField(FilterListField):
|
|
|
120
125
|
|
|
121
126
|
CHILD_CLASS = BooleanField # type: ignore
|
|
122
127
|
VALIDATORS = (validate_int_null,)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class BreadcrumbsField(ListField):
|
|
131
|
+
"""And Array of Routes."""
|
|
132
|
+
|
|
133
|
+
child = RouteSerializer()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class TopGroupField(ChoiceField):
|
|
137
|
+
"""Valid Top Groups Only."""
|
|
138
|
+
|
|
139
|
+
class_choices = tuple(CHOICES["topGroup"].keys())
|
|
140
|
+
|
|
141
|
+
def __init__(self, *args, **kwargs):
|
|
142
|
+
"""Initialize with choices."""
|
|
143
|
+
super().__init__(*args, choices=self.class_choices, **kwargs)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class PyCountryField(CharField, ABC):
|
|
147
|
+
"""Serialize to a long pycountry name."""
|
|
148
|
+
|
|
149
|
+
LOOKUP_MODULE = pycountry.countries
|
|
150
|
+
_ALPHA_2_LEN = 2
|
|
151
|
+
|
|
152
|
+
def to_representation(self, value):
|
|
153
|
+
"""Lookup the name with pycountry, just copy the value on fail."""
|
|
154
|
+
if not value:
|
|
155
|
+
return ""
|
|
156
|
+
if value == DUMMY_NULL_NAME:
|
|
157
|
+
return value
|
|
158
|
+
try:
|
|
159
|
+
# fix for https://github.com/flyingcircusio/pycountry/issues/41
|
|
160
|
+
lookup_obj = (
|
|
161
|
+
self.LOOKUP_MODULE.get(alpha_2=value)
|
|
162
|
+
if len(value) == self._ALPHA_2_LEN
|
|
163
|
+
else self.LOOKUP_MODULE.lookup(value)
|
|
164
|
+
)
|
|
165
|
+
# If lookup fails, return the key as the name
|
|
166
|
+
except Exception:
|
|
167
|
+
LOG.warning(f"Could not serialize name with pycountry {value}")
|
|
168
|
+
return value
|
|
169
|
+
else:
|
|
170
|
+
return lookup_obj.name if lookup_obj else value
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class CountryField(PyCountryField):
|
|
174
|
+
"""Serializer to long country name."""
|
|
175
|
+
|
|
176
|
+
LOOKUP_MODULE = pycountry.countries
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class LanguageField(PyCountryField):
|
|
180
|
+
"""Serializer to long language name."""
|
|
181
|
+
|
|
182
|
+
LOOKUP_MODULE = pycountry.languages
|
|
@@ -1,73 +1,33 @@
|
|
|
1
1
|
"""Pycountry Model Serializers."""
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
from drf_spectacular.types import OpenApiTypes
|
|
5
|
-
from drf_spectacular.utils import extend_schema_field
|
|
6
|
-
from rest_framework.serializers import (
|
|
7
|
-
SerializerMethodField,
|
|
8
|
-
)
|
|
9
|
-
|
|
3
|
+
from codex.logger.logging import get_logger
|
|
10
4
|
from codex.models import (
|
|
11
5
|
Country,
|
|
12
6
|
Language,
|
|
13
7
|
)
|
|
8
|
+
from codex.serializers.fields import CountryField, LanguageField
|
|
14
9
|
from codex.serializers.models.named import NamedModelSerializer
|
|
15
10
|
|
|
11
|
+
LOG = get_logger(__name__)
|
|
16
12
|
|
|
17
|
-
class PyCountrySerializer(NamedModelSerializer):
|
|
18
|
-
"""PyCountry tag serializer to include long names.
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
the name.
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
LOOKUP_MODULE = pycountry.countries
|
|
26
|
-
_ALPHA_2_LEN = 2
|
|
14
|
+
class CountrySerializer(NamedModelSerializer):
|
|
15
|
+
"""Pycountry serializer for country field."""
|
|
27
16
|
|
|
28
|
-
name =
|
|
17
|
+
name = CountryField(read_only=True)
|
|
29
18
|
|
|
30
19
|
class Meta(NamedModelSerializer.Meta):
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
abstract = True
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def lookup_name(cls, lookup_module, obj):
|
|
37
|
-
"""Lookup the name with pycountry, just copy the key on fail."""
|
|
38
|
-
name = obj.name
|
|
39
|
-
if not name:
|
|
40
|
-
return ""
|
|
41
|
-
# fix for https://github.com/flyingcircusio/pycountry/issues/41
|
|
42
|
-
lookup_obj = (
|
|
43
|
-
lookup_module.get(alpha_2=name)
|
|
44
|
-
if len(name) == cls._ALPHA_2_LEN
|
|
45
|
-
else lookup_module.lookup(name)
|
|
46
|
-
)
|
|
47
|
-
# If lookup fails, return the key as the name
|
|
48
|
-
return lookup_obj.name if lookup_obj else name
|
|
20
|
+
"""Configure model."""
|
|
49
21
|
|
|
50
|
-
|
|
51
|
-
def get_name(self, obj):
|
|
52
|
-
"""Lookup the name with pycountry, just copy the key on fail."""
|
|
53
|
-
return self.lookup_name(self.LOOKUP_MODULE, obj)
|
|
22
|
+
model = Country
|
|
54
23
|
|
|
55
24
|
|
|
56
|
-
class LanguageSerializer(
|
|
25
|
+
class LanguageSerializer(NamedModelSerializer):
|
|
57
26
|
"""Pycountry serializer for language field."""
|
|
58
27
|
|
|
59
|
-
|
|
28
|
+
name = LanguageField(read_only=True)
|
|
60
29
|
|
|
61
|
-
class Meta(
|
|
30
|
+
class Meta(NamedModelSerializer.Meta):
|
|
62
31
|
"""Configure model."""
|
|
63
32
|
|
|
64
33
|
model = Language
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class CountrySerializer(PyCountrySerializer):
|
|
68
|
-
"""Pycountry serializer for country field."""
|
|
69
|
-
|
|
70
|
-
class Meta(PyCountrySerializer.Meta):
|
|
71
|
-
"""Configure model."""
|
|
72
|
-
|
|
73
|
-
model = Country
|
codex/serializers/reader.py
CHANGED
|
@@ -10,7 +10,8 @@ from rest_framework.serializers import (
|
|
|
10
10
|
)
|
|
11
11
|
|
|
12
12
|
from codex.models import Bookmark
|
|
13
|
-
from codex.serializers.
|
|
13
|
+
from codex.serializers.browser.settings import BrowserSettingsShowGroupFlagsSerializer
|
|
14
|
+
from codex.serializers.fields import BreadcrumbsField, TimestampField, TopGroupField
|
|
14
15
|
from codex.serializers.route import RouteSerializer, SimpleRouteSerializer
|
|
15
16
|
|
|
16
17
|
|
|
@@ -25,6 +26,7 @@ class ReaderSettingsSerializer(Serializer):
|
|
|
25
26
|
two_pages = BooleanField(allow_null=True, required=False)
|
|
26
27
|
reading_direction = CharField(allow_null=True, required=False)
|
|
27
28
|
read_rtl_in_reverse = BooleanField(allow_null=True, required=False)
|
|
29
|
+
finish_on_last_page = BooleanField(allow_null=True, required=False)
|
|
28
30
|
mtime = TimestampField(read_only=True)
|
|
29
31
|
|
|
30
32
|
|
|
@@ -47,6 +49,15 @@ class ReaderArcSerializer(SimpleRouteSerializer):
|
|
|
47
49
|
mtime = TimestampField(read_only=True)
|
|
48
50
|
|
|
49
51
|
|
|
52
|
+
class ReaderViewInputSerializer(Serializer):
|
|
53
|
+
"""Input for the reader serailizer."""
|
|
54
|
+
|
|
55
|
+
arc = ReaderArcSerializer(required=False)
|
|
56
|
+
breadcrumbs = BreadcrumbsField(required=False)
|
|
57
|
+
show = BrowserSettingsShowGroupFlagsSerializer(required=False)
|
|
58
|
+
top_group = TopGroupField(required=False)
|
|
59
|
+
|
|
60
|
+
|
|
50
61
|
class ReaderCurrentComicSerializer(ReaderComicSerializer):
|
|
51
62
|
"""Current comic only Serializer."""
|
|
52
63
|
|
codex/serializers/route.py
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Settings Serializer."""
|
|
2
|
+
|
|
3
|
+
from rest_framework.fields import BooleanField, CharField
|
|
4
|
+
from rest_framework.serializers import ListSerializer, Serializer
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SettingsSerializer(Serializer):
|
|
8
|
+
"""For requesting settings."""
|
|
9
|
+
|
|
10
|
+
only = ListSerializer(child=CharField(), required=False)
|
|
11
|
+
group = CharField(required=False)
|
|
12
|
+
breadcrumb_names = BooleanField(required=False, default=True)
|
codex/settings/settings.py
CHANGED
|
@@ -325,9 +325,18 @@ REST_REGISTRATION = {
|
|
|
325
325
|
SPECTACULAR_SETTINGS = {
|
|
326
326
|
"TITLE": "Codex API",
|
|
327
327
|
"DESCRIPTION": "Comic Library Browser and Reader",
|
|
328
|
+
"OAS_VERSION": "3.1.0",
|
|
328
329
|
"VERSION": "3.0.0",
|
|
329
|
-
"CONTACT": {
|
|
330
|
+
"CONTACT": {
|
|
331
|
+
"name": "Support",
|
|
332
|
+
"url": "https://github.com/ajslater/codex?tab=readme-ov-file#-support",
|
|
333
|
+
},
|
|
330
334
|
"PREPROCESSING_HOOKS": ["codex.urls.spectacular.allow_list"],
|
|
335
|
+
"SERVE_PERMISSIONS": ["rest_framework.permissions.IsAdminUser"],
|
|
336
|
+
"EXTERNAL_DOCS": {
|
|
337
|
+
"url": "https://github.com/ajslater/codex/",
|
|
338
|
+
"description": "Codex Docs",
|
|
339
|
+
},
|
|
331
340
|
}
|
|
332
341
|
|
|
333
342
|
CORS_ALLOW_CREDENTIALS = True
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as g,V as t}from"./VCheckboxBtn-DVq5lDK4.js";import{a as A,u as B,V as l}from"./VSelectionControl-BXJGg8No.js";import{E as I,ao as R,O as U,aw as w,F as D,h as E,R as M,cB as N,S as u,as as r}from"./admin-drawer-panel-Dmn4wEY3.js";const O=I({...A(),...R(g(),["inline"])},"VCheckbox"),q=U()({name:"VCheckbox",inheritAttrs:!1,props:O(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(e,c){let{attrs:d,slots:a}=c;const s=w(e,"modelValue"),{isFocused:n,focus:i,blur:m}=B(e),V=D(),p=E(()=>e.id||`checkbox-${V}`);return M(()=>{const[b,f]=N(d),v=l.filterProps(e),k=t.filterProps(e);return u(l,r({class:["v-checkbox",e.class]},b,v,{modelValue:s.value,"onUpdate:modelValue":o=>s.value=o,id:p.value,focused:n.value,style:e.style}),{...a,default:o=>{let{id:h,messagesId:x,isDisabled:P,isReadonly:C,isValid:y}=o;return u(t,r(k,{id:h.value,"aria-describedby":x.value,disabled:P.value,readonly:C.value},f,{error:y.value===!1,modelValue:s.value,"onUpdate:modelValue":F=>s.value=F,onFocus:i,onBlur:m}),a)}})}),{}}});export{q as V};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as g,V as t}from"./VCheckboxBtn-DVq5lDK4.js";import{a as A,u as B,V as l}from"./VSelectionControl-BXJGg8No.js";import{E as I,ao as R,O as U,aw as w,F as D,h as E,R as M,cB as N,S as u,as as r}from"./admin-drawer-panel-Dmn4wEY3.js";const O=I({...A(),...R(g(),["inline"])},"VCheckbox"),q=U()({name:"VCheckbox",inheritAttrs:!1,props:O(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(e,c){let{attrs:d,slots:a}=c;const s=w(e,"modelValue"),{isFocused:n,focus:i,blur:m}=B(e),V=D(),p=E(()=>e.id||`checkbox-${V}`);return M(()=>{const[b,f]=N(d),v=l.filterProps(e),k=t.filterProps(e);return u(l,r({class:["v-checkbox",e.class]},b,v,{modelValue:s.value,"onUpdate:modelValue":o=>s.value=o,id:p.value,focused:n.value,style:e.style}),{...a,default:o=>{let{id:h,messagesId:x,isDisabled:P,isReadonly:C,isValid:y}=o;return u(t,r(k,{id:h.value,"aria-describedby":x.value,disabled:P.value,readonly:C.value},f,{error:y.value===!1,modelValue:s.value,"onUpdate:modelValue":F=>s.value=F,onFocus:i,onBlur:m}),a)}})}),{}}});export{q as V};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as f,d as o}from"./VSelectionControl-
|
|
1
|
+
import{c as f,d as o}from"./VSelectionControl-BXJGg8No.js";import{E as V,bf as v,O as I,aw as c,h as l,R as h,ao as k,S as x,as as b}from"./admin-drawer-panel-Dmn4wEY3.js";const C=V({indeterminate:Boolean,indeterminateIcon:{type:v,default:"$checkboxIndeterminate"},...f({falseIcon:"$checkboxOff",trueIcon:"$checkboxOn"})},"VCheckboxBtn"),B=I()({name:"VCheckboxBtn",props:C(),emits:{"update:modelValue":e=>!0,"update:indeterminate":e=>!0},setup(e,r){let{slots:s}=r;const t=c(e,"indeterminate"),n=c(e,"modelValue");function u(a){t.value&&(t.value=!1)}const i=l(()=>t.value?e.indeterminateIcon:e.falseIcon),d=l(()=>t.value?e.indeterminateIcon:e.trueIcon);return h(()=>{const a=k(o.filterProps(e),["modelValue"]);return x(o,b(a,{modelValue:n.value,"onUpdate:modelValue":[m=>n.value=m,u],class:["v-checkbox-btn",e.class],style:e.style,type:"checkbox",falseIcon:i.value,trueIcon:d.value,"aria-checked":t.value?"mixed":void 0}),s)}),{}}});export{B as V,C as m};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as f,d as o}from"./VSelectionControl-
|
|
1
|
+
import{c as f,d as o}from"./VSelectionControl-BXJGg8No.js";import{E as V,bf as v,O as I,aw as c,h as l,R as h,ao as k,S as x,as as b}from"./admin-drawer-panel-Dmn4wEY3.js";const C=V({indeterminate:Boolean,indeterminateIcon:{type:v,default:"$checkboxIndeterminate"},...f({falseIcon:"$checkboxOff",trueIcon:"$checkboxOn"})},"VCheckboxBtn"),B=I()({name:"VCheckboxBtn",props:C(),emits:{"update:modelValue":e=>!0,"update:indeterminate":e=>!0},setup(e,r){let{slots:s}=r;const t=c(e,"indeterminate"),n=c(e,"modelValue");function u(a){t.value&&(t.value=!1)}const i=l(()=>t.value?e.indeterminateIcon:e.falseIcon),d=l(()=>t.value?e.indeterminateIcon:e.trueIcon);return h(()=>{const a=k(o.filterProps(e),["modelValue"]);return x(o,b(a,{modelValue:n.value,"onUpdate:modelValue":[m=>n.value=m,u],class:["v-checkbox-btn",e.class],style:e.style,type:"checkbox",falseIcon:i.value,trueIcon:d.value,"aria-checked":t.value?"mixed":void 0}),s)}),{}}});export{B as V,C as m};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{m as Ce,u as ke,V as pe,a as we,b as Se}from"./VSelect-BoKpXxwe.js";import{m as Fe,V as G}from"./VTextField-Aw8nKhY6.js";import{E as Ie,ao as Pe,b3 as De,O as Re,bZ as Ae,r as N,s as P,aw as J,h as b,cN as _e,aq as Te,cO as D,a as R,n as X,ag as Ee,R as Me,S as i,U as O,as as I,bw as Ne,aY as ee,cP as Oe,aP as le,cQ as Le,bi as Ke,aj as Ue,cR as Be,at as je,cS as qe,cT as ze}from"./admin-drawer-panel-Dmn4wEY3.js";import{m as He,u as $e}from"./filter-CuocBoS2.js";import{g as Qe}from"./VSelectionControl-BXJGg8No.js";import{V as We}from"./VCheckboxBtn-DVq5lDK4.js";function Ye(e,g,A){if(g==null)return e;if(Array.isArray(g))throw new Error("Multiple matches is not implemented");return typeof g=="number"&&~g?i(O,null,[i("span",{class:"v-combobox__unmask"},[e.substr(0,g)]),i("span",{class:"v-combobox__mask"},[e.substr(g,A)]),i("span",{class:"v-combobox__unmask"},[e.substr(g+A)])]):e}const Ze=Ie({autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...He({filterKeys:["title"]}),...Ce({hideNoData:!0,returnObject:!0}),...Pe(Fe({modelValue:null,role:"combobox"}),["validationValue","dirty","appendInnerIcon"]),...De({transition:!1})},"VCombobox"),tl=Re()({name:"VCombobox",props:Ze(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:search":e=>!0,"update:menu":e=>!0},setup(e,g){var W;let{emit:A,slots:o}=g;const{t:L}=Ae(),V=N(),x=P(!1),C=P(!0),K=P(!1),H=N(),$=N(),U=J(e,"menu"),c=b({get:()=>U.value,set:l=>{var t;U.value&&!l&&((t=H.value)!=null&&t.ΨopenChildren)||(U.value=l)}}),s=P(-1);let B=!1;const ae=b(()=>{var l;return(l=V.value)==null?void 0:l.color}),Q=b(()=>c.value?e.closeText:e.openText),{items:te,transformIn:ne,transformOut:ue}=_e(e),{textColorClasses:oe,textColorStyles:ie}=Te(ae),n=J(e,"modelValue",[],l=>ne(ze(l)),l=>{const t=ue(l);return e.multiple?t:t[0]??null}),F=Qe(),_=b(()=>!!(e.chips||o.chip)),y=b(()=>_.value||!!o.selection),k=P(!e.multiple&&!y.value?((W=n.value[0])==null?void 0:W.title)??"":""),v=b({get:()=>k.value,set:l=>{var t;if(k.value=l??"",!e.multiple&&!y.value&&(n.value=[D(e,l)]),l&&e.multiple&&((t=e.delimiters)!=null&&t.length)){const r=l.split(new RegExp(`(?:${e.delimiters.join("|")})+`));r.length>1&&(r.forEach(a=>{a=a.trim(),a&&h(D(e,a))}),k.value="")}l||(s.value=-1),C.value=!l}}),se=b(()=>typeof e.counterValue=="function"?e.counterValue(n.value):typeof e.counterValue=="number"?e.counterValue:e.multiple?n.value.length:v.value.length);R(k,l=>{B?X(()=>B=!1):x.value&&!c.value&&(c.value=!0),A("update:search",l)}),R(n,l=>{var t;!e.multiple&&!y.value&&(k.value=((t=l[0])==null?void 0:t.title)??"")});const{filteredItems:T,getMatches:re}=$e(e,te,()=>C.value?"":v.value),p=b(()=>e.hideSelected?T.value.filter(l=>!n.value.some(t=>t.value===l.value)):T.value),ce=b(()=>n.value.map(l=>l.value)),j=b(()=>{var t;return(e.autoSelectFirst===!0||e.autoSelectFirst==="exact"&&v.value===((t=p.value[0])==null?void 0:t.title))&&p.value.length>0&&!C.value&&!K.value}),q=b(()=>e.hideNoData&&!p.value.length||e.readonly||(F==null?void 0:F.isReadonly.value)),z=N(),{onListScroll:ve,onListKeydown:de}=ke(z,V);function fe(l){B=!0,e.openOnClear&&(c.value=!0)}function me(){q.value||(c.value=!0)}function be(l){q.value||(x.value&&(l.preventDefault(),l.stopPropagation()),c.value=!c.value)}function he(l){var a;if(qe(l)||e.readonly||F!=null&&F.isReadonly.value)return;const t=V.value.selectionStart,r=n.value.length;if((s.value>-1||["Enter","ArrowDown","ArrowUp"].includes(l.key))&&l.preventDefault(),["Enter","ArrowDown"].includes(l.key)&&(c.value=!0),["Escape"].includes(l.key)&&(c.value=!1),["Enter","Escape","Tab"].includes(l.key)&&(j.value&&["Enter","Tab"].includes(l.key)&&!n.value.some(u=>{let{value:m}=u;return m===p.value[0].value})&&h(T.value[0]),C.value=!0),l.key==="ArrowDown"&&j.value&&((a=z.value)==null||a.focus("next")),l.key==="Enter"&&v.value&&(h(D(e,v.value)),y.value&&(k.value="")),["Backspace","Delete"].includes(l.key)){if(!e.multiple&&y.value&&n.value.length>0&&!v.value)return h(n.value[0],!1);if(~s.value){const u=s.value;h(n.value[s.value],!1),s.value=u>=r-1?r-2:u}else l.key==="Backspace"&&!v.value&&(s.value=r-1)}if(e.multiple){if(l.key==="ArrowLeft"){if(s.value<0&&t>0)return;const u=s.value>-1?s.value-1:r-1;n.value[u]?s.value=u:(s.value=-1,V.value.setSelectionRange(v.value.length,v.value.length))}if(l.key==="ArrowRight"){if(s.value<0)return;const u=s.value+1;n.value[u]?s.value=u:(s.value=-1,V.value.setSelectionRange(0,0))}}}function ge(){var l;x.value&&(C.value=!0,(l=V.value)==null||l.focus())}function h(l){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(!(!l||l.props.disabled))if(e.multiple){const r=n.value.findIndex(u=>e.valueComparator(u.value,l.value)),a=t??!~r;if(~r){const u=a?[...n.value,l]:[...n.value];u.splice(r,1),n.value=u}else a&&(n.value=[...n.value,l]);e.clearOnSelect&&(v.value="")}else{const r=t!==!1;n.value=r?[l]:[],k.value=r&&!y.value?l.title:"",X(()=>{c.value=!1,C.value=!0})}}function xe(l){x.value=!0,setTimeout(()=>{K.value=!0})}function ye(l){K.value=!1}function Ve(l){(l==null||l===""&&!e.multiple&&!y.value)&&(n.value=[])}return R(x,(l,t)=>{if(!(l||l===t)&&(s.value=-1,c.value=!1,v.value)){if(e.multiple){h(D(e,v.value));return}if(!y.value)return;n.value.some(r=>{let{title:a}=r;return a===v.value})?k.value="":h(D(e,v.value))}}),R(c,()=>{if(!e.hideSelected&&c.value&&n.value.length){const l=p.value.findIndex(t=>n.value.some(r=>e.valueComparator(r.value,t.value)));Ee&&window.requestAnimationFrame(()=>{var t;l>=0&&((t=$.value)==null||t.scrollToIndex(l))})}}),R(()=>e.items,(l,t)=>{c.value||x.value&&!t.length&&l.length&&(c.value=!0)}),Me(()=>{const l=!!(!e.hideNoData||p.value.length||o["prepend-item"]||o["append-item"]||o["no-data"]),t=n.value.length>0,r=G.filterProps(e);return i(G,I({ref:V},r,{modelValue:v.value,"onUpdate:modelValue":[a=>v.value=a,Ve],focused:x.value,"onUpdate:focused":a=>x.value=a,validationValue:n.externalValue,counterValue:se.value,dirty:t,class:["v-combobox",{"v-combobox--active-menu":c.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!y.value,"v-combobox--selecting-index":s.value>-1,[`v-combobox--${e.multiple?"multiple":"single"}`]:!0},e.class],style:e.style,readonly:e.readonly,placeholder:t?void 0:e.placeholder,"onClick:clear":fe,"onMousedown:control":me,onKeydown:he}),{...o,default:()=>i(O,null,[i(pe,I({ref:H,modelValue:c.value,"onUpdate:modelValue":a=>c.value=a,activator:"parent",contentClass:"v-combobox__content",disabled:q.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,transition:e.transition,onAfterLeave:ge},e.menuProps),{default:()=>[l&&i(Ne,I({ref:z,selected:ce.value,selectStrategy:e.multiple?"independent":"single-independent",onMousedown:a=>a.preventDefault(),onKeydown:de,onFocusin:xe,onFocusout:ye,onScrollPassive:ve,tabindex:"-1","aria-live":"polite",color:e.itemColor??e.color},e.listProps),{default:()=>{var a,u,m;return[(a=o["prepend-item"])==null?void 0:a.call(o),!p.value.length&&!e.hideNoData&&(((u=o["no-data"])==null?void 0:u.call(o))??i(ee,{title:L(e.noDataText)},null)),i(we,{ref:$,renderless:!0,items:p.value},{default:w=>{var Z;let{item:d,index:S,itemRef:f}=w;const Y=I(d.props,{ref:f,key:S,active:j.value&&S===0?!0:void 0,onClick:()=>h(d,null)});return((Z=o.item)==null?void 0:Z.call(o,{item:d,index:S,props:Y}))??i(ee,I(Y,{role:"option"}),{prepend:E=>{let{isSelected:M}=E;return i(O,null,[e.multiple&&!e.hideSelected?i(We,{key:d.value,modelValue:M,ripple:!1,tabindex:"-1"},null):void 0,d.props.prependAvatar&&i(Oe,{image:d.props.prependAvatar},null),d.props.prependIcon&&i(le,{icon:d.props.prependIcon},null)])},title:()=>{var E,M;return C.value?d.title:Ye(d.title,(E=re(d))==null?void 0:E.title,((M=v.value)==null?void 0:M.length)??0)}})}}),(m=o["append-item"])==null?void 0:m.call(o)]}})]}),n.value.map((a,u)=>{function m(f){f.stopPropagation(),f.preventDefault(),h(a,!1)}const w={"onClick:close":m,onKeydown(f){f.key!=="Enter"&&f.key!==" "||(f.preventDefault(),f.stopPropagation(),m(f))},onMousedown(f){f.preventDefault(),f.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0},d=_.value?!!o.chip:!!o.selection,S=d?Le(_.value?o.chip({item:a,index:u,props:w}):o.selection({item:a,index:u})):void 0;if(!(d&&!S))return i("div",{key:a.value,class:["v-combobox__selection",u===s.value&&["v-combobox__selection--selected",oe.value]],style:u===s.value?ie.value:{}},[_.value?o.chip?i(Ke,{key:"chip-defaults",defaults:{VChip:{closable:e.closableChips,size:"small",text:a.title}}},{default:()=>[S]}):i(Se,I({key:"chip",closable:e.closableChips,size:"small",text:a.title,disabled:a.props.disabled},w),null):S??i("span",{class:"v-combobox__selection-text"},[a.title,e.multiple&&u<n.value.length-1&&i("span",{class:"v-combobox__selection-comma"},[Ue(",")])])])})]),"append-inner":function(){var w;for(var a=arguments.length,u=new Array(a),m=0;m<a;m++)u[m]=arguments[m];return i(O,null,[(w=o["append-inner"])==null?void 0:w.call(o,...u),(!e.hideNoData||e.items.length)&&e.menuIcon?i(le,{class:"v-combobox__menu-icon",icon:e.menuIcon,onMousedown:be,onClick:Be,"aria-label":L(Q.value),title:L(Q.value),tabindex:"-1"},null):void 0])}})}),je({isFocused:x,isPristine:C,menu:c,search:v,selectionIndex:s,filteredItems:T,select:h},V)}});export{tl as V};
|
|
Binary file
|