codex 1.5.13a0__py3-none-any.whl → 1.5.13a2__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.

Files changed (379) hide show
  1. codex/applications/websocket.py +1 -7
  2. codex/librarian/importer/query_fks.py +1 -0
  3. codex/serializers/browser/settings.py +0 -1
  4. codex/serializers/choices.py +1 -2
  5. codex/settings/settings.py +0 -5
  6. codex/signals/django_signals.py +0 -6
  7. codex/static_root/assets/{VCheckbox-BMRDCYNv.7f791d7f065f.js → VCheckbox-BR-5qiW4.d4e12b9a3549.js} +1 -1
  8. codex/static_root/assets/VCheckbox-BR-5qiW4.d4e12b9a3549.js.br +0 -0
  9. codex/static_root/assets/VCheckbox-BR-5qiW4.d4e12b9a3549.js.gz +0 -0
  10. codex/static_root/assets/{VCheckbox-BMRDCYNv.js → VCheckbox-BR-5qiW4.js} +1 -1
  11. codex/static_root/assets/VCheckbox-BR-5qiW4.js.br +0 -0
  12. codex/static_root/assets/VCheckbox-BR-5qiW4.js.gz +0 -0
  13. codex/static_root/assets/{VCheckboxBtn-Dqp1u3GT.e80f145994b6.js → VCheckboxBtn-C7T6Tf80.597cfcc88998.js} +1 -1
  14. codex/static_root/assets/VCheckboxBtn-C7T6Tf80.597cfcc88998.js.br +0 -0
  15. codex/static_root/assets/VCheckboxBtn-C7T6Tf80.597cfcc88998.js.gz +0 -0
  16. codex/static_root/assets/{VCheckboxBtn-Dqp1u3GT.js → VCheckboxBtn-C7T6Tf80.js} +1 -1
  17. codex/static_root/assets/VCheckboxBtn-C7T6Tf80.js.br +0 -0
  18. codex/static_root/assets/VCheckboxBtn-C7T6Tf80.js.gz +0 -0
  19. codex/static_root/assets/{VCombobox-DT52mZm3.309c77be4a55.js → VCombobox-CA6L757N.c9c01cbc12eb.js} +1 -1
  20. codex/static_root/assets/VCombobox-CA6L757N.c9c01cbc12eb.js.br +0 -0
  21. codex/static_root/assets/VCombobox-CA6L757N.c9c01cbc12eb.js.gz +0 -0
  22. codex/static_root/assets/{VCombobox-DT52mZm3.js → VCombobox-CA6L757N.js} +1 -1
  23. codex/static_root/assets/VCombobox-CA6L757N.js.br +0 -0
  24. codex/static_root/assets/VCombobox-CA6L757N.js.gz +0 -0
  25. codex/static_root/assets/{VDataTableVirtual-DhhCmPtf.0735a1ab4c2f.js → VDataTableVirtual-DgdQqVhC.118522d90dfd.js} +1 -1
  26. codex/static_root/assets/VDataTableVirtual-DgdQqVhC.118522d90dfd.js.br +0 -0
  27. codex/static_root/assets/VDataTableVirtual-DgdQqVhC.118522d90dfd.js.gz +0 -0
  28. codex/static_root/assets/{VDataTableVirtual-DhhCmPtf.js → VDataTableVirtual-DgdQqVhC.js} +1 -1
  29. codex/static_root/assets/VDataTableVirtual-DgdQqVhC.js.br +0 -0
  30. codex/static_root/assets/VDataTableVirtual-DgdQqVhC.js.gz +0 -0
  31. codex/static_root/assets/{VExpansionPanel-C593uXqT.d3bdc6a21208.js → VExpansionPanel-DSgyCbMu.ce806293d8ad.js} +1 -1
  32. codex/static_root/assets/VExpansionPanel-DSgyCbMu.ce806293d8ad.js.br +0 -0
  33. codex/static_root/assets/VExpansionPanel-DSgyCbMu.ce806293d8ad.js.gz +0 -0
  34. codex/static_root/assets/{VExpansionPanel-C593uXqT.js → VExpansionPanel-DSgyCbMu.js} +1 -1
  35. codex/static_root/assets/VExpansionPanel-DSgyCbMu.js.br +0 -0
  36. codex/static_root/assets/VExpansionPanel-DSgyCbMu.js.gz +0 -0
  37. codex/static_root/assets/{VMain-DmQvRj_k.1e0480bed9a6.js → VMain-CDWaq_uU.9350720f2523.js} +1 -1
  38. codex/static_root/assets/VMain-CDWaq_uU.9350720f2523.js.br +0 -0
  39. codex/static_root/assets/VMain-CDWaq_uU.9350720f2523.js.gz +0 -0
  40. codex/static_root/assets/{VMain-DmQvRj_k.js → VMain-CDWaq_uU.js} +1 -1
  41. codex/static_root/assets/VMain-CDWaq_uU.js.br +0 -0
  42. codex/static_root/assets/VMain-CDWaq_uU.js.gz +0 -0
  43. codex/static_root/assets/{VRadioGroup-Bi16yPEE.69086b77f9b1.js → VRadioGroup-1KnJv1YV.c78bc794333b.js} +1 -1
  44. codex/static_root/assets/VRadioGroup-1KnJv1YV.c78bc794333b.js.br +0 -0
  45. codex/static_root/assets/VRadioGroup-1KnJv1YV.c78bc794333b.js.gz +0 -0
  46. codex/static_root/assets/{VRadioGroup-Bi16yPEE.js → VRadioGroup-1KnJv1YV.js} +1 -1
  47. codex/static_root/assets/VRadioGroup-1KnJv1YV.js.br +0 -0
  48. codex/static_root/assets/VRadioGroup-1KnJv1YV.js.gz +0 -0
  49. codex/static_root/assets/{VSelect-BdaijxdJ.b969ab260593.js → VSelect-CLw1oGQg.37122543e75e.js} +1 -1
  50. codex/static_root/assets/VSelect-CLw1oGQg.37122543e75e.js.br +0 -0
  51. codex/static_root/assets/VSelect-CLw1oGQg.37122543e75e.js.gz +0 -0
  52. codex/static_root/assets/{VSelect-BdaijxdJ.js → VSelect-CLw1oGQg.js} +1 -1
  53. codex/static_root/assets/VSelect-CLw1oGQg.js.br +0 -0
  54. codex/static_root/assets/VSelect-CLw1oGQg.js.gz +0 -0
  55. codex/static_root/assets/{VSelectionControl-CuM4okF6.0f246e35e86f.js → VSelectionControl-CEOyDLZC.60a1d02bebde.js} +1 -1
  56. codex/static_root/assets/VSelectionControl-CEOyDLZC.60a1d02bebde.js.br +0 -0
  57. codex/static_root/assets/VSelectionControl-CEOyDLZC.60a1d02bebde.js.gz +0 -0
  58. codex/static_root/assets/{VSelectionControl-CuM4okF6.js → VSelectionControl-CEOyDLZC.js} +1 -1
  59. codex/static_root/assets/VSelectionControl-CEOyDLZC.js.br +0 -0
  60. codex/static_root/assets/VSelectionControl-CEOyDLZC.js.gz +0 -0
  61. codex/static_root/assets/{VSlideGroup-ztBraz6g.02a0bc55b207.js → VSlideGroup-r8lyA6_4.d51fe70b8cfa.js} +1 -1
  62. codex/static_root/assets/VSlideGroup-r8lyA6_4.d51fe70b8cfa.js.br +0 -0
  63. codex/static_root/assets/VSlideGroup-r8lyA6_4.d51fe70b8cfa.js.gz +0 -0
  64. codex/static_root/assets/{VSlideGroup-ztBraz6g.js → VSlideGroup-r8lyA6_4.js} +1 -1
  65. codex/static_root/assets/VSlideGroup-r8lyA6_4.js.br +0 -0
  66. codex/static_root/assets/VSlideGroup-r8lyA6_4.js.gz +0 -0
  67. codex/static_root/assets/{VTable-CGuSv-Tv.eddaf5526d93.js → VTable-CyZmujCR.5d4fdcc0324d.js} +1 -1
  68. codex/static_root/assets/VTable-CyZmujCR.5d4fdcc0324d.js.br +0 -0
  69. codex/static_root/assets/VTable-CyZmujCR.5d4fdcc0324d.js.gz +0 -0
  70. codex/static_root/assets/{VTable-CGuSv-Tv.js → VTable-CyZmujCR.js} +1 -1
  71. codex/static_root/assets/VTable-CyZmujCR.js.br +0 -0
  72. codex/static_root/assets/VTable-CyZmujCR.js.gz +0 -0
  73. codex/static_root/assets/{VToolbar-CAUhD2BO.279f0b52347a.js → VToolbar-qYCVOLXR.07eda01fd108.js} +2 -2
  74. codex/static_root/assets/VToolbar-qYCVOLXR.07eda01fd108.js.br +0 -0
  75. codex/static_root/assets/VToolbar-qYCVOLXR.07eda01fd108.js.gz +0 -0
  76. codex/static_root/assets/{VToolbar-CAUhD2BO.js → VToolbar-qYCVOLXR.js} +2 -2
  77. codex/static_root/assets/VToolbar-qYCVOLXR.js.br +0 -0
  78. codex/static_root/assets/VToolbar-qYCVOLXR.js.gz +0 -0
  79. codex/static_root/assets/{VWindowItem-YvmNwCNb.20a7e3b303de.js → VWindowItem-DAPhfogt.d9e874ecf5be.js} +1 -1
  80. codex/static_root/assets/VWindowItem-DAPhfogt.d9e874ecf5be.js.br +0 -0
  81. codex/static_root/assets/VWindowItem-DAPhfogt.d9e874ecf5be.js.gz +0 -0
  82. codex/static_root/assets/{VWindowItem-YvmNwCNb.js → VWindowItem-DAPhfogt.js} +1 -1
  83. codex/static_root/assets/VWindowItem-DAPhfogt.js.br +0 -0
  84. codex/static_root/assets/VWindowItem-DAPhfogt.js.gz +0 -0
  85. codex/static_root/assets/{admin-Ch9WezG1.bdace86b7c25.js → admin-CfqyTXqy.b073b6fa7ebd.js} +1 -1
  86. codex/static_root/assets/admin-CfqyTXqy.b073b6fa7ebd.js.br +0 -0
  87. codex/static_root/assets/admin-CfqyTXqy.b073b6fa7ebd.js.gz +0 -0
  88. codex/static_root/assets/{admin-Ch9WezG1.js → admin-CfqyTXqy.js} +1 -1
  89. codex/static_root/assets/admin-CfqyTXqy.js.br +0 -0
  90. codex/static_root/assets/admin-CfqyTXqy.js.gz +0 -0
  91. codex/static_root/assets/{admin-drawer-panel-B4VvGE4s.2265b9de60ab.js → admin-drawer-panel-UQNBz5Mr.4f87b323dcdc.js} +1 -1
  92. codex/static_root/assets/admin-drawer-panel-UQNBz5Mr.4f87b323dcdc.js.br +0 -0
  93. codex/static_root/assets/{admin-drawer-panel-B4VvGE4s.2265b9de60ab.js.gz → admin-drawer-panel-UQNBz5Mr.4f87b323dcdc.js.gz} +0 -0
  94. codex/static_root/assets/{admin-drawer-panel-B4VvGE4s.js → admin-drawer-panel-UQNBz5Mr.js} +1 -1
  95. codex/static_root/assets/admin-drawer-panel-UQNBz5Mr.js.br +0 -0
  96. codex/static_root/assets/{admin-drawer-panel-B4VvGE4s.js.gz → admin-drawer-panel-UQNBz5Mr.js.gz} +0 -0
  97. codex/static_root/assets/{browser-CVvV08AM.7667051b18fa.css → browser-CTxEKlCx.211d729d9165.css} +1 -1
  98. codex/static_root/assets/browser-CTxEKlCx.211d729d9165.css.br +0 -0
  99. codex/static_root/assets/browser-CTxEKlCx.211d729d9165.css.gz +0 -0
  100. codex/static_root/assets/{browser-CVvV08AM.css → browser-CTxEKlCx.css} +1 -1
  101. codex/static_root/assets/browser-CTxEKlCx.css.br +0 -0
  102. codex/static_root/assets/browser-CTxEKlCx.css.gz +0 -0
  103. codex/static_root/assets/browser-CWqU3TI5.4583f12be6b9.js +1 -0
  104. codex/static_root/assets/browser-CWqU3TI5.4583f12be6b9.js.br +0 -0
  105. codex/static_root/assets/browser-CWqU3TI5.4583f12be6b9.js.gz +0 -0
  106. codex/static_root/assets/browser-CWqU3TI5.js +1 -0
  107. codex/static_root/assets/browser-CWqU3TI5.js.br +0 -0
  108. codex/static_root/assets/browser-CWqU3TI5.js.gz +0 -0
  109. codex/static_root/assets/{change-password-dialog-Dq6GjT1T.01b56b4b3e87.js → change-password-dialog-D80TfT-n.284c707d3d79.js} +1 -1
  110. codex/static_root/assets/change-password-dialog-D80TfT-n.284c707d3d79.js.br +0 -0
  111. codex/static_root/assets/change-password-dialog-D80TfT-n.284c707d3d79.js.gz +0 -0
  112. codex/static_root/assets/{change-password-dialog-Dq6GjT1T.js → change-password-dialog-D80TfT-n.js} +1 -1
  113. codex/static_root/assets/change-password-dialog-D80TfT-n.js.br +0 -0
  114. codex/static_root/assets/change-password-dialog-D80TfT-n.js.gz +0 -0
  115. codex/static_root/assets/{confirm-dialog-D-Fx-51m.54b7d1059106.js → confirm-dialog-CTwvsrD2.8de12739f859.js} +1 -1
  116. codex/static_root/assets/confirm-dialog-CTwvsrD2.8de12739f859.js.br +0 -0
  117. codex/static_root/assets/confirm-dialog-CTwvsrD2.8de12739f859.js.gz +0 -0
  118. codex/static_root/assets/{confirm-dialog-D-Fx-51m.js → confirm-dialog-CTwvsrD2.js} +1 -1
  119. codex/static_root/assets/confirm-dialog-CTwvsrD2.js.br +0 -0
  120. codex/static_root/assets/confirm-dialog-CTwvsrD2.js.gz +0 -0
  121. codex/static_root/assets/{confirm-footer-Yn7T9Tns.js → confirm-footer-CLcqjnLg.ebed69027134.js} +1 -1
  122. codex/static_root/assets/confirm-footer-CLcqjnLg.ebed69027134.js.br +0 -0
  123. codex/static_root/assets/confirm-footer-CLcqjnLg.ebed69027134.js.gz +0 -0
  124. codex/static_root/assets/{confirm-footer-Yn7T9Tns.75a17cd86ca9.js → confirm-footer-CLcqjnLg.js} +1 -1
  125. codex/static_root/assets/confirm-footer-CLcqjnLg.js.br +0 -0
  126. codex/static_root/assets/confirm-footer-CLcqjnLg.js.gz +0 -0
  127. codex/static_root/assets/{datetime-column-DCeBthsr.22ed49a999cc.js → datetime-column-DPVO98E2.27e26fb391ca.js} +1 -1
  128. codex/static_root/assets/datetime-column-DPVO98E2.27e26fb391ca.js.br +0 -0
  129. codex/static_root/assets/datetime-column-DPVO98E2.27e26fb391ca.js.gz +0 -0
  130. codex/static_root/assets/{datetime-column-DCeBthsr.js → datetime-column-DPVO98E2.js} +1 -1
  131. codex/static_root/assets/datetime-column-DPVO98E2.js.br +0 -0
  132. codex/static_root/assets/datetime-column-DPVO98E2.js.gz +0 -0
  133. codex/static_root/assets/{filter-Dw0fjwZi.4d5f085435ab.js → filter-Cqjy01SO.71710ea1c7f8.js} +1 -1
  134. codex/static_root/assets/filter-Cqjy01SO.71710ea1c7f8.js.br +0 -0
  135. codex/static_root/assets/filter-Cqjy01SO.71710ea1c7f8.js.gz +0 -0
  136. codex/static_root/assets/{filter-Dw0fjwZi.js → filter-Cqjy01SO.js} +1 -1
  137. codex/static_root/assets/filter-Cqjy01SO.js.br +0 -0
  138. codex/static_root/assets/filter-Cqjy01SO.js.gz +0 -0
  139. codex/static_root/assets/{flag-tab-D5RcLFbQ.1073708ea164.js → flag-tab-BERamYWo.52c4bc9b4243.js} +1 -1
  140. codex/static_root/assets/flag-tab-BERamYWo.52c4bc9b4243.js.br +0 -0
  141. codex/static_root/assets/flag-tab-BERamYWo.52c4bc9b4243.js.gz +0 -0
  142. codex/static_root/assets/{flag-tab-D5RcLFbQ.js → flag-tab-BERamYWo.js} +1 -1
  143. codex/static_root/assets/flag-tab-BERamYWo.js.br +0 -0
  144. codex/static_root/assets/flag-tab-BERamYWo.js.gz +0 -0
  145. codex/static_root/assets/{group-tab-BilDDNz5.cba5ca15d7cf.js → group-tab-DknI2YL3.7b2e5d32ee7e.js} +1 -1
  146. codex/static_root/assets/group-tab-DknI2YL3.7b2e5d32ee7e.js.br +0 -0
  147. codex/static_root/assets/group-tab-DknI2YL3.7b2e5d32ee7e.js.gz +0 -0
  148. codex/static_root/assets/{group-tab-BilDDNz5.js → group-tab-DknI2YL3.js} +1 -1
  149. codex/static_root/assets/group-tab-DknI2YL3.js.br +0 -0
  150. codex/static_root/assets/group-tab-DknI2YL3.js.gz +0 -0
  151. codex/static_root/assets/{http-error-DHmC7qgT.bde1d32b55df.js → http-error-DxxoT0wf.8f26afe5c1dd.js} +1 -1
  152. codex/static_root/assets/http-error-DxxoT0wf.8f26afe5c1dd.js.br +0 -0
  153. codex/static_root/assets/http-error-DxxoT0wf.8f26afe5c1dd.js.gz +0 -0
  154. codex/static_root/assets/{http-error-DHmC7qgT.js → http-error-DxxoT0wf.js} +1 -1
  155. codex/static_root/assets/http-error-DxxoT0wf.js.br +0 -0
  156. codex/static_root/assets/http-error-DxxoT0wf.js.gz +0 -0
  157. codex/static_root/assets/{library-tab-dbcbv0--.efa2d1d95b77.js → library-tab-DXCuu0zS.6a7b7e48a6f5.js} +1 -1
  158. codex/static_root/assets/library-tab-DXCuu0zS.6a7b7e48a6f5.js.br +0 -0
  159. codex/static_root/assets/library-tab-DXCuu0zS.6a7b7e48a6f5.js.gz +0 -0
  160. codex/static_root/assets/{library-tab-dbcbv0--.js → library-tab-DXCuu0zS.js} +1 -1
  161. codex/static_root/assets/library-tab-DXCuu0zS.js.br +0 -0
  162. codex/static_root/assets/library-tab-DXCuu0zS.js.gz +0 -0
  163. codex/static_root/assets/{main-CCY5Ix0K.js → main-CTJQvqMb.1d5f619166b3.js} +4 -4
  164. codex/static_root/assets/main-CTJQvqMb.1d5f619166b3.js.br +0 -0
  165. codex/static_root/assets/main-CTJQvqMb.1d5f619166b3.js.gz +0 -0
  166. codex/static_root/assets/{main-CCY5Ix0K.b067e1d16cf5.js → main-CTJQvqMb.js} +4 -4
  167. codex/static_root/assets/main-CTJQvqMb.js.br +0 -0
  168. codex/static_root/assets/main-CTJQvqMb.js.gz +0 -0
  169. codex/static_root/assets/metadata-dialog-CZDWNVCD.b78ed72bc090.js +1 -0
  170. codex/static_root/assets/metadata-dialog-CZDWNVCD.b78ed72bc090.js.br +0 -0
  171. codex/static_root/assets/metadata-dialog-CZDWNVCD.b78ed72bc090.js.gz +0 -0
  172. codex/static_root/assets/metadata-dialog-CZDWNVCD.js +1 -0
  173. codex/static_root/assets/metadata-dialog-CZDWNVCD.js.br +0 -0
  174. codex/static_root/assets/metadata-dialog-CZDWNVCD.js.gz +0 -0
  175. codex/static_root/assets/{metadata-dialog-DIhQctD5.67830cc94cf8.css → metadata-dialog-QTkQOBoB.2e6935edafee.css} +1 -1
  176. codex/static_root/assets/metadata-dialog-QTkQOBoB.2e6935edafee.css.br +0 -0
  177. codex/static_root/assets/metadata-dialog-QTkQOBoB.2e6935edafee.css.gz +0 -0
  178. codex/static_root/assets/{metadata-dialog-DIhQctD5.css → metadata-dialog-QTkQOBoB.css} +1 -1
  179. codex/static_root/assets/metadata-dialog-QTkQOBoB.css.br +0 -0
  180. codex/static_root/assets/metadata-dialog-QTkQOBoB.css.gz +0 -0
  181. codex/static_root/assets/{pdf-doc-CEOcuQZb.260e6671eb89.js → pdf-doc-C_LEA8HV.6bd1dba60a0b.js} +1 -1
  182. codex/static_root/assets/pdf-doc-C_LEA8HV.6bd1dba60a0b.js.br +0 -0
  183. codex/static_root/assets/pdf-doc-C_LEA8HV.6bd1dba60a0b.js.gz +0 -0
  184. codex/static_root/assets/{pdf-doc-CEOcuQZb.js → pdf-doc-C_LEA8HV.js} +1 -1
  185. codex/static_root/assets/pdf-doc-C_LEA8HV.js.br +0 -0
  186. codex/static_root/assets/pdf-doc-C_LEA8HV.js.gz +0 -0
  187. codex/static_root/assets/{reader-DRsYPz-3.b8ee57f2aefc.js → reader-DXk46jdF.0a2b0809bd02.js} +2 -2
  188. codex/static_root/assets/reader-DXk46jdF.0a2b0809bd02.js.br +0 -0
  189. codex/static_root/assets/reader-DXk46jdF.0a2b0809bd02.js.gz +0 -0
  190. codex/static_root/assets/{reader-DRsYPz-3.js → reader-DXk46jdF.js} +2 -2
  191. codex/static_root/assets/reader-DXk46jdF.js.br +0 -0
  192. codex/static_root/assets/reader-DXk46jdF.js.gz +0 -0
  193. codex/static_root/assets/{stats-tab-QTG23RuT.654f85e0b21d.js → stats-tab-Dy0YEoJ4.f24c8ddba0d3.js} +1 -1
  194. codex/static_root/assets/stats-tab-Dy0YEoJ4.f24c8ddba0d3.js.br +0 -0
  195. codex/static_root/assets/stats-tab-Dy0YEoJ4.f24c8ddba0d3.js.gz +0 -0
  196. codex/static_root/assets/{stats-tab-QTG23RuT.js → stats-tab-Dy0YEoJ4.js} +1 -1
  197. codex/static_root/assets/stats-tab-Dy0YEoJ4.js.br +0 -0
  198. codex/static_root/assets/stats-tab-Dy0YEoJ4.js.gz +0 -0
  199. codex/static_root/assets/{task-tab-Kff6fz1t.28380a665ed7.js → task-tab-Bv3B4rCC.1546850899dc.js} +1 -1
  200. codex/static_root/assets/task-tab-Bv3B4rCC.1546850899dc.js.br +0 -0
  201. codex/static_root/assets/task-tab-Bv3B4rCC.1546850899dc.js.gz +0 -0
  202. codex/static_root/assets/{task-tab-Kff6fz1t.js → task-tab-Bv3B4rCC.js} +1 -1
  203. codex/static_root/assets/task-tab-Bv3B4rCC.js.br +0 -0
  204. codex/static_root/assets/task-tab-Bv3B4rCC.js.gz +0 -0
  205. codex/static_root/assets/{user-tab-OAmZ6CQl.eed3361aefb7.js → user-tab-CSF2DZe5.8e65aaed43b2.js} +1 -1
  206. codex/static_root/assets/user-tab-CSF2DZe5.8e65aaed43b2.js.br +0 -0
  207. codex/static_root/assets/user-tab-CSF2DZe5.8e65aaed43b2.js.gz +0 -0
  208. codex/static_root/assets/{user-tab-OAmZ6CQl.js → user-tab-CSF2DZe5.js} +1 -1
  209. codex/static_root/assets/user-tab-CSF2DZe5.js.br +0 -0
  210. codex/static_root/assets/user-tab-CSF2DZe5.js.gz +0 -0
  211. codex/static_root/js/choices.fedcbd1ec085.json +1 -0
  212. codex/static_root/js/choices.fedcbd1ec085.json.br +0 -0
  213. codex/static_root/js/choices.fedcbd1ec085.json.gz +0 -0
  214. codex/static_root/js/choices.json +1 -1
  215. codex/static_root/js/choices.json.br +0 -0
  216. codex/static_root/js/choices.json.gz +0 -0
  217. codex/static_root/{manifest.13219ea92507.json → manifest.24ec466b9bcf.json} +212 -213
  218. codex/static_root/manifest.24ec466b9bcf.json.br +0 -0
  219. codex/static_root/manifest.24ec466b9bcf.json.gz +0 -0
  220. codex/static_root/manifest.json +212 -213
  221. codex/static_root/manifest.json.br +0 -0
  222. codex/static_root/manifest.json.gz +0 -0
  223. codex/static_root/staticfiles.json +1 -1
  224. codex/views/browser/base.py +8 -10
  225. codex/views/browser/browser.py +17 -23
  226. codex/views/browser/browser_annotations.py +7 -19
  227. codex/views/browser/choices.py +5 -3
  228. codex/views/browser/filters/search.py +22 -114
  229. codex/views/browser/metadata.py +6 -4
  230. codex/views/error.py +0 -1
  231. codex/views/session.py +0 -1
  232. {codex-1.5.13a0.dist-info → codex-1.5.13a2.dist-info}/METADATA +1 -2
  233. {codex-1.5.13a0.dist-info → codex-1.5.13a2.dist-info}/RECORD +236 -236
  234. codex/static_root/assets/VCheckbox-BMRDCYNv.7f791d7f065f.js.br +0 -0
  235. codex/static_root/assets/VCheckbox-BMRDCYNv.7f791d7f065f.js.gz +0 -0
  236. codex/static_root/assets/VCheckbox-BMRDCYNv.js.br +0 -0
  237. codex/static_root/assets/VCheckbox-BMRDCYNv.js.gz +0 -0
  238. codex/static_root/assets/VCheckboxBtn-Dqp1u3GT.e80f145994b6.js.br +0 -0
  239. codex/static_root/assets/VCheckboxBtn-Dqp1u3GT.e80f145994b6.js.gz +0 -0
  240. codex/static_root/assets/VCheckboxBtn-Dqp1u3GT.js.br +0 -0
  241. codex/static_root/assets/VCheckboxBtn-Dqp1u3GT.js.gz +0 -0
  242. codex/static_root/assets/VCombobox-DT52mZm3.309c77be4a55.js.br +0 -0
  243. codex/static_root/assets/VCombobox-DT52mZm3.309c77be4a55.js.gz +0 -0
  244. codex/static_root/assets/VCombobox-DT52mZm3.js.br +0 -0
  245. codex/static_root/assets/VCombobox-DT52mZm3.js.gz +0 -0
  246. codex/static_root/assets/VDataTableVirtual-DhhCmPtf.0735a1ab4c2f.js.br +0 -0
  247. codex/static_root/assets/VDataTableVirtual-DhhCmPtf.0735a1ab4c2f.js.gz +0 -0
  248. codex/static_root/assets/VDataTableVirtual-DhhCmPtf.js.br +0 -0
  249. codex/static_root/assets/VDataTableVirtual-DhhCmPtf.js.gz +0 -0
  250. codex/static_root/assets/VExpansionPanel-C593uXqT.d3bdc6a21208.js.br +0 -0
  251. codex/static_root/assets/VExpansionPanel-C593uXqT.d3bdc6a21208.js.gz +0 -0
  252. codex/static_root/assets/VExpansionPanel-C593uXqT.js.br +0 -0
  253. codex/static_root/assets/VExpansionPanel-C593uXqT.js.gz +0 -0
  254. codex/static_root/assets/VMain-DmQvRj_k.1e0480bed9a6.js.br +0 -0
  255. codex/static_root/assets/VMain-DmQvRj_k.1e0480bed9a6.js.gz +0 -0
  256. codex/static_root/assets/VMain-DmQvRj_k.js.br +0 -0
  257. codex/static_root/assets/VMain-DmQvRj_k.js.gz +0 -0
  258. codex/static_root/assets/VRadioGroup-Bi16yPEE.69086b77f9b1.js.br +0 -0
  259. codex/static_root/assets/VRadioGroup-Bi16yPEE.69086b77f9b1.js.gz +0 -0
  260. codex/static_root/assets/VRadioGroup-Bi16yPEE.js.br +0 -0
  261. codex/static_root/assets/VRadioGroup-Bi16yPEE.js.gz +0 -0
  262. codex/static_root/assets/VSelect-BdaijxdJ.b969ab260593.js.br +0 -0
  263. codex/static_root/assets/VSelect-BdaijxdJ.b969ab260593.js.gz +0 -0
  264. codex/static_root/assets/VSelect-BdaijxdJ.js.br +0 -0
  265. codex/static_root/assets/VSelect-BdaijxdJ.js.gz +0 -0
  266. codex/static_root/assets/VSelectionControl-CuM4okF6.0f246e35e86f.js.br +0 -0
  267. codex/static_root/assets/VSelectionControl-CuM4okF6.0f246e35e86f.js.gz +0 -0
  268. codex/static_root/assets/VSelectionControl-CuM4okF6.js.br +0 -0
  269. codex/static_root/assets/VSelectionControl-CuM4okF6.js.gz +0 -0
  270. codex/static_root/assets/VSlideGroup-ztBraz6g.02a0bc55b207.js.br +0 -0
  271. codex/static_root/assets/VSlideGroup-ztBraz6g.02a0bc55b207.js.gz +0 -0
  272. codex/static_root/assets/VSlideGroup-ztBraz6g.js.br +0 -0
  273. codex/static_root/assets/VSlideGroup-ztBraz6g.js.gz +0 -0
  274. codex/static_root/assets/VTable-CGuSv-Tv.eddaf5526d93.js.br +0 -0
  275. codex/static_root/assets/VTable-CGuSv-Tv.eddaf5526d93.js.gz +0 -0
  276. codex/static_root/assets/VTable-CGuSv-Tv.js.br +0 -0
  277. codex/static_root/assets/VTable-CGuSv-Tv.js.gz +0 -0
  278. codex/static_root/assets/VToolbar-CAUhD2BO.279f0b52347a.js.br +0 -0
  279. codex/static_root/assets/VToolbar-CAUhD2BO.279f0b52347a.js.gz +0 -0
  280. codex/static_root/assets/VToolbar-CAUhD2BO.js.br +0 -0
  281. codex/static_root/assets/VToolbar-CAUhD2BO.js.gz +0 -0
  282. codex/static_root/assets/VWindowItem-YvmNwCNb.20a7e3b303de.js.br +0 -0
  283. codex/static_root/assets/VWindowItem-YvmNwCNb.20a7e3b303de.js.gz +0 -0
  284. codex/static_root/assets/VWindowItem-YvmNwCNb.js.br +0 -0
  285. codex/static_root/assets/VWindowItem-YvmNwCNb.js.gz +0 -0
  286. codex/static_root/assets/admin-Ch9WezG1.bdace86b7c25.js.br +0 -0
  287. codex/static_root/assets/admin-Ch9WezG1.bdace86b7c25.js.gz +0 -0
  288. codex/static_root/assets/admin-Ch9WezG1.js.br +0 -0
  289. codex/static_root/assets/admin-Ch9WezG1.js.gz +0 -0
  290. codex/static_root/assets/admin-drawer-panel-B4VvGE4s.2265b9de60ab.js.br +0 -0
  291. codex/static_root/assets/admin-drawer-panel-B4VvGE4s.js.br +0 -0
  292. codex/static_root/assets/browser-BTel3sYS.8e1515bc039a.js +0 -1
  293. codex/static_root/assets/browser-BTel3sYS.8e1515bc039a.js.br +0 -0
  294. codex/static_root/assets/browser-BTel3sYS.8e1515bc039a.js.gz +0 -0
  295. codex/static_root/assets/browser-BTel3sYS.js +0 -1
  296. codex/static_root/assets/browser-BTel3sYS.js.br +0 -0
  297. codex/static_root/assets/browser-BTel3sYS.js.gz +0 -0
  298. codex/static_root/assets/browser-CVvV08AM.7667051b18fa.css.br +0 -0
  299. codex/static_root/assets/browser-CVvV08AM.7667051b18fa.css.gz +0 -0
  300. codex/static_root/assets/browser-CVvV08AM.css.br +0 -0
  301. codex/static_root/assets/browser-CVvV08AM.css.gz +0 -0
  302. codex/static_root/assets/change-password-dialog-Dq6GjT1T.01b56b4b3e87.js.br +0 -0
  303. codex/static_root/assets/change-password-dialog-Dq6GjT1T.01b56b4b3e87.js.gz +0 -0
  304. codex/static_root/assets/change-password-dialog-Dq6GjT1T.js.br +0 -0
  305. codex/static_root/assets/change-password-dialog-Dq6GjT1T.js.gz +0 -0
  306. codex/static_root/assets/confirm-dialog-D-Fx-51m.54b7d1059106.js.br +0 -0
  307. codex/static_root/assets/confirm-dialog-D-Fx-51m.54b7d1059106.js.gz +0 -0
  308. codex/static_root/assets/confirm-dialog-D-Fx-51m.js.br +0 -0
  309. codex/static_root/assets/confirm-dialog-D-Fx-51m.js.gz +0 -0
  310. codex/static_root/assets/confirm-footer-Yn7T9Tns.75a17cd86ca9.js.br +0 -0
  311. codex/static_root/assets/confirm-footer-Yn7T9Tns.75a17cd86ca9.js.gz +0 -0
  312. codex/static_root/assets/confirm-footer-Yn7T9Tns.js.br +0 -0
  313. codex/static_root/assets/confirm-footer-Yn7T9Tns.js.gz +0 -0
  314. codex/static_root/assets/datetime-column-DCeBthsr.22ed49a999cc.js.br +0 -0
  315. codex/static_root/assets/datetime-column-DCeBthsr.22ed49a999cc.js.gz +0 -0
  316. codex/static_root/assets/datetime-column-DCeBthsr.js.br +0 -0
  317. codex/static_root/assets/datetime-column-DCeBthsr.js.gz +0 -0
  318. codex/static_root/assets/filter-Dw0fjwZi.4d5f085435ab.js.br +0 -0
  319. codex/static_root/assets/filter-Dw0fjwZi.4d5f085435ab.js.gz +0 -0
  320. codex/static_root/assets/filter-Dw0fjwZi.js.br +0 -0
  321. codex/static_root/assets/filter-Dw0fjwZi.js.gz +0 -0
  322. codex/static_root/assets/flag-tab-D5RcLFbQ.1073708ea164.js.br +0 -0
  323. codex/static_root/assets/flag-tab-D5RcLFbQ.1073708ea164.js.gz +0 -0
  324. codex/static_root/assets/flag-tab-D5RcLFbQ.js.br +0 -0
  325. codex/static_root/assets/flag-tab-D5RcLFbQ.js.gz +0 -0
  326. codex/static_root/assets/group-tab-BilDDNz5.cba5ca15d7cf.js.br +0 -0
  327. codex/static_root/assets/group-tab-BilDDNz5.cba5ca15d7cf.js.gz +0 -0
  328. codex/static_root/assets/group-tab-BilDDNz5.js.br +0 -0
  329. codex/static_root/assets/group-tab-BilDDNz5.js.gz +0 -0
  330. codex/static_root/assets/http-error-DHmC7qgT.bde1d32b55df.js.br +0 -0
  331. codex/static_root/assets/http-error-DHmC7qgT.bde1d32b55df.js.gz +0 -0
  332. codex/static_root/assets/http-error-DHmC7qgT.js.br +0 -0
  333. codex/static_root/assets/http-error-DHmC7qgT.js.gz +0 -0
  334. codex/static_root/assets/library-tab-dbcbv0--.efa2d1d95b77.js.br +0 -0
  335. codex/static_root/assets/library-tab-dbcbv0--.efa2d1d95b77.js.gz +0 -0
  336. codex/static_root/assets/library-tab-dbcbv0--.js.br +0 -0
  337. codex/static_root/assets/library-tab-dbcbv0--.js.gz +0 -0
  338. codex/static_root/assets/main-CCY5Ix0K.b067e1d16cf5.js.br +0 -0
  339. codex/static_root/assets/main-CCY5Ix0K.b067e1d16cf5.js.gz +0 -0
  340. codex/static_root/assets/main-CCY5Ix0K.js.br +0 -0
  341. codex/static_root/assets/main-CCY5Ix0K.js.gz +0 -0
  342. codex/static_root/assets/metadata-dialog-DIhQctD5.67830cc94cf8.css.br +0 -0
  343. codex/static_root/assets/metadata-dialog-DIhQctD5.67830cc94cf8.css.gz +0 -0
  344. codex/static_root/assets/metadata-dialog-DIhQctD5.css.br +0 -0
  345. codex/static_root/assets/metadata-dialog-DIhQctD5.css.gz +0 -0
  346. codex/static_root/assets/metadata-dialog-PkTw4uLp.ce5ee2377f27.js +0 -1
  347. codex/static_root/assets/metadata-dialog-PkTw4uLp.ce5ee2377f27.js.br +0 -0
  348. codex/static_root/assets/metadata-dialog-PkTw4uLp.ce5ee2377f27.js.gz +0 -0
  349. codex/static_root/assets/metadata-dialog-PkTw4uLp.js +0 -1
  350. codex/static_root/assets/metadata-dialog-PkTw4uLp.js.br +0 -0
  351. codex/static_root/assets/metadata-dialog-PkTw4uLp.js.gz +0 -0
  352. codex/static_root/assets/pdf-doc-CEOcuQZb.260e6671eb89.js.br +0 -0
  353. codex/static_root/assets/pdf-doc-CEOcuQZb.260e6671eb89.js.gz +0 -0
  354. codex/static_root/assets/pdf-doc-CEOcuQZb.js.br +0 -0
  355. codex/static_root/assets/pdf-doc-CEOcuQZb.js.gz +0 -0
  356. codex/static_root/assets/reader-DRsYPz-3.b8ee57f2aefc.js.br +0 -0
  357. codex/static_root/assets/reader-DRsYPz-3.b8ee57f2aefc.js.gz +0 -0
  358. codex/static_root/assets/reader-DRsYPz-3.js.br +0 -0
  359. codex/static_root/assets/reader-DRsYPz-3.js.gz +0 -0
  360. codex/static_root/assets/stats-tab-QTG23RuT.654f85e0b21d.js.br +0 -0
  361. codex/static_root/assets/stats-tab-QTG23RuT.654f85e0b21d.js.gz +0 -0
  362. codex/static_root/assets/stats-tab-QTG23RuT.js.br +0 -0
  363. codex/static_root/assets/stats-tab-QTG23RuT.js.gz +0 -0
  364. codex/static_root/assets/task-tab-Kff6fz1t.28380a665ed7.js.br +0 -0
  365. codex/static_root/assets/task-tab-Kff6fz1t.28380a665ed7.js.gz +0 -0
  366. codex/static_root/assets/task-tab-Kff6fz1t.js.br +0 -0
  367. codex/static_root/assets/task-tab-Kff6fz1t.js.gz +0 -0
  368. codex/static_root/assets/user-tab-OAmZ6CQl.eed3361aefb7.js.br +0 -0
  369. codex/static_root/assets/user-tab-OAmZ6CQl.eed3361aefb7.js.gz +0 -0
  370. codex/static_root/assets/user-tab-OAmZ6CQl.js.br +0 -0
  371. codex/static_root/assets/user-tab-OAmZ6CQl.js.gz +0 -0
  372. codex/static_root/js/choices.a4dcff295a04.json +0 -1
  373. codex/static_root/js/choices.a4dcff295a04.json.br +0 -0
  374. codex/static_root/js/choices.a4dcff295a04.json.gz +0 -0
  375. codex/static_root/manifest.13219ea92507.json.br +0 -0
  376. codex/static_root/manifest.13219ea92507.json.gz +0 -0
  377. {codex-1.5.13a0.dist-info → codex-1.5.13a2.dist-info}/LICENSE +0 -0
  378. {codex-1.5.13a0.dist-info → codex-1.5.13a2.dist-info}/WHEEL +0 -0
  379. {codex-1.5.13a0.dist-info → codex-1.5.13a2.dist-info}/entry_points.txt +0 -0
