codex 1.7.3__py3-none-any.whl → 1.7.3a0__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 (750) hide show
  1. codex/asgi.py +1 -2
  2. codex/choices.py +12 -3
  3. codex/choices_to_json.py +8 -8
  4. codex/db.py +2 -2
  5. codex/exceptions.py +6 -5
  6. codex/librarian/bookmark/bookmarkd.py +4 -8
  7. codex/librarian/bookmark/update.py +2 -2
  8. codex/librarian/covers/create.py +8 -10
  9. codex/librarian/covers/path.py +5 -6
  10. codex/librarian/covers/purge.py +2 -2
  11. codex/librarian/importer/aggregate.py +2 -2
  12. codex/librarian/importer/cache.py +4 -1
  13. codex/librarian/importer/create_comics.py +2 -2
  14. codex/librarian/importer/create_covers.py +1 -1
  15. codex/librarian/importer/create_fks.py +3 -4
  16. codex/librarian/importer/deleted.py +3 -3
  17. codex/librarian/importer/extract.py +2 -2
  18. codex/librarian/importer/failed_imports.py +1 -1
  19. codex/librarian/importer/importer.py +1 -3
  20. codex/librarian/importer/importerd.py +3 -3
  21. codex/librarian/importer/link_comics.py +1 -2
  22. codex/librarian/importer/moved.py +7 -2
  23. codex/librarian/importer/query_fks.py +4 -1
  24. codex/librarian/importer/tasks.py +1 -1
  25. codex/librarian/janitor/integrity.py +20 -27
  26. codex/librarian/janitor/janitor.py +8 -1
  27. codex/librarian/janitor/latest_version.py +1 -1
  28. codex/librarian/janitor/log_compress.py +77 -0
  29. codex/librarian/janitor/status.py +1 -0
  30. codex/librarian/janitor/tasks.py +5 -0
  31. codex/librarian/janitor/update.py +2 -2
  32. codex/librarian/janitor/vacuum.py +1 -1
  33. codex/librarian/librariand.py +7 -3
  34. codex/librarian/notifier/notifierd.py +1 -2
  35. codex/librarian/search/optimize.py +1 -1
  36. codex/librarian/search/remove.py +1 -1
  37. codex/librarian/search/update.py +3 -3
  38. codex/librarian/telemeter/stats.py +6 -7
  39. codex/librarian/telemeter/telemeter.py +1 -0
  40. codex/librarian/watchdog/db_snapshot.py +3 -3
  41. codex/librarian/watchdog/dir_snapshot_diff.py +4 -3
  42. codex/librarian/watchdog/emitter.py +4 -4
  43. codex/librarian/watchdog/event_batcherd.py +1 -2
  44. codex/librarian/watchdog/events.py +2 -1
  45. codex/librarian/watchdog/observers.py +10 -15
  46. codex/logger/loggerd.py +17 -40
  47. codex/logger/logging.py +1 -1
  48. codex/memory.py +2 -3
  49. codex/migrations/0001_init.py +2 -1
  50. codex/migrations/0014_pdf_issue_suffix_remove_cover_image_sort_name.py +2 -1
  51. codex/migrations/0018_rename_userbookmark_bookmark.py +2 -1
  52. codex/migrations/0028_telemeter.py +5 -1
  53. codex/migrations/0031_adminflag_banner.py +1 -1
  54. codex/models/admin.py +1 -1
  55. codex/models/base.py +1 -3
  56. codex/models/bookmark.py +7 -4
  57. codex/models/comic.py +2 -2
  58. codex/models/functions.py +5 -12
  59. codex/models/groups.py +1 -1
  60. codex/models/library.py +1 -1
  61. codex/models/paths.py +4 -4
  62. codex/models/query.py +4 -8
  63. codex/models/util.py +1 -1
  64. codex/permissions.py +1 -1
  65. codex/run.py +1 -1
  66. codex/serializers/admin/libraries.py +3 -1
  67. codex/serializers/browser/choices.py +2 -2
  68. codex/serializers/browser/mixins.py +1 -5
  69. codex/serializers/browser/settings.py +2 -2
  70. codex/serializers/fields.py +7 -7
  71. codex/serializers/models/base.py +1 -1
  72. codex/serializers/models/comic.py +2 -2
  73. codex/serializers/models/groups.py +2 -0
  74. codex/serializers/opds/authentication.py +1 -2
  75. codex/serializers/opds/v2/feed.py +1 -2
  76. codex/serializers/opds/v2/links.py +12 -14
  77. codex/serializers/opds/v2/metadata.py +1 -2
  78. codex/serializers/opds/v2/progression.py +2 -4
  79. codex/serializers/opds/v2/publication.py +11 -14
  80. codex/serializers/opds/v2/unused.py +8 -15
  81. codex/serializers/route.py +2 -2
  82. codex/settings/settings.py +4 -4
  83. codex/signals/django_signals.py +1 -1
  84. codex/static_root/assets/{VCheckbox-Dv6fwaDb.56abbfb00c8a.js → VCheckbox-pHjSEgdV.176f3c1f4191.js} +1 -1
  85. codex/static_root/assets/VCheckbox-pHjSEgdV.176f3c1f4191.js.br +0 -0
  86. codex/static_root/assets/VCheckbox-pHjSEgdV.176f3c1f4191.js.gz +0 -0
  87. codex/static_root/assets/{VCheckbox-Dv6fwaDb.js → VCheckbox-pHjSEgdV.js} +1 -1
  88. codex/static_root/assets/VCheckbox-pHjSEgdV.js.br +0 -0
  89. codex/static_root/assets/VCheckbox-pHjSEgdV.js.gz +0 -0
  90. codex/static_root/assets/{VCheckboxBtn-CNMFahfF.4ee9778a562e.js → VCheckboxBtn-DBKqrZGq.467e75859b62.js} +1 -1
  91. codex/static_root/assets/VCheckboxBtn-DBKqrZGq.467e75859b62.js.br +0 -0
  92. codex/static_root/assets/VCheckboxBtn-DBKqrZGq.467e75859b62.js.gz +0 -0
  93. codex/static_root/assets/{VCheckboxBtn-CNMFahfF.js → VCheckboxBtn-DBKqrZGq.js} +1 -1
  94. codex/static_root/assets/VCheckboxBtn-DBKqrZGq.js.br +0 -0
  95. codex/static_root/assets/VCheckboxBtn-DBKqrZGq.js.gz +0 -0
  96. codex/static_root/assets/{VCombobox-DqBFki-9.2806f95c938d.js → VCombobox-Bg7uOTbF.2fc6073b789f.js} +1 -1
  97. codex/static_root/assets/VCombobox-Bg7uOTbF.2fc6073b789f.js.br +0 -0
  98. codex/static_root/assets/VCombobox-Bg7uOTbF.2fc6073b789f.js.gz +0 -0
  99. codex/static_root/assets/{VCombobox-DqBFki-9.js → VCombobox-Bg7uOTbF.js} +1 -1
  100. codex/static_root/assets/VCombobox-Bg7uOTbF.js.br +0 -0
  101. codex/static_root/assets/VCombobox-Bg7uOTbF.js.gz +0 -0
  102. codex/static_root/assets/{VDialog-CQXjBvDZ.1a576c5e472f.js → VDialog-IrbBYFLM.91a058d572c4.js} +1 -1
  103. codex/static_root/assets/VDialog-IrbBYFLM.91a058d572c4.js.br +0 -0
  104. codex/static_root/assets/VDialog-IrbBYFLM.91a058d572c4.js.gz +0 -0
  105. codex/static_root/assets/{VDialog-CQXjBvDZ.js → VDialog-IrbBYFLM.js} +1 -1
  106. codex/static_root/assets/VDialog-IrbBYFLM.js.br +0 -0
  107. codex/static_root/assets/VDialog-IrbBYFLM.js.gz +0 -0
  108. codex/static_root/assets/{VDivider-DUxQu-IZ.73d92ae2a07e.js → VDivider-CuRohbVQ.3c12b040aed7.js} +1 -1
  109. codex/static_root/assets/VDivider-CuRohbVQ.3c12b040aed7.js.br +0 -0
  110. codex/static_root/assets/VDivider-CuRohbVQ.3c12b040aed7.js.gz +0 -0
  111. codex/static_root/assets/{VDivider-DUxQu-IZ.js → VDivider-CuRohbVQ.js} +1 -1
  112. codex/static_root/assets/VDivider-CuRohbVQ.js.br +0 -0
  113. codex/static_root/assets/VDivider-CuRohbVQ.js.gz +0 -0
  114. codex/static_root/assets/{VExpansionPanels-BaYzHUJp.5346826103eb.js → VExpansionPanels-b0xWLH75.bff6ea8b4055.js} +1 -1
  115. codex/static_root/assets/VExpansionPanels-b0xWLH75.bff6ea8b4055.js.br +0 -0
  116. codex/static_root/assets/VExpansionPanels-b0xWLH75.bff6ea8b4055.js.gz +0 -0
  117. codex/static_root/assets/{VExpansionPanels-BaYzHUJp.js → VExpansionPanels-b0xWLH75.js} +1 -1
  118. codex/static_root/assets/VExpansionPanels-b0xWLH75.js.br +0 -0
  119. codex/static_root/assets/VExpansionPanels-b0xWLH75.js.gz +0 -0
  120. codex/static_root/assets/{VForm-hB4C5jVd.a2b90ddcd8ee.js → VForm-B4hkqnS8.afbd5cf0908a.js} +1 -1
  121. codex/static_root/assets/VForm-B4hkqnS8.afbd5cf0908a.js.br +0 -0
  122. codex/static_root/assets/VForm-B4hkqnS8.afbd5cf0908a.js.gz +0 -0
  123. codex/static_root/assets/{VForm-hB4C5jVd.js → VForm-B4hkqnS8.js} +1 -1
  124. codex/static_root/assets/VForm-B4hkqnS8.js.br +0 -0
  125. codex/static_root/assets/VForm-B4hkqnS8.js.gz +0 -0
  126. codex/static_root/assets/{VRadioGroup-DOjw38qB.cbf2922d05af.js → VRadioGroup-Cbayik6d.034f0f275265.js} +1 -1
  127. codex/static_root/assets/VRadioGroup-Cbayik6d.034f0f275265.js.br +0 -0
  128. codex/static_root/assets/VRadioGroup-Cbayik6d.034f0f275265.js.gz +0 -0
  129. codex/static_root/assets/{VRadioGroup-DOjw38qB.js → VRadioGroup-Cbayik6d.js} +1 -1
  130. codex/static_root/assets/VRadioGroup-Cbayik6d.js.br +0 -0
  131. codex/static_root/assets/VRadioGroup-Cbayik6d.js.gz +0 -0
  132. codex/static_root/assets/{VSelect-L4v_m3ag.db9fb8348617.js → VSelect-BsuB-2P1.abe187c8b53f.js} +1 -1
  133. codex/static_root/assets/VSelect-BsuB-2P1.abe187c8b53f.js.br +0 -0
  134. codex/static_root/assets/VSelect-BsuB-2P1.abe187c8b53f.js.gz +0 -0
  135. codex/static_root/assets/{VSelect-L4v_m3ag.js → VSelect-BsuB-2P1.js} +1 -1
  136. codex/static_root/assets/VSelect-BsuB-2P1.js.br +0 -0
  137. codex/static_root/assets/VSelect-BsuB-2P1.js.gz +0 -0
  138. codex/static_root/assets/{VSelectionControl-BqB1JeKa.2fb68a673402.js → VSelectionControl-L41n5bnX.f4674bb62425.js} +1 -1
  139. codex/static_root/assets/VSelectionControl-L41n5bnX.f4674bb62425.js.br +0 -0
  140. codex/static_root/assets/VSelectionControl-L41n5bnX.f4674bb62425.js.gz +0 -0
  141. codex/static_root/assets/{VSelectionControl-BqB1JeKa.js → VSelectionControl-L41n5bnX.js} +1 -1
  142. codex/static_root/assets/VSelectionControl-L41n5bnX.js.br +0 -0
  143. codex/static_root/assets/VSelectionControl-L41n5bnX.js.gz +0 -0
  144. codex/static_root/assets/{VTable-CtorAbOx.bbda450cbd73.js → VTable-CYv4gUUt.76e4658abeb3.js} +1 -1
  145. codex/static_root/assets/VTable-CYv4gUUt.76e4658abeb3.js.br +0 -0
  146. codex/static_root/assets/VTable-CYv4gUUt.76e4658abeb3.js.gz +0 -0
  147. codex/static_root/assets/{VTable-CtorAbOx.js → VTable-CYv4gUUt.js} +1 -1
  148. codex/static_root/assets/VTable-CYv4gUUt.js.br +0 -0
  149. codex/static_root/assets/VTable-CYv4gUUt.js.gz +0 -0
  150. codex/static_root/assets/{VWindowItem-Bl-fa3ss.334e6b813775.js → VWindowItem-f8UkxXa_.1d3e9e78fc9b.js} +1 -1
  151. codex/static_root/assets/VWindowItem-f8UkxXa_.1d3e9e78fc9b.js.br +0 -0
  152. codex/static_root/assets/VWindowItem-f8UkxXa_.1d3e9e78fc9b.js.gz +0 -0
  153. codex/static_root/assets/{VWindowItem-Bl-fa3ss.js → VWindowItem-f8UkxXa_.js} +1 -1
  154. codex/static_root/assets/VWindowItem-f8UkxXa_.js.br +0 -0
  155. codex/static_root/assets/VWindowItem-f8UkxXa_.js.gz +0 -0
  156. codex/static_root/assets/{admin-BAVKNREt.23c0966bd683.js → admin-BmuWJcAB.b0b253aefd88.js} +1 -1
  157. codex/static_root/assets/admin-BmuWJcAB.b0b253aefd88.js.br +0 -0
  158. codex/static_root/assets/admin-BmuWJcAB.b0b253aefd88.js.gz +0 -0
  159. codex/static_root/assets/{admin-BAVKNREt.js → admin-BmuWJcAB.js} +1 -1
  160. codex/static_root/assets/admin-BmuWJcAB.js.br +0 -0
  161. codex/static_root/assets/admin-BmuWJcAB.js.gz +0 -0
  162. codex/static_root/assets/{admin-CHuFhx_t.a54700f97fc8.js → admin-Izb24SXM.504ea9d9515c.js} +1 -1
  163. codex/static_root/assets/admin-Izb24SXM.504ea9d9515c.js.br +0 -0
  164. codex/static_root/assets/admin-Izb24SXM.504ea9d9515c.js.gz +0 -0
  165. codex/static_root/assets/{admin-CHuFhx_t.js → admin-Izb24SXM.js} +1 -1
  166. codex/static_root/assets/admin-Izb24SXM.js.br +0 -0
  167. codex/static_root/assets/admin-Izb24SXM.js.gz +0 -0
  168. codex/static_root/assets/admin-dm3bSP7O.ae1234cc0beb.css +1 -0
  169. codex/static_root/assets/admin-dm3bSP7O.ae1234cc0beb.css.br +0 -0
  170. codex/static_root/assets/admin-dm3bSP7O.ae1234cc0beb.css.gz +0 -0
  171. codex/static_root/assets/admin-dm3bSP7O.css +1 -0
  172. codex/static_root/assets/admin-dm3bSP7O.css.br +0 -0
  173. codex/static_root/assets/admin-dm3bSP7O.css.gz +0 -0
  174. codex/static_root/assets/admin-menu-C712OV-9.ecd1f2af4cf4.js +1 -0
  175. codex/static_root/assets/admin-menu-C712OV-9.ecd1f2af4cf4.js.br +0 -0
  176. codex/static_root/assets/admin-menu-C712OV-9.ecd1f2af4cf4.js.gz +0 -0
  177. codex/static_root/assets/admin-menu-C712OV-9.js +1 -0
  178. codex/static_root/assets/admin-menu-C712OV-9.js.br +0 -0
  179. codex/static_root/assets/admin-menu-C712OV-9.js.gz +0 -0
  180. codex/static_root/assets/{admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js → admin-settings-button-progress-Clv9yQ7G.2536580dece1.js} +1 -1
  181. codex/static_root/assets/admin-settings-button-progress-Clv9yQ7G.2536580dece1.js.br +0 -0
  182. codex/static_root/assets/admin-settings-button-progress-Clv9yQ7G.2536580dece1.js.gz +0 -0
  183. codex/static_root/assets/{admin-settings-button-progress-w_CqTSMl.js → admin-settings-button-progress-Clv9yQ7G.js} +1 -1
  184. codex/static_root/assets/admin-settings-button-progress-Clv9yQ7G.js.br +0 -0
  185. codex/static_root/assets/admin-settings-button-progress-Clv9yQ7G.js.gz +0 -0
  186. codex/static_root/assets/{browser-DNzQvgkY.aea8b7d7ca40.css → browser-CReWGhn_.521193ab0710.css} +1 -1
  187. codex/static_root/assets/browser-CReWGhn_.521193ab0710.css.br +0 -0
  188. codex/static_root/assets/browser-CReWGhn_.521193ab0710.css.gz +0 -0
  189. codex/static_root/assets/{browser-DNzQvgkY.css → browser-CReWGhn_.css} +1 -1
  190. codex/static_root/assets/browser-CReWGhn_.css.br +0 -0
  191. codex/static_root/assets/browser-CReWGhn_.css.gz +0 -0
  192. codex/static_root/assets/browser-DiAN9Ipo.a5b62a3cbe1d.js +1 -0
  193. codex/static_root/assets/browser-DiAN9Ipo.a5b62a3cbe1d.js.br +0 -0
  194. codex/static_root/assets/browser-DiAN9Ipo.a5b62a3cbe1d.js.gz +0 -0
  195. codex/static_root/assets/browser-DiAN9Ipo.js +1 -0
  196. codex/static_root/assets/browser-DiAN9Ipo.js.br +0 -0
  197. codex/static_root/assets/browser-DiAN9Ipo.js.gz +0 -0
  198. codex/static_root/assets/{change-password-dialog-Cy1tU-tj.416ef5bdfd46.js → change-password-dialog-BZPmAOML.73fdc23e13a4.js} +1 -1
  199. codex/static_root/assets/change-password-dialog-BZPmAOML.73fdc23e13a4.js.br +0 -0
  200. codex/static_root/assets/change-password-dialog-BZPmAOML.73fdc23e13a4.js.gz +0 -0
  201. codex/static_root/assets/{change-password-dialog-Cy1tU-tj.js → change-password-dialog-BZPmAOML.js} +1 -1
  202. codex/static_root/assets/change-password-dialog-BZPmAOML.js.br +0 -0
  203. codex/static_root/assets/change-password-dialog-BZPmAOML.js.gz +0 -0
  204. codex/static_root/assets/{confirm-dialog-B_Y3KKiL.1070d18f6b2d.js → confirm-dialog-CBLQOik_.f53acd0c622a.js} +1 -1
  205. codex/static_root/assets/confirm-dialog-CBLQOik_.f53acd0c622a.js.br +0 -0
  206. codex/static_root/assets/confirm-dialog-CBLQOik_.f53acd0c622a.js.gz +0 -0
  207. codex/static_root/assets/{confirm-dialog-B_Y3KKiL.js → confirm-dialog-CBLQOik_.js} +1 -1
  208. codex/static_root/assets/confirm-dialog-CBLQOik_.js.br +0 -0
  209. codex/static_root/assets/confirm-dialog-CBLQOik_.js.gz +0 -0
  210. codex/static_root/assets/{datetime-column-DVC0YqHC.03bb52c198e9.js → datetime-column-CU19rCbi.9edc0d2da736.js} +1 -1
  211. codex/static_root/assets/datetime-column-CU19rCbi.9edc0d2da736.js.br +1 -0
  212. codex/static_root/assets/datetime-column-CU19rCbi.9edc0d2da736.js.gz +0 -0
  213. codex/static_root/assets/{datetime-column-DVC0YqHC.js → datetime-column-CU19rCbi.js} +1 -1
  214. codex/static_root/assets/datetime-column-CU19rCbi.js.br +1 -0
  215. codex/static_root/assets/datetime-column-CU19rCbi.js.gz +0 -0
  216. codex/static_root/assets/{filter-xcEcgcIx.be1bb4725c89.js → filter-CZ7kkBLq.171b4fcba146.js} +1 -1
  217. codex/static_root/assets/filter-CZ7kkBLq.171b4fcba146.js.br +0 -0
  218. codex/static_root/assets/filter-CZ7kkBLq.171b4fcba146.js.gz +0 -0
  219. codex/static_root/assets/{filter-xcEcgcIx.js → filter-CZ7kkBLq.js} +1 -1
  220. codex/static_root/assets/filter-CZ7kkBLq.js.br +0 -0
  221. codex/static_root/assets/filter-CZ7kkBLq.js.gz +0 -0
  222. codex/static_root/assets/flag-tab-DHGfv0Q3.2b7ef394b850.css +1 -0
  223. codex/static_root/assets/flag-tab-DHGfv0Q3.2b7ef394b850.css.br +0 -0
  224. codex/static_root/assets/flag-tab-DHGfv0Q3.2b7ef394b850.css.gz +0 -0
  225. codex/static_root/assets/flag-tab-DHGfv0Q3.css +1 -0
  226. codex/static_root/assets/flag-tab-DHGfv0Q3.css.br +0 -0
  227. codex/static_root/assets/flag-tab-DHGfv0Q3.css.gz +0 -0
  228. codex/static_root/assets/flag-tab-kcBN36xe.631c48ab75fd.js +1 -0
  229. codex/static_root/assets/flag-tab-kcBN36xe.631c48ab75fd.js.br +0 -0
  230. codex/static_root/assets/flag-tab-kcBN36xe.631c48ab75fd.js.gz +0 -0
  231. codex/static_root/assets/flag-tab-kcBN36xe.js +1 -0
  232. codex/static_root/assets/flag-tab-kcBN36xe.js.br +0 -0
  233. codex/static_root/assets/flag-tab-kcBN36xe.js.gz +0 -0
  234. codex/static_root/assets/{forwardRefs-D1ZDjzWx.96fccf773093.js → forwardRefs-DNAemYUk.06a315272ed9.js} +1 -1
  235. codex/static_root/assets/forwardRefs-DNAemYUk.06a315272ed9.js.br +0 -0
  236. codex/static_root/assets/forwardRefs-DNAemYUk.06a315272ed9.js.gz +0 -0
  237. codex/static_root/assets/{forwardRefs-D1ZDjzWx.js → forwardRefs-DNAemYUk.js} +1 -1
  238. codex/static_root/assets/forwardRefs-DNAemYUk.js.br +0 -0
  239. codex/static_root/assets/forwardRefs-DNAemYUk.js.gz +0 -0
  240. codex/static_root/assets/{group-tab-DkAIGL8z.527cad03c21d.js → group-tab-D9gwAdJc.60fb0ffa734c.js} +1 -1
  241. codex/static_root/assets/group-tab-D9gwAdJc.60fb0ffa734c.js.br +0 -0
  242. codex/static_root/assets/group-tab-D9gwAdJc.60fb0ffa734c.js.gz +0 -0
  243. codex/static_root/assets/{group-tab-DkAIGL8z.js → group-tab-D9gwAdJc.js} +1 -1
  244. codex/static_root/assets/group-tab-D9gwAdJc.js.br +0 -0
  245. codex/static_root/assets/group-tab-D9gwAdJc.js.gz +0 -0
  246. codex/static_root/assets/{http-error-CjSb8orc.ad6fc5733ed8.js → http-error-DmFqD2Xz.593d626b5f1b.js} +1 -1
  247. codex/static_root/assets/http-error-DmFqD2Xz.593d626b5f1b.js.br +0 -0
  248. codex/static_root/assets/http-error-DmFqD2Xz.593d626b5f1b.js.gz +0 -0
  249. codex/static_root/assets/{http-error-CjSb8orc.js → http-error-DmFqD2Xz.js} +1 -1
  250. codex/static_root/assets/http-error-DmFqD2Xz.js.br +0 -0
  251. codex/static_root/assets/http-error-DmFqD2Xz.js.gz +0 -0
  252. codex/static_root/assets/{index-CoFXW6I0.27f397e1425e.js → index-hvGLIBbY.30ce8cca0c6d.js} +1 -1
  253. codex/static_root/assets/index-hvGLIBbY.30ce8cca0c6d.js.br +0 -0
  254. codex/static_root/assets/index-hvGLIBbY.30ce8cca0c6d.js.gz +0 -0
  255. codex/static_root/assets/{index-CoFXW6I0.js → index-hvGLIBbY.js} +1 -1
  256. codex/static_root/assets/index-hvGLIBbY.js.br +0 -0
  257. codex/static_root/assets/index-hvGLIBbY.js.gz +0 -0
  258. codex/static_root/assets/{library-tab-hkMMBz1x.02270491d822.js → library-tab-CF-RAEgP.a0ad816fb994.js} +1 -1
  259. codex/static_root/assets/library-tab-CF-RAEgP.a0ad816fb994.js.br +0 -0
  260. codex/static_root/assets/library-tab-CF-RAEgP.a0ad816fb994.js.gz +0 -0
  261. codex/static_root/assets/{library-tab-hkMMBz1x.js → library-tab-CF-RAEgP.js} +1 -1
  262. codex/static_root/assets/library-tab-CF-RAEgP.js.br +0 -0
  263. codex/static_root/assets/library-tab-CF-RAEgP.js.gz +0 -0
  264. codex/static_root/assets/{main-DCaPxp2h.076707ddd123.js → main-Dv8e0bMI.bd74f1ba1627.js} +10 -10
  265. codex/static_root/assets/main-Dv8e0bMI.bd74f1ba1627.js.br +0 -0
  266. codex/static_root/assets/main-Dv8e0bMI.bd74f1ba1627.js.gz +0 -0
  267. codex/static_root/assets/{main-DCaPxp2h.js → main-Dv8e0bMI.js} +10 -10
  268. codex/static_root/assets/main-Dv8e0bMI.js.br +0 -0
  269. codex/static_root/assets/main-Dv8e0bMI.js.gz +0 -0
  270. codex/static_root/assets/pager-full-pdf-BXd9Y5oQ.04a4f5c451b4.js +1 -0
  271. codex/static_root/assets/pager-full-pdf-BXd9Y5oQ.04a4f5c451b4.js.br +0 -0
  272. codex/static_root/assets/pager-full-pdf-BXd9Y5oQ.04a4f5c451b4.js.gz +0 -0
  273. codex/static_root/assets/pager-full-pdf-BXd9Y5oQ.js +1 -0
  274. codex/static_root/assets/pager-full-pdf-BXd9Y5oQ.js.br +0 -0
  275. codex/static_root/assets/pager-full-pdf-BXd9Y5oQ.js.gz +0 -0
  276. codex/static_root/assets/{pagination-toolbar-DoqxSygU.f985bc705fe5.js → pagination-toolbar-D_whea1o.9bbd927058f1.js} +1 -1
  277. codex/static_root/assets/pagination-toolbar-D_whea1o.9bbd927058f1.js.br +0 -0
  278. codex/static_root/assets/pagination-toolbar-D_whea1o.9bbd927058f1.js.gz +0 -0
  279. codex/static_root/assets/{pagination-toolbar-DoqxSygU.js → pagination-toolbar-D_whea1o.js} +1 -1
  280. codex/static_root/assets/pagination-toolbar-D_whea1o.js.br +0 -0
  281. codex/static_root/assets/pagination-toolbar-D_whea1o.js.gz +0 -0
  282. codex/static_root/assets/{pdf-doc-BwxvAx1z.96cbc39c321d.js → pdf-doc-dnr5fHbU.fa1d7ed9255b.js} +1 -1
  283. codex/static_root/assets/pdf-doc-dnr5fHbU.fa1d7ed9255b.js.br +0 -0
  284. codex/static_root/assets/pdf-doc-dnr5fHbU.fa1d7ed9255b.js.gz +0 -0
  285. codex/static_root/assets/{pdf-doc-BwxvAx1z.js → pdf-doc-dnr5fHbU.js} +1 -1
  286. codex/static_root/assets/pdf-doc-dnr5fHbU.js.br +0 -0
  287. codex/static_root/assets/pdf-doc-dnr5fHbU.js.gz +0 -0
  288. codex/static_root/assets/{reader-hHIonVbA.4c12219242a9.js → reader-Cn-ra_Dv.f38c0b419dec.js} +2 -2
  289. codex/static_root/assets/reader-Cn-ra_Dv.f38c0b419dec.js.br +0 -0
  290. codex/static_root/assets/reader-Cn-ra_Dv.f38c0b419dec.js.gz +0 -0
  291. codex/static_root/assets/{reader-hHIonVbA.js → reader-Cn-ra_Dv.js} +2 -2
  292. codex/static_root/assets/reader-Cn-ra_Dv.js.br +0 -0
  293. codex/static_root/assets/reader-Cn-ra_Dv.js.gz +0 -0
  294. codex/static_root/assets/{relation-chips-D7-5kPem.4443b085aca2.js → relation-chips-fOPxWAMU.78e5fe70c014.js} +1 -1
  295. codex/static_root/assets/relation-chips-fOPxWAMU.78e5fe70c014.js.br +0 -0
  296. codex/static_root/assets/relation-chips-fOPxWAMU.78e5fe70c014.js.gz +0 -0
  297. codex/static_root/assets/{relation-chips-D7-5kPem.js → relation-chips-fOPxWAMU.js} +1 -1
  298. codex/static_root/assets/relation-chips-fOPxWAMU.js.br +0 -0
  299. codex/static_root/assets/relation-chips-fOPxWAMU.js.gz +0 -0
  300. codex/static_root/assets/{settings-drawer-CdFmOhnd.f7dcd12b3ebc.js → settings-drawer-1UEq8JY1.d95cee9aefb5.js} +2 -2
  301. codex/static_root/assets/settings-drawer-1UEq8JY1.d95cee9aefb5.js.br +0 -0
  302. codex/static_root/assets/settings-drawer-1UEq8JY1.d95cee9aefb5.js.gz +0 -0
  303. codex/static_root/assets/{settings-drawer-CdFmOhnd.js → settings-drawer-1UEq8JY1.js} +2 -2
  304. codex/static_root/assets/settings-drawer-1UEq8JY1.js.br +0 -0
  305. codex/static_root/assets/settings-drawer-1UEq8JY1.js.gz +0 -0
  306. codex/static_root/assets/{stats-tab-BzaipD0m.b6bf627ea860.js → stats-tab-0ptRCeKw.5514d3508e37.js} +1 -1
  307. codex/static_root/assets/stats-tab-0ptRCeKw.5514d3508e37.js.br +0 -0
  308. codex/static_root/assets/stats-tab-0ptRCeKw.5514d3508e37.js.gz +0 -0
  309. codex/static_root/assets/{stats-tab-BzaipD0m.js → stats-tab-0ptRCeKw.js} +1 -1
  310. codex/static_root/assets/stats-tab-0ptRCeKw.js.br +0 -0
  311. codex/static_root/assets/stats-tab-0ptRCeKw.js.gz +0 -0
  312. codex/static_root/assets/{task-tab-DCnS1sM9.44d8435b4989.js → task-tab-CG9_bi6Z.ad9f647f8e5f.js} +1 -1
  313. codex/static_root/assets/task-tab-CG9_bi6Z.ad9f647f8e5f.js.br +0 -0
  314. codex/static_root/assets/task-tab-CG9_bi6Z.ad9f647f8e5f.js.gz +0 -0
  315. codex/static_root/assets/{task-tab-DCnS1sM9.js → task-tab-CG9_bi6Z.js} +1 -1
  316. codex/static_root/assets/task-tab-CG9_bi6Z.js.br +0 -0
  317. codex/static_root/assets/task-tab-CG9_bi6Z.js.gz +0 -0
  318. codex/static_root/assets/{unauthorized-DJSr03Dw.7555cbcf1064.js → unauthorized-vG1Lh0m_.0c4bae81ee09.js} +1 -1
  319. codex/static_root/assets/unauthorized-vG1Lh0m_.0c4bae81ee09.js.br +0 -0
  320. codex/static_root/assets/unauthorized-vG1Lh0m_.0c4bae81ee09.js.gz +0 -0
  321. codex/static_root/assets/{unauthorized-DJSr03Dw.js → unauthorized-vG1Lh0m_.js} +1 -1
  322. codex/static_root/assets/unauthorized-vG1Lh0m_.js.br +0 -0
  323. codex/static_root/assets/unauthorized-vG1Lh0m_.js.gz +0 -0
  324. codex/static_root/assets/{user-tab-DAK_Deoh.1832877d449a.js → user-tab-BOxWlpY7.1a94280a799b.js} +1 -1
  325. codex/static_root/assets/user-tab-BOxWlpY7.1a94280a799b.js.br +0 -0
  326. codex/static_root/assets/user-tab-BOxWlpY7.1a94280a799b.js.gz +0 -0
  327. codex/static_root/assets/{user-tab-DAK_Deoh.js → user-tab-BOxWlpY7.js} +1 -1
  328. codex/static_root/assets/user-tab-BOxWlpY7.js.br +0 -0
  329. codex/static_root/assets/user-tab-BOxWlpY7.js.gz +0 -0
  330. codex/static_root/manifest.9b3479a6a4a6.json +735 -0
  331. codex/static_root/manifest.9b3479a6a4a6.json.br +0 -0
  332. codex/static_root/manifest.9b3479a6a4a6.json.gz +0 -0
  333. codex/static_root/manifest.json +305 -305
  334. codex/static_root/manifest.json.br +0 -0
  335. codex/static_root/manifest.json.gz +0 -0
  336. codex/static_root/staticfiles.json +1 -1
  337. codex/status_controller.py +12 -9
  338. codex/threads.py +5 -0
  339. codex/urls/api/admin.py +3 -3
  340. codex/urls/root.py +3 -4
  341. codex/views/admin/api_key.py +4 -1
  342. codex/views/admin/library.py +4 -4
  343. codex/views/admin/stats.py +10 -10
  344. codex/views/admin/tasks.py +11 -9
  345. codex/views/auth.py +8 -3
  346. codex/views/bookmark.py +3 -3
  347. codex/views/browser/annotate/card.py +2 -2
  348. codex/views/browser/annotate/order.py +7 -6
  349. codex/views/browser/bookmark.py +1 -1
  350. codex/views/browser/breadcrumbs.py +5 -6
  351. codex/views/browser/browser.py +2 -2
  352. codex/views/browser/choices.py +5 -6
  353. codex/views/browser/cover.py +3 -6
  354. codex/views/browser/download.py +1 -2
  355. codex/views/browser/filters/bookmark.py +1 -1
  356. codex/views/browser/filters/field.py +1 -1
  357. codex/views/browser/filters/filter.py +8 -6
  358. codex/views/browser/filters/group.py +4 -5
  359. codex/views/browser/filters/search/field/expression.py +2 -1
  360. codex/views/browser/filters/search/field/optimize.py +1 -1
  361. codex/views/browser/filters/search/field/parse.py +2 -2
  362. codex/views/browser/filters/search/parse.py +19 -4
  363. codex/views/browser/group_mtime.py +1 -1
  364. codex/views/browser/metadata/copy_intersections.py +1 -1
  365. codex/views/browser/metadata/metadata.py +1 -1
  366. codex/views/browser/mtime.py +1 -1
  367. codex/views/browser/order_by.py +5 -3
  368. codex/views/browser/params.py +1 -1
  369. codex/views/browser/settings.py +1 -1
  370. codex/views/browser/validate.py +5 -8
  371. codex/views/const.py +3 -0
  372. codex/views/frontend.py +1 -1
  373. codex/views/mixins.py +2 -3
  374. codex/views/opds/authentication_v1.py +1 -1
  375. codex/views/opds/const.py +4 -4
  376. codex/views/opds/util.py +3 -3
  377. codex/views/opds/v1/entry/entry.py +2 -4
  378. codex/views/opds/v1/entry/links.py +5 -4
  379. codex/views/opds/v1/facets.py +4 -8
  380. codex/views/opds/v1/feed.py +5 -5
  381. codex/views/opds/v1/links.py +6 -11
  382. codex/views/opds/v2/const.py +2 -5
  383. codex/views/opds/v2/feed.py +3 -3
  384. codex/views/opds/v2/progression.py +9 -8
  385. codex/views/opds/v2/publications.py +20 -10
  386. codex/views/public.py +1 -1
  387. codex/views/reader/books.py +2 -3
  388. codex/views/reader/page.py +3 -3
  389. codex/views/reader/params.py +2 -2
  390. codex/views/reader/reader.py +6 -6
  391. codex/views/reader/settings.py +1 -1
  392. codex/views/session.py +2 -8
  393. codex/views/settings.py +2 -2
  394. codex/views/timezone.py +2 -2
  395. codex/views/util.py +9 -10
  396. codex/views/version.py +1 -1
  397. {codex-1.7.3.dist-info → codex-1.7.3a0.dist-info}/METADATA +2 -2
  398. {codex-1.7.3.dist-info → codex-1.7.3a0.dist-info}/RECORD +571 -570
  399. {codex-1.7.3.dist-info → codex-1.7.3a0.dist-info}/WHEEL +1 -1
  400. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js.br +0 -0
  401. codex/static_root/assets/VCheckbox-Dv6fwaDb.56abbfb00c8a.js.gz +0 -0
  402. codex/static_root/assets/VCheckbox-Dv6fwaDb.js.br +0 -0
  403. codex/static_root/assets/VCheckbox-Dv6fwaDb.js.gz +0 -0
  404. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js.br +0 -0
  405. codex/static_root/assets/VCheckboxBtn-CNMFahfF.4ee9778a562e.js.gz +0 -0
  406. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js.br +0 -0
  407. codex/static_root/assets/VCheckboxBtn-CNMFahfF.js.gz +0 -0
  408. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js.br +0 -0
  409. codex/static_root/assets/VCombobox-DqBFki-9.2806f95c938d.js.gz +0 -0
  410. codex/static_root/assets/VCombobox-DqBFki-9.js.br +0 -0
  411. codex/static_root/assets/VCombobox-DqBFki-9.js.gz +0 -0
  412. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js.br +0 -0
  413. codex/static_root/assets/VDialog-CQXjBvDZ.1a576c5e472f.js.gz +0 -0
  414. codex/static_root/assets/VDialog-CQXjBvDZ.js.br +0 -0
  415. codex/static_root/assets/VDialog-CQXjBvDZ.js.gz +0 -0
  416. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js.br +0 -0
  417. codex/static_root/assets/VDivider-DUxQu-IZ.73d92ae2a07e.js.gz +0 -0
  418. codex/static_root/assets/VDivider-DUxQu-IZ.js.br +0 -0
  419. codex/static_root/assets/VDivider-DUxQu-IZ.js.gz +0 -0
  420. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js.br +0 -0
  421. codex/static_root/assets/VExpansionPanels-BaYzHUJp.5346826103eb.js.gz +0 -0
  422. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js.br +0 -0
  423. codex/static_root/assets/VExpansionPanels-BaYzHUJp.js.gz +0 -0
  424. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js.br +0 -0
  425. codex/static_root/assets/VForm-hB4C5jVd.a2b90ddcd8ee.js.gz +0 -0
  426. codex/static_root/assets/VForm-hB4C5jVd.js.br +0 -0
  427. codex/static_root/assets/VForm-hB4C5jVd.js.gz +0 -0
  428. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js.br +0 -0
  429. codex/static_root/assets/VRadioGroup-DOjw38qB.cbf2922d05af.js.gz +0 -0
  430. codex/static_root/assets/VRadioGroup-DOjw38qB.js.br +0 -0
  431. codex/static_root/assets/VRadioGroup-DOjw38qB.js.gz +0 -0
  432. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js.br +0 -0
  433. codex/static_root/assets/VSelect-L4v_m3ag.db9fb8348617.js.gz +0 -0
  434. codex/static_root/assets/VSelect-L4v_m3ag.js.br +0 -0
  435. codex/static_root/assets/VSelect-L4v_m3ag.js.gz +0 -0
  436. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js.br +0 -0
  437. codex/static_root/assets/VSelectionControl-BqB1JeKa.2fb68a673402.js.gz +0 -0
  438. codex/static_root/assets/VSelectionControl-BqB1JeKa.js.br +0 -0
  439. codex/static_root/assets/VSelectionControl-BqB1JeKa.js.gz +0 -0
  440. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js.br +0 -0
  441. codex/static_root/assets/VTable-CtorAbOx.bbda450cbd73.js.gz +0 -0
  442. codex/static_root/assets/VTable-CtorAbOx.js.br +0 -0
  443. codex/static_root/assets/VTable-CtorAbOx.js.gz +0 -0
  444. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js.br +0 -0
  445. codex/static_root/assets/VWindowItem-Bl-fa3ss.334e6b813775.js.gz +0 -0
  446. codex/static_root/assets/VWindowItem-Bl-fa3ss.js.br +0 -0
  447. codex/static_root/assets/VWindowItem-Bl-fa3ss.js.gz +0 -0
  448. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js.br +0 -0
  449. codex/static_root/assets/admin-BAVKNREt.23c0966bd683.js.gz +0 -0
  450. codex/static_root/assets/admin-BAVKNREt.js.br +0 -0
  451. codex/static_root/assets/admin-BAVKNREt.js.gz +0 -0
  452. codex/static_root/assets/admin-C3iCIUnm.06cb213f624d.css +0 -1
  453. codex/static_root/assets/admin-C3iCIUnm.06cb213f624d.css.br +0 -0
  454. codex/static_root/assets/admin-C3iCIUnm.06cb213f624d.css.gz +0 -0
  455. codex/static_root/assets/admin-C3iCIUnm.css +0 -1
  456. codex/static_root/assets/admin-C3iCIUnm.css.br +0 -0
  457. codex/static_root/assets/admin-C3iCIUnm.css.gz +0 -0
  458. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js.br +0 -0
  459. codex/static_root/assets/admin-CHuFhx_t.a54700f97fc8.js.gz +0 -0
  460. codex/static_root/assets/admin-CHuFhx_t.js.br +0 -0
  461. codex/static_root/assets/admin-CHuFhx_t.js.gz +0 -0
  462. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js +0 -1
  463. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js.br +0 -0
  464. codex/static_root/assets/admin-menu-T8WJ_x0C.4f011540bb4c.js.gz +0 -0
  465. codex/static_root/assets/admin-menu-T8WJ_x0C.js +0 -1
  466. codex/static_root/assets/admin-menu-T8WJ_x0C.js.br +0 -0
  467. codex/static_root/assets/admin-menu-T8WJ_x0C.js.gz +0 -0
  468. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js.br +0 -0
  469. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.7b36216f68b5.js.gz +0 -0
  470. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js.br +0 -0
  471. codex/static_root/assets/admin-settings-button-progress-w_CqTSMl.js.gz +0 -0
  472. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css.br +0 -0
  473. codex/static_root/assets/browser-DNzQvgkY.aea8b7d7ca40.css.gz +0 -0
  474. codex/static_root/assets/browser-DNzQvgkY.css.br +0 -0
  475. codex/static_root/assets/browser-DNzQvgkY.css.gz +0 -0
  476. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js +0 -1
  477. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js.br +0 -0
  478. codex/static_root/assets/browser-DdLCtUlr.380b79bea4a7.js.gz +0 -0
  479. codex/static_root/assets/browser-DdLCtUlr.js +0 -1
  480. codex/static_root/assets/browser-DdLCtUlr.js.br +0 -0
  481. codex/static_root/assets/browser-DdLCtUlr.js.gz +0 -0
  482. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js.br +0 -0
  483. codex/static_root/assets/change-password-dialog-Cy1tU-tj.416ef5bdfd46.js.gz +0 -0
  484. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js.br +0 -0
  485. codex/static_root/assets/change-password-dialog-Cy1tU-tj.js.gz +0 -0
  486. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js.br +0 -0
  487. codex/static_root/assets/confirm-dialog-B_Y3KKiL.1070d18f6b2d.js.gz +0 -0
  488. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js.br +0 -0
  489. codex/static_root/assets/confirm-dialog-B_Y3KKiL.js.gz +0 -0
  490. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js.br +0 -0
  491. codex/static_root/assets/datetime-column-DVC0YqHC.03bb52c198e9.js.gz +0 -0
  492. codex/static_root/assets/datetime-column-DVC0YqHC.js.br +0 -0
  493. codex/static_root/assets/datetime-column-DVC0YqHC.js.gz +0 -0
  494. codex/static_root/assets/filter-xcEcgcIx.be1bb4725c89.js.br +0 -0
  495. codex/static_root/assets/filter-xcEcgcIx.be1bb4725c89.js.gz +0 -0
  496. codex/static_root/assets/filter-xcEcgcIx.js.br +0 -0
  497. codex/static_root/assets/filter-xcEcgcIx.js.gz +0 -0
  498. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js +0 -1
  499. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js.br +0 -0
  500. codex/static_root/assets/flag-tab-BOyQb0kr.842fca93f19c.js.gz +0 -0
  501. codex/static_root/assets/flag-tab-BOyQb0kr.js +0 -1
  502. codex/static_root/assets/flag-tab-BOyQb0kr.js.br +0 -0
  503. codex/static_root/assets/flag-tab-BOyQb0kr.js.gz +0 -0
  504. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css +0 -1
  505. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css.br +0 -0
  506. codex/static_root/assets/flag-tab-D2MYXCHk.0f57e109c01b.css.gz +0 -0
  507. codex/static_root/assets/flag-tab-D2MYXCHk.css +0 -1
  508. codex/static_root/assets/flag-tab-D2MYXCHk.css.br +0 -0
  509. codex/static_root/assets/flag-tab-D2MYXCHk.css.gz +0 -0
  510. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js.br +0 -0
  511. codex/static_root/assets/forwardRefs-D1ZDjzWx.96fccf773093.js.gz +0 -0
  512. codex/static_root/assets/forwardRefs-D1ZDjzWx.js.br +0 -0
  513. codex/static_root/assets/forwardRefs-D1ZDjzWx.js.gz +0 -0
  514. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js.br +0 -0
  515. codex/static_root/assets/group-tab-DkAIGL8z.527cad03c21d.js.gz +0 -0
  516. codex/static_root/assets/group-tab-DkAIGL8z.js.br +0 -0
  517. codex/static_root/assets/group-tab-DkAIGL8z.js.gz +0 -0
  518. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js.br +0 -0
  519. codex/static_root/assets/http-error-CjSb8orc.ad6fc5733ed8.js.gz +0 -0
  520. codex/static_root/assets/http-error-CjSb8orc.js.br +0 -0
  521. codex/static_root/assets/http-error-CjSb8orc.js.gz +0 -0
  522. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js.br +0 -0
  523. codex/static_root/assets/index-CoFXW6I0.27f397e1425e.js.gz +0 -0
  524. codex/static_root/assets/index-CoFXW6I0.js.br +0 -0
  525. codex/static_root/assets/index-CoFXW6I0.js.gz +0 -0
  526. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js.br +0 -0
  527. codex/static_root/assets/library-tab-hkMMBz1x.02270491d822.js.gz +0 -0
  528. codex/static_root/assets/library-tab-hkMMBz1x.js.br +0 -0
  529. codex/static_root/assets/library-tab-hkMMBz1x.js.gz +0 -0
  530. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js.br +0 -0
  531. codex/static_root/assets/main-DCaPxp2h.076707ddd123.js.gz +0 -0
  532. codex/static_root/assets/main-DCaPxp2h.js.br +0 -0
  533. codex/static_root/assets/main-DCaPxp2h.js.gz +0 -0
  534. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js +0 -1
  535. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js.br +0 -0
  536. codex/static_root/assets/pager-full-pdf-CwmA9y3l.e7dfdd2a6937.js.gz +0 -0
  537. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js +0 -1
  538. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js.br +0 -0
  539. codex/static_root/assets/pager-full-pdf-CwmA9y3l.js.gz +0 -0
  540. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js.br +0 -0
  541. codex/static_root/assets/pagination-toolbar-DoqxSygU.f985bc705fe5.js.gz +0 -0
  542. codex/static_root/assets/pagination-toolbar-DoqxSygU.js.br +0 -0
  543. codex/static_root/assets/pagination-toolbar-DoqxSygU.js.gz +0 -0
  544. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js.br +0 -0
  545. codex/static_root/assets/pdf-doc-BwxvAx1z.96cbc39c321d.js.gz +0 -0
  546. codex/static_root/assets/pdf-doc-BwxvAx1z.js.br +0 -0
  547. codex/static_root/assets/pdf-doc-BwxvAx1z.js.gz +0 -0
  548. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js.br +0 -0
  549. codex/static_root/assets/reader-hHIonVbA.4c12219242a9.js.gz +0 -0
  550. codex/static_root/assets/reader-hHIonVbA.js.br +0 -0
  551. codex/static_root/assets/reader-hHIonVbA.js.gz +0 -0
  552. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js.br +0 -0
  553. codex/static_root/assets/relation-chips-D7-5kPem.4443b085aca2.js.gz +0 -0
  554. codex/static_root/assets/relation-chips-D7-5kPem.js.br +0 -0
  555. codex/static_root/assets/relation-chips-D7-5kPem.js.gz +0 -0
  556. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js.br +0 -0
  557. codex/static_root/assets/settings-drawer-CdFmOhnd.f7dcd12b3ebc.js.gz +0 -0
  558. codex/static_root/assets/settings-drawer-CdFmOhnd.js.br +0 -0
  559. codex/static_root/assets/settings-drawer-CdFmOhnd.js.gz +0 -0
  560. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js.br +0 -0
  561. codex/static_root/assets/stats-tab-BzaipD0m.b6bf627ea860.js.gz +0 -0
  562. codex/static_root/assets/stats-tab-BzaipD0m.js.br +0 -0
  563. codex/static_root/assets/stats-tab-BzaipD0m.js.gz +0 -0
  564. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js.br +0 -0
  565. codex/static_root/assets/task-tab-DCnS1sM9.44d8435b4989.js.gz +0 -0
  566. codex/static_root/assets/task-tab-DCnS1sM9.js.br +0 -0
  567. codex/static_root/assets/task-tab-DCnS1sM9.js.gz +0 -0
  568. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js.br +0 -0
  569. codex/static_root/assets/unauthorized-DJSr03Dw.7555cbcf1064.js.gz +0 -0
  570. codex/static_root/assets/unauthorized-DJSr03Dw.js.br +0 -0
  571. codex/static_root/assets/unauthorized-DJSr03Dw.js.gz +0 -0
  572. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js.br +0 -0
  573. codex/static_root/assets/user-tab-DAK_Deoh.1832877d449a.js.gz +0 -0
  574. codex/static_root/assets/user-tab-DAK_Deoh.js.br +0 -0
  575. codex/static_root/assets/user-tab-DAK_Deoh.js.gz +0 -0
  576. codex/static_root/manifest.cbc39bca88fc.json +0 -735
  577. codex/static_root/manifest.cbc39bca88fc.json.br +0 -0
  578. codex/static_root/manifest.cbc39bca88fc.json.gz +0 -0
  579. /codex/static_root/assets/{VCheckbox-CvH8ekHL.016ed8d222c4.css → VCheckbox-CMKdyl0R.016ed8d222c4.css} +0 -0
  580. /codex/static_root/assets/{VCheckbox-CvH8ekHL.016ed8d222c4.css.br → VCheckbox-CMKdyl0R.016ed8d222c4.css.br} +0 -0
  581. /codex/static_root/assets/{VCheckbox-CvH8ekHL.016ed8d222c4.css.gz → VCheckbox-CMKdyl0R.016ed8d222c4.css.gz} +0 -0
  582. /codex/static_root/assets/{VCheckbox-CvH8ekHL.css → VCheckbox-CMKdyl0R.css} +0 -0
  583. /codex/static_root/assets/{VCheckbox-CvH8ekHL.css.br → VCheckbox-CMKdyl0R.css.br} +0 -0
  584. /codex/static_root/assets/{VCheckbox-CvH8ekHL.css.gz → VCheckbox-CMKdyl0R.css.gz} +0 -0
  585. /codex/static_root/assets/{VCombobox-BQHELb_o.9f25a34994e2.css → VCombobox-bwEYrXCg.9f25a34994e2.css} +0 -0
  586. /codex/static_root/assets/{VCombobox-BQHELb_o.9f25a34994e2.css.br → VCombobox-bwEYrXCg.9f25a34994e2.css.br} +0 -0
  587. /codex/static_root/assets/{VCombobox-BQHELb_o.9f25a34994e2.css.gz → VCombobox-bwEYrXCg.9f25a34994e2.css.gz} +0 -0
  588. /codex/static_root/assets/{VCombobox-BQHELb_o.css → VCombobox-bwEYrXCg.css} +0 -0
  589. /codex/static_root/assets/{VCombobox-BQHELb_o.css.br → VCombobox-bwEYrXCg.css.br} +0 -0
  590. /codex/static_root/assets/{VCombobox-BQHELb_o.css.gz → VCombobox-bwEYrXCg.css.gz} +0 -0
  591. /codex/static_root/assets/{VDialog-DWos4S54.b07aca713774.css → VDialog-Dyd05WHA.b07aca713774.css} +0 -0
  592. /codex/static_root/assets/{VDialog-DWos4S54.b07aca713774.css.br → VDialog-Dyd05WHA.b07aca713774.css.br} +0 -0
  593. /codex/static_root/assets/{VDialog-DWos4S54.b07aca713774.css.gz → VDialog-Dyd05WHA.b07aca713774.css.gz} +0 -0
  594. /codex/static_root/assets/{VDialog-DWos4S54.css → VDialog-Dyd05WHA.css} +0 -0
  595. /codex/static_root/assets/{VDialog-DWos4S54.css.br → VDialog-Dyd05WHA.css.br} +0 -0
  596. /codex/static_root/assets/{VDialog-DWos4S54.css.gz → VDialog-Dyd05WHA.css.gz} +0 -0
  597. /codex/static_root/assets/{VDivider-DU47sRrT.3d2e17799e5c.css → VDivider-DE8MJPGz.3d2e17799e5c.css} +0 -0
  598. /codex/static_root/assets/{VDivider-DU47sRrT.3d2e17799e5c.css.br → VDivider-DE8MJPGz.3d2e17799e5c.css.br} +0 -0
  599. /codex/static_root/assets/{VDivider-DU47sRrT.3d2e17799e5c.css.gz → VDivider-DE8MJPGz.3d2e17799e5c.css.gz} +0 -0
  600. /codex/static_root/assets/{VDivider-DU47sRrT.css → VDivider-DE8MJPGz.css} +0 -0
  601. /codex/static_root/assets/{VDivider-DU47sRrT.css.br → VDivider-DE8MJPGz.css.br} +0 -0
  602. /codex/static_root/assets/{VDivider-DU47sRrT.css.gz → VDivider-DE8MJPGz.css.gz} +0 -0
  603. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.5b17872981df.css → VExpansionPanels-6G1AUajL.5b17872981df.css} +0 -0
  604. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.5b17872981df.css.br → VExpansionPanels-6G1AUajL.5b17872981df.css.br} +0 -0
  605. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.5b17872981df.css.gz → VExpansionPanels-6G1AUajL.5b17872981df.css.gz} +0 -0
  606. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.css → VExpansionPanels-6G1AUajL.css} +0 -0
  607. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.css.br → VExpansionPanels-6G1AUajL.css.br} +0 -0
  608. /codex/static_root/assets/{VExpansionPanels-RsCANmDP.css.gz → VExpansionPanels-6G1AUajL.css.gz} +0 -0
  609. /codex/static_root/assets/{VForm-DxBt30-N.138c0b89b6fc.css → VForm-v1Gmu6E1.138c0b89b6fc.css} +0 -0
  610. /codex/static_root/assets/{VForm-DxBt30-N.138c0b89b6fc.css.br → VForm-v1Gmu6E1.138c0b89b6fc.css.br} +0 -0
  611. /codex/static_root/assets/{VForm-DxBt30-N.138c0b89b6fc.css.gz → VForm-v1Gmu6E1.138c0b89b6fc.css.gz} +0 -0
  612. /codex/static_root/assets/{VForm-DxBt30-N.css → VForm-v1Gmu6E1.css} +0 -0
  613. /codex/static_root/assets/{VForm-DxBt30-N.css.br → VForm-v1Gmu6E1.css.br} +0 -0
  614. /codex/static_root/assets/{VForm-DxBt30-N.css.gz → VForm-v1Gmu6E1.css.gz} +0 -0
  615. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.8e3741381961.css → VRadioGroup-i2qP9Wu9.8e3741381961.css} +0 -0
  616. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.8e3741381961.css.br → VRadioGroup-i2qP9Wu9.8e3741381961.css.br} +0 -0
  617. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.8e3741381961.css.gz → VRadioGroup-i2qP9Wu9.8e3741381961.css.gz} +0 -0
  618. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.css → VRadioGroup-i2qP9Wu9.css} +0 -0
  619. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.css.br → VRadioGroup-i2qP9Wu9.css.br} +0 -0
  620. /codex/static_root/assets/{VRadioGroup-Cp9mZ7cb.css.gz → VRadioGroup-i2qP9Wu9.css.gz} +0 -0
  621. /codex/static_root/assets/{VSelect-CP_CVb8s.6309f7bf17bb.css → VSelect-8MFoaOUz.6309f7bf17bb.css} +0 -0
  622. /codex/static_root/assets/{VSelect-CP_CVb8s.6309f7bf17bb.css.br → VSelect-8MFoaOUz.6309f7bf17bb.css.br} +0 -0
  623. /codex/static_root/assets/{VSelect-CP_CVb8s.6309f7bf17bb.css.gz → VSelect-8MFoaOUz.6309f7bf17bb.css.gz} +0 -0
  624. /codex/static_root/assets/{VSelect-CP_CVb8s.css → VSelect-8MFoaOUz.css} +0 -0
  625. /codex/static_root/assets/{VSelect-CP_CVb8s.css.br → VSelect-8MFoaOUz.css.br} +0 -0
  626. /codex/static_root/assets/{VSelect-CP_CVb8s.css.gz → VSelect-8MFoaOUz.css.gz} +0 -0
  627. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.cc18de4e83f6.css → VSelectionControl-DLxcLoTI.cc18de4e83f6.css} +0 -0
  628. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.cc18de4e83f6.css.br → VSelectionControl-DLxcLoTI.cc18de4e83f6.css.br} +0 -0
  629. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.cc18de4e83f6.css.gz → VSelectionControl-DLxcLoTI.cc18de4e83f6.css.gz} +0 -0
  630. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.css → VSelectionControl-DLxcLoTI.css} +0 -0
  631. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.css.br → VSelectionControl-DLxcLoTI.css.br} +0 -0
  632. /codex/static_root/assets/{VSelectionControl-DPpfgCW2.css.gz → VSelectionControl-DLxcLoTI.css.gz} +0 -0
  633. /codex/static_root/assets/{VTable-BnxSZ_W5.c36f0a6a30cf.css → VTable-Y5Sc3hJd.c36f0a6a30cf.css} +0 -0
  634. /codex/static_root/assets/{VTable-BnxSZ_W5.c36f0a6a30cf.css.br → VTable-Y5Sc3hJd.c36f0a6a30cf.css.br} +0 -0
  635. /codex/static_root/assets/{VTable-BnxSZ_W5.c36f0a6a30cf.css.gz → VTable-Y5Sc3hJd.c36f0a6a30cf.css.gz} +0 -0
  636. /codex/static_root/assets/{VTable-BnxSZ_W5.css → VTable-Y5Sc3hJd.css} +0 -0
  637. /codex/static_root/assets/{VTable-BnxSZ_W5.css.br → VTable-Y5Sc3hJd.css.br} +0 -0
  638. /codex/static_root/assets/{VTable-BnxSZ_W5.css.gz → VTable-Y5Sc3hJd.css.gz} +0 -0
  639. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.css → VWindowItem-ByIod57Y.css} +0 -0
  640. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.css.br → VWindowItem-ByIod57Y.css.br} +0 -0
  641. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.css.gz → VWindowItem-ByIod57Y.css.gz} +0 -0
  642. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.f7fb19752bf3.css → VWindowItem-ByIod57Y.f7fb19752bf3.css} +0 -0
  643. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.f7fb19752bf3.css.br → VWindowItem-ByIod57Y.f7fb19752bf3.css.br} +0 -0
  644. /codex/static_root/assets/{VWindowItem-CWBhiE_Y.f7fb19752bf3.css.gz → VWindowItem-ByIod57Y.f7fb19752bf3.css.gz} +0 -0
  645. /codex/static_root/assets/{admin-menu-B3iXsOyy.c13b7df2ff57.css → admin-menu-B9bzD6hV.c13b7df2ff57.css} +0 -0
  646. /codex/static_root/assets/{admin-menu-B3iXsOyy.c13b7df2ff57.css.br → admin-menu-B9bzD6hV.c13b7df2ff57.css.br} +0 -0
  647. /codex/static_root/assets/{admin-menu-B3iXsOyy.c13b7df2ff57.css.gz → admin-menu-B9bzD6hV.c13b7df2ff57.css.gz} +0 -0
  648. /codex/static_root/assets/{admin-menu-B3iXsOyy.css → admin-menu-B9bzD6hV.css} +0 -0
  649. /codex/static_root/assets/{admin-menu-B3iXsOyy.css.br → admin-menu-B9bzD6hV.css.br} +0 -0
  650. /codex/static_root/assets/{admin-menu-B3iXsOyy.css.gz → admin-menu-B9bzD6hV.css.gz} +0 -0
  651. /codex/static_root/assets/{admin-settings-button-progress-BGB22oTD.2548c49a853e.css → admin-settings-button-progress-DUUQfVsZ.2548c49a853e.css} +0 -0
  652. /codex/static_root/assets/{admin-settings-button-progress-BGB22oTD.css → admin-settings-button-progress-DUUQfVsZ.css} +0 -0
  653. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.a30e68c6e303.css → change-password-dialog-C_EOKOn9.a30e68c6e303.css} +0 -0
  654. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.a30e68c6e303.css.br → change-password-dialog-C_EOKOn9.a30e68c6e303.css.br} +0 -0
  655. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.a30e68c6e303.css.gz → change-password-dialog-C_EOKOn9.a30e68c6e303.css.gz} +0 -0
  656. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.css → change-password-dialog-C_EOKOn9.css} +0 -0
  657. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.css.br → change-password-dialog-C_EOKOn9.css.br} +0 -0
  658. /codex/static_root/assets/{change-password-dialog-D0ymWcl_.css.gz → change-password-dialog-C_EOKOn9.css.gz} +0 -0
  659. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.9b5915b112c0.css → confirm-dialog-54rblwf7.9b5915b112c0.css} +0 -0
  660. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.9b5915b112c0.css.br → confirm-dialog-54rblwf7.9b5915b112c0.css.br} +0 -0
  661. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.css → confirm-dialog-54rblwf7.css} +0 -0
  662. /codex/static_root/assets/{confirm-dialog-B1ABbGMU.css.br → confirm-dialog-54rblwf7.css.br} +0 -0
  663. /codex/static_root/assets/{datetime-column-BavtvLnf.1f3bf499e063.css → datetime-column-DeCthByU.1f3bf499e063.css} +0 -0
  664. /codex/static_root/assets/{datetime-column-BavtvLnf.css → datetime-column-DeCthByU.css} +0 -0
  665. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.9b56b4459240.css → forwardRefs-zKOZsbbr.9b56b4459240.css} +0 -0
  666. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.9b56b4459240.css.br → forwardRefs-zKOZsbbr.9b56b4459240.css.br} +0 -0
  667. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.9b56b4459240.css.gz → forwardRefs-zKOZsbbr.9b56b4459240.css.gz} +0 -0
  668. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.css → forwardRefs-zKOZsbbr.css} +0 -0
  669. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.css.br → forwardRefs-zKOZsbbr.css.br} +0 -0
  670. /codex/static_root/assets/{forwardRefs-CFNX6kJ2.css.gz → forwardRefs-zKOZsbbr.css.gz} +0 -0
  671. /codex/static_root/assets/{group-tab-_vKWzoyd.948e907b1e6b.css → group-tab-DkIN1Heu.948e907b1e6b.css} +0 -0
  672. /codex/static_root/assets/{group-tab-_vKWzoyd.948e907b1e6b.css.br → group-tab-DkIN1Heu.948e907b1e6b.css.br} +0 -0
  673. /codex/static_root/assets/{group-tab-_vKWzoyd.948e907b1e6b.css.gz → group-tab-DkIN1Heu.948e907b1e6b.css.gz} +0 -0
  674. /codex/static_root/assets/{group-tab-_vKWzoyd.css → group-tab-DkIN1Heu.css} +0 -0
  675. /codex/static_root/assets/{group-tab-_vKWzoyd.css.br → group-tab-DkIN1Heu.css.br} +0 -0
  676. /codex/static_root/assets/{group-tab-_vKWzoyd.css.gz → group-tab-DkIN1Heu.css.gz} +0 -0
  677. /codex/static_root/assets/{http-error-CODU7jcH.8c13689ae574.css → http-error-DEJmFobt.8c13689ae574.css} +0 -0
  678. /codex/static_root/assets/{http-error-CODU7jcH.8c13689ae574.css.br → http-error-DEJmFobt.8c13689ae574.css.br} +0 -0
  679. /codex/static_root/assets/{http-error-CODU7jcH.8c13689ae574.css.gz → http-error-DEJmFobt.8c13689ae574.css.gz} +0 -0
  680. /codex/static_root/assets/{http-error-CODU7jcH.css → http-error-DEJmFobt.css} +0 -0
  681. /codex/static_root/assets/{http-error-CODU7jcH.css.br → http-error-DEJmFobt.css.br} +0 -0
  682. /codex/static_root/assets/{http-error-CODU7jcH.css.gz → http-error-DEJmFobt.css.gz} +0 -0
  683. /codex/static_root/assets/{index-BHXJTQ4V.523d7b3d350f.css → index-CL_6g4tJ.523d7b3d350f.css} +0 -0
  684. /codex/static_root/assets/{index-BHXJTQ4V.523d7b3d350f.css.br → index-CL_6g4tJ.523d7b3d350f.css.br} +0 -0
  685. /codex/static_root/assets/{index-BHXJTQ4V.523d7b3d350f.css.gz → index-CL_6g4tJ.523d7b3d350f.css.gz} +0 -0
  686. /codex/static_root/assets/{index-BHXJTQ4V.css → index-CL_6g4tJ.css} +0 -0
  687. /codex/static_root/assets/{index-BHXJTQ4V.css.br → index-CL_6g4tJ.css.br} +0 -0
  688. /codex/static_root/assets/{index-BHXJTQ4V.css.gz → index-CL_6g4tJ.css.gz} +0 -0
  689. /codex/static_root/assets/{library-tab-CgsXOX_r.75baedb7e976.css → library-tab-Ce6qaeCV.75baedb7e976.css} +0 -0
  690. /codex/static_root/assets/{library-tab-CgsXOX_r.75baedb7e976.css.br → library-tab-Ce6qaeCV.75baedb7e976.css.br} +0 -0
  691. /codex/static_root/assets/{library-tab-CgsXOX_r.75baedb7e976.css.gz → library-tab-Ce6qaeCV.75baedb7e976.css.gz} +0 -0
  692. /codex/static_root/assets/{library-tab-CgsXOX_r.css → library-tab-Ce6qaeCV.css} +0 -0
  693. /codex/static_root/assets/{library-tab-CgsXOX_r.css.br → library-tab-Ce6qaeCV.css.br} +0 -0
  694. /codex/static_root/assets/{library-tab-CgsXOX_r.css.gz → library-tab-Ce6qaeCV.css.gz} +0 -0
  695. /codex/static_root/assets/{main-K8cER0IH.css → main-BZ73p_WW.css} +0 -0
  696. /codex/static_root/assets/{main-K8cER0IH.css.br → main-BZ73p_WW.css.br} +0 -0
  697. /codex/static_root/assets/{main-K8cER0IH.css.gz → main-BZ73p_WW.css.gz} +0 -0
  698. /codex/static_root/assets/{main-K8cER0IH.d529e8b3f52a.css → main-BZ73p_WW.d529e8b3f52a.css} +0 -0
  699. /codex/static_root/assets/{main-K8cER0IH.d529e8b3f52a.css.br → main-BZ73p_WW.d529e8b3f52a.css.br} +0 -0
  700. /codex/static_root/assets/{main-K8cER0IH.d529e8b3f52a.css.gz → main-BZ73p_WW.d529e8b3f52a.css.gz} +0 -0
  701. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.css → pagination-toolbar-DSe0TkMm.css} +0 -0
  702. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.css.br → pagination-toolbar-DSe0TkMm.css.br} +0 -0
  703. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.css.gz → pagination-toolbar-DSe0TkMm.css.gz} +0 -0
  704. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.dcb0eba65827.css → pagination-toolbar-DSe0TkMm.dcb0eba65827.css} +0 -0
  705. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.dcb0eba65827.css.br → pagination-toolbar-DSe0TkMm.dcb0eba65827.css.br} +0 -0
  706. /codex/static_root/assets/{pagination-toolbar-D5VQREy5.dcb0eba65827.css.gz → pagination-toolbar-DSe0TkMm.dcb0eba65827.css.gz} +0 -0
  707. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.b94aac7e3313.css → pdf-doc-CG5-AZ2M.b94aac7e3313.css} +0 -0
  708. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.b94aac7e3313.css.br → pdf-doc-CG5-AZ2M.b94aac7e3313.css.br} +0 -0
  709. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.b94aac7e3313.css.gz → pdf-doc-CG5-AZ2M.b94aac7e3313.css.gz} +0 -0
  710. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.css → pdf-doc-CG5-AZ2M.css} +0 -0
  711. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.css.br → pdf-doc-CG5-AZ2M.css.br} +0 -0
  712. /codex/static_root/assets/{pdf-doc-B4cGW_Hl.css.gz → pdf-doc-CG5-AZ2M.css.gz} +0 -0
  713. /codex/static_root/assets/{reader-D_3ruSqa.2ed32f08e906.css → reader-B3hgta6g.2ed32f08e906.css} +0 -0
  714. /codex/static_root/assets/{reader-D_3ruSqa.2ed32f08e906.css.br → reader-B3hgta6g.2ed32f08e906.css.br} +0 -0
  715. /codex/static_root/assets/{reader-D_3ruSqa.2ed32f08e906.css.gz → reader-B3hgta6g.2ed32f08e906.css.gz} +0 -0
  716. /codex/static_root/assets/{reader-D_3ruSqa.css → reader-B3hgta6g.css} +0 -0
  717. /codex/static_root/assets/{reader-D_3ruSqa.css.br → reader-B3hgta6g.css.br} +0 -0
  718. /codex/static_root/assets/{reader-D_3ruSqa.css.gz → reader-B3hgta6g.css.gz} +0 -0
  719. /codex/static_root/assets/{relation-chips-DpbzrZxT.01269a188e01.css → relation-chips-ByfWwuQc.01269a188e01.css} +0 -0
  720. /codex/static_root/assets/{relation-chips-DpbzrZxT.01269a188e01.css.br → relation-chips-ByfWwuQc.01269a188e01.css.br} +0 -0
  721. /codex/static_root/assets/{relation-chips-DpbzrZxT.01269a188e01.css.gz → relation-chips-ByfWwuQc.01269a188e01.css.gz} +0 -0
  722. /codex/static_root/assets/{relation-chips-DpbzrZxT.css → relation-chips-ByfWwuQc.css} +0 -0
  723. /codex/static_root/assets/{relation-chips-DpbzrZxT.css.br → relation-chips-ByfWwuQc.css.br} +0 -0
  724. /codex/static_root/assets/{relation-chips-DpbzrZxT.css.gz → relation-chips-ByfWwuQc.css.gz} +0 -0
  725. /codex/static_root/assets/{settings-drawer-DMSsWF8c.75a6ea969e71.css → settings-drawer-CqJ4gXLq.75a6ea969e71.css} +0 -0
  726. /codex/static_root/assets/{settings-drawer-DMSsWF8c.75a6ea969e71.css.br → settings-drawer-CqJ4gXLq.75a6ea969e71.css.br} +0 -0
  727. /codex/static_root/assets/{settings-drawer-DMSsWF8c.75a6ea969e71.css.gz → settings-drawer-CqJ4gXLq.75a6ea969e71.css.gz} +0 -0
  728. /codex/static_root/assets/{settings-drawer-DMSsWF8c.css → settings-drawer-CqJ4gXLq.css} +0 -0
  729. /codex/static_root/assets/{settings-drawer-DMSsWF8c.css.br → settings-drawer-CqJ4gXLq.css.br} +0 -0
  730. /codex/static_root/assets/{settings-drawer-DMSsWF8c.css.gz → settings-drawer-CqJ4gXLq.css.gz} +0 -0
  731. /codex/static_root/assets/{stats-tab-WvF2acoZ.9fdb0106124d.css → stats-tab-BlXGStge.9fdb0106124d.css} +0 -0
  732. /codex/static_root/assets/{stats-tab-WvF2acoZ.9fdb0106124d.css.br → stats-tab-BlXGStge.9fdb0106124d.css.br} +0 -0
  733. /codex/static_root/assets/{stats-tab-WvF2acoZ.9fdb0106124d.css.gz → stats-tab-BlXGStge.9fdb0106124d.css.gz} +0 -0
  734. /codex/static_root/assets/{stats-tab-WvF2acoZ.css → stats-tab-BlXGStge.css} +0 -0
  735. /codex/static_root/assets/{stats-tab-WvF2acoZ.css.br → stats-tab-BlXGStge.css.br} +0 -0
  736. /codex/static_root/assets/{stats-tab-WvF2acoZ.css.gz → stats-tab-BlXGStge.css.gz} +0 -0
  737. /codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css → task-tab-EGlhcKTH.478e74041f80.css} +0 -0
  738. /codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css.br → task-tab-EGlhcKTH.478e74041f80.css.br} +0 -0
  739. /codex/static_root/assets/{task-tab-DfdUY9Rc.478e74041f80.css.gz → task-tab-EGlhcKTH.478e74041f80.css.gz} +0 -0
  740. /codex/static_root/assets/{task-tab-DfdUY9Rc.css → task-tab-EGlhcKTH.css} +0 -0
  741. /codex/static_root/assets/{task-tab-DfdUY9Rc.css.br → task-tab-EGlhcKTH.css.br} +0 -0
  742. /codex/static_root/assets/{task-tab-DfdUY9Rc.css.gz → task-tab-EGlhcKTH.css.gz} +0 -0
  743. /codex/static_root/assets/{unauthorized-CsSak07X.c5536d9dae75.css → unauthorized-VnIXUO1w.c5536d9dae75.css} +0 -0
  744. /codex/static_root/assets/{unauthorized-CsSak07X.c5536d9dae75.css.br → unauthorized-VnIXUO1w.c5536d9dae75.css.br} +0 -0
  745. /codex/static_root/assets/{unauthorized-CsSak07X.c5536d9dae75.css.gz → unauthorized-VnIXUO1w.c5536d9dae75.css.gz} +0 -0
  746. /codex/static_root/assets/{unauthorized-CsSak07X.css → unauthorized-VnIXUO1w.css} +0 -0
  747. /codex/static_root/assets/{unauthorized-CsSak07X.css.br → unauthorized-VnIXUO1w.css.br} +0 -0
  748. /codex/static_root/assets/{unauthorized-CsSak07X.css.gz → unauthorized-VnIXUO1w.css.gz} +0 -0
  749. {codex-1.7.3.dist-info → codex-1.7.3a0.dist-info}/LICENSE +0 -0
  750. {codex-1.7.3.dist-info → codex-1.7.3a0.dist-info}/entry_points.txt +0 -0
