codex 1.5.7rc1__py3-none-any.whl → 1.5.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of codex might be problematic. Click here for more details.

Files changed (440) hide show
  1. codex/librarian/importer/aggregate_metadata.py +12 -7
  2. codex/librarian/importer/importerd.py +36 -3
  3. codex/librarian/importer/tasks.py +8 -0
  4. codex/models/comic.py +9 -0
  5. codex/search/backend.py +21 -18
  6. codex/search/indexes.py +9 -4
  7. codex/serializers/browser/page.py +1 -0
  8. codex/static_root/assets/{VCheckbox-DXUwafcN.5d4577e0b16d.js → VCheckbox-RPeBWFgy.c0e3c4c4deaa.js} +1 -1
  9. codex/static_root/assets/VCheckbox-RPeBWFgy.c0e3c4c4deaa.js.br +0 -0
  10. codex/static_root/assets/VCheckbox-RPeBWFgy.c0e3c4c4deaa.js.gz +0 -0
  11. codex/static_root/assets/{VCheckbox-DXUwafcN.js → VCheckbox-RPeBWFgy.js} +1 -1
  12. codex/static_root/assets/VCheckbox-RPeBWFgy.js.br +0 -0
  13. codex/static_root/assets/VCheckbox-RPeBWFgy.js.gz +0 -0
  14. codex/static_root/assets/{VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js → VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js} +1 -1
  15. codex/static_root/assets/VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js.br +0 -0
  16. codex/static_root/assets/VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js.gz +0 -0
  17. codex/static_root/assets/{VCheckboxBtn-DtrZ6IUL.js → VCheckboxBtn-CwKlKk7z.js} +1 -1
  18. codex/static_root/assets/VCheckboxBtn-CwKlKk7z.js.br +0 -0
  19. codex/static_root/assets/VCheckboxBtn-CwKlKk7z.js.gz +0 -0
  20. codex/static_root/assets/{VCombobox-p6JaNJiS.08de72bf3f1d.js → VCombobox-DgVMswtt.5685f334102a.js} +1 -1
  21. codex/static_root/assets/VCombobox-DgVMswtt.5685f334102a.js.br +0 -0
  22. codex/static_root/assets/VCombobox-DgVMswtt.5685f334102a.js.gz +0 -0
  23. codex/static_root/assets/{VCombobox-p6JaNJiS.js → VCombobox-DgVMswtt.js} +1 -1
  24. codex/static_root/assets/VCombobox-DgVMswtt.js.br +0 -0
  25. codex/static_root/assets/VCombobox-DgVMswtt.js.gz +0 -0
  26. codex/static_root/assets/{VDataTableVirtual-Bak8sUxr.0f131a181de8.js → VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js} +1 -1
  27. codex/static_root/assets/VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js.br +0 -0
  28. codex/static_root/assets/VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js.gz +0 -0
  29. codex/static_root/assets/{VDataTableVirtual-Bak8sUxr.js → VDataTableVirtual-CYU6VHSb.js} +1 -1
  30. codex/static_root/assets/VDataTableVirtual-CYU6VHSb.js.br +0 -0
  31. codex/static_root/assets/VDataTableVirtual-CYU6VHSb.js.gz +0 -0
  32. codex/static_root/assets/{VExpansionPanel-BrGvn58l.4330794fe673.js → VExpansionPanel-B2jVSe6n.709be0bfd8a9.js} +1 -1
  33. codex/static_root/assets/VExpansionPanel-B2jVSe6n.709be0bfd8a9.js.br +0 -0
  34. codex/static_root/assets/VExpansionPanel-B2jVSe6n.709be0bfd8a9.js.gz +0 -0
  35. codex/static_root/assets/{VExpansionPanel-BrGvn58l.js → VExpansionPanel-B2jVSe6n.js} +1 -1
  36. codex/static_root/assets/VExpansionPanel-B2jVSe6n.js.br +0 -0
  37. codex/static_root/assets/VExpansionPanel-B2jVSe6n.js.gz +0 -0
  38. codex/static_root/assets/VExpansionPanel-DsEXVcCv.20b475255e66.css +1 -0
  39. codex/static_root/assets/VExpansionPanel-DsEXVcCv.20b475255e66.css.br +0 -0
  40. codex/static_root/assets/VExpansionPanel-DsEXVcCv.20b475255e66.css.gz +0 -0
  41. codex/static_root/assets/VExpansionPanel-DsEXVcCv.css +1 -0
  42. codex/static_root/assets/VExpansionPanel-DsEXVcCv.css.br +0 -0
  43. codex/static_root/assets/VExpansionPanel-DsEXVcCv.css.gz +0 -0
  44. codex/static_root/assets/{VMain-CuWbokFS.25c97b3ec973.js → VMain-DUot655v.58737665d0c0.js} +1 -1
  45. codex/static_root/assets/VMain-DUot655v.58737665d0c0.js.br +0 -0
  46. codex/static_root/assets/VMain-DUot655v.58737665d0c0.js.gz +0 -0
  47. codex/static_root/assets/{VMain-CuWbokFS.js → VMain-DUot655v.js} +1 -1
  48. codex/static_root/assets/VMain-DUot655v.js.br +0 -0
  49. codex/static_root/assets/VMain-DUot655v.js.gz +0 -0
  50. codex/static_root/assets/{VRadioGroup-DYMjLsVk.c4d81d70bec4.js → VRadioGroup-e5ZzndXH.545e89fea1a2.js} +1 -1
  51. codex/static_root/assets/VRadioGroup-e5ZzndXH.545e89fea1a2.js.br +0 -0
  52. codex/static_root/assets/VRadioGroup-e5ZzndXH.545e89fea1a2.js.gz +0 -0
  53. codex/static_root/assets/{VRadioGroup-DYMjLsVk.js → VRadioGroup-e5ZzndXH.js} +1 -1
  54. codex/static_root/assets/VRadioGroup-e5ZzndXH.js.br +0 -0
  55. codex/static_root/assets/VRadioGroup-e5ZzndXH.js.gz +0 -0
  56. codex/static_root/assets/VSelect-BdGop3V2.604c1785fbff.css +1 -0
  57. codex/static_root/assets/VSelect-BdGop3V2.604c1785fbff.css.br +0 -0
  58. codex/static_root/assets/VSelect-BdGop3V2.604c1785fbff.css.gz +0 -0
  59. codex/static_root/assets/VSelect-BdGop3V2.css +1 -0
  60. codex/static_root/assets/VSelect-BdGop3V2.css.br +0 -0
  61. codex/static_root/assets/VSelect-BdGop3V2.css.gz +0 -0
  62. codex/static_root/assets/{VSelect-CgOC_YIA.js → VSelect-CxY8UVRq.dc3019941096.js} +1 -1
  63. codex/static_root/assets/VSelect-CxY8UVRq.dc3019941096.js.br +0 -0
  64. codex/static_root/assets/VSelect-CxY8UVRq.dc3019941096.js.gz +0 -0
  65. codex/static_root/assets/{VSelect-CgOC_YIA.3d63f40c8ea4.js → VSelect-CxY8UVRq.js} +1 -1
  66. codex/static_root/assets/VSelect-CxY8UVRq.js.br +0 -0
  67. codex/static_root/assets/VSelect-CxY8UVRq.js.gz +0 -0
  68. codex/static_root/assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js +1 -0
  69. codex/static_root/assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js.br +0 -0
  70. codex/static_root/assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js.gz +0 -0
  71. codex/static_root/assets/VSelectionControl-DsJeRYlc.js +1 -0
  72. codex/static_root/assets/VSelectionControl-DsJeRYlc.js.br +0 -0
  73. codex/static_root/assets/VSelectionControl-DsJeRYlc.js.gz +0 -0
  74. codex/static_root/assets/VSlideGroup-C3lY91uv.css +1 -0
  75. codex/static_root/assets/VSlideGroup-C3lY91uv.css.br +0 -0
  76. codex/static_root/assets/VSlideGroup-C3lY91uv.css.gz +0 -0
  77. codex/static_root/assets/VSlideGroup-C3lY91uv.d268067bd078.css +1 -0
  78. codex/static_root/assets/VSlideGroup-C3lY91uv.d268067bd078.css.br +0 -0
  79. codex/static_root/assets/VSlideGroup-C3lY91uv.d268067bd078.css.gz +0 -0
  80. codex/static_root/assets/{VSlideGroup-Bssf4EBT.fc0918385f7e.js → VSlideGroup-VeMEwEff.3d72e1175a80.js} +1 -1
  81. codex/static_root/assets/VSlideGroup-VeMEwEff.3d72e1175a80.js.br +0 -0
  82. codex/static_root/assets/VSlideGroup-VeMEwEff.3d72e1175a80.js.gz +0 -0
  83. codex/static_root/assets/{VSlideGroup-Bssf4EBT.js → VSlideGroup-VeMEwEff.js} +1 -1
  84. codex/static_root/assets/VSlideGroup-VeMEwEff.js.br +0 -0
  85. codex/static_root/assets/VSlideGroup-VeMEwEff.js.gz +0 -0
  86. codex/static_root/assets/{VTable-DqraBe83.1f53f4e0e79f.js → VTable-CAK_p0Il.c1781e76e150.js} +1 -1
  87. codex/static_root/assets/VTable-CAK_p0Il.c1781e76e150.js.br +0 -0
  88. codex/static_root/assets/VTable-CAK_p0Il.c1781e76e150.js.gz +0 -0
  89. codex/static_root/assets/{VTable-DqraBe83.js → VTable-CAK_p0Il.js} +1 -1
  90. codex/static_root/assets/VTable-CAK_p0Il.js.br +0 -0
  91. codex/static_root/assets/VTable-CAK_p0Il.js.gz +0 -0
  92. codex/static_root/assets/{VToolbar-kI3X77C7.54fc7a9541e0.js → VToolbar-Dyufo4_P.24ef4946e516.js} +2 -2
  93. codex/static_root/assets/VToolbar-Dyufo4_P.24ef4946e516.js.br +0 -0
  94. codex/static_root/assets/{VToolbar-kI3X77C7.js.gz → VToolbar-Dyufo4_P.24ef4946e516.js.gz} +0 -0
  95. codex/static_root/assets/{VToolbar-kI3X77C7.js → VToolbar-Dyufo4_P.js} +2 -2
  96. codex/static_root/assets/VToolbar-Dyufo4_P.js.br +0 -0
  97. codex/static_root/assets/{VToolbar-kI3X77C7.54fc7a9541e0.js.gz → VToolbar-Dyufo4_P.js.gz} +0 -0
  98. codex/static_root/assets/{VWindowItem-DiY3uz1L.569d029cc939.js → VWindowItem-BNlHE64F.3d075bae3388.js} +1 -1
  99. codex/static_root/assets/VWindowItem-BNlHE64F.3d075bae3388.js.br +0 -0
  100. codex/static_root/assets/VWindowItem-BNlHE64F.3d075bae3388.js.gz +0 -0
  101. codex/static_root/assets/{VWindowItem-DiY3uz1L.js → VWindowItem-BNlHE64F.js} +1 -1
  102. codex/static_root/assets/VWindowItem-BNlHE64F.js.br +0 -0
  103. codex/static_root/assets/VWindowItem-BNlHE64F.js.gz +0 -0
  104. codex/static_root/assets/{admin-BW3Yp8Zu.bdbca238dcd4.js → admin-DjnFySLh.3a08126dc39c.js} +1 -1
  105. codex/static_root/assets/admin-DjnFySLh.3a08126dc39c.js.br +0 -0
  106. codex/static_root/assets/admin-DjnFySLh.3a08126dc39c.js.gz +0 -0
  107. codex/static_root/assets/{admin-BW3Yp8Zu.js → admin-DjnFySLh.js} +1 -1
  108. codex/static_root/assets/admin-DjnFySLh.js.br +0 -0
  109. codex/static_root/assets/admin-DjnFySLh.js.gz +0 -0
  110. codex/static_root/assets/{admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js → admin-drawer-panel-DY_fALho.4d912224504e.js} +8 -8
  111. codex/static_root/assets/admin-drawer-panel-DY_fALho.4d912224504e.js.br +0 -0
  112. codex/static_root/assets/admin-drawer-panel-DY_fALho.4d912224504e.js.gz +0 -0
  113. codex/static_root/assets/{admin-drawer-panel-CJ7EZ2DP.js → admin-drawer-panel-DY_fALho.js} +8 -8
  114. codex/static_root/assets/admin-drawer-panel-DY_fALho.js.br +0 -0
  115. codex/static_root/assets/admin-drawer-panel-DY_fALho.js.gz +0 -0
  116. codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.512d367edaca.css → admin-drawer-panel-s72VfDNy.css} +1 -1
  117. codex/static_root/assets/admin-drawer-panel-s72VfDNy.css.br +0 -0
  118. codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.512d367edaca.css.gz → admin-drawer-panel-s72VfDNy.css.gz} +0 -0
  119. codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.css → admin-drawer-panel-s72VfDNy.ef6cb7221a44.css} +1 -1
  120. codex/static_root/assets/admin-drawer-panel-s72VfDNy.ef6cb7221a44.css.br +0 -0
  121. codex/static_root/assets/{admin-drawer-panel-DEYM8FWr.css.gz → admin-drawer-panel-s72VfDNy.ef6cb7221a44.css.gz} +0 -0
  122. codex/static_root/assets/{browser-C8SJwVGz.0f7daf93b064.css → browser-2i0QA4La.587673ac534c.css} +1 -1
  123. codex/static_root/assets/browser-2i0QA4La.587673ac534c.css.br +0 -0
  124. codex/static_root/assets/browser-2i0QA4La.587673ac534c.css.gz +0 -0
  125. codex/static_root/assets/{browser-C8SJwVGz.css → browser-2i0QA4La.css} +1 -1
  126. codex/static_root/assets/browser-2i0QA4La.css.br +0 -0
  127. codex/static_root/assets/browser-2i0QA4La.css.gz +0 -0
  128. codex/static_root/assets/browser-B8cDJ5-w.150cd5de25bc.js +1 -0
  129. codex/static_root/assets/browser-B8cDJ5-w.150cd5de25bc.js.br +0 -0
  130. codex/static_root/assets/browser-B8cDJ5-w.150cd5de25bc.js.gz +0 -0
  131. codex/static_root/assets/browser-B8cDJ5-w.js +1 -0
  132. codex/static_root/assets/browser-B8cDJ5-w.js.br +0 -0
  133. codex/static_root/assets/browser-B8cDJ5-w.js.gz +0 -0
  134. codex/static_root/assets/{change-password-dialog-DvdVuJbx.ea31df1541a2.js → change-password-dialog-DgDGjI2a.d9af24abb0b9.js} +1 -1
  135. codex/static_root/assets/change-password-dialog-DgDGjI2a.d9af24abb0b9.js.br +0 -0
  136. codex/static_root/assets/change-password-dialog-DgDGjI2a.d9af24abb0b9.js.gz +0 -0
  137. codex/static_root/assets/{change-password-dialog-DvdVuJbx.js → change-password-dialog-DgDGjI2a.js} +1 -1
  138. codex/static_root/assets/change-password-dialog-DgDGjI2a.js.br +0 -0
  139. codex/static_root/assets/change-password-dialog-DgDGjI2a.js.gz +0 -0
  140. codex/static_root/assets/{confirm-dialog-oqU_wtjV.38d99c746057.js → confirm-dialog-GVok5hYU.0df954b875de.js} +1 -1
  141. codex/static_root/assets/confirm-dialog-GVok5hYU.0df954b875de.js.br +2 -0
  142. codex/static_root/assets/confirm-dialog-GVok5hYU.0df954b875de.js.gz +0 -0
  143. codex/static_root/assets/{confirm-dialog-oqU_wtjV.js → confirm-dialog-GVok5hYU.js} +1 -1
  144. codex/static_root/assets/confirm-dialog-GVok5hYU.js.br +2 -0
  145. codex/static_root/assets/confirm-dialog-GVok5hYU.js.gz +0 -0
  146. codex/static_root/assets/{confirm-footer-R7VhDN1M.js → confirm-footer-CWKcBA7p.fe0ccb86962b.js} +1 -1
  147. codex/static_root/assets/confirm-footer-CWKcBA7p.fe0ccb86962b.js.br +0 -0
  148. codex/static_root/assets/confirm-footer-CWKcBA7p.fe0ccb86962b.js.gz +0 -0
  149. codex/static_root/assets/{confirm-footer-R7VhDN1M.67adfe281d35.js → confirm-footer-CWKcBA7p.js} +1 -1
  150. codex/static_root/assets/confirm-footer-CWKcBA7p.js.br +0 -0
  151. codex/static_root/assets/confirm-footer-CWKcBA7p.js.gz +0 -0
  152. codex/static_root/assets/{datetime-column-CN_zeeDb.1cf9fd3f22d2.js → datetime-column-BRV63LgW.f23352488b87.js} +1 -1
  153. codex/static_root/assets/datetime-column-BRV63LgW.f23352488b87.js.br +0 -0
  154. codex/static_root/assets/datetime-column-BRV63LgW.f23352488b87.js.gz +0 -0
  155. codex/static_root/assets/{datetime-column-CN_zeeDb.js → datetime-column-BRV63LgW.js} +1 -1
  156. codex/static_root/assets/datetime-column-BRV63LgW.js.br +0 -0
  157. codex/static_root/assets/datetime-column-BRV63LgW.js.gz +0 -0
  158. codex/static_root/assets/{filter-DhorJRK4.f9bf91b3928c.js → filter-Cq-w9FH_.c04d9050f1a2.js} +1 -1
  159. codex/static_root/assets/filter-Cq-w9FH_.c04d9050f1a2.js.br +0 -0
  160. codex/static_root/assets/filter-Cq-w9FH_.c04d9050f1a2.js.gz +0 -0
  161. codex/static_root/assets/{filter-DhorJRK4.js → filter-Cq-w9FH_.js} +1 -1
  162. codex/static_root/assets/filter-Cq-w9FH_.js.br +0 -0
  163. codex/static_root/assets/filter-Cq-w9FH_.js.gz +0 -0
  164. codex/static_root/assets/flag-tab-D4WJek8g.c59cde03b73d.js +1 -0
  165. codex/static_root/assets/flag-tab-D4WJek8g.c59cde03b73d.js.br +0 -0
  166. codex/static_root/assets/flag-tab-D4WJek8g.c59cde03b73d.js.gz +0 -0
  167. codex/static_root/assets/flag-tab-D4WJek8g.js +1 -0
  168. codex/static_root/assets/flag-tab-D4WJek8g.js.br +0 -0
  169. codex/static_root/assets/flag-tab-D4WJek8g.js.gz +0 -0
  170. codex/static_root/assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css +1 -0
  171. codex/static_root/assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css.br +1 -0
  172. codex/static_root/assets/flag-tab-DUXtbpA2.8d52c0d4f9e2.css.gz +0 -0
  173. codex/static_root/assets/flag-tab-DUXtbpA2.css +1 -0
  174. codex/static_root/assets/flag-tab-DUXtbpA2.css.br +1 -0
  175. codex/static_root/assets/flag-tab-DUXtbpA2.css.gz +0 -0
  176. codex/static_root/assets/{group-tab-_H9JlSpl.6c9b686b8f94.js → group-tab-CHIOVL3t.43f1b2e737d0.js} +1 -1
  177. codex/static_root/assets/group-tab-CHIOVL3t.43f1b2e737d0.js.br +0 -0
  178. codex/static_root/assets/group-tab-CHIOVL3t.43f1b2e737d0.js.gz +0 -0
  179. codex/static_root/assets/{group-tab-_H9JlSpl.js → group-tab-CHIOVL3t.js} +1 -1
  180. codex/static_root/assets/group-tab-CHIOVL3t.js.br +0 -0
  181. codex/static_root/assets/group-tab-CHIOVL3t.js.gz +0 -0
  182. codex/static_root/assets/{http-error-CV1CbTnY.fed9281e2348.js → http-error-Mg4IhB2h.19679151549b.js} +1 -1
  183. codex/static_root/assets/http-error-Mg4IhB2h.19679151549b.js.br +3 -0
  184. codex/static_root/assets/http-error-Mg4IhB2h.19679151549b.js.gz +0 -0
  185. codex/static_root/assets/{http-error-CV1CbTnY.js → http-error-Mg4IhB2h.js} +1 -1
  186. codex/static_root/assets/http-error-Mg4IhB2h.js.br +3 -0
  187. codex/static_root/assets/http-error-Mg4IhB2h.js.gz +0 -0
  188. codex/static_root/assets/{library-tab-D6k-bjIz.cbd8944c48f1.js → library-tab-CiF2Hc5t.a6628c68d738.js} +1 -1
  189. codex/static_root/assets/library-tab-CiF2Hc5t.a6628c68d738.js.br +0 -0
  190. codex/static_root/assets/library-tab-CiF2Hc5t.a6628c68d738.js.gz +0 -0
  191. codex/static_root/assets/{library-tab-D6k-bjIz.js → library-tab-CiF2Hc5t.js} +1 -1
  192. codex/static_root/assets/library-tab-CiF2Hc5t.js.br +0 -0
  193. codex/static_root/assets/library-tab-CiF2Hc5t.js.gz +0 -0
  194. codex/static_root/assets/{main-C8c_Yy_E.js → main-Dz9u71DQ.2f4e5662224c.js} +4 -4
  195. codex/static_root/assets/main-Dz9u71DQ.2f4e5662224c.js.br +0 -0
  196. codex/static_root/assets/main-Dz9u71DQ.2f4e5662224c.js.gz +0 -0
  197. codex/static_root/assets/{main-C8c_Yy_E.16ff3f5c3880.js → main-Dz9u71DQ.js} +4 -4
  198. codex/static_root/assets/main-Dz9u71DQ.js.br +0 -0
  199. codex/static_root/assets/main-Dz9u71DQ.js.gz +0 -0
  200. codex/static_root/assets/{metadata-dialog-uikP6x2m.84a7b6c4b6b9.css → metadata-dialog-BGJasBRy.0553851658b5.css} +1 -1
  201. codex/static_root/assets/metadata-dialog-BGJasBRy.0553851658b5.css.br +0 -0
  202. codex/static_root/assets/metadata-dialog-BGJasBRy.0553851658b5.css.gz +0 -0
  203. codex/static_root/assets/{metadata-dialog-uikP6x2m.css → metadata-dialog-BGJasBRy.css} +1 -1
  204. codex/static_root/assets/metadata-dialog-BGJasBRy.css.br +0 -0
  205. codex/static_root/assets/metadata-dialog-BGJasBRy.css.gz +0 -0
  206. codex/static_root/assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js +1 -0
  207. codex/static_root/assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js.br +0 -0
  208. codex/static_root/assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js.gz +0 -0
  209. codex/static_root/assets/metadata-dialog-D-XX9wAf.js +1 -0
  210. codex/static_root/assets/metadata-dialog-D-XX9wAf.js.br +0 -0
  211. codex/static_root/assets/metadata-dialog-D-XX9wAf.js.gz +0 -0
  212. codex/static_root/assets/{pdf-doc-DOq4qvUr.89d991424d2f.js → pdf-doc-a-oCC_tG.f8ec02f0e84b.js} +1 -1
  213. codex/static_root/assets/pdf-doc-a-oCC_tG.f8ec02f0e84b.js.br +0 -0
  214. codex/static_root/assets/pdf-doc-a-oCC_tG.f8ec02f0e84b.js.gz +0 -0
  215. codex/static_root/assets/{pdf-doc-DOq4qvUr.js → pdf-doc-a-oCC_tG.js} +1 -1
  216. codex/static_root/assets/pdf-doc-a-oCC_tG.js.br +0 -0
  217. codex/static_root/assets/pdf-doc-a-oCC_tG.js.gz +0 -0
  218. codex/static_root/assets/reader-D205EQd-.f7b10abbf5ca.js +7 -0
  219. codex/static_root/assets/reader-D205EQd-.f7b10abbf5ca.js.br +0 -0
  220. codex/static_root/assets/reader-D205EQd-.f7b10abbf5ca.js.gz +0 -0
  221. codex/static_root/assets/reader-D205EQd-.js +7 -0
  222. codex/static_root/assets/reader-D205EQd-.js.br +0 -0
  223. codex/static_root/assets/reader-D205EQd-.js.gz +0 -0
  224. codex/static_root/assets/{stats-tab-VaVi9-_s.186447352c39.js → stats-tab-ZJVUN0Bb.46124f9c673f.js} +1 -1
  225. codex/static_root/assets/stats-tab-ZJVUN0Bb.46124f9c673f.js.br +0 -0
  226. codex/static_root/assets/stats-tab-ZJVUN0Bb.46124f9c673f.js.gz +0 -0
  227. codex/static_root/assets/{stats-tab-VaVi9-_s.js → stats-tab-ZJVUN0Bb.js} +1 -1
  228. codex/static_root/assets/stats-tab-ZJVUN0Bb.js.br +0 -0
  229. codex/static_root/assets/stats-tab-ZJVUN0Bb.js.gz +0 -0
  230. codex/static_root/assets/{task-tab-C0L1rPrr.249d29a1eb6b.js → task-tab-48ysPp-X.d48d8675190c.js} +1 -1
  231. codex/static_root/assets/task-tab-48ysPp-X.d48d8675190c.js.br +0 -0
  232. codex/static_root/assets/task-tab-48ysPp-X.d48d8675190c.js.gz +0 -0
  233. codex/static_root/assets/{task-tab-C0L1rPrr.js → task-tab-48ysPp-X.js} +1 -1
  234. codex/static_root/assets/task-tab-48ysPp-X.js.br +0 -0
  235. codex/static_root/assets/task-tab-48ysPp-X.js.gz +0 -0
  236. codex/static_root/assets/{user-tab-Cj-rHVvF.cbb1700e110d.js → user-tab-rG7-IzRY.d3e8fa81914d.js} +1 -1
  237. codex/static_root/assets/user-tab-rG7-IzRY.d3e8fa81914d.js.br +0 -0
  238. codex/static_root/assets/user-tab-rG7-IzRY.d3e8fa81914d.js.gz +0 -0
  239. codex/static_root/assets/{user-tab-Cj-rHVvF.js → user-tab-rG7-IzRY.js} +1 -1
  240. codex/static_root/assets/user-tab-rG7-IzRY.js.br +0 -0
  241. codex/static_root/assets/user-tab-rG7-IzRY.js.gz +0 -0
  242. codex/static_root/js/{choices-admin.3a2cdebdbfba.json → choices-admin.bb730e4f26ac.json} +1 -1
  243. codex/static_root/js/choices-admin.bb730e4f26ac.json.br +0 -0
  244. codex/static_root/js/{choices-admin.3a2cdebdbfba.json.gz → choices-admin.bb730e4f26ac.json.gz} +0 -0
  245. codex/static_root/js/choices-admin.json +1 -1
  246. codex/static_root/js/choices-admin.json.br +0 -0
  247. codex/static_root/js/choices-admin.json.gz +0 -0
  248. codex/static_root/{manifest.4609de9a4d51.json → manifest.d1d6846d318a.json} +217 -217
  249. codex/static_root/manifest.d1d6846d318a.json.br +0 -0
  250. codex/static_root/manifest.d1d6846d318a.json.gz +0 -0
  251. codex/static_root/manifest.json +217 -217
  252. codex/static_root/manifest.json.br +0 -0
  253. codex/static_root/manifest.json.gz +0 -0
  254. codex/static_root/staticfiles.json +1 -1
  255. codex/templates/search/indexes/codex/comic_text.txt +1 -1
  256. codex/views/browser/base.py +4 -1
  257. codex/views/browser/browser.py +26 -21
  258. codex/views/browser/browser_annotations.py +0 -1
  259. codex/views/browser/choices.py +2 -0
  260. codex/views/browser/filters/search.py +3 -1
  261. codex/views/browser/metadata.py +12 -6
  262. codex/views/reader/reader.py +53 -5
  263. {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/METADATA +1 -1
  264. {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/RECORD +267 -267
  265. codex/static_root/assets/VCheckbox-DXUwafcN.5d4577e0b16d.js.br +0 -0
  266. codex/static_root/assets/VCheckbox-DXUwafcN.5d4577e0b16d.js.gz +0 -0
  267. codex/static_root/assets/VCheckbox-DXUwafcN.js.br +0 -0
  268. codex/static_root/assets/VCheckbox-DXUwafcN.js.gz +0 -0
  269. codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js.br +0 -0
  270. codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js.gz +0 -0
  271. codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.js.br +0 -0
  272. codex/static_root/assets/VCheckboxBtn-DtrZ6IUL.js.gz +0 -0
  273. codex/static_root/assets/VCombobox-p6JaNJiS.08de72bf3f1d.js.br +0 -0
  274. codex/static_root/assets/VCombobox-p6JaNJiS.08de72bf3f1d.js.gz +0 -0
  275. codex/static_root/assets/VCombobox-p6JaNJiS.js.br +0 -0
  276. codex/static_root/assets/VCombobox-p6JaNJiS.js.gz +0 -0
  277. codex/static_root/assets/VDataTableVirtual-Bak8sUxr.0f131a181de8.js.br +0 -0
  278. codex/static_root/assets/VDataTableVirtual-Bak8sUxr.0f131a181de8.js.gz +0 -0
  279. codex/static_root/assets/VDataTableVirtual-Bak8sUxr.js.br +0 -0
  280. codex/static_root/assets/VDataTableVirtual-Bak8sUxr.js.gz +0 -0
  281. codex/static_root/assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css +0 -1
  282. codex/static_root/assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css.br +0 -0
  283. codex/static_root/assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css.gz +0 -0
  284. codex/static_root/assets/VExpansionPanel-BgvW2DKJ.css +0 -1
  285. codex/static_root/assets/VExpansionPanel-BgvW2DKJ.css.br +0 -0
  286. codex/static_root/assets/VExpansionPanel-BgvW2DKJ.css.gz +0 -0
  287. codex/static_root/assets/VExpansionPanel-BrGvn58l.4330794fe673.js.br +0 -0
  288. codex/static_root/assets/VExpansionPanel-BrGvn58l.4330794fe673.js.gz +0 -0
  289. codex/static_root/assets/VExpansionPanel-BrGvn58l.js.br +0 -0
  290. codex/static_root/assets/VExpansionPanel-BrGvn58l.js.gz +0 -0
  291. codex/static_root/assets/VMain-CuWbokFS.25c97b3ec973.js.br +0 -0
  292. codex/static_root/assets/VMain-CuWbokFS.25c97b3ec973.js.gz +0 -0
  293. codex/static_root/assets/VMain-CuWbokFS.js.br +0 -0
  294. codex/static_root/assets/VMain-CuWbokFS.js.gz +0 -0
  295. codex/static_root/assets/VRadioGroup-DYMjLsVk.c4d81d70bec4.js.br +0 -0
  296. codex/static_root/assets/VRadioGroup-DYMjLsVk.c4d81d70bec4.js.gz +0 -0
  297. codex/static_root/assets/VRadioGroup-DYMjLsVk.js.br +0 -0
  298. codex/static_root/assets/VRadioGroup-DYMjLsVk.js.gz +0 -0
  299. codex/static_root/assets/VSelect-CgOC_YIA.3d63f40c8ea4.js.br +0 -0
  300. codex/static_root/assets/VSelect-CgOC_YIA.3d63f40c8ea4.js.gz +0 -0
  301. codex/static_root/assets/VSelect-CgOC_YIA.js.br +0 -0
  302. codex/static_root/assets/VSelect-CgOC_YIA.js.gz +0 -0
  303. codex/static_root/assets/VSelect-udkSZJsa.1873bae92d9d.css +0 -1
  304. codex/static_root/assets/VSelect-udkSZJsa.1873bae92d9d.css.br +0 -0
  305. codex/static_root/assets/VSelect-udkSZJsa.1873bae92d9d.css.gz +0 -0
  306. codex/static_root/assets/VSelect-udkSZJsa.css +0 -1
  307. codex/static_root/assets/VSelect-udkSZJsa.css.br +0 -0
  308. codex/static_root/assets/VSelect-udkSZJsa.css.gz +0 -0
  309. codex/static_root/assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js +0 -1
  310. codex/static_root/assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js.br +0 -0
  311. codex/static_root/assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js.gz +0 -0
  312. codex/static_root/assets/VSelectionControl-CD7bn0s_.js +0 -1
  313. codex/static_root/assets/VSelectionControl-CD7bn0s_.js.br +0 -0
  314. codex/static_root/assets/VSelectionControl-CD7bn0s_.js.gz +0 -0
  315. codex/static_root/assets/VSlideGroup-Bssf4EBT.fc0918385f7e.js.br +0 -0
  316. codex/static_root/assets/VSlideGroup-Bssf4EBT.fc0918385f7e.js.gz +0 -0
  317. codex/static_root/assets/VSlideGroup-Bssf4EBT.js.br +0 -0
  318. codex/static_root/assets/VSlideGroup-Bssf4EBT.js.gz +0 -0
  319. codex/static_root/assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css +0 -1
  320. codex/static_root/assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css.br +0 -0
  321. codex/static_root/assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css.gz +0 -0
  322. codex/static_root/assets/VSlideGroup-rAVUcz72.css +0 -1
  323. codex/static_root/assets/VSlideGroup-rAVUcz72.css.br +0 -0
  324. codex/static_root/assets/VSlideGroup-rAVUcz72.css.gz +0 -0
  325. codex/static_root/assets/VTable-DqraBe83.1f53f4e0e79f.js.br +0 -0
  326. codex/static_root/assets/VTable-DqraBe83.1f53f4e0e79f.js.gz +0 -0
  327. codex/static_root/assets/VTable-DqraBe83.js.br +0 -0
  328. codex/static_root/assets/VTable-DqraBe83.js.gz +0 -0
  329. codex/static_root/assets/VToolbar-kI3X77C7.54fc7a9541e0.js.br +0 -0
  330. codex/static_root/assets/VToolbar-kI3X77C7.js.br +0 -0
  331. codex/static_root/assets/VWindowItem-DiY3uz1L.569d029cc939.js.br +0 -0
  332. codex/static_root/assets/VWindowItem-DiY3uz1L.569d029cc939.js.gz +0 -0
  333. codex/static_root/assets/VWindowItem-DiY3uz1L.js.br +0 -0
  334. codex/static_root/assets/VWindowItem-DiY3uz1L.js.gz +0 -0
  335. codex/static_root/assets/admin-BW3Yp8Zu.bdbca238dcd4.js.br +0 -0
  336. codex/static_root/assets/admin-BW3Yp8Zu.bdbca238dcd4.js.gz +0 -0
  337. codex/static_root/assets/admin-BW3Yp8Zu.js.br +0 -0
  338. codex/static_root/assets/admin-BW3Yp8Zu.js.gz +0 -0
  339. codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js.br +0 -0
  340. codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js.gz +0 -0
  341. codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.js.br +0 -0
  342. codex/static_root/assets/admin-drawer-panel-CJ7EZ2DP.js.gz +0 -0
  343. codex/static_root/assets/admin-drawer-panel-DEYM8FWr.512d367edaca.css.br +0 -0
  344. codex/static_root/assets/admin-drawer-panel-DEYM8FWr.css.br +0 -0
  345. codex/static_root/assets/browser-BQuqhnNc.df377a24a88a.js +0 -1
  346. codex/static_root/assets/browser-BQuqhnNc.df377a24a88a.js.br +0 -0
  347. codex/static_root/assets/browser-BQuqhnNc.df377a24a88a.js.gz +0 -0
  348. codex/static_root/assets/browser-BQuqhnNc.js +0 -1
  349. codex/static_root/assets/browser-BQuqhnNc.js.br +0 -0
  350. codex/static_root/assets/browser-BQuqhnNc.js.gz +0 -0
  351. codex/static_root/assets/browser-C8SJwVGz.0f7daf93b064.css.br +0 -0
  352. codex/static_root/assets/browser-C8SJwVGz.0f7daf93b064.css.gz +0 -0
  353. codex/static_root/assets/browser-C8SJwVGz.css.br +0 -0
  354. codex/static_root/assets/browser-C8SJwVGz.css.gz +0 -0
  355. codex/static_root/assets/change-password-dialog-DvdVuJbx.ea31df1541a2.js.br +0 -0
  356. codex/static_root/assets/change-password-dialog-DvdVuJbx.ea31df1541a2.js.gz +0 -0
  357. codex/static_root/assets/change-password-dialog-DvdVuJbx.js.br +0 -0
  358. codex/static_root/assets/change-password-dialog-DvdVuJbx.js.gz +0 -0
  359. codex/static_root/assets/confirm-dialog-oqU_wtjV.38d99c746057.js.br +0 -0
  360. codex/static_root/assets/confirm-dialog-oqU_wtjV.38d99c746057.js.gz +0 -0
  361. codex/static_root/assets/confirm-dialog-oqU_wtjV.js.br +0 -0
  362. codex/static_root/assets/confirm-dialog-oqU_wtjV.js.gz +0 -0
  363. codex/static_root/assets/confirm-footer-R7VhDN1M.67adfe281d35.js.br +0 -0
  364. codex/static_root/assets/confirm-footer-R7VhDN1M.67adfe281d35.js.gz +0 -0
  365. codex/static_root/assets/confirm-footer-R7VhDN1M.js.br +0 -0
  366. codex/static_root/assets/confirm-footer-R7VhDN1M.js.gz +0 -0
  367. codex/static_root/assets/datetime-column-CN_zeeDb.1cf9fd3f22d2.js.br +0 -0
  368. codex/static_root/assets/datetime-column-CN_zeeDb.1cf9fd3f22d2.js.gz +0 -0
  369. codex/static_root/assets/datetime-column-CN_zeeDb.js.br +0 -0
  370. codex/static_root/assets/datetime-column-CN_zeeDb.js.gz +0 -0
  371. codex/static_root/assets/filter-DhorJRK4.f9bf91b3928c.js.br +0 -0
  372. codex/static_root/assets/filter-DhorJRK4.f9bf91b3928c.js.gz +0 -0
  373. codex/static_root/assets/filter-DhorJRK4.js.br +0 -0
  374. codex/static_root/assets/filter-DhorJRK4.js.gz +0 -0
  375. codex/static_root/assets/flag-tab-BTiZcgOa.81b4fefa02e1.css +0 -1
  376. codex/static_root/assets/flag-tab-BTiZcgOa.81b4fefa02e1.css.br +0 -1
  377. codex/static_root/assets/flag-tab-BTiZcgOa.81b4fefa02e1.css.gz +0 -0
  378. codex/static_root/assets/flag-tab-BTiZcgOa.css +0 -1
  379. codex/static_root/assets/flag-tab-BTiZcgOa.css.br +0 -1
  380. codex/static_root/assets/flag-tab-BTiZcgOa.css.gz +0 -0
  381. codex/static_root/assets/flag-tab-C-ZU-QYU.c190eb30e5d5.js +0 -1
  382. codex/static_root/assets/flag-tab-C-ZU-QYU.c190eb30e5d5.js.br +0 -0
  383. codex/static_root/assets/flag-tab-C-ZU-QYU.c190eb30e5d5.js.gz +0 -0
  384. codex/static_root/assets/flag-tab-C-ZU-QYU.js +0 -1
  385. codex/static_root/assets/flag-tab-C-ZU-QYU.js.br +0 -0
  386. codex/static_root/assets/flag-tab-C-ZU-QYU.js.gz +0 -0
  387. codex/static_root/assets/group-tab-_H9JlSpl.6c9b686b8f94.js.br +0 -0
  388. codex/static_root/assets/group-tab-_H9JlSpl.6c9b686b8f94.js.gz +0 -0
  389. codex/static_root/assets/group-tab-_H9JlSpl.js.br +0 -0
  390. codex/static_root/assets/group-tab-_H9JlSpl.js.gz +0 -0
  391. codex/static_root/assets/http-error-CV1CbTnY.fed9281e2348.js.br +0 -0
  392. codex/static_root/assets/http-error-CV1CbTnY.fed9281e2348.js.gz +0 -0
  393. codex/static_root/assets/http-error-CV1CbTnY.js.br +0 -0
  394. codex/static_root/assets/http-error-CV1CbTnY.js.gz +0 -0
  395. codex/static_root/assets/library-tab-D6k-bjIz.cbd8944c48f1.js.br +0 -0
  396. codex/static_root/assets/library-tab-D6k-bjIz.cbd8944c48f1.js.gz +0 -0
  397. codex/static_root/assets/library-tab-D6k-bjIz.js.br +0 -0
  398. codex/static_root/assets/library-tab-D6k-bjIz.js.gz +0 -0
  399. codex/static_root/assets/main-C8c_Yy_E.16ff3f5c3880.js.br +0 -0
  400. codex/static_root/assets/main-C8c_Yy_E.16ff3f5c3880.js.gz +0 -0
  401. codex/static_root/assets/main-C8c_Yy_E.js.br +0 -0
  402. codex/static_root/assets/main-C8c_Yy_E.js.gz +0 -0
  403. codex/static_root/assets/metadata-dialog-B9q6Xpe7.103141664cd0.js +0 -1
  404. codex/static_root/assets/metadata-dialog-B9q6Xpe7.103141664cd0.js.br +0 -0
  405. codex/static_root/assets/metadata-dialog-B9q6Xpe7.103141664cd0.js.gz +0 -0
  406. codex/static_root/assets/metadata-dialog-B9q6Xpe7.js +0 -1
  407. codex/static_root/assets/metadata-dialog-B9q6Xpe7.js.br +0 -0
  408. codex/static_root/assets/metadata-dialog-B9q6Xpe7.js.gz +0 -0
  409. codex/static_root/assets/metadata-dialog-uikP6x2m.84a7b6c4b6b9.css.br +0 -0
  410. codex/static_root/assets/metadata-dialog-uikP6x2m.84a7b6c4b6b9.css.gz +0 -0
  411. codex/static_root/assets/metadata-dialog-uikP6x2m.css.br +0 -0
  412. codex/static_root/assets/metadata-dialog-uikP6x2m.css.gz +0 -0
  413. codex/static_root/assets/pdf-doc-DOq4qvUr.89d991424d2f.js.br +0 -0
  414. codex/static_root/assets/pdf-doc-DOq4qvUr.89d991424d2f.js.gz +0 -0
  415. codex/static_root/assets/pdf-doc-DOq4qvUr.js.br +0 -0
  416. codex/static_root/assets/pdf-doc-DOq4qvUr.js.gz +0 -0
  417. codex/static_root/assets/reader-BWdhR39E.8f8a692077dc.js +0 -7
  418. codex/static_root/assets/reader-BWdhR39E.8f8a692077dc.js.br +0 -0
  419. codex/static_root/assets/reader-BWdhR39E.8f8a692077dc.js.gz +0 -0
  420. codex/static_root/assets/reader-BWdhR39E.js +0 -7
  421. codex/static_root/assets/reader-BWdhR39E.js.br +0 -0
  422. codex/static_root/assets/reader-BWdhR39E.js.gz +0 -0
  423. codex/static_root/assets/stats-tab-VaVi9-_s.186447352c39.js.br +0 -0
  424. codex/static_root/assets/stats-tab-VaVi9-_s.186447352c39.js.gz +0 -0
  425. codex/static_root/assets/stats-tab-VaVi9-_s.js.br +0 -0
  426. codex/static_root/assets/stats-tab-VaVi9-_s.js.gz +0 -0
  427. codex/static_root/assets/task-tab-C0L1rPrr.249d29a1eb6b.js.br +0 -0
  428. codex/static_root/assets/task-tab-C0L1rPrr.249d29a1eb6b.js.gz +0 -0
  429. codex/static_root/assets/task-tab-C0L1rPrr.js.br +0 -0
  430. codex/static_root/assets/task-tab-C0L1rPrr.js.gz +0 -0
  431. codex/static_root/assets/user-tab-Cj-rHVvF.cbb1700e110d.js.br +0 -0
  432. codex/static_root/assets/user-tab-Cj-rHVvF.cbb1700e110d.js.gz +0 -0
  433. codex/static_root/assets/user-tab-Cj-rHVvF.js.br +0 -0
  434. codex/static_root/assets/user-tab-Cj-rHVvF.js.gz +0 -0
  435. codex/static_root/js/choices-admin.3a2cdebdbfba.json.br +0 -0
  436. codex/static_root/manifest.4609de9a4d51.json.br +0 -0
  437. codex/static_root/manifest.4609de9a4d51.json.gz +0 -0
  438. {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/LICENSE +0 -0
  439. {codex-1.5.7rc1.dist-info → codex-1.5.9.dist-info}/WHEEL +0 -0
  440. {codex-1.5.7rc1.dist-info → codex-1.5.9.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.fedcbd1ec085.json", "js/choices-admin.json": "js/choices-admin.3a2cdebdbfba.json", "assets/datetime-column-CN_zeeDb.js": "assets/datetime-column-CN_zeeDb.1cf9fd3f22d2.js", "assets/confirm-dialog-oqU_wtjV.js": "assets/confirm-dialog-oqU_wtjV.38d99c746057.js", "assets/change-password-dialog-DvdVuJbx.js": "assets/change-password-dialog-DvdVuJbx.ea31df1541a2.js", "assets/browser-BQuqhnNc.js": "assets/browser-BQuqhnNc.df377a24a88a.js", "assets/datetime-column-BWWfvyhn.css": "assets/datetime-column-BWWfvyhn.a4a94ba57c73.css", "assets/admin-drawer-panel-DEYM8FWr.css": "assets/admin-drawer-panel-DEYM8FWr.512d367edaca.css", "assets/VSelect-CgOC_YIA.js": "assets/VSelect-CgOC_YIA.3d63f40c8ea4.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/http-error-CV1CbTnY.js": "assets/http-error-CV1CbTnY.fed9281e2348.js", "assets/reader-BWdhR39E.js": "assets/reader-BWdhR39E.8f8a692077dc.js", "assets/group-tab-_H9JlSpl.js": "assets/group-tab-_H9JlSpl.6c9b686b8f94.js", "assets/VMain-Byt37V4c.css": "assets/VMain-Byt37V4c.a00e206f3cfa.css", "assets/admin-BW3Yp8Zu.js": "assets/admin-BW3Yp8Zu.bdbca238dcd4.js", "assets/pdf-doc-DOq4qvUr.js": "assets/pdf-doc-DOq4qvUr.89d991424d2f.js", "assets/VExpansionPanel-BrGvn58l.js": "assets/VExpansionPanel-BrGvn58l.4330794fe673.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/user-tab-Cj-rHVvF.js": "assets/user-tab-Cj-rHVvF.cbb1700e110d.js", "assets/VSelectionControl-CD7bn0s_.js": "assets/VSelectionControl-CD7bn0s_.0aa74aad8b61.js", "assets/VSlideGroup-Bssf4EBT.js": "assets/VSlideGroup-Bssf4EBT.fc0918385f7e.js", "assets/main-CacfwsKA.css": "assets/main-CacfwsKA.4f849ef1c5db.css", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/VToolbar-kI3X77C7.js": "assets/VToolbar-kI3X77C7.54fc7a9541e0.js", "assets/metadata-dialog-B9q6Xpe7.js": "assets/metadata-dialog-B9q6Xpe7.103141664cd0.js", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/flag-tab-C-ZU-QYU.js": "assets/flag-tab-C-ZU-QYU.c190eb30e5d5.js", "assets/main-C8c_Yy_E.js": "assets/main-C8c_Yy_E.16ff3f5c3880.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/filter-DhorJRK4.js": "assets/filter-DhorJRK4.f9bf91b3928c.js", "assets/stats-tab-VaVi9-_s.js": "assets/stats-tab-VaVi9-_s.186447352c39.js", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/library-tab-D6k-bjIz.js": "assets/library-tab-D6k-bjIz.cbd8944c48f1.js", "assets/VSelect-udkSZJsa.css": "assets/VSelect-udkSZJsa.1873bae92d9d.css", "assets/task-tab-C0L1rPrr.js": "assets/task-tab-C0L1rPrr.249d29a1eb6b.js", "assets/VCheckbox-DXUwafcN.js": "assets/VCheckbox-DXUwafcN.5d4577e0b16d.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/VCheckboxBtn-DtrZ6IUL.js": "assets/VCheckboxBtn-DtrZ6IUL.4f8f7be34af8.js", "assets/VMain-CuWbokFS.js": "assets/VMain-CuWbokFS.25c97b3ec973.js", "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/confirm-footer-R7VhDN1M.js": "assets/confirm-footer-R7VhDN1M.67adfe281d35.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/VCombobox-p6JaNJiS.js": "assets/VCombobox-p6JaNJiS.08de72bf3f1d.js", "assets/VWindowItem-DiY3uz1L.js": "assets/VWindowItem-DiY3uz1L.569d029cc939.js", "assets/metadata-dialog-uikP6x2m.css": "assets/metadata-dialog-uikP6x2m.84a7b6c4b6b9.css", "assets/http-error-C25WdjWC.css": "assets/http-error-C25WdjWC.1c7337ad6e1d.css", "assets/admin-drawer-panel-CJ7EZ2DP.js": "assets/admin-drawer-panel-CJ7EZ2DP.b6a369b30b07.js", "assets/VRadioGroup-DYMjLsVk.js": "assets/VRadioGroup-DYMjLsVk.c4d81d70bec4.js", "assets/VToolbar-BfNszTMd.css": "assets/VToolbar-BfNszTMd.111f25cdd6d8.css", "assets/VTable-DqraBe83.js": "assets/VTable-DqraBe83.1f53f4e0e79f.js", "assets/VExpansionPanel-BgvW2DKJ.css": "assets/VExpansionPanel-BgvW2DKJ.cd604d70ceee.css", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/VSlideGroup-rAVUcz72.css": "assets/VSlideGroup-rAVUcz72.31b1eb6202e4.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/flag-tab-BTiZcgOa.css": "assets/flag-tab-BTiZcgOa.81b4fefa02e1.css", "assets/group-tab-3DXxSetf.css": "assets/group-tab-3DXxSetf.5fc2cfa31669.css", "assets/VDataTableVirtual-Bak8sUxr.js": "assets/VDataTableVirtual-Bak8sUxr.0f131a181de8.js", "assets/browser-C8SJwVGz.css": "assets/browser-C8SJwVGz.0f7daf93b064.css", "assets/admin-Df82-Qcj.css": "assets/admin-Df82-Qcj.4c3f0406ee54.css", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.4609de9a4d51.json"}, "version": "1.1", "hash": "3f0c0f0007b8"}
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/task-tab-48ysPp-X.js": "assets/task-tab-48ysPp-X.d48d8675190c.js", "assets/confirm-footer-CWKcBA7p.js": "assets/confirm-footer-CWKcBA7p.fe0ccb86962b.js", "assets/VExpansionPanel-B2jVSe6n.js": "assets/VExpansionPanel-B2jVSe6n.709be0bfd8a9.js", "assets/user-tab-rG7-IzRY.js": "assets/user-tab-rG7-IzRY.d3e8fa81914d.js", "assets/VExpansionPanel-DsEXVcCv.css": "assets/VExpansionPanel-DsEXVcCv.20b475255e66.css", "assets/stats-tab-ZJVUN0Bb.js": "assets/stats-tab-ZJVUN0Bb.46124f9c673f.js", "assets/change-password-dialog-DgDGjI2a.js": "assets/change-password-dialog-DgDGjI2a.d9af24abb0b9.js", "assets/datetime-column-BWWfvyhn.css": "assets/datetime-column-BWWfvyhn.a4a94ba57c73.css", "assets/VDataTableVirtual-CYU6VHSb.js": "assets/VDataTableVirtual-CYU6VHSb.fa1b727f4ceb.js", "assets/group-tab-CHIOVL3t.js": "assets/group-tab-CHIOVL3t.43f1b2e737d0.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSlideGroup-VeMEwEff.js": "assets/VSlideGroup-VeMEwEff.3d72e1175a80.js", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/VSelectionControl-DsJeRYlc.js": "assets/VSelectionControl-DsJeRYlc.ebee94ea88d0.js", "assets/VSlideGroup-C3lY91uv.css": "assets/VSlideGroup-C3lY91uv.d268067bd078.css", "assets/VMain-Byt37V4c.css": "assets/VMain-Byt37V4c.a00e206f3cfa.css", "assets/datetime-column-BRV63LgW.js": "assets/datetime-column-BRV63LgW.f23352488b87.js", "assets/VCheckboxBtn-CwKlKk7z.js": "assets/VCheckboxBtn-CwKlKk7z.8d7caa36a3ac.js", "assets/stats-tab-BTZLMBCU.css": "assets/stats-tab-BTZLMBCU.7e0a9547c12e.css", "assets/confirm-footer-VFepxcJs.css": "assets/confirm-footer-VFepxcJs.4150131304bd.css", "assets/VCombobox-DgVMswtt.js": "assets/VCombobox-DgVMswtt.5685f334102a.js", "assets/flag-tab-D4WJek8g.js": "assets/flag-tab-D4WJek8g.c59cde03b73d.js", "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/VTable-CAK_p0Il.js": "assets/VTable-CAK_p0Il.c1781e76e150.js", "assets/main-CacfwsKA.css": "assets/main-CacfwsKA.4f849ef1c5db.css", "assets/metadata-dialog-BGJasBRy.css": "assets/metadata-dialog-BGJasBRy.0553851658b5.css", "assets/confirm-dialog-GVok5hYU.js": "assets/confirm-dialog-GVok5hYU.0df954b875de.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/admin-drawer-panel-DY_fALho.js": "assets/admin-drawer-panel-DY_fALho.4d912224504e.js", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/VToolbar-Dyufo4_P.js": "assets/VToolbar-Dyufo4_P.24ef4946e516.js", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/browser-2i0QA4La.css": "assets/browser-2i0QA4La.587673ac534c.css", "assets/library-tab-CiF2Hc5t.js": "assets/library-tab-CiF2Hc5t.a6628c68d738.js", "assets/admin-drawer-panel-s72VfDNy.css": "assets/admin-drawer-panel-s72VfDNy.ef6cb7221a44.css", "assets/VRadioGroup-e5ZzndXH.js": "assets/VRadioGroup-e5ZzndXH.545e89fea1a2.js", "assets/pdf-doc-a-oCC_tG.js": "assets/pdf-doc-a-oCC_tG.f8ec02f0e84b.js", "assets/reader-D205EQd-.js": "assets/reader-D205EQd-.f7b10abbf5ca.js", "assets/filter-Cq-w9FH_.js": "assets/filter-Cq-w9FH_.c04d9050f1a2.js", "assets/metadata-dialog-D-XX9wAf.js": "assets/metadata-dialog-D-XX9wAf.cd5465341ca1.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/admin-DjnFySLh.js": "assets/admin-DjnFySLh.3a08126dc39c.js", "assets/reader-CG6zrLXl.css": "assets/reader-CG6zrLXl.ed017042cd53.css", "assets/VWindowItem-BNlHE64F.js": "assets/VWindowItem-BNlHE64F.3d075bae3388.js", "assets/task-tab-DoX9OA37.css": "assets/task-tab-DoX9OA37.9bb355f36dbf.css", "assets/VDataTableVirtual-Cbj7IGxa.css": "assets/VDataTableVirtual-Cbj7IGxa.24039b2ebc61.css", "assets/browser-B8cDJ5-w.js": "assets/browser-B8cDJ5-w.150cd5de25bc.js", "assets/index-DUjeNg4x.js": "assets/index-DUjeNg4x.36d50c91b2c1.js", "assets/http-error-Mg4IhB2h.js": "assets/http-error-Mg4IhB2h.19679151549b.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/VToolbar-BfNszTMd.css": "assets/VToolbar-BfNszTMd.111f25cdd6d8.css", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VSelect-CxY8UVRq.js": "assets/VSelect-CxY8UVRq.dc3019941096.js", "assets/VSelect-BdGop3V2.css": "assets/VSelect-BdGop3V2.604c1785fbff.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/main-Dz9u71DQ.js": "assets/main-Dz9u71DQ.2f4e5662224c.js", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/group-tab-3DXxSetf.css": "assets/group-tab-3DXxSetf.5fc2cfa31669.css", "assets/VMain-DUot655v.js": "assets/VMain-DUot655v.58737665d0c0.js", "assets/VCheckbox-RPeBWFgy.js": "assets/VCheckbox-RPeBWFgy.c0e3c4c4deaa.js", "assets/admin-Df82-Qcj.css": "assets/admin-Df82-Qcj.4c3f0406ee54.css", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.d1d6846d318a.json"}, "version": "1.1", "hash": "38719676d715"}
@@ -2,7 +2,7 @@
2
2
  {{ object.imprint.name }}
3
3
  {{ object.series.name }}
4
4
  {{ object.volume.name }}
5
- {{ object.issue_suffix }}
5
+ {{ object.issue }}
6
6
  {{ object.name }}
7
7
  {{ object.age_rating.name }}
8
8
  {{ object.country.name }}
@@ -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
 
@@ -71,8 +72,10 @@ class BrowserBaseView(
71
72
  object_filter &= self.get_comic_field_filter(self.rel_prefix)
72
73
  return object_filter
73
74
 
74
- def get_query_filters(self, model, search_scores: dict, choices=False):
75
+ def get_query_filters(self, model, search_scores: dict | None, choices=False):
75
76
  """Return the main object filter and the one for aggregates."""
77
+ if search_scores is None:
78
+ return Q(False)
76
79
  object_filter = self.get_query_filters_without_group(model, search_scores)
77
80
  object_filter &= self.get_group_filter(choices)
78
81
  return object_filter
@@ -43,9 +43,6 @@ class BrowserView(BrowserAnnotationsView):
43
43
  serializer_class = BrowserPageSerializer
44
44
 
45
45
  MAX_OBJ_PER_PAGE = 100
46
- _MODEL_GROUP_MAP = MappingProxyType(
47
- {v: k for k, v in BrowserAnnotationsView.GROUP_MODEL_MAP.items()}
48
- )
49
46
  _NAV_GROUPS = "rpisv"
50
47
 
51
48
  _GROUP_INSTANCE_SELECT_RELATED = MappingProxyType(
@@ -83,7 +80,7 @@ class BrowserView(BrowserAnnotationsView):
83
80
  is_opds_2_acquisition = False
84
81
 
85
82
  def _annotate_group_names(self, queryset, model):
86
- """Annotate name fields."""
83
+ """Annotate name fields by hoisting them up."""
87
84
  # Optimized to only lookup what is used on the frontend
88
85
  group_names = {}
89
86
  if model == Comic:
@@ -100,16 +97,15 @@ class BrowserView(BrowserAnnotationsView):
100
97
  group_names["publisher_name"] = F("publisher__name")
101
98
  return queryset.annotate(**group_names)
102
99
 
100
+ def _annotate_group(self, queryset, model):
101
+ """Annotate Group."""
102
+ value = "c" if model == Comic else self.model_group
103
+ return queryset.annotate(group=Value(value, CharField(max_length=1)))
104
+
103
105
  def _add_annotations(self, queryset, model, search_scores: dict):
104
106
  """Annotations for display and sorting."""
105
107
  queryset = self.annotate_common_aggregates(queryset, model, search_scores)
106
-
107
- # Annotate Group
108
- self.model_group = self._MODEL_GROUP_MAP[model]
109
- queryset = queryset.annotate(
110
- group=Value(self.model_group, CharField(max_length=1))
111
- )
112
- # Hoist Group Names
108
+ queryset = self._annotate_group(queryset, model)
113
109
  return self._annotate_group_names(queryset, model)
114
110
 
115
111
  def _get_model_group(self):
@@ -133,15 +129,15 @@ class BrowserView(BrowserAnnotationsView):
133
129
  group = self.kwargs["group"]
134
130
  self.group_class = self.GROUP_MODEL_MAP[group]
135
131
 
136
- model_group = self._get_model_group()
137
- self.model = self.GROUP_MODEL_MAP[model_group]
132
+ self.model_group = self._get_model_group()
133
+ self.model = self.GROUP_MODEL_MAP[self.model_group]
138
134
 
139
- def _get_group_queryset(self, search_scores: dict):
135
+ def _get_group_queryset(self, search_scores: dict | None):
140
136
  """Create group queryset."""
141
137
  if not self.model:
142
138
  reason = "Model not set in browser."
143
139
  raise ValueError(reason)
144
- if self.model != Comic:
140
+ if self.model != Comic and search_scores is not None:
145
141
  object_filter = self.get_query_filters(self.model, search_scores, False)
146
142
  qs = self.model.objects.filter(object_filter)
147
143
  qs = self._add_annotations(qs, self.model, search_scores)
@@ -150,9 +146,9 @@ class BrowserView(BrowserAnnotationsView):
150
146
  qs = self.model.objects.none()
151
147
  return qs
152
148
 
153
- def _get_book_queryset(self, search_scores: dict):
149
+ def _get_book_queryset(self, search_scores: dict | None):
154
150
  """Create book queryset."""
155
- if self.model in (Comic, Folder):
151
+ if self.model in (Comic, Folder) and search_scores is not None:
156
152
  object_filter = self.get_query_filters(Comic, search_scores, False)
157
153
  qs = Comic.objects.filter(object_filter)
158
154
  qs = self._add_annotations(qs, Comic, search_scores)
@@ -357,7 +353,7 @@ class BrowserView(BrowserAnnotationsView):
357
353
  self.set_rel_prefix(self.model)
358
354
  self._set_group_instance() # Placed up here to invalidate earlier
359
355
  # Create the main query with the filters
360
- search_scores: dict = self.get_search_scores()
356
+ search_scores: dict | None = self.get_search_scores()
361
357
  group = self.kwargs.get("group")
362
358
 
363
359
  group_qs = self._get_group_queryset(search_scores)
@@ -380,9 +376,18 @@ class BrowserView(BrowserAnnotationsView):
380
376
  else:
381
377
  up_route = {}
382
378
 
383
- efv_flag = AdminFlag.objects.only("on").get(
384
- key=AdminFlag.FlagChoices.FOLDER_VIEW.value
379
+ admin_flag_objs = AdminFlag.objects.only("on").filter(
380
+ key__in=(
381
+ AdminFlag.FlagChoices.FOLDER_VIEW.value,
382
+ AdminFlag.FlagChoices.IMPORT_METADATA.value,
383
+ )
385
384
  )
385
+ admin_flags = {}
386
+ for flag in admin_flag_objs:
387
+ if flag.key == AdminFlag.FlagChoices.FOLDER_VIEW.value:
388
+ admin_flags["folder_view"] = flag.on
389
+ if flag.key == AdminFlag.FlagChoices.IMPORT_METADATA.value:
390
+ admin_flags["import_metadata"] = flag.on
386
391
 
387
392
  libraries_exist = Library.objects.exists()
388
393
 
@@ -408,7 +413,7 @@ class BrowserView(BrowserAnnotationsView):
408
413
  "issue_number_max": issue_number_max,
409
414
  "num_pages": num_pages,
410
415
  "total_count": total_count,
411
- "admin_flags": {"folder_view": efv_flag.on},
416
+ "admin_flags": admin_flags,
412
417
  "libraries_exist": libraries_exist,
413
418
  "covers_timestamp": covers_timestamp,
414
419
  }
@@ -91,7 +91,6 @@ class BrowserAnnotationsView(BrowserOrderByView):
91
91
 
92
92
  def _annotate_child_count(self, qs, model):
93
93
  """Annotate Child Count."""
94
- self.kwargs.get("group")
95
94
  if model == Comic:
96
95
  child_count_sum = self._ONE_INTEGERFIELD
97
96
  else:
@@ -124,6 +124,8 @@ class BrowserChoicesViewBase(BrowserBaseView):
124
124
  def get_object(self):
125
125
  """Get the comic subquery use for the choices."""
126
126
  search_scores = self.get_search_scores()
127
+ if search_scores is None:
128
+ return self.model.objects.none() # type: ignore
127
129
  object_filter = self.get_query_filters(self.model, search_scores, True)
128
130
  return self.model.objects.filter(object_filter) # type: ignore
129
131
 
@@ -12,7 +12,7 @@ LOG = get_logger(__name__)
12
12
  class SearchFilterMixin:
13
13
  """Search Filters Methods."""
14
14
 
15
- def get_search_scores(self) -> dict:
15
+ def get_search_scores(self) -> dict | None:
16
16
  """Perform the search and return the scores as a dict."""
17
17
  search_scores = {}
18
18
  text = self.params.get("q", "") # type: ignore
@@ -32,6 +32,8 @@ class SearchFilterMixin:
32
32
  LOG.warning("Search engine needs more memory, results truncated.")
33
33
  except Exception:
34
34
  LOG.exception("While Searching")
35
+ if not search_scores:
36
+ return None
35
37
  return search_scores
36
38
 
37
39
  def _get_search_query_filter(self, model, search_scores: dict):
@@ -227,6 +227,12 @@ class MetadataView(BrowserAnnotationsView):
227
227
 
228
228
  return obj
229
229
 
230
+ def _raise_not_found(self, exc=None):
231
+ """Raise an exception if the object is not found."""
232
+ pk = self.kwargs["pk"]
233
+ detail = f"Filtered metadata for {self.group}/{pk} not found"
234
+ raise NotFound(detail=detail) from exc
235
+
230
236
  def get_object(self):
231
237
  """Create a comic-like object from the current browser group."""
232
238
  # Comic model goes through the same code path as groups because
@@ -236,8 +242,10 @@ class MetadataView(BrowserAnnotationsView):
236
242
  if self.model is None:
237
243
  raise NotFound(detail=f"Cannot get metadata for {self.group=}")
238
244
 
239
- search_scores: dict = self.get_search_scores()
240
- object_filter = self.get_query_filters_without_group(self.model, search_scores)
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
241
249
  pk = self.kwargs["pk"]
242
250
  qs = self.model.objects.filter(object_filter, pk=pk)
243
251
 
@@ -252,12 +260,10 @@ class MetadataView(BrowserAnnotationsView):
252
260
  reason = "Empty obj"
253
261
  raise ValueError(reason) # noqa TRY301
254
262
  except (IndexError, ValueError) as exc:
255
- raise NotFound(
256
- detail=f"Filtered metadata for {self.group}/{pk} not found"
257
- ) from exc
263
+ self._raise_not_found(exc)
258
264
 
259
265
  m2m_intersections = self._query_m2m_intersections(simple_qs)
260
- return self._copy_annotations_into_comic_fields(obj, m2m_intersections)
266
+ return self._copy_annotations_into_comic_fields(obj, m2m_intersections) # type: ignore
261
267
 
262
268
  def _is_enabled_folder_view(self):
263
269
  if self._efv_flag is None:
@@ -1,5 +1,6 @@
1
1
  """Views for reading comic books."""
2
2
 
3
+ from comicbox.box import Comicbox
3
4
  from django.db.models import F, IntegerField, Value
4
5
  from django.urls import reverse
5
6
  from drf_spectacular.types import OpenApiTypes
@@ -7,6 +8,8 @@ from drf_spectacular.utils import OpenApiParameter, extend_schema
7
8
  from rest_framework.exceptions import NotFound
8
9
  from rest_framework.response import Response
9
10
 
11
+ from codex.librarian.importer.tasks import LazyImportComicsTask
12
+ from codex.librarian.mp_queue import LIBRARIAN_QUEUE
10
13
  from codex.logger.logging import get_logger
11
14
  from codex.models import AdminFlag, Bookmark, Comic
12
15
  from codex.serializers.reader import ReaderComicsSerializer
@@ -37,24 +40,32 @@ class ReaderView(BookmarkBaseView):
37
40
 
38
41
  def _get_comics_list(self):
39
42
  """Get the reader naviation group filter."""
40
- arc_group = self.params.get("arc_group")
43
+ select_related = ("series", "volume")
44
+ prefetch_related = ()
41
45
 
46
+ arc_group = self.params.get("arc_group")
42
47
  if arc_group == "a":
43
48
  # for story arcs
44
49
  rel = "story_arc_numbers__story_arc"
45
50
  fields = self._COMIC_FIELDS
46
51
  arc_name_rel = "story_arc_numbers__story_arc__name"
47
52
  arc_pk_rel = "story_arc_numbers__story_arc__pk"
53
+ prefetch_related = (*prefetch_related, "story_arc_numbers__story_arc")
48
54
  arc_index = F("story_arc_numbers__number")
49
55
  ordering = ("arc_index", "date", *Comic.ORDERING)
56
+ arc_pk_select_related = ()
57
+ arc_pk_only = ("pk",)
50
58
  elif arc_group == self.FOLDER_GROUP:
51
59
  # folder mode
52
60
  rel = "parent_folder"
53
61
  fields = (*self._COMIC_FIELDS, "parent_folder")
54
62
  arc_pk_rel = "parent_folder__pk"
55
63
  arc_name_rel = "parent_folder__name"
64
+ select_related = (*select_related, "parent_folder")
56
65
  arc_index = Value(None, IntegerField())
57
66
  ordering = ("path", "pk")
67
+ arc_pk_select_related = ("parent_folder",)
68
+ arc_pk_only = arc_pk_select_related
58
69
  else:
59
70
  # browser mode.
60
71
  rel = "series"
@@ -63,18 +74,29 @@ class ReaderView(BookmarkBaseView):
63
74
  arc_name_rel = "series__name"
64
75
  arc_index = Value(None, IntegerField())
65
76
  ordering = Comic.ORDERING
77
+ arc_pk_select_related = ("series",)
78
+ arc_pk_only = arc_pk_select_related
66
79
 
67
- group_acl_filter = self.get_group_acl_filter(Comic)
68
80
  arc_pk = self.params.get("arc_pk")
69
81
  if not arc_pk:
70
- rel += "__comic"
71
- arc_pk = self.kwargs.get("pk")
82
+ # Get the correct arc/folder/series if not submitted with a post.
83
+ pk = self.kwargs.get("pk")
84
+ arc_pk_qs = Comic.objects.filter(pk=pk)
85
+ arc_pk_qs = arc_pk_qs.select_related(*arc_pk_select_related)
86
+ arc_pk_qs = arc_pk_qs.prefetch_related(*prefetch_related)
87
+ arc_pk_comic = (
88
+ arc_pk_qs.annotate(arc_pk=F(arc_pk_rel)).only(*arc_pk_only).first()
89
+ )
90
+ arc_pk = arc_pk_comic.arc_pk # type: ignore
91
+
92
+ group_acl_filter = self.get_group_acl_filter(Comic)
72
93
  nav_filter = {rel: arc_pk}
73
94
 
74
95
  qs = (
75
96
  Comic.objects.filter(group_acl_filter)
76
97
  .filter(**nav_filter)
77
- .prefetch_related("story_arc_numbers__story_arc")
98
+ .select_related(*select_related)
99
+ .prefetch_related(*prefetch_related)
78
100
  .only(*fields)
79
101
  .annotate(
80
102
  series_name=F("series__name"),
@@ -198,6 +220,30 @@ class ReaderView(BookmarkBaseView):
198
220
  }
199
221
  raise NotFound(detail=detail)
200
222
 
223
+ @staticmethod
224
+ def _lazy_metadata(current, prev_book, next_book):
225
+ """Get reader metadata from comicbox if it's not in the db."""
226
+ import_pks = set()
227
+ if current and not (current.page_count and current.file_type):
228
+ with Comicbox(current.path) as cb:
229
+ current.file_type = cb.get_file_type()
230
+ current.page_count = cb.get_page_count()
231
+ import_pks.add(current.pk)
232
+
233
+ if prev_book and not prev_book.page_count:
234
+ with Comicbox(prev_book.path) as cb:
235
+ prev_book.page_count = cb.get_page_count()
236
+ import_pks.add(prev_book.pk)
237
+
238
+ if next_book and not next_book.page_count:
239
+ with Comicbox(next_book.path) as cb:
240
+ next_book.page_count = cb.get_page_count()
241
+ import_pks.add(next_book.pk)
242
+
243
+ if import_pks:
244
+ task = LazyImportComicsTask(frozenset(import_pks))
245
+ LIBRARIAN_QUEUE.put(task)
246
+
201
247
  def get_object(self):
202
248
  """Get the previous and next comics in a group or story arc."""
203
249
  # Books
@@ -209,6 +255,8 @@ class ReaderView(BookmarkBaseView):
209
255
 
210
256
  prev_book = books.get("prev")
211
257
  next_book = books.get("next")
258
+ self._lazy_metadata(current, prev_book, next_book)
259
+
212
260
  books = {
213
261
  "current": current,
214
262
  "prev_book": prev_book,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codex
3
- Version: 1.5.7rc1
3
+ Version: 1.5.9
4
4
  Summary: A comic archive web server.
5
5
  Home-page: https://github.com/ajslater/codex
6
6
  License: GPL-3.0-only