Binary file
Binary file
@@ -1 +1 @@
1
- {"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "img/logo-maskable.svg": "img/logo-maskable.d618c2d7943f.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.201cbde62d55.webp", "img/logo.svg": "img/logo.3fb129bfbd92.svg", "img/missing-cover.webp": "img/missing-cover.8c8c1d4f6782.webp", "img/missing-page.svg": "img/missing-page.71bb10f7c72a.svg", "img/logo-32.webp": "img/logo-32.dbb98f6dfde4.webp", "js/choices.json": "js/choices.a4dcff295a04.json", "js/choices-admin.json": "js/choices-admin.bb730e4f26ac.json", "assets/reader-DRsYPz-3.js": "assets/reader-DRsYPz-3.b8ee57f2aefc.js", "assets/VToolbar-CAUhD2BO.js": "assets/VToolbar-CAUhD2BO.279f0b52347a.js", "assets/VExpansionPanel-DsEXVcCv.css": "assets/VExpansionPanel-DsEXVcCv.20b475255e66.css", "assets/VTable-CGuSv-Tv.js": "assets/VTable-CGuSv-Tv.eddaf5526d93.js", "assets/group-tab-BilDDNz5.js": "assets/group-tab-BilDDNz5.cba5ca15d7cf.js", "assets/VCheckbox-BMRDCYNv.js": "assets/VCheckbox-BMRDCYNv.7f791d7f065f.js", "assets/datetime-column-BWWfvyhn.css": "assets/datetime-column-BWWfvyhn.a4a94ba57c73.css", "assets/VSlideGroup-ztBraz6g.js": "assets/VSlideGroup-ztBraz6g.02a0bc55b207.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/VExpansionPanel-C593uXqT.js": "assets/VExpansionPanel-C593uXqT.d3bdc6a21208.js", "assets/VSelectionControl-CuM4okF6.js": "assets/VSelectionControl-CuM4okF6.0f246e35e86f.js", "assets/VSlideGroup-C3lY91uv.css": "assets/VSlideGroup-C3lY91uv.d268067bd078.css", "assets/VMain-Byt37V4c.css": "assets/VMain-Byt37V4c.a00e206f3cfa.css", "assets/VRadioGroup-Bi16yPEE.js": "assets/VRadioGroup-Bi16yPEE.69086b77f9b1.js", "assets/VMain-DmQvRj_k.js": "assets/VMain-DmQvRj_k.1e0480bed9a6.js", "assets/VWindowItem-YvmNwCNb.js": "assets/VWindowItem-YvmNwCNb.20a7e3b303de.js", "assets/stats-tab-BTZLMBCU.css": "assets/stats-tab-BTZLMBCU.7e0a9547c12e.css", "assets/confirm-footer-VFepxcJs.css": "assets/confirm-footer-VFepxcJs.4150131304bd.css", "assets/change-password-dialog-BRmvkNir.css": "assets/change-password-dialog-BRmvkNir.2fead58a78c7.css", "assets/library-tab-DZKDtQ5v.css": "assets/library-tab-DZKDtQ5v.c8123e4bc5a4.css", "assets/to-case-kUm8NPpW.js": "assets/to-case-kUm8NPpW.5b3369f511b8.js", "assets/task-tab-Kff6fz1t.js": "assets/task-tab-Kff6fz1t.28380a665ed7.js", "assets/admin-drawer-panel-B4VvGE4s.js": "assets/admin-drawer-panel-B4VvGE4s.2265b9de60ab.js", "assets/main-CacfwsKA.css": "assets/main-CacfwsKA.4f849ef1c5db.css", "assets/change-password-dialog-Dq6GjT1T.js": "assets/change-password-dialog-Dq6GjT1T.01b56b4b3e87.js", "assets/flag-tab-D5RcLFbQ.js": "assets/flag-tab-D5RcLFbQ.1073708ea164.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/user-tab-OAmZ6CQl.js": "assets/user-tab-OAmZ6CQl.eed3361aefb7.js", "assets/pdf-doc-CEOcuQZb.js": "assets/pdf-doc-CEOcuQZb.260e6671eb89.js", "assets/library-tab-dbcbv0--.js": "assets/library-tab-dbcbv0--.efa2d1d95b77.js", "assets/VCheckboxBtn-Dqp1u3GT.js": "assets/VCheckboxBtn-Dqp1u3GT.e80f145994b6.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/datetime-column-DCeBthsr.js": "assets/datetime-column-DCeBthsr.22ed49a999cc.js", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/main-CCY5Ix0K.js": "assets/main-CCY5Ix0K.b067e1d16cf5.js", "assets/VToolbar-DqQLg1UA.css": "assets/VToolbar-DqQLg1UA.614d6a4a8a09.css", "assets/http-error-DHmC7qgT.js": "assets/http-error-DHmC7qgT.bde1d32b55df.js", "assets/filter-Dw0fjwZi.js": "assets/filter-Dw0fjwZi.4d5f085435ab.js", "assets/metadata-dialog-DIhQctD5.css": "assets/metadata-dialog-DIhQctD5.67830cc94cf8.css", "assets/stats-tab-QTG23RuT.js": "assets/stats-tab-QTG23RuT.654f85e0b21d.js", "assets/metadata-dialog-PkTw4uLp.js": "assets/metadata-dialog-PkTw4uLp.ce5ee2377f27.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/admin-drawer-panel-Bk7z8uTR.css": "assets/admin-drawer-panel-Bk7z8uTR.1531b747003f.css", "assets/reader-CG6zrLXl.css": "assets/reader-CG6zrLXl.ed017042cd53.css", "assets/task-tab-DoX9OA37.css": "assets/task-tab-DoX9OA37.9bb355f36dbf.css", "assets/VDataTableVirtual-Cbj7IGxa.css": "assets/VDataTableVirtual-Cbj7IGxa.24039b2ebc61.css", "assets/index-DUjeNg4x.js": "assets/index-DUjeNg4x.36d50c91b2c1.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/browser-BTel3sYS.js": "assets/browser-BTel3sYS.8e1515bc039a.js", "assets/flag-tab-DUXtbpA2.css": "assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css", "assets/http-error-C25WdjWC.css": "assets/http-error-C25WdjWC.1c7337ad6e1d.css", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/admin-Ch9WezG1.js": "assets/admin-Ch9WezG1.bdace86b7c25.js", "assets/VSelect-BdGop3V2.css": "assets/VSelect-BdGop3V2.604c1785fbff.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/confirm-dialog-D-Fx-51m.js": "assets/confirm-dialog-D-Fx-51m.54b7d1059106.js", "assets/group-tab-3DXxSetf.css": "assets/group-tab-3DXxSetf.5fc2cfa31669.css", "assets/VDataTableVirtual-DhhCmPtf.js": "assets/VDataTableVirtual-DhhCmPtf.0735a1ab4c2f.js", "assets/VCombobox-DT52mZm3.js": "assets/VCombobox-DT52mZm3.309c77be4a55.js", "assets/browser-CVvV08AM.css": "assets/browser-CVvV08AM.7667051b18fa.css", "assets/confirm-footer-Yn7T9Tns.js": "assets/confirm-footer-Yn7T9Tns.75a17cd86ca9.js", "assets/admin-Df82-Qcj.css": "assets/admin-Df82-Qcj.4c3f0406ee54.css", "assets/VSelect-BdaijxdJ.js": "assets/VSelect-BdaijxdJ.b969ab260593.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.13219ea92507.json"}, "version": "1.1", "hash": "d55016a34609"}
1
+ {"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "img/logo-maskable.svg": "img/logo-maskable.d618c2d7943f.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.201cbde62d55.webp", "img/logo.svg": "img/logo.3fb129bfbd92.svg", "img/missing-cover.webp": "img/missing-cover.8c8c1d4f6782.webp", "img/missing-page.svg": "img/missing-page.71bb10f7c72a.svg", "img/logo-32.webp": "img/logo-32.dbb98f6dfde4.webp", "js/choices.json": "js/choices.fedcbd1ec085.json", "js/choices-admin.json": "js/choices-admin.bb730e4f26ac.json", "assets/metadata-dialog-QTkQOBoB.css": "assets/metadata-dialog-QTkQOBoB.2e6935edafee.css", "assets/VRadioGroup-1KnJv1YV.js": "assets/VRadioGroup-1KnJv1YV.c78bc794333b.js", "assets/browser-CTxEKlCx.css": "assets/browser-CTxEKlCx.211d729d9165.css", "assets/VExpansionPanel-DsEXVcCv.css": "assets/VExpansionPanel-DsEXVcCv.20b475255e66.css", "assets/stats-tab-Dy0YEoJ4.js": "assets/stats-tab-Dy0YEoJ4.f24c8ddba0d3.js", "assets/admin-drawer-panel-UQNBz5Mr.js": "assets/admin-drawer-panel-UQNBz5Mr.4f87b323dcdc.js", "assets/http-error-DxxoT0wf.js": "assets/http-error-DxxoT0wf.8f26afe5c1dd.js", "assets/admin-CfqyTXqy.js": "assets/admin-CfqyTXqy.b073b6fa7ebd.js", "assets/VCheckboxBtn-C7T6Tf80.js": "assets/VCheckboxBtn-C7T6Tf80.597cfcc88998.js", "assets/datetime-column-BWWfvyhn.css": "assets/datetime-column-BWWfvyhn.a4a94ba57c73.css", "assets/flag-tab-BERamYWo.js": "assets/flag-tab-BERamYWo.52c4bc9b4243.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/change-password-dialog-D80TfT-n.js": "assets/change-password-dialog-D80TfT-n.284c707d3d79.js", "assets/VExpansionPanel-DSgyCbMu.js": "assets/VExpansionPanel-DSgyCbMu.ce806293d8ad.js", "assets/metadata-dialog-CZDWNVCD.js": "assets/metadata-dialog-CZDWNVCD.b78ed72bc090.js", "assets/main-CTJQvqMb.js": "assets/main-CTJQvqMb.1d5f619166b3.js", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/VCheckbox-BR-5qiW4.js": "assets/VCheckbox-BR-5qiW4.d4e12b9a3549.js", "assets/VSlideGroup-C3lY91uv.css": "assets/VSlideGroup-C3lY91uv.d268067bd078.css", "assets/VMain-Byt37V4c.css": "assets/VMain-Byt37V4c.a00e206f3cfa.css", "assets/VDataTableVirtual-DgdQqVhC.js": "assets/VDataTableVirtual-DgdQqVhC.118522d90dfd.js", "assets/VSelectionControl-CEOyDLZC.js": "assets/VSelectionControl-CEOyDLZC.60a1d02bebde.js", "assets/stats-tab-BTZLMBCU.css": "assets/stats-tab-BTZLMBCU.7e0a9547c12e.css", "assets/confirm-footer-VFepxcJs.css": "assets/confirm-footer-VFepxcJs.4150131304bd.css", "assets/change-password-dialog-BRmvkNir.css": "assets/change-password-dialog-BRmvkNir.2fead58a78c7.css", "assets/library-tab-DZKDtQ5v.css": "assets/library-tab-DZKDtQ5v.c8123e4bc5a4.css", "assets/to-case-kUm8NPpW.js": "assets/to-case-kUm8NPpW.5b3369f511b8.js", "assets/confirm-footer-CLcqjnLg.js": "assets/confirm-footer-CLcqjnLg.ebed69027134.js", "assets/VCombobox-CA6L757N.js": "assets/VCombobox-CA6L757N.c9c01cbc12eb.js", "assets/VWindowItem-DAPhfogt.js": "assets/VWindowItem-DAPhfogt.d9e874ecf5be.js", "assets/main-CacfwsKA.css": "assets/main-CacfwsKA.4f849ef1c5db.css", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/confirm-dialog-CTwvsrD2.js": "assets/confirm-dialog-CTwvsrD2.8de12739f859.js", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/library-tab-DXCuu0zS.js": "assets/library-tab-DXCuu0zS.6a7b7e48a6f5.js", "assets/VMain-CDWaq_uU.js": "assets/VMain-CDWaq_uU.9350720f2523.js", "assets/VSlideGroup-r8lyA6_4.js": "assets/VSlideGroup-r8lyA6_4.d51fe70b8cfa.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/VToolbar-DqQLg1UA.css": "assets/VToolbar-DqQLg1UA.614d6a4a8a09.css", "assets/datetime-column-DPVO98E2.js": "assets/datetime-column-DPVO98E2.27e26fb391ca.js", "assets/task-tab-Bv3B4rCC.js": "assets/task-tab-Bv3B4rCC.1546850899dc.js", "assets/VToolbar-qYCVOLXR.js": "assets/VToolbar-qYCVOLXR.07eda01fd108.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/user-tab-CSF2DZe5.js": "assets/user-tab-CSF2DZe5.8e65aaed43b2.js", "assets/VSelect-CLw1oGQg.js": "assets/VSelect-CLw1oGQg.37122543e75e.js", "assets/admin-drawer-panel-Bk7z8uTR.css": "assets/admin-drawer-panel-Bk7z8uTR.1531b747003f.css", "assets/reader-CG6zrLXl.css": "assets/reader-CG6zrLXl.ed017042cd53.css", "assets/pdf-doc-C_LEA8HV.js": "assets/pdf-doc-C_LEA8HV.6bd1dba60a0b.js", "assets/filter-Cqjy01SO.js": "assets/filter-Cqjy01SO.71710ea1c7f8.js", "assets/task-tab-DoX9OA37.css": "assets/task-tab-DoX9OA37.9bb355f36dbf.css", "assets/reader-DXk46jdF.js": "assets/reader-DXk46jdF.0a2b0809bd02.js", "assets/VDataTableVirtual-Cbj7IGxa.css": "assets/VDataTableVirtual-Cbj7IGxa.24039b2ebc61.css", "assets/index-DUjeNg4x.js": "assets/index-DUjeNg4x.36d50c91b2c1.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/flag-tab-DUXtbpA2.css": "assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css", "assets/http-error-C25WdjWC.css": "assets/http-error-C25WdjWC.1c7337ad6e1d.css", "assets/group-tab-DknI2YL3.js": "assets/group-tab-DknI2YL3.7b2e5d32ee7e.js", "assets/browser-CWqU3TI5.js": "assets/browser-CWqU3TI5.4583f12be6b9.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VSelect-BdGop3V2.css": "assets/VSelect-BdGop3V2.604c1785fbff.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/group-tab-3DXxSetf.css": "assets/group-tab-3DXxSetf.5fc2cfa31669.css", "assets/VTable-CyZmujCR.js": "assets/VTable-CyZmujCR.5d4fdcc0324d.js", "assets/admin-Df82-Qcj.css": "assets/admin-Df82-Qcj.4c3f0406ee54.css", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.24ec466b9bcf.json"}, "version": "1.1", "hash": "afc5aa217b95"}
@@ -6,6 +6,7 @@ from types import MappingProxyType
6
6
  from urllib.parse import unquote_plus
7
7
 
8
8
  from django.contrib.auth.models import User
9
+ from django.db.models import Q
9
10
  from djangorestframework_camel_case.settings import api_settings
10
11
  from djangorestframework_camel_case.util import underscoreize
11
12
 
@@ -63,23 +64,19 @@ class BrowserBaseView(
63
64
  self._is_admin = user and isinstance(user, User) and user.is_staff
64
65
  return self._is_admin
65
66
 
66
- def get_query_filters_without_group(
67
- self,
68
- model,
69
- ):
67
+ def get_query_filters_without_group(self, model, search_scores: dict):
70
68
  """Return all the filters except the group filter."""
71
69
  object_filter = self.get_group_acl_filter(model)
70
+ object_filter &= self.get_search_filter(model, search_scores)
72
71
  object_filter &= self.get_bookmark_filter(model)
73
72
  object_filter &= self.get_comic_field_filter(self.rel_prefix)
74
73
  return object_filter
75
74
 
76
- def get_query_filters(
77
- self,
78
- model,
79
- choices=False,
80
- ):
75
+ def get_query_filters(self, model, search_scores: dict | None, choices=False):
81
76
  """Return the main object filter and the one for aggregates."""
82
- object_filter = self.get_query_filters_without_group(model)
77
+ if search_scores is None:
78
+ return Q(False)
79
+ object_filter = self.get_query_filters_without_group(model, search_scores)
83
80
  object_filter &= self.get_group_filter(choices)
84
81
  return object_filter
85
82
 
@@ -94,6 +91,7 @@ class BrowserBaseView(
94
91
  continue
95
92
  parsed_key = key
96
93
  elif key in ("q", "query"):
94
+ # parse and strip query param
97
95
  # "query" is used by opds v2
98
96
  if "q" in result:
99
97
  continue
@@ -33,7 +33,6 @@ from codex.serializers.choices import DEFAULTS
33
33
  from codex.views.auth import IsAuthenticatedOrEnabledNonUsers
34
34
  from codex.views.browser.browser_annotations import BrowserAnnotationsView
35
35
  from codex.views.browser.const import MAX_OBJ_PER_PAGE
36
- from codex.views.browser.filters.search import SearchScores
37
36
 
38
37
  LOG = get_logger(__name__)
39
38
  _ADMIN_FLAG_VALUE_KEY_MAP = MappingProxyType(
@@ -109,12 +108,7 @@ class BrowserView(BrowserAnnotationsView):
109
108
  value = "c" if model == Comic else self.model_group
110
109
  return queryset.annotate(group=Value(value, CharField(max_length=1)))
111
110
 
112
- def _add_annotations(
113
- self,
114
- queryset,
115
- model,
116
- search_scores: SearchScores | None,
117
- ):
111
+ def _add_annotations(self, queryset, model, search_scores: dict):
118
112
  """Annotations for display and sorting."""
119
113
  queryset = self.annotate_common_aggregates(queryset, model, search_scores)
120
114
  queryset = self._annotate_group(queryset, model)
@@ -144,35 +138,32 @@ class BrowserView(BrowserAnnotationsView):
144
138
  self.model_group = self._get_model_group()
145
139
  self.model = self.GROUP_MODEL_MAP[self.model_group]
146
140
 
147
- def _get_common_queryset(self, model):
141
+ def _get_common_queryset(self, model, search_scores):
148
142
  """Create queryset common to group & books."""
149
- object_filter = self.get_query_filters(model, False)
143
+ object_filter = self.get_query_filters(model, search_scores, False)
150
144
  qs = model.objects.filter(object_filter)
151
- binary = self.params.get("order_by") != "search_score"
152
- search_scores = self.get_search_scores(binary=binary)
153
145
  qs = self._add_annotations(qs, model, search_scores)
154
- qs = self.apply_search_filter(qs, model, search_scores)
155
146
  qs = self.add_order_by(qs, model)
156
147
  if limit := self.params.get("limit"):
157
148
  # limit only is set by some opds views
158
149
  qs = qs[:limit]
159
150
  return qs
160
151
 
161
- def _get_group_queryset(self):
152
+ def _get_group_queryset(self, search_scores: dict | None):
162
153
  """Create group queryset."""
163
154
  if not self.model:
164
155
  reason = "Model not set for browser queryset."
165
156
  raise ValueError(reason)
166
- elif self.model == Comic: # noqa: RET506
157
+ if self.model == Comic or search_scores is None:
167
158
  qs = self.model.objects.none()
168
159
  else:
169
- qs = self._get_common_queryset(self.model)
160
+ qs = self._get_common_queryset(self.model, search_scores)
170
161
  return qs
171
162
 
172
- def _get_book_queryset(self):
163
+ def _get_book_queryset(self, search_scores: dict | None):
173
164
  """Create book queryset."""
174
- if self.model in (Comic, Folder):
175
- qs = self._get_common_queryset(Comic)
165
+ if self.model in (Comic, Folder) and search_scores is not None:
166
+ qs = self._get_common_queryset(Comic, search_scores)
176
167
  else:
177
168
  qs = Comic.objects.none()
178
169
  return qs
@@ -211,7 +202,6 @@ class BrowserView(BrowserAnnotationsView):
211
202
  )
212
203
  except self.group_class.DoesNotExist:
213
204
  group = self.kwargs.get("group")
214
- pk = self.kwargs.get("pk")
215
205
  page = self.kwargs.get("page")
216
206
  if group == "r" and pk == 0 and page == 1:
217
207
  self.group_instance: BrowserGroupModel | None = None
@@ -322,7 +312,7 @@ class BrowserView(BrowserAnnotationsView):
322
312
 
323
313
  def _paginate_section(self, model, qs, page):
324
314
  """Paginate a group or Comic section."""
325
- orphans = 5 if self.model_group != "f" else 0
315
+ orphans = 0 if self.model_group == "f" or self.params.get("q") else 5
326
316
  paginator = Paginator(qs, MAX_OBJ_PER_PAGE, orphans=orphans)
327
317
  try:
328
318
  qs = paginator.page(page).object_list
@@ -376,6 +366,8 @@ class BrowserView(BrowserAnnotationsView):
376
366
  if page < 1:
377
367
  self._page_out_of_bounds(1)
378
368
 
369
+ page_obj_count = 0
370
+
379
371
  group_count = group_qs.count()
380
372
  book_count = book_qs.count()
381
373
 
@@ -384,7 +376,7 @@ class BrowserView(BrowserAnnotationsView):
384
376
  self._page_out_of_bounds(num_pages)
385
377
 
386
378
  page_group_qs = self._paginate_groups(group_qs, group_count)
387
- page_obj_count = page_group_qs.count()
379
+ page_obj_count += page_group_qs.count()
388
380
  page_book_qs = self._paginate_books(book_qs, group_count, page_obj_count)
389
381
  page_obj_count += page_book_qs.count()
390
382
 
@@ -396,10 +388,11 @@ class BrowserView(BrowserAnnotationsView):
396
388
  self.set_rel_prefix(self.model)
397
389
  self._set_group_instance() # Placed up here to invalidate earlier
398
390
  # Create the main query with the filters
391
+ search_scores: dict | None = self.get_search_scores()
399
392
  group = self.kwargs.get("group")
400
393
 
401
- group_qs = self._get_group_queryset()
402
- book_qs = self._get_book_queryset()
394
+ group_qs = self._get_group_queryset(search_scores)
395
+ book_qs = self._get_book_queryset(search_scores)
403
396
 
404
397
  # Paginate
405
398
  group_qs, book_qs, num_pages, total_count = self._paginate(group_qs, book_qs)
@@ -582,6 +575,7 @@ class BrowserView(BrowserAnnotationsView):
582
575
  self.set_order_key()
583
576
  self._set_admin_flags()
584
577
  enable_folder_view = self.admin_flags["folder_view"]
578
+
585
579
  if group == self.FOLDER_GROUP:
586
580
  self._validate_folder_settings(enable_folder_view)
587
581
  elif group == self.STORY_ARC_GROUP:
@@ -24,11 +24,6 @@ from django.db.models.functions import Least, Lower, Reverse, Right, StrIndex, S
24
24
 
25
25
  from codex.models import Comic
26
26
  from codex.views.browser.browser_order_by import BrowserOrderByView
27
- from codex.views.browser.filters.search import SearchScores
28
-
29
- SEARCH_SCORE_MAX = 100.0
30
- SEARCH_SCORE_MIN = 0.001
31
- SEARCH_SCORE_EMPTY = 0.0
32
27
 
33
28
 
34
29
  class BrowserAnnotationsView(BrowserOrderByView):
@@ -56,9 +51,7 @@ class BrowserAnnotationsView(BrowserOrderByView):
56
51
 
57
52
  is_opds_1_acquisition = False
58
53
 
59
- def _annotate_search_score(
60
- self, queryset, search_scores: SearchScores | None, model
61
- ):
54
+ def _annotate_search_score(self, queryset, search_scores, model):
62
55
  """Annotate the search score for ordering by search score.
63
56
 
64
57
  Choose the maximum matching score for the group.
@@ -67,15 +60,10 @@ class BrowserAnnotationsView(BrowserOrderByView):
67
60
  return queryset
68
61
  whens = []
69
62
  prefix = "" if model == Comic else self.rel_prefix
70
- if search_scores:
71
- for pk, score in search_scores.scores:
72
- when = {prefix + "pk": pk, "then": score}
73
- whens.append(When(**when))
74
- if search_scores.prev_pks:
75
- whens.append(When(pk__in=search_scores.prev_pks, then=SEARCH_SCORE_MAX))
76
- if search_scores.next_pks:
77
- whens.append(When(pk__in=search_scores.next_pks, then=SEARCH_SCORE_MIN))
78
- annotate = {"search_score": Max(Case(*whens, default=SEARCH_SCORE_EMPTY))}
63
+ for pk, score in search_scores.items():
64
+ when = {prefix + "pk": pk, "then": score}
65
+ whens.append(When(**when))
66
+ annotate = {"search_score": Max(Case(*whens, default=0.0))}
79
67
  return queryset.annotate(**annotate)
80
68
 
81
69
  def _annotate_cover_pk(self, queryset, model):
@@ -282,7 +270,7 @@ class BrowserAnnotationsView(BrowserOrderByView):
282
270
  def _annotate_mtime(queryset):
283
271
  return queryset.annotate(mtime=Max("updated_at"))
284
272
 
285
- def annotate_common_aggregates(self, qs, model, search_scores: SearchScores | None):
273
+ def annotate_common_aggregates(self, qs, model, search_scores):
286
274
  """Annotate common aggregates between browser and metadata."""
287
275
  qs = self._annotate_search_score(qs, search_scores, model)
288
276
  qs = self._annotate_child_count(qs, model)
@@ -292,8 +280,8 @@ class BrowserAnnotationsView(BrowserOrderByView):
292
280
  qs = self._annotate_bookmark_updated_at(qs, bm_rel, bm_filter)
293
281
  qs = self._annotate_sort_name(qs, model)
294
282
  qs = self._annotate_story_arc_number(qs)
295
- # cover depends annotations for order-by, in metadata too
296
283
  qs = self._annotate_order_value(qs, model)
284
+ # cover depends on the above annotations for order-by
297
285
  qs = self._annotate_cover_pk(qs, model)
298
286
  qs = self._annotate_bookmarks(qs, model, bm_rel, bm_filter)
299
287
  qs = self._annotate_mtime(qs)
@@ -123,9 +123,11 @@ class BrowserChoicesViewBase(BrowserBaseView):
123
123
 
124
124
  def get_object(self):
125
125
  """Get the comic subquery use for the choices."""
126
- object_filter = self.get_query_filters(self.model, choices=True)
127
- qs = self.model.objects.filter(object_filter) # type: ignore
128
- return self.apply_binary_search_filter(qs)
126
+ search_scores = self.get_search_scores()
127
+ if search_scores is None:
128
+ return self.model.objects.none() # type: ignore
129
+ object_filter = self.get_query_filters(self.model, search_scores, True)
130
+ return self.model.objects.filter(object_filter) # type: ignore
129
131
 
130
132
  def _set_model(self):
131
133
  """Set the model to query."""
@@ -1,144 +1,52 @@
1
1
  """Search Filters Methods."""
2
2
 
3
- from dataclasses import dataclass
4
- from time import time
5
-
6
3
  from django.db.models import Q
7
4
 
8
5
  from codex._vendor.haystack.query import SearchQuerySet
9
6
  from codex.logger.logging import get_logger
10
7
  from codex.models import Comic
11
- from codex.settings.settings import DEBUG
12
- from codex.views.browser.const import MAX_OBJ_PER_PAGE
13
8
 
14
9
  LOG = get_logger(__name__)
15
10
 
16
11
 
17
- @dataclass
18
- class SearchScores:
19
- """Search Scores for annotation."""
20
-
21
- scores: tuple[tuple[int, float], ...] = ()
22
- scored_pks: tuple[int, ...] = ()
23
- prev_pks: tuple[int, ...] = ()
24
- next_pks: tuple[int, ...] = ()
25
-
26
-
27
12
  class SearchFilterMixin:
28
13
  """Search Filters Methods."""
29
14
 
30
- def _get_binary_search_scores(self, sqs):
31
- """Get search scores for choices and metadata."""
32
- sqs = sqs.values_list("pk", flat=True)
33
- search_results_limit = self.params.get( # type: ignore
34
- "search_results_limit",
35
- MAX_OBJ_PER_PAGE, # type: ignore
36
- )
37
- if search_results_limit:
38
- sqs = sqs[:search_results_limit] # type: ignore
39
- return tuple(sqs)
40
-
41
- def _get_browser_search_scores(self, sqs):
42
- """Get search scores for the browser cards."""
43
- page = self.kwargs.get("page", 1) # type: ignore
44
- search_results_limit = self.params.get( # type: ignore
45
- "search_results_limit",
46
- MAX_OBJ_PER_PAGE, # type: ignore
47
- )
48
- if search_results_limit:
49
- offset = 0
50
- limit = search_results_limit
51
- else:
52
- offset = max(0, (page - 1) * MAX_OBJ_PER_PAGE) # type: ignore
53
- limit = offset + MAX_OBJ_PER_PAGE # type: ignore
54
-
55
- if DEBUG:
56
- LOG.debug(
57
- f"searching... {page=} page_{offset=} page_{limit=} {search_results_limit=}"
58
- )
59
-
60
- scores_pairs = []
61
- prev_pks = []
62
- next_pks = []
63
-
64
- if DEBUG:
65
- start_time = time()
66
- scores_values = sqs.values_list("pk", "score")
67
- if search_results_limit:
68
- scores_values = scores_values[:limit]
69
- for index, pair in enumerate(scores_values):
70
- if index < offset:
71
- prev_pks.append(pair[0])
72
- elif index > limit:
73
- next_pks.append(pair[0])
74
- else:
75
- scores_pairs.append(pair)
76
-
77
- if DEBUG:
78
- LOG.debug(
79
- f"search {time() - start_time}s" # type: ignore
80
- f" {len(scores_pairs)=} {len(prev_pks)=} {len(next_pks)=}"
81
- )
82
-
83
- return tuple(scores_pairs), tuple(prev_pks), tuple(next_pks)
84
-
85
- def get_search_scores(self, binary=False) -> SearchScores | None:
15
+ def get_search_scores(self) -> dict | None:
86
16
  """Perform the search and return the scores as a dict."""
17
+ search_scores = {}
87
18
  text = self.params.get("q", "") # type: ignore
88
19
  if not text:
89
- return None
20
+ return search_scores
90
21
 
91
- scores_pairs = ()
92
- scored_pks = ()
93
- prev_pks = ()
94
- next_pks = ()
22
+ sqs = SearchQuerySet().auto_query(text)
23
+ comic_scores = sqs.values("pk", "score")
95
24
  try:
96
- sqs = SearchQuerySet()
97
- sqs = sqs.auto_query(text) # .filter(score__gt=0.0)
98
- if binary:
99
- scored_pks = self._get_binary_search_scores(sqs)
100
- else:
101
- scores_pairs, prev_pks, next_pks = self._get_browser_search_scores(sqs)
102
-
25
+ for comic_score in comic_scores:
26
+ search_scores[comic_score["pk"]] = comic_score["score"]
103
27
  except MemoryError:
104
28
  LOG.warning("Search engine needs more memory, results truncated.")
105
29
  except Exception:
106
- LOG.exception("Getting Search Scores")
107
- return SearchScores(scores_pairs, scored_pks, prev_pks, next_pks)
30
+ LOG.exception("While Searching")
31
+ if not search_scores:
32
+ return None
33
+ return search_scores
108
34
 
109
- def _get_search_query_filter(
110
- self,
111
- model,
112
- search_scores: SearchScores,
113
- ):
35
+ def _get_search_query_filter(self, model, search_scores: dict):
114
36
  """Get the search filter and scores."""
115
- if search_scores.scores:
116
- query = Q(search_score__gt=0.0)
117
- else:
118
- prefix = "" if model == Comic else self.rel_prefix # type: ignore
119
- rel = prefix + "pk__in"
120
- query_dict = {rel: search_scores.scored_pks}
121
- query = Q(**query_dict)
122
- return query
37
+ prefix = "" if model == Comic else self.rel_prefix # type: ignore
38
+ rel = prefix + "pk__in"
39
+ query_dict = {rel: search_scores.keys()}
40
+ return Q(**query_dict)
123
41
 
124
- def apply_search_filter(
125
- self,
126
- qs,
127
- model,
128
- search_scores: SearchScores | None,
129
- ):
42
+ def get_search_filter(self, model, search_scores: dict):
130
43
  """Preparse search, search and return the filter and scores."""
44
+ search_filter = Q()
131
45
  try:
132
46
  if search_scores:
47
+ # Query haystack
133
48
  search_filter = self._get_search_query_filter(model, search_scores)
134
- qs = qs.filter(search_filter)
135
- except Exception:
136
- LOG.exception("Creating the search filter")
137
-
138
- return qs
49
+ except Exception as exc:
50
+ LOG.warning(exc)
139
51
 
140
- def apply_binary_search_filter(self, qs):
141
- """Apply scoreless search filter for choices & metadata."""
142
- search_scores = self.get_search_scores(binary=True)
143
- model = self.model # type: ignore
144
- return self.apply_search_filter(qs, model, search_scores)
52
+ return search_filter
@@ -97,7 +97,7 @@ class MetadataView(BrowserAnnotationsView):
97
97
  if not self.is_model_comic:
98
98
  size_func = self.get_aggregate_func(self.model, "size")
99
99
  qs = qs.annotate(size=size_func)
100
- return self.annotate_common_aggregates(qs, self.model, None)
100
+ return self.annotate_common_aggregates(qs, self.model, {})
101
101
 
102
102
  def _annotate_values_and_fks(self, qs, simple_qs):
103
103
  """Annotate comic values and comic foreign key values."""
@@ -242,11 +242,13 @@ class MetadataView(BrowserAnnotationsView):
242
242
  if self.model is None:
243
243
  raise NotFound(detail=f"Cannot get metadata for {self.group=}")
244
244
 
245
- object_filter = self.get_query_filters_without_group(self.model)
245
+ search_scores: dict | None = self.get_search_scores()
246
+ if search_scores is None:
247
+ self._raise_not_found()
248
+ object_filter = self.get_query_filters_without_group(self.model, search_scores) # type: ignore
246
249
  pk = self.kwargs["pk"]
247
250
  qs = self.model.objects.filter(object_filter, pk=pk)
248
- if self.model != Comic:
249
- qs = self.apply_binary_search_filter(qs)
251
+
250
252
  qs = self._annotate_aggregates(qs)
251
253
  simple_qs = qs
252
254
 
codex/views/error.py CHANGED
@@ -17,7 +17,6 @@ def codex_exception_handler(exc, context):
17
17
  if _OPDS_PREFIX in request.path:
18
18
  name = "opds:v2:feed" if _OPDS_PREFIX + "2" in request.path else "opds:v1:feed"
19
19
  opds_start = reverse(name)
20
-
21
20
  if isinstance(exc, SeeOtherRedirectError):
22
21
  response = exc.get_response(opds_start)
23
22
  elif hasattr(exc, "status_code") and exc.status_code in (
codex/views/session.py CHANGED
@@ -105,7 +105,6 @@ class BrowserSessionViewBase(SessionViewBaseBase):
105
105
  "order_reverse": False,
106
106
  "q": DEFAULTS["q"],
107
107
  "route": DEFAULTS["route"],
108
- "search_results_limit": DEFAULTS["searchResultsLimit"],
109
108
  "show": DEFAULTS["show"],
110
109
  "twenty_four_hour_time": False,
111
110
  "top_group": DEFAULTS["topGroup"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codex
3
- Version: 1.5.13a0
3
+ Version: 1.5.13a2
4
4
  Summary: A comic archive web server.
5
5
  Home-page: https://github.com/ajslater/codex
6
6
  License: GPL-3.0-only
@@ -30,7 +30,6 @@ Requires-Dist: case-converter (>=1.1.0,<2.0.0)
30
30
  Requires-Dist: channels (>=4.0.0,<5.0.0)
31
31
  Requires-Dist: comicbox[pdf] (>=1.1.4,<2.0.0)
32
32
  Requires-Dist: django (>=5.0.3,<6.0.0)
33
- Requires-Dist: django-cachalot (>=2.6.2,<3.0.0)
34
33
  Requires-Dist: django-cors-headers (>=4.0,<5.0)
35
34
  Requires-Dist: django-rest-registration (>=0.8.0,<0.9.0)
36
35
  Requires-Dist: django-vite (>=3.0.1,<4.0.0)