@@ -13,6 +13,8 @@ LOG = get_logger(__name__)
13
13
  class BrowserFilterView(BrowserFilterBookmarkView):
14
14
  """Browser Filters."""
15
15
 
16
+ TARGET = ""
17
+
16
18
  def force_inner_joins(self, qs):
17
19
  """Force INNER JOINS to filter empty groups."""
18
20
  demote_tables = {"codex_library"}
@@ -26,10 +28,10 @@ class BrowserFilterView(BrowserFilterBookmarkView):
26
28
  def _get_query_filters(
27
29
  self,
28
30
  model,
29
- page_mtime,
30
- bookmark_filter,
31
31
  group=None,
32
32
  pks=None,
33
+ page_mtime=False,
34
+ bookmark_filter=True,
33
35
  ) -> Q:
34
36
  """Return all the filters except the group filter."""
35
37
  big_include_filter = Q()
@@ -52,16 +54,16 @@ class BrowserFilterView(BrowserFilterBookmarkView):
52
54
  model,
53
55
  group=None,
54
56
  pks=None,
55
- page_mtime=False, # noqa: FBT002
56
- bookmark_filter=True, # noqa: FBT002
57
+ page_mtime=False,
58
+ bookmark_filter=True,
57
59
  ) -> QuerySet:
58
60
  """Get a filtered queryset for the model."""
59
61
  query_filters = self._get_query_filters(
60
62
  model,
61
- page_mtime=page_mtime,
62
- bookmark_filter=bookmark_filter,
63
63
  group=group,
64
64
  pks=pks,
65
+ page_mtime=page_mtime,
66
+ bookmark_filter=bookmark_filter,
65
67
  )
66
68
  # Distinct necissary for folder view with search
67
69
  return model.objects.filter(query_filters).distinct()
@@ -18,11 +18,10 @@ class GroupFilterView(BrowserParamsView):
18
18
 
19
19
  SESSION_KEY = BrowserParamsView.BROWSER_SESSION_KEY
20
20
 
21
- TARGET = ""
22
-
23
- def _get_rel_for_pks(self, group, page_mtime: bool):
21
+ def _get_rel_for_pks(self, group, page_mtime=False):
24
22
  """Get the relation from the model to the pks."""
25
- target: str = self.TARGET
23
+ # XXX these TARGET refs might be better as subclass get rel methods.
24
+ target: str = self.TARGET # type: ignore
26
25
  if target in _GROUP_REL_TARGETS:
27
26
  rel = FILTER_ONLY_GROUP_RELATION[group]
28
27
  elif target in _PK_REL_TARGETS or page_mtime:
@@ -37,7 +36,7 @@ class GroupFilterView(BrowserParamsView):
37
36
  rel += "__in"
38
37
  return rel
39
38
 
40
- def get_group_filter(self, group=None, pks=None, page_mtime=False): # noqa: FBT002
39
+ def get_group_filter(self, group=None, pks=None, page_mtime=False):
41
40
  """Get filter for the displayed group."""
42
41
  if group is None:
43
42
  group = self.kwargs["group"]
@@ -79,7 +79,8 @@ def _cast_value(rel, rel_class, value):
79
79
  value = parse(value)
80
80
  if rel_class == DateField and value:
81
81
  value = value.date()
82
- # (CharField, TextField):
82
+ # elif rel_class in (CharField, TextField):
83
+ # value = value
83
84
  return value
84
85
 
85
86
 
@@ -1,5 +1,5 @@
1
1
  """Optimize Text Lookups."""
2
- # UNUSED CODE multiple like queries test better
2
+ # XXX Unused XXX multiple like queries test better
3
3
 
4
4
  import re
5
5
 
@@ -22,7 +22,7 @@ if TYPE_CHECKING:
22
22
  from pyparsing.helpers import InfixNotationOperatorSpec
23
23
 
24
24
  _QUOTES_REXP = r"(?:\".*?\")"
