codex 1.6.0a10__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/serializers/browser/choices.py +18 -6
- codex/serializers/browser/filters.py +2 -2
- codex/serializers/browser/mixins.py +35 -2
- codex/serializers/browser/settings.py +10 -3
- codex/serializers/choices.py +4 -0
- codex/serializers/fields.py +43 -1
- codex/serializers/models/pycountry.py +11 -51
- codex/serializers/reader.py +1 -0
- codex/static_root/assets/{VCheckbox-CY3rcqlS.de5154294920.js → VCheckbox-BwDyxhU7.831b00df198a.js} +1 -1
- 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-CY3rcqlS.js → VCheckbox-BwDyxhU7.js} +1 -1
- 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-D2tPTt6P.9a90d6818bf6.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-D2tPTt6P.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-aJr--Ou7.f290ccf2ce25.js → VCombobox-BASCOy0n.7801caa5e192.js} +1 -1
- 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-aJr--Ou7.js → VCombobox-BASCOy0n.js} +1 -1
- 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-61pzfUB2.33f73beb5224.js → VDialog-DnbL_v_u.0bd289bda8e6.js} +1 -1
- 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-61pzfUB2.js → VDialog-DnbL_v_u.js} +1 -1
- 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/{VExpansionPanels-rewm0P4z.5c7680f815b6.js → VExpansionPanels-B8nz8lN5.56e5adec4f62.js} +1 -1
- 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-rewm0P4z.js → VExpansionPanels-B8nz8lN5.js} +1 -1
- 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-QFQbK1qo.750a42b1b814.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-QFQbK1qo.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-Dixy6okt.5d53830daa8a.js → VSelect-BoKpXxwe.a88f065dfe3b.js} +1 -1
- 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-Dixy6okt.js → VSelect-BoKpXxwe.js} +1 -1
- 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-MNmxKc3J.08055d00917e.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-MNmxKc3J.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-DZEV0FoV.5f996daf0e98.js → VSlideGroup-C2TL5E34.775adeb5a973.js} +1 -1
- 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-DZEV0FoV.js → VSlideGroup-C2TL5E34.js} +1 -1
- 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-lcnYg9Ee.d72927b13c2e.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-lcnYg9Ee.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-BkFrjhdV.js → VTextField-Aw8nKhY6.428732ac22d7.js} +1 -1
- 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-BkFrjhdV.b02653a9b3b7.js → VTextField-Aw8nKhY6.js} +1 -1
- 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-C__tAqdc.9791c128c3b7.js → VWindowItem-D9j_u9MX.828acf3dee55.js} +1 -1
- 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-C__tAqdc.js → VWindowItem-D9j_u9MX.js} +1 -1
- 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-rrNKi_GE.e2b034db7934.js → admin-drawer-panel-Dmn4wEY3.af7e8490f0e3.js} +2 -2
- 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-rrNKi_GE.js → admin-drawer-panel-Dmn4wEY3.js} +2 -2
- 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-CXES2HXe.9e48a9bf84e0.js → admin-jf7zR2p_.4741813376d2.js} +1 -1
- 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-CXES2HXe.js → admin-jf7zR2p_.js} +1 -1
- 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-BuDeXGEe.css → browser-D7xci5SY.css} +1 -1
- 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-BuDeXGEe.f60854183b45.css → browser-D7xci5SY.fa305e14005c.css} +1 -1
- 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-Bn20jYzD.593c5af1732b.js → change-password-dialog-Cc1e755p.b29d200537bf.js} +1 -1
- 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-Bn20jYzD.js → change-password-dialog-Cc1e755p.js} +1 -1
- 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-CWszioQE.859051c35dd9.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-CWszioQE.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-BSdlLt-4.27ec2df67a0b.js → datetime-column-Cqi99Ze-.49d0ce340183.js} +1 -1
- 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-BSdlLt-4.js → datetime-column-Cqi99Ze-.js} +1 -1
- 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-D3gaGf87.1f14dbfd9929.js → filter-CuocBoS2.885d1b8d44cc.js} +1 -1
- 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-D3gaGf87.js → filter-CuocBoS2.js} +1 -1
- 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-8vzpdySX.a982c7f0776a.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-8vzpdySX.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-Cz9t_ECi.a9e8aea79254.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-Cz9t_ECi.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-Cqtszzf1.b31df3d9c29f.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-Cqtszzf1.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-DMlnswUU.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-DMlnswUU.30f454e84184.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-vjXu_QYL.js → main-17i0EBCp.7093c3f755f1.js} +6 -6
- 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-vjXu_QYL.548bd4c38799.js → main-17i0EBCp.js} +6 -6
- 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-BiamrjRZ.4c9be1ade43c.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-BiamrjRZ.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-BpsctRsY.5d72e393911a.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-BpsctRsY.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-C5acBjpy.dc67d4528868.js → relation-chips-NgDnInw_.3b5ba16f68f0.js} +1 -1
- 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-C5acBjpy.js → relation-chips-NgDnInw_.js} +1 -1
- 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-D_JuRi7F.f02f3f981f8f.js → settings-drawer-BaQT27kc.e43fc1527b66.js} +2 -2
- 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-D_JuRi7F.js → settings-drawer-BaQT27kc.js} +2 -2
- 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-ClqRTk1z.c759ace65a87.js → stats-tab-DoHb54IU.30d7deea7b9f.js} +1 -1
- 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-ClqRTk1z.js → stats-tab-DoHb54IU.js} +1 -1
- 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-DF9qa6LO.0b32cafde4ad.js → task-tab-B88ucu1U.4f240e3d82c4.js} +1 -1
- 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-DF9qa6LO.js → task-tab-B88ucu1U.js} +1 -1
- 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-BjKuLH6k.2ae00ddd79fb.js → unauthorized-AnKtlgGy.62ee74d4373c.js} +1 -1
- 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-BjKuLH6k.js → unauthorized-AnKtlgGy.js} +1 -1
- codex/static_root/assets/unauthorized-AnKtlgGy.js.br +0 -0
- codex/static_root/assets/unauthorized-AnKtlgGy.js.gz +0 -0
- codex/static_root/assets/{user-tab-Dpxe3ygA.7d90174631f0.js → user-tab-BxtZ2u7W.161cc8f0dcce.js} +1 -1
- 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-Dpxe3ygA.js → user-tab-BxtZ2u7W.js} +1 -1
- 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.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.35e46a3ec8fa.json → manifest.3851c028b0cb.json} +223 -223
- codex/static_root/manifest.3851c028b0cb.json.br +0 -0
- codex/static_root/manifest.3851c028b0cb.json.gz +0 -0
- codex/static_root/manifest.json +223 -223
- 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/bookmark.py +29 -23
- codex/views/browser/annotations.py +9 -45
- codex/views/browser/browser.py +26 -6
- codex/views/browser/choices.py +4 -22
- codex/views/browser/cover.py +26 -0
- codex/views/browser/filters/annotations.py +23 -8
- codex/views/browser/metadata.py +17 -7
- codex/views/const.py +1 -1
- codex/views/reader/init.py +16 -12
- codex/views/session.py +3 -1
- codex/websockets/consumers.py +1 -1
- {codex-1.6.0a10.dist-info → codex-1.6.0a11.dist-info}/METADATA +1 -1
- {codex-1.6.0a10.dist-info → codex-1.6.0a11.dist-info}/RECORD +258 -258
- codex/static_root/assets/VCheckbox-CY3rcqlS.de5154294920.js.br +0 -0
- codex/static_root/assets/VCheckbox-CY3rcqlS.de5154294920.js.gz +0 -0
- codex/static_root/assets/VCheckbox-CY3rcqlS.js.br +0 -0
- codex/static_root/assets/VCheckbox-CY3rcqlS.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-D2tPTt6P.9a90d6818bf6.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-D2tPTt6P.9a90d6818bf6.js.gz +0 -0
- codex/static_root/assets/VCheckboxBtn-D2tPTt6P.js.br +0 -0
- codex/static_root/assets/VCheckboxBtn-D2tPTt6P.js.gz +0 -0
- codex/static_root/assets/VCombobox-aJr--Ou7.f290ccf2ce25.js.br +0 -0
- codex/static_root/assets/VCombobox-aJr--Ou7.f290ccf2ce25.js.gz +0 -0
- codex/static_root/assets/VCombobox-aJr--Ou7.js.br +0 -0
- codex/static_root/assets/VCombobox-aJr--Ou7.js.gz +0 -0
- codex/static_root/assets/VDialog-61pzfUB2.33f73beb5224.js.br +0 -0
- codex/static_root/assets/VDialog-61pzfUB2.33f73beb5224.js.gz +0 -0
- codex/static_root/assets/VDialog-61pzfUB2.js.br +0 -0
- codex/static_root/assets/VDialog-61pzfUB2.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-rewm0P4z.5c7680f815b6.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-rewm0P4z.5c7680f815b6.js.gz +0 -0
- codex/static_root/assets/VExpansionPanels-rewm0P4z.js.br +0 -0
- codex/static_root/assets/VExpansionPanels-rewm0P4z.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-QFQbK1qo.750a42b1b814.js.br +0 -0
- codex/static_root/assets/VRadioGroup-QFQbK1qo.750a42b1b814.js.gz +0 -0
- codex/static_root/assets/VRadioGroup-QFQbK1qo.js.br +0 -0
- codex/static_root/assets/VRadioGroup-QFQbK1qo.js.gz +0 -0
- codex/static_root/assets/VSelect-Dixy6okt.5d53830daa8a.js.br +0 -0
- codex/static_root/assets/VSelect-Dixy6okt.5d53830daa8a.js.gz +0 -0
- codex/static_root/assets/VSelect-Dixy6okt.js.br +0 -0
- codex/static_root/assets/VSelect-Dixy6okt.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-MNmxKc3J.08055d00917e.js.br +0 -0
- codex/static_root/assets/VSelectionControl-MNmxKc3J.08055d00917e.js.gz +0 -0
- codex/static_root/assets/VSelectionControl-MNmxKc3J.js.br +0 -0
- codex/static_root/assets/VSelectionControl-MNmxKc3J.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-DZEV0FoV.5f996daf0e98.js.br +0 -0
- codex/static_root/assets/VSlideGroup-DZEV0FoV.5f996daf0e98.js.gz +0 -0
- codex/static_root/assets/VSlideGroup-DZEV0FoV.js.br +0 -0
- codex/static_root/assets/VSlideGroup-DZEV0FoV.js.gz +0 -0
- codex/static_root/assets/VTable-lcnYg9Ee.d72927b13c2e.js.br +0 -0
- codex/static_root/assets/VTable-lcnYg9Ee.d72927b13c2e.js.gz +0 -0
- codex/static_root/assets/VTable-lcnYg9Ee.js.br +0 -0
- codex/static_root/assets/VTable-lcnYg9Ee.js.gz +0 -0
- codex/static_root/assets/VTextField-BkFrjhdV.b02653a9b3b7.js.br +0 -0
- codex/static_root/assets/VTextField-BkFrjhdV.b02653a9b3b7.js.gz +0 -0
- codex/static_root/assets/VTextField-BkFrjhdV.js.br +0 -0
- codex/static_root/assets/VTextField-BkFrjhdV.js.gz +0 -0
- codex/static_root/assets/VWindowItem-C__tAqdc.9791c128c3b7.js.br +0 -0
- codex/static_root/assets/VWindowItem-C__tAqdc.9791c128c3b7.js.gz +0 -0
- codex/static_root/assets/VWindowItem-C__tAqdc.js.br +0 -0
- codex/static_root/assets/VWindowItem-C__tAqdc.js.gz +0 -0
- codex/static_root/assets/admin-CXES2HXe.9e48a9bf84e0.js.br +0 -0
- codex/static_root/assets/admin-CXES2HXe.9e48a9bf84e0.js.gz +0 -0
- codex/static_root/assets/admin-CXES2HXe.js.br +0 -0
- codex/static_root/assets/admin-CXES2HXe.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-rrNKi_GE.e2b034db7934.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-rrNKi_GE.e2b034db7934.js.gz +0 -0
- codex/static_root/assets/admin-drawer-panel-rrNKi_GE.js.br +0 -0
- codex/static_root/assets/admin-drawer-panel-rrNKi_GE.js.gz +0 -0
- codex/static_root/assets/browser-BuDeXGEe.css.br +0 -0
- codex/static_root/assets/browser-BuDeXGEe.css.gz +0 -0
- codex/static_root/assets/browser-BuDeXGEe.f60854183b45.css.br +0 -0
- codex/static_root/assets/browser-BuDeXGEe.f60854183b45.css.gz +0 -0
- codex/static_root/assets/browser-s6mFzrK9.0d2200b451af.js +0 -1
- codex/static_root/assets/browser-s6mFzrK9.0d2200b451af.js.br +0 -0
- codex/static_root/assets/browser-s6mFzrK9.0d2200b451af.js.gz +0 -0
- codex/static_root/assets/browser-s6mFzrK9.js +0 -1
- codex/static_root/assets/browser-s6mFzrK9.js.br +0 -0
- codex/static_root/assets/browser-s6mFzrK9.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-Bn20jYzD.593c5af1732b.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Bn20jYzD.593c5af1732b.js.gz +0 -0
- codex/static_root/assets/change-password-dialog-Bn20jYzD.js.br +0 -0
- codex/static_root/assets/change-password-dialog-Bn20jYzD.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-CWszioQE.859051c35dd9.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CWszioQE.859051c35dd9.js.gz +0 -0
- codex/static_root/assets/confirm-dialog-CWszioQE.js.br +0 -0
- codex/static_root/assets/confirm-dialog-CWszioQE.js.gz +0 -0
- codex/static_root/assets/datetime-column-BSdlLt-4.27ec2df67a0b.js.br +0 -0
- codex/static_root/assets/datetime-column-BSdlLt-4.27ec2df67a0b.js.gz +0 -0
- codex/static_root/assets/datetime-column-BSdlLt-4.js.br +0 -0
- codex/static_root/assets/datetime-column-BSdlLt-4.js.gz +0 -0
- codex/static_root/assets/filter-D3gaGf87.1f14dbfd9929.js.br +0 -0
- codex/static_root/assets/filter-D3gaGf87.1f14dbfd9929.js.gz +0 -0
- codex/static_root/assets/filter-D3gaGf87.js.br +0 -0
- codex/static_root/assets/filter-D3gaGf87.js.gz +0 -0
- codex/static_root/assets/flag-tab-8vzpdySX.a982c7f0776a.js.br +0 -0
- codex/static_root/assets/flag-tab-8vzpdySX.a982c7f0776a.js.gz +0 -0
- codex/static_root/assets/flag-tab-8vzpdySX.js.br +0 -0
- codex/static_root/assets/flag-tab-8vzpdySX.js.gz +0 -0
- codex/static_root/assets/group-tab-Cz9t_ECi.a9e8aea79254.js.br +0 -0
- codex/static_root/assets/group-tab-Cz9t_ECi.a9e8aea79254.js.gz +0 -0
- codex/static_root/assets/group-tab-Cz9t_ECi.js.br +0 -0
- codex/static_root/assets/group-tab-Cz9t_ECi.js.gz +0 -0
- codex/static_root/assets/http-error-Cqtszzf1.b31df3d9c29f.js.br +0 -0
- codex/static_root/assets/http-error-Cqtszzf1.b31df3d9c29f.js.gz +0 -0
- codex/static_root/assets/http-error-Cqtszzf1.js.br +0 -0
- codex/static_root/assets/http-error-Cqtszzf1.js.gz +0 -0
- codex/static_root/assets/library-tab-DMlnswUU.30f454e84184.js.br +0 -0
- codex/static_root/assets/library-tab-DMlnswUU.30f454e84184.js.gz +0 -0
- codex/static_root/assets/library-tab-DMlnswUU.js.br +0 -0
- codex/static_root/assets/library-tab-DMlnswUU.js.gz +0 -0
- codex/static_root/assets/main-vjXu_QYL.548bd4c38799.js.br +0 -0
- codex/static_root/assets/main-vjXu_QYL.548bd4c38799.js.gz +0 -0
- codex/static_root/assets/main-vjXu_QYL.js.br +0 -0
- codex/static_root/assets/main-vjXu_QYL.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-DGdMiBRs.5829b01b8a2f.css +0 -1
- codex/static_root/assets/pagination-toolbar-DGdMiBRs.5829b01b8a2f.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-DGdMiBRs.5829b01b8a2f.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-DGdMiBRs.css +0 -1
- codex/static_root/assets/pagination-toolbar-DGdMiBRs.css.br +0 -0
- codex/static_root/assets/pagination-toolbar-DGdMiBRs.css.gz +0 -0
- codex/static_root/assets/pagination-toolbar-JW78pa0q.91024effdab9.js +0 -1
- codex/static_root/assets/pagination-toolbar-JW78pa0q.91024effdab9.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-JW78pa0q.91024effdab9.js.gz +0 -0
- codex/static_root/assets/pagination-toolbar-JW78pa0q.js +0 -1
- codex/static_root/assets/pagination-toolbar-JW78pa0q.js.br +0 -0
- codex/static_root/assets/pagination-toolbar-JW78pa0q.js.gz +0 -0
- codex/static_root/assets/pdf-doc-BiamrjRZ.4c9be1ade43c.js.br +0 -0
- codex/static_root/assets/pdf-doc-BiamrjRZ.4c9be1ade43c.js.gz +0 -0
- codex/static_root/assets/pdf-doc-BiamrjRZ.js.br +0 -0
- codex/static_root/assets/pdf-doc-BiamrjRZ.js.gz +0 -0
- codex/static_root/assets/reader-BpsctRsY.5d72e393911a.css.br +0 -0
- codex/static_root/assets/reader-BpsctRsY.5d72e393911a.css.gz +0 -0
- codex/static_root/assets/reader-BpsctRsY.css.br +0 -0
- codex/static_root/assets/reader-BpsctRsY.css.gz +0 -0
- codex/static_root/assets/reader-CDk8oZzB.ad62eebda920.js +0 -2
- codex/static_root/assets/reader-CDk8oZzB.ad62eebda920.js.br +0 -0
- codex/static_root/assets/reader-CDk8oZzB.ad62eebda920.js.gz +0 -0
- codex/static_root/assets/reader-CDk8oZzB.js +0 -2
- codex/static_root/assets/reader-CDk8oZzB.js.br +0 -0
- codex/static_root/assets/reader-CDk8oZzB.js.gz +0 -0
- codex/static_root/assets/relation-chips-C5acBjpy.dc67d4528868.js.br +0 -0
- codex/static_root/assets/relation-chips-C5acBjpy.dc67d4528868.js.gz +0 -0
- codex/static_root/assets/relation-chips-C5acBjpy.js.br +0 -0
- codex/static_root/assets/relation-chips-C5acBjpy.js.gz +0 -0
- codex/static_root/assets/settings-drawer-D_JuRi7F.f02f3f981f8f.js.br +0 -0
- codex/static_root/assets/settings-drawer-D_JuRi7F.f02f3f981f8f.js.gz +0 -0
- codex/static_root/assets/settings-drawer-D_JuRi7F.js.br +0 -0
- codex/static_root/assets/settings-drawer-D_JuRi7F.js.gz +0 -0
- codex/static_root/assets/stats-tab-ClqRTk1z.c759ace65a87.js.br +0 -0
- codex/static_root/assets/stats-tab-ClqRTk1z.c759ace65a87.js.gz +0 -0
- codex/static_root/assets/stats-tab-ClqRTk1z.js.br +0 -0
- codex/static_root/assets/stats-tab-ClqRTk1z.js.gz +0 -0
- codex/static_root/assets/task-tab-DF9qa6LO.0b32cafde4ad.js.br +0 -0
- codex/static_root/assets/task-tab-DF9qa6LO.0b32cafde4ad.js.gz +0 -0
- codex/static_root/assets/task-tab-DF9qa6LO.js.br +0 -0
- codex/static_root/assets/task-tab-DF9qa6LO.js.gz +0 -0
- codex/static_root/assets/to-case-CGbULRaE.4c80644f460d.js +0 -1
- codex/static_root/assets/to-case-CGbULRaE.4c80644f460d.js.br +0 -0
- codex/static_root/assets/to-case-CGbULRaE.js +0 -1
- codex/static_root/assets/to-case-CGbULRaE.js.br +0 -0
- codex/static_root/assets/unauthorized-BjKuLH6k.2ae00ddd79fb.js.br +0 -0
- codex/static_root/assets/unauthorized-BjKuLH6k.2ae00ddd79fb.js.gz +0 -0
- codex/static_root/assets/unauthorized-BjKuLH6k.js.br +0 -0
- codex/static_root/assets/unauthorized-BjKuLH6k.js.gz +0 -0
- codex/static_root/assets/user-tab-Dpxe3ygA.7d90174631f0.js.br +0 -0
- codex/static_root/assets/user-tab-Dpxe3ygA.7d90174631f0.js.gz +0 -0
- codex/static_root/assets/user-tab-Dpxe3ygA.js.br +0 -0
- codex/static_root/assets/user-tab-Dpxe3ygA.js.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.35e46a3ec8fa.json.br +0 -0
- codex/static_root/manifest.35e46a3ec8fa.json.gz +0 -0
- {codex-1.6.0a10.dist-info → codex-1.6.0a11.dist-info}/LICENSE +0 -0
- {codex-1.6.0a10.dist-info → codex-1.6.0a11.dist-info}/WHEEL +0 -0
- {codex-1.6.0a10.dist-info → codex-1.6.0a11.dist-info}/entry_points.txt +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "js/choices.json": "js/choices.a0aaaa6c7ef7.json", "js/choices-admin.json": "js/choices-admin.3521e2a863df.json", "assets/relation-chips-Bsc-gUxE.css": "assets/relation-chips-Bsc-gUxE.98e65384c3c9.css", "assets/group-tab-CBKuS3Iv.css": "assets/group-tab-CBKuS3Iv.7e4746634782.css", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/VSelect-ARDhJiQK.css": "assets/VSelect-ARDhJiQK.372c098fb475.css", "assets/flag-tab-BNwbLfrN.css": "assets/flag-tab-BNwbLfrN.b755a99fff7e.css", "assets/VSelect-Dixy6okt.js": "assets/VSelect-Dixy6okt.5d53830daa8a.js", "assets/browser-s6mFzrK9.js": "assets/browser-s6mFzrK9.0d2200b451af.js", "assets/settings-drawer-D_JuRi7F.js": "assets/settings-drawer-D_JuRi7F.f02f3f981f8f.js", "assets/change-password-dialog-Bn20jYzD.js": "assets/change-password-dialog-Bn20jYzD.593c5af1732b.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/VSelectionControl-MNmxKc3J.js": "assets/VSelectionControl-MNmxKc3J.08055d00917e.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSlideGroup-Dk_1upHt.css": "assets/VSlideGroup-Dk_1upHt.2c836070ec75.css", "assets/stats-tab-ClqRTk1z.js": "assets/stats-tab-ClqRTk1z.c759ace65a87.js", "assets/admin-drawer-panel-mne3FIj6.css": "assets/admin-drawer-panel-mne3FIj6.561b3f75fe65.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/settings-drawer-nZ9HvKSZ.css": "assets/settings-drawer-nZ9HvKSZ.01744e131806.css", "assets/VDialog-lQ13FnRR.css": "assets/VDialog-lQ13FnRR.1c801ad756b2.css", "assets/relation-chips-C5acBjpy.js": "assets/relation-chips-C5acBjpy.dc67d4528868.js", "assets/main-Ztp855PW.css": "assets/main-Ztp855PW.d46d718fac45.css", "assets/reader-BpsctRsY.css": "assets/reader-BpsctRsY.5d72e393911a.css", "assets/VTable-lcnYg9Ee.js": "assets/VTable-lcnYg9Ee.d72927b13c2e.js", "assets/reader-CDk8oZzB.js": "assets/reader-CDk8oZzB.ad62eebda920.js", "assets/VRadioGroup-QFQbK1qo.js": "assets/VRadioGroup-QFQbK1qo.750a42b1b814.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/unauthorized-BjKuLH6k.js": "assets/unauthorized-BjKuLH6k.2ae00ddd79fb.js", "assets/VWindowItem-C__tAqdc.js": "assets/VWindowItem-C__tAqdc.9791c128c3b7.js", "assets/group-tab-Cz9t_ECi.js": "assets/group-tab-Cz9t_ECi.a9e8aea79254.js", "assets/VTextField-BkFrjhdV.js": "assets/VTextField-BkFrjhdV.b02653a9b3b7.js", "assets/VSlideGroup-DZEV0FoV.js": "assets/VSlideGroup-DZEV0FoV.5f996daf0e98.js", "assets/datetime-column-BSdlLt-4.js": "assets/datetime-column-BSdlLt-4.27ec2df67a0b.js", "assets/change-password-dialog-0u6IJA87.css": "assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css", "assets/VCombobox-aJr--Ou7.js": "assets/VCombobox-aJr--Ou7.f290ccf2ce25.js", "assets/user-tab-Dpxe3ygA.js": "assets/user-tab-Dpxe3ygA.7d90174631f0.js", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/library-tab-DMlnswUU.js": "assets/library-tab-DMlnswUU.30f454e84184.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/main-vjXu_QYL.js": "assets/main-vjXu_QYL.548bd4c38799.js", "assets/pagination-toolbar-DGdMiBRs.css": "assets/pagination-toolbar-DGdMiBRs.5829b01b8a2f.css", "assets/pagination-toolbar-JW78pa0q.js": "assets/pagination-toolbar-JW78pa0q.91024effdab9.js", "assets/flag-tab-8vzpdySX.js": "assets/flag-tab-8vzpdySX.a982c7f0776a.js", "assets/admin-drawer-panel-rrNKi_GE.js": "assets/admin-drawer-panel-rrNKi_GE.e2b034db7934.js", "assets/VDialog-61pzfUB2.js": "assets/VDialog-61pzfUB2.33f73beb5224.js", "assets/confirm-dialog-CWszioQE.js": "assets/confirm-dialog-CWszioQE.859051c35dd9.js", "assets/VCheckbox-CY3rcqlS.js": "assets/VCheckbox-CY3rcqlS.de5154294920.js", "assets/library-tab-BN0SfPcH.css": "assets/library-tab-BN0SfPcH.913e236f625e.css", "assets/VExpansionPanels-rewm0P4z.js": "assets/VExpansionPanels-rewm0P4z.5c7680f815b6.js", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/to-case-CGbULRaE.js": "assets/to-case-CGbULRaE.4c80644f460d.js", "assets/admin-CXES2HXe.js": "assets/admin-CXES2HXe.9e48a9bf84e0.js", "assets/pdf-doc-BiamrjRZ.js": "assets/pdf-doc-BiamrjRZ.4c9be1ade43c.js", "assets/admin-B8Bp2Uih.css": "assets/admin-B8Bp2Uih.82c98714bcf1.css", "assets/task-tab-1XiWn9xP.css": "assets/task-tab-1XiWn9xP.06cb8e1b794d.css", "assets/stats-tab-B4yKuY0c.css": "assets/stats-tab-B4yKuY0c.a5728396494b.css", "assets/browser-BuDeXGEe.css": "assets/browser-BuDeXGEe.f60854183b45.css", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/task-tab-DF9qa6LO.js": "assets/task-tab-DF9qa6LO.0b32cafde4ad.js", "assets/http-error-Cqtszzf1.js": "assets/http-error-Cqtszzf1.b31df3d9c29f.js", "assets/VCheckboxBtn-D2tPTt6P.js": "assets/VCheckboxBtn-D2tPTt6P.9a90d6818bf6.js", "assets/VExpansionPanels-DsEXVcCv.css": "assets/VExpansionPanels-DsEXVcCv.20b475255e66.css", "assets/unauthorized-CibJYD8o.css": "assets/unauthorized-CibJYD8o.4c2de98c2b53.css", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/filter-D3gaGf87.js": "assets/filter-D3gaGf87.1f14dbfd9929.js", "assets/VTextField-BssVoDhB.css": "assets/VTextField-BssVoDhB.4cc388b4aa3c.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.35e46a3ec8fa.json"}, "version": "1.1", "hash": "3eaef7cc048e"}
|
|
1
|
+
{"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "js/choices.json": "js/choices.2f6b0359e1ef.json", "js/choices-admin.json": "js/choices-admin.3521e2a863df.json", "assets/relation-chips-Bsc-gUxE.css": "assets/relation-chips-Bsc-gUxE.98e65384c3c9.css", "assets/pagination-toolbar-BBvsIXTd.js": "assets/pagination-toolbar-BBvsIXTd.ad891da6617a.js", "assets/group-tab-CBKuS3Iv.css": "assets/group-tab-CBKuS3Iv.7e4746634782.css", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/group-tab-_nT2o04v.js": "assets/group-tab-_nT2o04v.c06032b254dc.js", "assets/VSelect-ARDhJiQK.css": "assets/VSelect-ARDhJiQK.372c098fb475.css", "assets/flag-tab-BNwbLfrN.css": "assets/flag-tab-BNwbLfrN.b755a99fff7e.css", "assets/library-tab-lz5QMD4i.js": "assets/library-tab-lz5QMD4i.2f04b226ebe8.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/datetime-column-Cqi99Ze-.js": "assets/datetime-column-Cqi99Ze-.49d0ce340183.js", "assets/VExpansionPanels-B8nz8lN5.js": "assets/VExpansionPanels-B8nz8lN5.56e5adec4f62.js", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/VSlideGroup-C2TL5E34.js": "assets/VSlideGroup-C2TL5E34.775adeb5a973.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/unauthorized-AnKtlgGy.js": "assets/unauthorized-AnKtlgGy.62ee74d4373c.js", "assets/VSlideGroup-Dk_1upHt.css": "assets/VSlideGroup-Dk_1upHt.2c836070ec75.css", "assets/admin-drawer-panel-mne3FIj6.css": "assets/admin-drawer-panel-mne3FIj6.561b3f75fe65.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/settings-drawer-nZ9HvKSZ.css": "assets/settings-drawer-nZ9HvKSZ.01744e131806.css", "assets/stats-tab-DoHb54IU.js": "assets/stats-tab-DoHb54IU.30d7deea7b9f.js", "assets/VCombobox-BASCOy0n.js": "assets/VCombobox-BASCOy0n.7801caa5e192.js", "assets/http-error-CXo9qLiW.js": "assets/http-error-CXo9qLiW.d5a337f399c9.js", "assets/VCheckboxBtn-DVq5lDK4.js": "assets/VCheckboxBtn-DVq5lDK4.5e6464c8d80a.js", "assets/VDialog-lQ13FnRR.css": "assets/VDialog-lQ13FnRR.1c801ad756b2.css", "assets/relation-chips-NgDnInw_.js": "assets/relation-chips-NgDnInw_.3b5ba16f68f0.js", "assets/main-Ztp855PW.css": "assets/main-Ztp855PW.d46d718fac45.css", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/task-tab-B88ucu1U.js": "assets/task-tab-B88ucu1U.4f240e3d82c4.js", "assets/browser-BKZuypzF.js": "assets/browser-BKZuypzF.86e5333bd7d6.js", "assets/change-password-dialog-0u6IJA87.css": "assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VTextField-Aw8nKhY6.js": "assets/VTextField-Aw8nKhY6.428732ac22d7.js", "assets/VWindowItem-D9j_u9MX.js": "assets/VWindowItem-D9j_u9MX.828acf3dee55.js", "assets/VCheckbox-BwDyxhU7.js": "assets/VCheckbox-BwDyxhU7.831b00df198a.js", "assets/settings-drawer-BaQT27kc.js": "assets/settings-drawer-BaQT27kc.e43fc1527b66.js", "assets/library-tab-BN0SfPcH.css": "assets/library-tab-BN0SfPcH.913e236f625e.css", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/user-tab-BxtZ2u7W.js": "assets/user-tab-BxtZ2u7W.161cc8f0dcce.js", "assets/admin-jf7zR2p_.js": "assets/admin-jf7zR2p_.4741813376d2.js", "assets/change-password-dialog-Cc1e755p.js": "assets/change-password-dialog-Cc1e755p.b29d200537bf.js", "assets/VSelect-BoKpXxwe.js": "assets/VSelect-BoKpXxwe.a88f065dfe3b.js", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/pdf-doc-BpZdmj2g.js": "assets/pdf-doc-BpZdmj2g.93e86d9c7927.js", "assets/VRadioGroup-BgwJ_b94.js": "assets/VRadioGroup-BgwJ_b94.55f84f3429b9.js", "assets/admin-drawer-panel-Dmn4wEY3.js": "assets/admin-drawer-panel-Dmn4wEY3.af7e8490f0e3.js", "assets/flag-tab-B5dRCBAt.js": "assets/flag-tab-B5dRCBAt.e858f7ec9f55.js", "assets/browser-D7xci5SY.css": "assets/browser-D7xci5SY.fa305e14005c.css", "assets/main-17i0EBCp.js": "assets/main-17i0EBCp.7093c3f755f1.js", "assets/admin-B8Bp2Uih.css": "assets/admin-B8Bp2Uih.82c98714bcf1.css", "assets/reader-CRJUR2qj.js": "assets/reader-CRJUR2qj.55d626f0f9fa.js", "assets/task-tab-1XiWn9xP.css": "assets/task-tab-1XiWn9xP.06cb8e1b794d.css", "assets/stats-tab-B4yKuY0c.css": "assets/stats-tab-B4yKuY0c.a5728396494b.css", "assets/reader-CqXFa_gE.css": "assets/reader-CqXFa_gE.78267e9de0c2.css", "assets/confirm-dialog-Cyr7HAAz.js": "assets/confirm-dialog-Cyr7HAAz.8ab1d8b6241a.js", "assets/to-case-B7MjLIw-.js": "assets/to-case-B7MjLIw-.08fc8412de69.js", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/VExpansionPanels-DsEXVcCv.css": "assets/VExpansionPanels-DsEXVcCv.20b475255e66.css", "assets/unauthorized-CibJYD8o.css": "assets/unauthorized-CibJYD8o.4c2de98c2b53.css", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/VTable-C0FptljX.js": "assets/VTable-C0FptljX.e4840b635c6e.js", "assets/VTextField-BssVoDhB.css": "assets/VTextField-BssVoDhB.4cc388b4aa3c.css", "assets/pagination-toolbar-B_zL7BQQ.css": "assets/pagination-toolbar-B_zL7BQQ.d1311bd41edc.css", "assets/VDialog-DnbL_v_u.js": "assets/VDialog-DnbL_v_u.0bd289bda8e6.js", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/filter-CuocBoS2.js": "assets/filter-CuocBoS2.885d1b8d44cc.js", "assets/VSelectionControl-BXJGg8No.js": "assets/VSelectionControl-BXJGg8No.0cb36d941d2a.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.3851c028b0cb.json"}, "version": "1.1", "hash": "5a212e3ae156"}
|
codex/util.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"""Utility functions."""
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
def max_none(
|
|
4
|
+
def max_none(*args):
|
|
5
5
|
"""None aware math.max."""
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
max_arg = None
|
|
7
|
+
for arg in args:
|
|
8
|
+
if max_arg is None:
|
|
9
|
+
max_arg = arg
|
|
10
|
+
elif arg is not None:
|
|
11
|
+
max_arg = max(max_arg, arg)
|
|
12
|
+
return max_arg
|
codex/views/bookmark.py
CHANGED
|
@@ -88,8 +88,10 @@ class BookmarkBaseView(AuthFilterGenericAPIView):
|
|
|
88
88
|
|
|
89
89
|
def _update_bookmarks(self, search_kwargs, updates):
|
|
90
90
|
"""Update existing bookmarks."""
|
|
91
|
+
count = 0
|
|
92
|
+
finished = False
|
|
91
93
|
if not updates:
|
|
92
|
-
return
|
|
94
|
+
return count, finished
|
|
93
95
|
group_acl_filter = self.get_group_acl_filter(Bookmark)
|
|
94
96
|
update_fields = set(updates.keys()) & _BOOKMARK_UPDATE_FIELDS
|
|
95
97
|
update_fields.add("updated_at")
|
|
@@ -106,14 +108,16 @@ class BookmarkBaseView(AuthFilterGenericAPIView):
|
|
|
106
108
|
for bm in existing_bookmarks:
|
|
107
109
|
self._update_bookmarks_validate_page(bm, updates)
|
|
108
110
|
self._update_bookmarks_validate_two_pages(bm, updates)
|
|
111
|
+
old_finished = bm.finished
|
|
109
112
|
for key, value in updates.items():
|
|
110
113
|
setattr(bm, key, value)
|
|
111
114
|
bm.updated_at = Now()
|
|
112
115
|
update_bookmarks.append(bm)
|
|
116
|
+
finished = finished or old_finished != bm.finished
|
|
113
117
|
count = len(update_bookmarks)
|
|
114
118
|
if count:
|
|
115
119
|
Bookmark.objects.bulk_update(update_bookmarks, tuple(update_fields))
|
|
116
|
-
return count
|
|
120
|
+
return count, finished
|
|
117
121
|
# LOG.debug(f"Updated {count} bookmarks.")
|
|
118
122
|
|
|
119
123
|
@staticmethod
|
|
@@ -127,9 +131,11 @@ class BookmarkBaseView(AuthFilterGenericAPIView):
|
|
|
127
131
|
|
|
128
132
|
def _create_bookmarks(self, comic_filter, search_kwargs, updates):
|
|
129
133
|
"""Create new bookmarks for comics that don't exist yet."""
|
|
134
|
+
count = 0
|
|
135
|
+
finished = False
|
|
130
136
|
self._create_bookmarks_validate_two_pages(updates)
|
|
131
137
|
if not updates:
|
|
132
|
-
return
|
|
138
|
+
return count, finished
|
|
133
139
|
create_bookmarks = []
|
|
134
140
|
group_acl_filter = self.get_group_acl_filter(Comic)
|
|
135
141
|
exclude = {}
|
|
@@ -141,6 +147,7 @@ class BookmarkBaseView(AuthFilterGenericAPIView):
|
|
|
141
147
|
.exclude(**exclude)
|
|
142
148
|
.only(*_COMIC_ONLY_FIELDS)
|
|
143
149
|
)
|
|
150
|
+
finished = False
|
|
144
151
|
for comic in create_bookmark_comics:
|
|
145
152
|
defaults = {"comic": comic}
|
|
146
153
|
defaults.update(updates)
|
|
@@ -149,10 +156,6 @@ class BookmarkBaseView(AuthFilterGenericAPIView):
|
|
|
149
156
|
defaults[key] = value
|
|
150
157
|
|
|
151
158
|
bm = Bookmark(**defaults)
|
|
152
|
-
if updates.get("page") == comic.max_page:
|
|
153
|
-
# Auto finish on bookmark last page
|
|
154
|
-
# This almost never happens. Possibly never.
|
|
155
|
-
bm.finished = True
|
|
156
159
|
create_bookmarks.append(bm)
|
|
157
160
|
count = len(create_bookmarks)
|
|
158
161
|
if count:
|
|
@@ -161,15 +164,20 @@ class BookmarkBaseView(AuthFilterGenericAPIView):
|
|
|
161
164
|
update_fields=tuple(_BOOKMARK_UPDATE_FIELDS),
|
|
162
165
|
unique_fields=Bookmark._meta.unique_together[0], # type: ignore
|
|
163
166
|
)
|
|
167
|
+
finished = updates.get("finished", False)
|
|
164
168
|
# LOG.debug(f"Create {count} bookmarks.")
|
|
165
|
-
return count
|
|
169
|
+
return count, finished
|
|
166
170
|
|
|
167
171
|
def update_bookmarks(self, updates, comic_filter):
|
|
168
172
|
"""Update a user bookmark."""
|
|
169
173
|
search_kwargs = self.get_bookmark_search_kwargs(comic_filter)
|
|
170
|
-
count = self._update_bookmarks(search_kwargs, updates)
|
|
171
|
-
|
|
172
|
-
|
|
174
|
+
count, finished = self._update_bookmarks(search_kwargs, updates)
|
|
175
|
+
create_count, create_finished = self._create_bookmarks(
|
|
176
|
+
comic_filter, search_kwargs, updates
|
|
177
|
+
)
|
|
178
|
+
count += create_count
|
|
179
|
+
finished = finished or create_finished
|
|
180
|
+
if count and finished:
|
|
173
181
|
self.notify_library_changed()
|
|
174
182
|
|
|
175
183
|
|
|
@@ -178,8 +186,12 @@ class BookmarkView(BookmarkBaseView):
|
|
|
178
186
|
|
|
179
187
|
serializer_class = BookmarkSerializer
|
|
180
188
|
|
|
181
|
-
def
|
|
189
|
+
def _parse_params(self):
|
|
182
190
|
"""Validate and translate the submitted data."""
|
|
191
|
+
group = self.kwargs.get("group")
|
|
192
|
+
# If the target is recursive, strip everything but finished state data.
|
|
193
|
+
serializer_class = None if group == "c" else BookmarkFinishedSerializer
|
|
194
|
+
|
|
183
195
|
data = self.request.data # type: ignore
|
|
184
196
|
if serializer_class:
|
|
185
197
|
serializer = serializer_class(data=data, partial=True)
|
|
@@ -191,18 +203,12 @@ class BookmarkView(BookmarkBaseView):
|
|
|
191
203
|
@extend_schema(request=serializer_class, responses=None)
|
|
192
204
|
def patch(self, *_args, **_kwargs):
|
|
193
205
|
"""Update bookmarks recursively."""
|
|
194
|
-
|
|
195
|
-
# If the target is recursive, strip everything but finished state data.
|
|
196
|
-
serializer_class = None if group == "c" else BookmarkFinishedSerializer
|
|
197
|
-
|
|
198
|
-
updates = self._validate(serializer_class)
|
|
206
|
+
updates = self._parse_params()
|
|
199
207
|
|
|
208
|
+
group = self.kwargs.get("group")
|
|
200
209
|
pks = self.kwargs.get("pks")
|
|
210
|
+
rel = "folders__in" if group == FOLDER_GROUP else GROUP_RELATION[group] + "__in"
|
|
211
|
+
comic_filter = {rel: pks}
|
|
201
212
|
|
|
202
|
-
|
|
203
|
-
"folders__in" if group == FOLDER_GROUP else GROUP_RELATION[group] + "__in"
|
|
204
|
-
)
|
|
205
|
-
comic_filter = {relation: pks}
|
|
206
|
-
|
|
207
|
-
self.update_bookmarks(updates, comic_filter=comic_filter)
|
|
213
|
+
self.update_bookmarks(updates, comic_filter)
|
|
208
214
|
return Response()
|
|
@@ -9,17 +9,14 @@ from django.db.models import (
|
|
|
9
9
|
Case,
|
|
10
10
|
F,
|
|
11
11
|
FilteredRelation,
|
|
12
|
-
Max,
|
|
13
12
|
Min,
|
|
14
13
|
Q,
|
|
15
14
|
Sum,
|
|
16
15
|
Value,
|
|
17
16
|
When,
|
|
18
17
|
)
|
|
19
|
-
from django.db.models.expressions import OuterRef
|
|
20
18
|
from django.db.models.fields import CharField, PositiveSmallIntegerField
|
|
21
|
-
from django.db.models.functions import
|
|
22
|
-
from django.db.models.functions.comparison import Greatest
|
|
19
|
+
from django.db.models.functions import Least, Reverse, Right, StrIndex
|
|
23
20
|
|
|
24
21
|
from codex.logger.logging import get_logger
|
|
25
22
|
from codex.models import (
|
|
@@ -34,7 +31,6 @@ from codex.views.browser.order_by import (
|
|
|
34
31
|
BrowserOrderByView,
|
|
35
32
|
)
|
|
36
33
|
from codex.views.const import (
|
|
37
|
-
EPOCH_START,
|
|
38
34
|
NONE_DATETIMEFIELD,
|
|
39
35
|
NONE_INTEGERFIELD,
|
|
40
36
|
STORY_ARC_GROUP,
|
|
@@ -161,28 +157,15 @@ class BrowserAnnotationsView(BrowserOrderByView, SharedAnnotationsMixin):
|
|
|
161
157
|
qs = qs.annotate(page_count=page_count_sum)
|
|
162
158
|
return qs
|
|
163
159
|
|
|
164
|
-
def
|
|
165
|
-
|
|
160
|
+
def _annotate_bookmark_updated_at(self, qs, model):
|
|
161
|
+
if not self.is_opds_1_acquisition and self.order_key != "bookmark_updated_at":
|
|
162
|
+
return qs
|
|
166
163
|
bm_rel, bm_filter = self.get_bookmark_rel_and_filter(model)
|
|
167
|
-
|
|
168
164
|
bm_updated_at_rel = f"{bm_rel}__updated_at"
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (
|
|
174
|
-
self.is_opds_1_acquisition
|
|
175
|
-
or self.order_key == "bookmark_updated_at"
|
|
176
|
-
or self.is_bookmark_filtered
|
|
177
|
-
):
|
|
178
|
-
bookmark_updated_at_aggregate = self.get_bookmark_updated_at_aggregate(
|
|
179
|
-
model
|
|
180
|
-
)
|
|
181
|
-
if self.TARGET == "opds1" or self.is_bookmark_filtered:
|
|
182
|
-
qs = qs.annotate(bookmark_updated_at=bookmark_updated_at_aggregate)
|
|
183
|
-
else:
|
|
184
|
-
qs = qs.alias(bookmark_updated_at=bookmark_updated_at_aggregate)
|
|
185
|
-
return qs
|
|
165
|
+
bmua_agg = self.order_agg_func(
|
|
166
|
+
bm_updated_at_rel, default=NONE_DATETIMEFIELD, filter=bm_filter
|
|
167
|
+
)
|
|
168
|
+
return qs.annotate(bookmark_updated_at=bmua_agg)
|
|
186
169
|
|
|
187
170
|
def _annotate_order_value(self, qs, model):
|
|
188
171
|
"""Annotate a main key for sorting and browser card display."""
|
|
@@ -208,7 +191,6 @@ class BrowserAnnotationsView(BrowserOrderByView, SharedAnnotationsMixin):
|
|
|
208
191
|
|
|
209
192
|
def annotate_order_aggregates(self, qs, model):
|
|
210
193
|
"""Annotate common aggregates between browser and metadata."""
|
|
211
|
-
# ids coming first or before cover_qs works.
|
|
212
194
|
qs = qs.annotate(ids=JsonGroupArray("id", distinct=True))
|
|
213
195
|
qs = self._alias_sort_names(qs, model)
|
|
214
196
|
qs = self._alias_filename(qs, model)
|
|
@@ -299,24 +281,6 @@ class BrowserAnnotationsView(BrowserOrderByView, SharedAnnotationsMixin):
|
|
|
299
281
|
progress = Case(When(page_count__gt=0, then=then), default=0.0)
|
|
300
282
|
return qs.annotate(progress=progress)
|
|
301
283
|
|
|
302
|
-
def _annotate_mtime(self, qs, model):
|
|
303
|
-
"""Annotations mtime."""
|
|
304
|
-
if self.is_bookmark_filtered:
|
|
305
|
-
sub_qs = self.get_filtered_queryset(model, bookmark_filter=False)
|
|
306
|
-
bm_rel, bm_filter = self.get_bookmark_rel_and_filter(model)
|
|
307
|
-
ua_rel = bm_rel + "__updated_at"
|
|
308
|
-
qs = qs.annotate(
|
|
309
|
-
bmu_max=Max(
|
|
310
|
-
sub_qs.filter(pk=OuterRef("pk")).values_list(ua_rel, flat=True),
|
|
311
|
-
default=NONE_DATETIMEFIELD,
|
|
312
|
-
filter=bm_filter,
|
|
313
|
-
)
|
|
314
|
-
)
|
|
315
|
-
mtime = Greatest(Coalesce("bmu_max", Value(EPOCH_START)), "updated_at")
|
|
316
|
-
else:
|
|
317
|
-
mtime = F("updated_at")
|
|
318
|
-
return qs.annotate(mtime=mtime)
|
|
319
|
-
|
|
320
284
|
def annotate_card_aggregates(self, qs, model):
|
|
321
285
|
"""Annotate aggregates that appear the browser card."""
|
|
322
286
|
if model == Comic:
|
|
@@ -326,4 +290,4 @@ class BrowserAnnotationsView(BrowserOrderByView, SharedAnnotationsMixin):
|
|
|
326
290
|
qs = self.annotate_group_names(qs, model)
|
|
327
291
|
qs = self._annotate_bookmarks(qs, model)
|
|
328
292
|
qs = self._annotate_progress(qs)
|
|
329
|
-
return
|
|
293
|
+
return qs.annotate(updated_ats=JsonGroupArray("updated_at", distinct=True))
|
codex/views/browser/browser.py
CHANGED
|
@@ -23,6 +23,7 @@ from codex.views.browser.title import BrowserTitleView
|
|
|
23
23
|
from codex.views.const import (
|
|
24
24
|
COMIC_GROUP,
|
|
25
25
|
FOLDER_GROUP,
|
|
26
|
+
NONE_DATETIMEFIELD,
|
|
26
27
|
STORY_ARC_GROUP,
|
|
27
28
|
)
|
|
28
29
|
|
|
@@ -149,13 +150,23 @@ class BrowserView(BrowserTitleView):
|
|
|
149
150
|
count = 0
|
|
150
151
|
return qs, count
|
|
151
152
|
|
|
152
|
-
def
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
return
|
|
153
|
+
def _requery_max_bookmark_updated_at(self, group_qs):
|
|
154
|
+
"""Get max updated at without bookmark filter and aware of multi-groups."""
|
|
155
|
+
if not self.is_bookmark_filtered:
|
|
156
|
+
return group_qs
|
|
156
157
|
|
|
157
|
-
|
|
158
|
-
|
|
158
|
+
bm_rel, bm_filter = self.get_bookmark_rel_and_filter(self.model)
|
|
159
|
+
bm_updated_at_rel = f"{bm_rel}__updated_at"
|
|
160
|
+
max_bmua = Max(bm_updated_at_rel, default=NONE_DATETIMEFIELD, filter=bm_filter)
|
|
161
|
+
|
|
162
|
+
group_list = []
|
|
163
|
+
for group in group_qs:
|
|
164
|
+
qs = self.get_filtered_queryset(
|
|
165
|
+
self.model, bookmark_filter=False, group_filter=False
|
|
166
|
+
)
|
|
167
|
+
group.max_bookmark_updated_at = qs.aggregate(max=max_bmua)["max"]
|
|
168
|
+
group_list.append(group)
|
|
169
|
+
return group_list
|
|
159
170
|
|
|
160
171
|
@staticmethod
|
|
161
172
|
def _get_zero_pad(book_qs):
|
|
@@ -168,6 +179,14 @@ class BrowserView(BrowserTitleView):
|
|
|
168
179
|
zero_pad += floor(log10(issue_number_max))
|
|
169
180
|
return zero_pad
|
|
170
181
|
|
|
182
|
+
def _get_page_mtime(self):
|
|
183
|
+
if not self.is_bookmark_filtered and self.group_instance:
|
|
184
|
+
# Nice optimization if we can get get it.
|
|
185
|
+
return self.group_instance.updated_at
|
|
186
|
+
|
|
187
|
+
group_model = self.group_class if self.group_class else self.model
|
|
188
|
+
return self.get_group_mtime(group_model, page_mtime=True)
|
|
189
|
+
|
|
171
190
|
def _get_group_and_books(self):
|
|
172
191
|
"""Create the main queries with filters, annotation and pagination."""
|
|
173
192
|
group_qs, group_count = self._get_group_queryset()
|
|
@@ -178,6 +197,7 @@ class BrowserView(BrowserTitleView):
|
|
|
178
197
|
)
|
|
179
198
|
if page_group_count:
|
|
180
199
|
group_qs = self.annotate_card_aggregates(group_qs, self.model)
|
|
200
|
+
group_qs = self._requery_max_bookmark_updated_at(group_qs)
|
|
181
201
|
if page_book_count:
|
|
182
202
|
zero_pad = self._get_zero_pad(book_qs)
|
|
183
203
|
book_qs = self.annotate_card_aggregates(book_qs, Comic)
|
codex/views/browser/choices.py
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from types import MappingProxyType
|
|
4
4
|
|
|
5
|
-
import pycountry
|
|
6
5
|
from caseconverter import snakecase
|
|
7
6
|
from django.db.models import QuerySet
|
|
8
7
|
from drf_spectacular.utils import extend_schema
|
|
@@ -22,7 +21,7 @@ from codex.serializers.browser.filters import (
|
|
|
22
21
|
BrowserFilterChoicesSerializer,
|
|
23
22
|
)
|
|
24
23
|
from codex.serializers.browser.settings import BrowserFilterChoicesInputSerilalizer
|
|
25
|
-
from codex.serializers.
|
|
24
|
+
from codex.serializers.choices import DUMMY_NULL_NAME, VUETIFY_NULL_CODE
|
|
26
25
|
from codex.views.browser.filters.annotations import (
|
|
27
26
|
BrowserAnnotationsFilterView,
|
|
28
27
|
)
|
|
@@ -52,7 +51,7 @@ _BACK_REL_MAP = MappingProxyType(
|
|
|
52
51
|
IdentifierType: "identifier__",
|
|
53
52
|
}
|
|
54
53
|
)
|
|
55
|
-
_NULL_NAMED_ROW = MappingProxyType({"pk":
|
|
54
|
+
_NULL_NAMED_ROW = MappingProxyType({"pk": VUETIFY_NULL_CODE, "name": DUMMY_NULL_NAME})
|
|
56
55
|
|
|
57
56
|
|
|
58
57
|
class BrowserChoicesViewBase(BrowserAnnotationsFilterView):
|
|
@@ -170,24 +169,6 @@ class BrowserChoicesView(BrowserChoicesViewBase):
|
|
|
170
169
|
|
|
171
170
|
serializer_class = BrowserChoicesFilterSerializer
|
|
172
171
|
|
|
173
|
-
def _get_field_choices(self, comic_qs, field_name):
|
|
174
|
-
"""Create a pk:name object for fields without tables."""
|
|
175
|
-
qs = self.get_field_choices_query(comic_qs, field_name)
|
|
176
|
-
|
|
177
|
-
if field_name == "country":
|
|
178
|
-
lookup = pycountry.countries
|
|
179
|
-
elif field_name == "language":
|
|
180
|
-
lookup = pycountry.languages
|
|
181
|
-
else:
|
|
182
|
-
lookup = None
|
|
183
|
-
|
|
184
|
-
choices = []
|
|
185
|
-
for val in qs:
|
|
186
|
-
name = PyCountrySerializer.lookup_name(lookup, val) if lookup else val
|
|
187
|
-
choices.append({"pk": val, "name": name})
|
|
188
|
-
|
|
189
|
-
return choices
|
|
190
|
-
|
|
191
172
|
def _get_m2m_field_choices(self, model, comic_qs, rel):
|
|
192
173
|
"""Get choices with nulls where there are nulls."""
|
|
193
174
|
qs = self.get_m2m_field_query(model, comic_qs)
|
|
@@ -216,7 +197,8 @@ class BrowserChoicesView(BrowserChoicesViewBase):
|
|
|
216
197
|
if m2m_model:
|
|
217
198
|
choices = self._get_m2m_field_choices(m2m_model, qs, rel)
|
|
218
199
|
else:
|
|
219
|
-
choices = self.
|
|
200
|
+
choices = self.get_field_choices_query(qs, field_name)
|
|
201
|
+
|
|
220
202
|
return {
|
|
221
203
|
"field_name": field_name,
|
|
222
204
|
"choices": choices,
|
codex/views/browser/cover.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Comic cover thumbnail view."""
|
|
2
2
|
|
|
3
|
+
from django.db.models.query import Q
|
|
3
4
|
from django.http import HttpResponse
|
|
4
5
|
from drf_spectacular.types import OpenApiTypes
|
|
5
6
|
from drf_spectacular.utils import extend_schema
|
|
@@ -15,6 +16,7 @@ from codex.serializers.browser.settings import BrowserCoverInputSerializer
|
|
|
15
16
|
from codex.views.browser.annotations import BrowserAnnotationsView
|
|
16
17
|
from codex.views.const import (
|
|
17
18
|
CUSTOM_COVER_GROUP_RELATION,
|
|
19
|
+
GROUP_RELATION,
|
|
18
20
|
MISSING_COVER_FN,
|
|
19
21
|
MISSING_COVER_NAME_MAP,
|
|
20
22
|
STATIC_IMG_PATH,
|
|
@@ -43,6 +45,30 @@ class CoverView(BrowserAnnotationsView):
|
|
|
43
45
|
renderer_classes = (WEBPRenderer,)
|
|
44
46
|
content_type = "image/webp"
|
|
45
47
|
TARGET = "cover"
|
|
48
|
+
REPARSE_JSON_FIELDS = frozenset(
|
|
49
|
+
BrowserAnnotationsView.REPARSE_JSON_FIELDS | {"parent"}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def get_group_filter(self, group=None, pks=None, page_mtime=False):
|
|
53
|
+
"""Get group filter for First Cover View."""
|
|
54
|
+
if self.params.get("dynamic_covers"):
|
|
55
|
+
return super().get_group_filter(group=group, pks=pks, page_mtime=page_mtime)
|
|
56
|
+
|
|
57
|
+
# First cover group filter relies on sort names to look outside the browser supplied pks
|
|
58
|
+
# For multi_groups not in the browser query.
|
|
59
|
+
pks = self.kwargs["pks"]
|
|
60
|
+
name_rel = "name" if self.model == Volume else "sort_name"
|
|
61
|
+
qs = self.model.objects.filter(pk__in=pks) # type: ignore
|
|
62
|
+
sort_names = qs.values_list(name_rel, flat=True).distinct()
|
|
63
|
+
model_rel = GROUP_RELATION[self.model_group]
|
|
64
|
+
group_filter = {f"{model_rel}__{name_rel}__in": sort_names}
|
|
65
|
+
|
|
66
|
+
parent = self.params["parent"]
|
|
67
|
+
parent_pks = parent.get("pks", ())
|
|
68
|
+
if parent_pks:
|
|
69
|
+
parent_rel = GROUP_RELATION[parent["group"]]
|
|
70
|
+
group_filter[f"{parent_rel}__pk__in"] = parent_pks
|
|
71
|
+
return Q(**group_filter)
|
|
46
72
|
|
|
47
73
|
def get_model_group(self):
|
|
48
74
|
"""Return the url group."""
|
|
@@ -7,7 +7,7 @@ from codex.models.comic import Comic
|
|
|
7
7
|
from codex.views.browser.filters.bookmark import BookmarkFilterMixin
|
|
8
8
|
from codex.views.browser.validate import BrowserValidateView
|
|
9
9
|
from codex.views.const import (
|
|
10
|
-
|
|
10
|
+
EPOCH_START_DATETIMEFIELD,
|
|
11
11
|
ONE_INTEGERFIELD,
|
|
12
12
|
)
|
|
13
13
|
|
|
@@ -20,13 +20,17 @@ class BrowserAnnotationsFilterView(BrowserValidateView, BookmarkFilterMixin):
|
|
|
20
20
|
super().__init__(*args, **kwargs)
|
|
21
21
|
self.init_bookmark_data()
|
|
22
22
|
|
|
23
|
-
def _get_query_filters(
|
|
23
|
+
def _get_query_filters( # noqa: PLR0913
|
|
24
|
+
self, model, group, pks, bookmark_filter, page_mtime=False, group_filter=True
|
|
25
|
+
):
|
|
24
26
|
"""Return all the filters except the group filter."""
|
|
27
|
+
# TODO all these ifs and flags are awful
|
|
25
28
|
object_filter = self.get_group_acl_filter(model)
|
|
26
|
-
|
|
29
|
+
if group_filter:
|
|
30
|
+
object_filter &= self.get_group_filter(group, pks, page_mtime=page_mtime)
|
|
27
31
|
object_filter &= self.get_comic_field_filter(model)
|
|
28
32
|
if bookmark_filter:
|
|
29
|
-
# not needed
|
|
33
|
+
# not needed when used by outerrefl OuterRef is applied next
|
|
30
34
|
object_filter &= self.get_bookmark_filter(model)
|
|
31
35
|
return object_filter
|
|
32
36
|
|
|
@@ -46,11 +50,22 @@ class BrowserAnnotationsFilterView(BrowserValidateView, BookmarkFilterMixin):
|
|
|
46
50
|
return qs
|
|
47
51
|
|
|
48
52
|
def get_filtered_queryset( # noqa: PLR0913
|
|
49
|
-
self,
|
|
53
|
+
self,
|
|
54
|
+
model,
|
|
55
|
+
group=None,
|
|
56
|
+
pks=None,
|
|
57
|
+
bookmark_filter=True,
|
|
58
|
+
page_mtime=False,
|
|
59
|
+
group_filter=True,
|
|
50
60
|
):
|
|
51
61
|
"""Get a filtered queryset for the model."""
|
|
52
62
|
object_filter = self._get_query_filters(
|
|
53
|
-
model,
|
|
63
|
+
model,
|
|
64
|
+
group,
|
|
65
|
+
pks,
|
|
66
|
+
bookmark_filter,
|
|
67
|
+
page_mtime=page_mtime,
|
|
68
|
+
group_filter=group_filter,
|
|
54
69
|
)
|
|
55
70
|
qs = model.objects.filter(object_filter)
|
|
56
71
|
qs = self.apply_search_filter(qs, model)
|
|
@@ -73,12 +88,12 @@ class BrowserAnnotationsFilterView(BrowserValidateView, BookmarkFilterMixin):
|
|
|
73
88
|
ua_rel = bm_rel + "__updated_at"
|
|
74
89
|
mbua = Max(ua_rel)
|
|
75
90
|
else:
|
|
76
|
-
mbua =
|
|
91
|
+
mbua = EPOCH_START_DATETIMEFIELD
|
|
77
92
|
qs = qs.annotate(max_bookmark_updated_at=mbua)
|
|
78
93
|
|
|
79
94
|
mtime = qs.aggregate(
|
|
80
95
|
max=Greatest(
|
|
81
|
-
Coalesce("max_bookmark_updated_at",
|
|
96
|
+
Coalesce("max_bookmark_updated_at", EPOCH_START_DATETIMEFIELD),
|
|
82
97
|
"max_updated_at",
|
|
83
98
|
)
|
|
84
99
|
)["max"]
|
codex/views/browser/metadata.py
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from types import MappingProxyType
|
|
4
4
|
|
|
5
|
-
from django.core.exceptions import FieldDoesNotExist
|
|
6
5
|
from django.db.models import Count, IntegerField, Sum, Value
|
|
7
6
|
from drf_spectacular.utils import extend_schema
|
|
8
7
|
from rest_framework.exceptions import NotFound
|
|
@@ -42,7 +41,21 @@ _COMIC_RELATED_VALUE_FIELDS = frozenset({"series__volume_count", "volume__issue_
|
|
|
42
41
|
_PATH_GROUPS = frozenset({"c", "f"})
|
|
43
42
|
_CONTRIBUTOR_RELATIONS = ("role", "person")
|
|
44
43
|
_SUM_FIELDS = frozenset({"page_count", "size"})
|
|
45
|
-
_GROUP_RELS =
|
|
44
|
+
_GROUP_RELS = MappingProxyType(
|
|
45
|
+
{
|
|
46
|
+
"i": ("publisher",),
|
|
47
|
+
"s": (
|
|
48
|
+
"publisher",
|
|
49
|
+
"imprint",
|
|
50
|
+
),
|
|
51
|
+
"v": (
|
|
52
|
+
"publisher",
|
|
53
|
+
"imprint",
|
|
54
|
+
"series",
|
|
55
|
+
),
|
|
56
|
+
"c": ("publisher", "imprint", "series", "volume"),
|
|
57
|
+
}
|
|
58
|
+
)
|
|
46
59
|
|
|
47
60
|
|
|
48
61
|
class MetadataView(BrowserAnnotationsView):
|
|
@@ -156,11 +169,8 @@ class MetadataView(BrowserAnnotationsView):
|
|
|
156
169
|
pks = self.kwargs["pks"]
|
|
157
170
|
group_filter = {rel: pks}
|
|
158
171
|
|
|
159
|
-
for field_name in _GROUP_RELS:
|
|
160
|
-
|
|
161
|
-
field = self.model._meta.get_field(field_name)
|
|
162
|
-
except FieldDoesNotExist:
|
|
163
|
-
continue
|
|
172
|
+
for field_name in _GROUP_RELS.get(group, ()):
|
|
173
|
+
field = self.model._meta.get_field(field_name)
|
|
164
174
|
model = field.related_model
|
|
165
175
|
if not model:
|
|
166
176
|
continue
|
codex/views/const.py
CHANGED
|
@@ -157,4 +157,4 @@ EPOCH_START = datetime.fromtimestamp(0, tz=timezone.utc)
|
|
|
157
157
|
ONE_INTEGERFIELD = Value(1, PositiveSmallIntegerField())
|
|
158
158
|
NONE_INTEGERFIELD = Value(None, PositiveSmallIntegerField())
|
|
159
159
|
NONE_DATETIMEFIELD = Value(None, DateTimeField())
|
|
160
|
-
|
|
160
|
+
EPOCH_START_DATETIMEFIELD = Value(EPOCH_START)
|
codex/views/reader/init.py
CHANGED
|
@@ -107,15 +107,19 @@ class ReaderInitView(SessionView):
|
|
|
107
107
|
params["arc"] = arc
|
|
108
108
|
|
|
109
109
|
def _parse_params(self):
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
110
|
+
try:
|
|
111
|
+
data = self.request.GET
|
|
112
|
+
data = reparse_json_query_params(self.request.GET, _JSON_KEYS)
|
|
113
|
+
serializer = self.input_serializer_class(data=data)
|
|
114
|
+
serializer.is_valid(raise_exception=True)
|
|
115
|
+
|
|
116
|
+
params = deepcopy(_DEFAULT_PARAMS)
|
|
117
|
+
if serializer.validated_data:
|
|
118
|
+
params.update(serializer.validated_data) # type: ignore
|
|
119
|
+
self._ensure_arc_contains_comic(params)
|
|
120
|
+
self._ensure_arc(params)
|
|
121
|
+
|
|
122
|
+
self.params = MappingProxyType(params)
|
|
123
|
+
except Exception:
|
|
124
|
+
LOG.exception("validate")
|
|
125
|
+
raise
|
codex/views/session.py
CHANGED
|
@@ -69,8 +69,10 @@ class SessionView(AuthFilterGenericAPIView, ABC):
|
|
|
69
69
|
"top_group": DEFAULTS["topGroup"],
|
|
70
70
|
},
|
|
71
71
|
READER_SESSION_KEY: {
|
|
72
|
+
"finish_on_last_page": DEFAULTS["finishOnLastPage"],
|
|
72
73
|
"fit_to": DEFAULTS["fitTo"],
|
|
73
|
-
"two_pages":
|
|
74
|
+
"two_pages": DEFAULTS["twoPages"],
|
|
75
|
+
"read_rtl_in_reverse": DEFAULTS["readRtlInReverse"],
|
|
74
76
|
"reading_direction": DEFAULTS["readingDirection"],
|
|
75
77
|
},
|
|
76
78
|
}
|