25
- _OPERATORS_REXP = "and not|or not|and|or"
25
+ _OPERATORS_REXP = "|".join(("and not", "or not", "and", "or"))
26
26
  _BEGIN_NOT_REXP = r"^\s*\(?\s*(?P<not>not)"
27
27
  _IMPLICIT_AND_REXP = (
28
28
  rf"{_QUOTES_REXP}|\ (?P<ok>{_OPERATORS_REXP})\ |(?P<bare>(?:\ not)?\ )\S"
@@ -183,5 +183,5 @@ def get_field_query(rel, rel_class, exp, model, many_to_many):
183
183
  bool_expr = _create_context_expression(context)
184
184
 
185
185
  parsed_result = bool_expr.parse_string(exp)
186
- root_bool_operand: BoolOperand = parsed_result[0] # type:ignore[reportAssignmentType]
186
+ root_bool_operand: BoolOperand = parsed_result[0] # type:ignore
187
187
  return root_bool_operand.to_query()
@@ -149,7 +149,7 @@ class SearchFilterView(BrowserFTSFilter):
149
149
 
150
150
  def _preparse_search_query(self):
151
151
  """Preparse search fields out of query text."""
152
- text = self.params.get("q")
152
+ text = self.params.get("q") # type: ignore
153
153
  field_tokens = {}
154
154
  if not text:
155
155
  return field_tokens, text
@@ -177,7 +177,7 @@ class SearchFilterView(BrowserFTSFilter):
177
177
  )
178
178
  else:
179
179
  # AND and OR
180
- # Cannot do OR queries with MATCH, it decontextualizes MATCH somehow.
180
+ # XXX cannot do OR queries with MATCH, it decontextualizes MATCH somehow.
181
181
  if preop == "or":
182
182
  self.search_error = "OR preceding column tokens with operator expressions will act as AND"
183
183
  include_q_list, exclude_q_list = self.get_search_field_filters(
@@ -227,9 +227,24 @@ class SearchFilterView(BrowserFTSFilter):
227
227
 
228
228
  return include_q, exclude_q, fts_q
229
229
 
230
+ def _is_search_results_limited(self) -> bool:
231
+ """Get search result limit from params."""
232
+ # user = self.request.user # type: ignore
233
+ # if user and user.is_authenticated:
234
+ # limited = bool(
235
+ # self.params.get( # type: ignore
236
+ # "search_results_limit",
237
+ # MAX_OBJ_PER_PAGE,
238
+ # )
239
+ # )
240
+ # else:
241
+ # limited = True
242
+ # return limited
243
+ return True
244
+
230
245
  def get_search_limit(self):
231
246
  """Get search scores for choices and metadata."""
232
- if not self.search_mode:
247
+ if not self.search_mode or not self._is_search_results_limited():
233
248
  return 0
234
- page = self.kwargs.get("page", 1)
249
+ page = self.kwargs.get("page", 1) # type: ignore
235
250
  return page * MAX_OBJ_PER_PAGE + 1
@@ -54,7 +54,7 @@ class BrowserGroupMtimeView(BrowserFilterView):
54
54
  args["distinct"] = True
55
55
  return agg_func(bmua_rel, **args)
56
56
 
57
- def get_group_mtime(self, model, group=None, pks=None, page_mtime=False): # noqa: FBT002
57
+ def get_group_mtime(self, model, group=None, pks=None, page_mtime=False):
58
58
  """Get a filtered mtime for browser pages and mtime checker."""
59
59
  qs = self.get_filtered_queryset(
60
60
  model,
@@ -47,7 +47,7 @@ class MetadataCopyIntersectionsView(MetadataQueryIntersectionsView):
47
47
  @classmethod
48
48
  def _copy_m2m_intersections(cls, obj, m2m_intersections):
49
49
  """Copy the m2m intersections into the object."""
50
- # It might even be faster to copy everything to a dict and not use the obj.
50
+ # XXX It might even be faster to copy everything to a dict and not use the obj.
51
51
  for key, qs in m2m_intersections.items():
52
52
  serializer_key = (
53
53
  f"{PREFETCH_PREFIX}{key}"
@@ -63,7 +63,7 @@ class MetadataView(MetadataCopyIntersectionsView):
63
63
  obj = qs[0]
64
64
  if not obj:
65
65
  reason = "Empty obj"
66
- raise ValueError(reason) # noqa: TRY301
66
+ raise ValueError(reason) # noqa TRY301
67
67
  except (IndexError, ValueError) as exc:
68
68
  return self._raise_not_found(exc)
69
69
 
@@ -37,7 +37,7 @@ class MtimeView(BrowserGroupMtimeView):
37
37
  """Get max mtime for all groups."""
38
38
  max_mtime = None
39
39
 
40
- for item in self.params["groups"]:
40
+ for item in self.params["groups"]: # type: ignore
41
41
  mtime = self._get_group_mtime(item)
42
42
  max_mtime = max_none(max_mtime, mtime)
43
43
  return max_mtime
@@ -55,7 +55,7 @@ class BrowserOrderByView(BrowserGroupMtimeView):
55
55
  order_fields_head += ["bookmark_updated_at"]
56
56
  return order_fields_head
57
57
 
58
- def add_order_by(self, qs, order_key="", comic_sort_names=None):
58
+ def add_order_by(self, qs, order_key="", do_reverse=True, comic_sort_names=None):
59
59
  """Create the order_by list."""
60
60
  order_fields_head = ()
61
61
  if qs.model is Comic:
@@ -65,9 +65,11 @@ class BrowserOrderByView(BrowserGroupMtimeView):
65
65
 
66
66
  order_fields = (*order_fields_head, "pk")
67
67
 
68
- prefix = "-" if self.params.get("order_reverse") else ""
68
+ prefix = "-" if do_reverse and self.params.get("order_reverse") else ""
69
+ order_by = []
69
70
  if prefix:
70
- order_by = [prefix + field for field in order_fields]
71
+ for field in order_fields:
72
+ order_by.append(prefix + field)
71
73
  else:
72
74
  order_by = order_fields
73
75
 
@@ -58,7 +58,7 @@ class BrowserParamsView(SessionView):
58
58
  validated_data = serializer.validated_data
59
59
 
60
60
  if validated_data:
61
- params.update(validated_data)
61
+ params.update(validated_data) # type: ignore
62
62
  self._params = MappingProxyType(params)
63
63
  self.validate_settings()
64
64
  return self._params
@@ -9,7 +9,7 @@ class BrowserSettingsView(SettingsView):
9
9
  """Get Browser Settings."""
10
10
 
11
11
  # Put Browser Settings is normally done through BrowserView.get()
12
- serializer_class = BrowserSettingsSerializer
12
+ serializer_class = BrowserSettingsSerializer # type: ignore
13
13
 
14
14
  SESSION_KEY = SettingsView.BROWSER_SESSION_KEY
15
15
 
@@ -3,7 +3,6 @@
3
3
  from collections.abc import Mapping
4
4
  from copy import deepcopy
5
5
  from types import MappingProxyType
6
- from typing import Any
7
6
 
8
7
  from rest_framework.exceptions import NotFound
9
8
 
@@ -74,18 +73,17 @@ class BrowserValidateView(SearchFilterView):
74
73
  self, reason, route_mask=None, settings_mask: Mapping | None = None
75
74
  ):
76
75
  """Redirect the client to a valid group url."""
77
- route: dict[str, Any] = mapping_to_dict(self.DEFAULT_ROUTE) # type:ignore[reportAssignmentType]
76
+ route = mapping_to_dict(self.DEFAULT_ROUTE)
78
77
  if route_mask:
79
- route["params"].update(route_mask)
80
- settings: dict[str, Any] = deepcopy(mapping_to_dict(self.params)) # type: ignore[reportAssignmentType]
78
+ route["params"].update(route_mask) # type: ignore
79
+ settings: dict = deepcopy(mapping_to_dict(self.params)) # type: ignore
81
80
  if settings_mask:
82
81
  settings.update(settings_mask)
83
82
  detail = {"route": route, "settings": settings, "reason": reason}
84
83
  raise SeeOtherRedirectError(detail=detail)
85
84
 
86
85
  def _get_valid_browse_top_groups(self):
87
- """
88
- Get valid top groups for the current settings.
86
+ """Get valid top groups for the current settings.
89
87
 
90
88
  Valid top groups are determined by the Browser Settings.
91
89
  """
@@ -120,8 +118,7 @@ class BrowserValidateView(SearchFilterView):
120
118
  self.raise_redirect(reason, route, settings_mask)
121
119
 
122
120
  def _get_valid_browse_nav_groups(self, valid_top_groups):
123
- """
124
- Get valid nav groups for the current settings.
121
+ """Get valid nav groups for the current settings.
125
122
 
126
123
  Valid nav groups are the top group and below that are also
127
124
  enabled in browser settings.
codex/views/const.py CHANGED
@@ -76,6 +76,9 @@ METADATA_GROUP_RELATION = MappingProxyType(
76
76
  {
77
77
  **GROUP_NAME_MAP,
78
78
  COMIC_GROUP: "comic",
79
+ # Possible to list all groups in a non group view, but could get crazy.
80
+ # FOLDER_GROUP: "comic__folder",
81
+ # STORY_ARC_GROUP: "comic__story_arc_number__story_arc"
79
82
  }
80
83
  )
81
84
  CUSTOM_COVER_GROUP_RELATION = MappingProxyType(
codex/views/frontend.py CHANGED
@@ -17,7 +17,7 @@ class IndexView(SessionView):
17
17
  SESSION_KEY = SessionView.BROWSER_SESSION_KEY
18
18
 
19
19
  permission_classes = (AllowAny,)
20
- renderer_classes: ClassVar[list] = [TemplateHTMLRenderer] # type: ignore[reportIncompatibleVariableOverride]
20
+ renderer_classes: ClassVar[list] = [TemplateHTMLRenderer] # type: ignore
21
21
  template_name = "index.html"
22
22
 
23
23
  def _get_last_route(self):
codex/views/mixins.py CHANGED
@@ -4,7 +4,6 @@ from django.db.models.expressions import F
4
4
 
5
5
  from codex.logger.logging import get_logger
6
6
  from codex.models.comic import Comic, Imprint, Volume
7
- from codex.views.browser.filters.filter import BrowserFilterView
8
7
  from codex.views.const import GROUP_NAME_MAP
9
8
 
10
9
  LOG = get_logger(__name__)
@@ -13,7 +12,7 @@ _GROUP_NAME_TARGETS = frozenset({"browser", "opds1", "opds2", "reader"})
13
12
  _VARIABLE_SHOW = "pi"
14
13
 
15
14
 
16
- class SharedAnnotationsMixin(BrowserFilterView):
15
+ class SharedAnnotationsMixin:
17
16
  """Cross view annotation methods."""
18
17
 
19
18
  @staticmethod
@@ -55,7 +54,7 @@ class SharedAnnotationsMixin(BrowserFilterView):
55
54
  def annotate_group_names(cls, qs):
56
55
  """Annotate name fields by hoisting them up."""
57
56
  # Optimized to only lookup what is used on the frontend
58
- target = cls.TARGET
57
+ target = cls.TARGET # type: ignore
59
58
  if target not in _GROUP_NAME_TARGETS:
60
59
  return qs
61
60
  group_names = {}
@@ -40,7 +40,7 @@ _DOC = MappingProxyType(
40
40
  "labels": {"login": "Username", "password": "Password"},
41
41
  },
42
42
  {
43
- # Out of spec type
43
+ # XXX Out of spec type
44
44
  "type": "cookie",
45
45
  "links": [
46
46
  {
codex/views/opds/const.py CHANGED
@@ -48,9 +48,9 @@ class MimeType:
48
48
 
49
49
  ATOM = "application/atom+xml"
50
50
  _PROFILE_CATALOG = "profile=opds-catalog"
51
- NAV = f"{ATOM};{_PROFILE_CATALOG};kind=navigation"
52
- ACQUISITION = f"{ATOM};{_PROFILE_CATALOG};kind=acquisition"
53
- ENTRY_CATALOG = f"{ATOM};type=entry;{_PROFILE_CATALOG}"
51
+ NAV = ";".join((ATOM, _PROFILE_CATALOG, "kind=navigation"))
52
+ ACQUISITION = ";".join((ATOM, _PROFILE_CATALOG, "kind=acquisition"))
53
+ ENTRY_CATALOG = ";".join((ATOM, "type=entry", _PROFILE_CATALOG))
54
54
  AUTHENTICATION = "application/opds-authentication+json"
55
55
  OPENSEARCH = "application/opensearchdescription+xml"
56
56
  STREAM = "image/jpeg"
@@ -58,7 +58,7 @@ class MimeType:
58
58
  OPDS_PUB = "application/opds-publication+json"
59
59
  PROGRESSION = "application/vnd.readium.progression+json"
60
60
  BOOK = "http://schema.org/Book"
61
- # COMIC = "https://schema.org/ComicStory" unused
61
+ # COMIC = "https://schema.org/ComicStory"
62
62
  JPEG = "image/jpeg"
63
63
  WEBP = "image/webp"
64
64
  HTML = "text/html"
codex/views/opds/util.py CHANGED
@@ -31,7 +31,7 @@ def update_href_query_params(href, old_query_params, new_query_params=None):
31
31
  return href
32
32
 
33
33
 
34
- def get_contributor_people(comic_pks, roles, exclude):
34
+ def get_contributor_people(comic_pks, roles, exclude=False):
35
35
  """Get contributors that are not authors."""
36
36
  people = ContributorPerson.objects.filter(
37
37
  contributor__comic__in=comic_pks,
@@ -43,7 +43,7 @@ def get_contributor_people(comic_pks, roles, exclude):
43
43
  return people.distinct().only("name")
44
44
 
45
45
 
46
- def get_contributors(comic_pks, roles, exclude):
46
+ def get_contributors(comic_pks, roles, exclude=False):
47
47
  """Get credits that are not part of other roles."""
48
48
  contributors = Contributor.objects.filter(comic__in=comic_pks)
49
49
  if exclude:
@@ -78,7 +78,7 @@ def full_redirect_view(url_name):
78
78
  path = request.get_full_path()
79
79
  if path:
80
80
  parts = path.split("?")
81
- if len(parts) >= 2: # noqa: PLR2004
81
+ if len(parts) >= 2: # noqa PLR2004
82
82
  parts[0] = url
83
83
  url = "?".join(parts)
84
84
 
@@ -47,10 +47,8 @@ class OPDS1Entry(OPDS1EntryLinksMixin):
47
47
  elif group == "c":
48
48
  title = Comic.get_title(
49
49
  self.obj,
50
- volume=True,
51
- name=True,
52
- filename_fallback=self.title_filename_fallback,
53
50
  zero_pad=self.zero_pad,
51
+ filename_fallback=self.title_filename_fallback,
54
52
  )
55
53
  parts.append(title)
56
54
 
@@ -135,7 +133,7 @@ class OPDS1Entry(OPDS1EntryLinksMixin):
135
133
  """Get Author names."""
136
134
  if not self.metadata:
137
135
  return []
138
- people = get_contributor_people(self.obj.ids, AUTHOR_ROLES, exclude=False)
136
+ people = get_contributor_people(self.obj.ids, AUTHOR_ROLES)
139
137
  return self._add_url_to_obj(people, "contributors")
140
138
 
141
139
  @property
@@ -20,7 +20,7 @@ class OPDS1EntryLinksMixin:
20
20
  """OPDS v1 Entry Links Methods."""
21
21
 
22
22
  def __init__(
23
- self, obj, query_params, data: OPDS1EntryData, title_filename_fallback: bool
23
+ self, obj, query_params, data: OPDS1EntryData, title_filename_fallback=False
24
24
  ):
25
25
  """Initialize params."""
26
26
  self.obj = obj
@@ -35,6 +35,7 @@ class OPDS1EntryLinksMixin:
35
35
  def _cover_link(self, rel):
36
36
  if self.fake:
37
37
  return None
38
+ # cover_pk = getattr(self.obj, "cover_pk", None)
38
39
  try:
39
40
  kwargs = {"group": self.obj.group, "pks": self.obj.ids}
40
41
  ts = floor(datetime.timestamp(self.obj.updated_at))
@@ -49,7 +50,7 @@ class OPDS1EntryLinksMixin:
49
50
  except Exception:
50
51
  LOG.exception("create thumb")
51
52
 
52
- def _nav_href(self, metadata: bool):
53
+ def _nav_href(self, metadata=False):
53
54
  try:
54
55
  pks = sorted(self.obj.ids)
55
56
  kwargs = {"group": self.obj.group, "pks": pks, "page": 1}
@@ -71,7 +72,7 @@ class OPDS1EntryLinksMixin:
71
72
  LOG.exception(msg)
72
73
  raise
73
74
 
74
- def _nav_link(self, metadata: bool):
75
+ def _nav_link(self, metadata=False):
75
76
  href = self._nav_href(metadata)
76
77
 
77
78
  group = self.obj.group
@@ -153,7 +154,7 @@ class OPDS1EntryLinksMixin:
153
154
 
154
155
  if self.obj.group == "c" and not self.fake:
155
156
  result += self._links_comic()
156
- elif nav := self._nav_link(metadata=False):
157
+ elif nav := self._nav_link():
157
158
  result += [nav]
158
159
 
159
160
  except Exception:
@@ -169,14 +169,11 @@ class OPDS1FacetsView(BrowserView):
169
169
  )
170
170
  qps = {**self.request.GET}
171
171
  qps.update(query_params)
172
- zero_pad: int = self.obj["zero_pad"]
172
+ zero_pad: int = self.obj["zero_pad"] # type: ignore
173
173
  data = OPDS1EntryData(
174
- self.opds_acquisition_groups,
175
- zero_pad,
176
- metadata=False,
177
- mime_type_map=self.mime_type_map,
174
+ self.opds_acquisition_groups, zero_pad, False, self.mime_type_map
178
175
  )
179
- return OPDS1Entry(entry_obj, qps, data, title_filename_fallback=False)
176
+ return OPDS1Entry(entry_obj, qps, data)
180
177
 
181
178
  def _is_facet_active(self, facet_group, facet):
182
179
  compare = [facet.value]
@@ -234,8 +231,7 @@ class OPDS1FacetsView(BrowserView):
234
231
  facets += [facet_obj]
235
232
  return facets
236
233
 
237
- def facets(self, entries: bool, root: bool):
238
- # entries false, root true
234
+ def facets(self, entries=False, root=True):
239
235
  """Return facets."""
240
236
  facets = []
241
237
  group = self.kwargs.get("group")
@@ -75,7 +75,7 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
75
75
  """Create the feed title."""
76
76
  result = ""
77
77
  try:
78
- browser_title: Mapping[str, Any] = self.obj.get("title", {})
78
+ browser_title: Mapping[str, Any] = self.obj.get("title") # type: ignore
79
79
  if browser_title:
80
80
  parent_name = browser_title.get("parent_name", "All")
81
81
  pks = self.kwargs["pks"]
@@ -97,7 +97,7 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
97
97
  try:
98
98
  mtime = self.obj.get("mtime")
99
99
  if mtime:
100
- datestr = mtime.isoformat()
100
+ datestr = mtime.isoformat() # type: ignore
101
101
  except Exception:
102
102
  LOG.exception("Getting OPDS v1 updated")
103
103
  return datestr
@@ -124,13 +124,13 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
124
124
  """Get entries by key section."""
125
125
  entries = []
126
126
  if objs := self.obj.get(key):
127
- zero_pad: int = self.obj["zero_pad"]
127
+ zero_pad: int = self.obj["zero_pad"] # type: ignore
128
128
  data = OPDS1EntryData(
129
129
  self.opds_acquisition_groups, zero_pad, metadata, self.mime_type_map
130
130
  )
131
131
  fallback = bool(self.admin_flags.get("folder_view"))
132
132
  import_pks = set()
133
- for obj in objs:
133
+ for obj in objs: # type: ignore
134
134
  entry = OPDS1Entry(
135
135
  obj,
136
136
  self.request.GET,
@@ -157,7 +157,7 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
157
157
  entries += self.add_top_links(RootTopLinks.ALL)
158
158
  entries += self.facets(entries=True, root=at_root)
159
159
 
160
- entries += self._get_entries_section("groups", metadata=False)
160
+ entries += self._get_entries_section("groups", False)
161
161
  metadata = self.request.GET.get("opdsMetadata", "").lower() not in FALSY
162
162
  entries += self._get_entries_section("books", metadata)
163
163
  except Exception:
@@ -105,7 +105,7 @@ class RootTopLinks:
105
105
  class OPDS1LinksView(OPDS1FacetsView):
106
106
  """OPDS 1 Links methods."""
107
107
 
108
- # overwritten in get_object method
108
+ # overwritten in get_object()
109
109
  DEFAULT_ROUTE = MappingProxyType(
110
110
  {
111
111
  **OPDS1FacetsView.DEFAULT_ROUTE,
@@ -143,7 +143,7 @@ class OPDS1LinksView(OPDS1FacetsView):
143
143
  def _root_links(self):
144
144
  """Navigation Root Links."""
145
145
  links = []
146
- if up_route := self.get_last_route(name=True):
146
+ if up_route := self.get_last_route():
147
147
  links += [self._link(up_route, Rel.UP)]
148
148
  page = self.kwargs.get("page", 1)
149
149
  if page > 1:
@@ -179,7 +179,7 @@ class OPDS1LinksView(OPDS1FacetsView):
179
179
  for top_link in TopLinks.ALL + RootTopLinks.ALL:
180
180
  if not self.is_top_link_displayed(top_link):
181
181
  links += [self._top_link(top_link)]
182
- if facets := self.facets(entries=False, root=True):
182
+ if facets := self.facets():
183
183
  links += facets
184
184
  except Exception:
185
185
  LOG.exception("Getting OPDS v1 links")
@@ -194,16 +194,11 @@ class OPDS1LinksView(OPDS1FacetsView):
194
194
  name=name,
195
195
  summary=top_link.desc,
196
196
  )
197
- zero_pad: int = self.obj["zero_pad"]
197
+ zero_pad: int = self.obj["zero_pad"] # type: ignore
198
198
  data = OPDS1EntryData(
199
- self.opds_acquisition_groups,
200
- zero_pad,
201
- metadata=False,
202
- mime_type_map=self.mime_type_map,
203
- )
204
- return OPDS1Entry(
205
- entry_obj, top_link.query_params, data, title_filename_fallback=False
199
+ self.opds_acquisition_groups, zero_pad, False, self.mime_type_map
206
200
  )
201
+ return OPDS1Entry(entry_obj, top_link.query_params, data)
207
202
 
208
203
  def add_top_links(self, top_links):
209
204
  """Add a list of top links as entries if they should be enabled."""
@@ -31,10 +31,7 @@ FACETS = (
31
31
  "Order Direction",
32
32
  "orderReverse",
33
33
  "⇕",
34
- (
35
- Facet(query_param_value=False, title="Ascending"),
36
- Facet(query_param_value=True, title="Descending"),
37
- ),
34
+ (Facet(False, "Ascending"), Facet(True, "Descending")),
38
35
  ),
39
36
  FacetGroup(
40
37
  "Top Group",
@@ -117,5 +114,5 @@ class LinksSectionData:
117
114
 
118
115
 
119
116
  TOP_NAV_GROUP_SECTION_DATA = LinksSectionData(group_kwarg=True)
120
- GROUPS_SECTION_DATA = LinksSectionData("Groups", Rel.SUB, group_kwarg=True)
117
+ GROUPS_SECTION_DATA = LinksSectionData("Groups", Rel.SUB, True)
121
118
  FACETS_SECTION_DATA = LinksSectionData(rel=Rel.FACET, links_key="links")
@@ -56,9 +56,9 @@ class OPDS2FeedView(OPDSAuthMixin, OPDS2PublicationView):
56
56
 
57
57
  # def _detect_user_agent(self):
58
58
  # """Hacks for individual clients."""
59
- # user_agent = self.request.headers.get("User-Agent") # noqa: ERA001
59
+ # user_agent = self.request.headers.get("User-Agent")
60
60
  # if not user_agent:
61
- # return # noqa: ERA001
61
+ # return
62
62
 
63
63
  @staticmethod
64
64
  def _is_allowed(link_spec):
@@ -185,7 +185,7 @@ class OPDS2FeedView(OPDSAuthMixin, OPDS2PublicationView):
185
185
  title = self._title(title)
186
186
  number_of_items = total_count
187
187
  current_page = self.kwargs.get("page")
188
- up_route = self.get_last_route(name=True)
188
+ up_route = self.get_last_route()
189
189
  links = self.get_links(up_route)
190
190
  facets = self._get_facets()
191
191
 
@@ -38,7 +38,7 @@ class OPDS2ProgressionView(
38
38
  @property
39
39
  def modified(self):
40
40
  """Get modified from bookmark."""
41
- return self._obj.bookmark_updated_at # type: ignore[reportAttributeAccessIssue]
41
+ return self._obj.bookmark_updated_at # type: ignore
42
42
 
43
43
  @property
44
44
  def device(self):
@@ -49,21 +49,22 @@ class OPDS2ProgressionView(
49
49
  @property
50
50
  def title(self):
51
51
  """The locator title is the page number."""
52
- return f"Page {self._obj.page}" # type: ignore[reportAttributeAccessIssue]
52
+ return f"Page {self._obj.page}" # type: ignore
53
53
 
54
54
  @property
55
55
  def _progression_href(self):
56
56
  """Build a Progression HRef."""
57
57
  acq_kwargs = {
58
58
  "pk": self._obj.pk,
59
- "page": self._obj.page, # type: ignore[reportAttributeAccessIssue]
59
+ "page": self._obj.page, # type: ignore
60
60
  }
61
- max_page = max_none(self._obj.page_count - 1, 0) # type: ignore[reportAttributeAccessIssue]
61
+ max_page = max_none(self._obj.page_count - 1, 0) # type: ignore
62
62
  data = HrefData(
63
63
  acq_kwargs,
64
64
  url_name="opds:bin:page",
65
65
  min_page=0,
66
- max_page=max_page,
66
+ max_page=max_page, # type: ignore
67
+ # absolute_query_params=True,
67
68
  )
68
69
  return self.href(data)
69
70
 
@@ -71,9 +72,9 @@ class OPDS2ProgressionView(
71
72
  def _locations(self):
72
73
  """Build the Locations object."""
73
74
  return {
74
- "position": self._obj.page, # type: ignore[reportAttributeAccessIssue]
75
- "progression": self._obj.progress, # type: ignore[reportAttributeAccessIssue]
76
- "total_progression": self._obj.progress, # type: ignore[reportAttributeAccessIssue]
75
+ "position": self._obj.page, # type: ignore
76
+ "progression": self._obj.progress, # type: ignore
77
+ "total_progression": self._obj.progress, # type: ignore
77
78
  }
78
79
 
79
80
  @property