codex 1.6.0a7__py3-none-any.whl → 1.6.0a8__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 (510) hide show
  1. codex/integrity.py +4 -4
  2. codex/librarian/importer/{aggregate_metadata.py → aggregate.py} +54 -76
  3. codex/librarian/importer/cache.py +162 -29
  4. codex/librarian/importer/const.py +15 -6
  5. codex/librarian/importer/create_comics.py +102 -17
  6. codex/librarian/importer/create_covers.py +98 -0
  7. codex/librarian/importer/create_fks.py +73 -170
  8. codex/librarian/importer/deleted.py +59 -46
  9. codex/librarian/importer/{clean_metadata.py → extract.py} +33 -4
  10. codex/librarian/importer/failed_imports.py +41 -62
  11. codex/librarian/importer/importer.py +96 -0
  12. codex/librarian/importer/importerd.py +71 -397
  13. codex/librarian/importer/init.py +265 -0
  14. codex/librarian/importer/link_comics.py +26 -81
  15. codex/librarian/importer/link_covers.py +73 -0
  16. codex/librarian/importer/moved.py +72 -96
  17. codex/librarian/importer/query_covers.py +52 -0
  18. codex/librarian/importer/query_fks.py +128 -172
  19. codex/librarian/importer/status.py +2 -39
  20. codex/librarian/importer/tasks.py +22 -13
  21. codex/librarian/janitor/cleanup.py +2 -2
  22. codex/librarian/janitor/janitor.py +10 -0
  23. codex/librarian/librariand.py +7 -1
  24. codex/migrations/0027_import_order_and_covers.py +345 -0
  25. codex/models/comic.py +1 -2
  26. codex/models/groups.py +3 -2
  27. codex/models/paths.py +0 -1
  28. codex/search/query.py +25 -2
  29. codex/search/writing.py +1 -1
  30. codex/serializers/browser/mixins.py +0 -18
  31. codex/serializers/browser/settings.py +2 -3
  32. codex/serializers/choices.py +10 -1
  33. codex/settings/settings.py +2 -2
  34. codex/static_root/assets/{VCheckbox-BOUtyxuo.c690f0cdbe48.js → VCheckbox-DI-DgMb4.8eeb1bd3e18b.js} +1 -1
  35. codex/static_root/assets/VCheckbox-DI-DgMb4.8eeb1bd3e18b.js.br +0 -0
  36. codex/static_root/assets/VCheckbox-DI-DgMb4.8eeb1bd3e18b.js.gz +0 -0
  37. codex/static_root/assets/{VCheckbox-BOUtyxuo.js → VCheckbox-DI-DgMb4.js} +1 -1
  38. codex/static_root/assets/VCheckbox-DI-DgMb4.js.br +0 -0
  39. codex/static_root/assets/VCheckbox-DI-DgMb4.js.gz +0 -0
  40. codex/static_root/assets/{VCheckboxBtn-B1-m5pEh.e2b8cbdb92c9.js → VCheckboxBtn-B8Z4NA-t.3d8921f98ad9.js} +1 -1
  41. codex/static_root/assets/VCheckboxBtn-B8Z4NA-t.3d8921f98ad9.js.br +0 -0
  42. codex/static_root/assets/VCheckboxBtn-B8Z4NA-t.3d8921f98ad9.js.gz +0 -0
  43. codex/static_root/assets/{VCheckboxBtn-B1-m5pEh.js → VCheckboxBtn-B8Z4NA-t.js} +1 -1
  44. codex/static_root/assets/VCheckboxBtn-B8Z4NA-t.js.br +0 -0
  45. codex/static_root/assets/VCheckboxBtn-B8Z4NA-t.js.gz +0 -0
  46. codex/static_root/assets/{VCombobox-DjkDXe33.22617ea193b1.js → VCombobox-D1_0lCri.6ef85a29c2dc.js} +1 -1
  47. codex/static_root/assets/VCombobox-D1_0lCri.6ef85a29c2dc.js.br +0 -0
  48. codex/static_root/assets/VCombobox-D1_0lCri.6ef85a29c2dc.js.gz +0 -0
  49. codex/static_root/assets/{VCombobox-DjkDXe33.js → VCombobox-D1_0lCri.js} +1 -1
  50. codex/static_root/assets/VCombobox-D1_0lCri.js.br +0 -0
  51. codex/static_root/assets/VCombobox-D1_0lCri.js.gz +0 -0
  52. codex/static_root/assets/{VDialog-X0zn9AGX.0d89c749b9a6.js → VDialog-opmV0YZz.d77216e97599.js} +1 -1
  53. codex/static_root/assets/VDialog-opmV0YZz.d77216e97599.js.br +0 -0
  54. codex/static_root/assets/VDialog-opmV0YZz.d77216e97599.js.gz +0 -0
  55. codex/static_root/assets/{VDialog-X0zn9AGX.js → VDialog-opmV0YZz.js} +1 -1
  56. codex/static_root/assets/VDialog-opmV0YZz.js.br +0 -0
  57. codex/static_root/assets/VDialog-opmV0YZz.js.gz +0 -0
  58. codex/static_root/assets/{VExpansionPanels-CRevojaF.43d65c777c58.js → VExpansionPanels-DX2dhUf5.ecc2ebfa62ec.js} +1 -1
  59. codex/static_root/assets/VExpansionPanels-DX2dhUf5.ecc2ebfa62ec.js.br +0 -0
  60. codex/static_root/assets/VExpansionPanels-DX2dhUf5.ecc2ebfa62ec.js.gz +0 -0
  61. codex/static_root/assets/{VExpansionPanels-CRevojaF.js → VExpansionPanels-DX2dhUf5.js} +1 -1
  62. codex/static_root/assets/VExpansionPanels-DX2dhUf5.js.br +0 -0
  63. codex/static_root/assets/VExpansionPanels-DX2dhUf5.js.gz +0 -0
  64. codex/static_root/assets/{VRadioGroup-8nrrxjDv.2b4dfb984a8c.js → VRadioGroup-BGa6_q5a.d1a3ad7266bd.js} +1 -1
  65. codex/static_root/assets/VRadioGroup-BGa6_q5a.d1a3ad7266bd.js.br +0 -0
  66. codex/static_root/assets/VRadioGroup-BGa6_q5a.d1a3ad7266bd.js.gz +0 -0
  67. codex/static_root/assets/{VRadioGroup-8nrrxjDv.js → VRadioGroup-BGa6_q5a.js} +1 -1
  68. codex/static_root/assets/VRadioGroup-BGa6_q5a.js.br +0 -0
  69. codex/static_root/assets/VRadioGroup-BGa6_q5a.js.gz +0 -0
  70. codex/static_root/assets/VSelect-ARDhJiQK.372c098fb475.css +1 -0
  71. codex/static_root/assets/VSelect-ARDhJiQK.372c098fb475.css.br +0 -0
  72. codex/static_root/assets/VSelect-ARDhJiQK.372c098fb475.css.gz +0 -0
  73. codex/static_root/assets/VSelect-ARDhJiQK.css +1 -0
  74. codex/static_root/assets/VSelect-ARDhJiQK.css.br +0 -0
  75. codex/static_root/assets/VSelect-ARDhJiQK.css.gz +0 -0
  76. codex/static_root/assets/VSelect-sIYW_-ud.7d40da0ec3ff.js +1 -0
  77. codex/static_root/assets/VSelect-sIYW_-ud.7d40da0ec3ff.js.br +0 -0
  78. codex/static_root/assets/VSelect-sIYW_-ud.7d40da0ec3ff.js.gz +0 -0
  79. codex/static_root/assets/VSelect-sIYW_-ud.js +1 -0
  80. codex/static_root/assets/VSelect-sIYW_-ud.js.br +0 -0
  81. codex/static_root/assets/VSelect-sIYW_-ud.js.gz +0 -0
  82. codex/static_root/assets/{VSelectionControl-CGu0oz0K.3030b7a270d6.js → VSelectionControl-C8DP9rgp.ef80e8e3dfc1.js} +1 -1
  83. codex/static_root/assets/VSelectionControl-C8DP9rgp.ef80e8e3dfc1.js.br +0 -0
  84. codex/static_root/assets/VSelectionControl-C8DP9rgp.ef80e8e3dfc1.js.gz +0 -0
  85. codex/static_root/assets/{VSelectionControl-CGu0oz0K.js → VSelectionControl-C8DP9rgp.js} +1 -1
  86. codex/static_root/assets/VSelectionControl-C8DP9rgp.js.br +0 -0
  87. codex/static_root/assets/VSelectionControl-C8DP9rgp.js.gz +0 -0
  88. codex/static_root/assets/{VSlideGroup-D_oNvCOd.js → VSlideGroup-BRYhkLH8.3534ec94b2f1.js} +1 -1
  89. codex/static_root/assets/VSlideGroup-BRYhkLH8.3534ec94b2f1.js.br +0 -0
  90. codex/static_root/assets/VSlideGroup-BRYhkLH8.3534ec94b2f1.js.gz +0 -0
  91. codex/static_root/assets/{VSlideGroup-D_oNvCOd.71a7101cdddd.js → VSlideGroup-BRYhkLH8.js} +1 -1
  92. codex/static_root/assets/VSlideGroup-BRYhkLH8.js.br +0 -0
  93. codex/static_root/assets/VSlideGroup-BRYhkLH8.js.gz +0 -0
  94. codex/static_root/assets/{VTable-C7pKI7gU.087912f706f5.js → VTable-D1esKtlw.52165930e3b9.js} +1 -1
  95. codex/static_root/assets/VTable-D1esKtlw.52165930e3b9.js.br +0 -0
  96. codex/static_root/assets/VTable-D1esKtlw.52165930e3b9.js.gz +0 -0
  97. codex/static_root/assets/{VTable-C7pKI7gU.js → VTable-D1esKtlw.js} +1 -1
  98. codex/static_root/assets/VTable-D1esKtlw.js.br +0 -0
  99. codex/static_root/assets/VTable-D1esKtlw.js.gz +0 -0
  100. codex/static_root/assets/VTextField-BnGscKcY.54032adf3a4b.js +1 -0
  101. codex/static_root/assets/VTextField-BnGscKcY.54032adf3a4b.js.br +0 -0
  102. codex/static_root/assets/VTextField-BnGscKcY.54032adf3a4b.js.gz +0 -0
  103. codex/static_root/assets/VTextField-BnGscKcY.js +1 -0
  104. codex/static_root/assets/VTextField-BnGscKcY.js.br +0 -0
  105. codex/static_root/assets/VTextField-BnGscKcY.js.gz +0 -0
  106. codex/static_root/assets/{VWindowItem-iyZ1XOkP.409f7d292253.js → VWindowItem-B0KokcAk.ea94224aecb9.js} +1 -1
  107. codex/static_root/assets/VWindowItem-B0KokcAk.ea94224aecb9.js.br +0 -0
  108. codex/static_root/assets/VWindowItem-B0KokcAk.ea94224aecb9.js.gz +0 -0
  109. codex/static_root/assets/{VWindowItem-iyZ1XOkP.js → VWindowItem-B0KokcAk.js} +1 -1
  110. codex/static_root/assets/VWindowItem-B0KokcAk.js.br +0 -0
  111. codex/static_root/assets/VWindowItem-B0KokcAk.js.gz +0 -0
  112. codex/static_root/assets/{admin-B0pCBjma.2407da79bd20.js → admin-Y0bL21AB.42d4f0d68163.js} +1 -1
  113. codex/static_root/assets/admin-Y0bL21AB.42d4f0d68163.js.br +0 -0
  114. codex/static_root/assets/admin-Y0bL21AB.42d4f0d68163.js.gz +0 -0
  115. codex/static_root/assets/{admin-B0pCBjma.js → admin-Y0bL21AB.js} +1 -1
  116. codex/static_root/assets/admin-Y0bL21AB.js.br +0 -0
  117. codex/static_root/assets/admin-Y0bL21AB.js.gz +0 -0
  118. codex/static_root/assets/{admin-drawer-panel-BxoNUHQr.5e2e1a4a255d.js → admin-drawer-panel-DNngWUEM.4e992e3fe86e.js} +11 -11
  119. codex/static_root/assets/admin-drawer-panel-DNngWUEM.4e992e3fe86e.js.br +0 -0
  120. codex/static_root/assets/admin-drawer-panel-DNngWUEM.4e992e3fe86e.js.gz +0 -0
  121. codex/static_root/assets/{admin-drawer-panel-BxoNUHQr.js → admin-drawer-panel-DNngWUEM.js} +11 -11
  122. codex/static_root/assets/admin-drawer-panel-DNngWUEM.js.br +0 -0
  123. codex/static_root/assets/admin-drawer-panel-DNngWUEM.js.gz +0 -0
  124. codex/static_root/assets/browser-CMAtBCLx.17a277ce43a9.css +1 -0
  125. codex/static_root/assets/browser-CMAtBCLx.17a277ce43a9.css.br +0 -0
  126. codex/static_root/assets/browser-CMAtBCLx.17a277ce43a9.css.gz +0 -0
  127. codex/static_root/assets/browser-CMAtBCLx.css +1 -0
  128. codex/static_root/assets/browser-CMAtBCLx.css.br +0 -0
  129. codex/static_root/assets/browser-CMAtBCLx.css.gz +0 -0
  130. codex/static_root/assets/browser-DoJk8uvb.2c97a3858932.js +1 -0
  131. codex/static_root/assets/browser-DoJk8uvb.2c97a3858932.js.br +0 -0
  132. codex/static_root/assets/browser-DoJk8uvb.2c97a3858932.js.gz +0 -0
  133. codex/static_root/assets/browser-DoJk8uvb.js +1 -0
  134. codex/static_root/assets/browser-DoJk8uvb.js.br +0 -0
  135. codex/static_root/assets/browser-DoJk8uvb.js.gz +0 -0
  136. codex/static_root/assets/{change-password-dialog-DZ9dP8_F.js → change-password-dialog-CH4xbjJa.b749aa6ea07e.js} +1 -1
  137. codex/static_root/assets/change-password-dialog-CH4xbjJa.b749aa6ea07e.js.br +0 -0
  138. codex/static_root/assets/change-password-dialog-CH4xbjJa.b749aa6ea07e.js.gz +0 -0
  139. codex/static_root/assets/{change-password-dialog-DZ9dP8_F.930f4cae3cb0.js → change-password-dialog-CH4xbjJa.js} +1 -1
  140. codex/static_root/assets/change-password-dialog-CH4xbjJa.js.br +0 -0
  141. codex/static_root/assets/change-password-dialog-CH4xbjJa.js.gz +0 -0
  142. codex/static_root/assets/{confirm-dialog-RP7JNStF.a752a7c1e697.js → confirm-dialog-DkU0twE6.a20006aa5ba6.js} +1 -1
  143. codex/static_root/assets/{confirm-dialog-RP7JNStF.a752a7c1e697.js.br → confirm-dialog-DkU0twE6.a20006aa5ba6.js.br} +0 -0
  144. codex/static_root/assets/confirm-dialog-DkU0twE6.a20006aa5ba6.js.gz +0 -0
  145. codex/static_root/assets/{confirm-dialog-RP7JNStF.js → confirm-dialog-DkU0twE6.js} +1 -1
  146. codex/static_root/assets/{confirm-dialog-RP7JNStF.js.br → confirm-dialog-DkU0twE6.js.br} +0 -0
  147. codex/static_root/assets/confirm-dialog-DkU0twE6.js.gz +0 -0
  148. codex/static_root/assets/datetime-column-BfW_j_3Q.6a614321a435.js +1 -0
  149. codex/static_root/assets/datetime-column-BfW_j_3Q.6a614321a435.js.br +0 -0
  150. codex/static_root/assets/datetime-column-BfW_j_3Q.6a614321a435.js.gz +0 -0
  151. codex/static_root/assets/datetime-column-BfW_j_3Q.js +1 -0
  152. codex/static_root/assets/datetime-column-BfW_j_3Q.js.br +0 -0
  153. codex/static_root/assets/datetime-column-BfW_j_3Q.js.gz +0 -0
  154. codex/static_root/assets/datetime-column-DeCthByU.1f3bf499e063.css +1 -0
  155. codex/static_root/assets/datetime-column-DeCthByU.css +1 -0
  156. codex/static_root/assets/{filter-DAdGUt-1.3261cbcd50b5.js → filter-DjxN78cK.35673f6e49b1.js} +1 -1
  157. codex/static_root/assets/filter-DjxN78cK.35673f6e49b1.js.br +0 -0
  158. codex/static_root/assets/filter-DjxN78cK.35673f6e49b1.js.gz +0 -0
  159. codex/static_root/assets/{filter-DAdGUt-1.js → filter-DjxN78cK.js} +1 -1
  160. codex/static_root/assets/filter-DjxN78cK.js.br +0 -0
  161. codex/static_root/assets/filter-DjxN78cK.js.gz +0 -0
  162. codex/static_root/assets/flag-tab-D4ZNSbMR.e763a9937701.js +1 -0
  163. codex/static_root/assets/flag-tab-D4ZNSbMR.e763a9937701.js.br +0 -0
  164. codex/static_root/assets/flag-tab-D4ZNSbMR.e763a9937701.js.gz +0 -0
  165. codex/static_root/assets/flag-tab-D4ZNSbMR.js +1 -0
  166. codex/static_root/assets/flag-tab-D4ZNSbMR.js.br +0 -0
  167. codex/static_root/assets/flag-tab-D4ZNSbMR.js.gz +0 -0
  168. codex/static_root/assets/{group-tab-DEwh4jfB.a95097b5e320.js → group-tab-DucpNoBs.a6f37ae940c0.js} +1 -1
  169. codex/static_root/assets/group-tab-DucpNoBs.a6f37ae940c0.js.br +0 -0
  170. codex/static_root/assets/group-tab-DucpNoBs.a6f37ae940c0.js.gz +0 -0
  171. codex/static_root/assets/{group-tab-DEwh4jfB.js → group-tab-DucpNoBs.js} +1 -1
  172. codex/static_root/assets/group-tab-DucpNoBs.js.br +0 -0
  173. codex/static_root/assets/group-tab-DucpNoBs.js.gz +0 -0
  174. codex/static_root/assets/http-error-Cj0hTq-c.062a88ddd4dc.js +1 -0
  175. codex/static_root/assets/http-error-Cj0hTq-c.062a88ddd4dc.js.br +0 -0
  176. codex/static_root/assets/http-error-Cj0hTq-c.062a88ddd4dc.js.gz +0 -0
  177. codex/static_root/assets/http-error-Cj0hTq-c.js +1 -0
  178. codex/static_root/assets/http-error-Cj0hTq-c.js.br +0 -0
  179. codex/static_root/assets/http-error-Cj0hTq-c.js.gz +0 -0
  180. codex/static_root/assets/{library-tab-DrXvD9B2.js → library-tab-CzksdS3Q.566acdb45dec.js} +1 -1
  181. codex/static_root/assets/library-tab-CzksdS3Q.566acdb45dec.js.br +0 -0
  182. codex/static_root/assets/library-tab-CzksdS3Q.566acdb45dec.js.gz +0 -0
  183. codex/static_root/assets/{library-tab-DrXvD9B2.f765f9d3bae4.js → library-tab-CzksdS3Q.js} +1 -1
  184. codex/static_root/assets/library-tab-CzksdS3Q.js.br +0 -0
  185. codex/static_root/assets/library-tab-CzksdS3Q.js.gz +0 -0
  186. codex/static_root/assets/main-DX-k2724.f73d08e9ad64.js +32 -0
  187. codex/static_root/assets/main-DX-k2724.f73d08e9ad64.js.br +0 -0
  188. codex/static_root/assets/main-DX-k2724.f73d08e9ad64.js.gz +0 -0
  189. codex/static_root/assets/main-DX-k2724.js +32 -0
  190. codex/static_root/assets/main-DX-k2724.js.br +0 -0
  191. codex/static_root/assets/main-DX-k2724.js.gz +0 -0
  192. codex/static_root/assets/pagination-toolbar-CQcR0a3T.7a2d33ed8c39.js +1 -0
  193. codex/static_root/assets/pagination-toolbar-CQcR0a3T.7a2d33ed8c39.js.br +0 -0
  194. codex/static_root/assets/pagination-toolbar-CQcR0a3T.7a2d33ed8c39.js.gz +0 -0
  195. codex/static_root/assets/pagination-toolbar-CQcR0a3T.js +1 -0
  196. codex/static_root/assets/pagination-toolbar-CQcR0a3T.js.br +0 -0
  197. codex/static_root/assets/pagination-toolbar-CQcR0a3T.js.gz +0 -0
  198. codex/static_root/assets/pagination-toolbar-DWdp_kmz.css +1 -0
  199. codex/static_root/assets/pagination-toolbar-DWdp_kmz.css.br +0 -0
  200. codex/static_root/assets/pagination-toolbar-DWdp_kmz.css.gz +0 -0
  201. codex/static_root/assets/pagination-toolbar-DWdp_kmz.f98f47e87612.css +1 -0
  202. codex/static_root/assets/pagination-toolbar-DWdp_kmz.f98f47e87612.css.br +0 -0
  203. codex/static_root/assets/pagination-toolbar-DWdp_kmz.f98f47e87612.css.gz +0 -0
  204. codex/static_root/assets/{pdf-doc-obrBwxa6.ec9bd13a5786.js → pdf-doc-GkMk4o5L.ef24c859a7a4.js} +1 -1
  205. codex/static_root/assets/pdf-doc-GkMk4o5L.ef24c859a7a4.js.br +0 -0
  206. codex/static_root/assets/pdf-doc-GkMk4o5L.ef24c859a7a4.js.gz +0 -0
  207. codex/static_root/assets/{pdf-doc-obrBwxa6.js → pdf-doc-GkMk4o5L.js} +1 -1
  208. codex/static_root/assets/pdf-doc-GkMk4o5L.js.br +0 -0
  209. codex/static_root/assets/pdf-doc-GkMk4o5L.js.gz +0 -0
  210. codex/static_root/assets/reader-CCCfpM3x.1553e45bd775.css +1 -0
  211. codex/static_root/assets/reader-CCCfpM3x.1553e45bd775.css.br +0 -0
  212. codex/static_root/assets/reader-CCCfpM3x.1553e45bd775.css.gz +0 -0
  213. codex/static_root/assets/reader-CCCfpM3x.css +1 -0
  214. codex/static_root/assets/reader-CCCfpM3x.css.br +0 -0
  215. codex/static_root/assets/reader-CCCfpM3x.css.gz +0 -0
  216. codex/static_root/assets/reader-Cl6mmQB_.7b9e7591954f.js +2 -0
  217. codex/static_root/assets/reader-Cl6mmQB_.7b9e7591954f.js.br +0 -0
  218. codex/static_root/assets/reader-Cl6mmQB_.7b9e7591954f.js.gz +0 -0
  219. codex/static_root/assets/reader-Cl6mmQB_.js +2 -0
  220. codex/static_root/assets/reader-Cl6mmQB_.js.br +0 -0
  221. codex/static_root/assets/reader-Cl6mmQB_.js.gz +0 -0
  222. codex/static_root/assets/{relation-chips-CZJcLjc8.1d7426dab654.js → relation-chips-CZ8VvR4y.d4232f3c2518.js} +1 -1
  223. codex/static_root/assets/relation-chips-CZ8VvR4y.d4232f3c2518.js.br +0 -0
  224. codex/static_root/assets/relation-chips-CZ8VvR4y.d4232f3c2518.js.gz +0 -0
  225. codex/static_root/assets/{relation-chips-CZJcLjc8.js → relation-chips-CZ8VvR4y.js} +1 -1
  226. codex/static_root/assets/relation-chips-CZ8VvR4y.js.br +0 -0
  227. codex/static_root/assets/relation-chips-CZ8VvR4y.js.gz +0 -0
  228. codex/static_root/assets/{settings-drawer-7iTnAdjf.337eecf2fdbb.js → settings-drawer-DyS0A2pN.17a98928589f.js} +2 -2
  229. codex/static_root/assets/settings-drawer-DyS0A2pN.17a98928589f.js.br +0 -0
  230. codex/static_root/assets/settings-drawer-DyS0A2pN.17a98928589f.js.gz +0 -0
  231. codex/static_root/assets/{settings-drawer-7iTnAdjf.js → settings-drawer-DyS0A2pN.js} +2 -2
  232. codex/static_root/assets/settings-drawer-DyS0A2pN.js.br +0 -0
  233. codex/static_root/assets/settings-drawer-DyS0A2pN.js.gz +0 -0
  234. codex/static_root/assets/{stats-tab-CQsK1n8O.544bf50ffb22.js → stats-tab-R3Ekobfm.70fa09a67518.js} +1 -1
  235. codex/static_root/assets/stats-tab-R3Ekobfm.70fa09a67518.js.br +0 -0
  236. codex/static_root/assets/stats-tab-R3Ekobfm.70fa09a67518.js.gz +0 -0
  237. codex/static_root/assets/{stats-tab-CQsK1n8O.js → stats-tab-R3Ekobfm.js} +1 -1
  238. codex/static_root/assets/stats-tab-R3Ekobfm.js.br +0 -0
  239. codex/static_root/assets/stats-tab-R3Ekobfm.js.gz +0 -0
  240. codex/static_root/assets/task-tab-BhLDK_7Q.28ff51b3ed01.js +1 -0
  241. codex/static_root/assets/task-tab-BhLDK_7Q.28ff51b3ed01.js.br +0 -0
  242. codex/static_root/assets/task-tab-BhLDK_7Q.28ff51b3ed01.js.gz +0 -0
  243. codex/static_root/assets/task-tab-BhLDK_7Q.js +1 -0
  244. codex/static_root/assets/task-tab-BhLDK_7Q.js.br +0 -0
  245. codex/static_root/assets/task-tab-BhLDK_7Q.js.gz +0 -0
  246. codex/static_root/assets/to-case-BR2frjFx.87de5d7a0503.js +1 -0
  247. codex/static_root/assets/to-case-BR2frjFx.js +1 -0
  248. codex/static_root/assets/{unauthorized-Bs7NSqea.c55650fac055.js → unauthorized-BbXjAe5l.d48912d34a68.js} +1 -1
  249. codex/static_root/assets/unauthorized-BbXjAe5l.d48912d34a68.js.br +0 -0
  250. codex/static_root/assets/unauthorized-BbXjAe5l.d48912d34a68.js.gz +0 -0
  251. codex/static_root/assets/{unauthorized-Bs7NSqea.js → unauthorized-BbXjAe5l.js} +1 -1
  252. codex/static_root/assets/unauthorized-BbXjAe5l.js.br +0 -0
  253. codex/static_root/assets/unauthorized-BbXjAe5l.js.gz +0 -0
  254. codex/static_root/assets/{user-tab-ChuH7Atm.7e80cf1fb78e.js → user-tab-DxITIl2d.d79d7f062930.js} +1 -1
  255. codex/static_root/assets/user-tab-DxITIl2d.d79d7f062930.js.br +0 -0
  256. codex/static_root/assets/user-tab-DxITIl2d.d79d7f062930.js.gz +0 -0
  257. codex/static_root/assets/{user-tab-ChuH7Atm.js → user-tab-DxITIl2d.js} +1 -1
  258. codex/static_root/assets/user-tab-DxITIl2d.js.br +0 -0
  259. codex/static_root/assets/user-tab-DxITIl2d.js.gz +0 -0
  260. codex/static_root/js/choices-admin.d790df01c20a.json +1 -0
  261. codex/static_root/js/choices-admin.d790df01c20a.json.br +0 -0
  262. codex/static_root/js/choices-admin.d790df01c20a.json.gz +0 -0
  263. codex/static_root/js/choices-admin.json +1 -1
  264. codex/static_root/js/choices-admin.json.br +0 -0
  265. codex/static_root/js/choices-admin.json.gz +0 -0
  266. codex/static_root/js/{choices.079a01e0be1a.json → choices.a0aaaa6c7ef7.json} +1 -1
  267. codex/static_root/js/choices.a0aaaa6c7ef7.json.br +0 -0
  268. codex/static_root/js/choices.a0aaaa6c7ef7.json.gz +0 -0
  269. codex/static_root/js/choices.json +1 -1
  270. codex/static_root/js/choices.json.br +0 -0
  271. codex/static_root/js/choices.json.gz +0 -0
  272. codex/static_root/{manifest.dad79c8475ae.json → manifest.16d52597ef50.json} +239 -239
  273. codex/static_root/manifest.16d52597ef50.json.br +0 -0
  274. codex/static_root/manifest.16d52597ef50.json.gz +0 -0
  275. codex/static_root/manifest.json +239 -239
  276. codex/static_root/manifest.json.br +0 -0
  277. codex/static_root/manifest.json.gz +0 -0
  278. codex/static_root/staticfiles.json +1 -1
  279. codex/urls/api/browser.py +11 -2
  280. codex/urls/api/reader.py +1 -7
  281. codex/urls/opds/binary.py +1 -1
  282. codex/views/admin/auth.py +0 -2
  283. codex/views/admin/tasks.py +13 -1
  284. codex/views/auth.py +2 -4
  285. codex/views/browser/annotations.py +27 -148
  286. codex/views/browser/base.py +1 -18
  287. codex/views/browser/breadcrumbs.py +16 -14
  288. codex/views/browser/browser.py +5 -10
  289. codex/views/browser/choices.py +15 -39
  290. codex/views/browser/cover.py +177 -0
  291. codex/views/browser/filters/annotations.py +23 -22
  292. codex/views/browser/filters/field.py +1 -2
  293. codex/views/browser/filters/group.py +13 -8
  294. codex/views/browser/filters/search.py +19 -10
  295. codex/views/browser/metadata.py +20 -25
  296. codex/views/const.py +12 -0
  297. codex/views/mtime.py +14 -12
  298. codex/views/opds/binary.py +1 -1
  299. codex/views/opds/urls.py +2 -1
  300. codex/views/opds/util.py +2 -4
  301. codex/views/opds/v1/entry/links.py +18 -33
  302. codex/views/opds/v1/facets.py +2 -1
  303. codex/views/opds/v1/feed.py +42 -23
  304. codex/views/opds/v1/links.py +2 -1
  305. codex/views/opds/v2/feed.py +11 -9
  306. codex/views/opds/v2/links.py +2 -1
  307. codex/views/opds/v2/publications.py +13 -34
  308. codex/views/public.py +0 -2
  309. codex/views/reader/books.py +1 -1
  310. codex/views/reader/reader.py +2 -2
  311. codex/views/session.py +5 -3
  312. codex/views/util.py +32 -0
  313. {codex-1.6.0a7.dist-info → codex-1.6.0a8.dist-info}/METADATA +8 -7
  314. {codex-1.6.0a7.dist-info → codex-1.6.0a8.dist-info}/RECORD +317 -318
  315. codex/librarian/importer/update_comics.py +0 -85
  316. codex/migrations/0027_sort_name.py +0 -139
  317. codex/migrations/0028_custom_covers.py +0 -166
  318. codex/migrations/0029_choices_adminflag_and_timestamp.py +0 -44
  319. codex/static_root/assets/VCheckbox-BOUtyxuo.c690f0cdbe48.js.br +0 -0
  320. codex/static_root/assets/VCheckbox-BOUtyxuo.c690f0cdbe48.js.gz +0 -0
  321. codex/static_root/assets/VCheckbox-BOUtyxuo.js.br +0 -0
  322. codex/static_root/assets/VCheckbox-BOUtyxuo.js.gz +0 -0
  323. codex/static_root/assets/VCheckboxBtn-B1-m5pEh.e2b8cbdb92c9.js.br +0 -0
  324. codex/static_root/assets/VCheckboxBtn-B1-m5pEh.e2b8cbdb92c9.js.gz +0 -0
  325. codex/static_root/assets/VCheckboxBtn-B1-m5pEh.js.br +0 -0
  326. codex/static_root/assets/VCheckboxBtn-B1-m5pEh.js.gz +0 -0
  327. codex/static_root/assets/VCombobox-DjkDXe33.22617ea193b1.js.br +0 -0
  328. codex/static_root/assets/VCombobox-DjkDXe33.22617ea193b1.js.gz +0 -0
  329. codex/static_root/assets/VCombobox-DjkDXe33.js.br +0 -0
  330. codex/static_root/assets/VCombobox-DjkDXe33.js.gz +0 -0
  331. codex/static_root/assets/VDialog-X0zn9AGX.0d89c749b9a6.js.br +0 -0
  332. codex/static_root/assets/VDialog-X0zn9AGX.0d89c749b9a6.js.gz +0 -0
  333. codex/static_root/assets/VDialog-X0zn9AGX.js.br +0 -0
  334. codex/static_root/assets/VDialog-X0zn9AGX.js.gz +0 -0
  335. codex/static_root/assets/VExpansionPanels-CRevojaF.43d65c777c58.js.br +0 -0
  336. codex/static_root/assets/VExpansionPanels-CRevojaF.43d65c777c58.js.gz +0 -0
  337. codex/static_root/assets/VExpansionPanels-CRevojaF.js.br +0 -0
  338. codex/static_root/assets/VExpansionPanels-CRevojaF.js.gz +0 -0
  339. codex/static_root/assets/VRadioGroup-8nrrxjDv.2b4dfb984a8c.js.br +0 -0
  340. codex/static_root/assets/VRadioGroup-8nrrxjDv.2b4dfb984a8c.js.gz +0 -0
  341. codex/static_root/assets/VRadioGroup-8nrrxjDv.js.br +0 -0
  342. codex/static_root/assets/VRadioGroup-8nrrxjDv.js.gz +0 -0
  343. codex/static_root/assets/VSelect-DgfIKRnC.fa7a73a9c415.js +0 -1
  344. codex/static_root/assets/VSelect-DgfIKRnC.fa7a73a9c415.js.br +0 -0
  345. codex/static_root/assets/VSelect-DgfIKRnC.fa7a73a9c415.js.gz +0 -0
  346. codex/static_root/assets/VSelect-DgfIKRnC.js +0 -1
  347. codex/static_root/assets/VSelect-DgfIKRnC.js.br +0 -0
  348. codex/static_root/assets/VSelect-DgfIKRnC.js.gz +0 -0
  349. codex/static_root/assets/VSelect-MGVSeLgr.7cabd30bc5e4.css +0 -1
  350. codex/static_root/assets/VSelect-MGVSeLgr.7cabd30bc5e4.css.br +0 -0
  351. codex/static_root/assets/VSelect-MGVSeLgr.7cabd30bc5e4.css.gz +0 -0
  352. codex/static_root/assets/VSelect-MGVSeLgr.css +0 -1
  353. codex/static_root/assets/VSelect-MGVSeLgr.css.br +0 -0
  354. codex/static_root/assets/VSelect-MGVSeLgr.css.gz +0 -0
  355. codex/static_root/assets/VSelectionControl-CGu0oz0K.3030b7a270d6.js.br +0 -0
  356. codex/static_root/assets/VSelectionControl-CGu0oz0K.3030b7a270d6.js.gz +0 -0
  357. codex/static_root/assets/VSelectionControl-CGu0oz0K.js.br +0 -0
  358. codex/static_root/assets/VSelectionControl-CGu0oz0K.js.gz +0 -0
  359. codex/static_root/assets/VSlideGroup-D_oNvCOd.71a7101cdddd.js.br +0 -0
  360. codex/static_root/assets/VSlideGroup-D_oNvCOd.71a7101cdddd.js.gz +0 -0
  361. codex/static_root/assets/VSlideGroup-D_oNvCOd.js.br +0 -0
  362. codex/static_root/assets/VSlideGroup-D_oNvCOd.js.gz +0 -0
  363. codex/static_root/assets/VTable-C7pKI7gU.087912f706f5.js.br +0 -0
  364. codex/static_root/assets/VTable-C7pKI7gU.087912f706f5.js.gz +0 -0
  365. codex/static_root/assets/VTable-C7pKI7gU.js.br +0 -0
  366. codex/static_root/assets/VTable-C7pKI7gU.js.gz +0 -0
  367. codex/static_root/assets/VTextField-Bs8oq9mk.7999fef12a03.js +0 -1
  368. codex/static_root/assets/VTextField-Bs8oq9mk.7999fef12a03.js.br +0 -0
  369. codex/static_root/assets/VTextField-Bs8oq9mk.7999fef12a03.js.gz +0 -0
  370. codex/static_root/assets/VTextField-Bs8oq9mk.js +0 -1
  371. codex/static_root/assets/VTextField-Bs8oq9mk.js.br +0 -0
  372. codex/static_root/assets/VTextField-Bs8oq9mk.js.gz +0 -0
  373. codex/static_root/assets/VWindowItem-iyZ1XOkP.409f7d292253.js.br +0 -0
  374. codex/static_root/assets/VWindowItem-iyZ1XOkP.409f7d292253.js.gz +0 -0
  375. codex/static_root/assets/VWindowItem-iyZ1XOkP.js.br +0 -0
  376. codex/static_root/assets/VWindowItem-iyZ1XOkP.js.gz +0 -0
  377. codex/static_root/assets/admin-B0pCBjma.2407da79bd20.js.br +0 -0
  378. codex/static_root/assets/admin-B0pCBjma.2407da79bd20.js.gz +0 -0
  379. codex/static_root/assets/admin-B0pCBjma.js.br +0 -0
  380. codex/static_root/assets/admin-B0pCBjma.js.gz +0 -0
  381. codex/static_root/assets/admin-drawer-panel-BxoNUHQr.5e2e1a4a255d.js.br +0 -0
  382. codex/static_root/assets/admin-drawer-panel-BxoNUHQr.5e2e1a4a255d.js.gz +0 -0
  383. codex/static_root/assets/admin-drawer-panel-BxoNUHQr.js.br +0 -0
  384. codex/static_root/assets/admin-drawer-panel-BxoNUHQr.js.gz +0 -0
  385. codex/static_root/assets/browser-DbyAjCNh.577a228a966b.js +0 -1
  386. codex/static_root/assets/browser-DbyAjCNh.577a228a966b.js.br +0 -0
  387. codex/static_root/assets/browser-DbyAjCNh.577a228a966b.js.gz +0 -0
  388. codex/static_root/assets/browser-DbyAjCNh.js +0 -1
  389. codex/static_root/assets/browser-DbyAjCNh.js.br +0 -0
  390. codex/static_root/assets/browser-DbyAjCNh.js.gz +0 -0
  391. codex/static_root/assets/browser-VnzNj1t3.cff861ad2ca3.css +0 -1
  392. codex/static_root/assets/browser-VnzNj1t3.cff861ad2ca3.css.br +0 -0
  393. codex/static_root/assets/browser-VnzNj1t3.cff861ad2ca3.css.gz +0 -0
  394. codex/static_root/assets/browser-VnzNj1t3.css +0 -1
  395. codex/static_root/assets/browser-VnzNj1t3.css.br +0 -0
  396. codex/static_root/assets/browser-VnzNj1t3.css.gz +0 -0
  397. codex/static_root/assets/change-password-dialog-DZ9dP8_F.930f4cae3cb0.js.br +0 -0
  398. codex/static_root/assets/change-password-dialog-DZ9dP8_F.930f4cae3cb0.js.gz +0 -0
  399. codex/static_root/assets/change-password-dialog-DZ9dP8_F.js.br +0 -0
  400. codex/static_root/assets/change-password-dialog-DZ9dP8_F.js.gz +0 -0
  401. codex/static_root/assets/confirm-dialog-RP7JNStF.a752a7c1e697.js.gz +0 -0
  402. codex/static_root/assets/confirm-dialog-RP7JNStF.js.gz +0 -0
  403. codex/static_root/assets/datetime-column-Cu3WYyPj.54b4c3817b74.js +0 -1
  404. codex/static_root/assets/datetime-column-Cu3WYyPj.54b4c3817b74.js.br +0 -0
  405. codex/static_root/assets/datetime-column-Cu3WYyPj.54b4c3817b74.js.gz +0 -0
  406. codex/static_root/assets/datetime-column-Cu3WYyPj.js +0 -1
  407. codex/static_root/assets/datetime-column-Cu3WYyPj.js.br +0 -0
  408. codex/static_root/assets/datetime-column-Cu3WYyPj.js.gz +0 -0
  409. codex/static_root/assets/datetime-column-Dg_RxTVM.1fa7c5cbead7.css +0 -1
  410. codex/static_root/assets/datetime-column-Dg_RxTVM.1fa7c5cbead7.css.br +0 -0
  411. codex/static_root/assets/datetime-column-Dg_RxTVM.css +0 -1
  412. codex/static_root/assets/datetime-column-Dg_RxTVM.css.br +0 -0
  413. codex/static_root/assets/filter-DAdGUt-1.3261cbcd50b5.js.br +0 -0
  414. codex/static_root/assets/filter-DAdGUt-1.3261cbcd50b5.js.gz +0 -0
  415. codex/static_root/assets/filter-DAdGUt-1.js.br +0 -0
  416. codex/static_root/assets/filter-DAdGUt-1.js.gz +0 -0
  417. codex/static_root/assets/flag-tab-BP7Zs7iQ.cb16ef6363d4.js +0 -1
  418. codex/static_root/assets/flag-tab-BP7Zs7iQ.cb16ef6363d4.js.br +0 -0
  419. codex/static_root/assets/flag-tab-BP7Zs7iQ.cb16ef6363d4.js.gz +0 -0
  420. codex/static_root/assets/flag-tab-BP7Zs7iQ.js +0 -1
  421. codex/static_root/assets/flag-tab-BP7Zs7iQ.js.br +0 -0
  422. codex/static_root/assets/flag-tab-BP7Zs7iQ.js.gz +0 -0
  423. codex/static_root/assets/group-tab-DEwh4jfB.a95097b5e320.js.br +0 -0
  424. codex/static_root/assets/group-tab-DEwh4jfB.a95097b5e320.js.gz +0 -0
  425. codex/static_root/assets/group-tab-DEwh4jfB.js.br +0 -0
  426. codex/static_root/assets/group-tab-DEwh4jfB.js.gz +0 -0
  427. codex/static_root/assets/http-error-xs3mIL8U.e143c472a96c.js +0 -1
  428. codex/static_root/assets/http-error-xs3mIL8U.e143c472a96c.js.br +0 -0
  429. codex/static_root/assets/http-error-xs3mIL8U.e143c472a96c.js.gz +0 -0
  430. codex/static_root/assets/http-error-xs3mIL8U.js +0 -1
  431. codex/static_root/assets/http-error-xs3mIL8U.js.br +0 -0
  432. codex/static_root/assets/http-error-xs3mIL8U.js.gz +0 -0
  433. codex/static_root/assets/library-tab-DrXvD9B2.f765f9d3bae4.js.br +0 -0
  434. codex/static_root/assets/library-tab-DrXvD9B2.f765f9d3bae4.js.gz +0 -0
  435. codex/static_root/assets/library-tab-DrXvD9B2.js.br +0 -0
  436. codex/static_root/assets/library-tab-DrXvD9B2.js.gz +0 -0
  437. codex/static_root/assets/main-Dy9Uqpmh.2f99b1914b3e.js +0 -32
  438. codex/static_root/assets/main-Dy9Uqpmh.2f99b1914b3e.js.br +0 -0
  439. codex/static_root/assets/main-Dy9Uqpmh.2f99b1914b3e.js.gz +0 -0
  440. codex/static_root/assets/main-Dy9Uqpmh.js +0 -32
  441. codex/static_root/assets/main-Dy9Uqpmh.js.br +0 -0
  442. codex/static_root/assets/main-Dy9Uqpmh.js.gz +0 -0
  443. codex/static_root/assets/pagination-toolbar-DbS_HOT1.81222ab51ef4.js +0 -1
  444. codex/static_root/assets/pagination-toolbar-DbS_HOT1.81222ab51ef4.js.br +0 -0
  445. codex/static_root/assets/pagination-toolbar-DbS_HOT1.81222ab51ef4.js.gz +0 -0
  446. codex/static_root/assets/pagination-toolbar-DbS_HOT1.js +0 -1
  447. codex/static_root/assets/pagination-toolbar-DbS_HOT1.js.br +0 -0
  448. codex/static_root/assets/pagination-toolbar-DbS_HOT1.js.gz +0 -0
  449. codex/static_root/assets/pagination-toolbar-r6nbtWxg.4088ab042c0c.css +0 -1
  450. codex/static_root/assets/pagination-toolbar-r6nbtWxg.4088ab042c0c.css.br +0 -0
  451. codex/static_root/assets/pagination-toolbar-r6nbtWxg.4088ab042c0c.css.gz +0 -0
  452. codex/static_root/assets/pagination-toolbar-r6nbtWxg.css +0 -1
  453. codex/static_root/assets/pagination-toolbar-r6nbtWxg.css.br +0 -0
  454. codex/static_root/assets/pagination-toolbar-r6nbtWxg.css.gz +0 -0
  455. codex/static_root/assets/pdf-doc-obrBwxa6.ec9bd13a5786.js.br +0 -0
  456. codex/static_root/assets/pdf-doc-obrBwxa6.ec9bd13a5786.js.gz +0 -0
  457. codex/static_root/assets/pdf-doc-obrBwxa6.js.br +0 -0
  458. codex/static_root/assets/pdf-doc-obrBwxa6.js.gz +0 -0
  459. codex/static_root/assets/reader-BXKUaUeC.953d30b969ef.js +0 -2
  460. codex/static_root/assets/reader-BXKUaUeC.953d30b969ef.js.br +0 -0
  461. codex/static_root/assets/reader-BXKUaUeC.953d30b969ef.js.gz +0 -0
  462. codex/static_root/assets/reader-BXKUaUeC.js +0 -2
  463. codex/static_root/assets/reader-BXKUaUeC.js.br +0 -0
  464. codex/static_root/assets/reader-BXKUaUeC.js.gz +0 -0
  465. codex/static_root/assets/reader-OXJ1KVaW.a463b19d0508.css +0 -1
  466. codex/static_root/assets/reader-OXJ1KVaW.a463b19d0508.css.br +0 -0
  467. codex/static_root/assets/reader-OXJ1KVaW.a463b19d0508.css.gz +0 -0
  468. codex/static_root/assets/reader-OXJ1KVaW.css +0 -1
  469. codex/static_root/assets/reader-OXJ1KVaW.css.br +0 -0
  470. codex/static_root/assets/reader-OXJ1KVaW.css.gz +0 -0
  471. codex/static_root/assets/relation-chips-CZJcLjc8.1d7426dab654.js.br +0 -0
  472. codex/static_root/assets/relation-chips-CZJcLjc8.1d7426dab654.js.gz +0 -0
  473. codex/static_root/assets/relation-chips-CZJcLjc8.js.br +0 -0
  474. codex/static_root/assets/relation-chips-CZJcLjc8.js.gz +0 -0
  475. codex/static_root/assets/settings-drawer-7iTnAdjf.337eecf2fdbb.js.br +0 -0
  476. codex/static_root/assets/settings-drawer-7iTnAdjf.337eecf2fdbb.js.gz +0 -0
  477. codex/static_root/assets/settings-drawer-7iTnAdjf.js.br +0 -0
  478. codex/static_root/assets/settings-drawer-7iTnAdjf.js.gz +0 -0
  479. codex/static_root/assets/stats-tab-CQsK1n8O.544bf50ffb22.js.br +0 -0
  480. codex/static_root/assets/stats-tab-CQsK1n8O.544bf50ffb22.js.gz +0 -0
  481. codex/static_root/assets/stats-tab-CQsK1n8O.js.br +0 -0
  482. codex/static_root/assets/stats-tab-CQsK1n8O.js.gz +0 -0
  483. codex/static_root/assets/task-tab-C60TLP6e.63aa929a4ed6.js +0 -1
  484. codex/static_root/assets/task-tab-C60TLP6e.63aa929a4ed6.js.br +0 -0
  485. codex/static_root/assets/task-tab-C60TLP6e.63aa929a4ed6.js.gz +0 -0
  486. codex/static_root/assets/task-tab-C60TLP6e.js +0 -1
  487. codex/static_root/assets/task-tab-C60TLP6e.js.br +0 -0
  488. codex/static_root/assets/task-tab-C60TLP6e.js.gz +0 -0
  489. codex/static_root/assets/to-case-CR9beRR0.21bb805fdab4.js +0 -1
  490. codex/static_root/assets/to-case-CR9beRR0.js +0 -1
  491. codex/static_root/assets/unauthorized-Bs7NSqea.c55650fac055.js.br +0 -0
  492. codex/static_root/assets/unauthorized-Bs7NSqea.c55650fac055.js.gz +0 -0
  493. codex/static_root/assets/unauthorized-Bs7NSqea.js.br +0 -0
  494. codex/static_root/assets/unauthorized-Bs7NSqea.js.gz +0 -0
  495. codex/static_root/assets/user-tab-ChuH7Atm.7e80cf1fb78e.js.br +0 -0
  496. codex/static_root/assets/user-tab-ChuH7Atm.7e80cf1fb78e.js.gz +0 -0
  497. codex/static_root/assets/user-tab-ChuH7Atm.js.br +0 -0
  498. codex/static_root/assets/user-tab-ChuH7Atm.js.gz +0 -0
  499. codex/static_root/js/choices-admin.ef1ff3a8b9da.json +0 -1
  500. codex/static_root/js/choices-admin.ef1ff3a8b9da.json.br +0 -0
  501. codex/static_root/js/choices-admin.ef1ff3a8b9da.json.gz +0 -0
  502. codex/static_root/js/choices.079a01e0be1a.json.br +0 -0
  503. codex/static_root/js/choices.079a01e0be1a.json.gz +0 -0
  504. codex/static_root/manifest.dad79c8475ae.json.br +0 -0
  505. codex/static_root/manifest.dad79c8475ae.json.gz +0 -0
  506. codex/views/cover.py +0 -76
  507. codex/views/utils.py +0 -26
  508. {codex-1.6.0a7.dist-info → codex-1.6.0a8.dist-info}/LICENSE +0 -0
  509. {codex-1.6.0a7.dist-info → codex-1.6.0a8.dist-info}/WHEEL +0 -0
  510. {codex-1.6.0a7.dist-info → codex-1.6.0a8.dist-info}/entry_points.txt +0 -0
@@ -1 +0,0 @@
1
- .bookChangeDrawer[data-v-03e41a14]{opacity:.75!important;z-index:15!important}.drawerActivated[data-v-03e41a14]{width:33vw!important}.prevCursor[data-v-03e41a14]{cursor:n-resize}.nextCursor[data-v-03e41a14]{cursor:s-resize}.navLink[data-v-03e41a14]{display:block;height:100%}.bookChangeIcon[data-v-03e41a14]{top:50%;left:50%;transform:translate(-50%) translateY(-50%);height:25%;width:25%;color:#fff}.bookChangeColumn[data-v-db3eb561]{position:fixed;top:48px;height:calc(100vh - 96px);width:33vw}.leftPos[data-v-db3eb561]{left:0}.rightPos[data-v-db3eb561]{right:0}.upCursor[data-v-db3eb561]{cursor:n-resize}.downCursor[data-v-db3eb561]{cursor:s-resize}.pageLoading[data-v-04027168]{display:inline-flex;height:100vh;width:100vw;justify-content:center;align-items:center}.twoPages[data-v-04027168]{max-width:50vw}.pagePlaceholder[data-v-04027168]{height:50%!important;width:50%!important}.pageError[data-v-417a4cab]{height:100vh}.pageError[data-v-417a4cab] .v-icon,.pageError[data-v-417a4cab] .v-empty-state__headline{color:rgb(var(--v-theme-error))!important}.twoPages[data-v-417a4cab]{max-width:50vw}.img[data-v-559e2ecc]{transition:transform .5s ease-in-out}.fitToScreen[data-v-559e2ecc],.fitToScreenTwo[data-v-559e2ecc],.fitToScreenVertical[data-v-559e2ecc]{object-fit:contain}.fitToScreen[data-v-559e2ecc],.fitToScreenTwo[data-v-559e2ecc],.fitToScreenVertical[data-v-559e2ecc],.fitToHeight[data-v-559e2ecc],.fitToHeightTwo[data-v-559e2ecc],.fitToHeightVertical[data-v-559e2ecc]{height:100vh}.fitToScreenTwo[data-v-559e2ecc]{max-width:50vw}.fitToWidth[data-v-559e2ecc],.fitToWidthVertical[data-v-559e2ecc],.fitToScreen[data-v-559e2ecc],.fitToScreenVertical[data-v-559e2ecc]{width:100vw}.fitToWidthTwo[data-v-559e2ecc]{width:50vw}.fitToOrig[data-v-559e2ecc],.fitToOrigTwo[data-v-559e2ecc],.fitToOrigVertical[data-v-559e2ecc]{object-fit:none}.page[data-v-87996fa1]{font-size:0}.scaleForScroll[data-v-b24267c0]{overflow:scroll;-webkit-overflow-scrolling:touch}.resetIcon[data-v-b24267c0]{position:fixed;bottom:calc(env(safe-area-inset-bottom) + 45px);right:50%;transform:translate(50%);z-index:200;font-size:50px;color:#fff;filter:drop-shadow(1px 1px 1px black);opacity:.666}.resetIcon[data-v-b24267c0]:hover{opacity:1}.noWrap[data-v-9a560964]{white-space:nowrap}.horizontalPage[data-v-9a560964]{display:inline-block}.pageChangeColumn[data-v-9ade7d96]{position:fixed;top:48px;height:calc(100vh - 96px);width:33vw}.pageChangeRow[data-v-9ade7d96]{position:fixed;height:33vh;width:100%}.prev[data-v-9ade7d96]{left:0;cursor:w-resize}.prevVertical[data-v-9ade7d96]{top:0;cursor:n-resize}.next[data-v-9ade7d96]{right:0;cursor:e-resize}.nextVertical[data-v-9ade7d96]{bottom:0;cursor:s-resize}.windowItem[data-v-e04bbc00]{font-size:0}.verticalPage[data-v-97638fc3]{display:block}[data-v-97638fc3] .v-virtual-scroll__item{position:relative}.pageTracker[data-v-97638fc3]{position:absolute;top:0;left:2.5%;z-index:15;width:95vw;height:85vh;z-index:10}[data-v-93d2206c] .windowItem{min-height:100vh;text-align:center}[data-v-93d2206c] .v-window__controls{position:fixed;top:48px;height:calc(100vh - 96px);padding:0}#downloadPanel[data-v-9e01f4cb],#readerKeyboardShortcuts[data-v-a8b4ac47]{background-color:rgb(var(--v-theme-background))}#shortcutsTitle[data-v-a8b4ac47]{padding:0 10px 0 17px;font-size:16px}#keyboardIcon[data-v-a8b4ac47]{margin-right:.33em!important;color:rgb(var(--v-theme-textDisabled))}[data-v-a8b4ac47] .v-expansion-panel-title--active{min-height:48px!important}[data-v-a8b4ac47] .v-expansion-panel-text__wrapper{padding-left:10px;padding-right:10px}.highlight-table[data-v-a8b4ac47]{margin-top:10px;border-collapse:collapse;color:rgb(var(--v-theme-textDisabled))}h4[data-v-a8b4ac47]{padding-left:.5em;color:rgb(var(--v-theme-textSecondary))}.highlight-table tr[data-v-a8b4ac47]:nth-child(odd){background-color:rgb(var(--v-theme-surface))!important}.highlight-table td[data-v-a8b4ac47]{min-width:60px;padding:5px}.highlight-table td[data-v-a8b4ac47]:first-child{text-align:center}.keyIcon[data-v-a8b4ac47]{margin:0}#readerSettings[data-v-599636e1]{padding-top:10px;padding-left:15px;padding-right:env(safe-area-inset-right);padding-bottom:10px;background-color:inherit}.displayRadioGroup[data-v-599636e1]{margin-top:15px}.displayTwoPages[data-v-599636e1]{margin-top:5px;margin-bottom:10px}.readRtlInReverse[data-v-599636e1]{transition:visibility .25s,opacity .25s}#clearSettingsButton[data-v-599636e1]{margin-top:4px;margin-bottom:4px;transition:visibility .25s,opacity .25s}#readPDFInBrowser[data-v-599636e1]{display:block;padding-left:2px;color:rgba(var(--v-theme-textSecondary))}.arcSelect[data-v-42a57aca]{min-width:74px}#arcPos[data-v-42a57aca]{height:22.75px;padding-top:4px;font-size:16px;letter-spacing:-.15em}[data-v-42a57aca] .v-select__selection{color:rgb(var(--v-theme-textSecondary))!important}[data-v-42a57aca] .v-select__selection .arcSelectIcon{top:4px;color:rgb(var(--v-theme-textSecondary))}[data-v-42a57aca] .v-select__selection:hover .arcSelectIcon{color:#fff}[data-v-42a57aca] .v-list-item__spacer{max-width:12px}#readerToolbarTop[data-v-ca98d9ec]{position:fixed;top:0;width:100%;padding-top:env(safe-area-inset-top);padding-left:0;padding-right:0;z-index:20}.closeBook[data-v-ca98d9ec]{padding-left:max(20px,env(safe-area-inset-left) / 2)}.readerTitle[data-v-ca98d9ec]{padding-left:calc(env(safe-area-inset-left)/2);padding-right:calc(env(safe-area-inset-left)/2);text-align:center;white-space:nowrap;overflow:scroll}#title[data-v-ca98d9ec]{font-size:clamp(18px,3vw,20px)}#subtitle[data-v-ca98d9ec]{font-size:clamp(16px,3vw,18px);color:rgb(var(--v-theme-textSecondary));padding-bottom:10px}.empty[data-v-65d65e48]{color:rgb(var(--v-theme-textDisabled))}.bookChangeNavButtonLeft[data-v-117f651c]{padding-left:max(15px,env(safe-area-inset-left) / 3)}.bookChangeNavButtonRight[data-v-117f651c]{padding-right:max(15px,env(safe-area-inset-right) / 3)}.readerNavButton[data-v-530fba8c]{padding-left:15px;padding-right:15px}.readerNavButtonLeft[data-v-530fba8c]{padding-left:max(15px,env(safe-area-inset-left) / 3)!important}.readerNavButtonRight[data-v-530fba8c]{padding-right:max(15px,env(safe-area-inset-right) / 3)!important}#readerToolbarNav[data-v-dab0637e]{padding-left:0;padding-right:0;padding-bottom:env(safe-area-inset-top)}#readerContainer[data-v-dab9a44d]{max-width:100%;position:relative}
@@ -1 +0,0 @@
1
- import{_ as k,dj as p,V as f,D as _,W as h,B as v,aH as t,aU as r,ap as n,U as c,aI as l,Y as C,Z as e,al as b,X as i,$ as S,ak as T,av as y,aV as B,aW as D}from"./admin-drawer-panel-BxoNUHQr.js";import{C as $}from"./confirm-dialog-RP7JNStF.js";import"./VDialog-X0zn9AGX.js";import"./main-Dy9Uqpmh.js";const x={name:"AdminTasksTab",components:{ConfirmDialog:$},data(){return{tasks:p}},computed:{...f(_,{formSuccess:s=>s.form.success,formErrors:s=>s.form.errors})},methods:{...h(v,["librarianTask"])}},E=s=>(B("data-v-52d52cfa"),s=s(),D(),s),I={id:"tasks"},V=E(()=>r("span",{id:"lastTaskLabel"},"Last Task Queued:",-1)),g={key:0,id:"success"},j={key:1,id:"error"},w={key:2,id:"noRecentTask"},A={class:"taskBox"},L={class:"taskDesc"};function N(s,U,W,z,d,F){const u=C("ConfirmDialog");return e(),t("div",I,[r("div",null,[V,r("span",null,[s.formSuccess?(e(),t("span",g,n(s.formSuccess),1)):s.formErrors&&s.formErrors.length>0?(e(),t("span",j,[(e(!0),t(c,null,l(s.formErrors,o=>(e(),t("span",{key:o},n(o),1))),128))])):(e(),t("span",w,"No recent task"))])]),(e(!0),t(c,null,l(d.tasks,o=>(e(),t("div",{key:o.title,"fixed-header":"",class:"taskGroup"},[r("h3",null,n(o.title),1),(e(!0),t(c,null,l(o.tasks,a=>(e(),t("div",{key:a.value,class:b(["trow",{selected:!1}])},[r("div",A,[a.confirm?(e(),i(u,{key:0,"button-text":a.title,"title-text":a.title,"object-name":a.confirm,"confirm-text":"Confirm",onConfirm:m=>s.librarianTask(a.value,a.title)},null,8,["button-text","title-text","object-name","onConfirm"])):(e(),i(y,{key:1,block:"",onClick:m=>s.librarianTask(a.value,a.title)},{default:S(()=>[T(n(a.title),1)]),_:2},1032,["onClick"])),r("div",L,n(a.desc),1)])]))),128))]))),128))])}const X=k(x,[["render",N],["__scopeId","data-v-52d52cfa"]]);export{X as default};
@@ -1 +0,0 @@
1
- import{_ as k,dj as p,V as f,D as _,W as h,B as v,aH as t,aU as r,ap as n,U as c,aI as l,Y as C,Z as e,al as b,X as i,$ as S,ak as T,av as y,aV as B,aW as D}from"./admin-drawer-panel-BxoNUHQr.js";import{C as $}from"./confirm-dialog-RP7JNStF.js";import"./VDialog-X0zn9AGX.js";import"./main-Dy9Uqpmh.js";const x={name:"AdminTasksTab",components:{ConfirmDialog:$},data(){return{tasks:p}},computed:{...f(_,{formSuccess:s=>s.form.success,formErrors:s=>s.form.errors})},methods:{...h(v,["librarianTask"])}},E=s=>(B("data-v-52d52cfa"),s=s(),D(),s),I={id:"tasks"},V=E(()=>r("span",{id:"lastTaskLabel"},"Last Task Queued:",-1)),g={key:0,id:"success"},j={key:1,id:"error"},w={key:2,id:"noRecentTask"},A={class:"taskBox"},L={class:"taskDesc"};function N(s,U,W,z,d,F){const u=C("ConfirmDialog");return e(),t("div",I,[r("div",null,[V,r("span",null,[s.formSuccess?(e(),t("span",g,n(s.formSuccess),1)):s.formErrors&&s.formErrors.length>0?(e(),t("span",j,[(e(!0),t(c,null,l(s.formErrors,o=>(e(),t("span",{key:o},n(o),1))),128))])):(e(),t("span",w,"No recent task"))])]),(e(!0),t(c,null,l(d.tasks,o=>(e(),t("div",{key:o.title,"fixed-header":"",class:"taskGroup"},[r("h3",null,n(o.title),1),(e(!0),t(c,null,l(o.tasks,a=>(e(),t("div",{key:a.value,class:b(["trow",{selected:!1}])},[r("div",A,[a.confirm?(e(),i(u,{key:0,"button-text":a.title,"title-text":a.title,"object-name":a.confirm,"confirm-text":"Confirm",onConfirm:m=>s.librarianTask(a.value,a.title)},null,8,["button-text","title-text","object-name","onConfirm"])):(e(),i(y,{key:1,block:"",onClick:m=>s.librarianTask(a.value,a.title)},{default:S(()=>[T(n(a.title),1)]),_:2},1032,["onClick"])),r("div",L,n(a.desc),1)])]))),128))]))),128))])}const X=k(x,[["render",N],["__scopeId","data-v-52d52cfa"]]);export{X as default};
@@ -1 +0,0 @@
1
- import{t}from"./main-Dy9Uqpmh.js";const o=function(e){return e=e.replaceAll(/([A-Z])/g," $1"),t(e)};export{o as c};
@@ -1 +0,0 @@
1
- import{t}from"./main-Dy9Uqpmh.js";const o=function(e){return e=e.replaceAll(/([A-Z])/g," $1"),t(e)};export{o as c};
@@ -1 +0,0 @@
1
- {"statusTitles":{"CCC":"Create Covers","CCD":"Remove Covers","CFO":"Find Orphan Covers","IDM":"Move Folders","IFM":"Move Books","ITR":"Read Book Tags","ITQ":"Discover Missing Tags","ITC":"Create Missing Tags","IDU":"Modify Folders","IFU":"Modify Books","IFC":"Create Books","IMQ":"Prepare Tags for Linking","IMC":"Link Books to Tags","ICQ":"Discover Missing Custom Covers","ICM":"Custom Covers Moved","ICU":"Modify Custom Covers","ICC":"Create Custom Covers","ICD":"Delete Custom Covers","ICL":"Link Custom Covers","IDD":"Remove Folders","IFD":"Remove Books","IFI":"Record Failed Imports","JTD":"Cleanup Stale Tags","JCU":"Update Codex Software","JCR":"Restart Codex","JCS":"Stop Codex","JCD":"Cleanup Custom Covers","JDO":"Optimize Database","JDB":"Backup Database","JSD":"Cleanup Expired Sessions","SIX":"Search Index Clear","SIU":"Search Index Update","SID":"Search Index Remove Stale Records","SIM":"Search Index Optimize","WPO":"Poll Library"},"tasks":[{"title":"Libraries","tasks":[{"value":"poll","title":"Poll All Libraries","desc":"Update Libraries if changes detected"},{"value":"poll_force","title":"Force Update All Libraries","desc":"Forcibly update all comics in all libraries","confirm":"This can take a long time"},{"value":"force_update_all_failed_imports","title":"Update All Failed Imports","desc":"Forcibly update all failed imports in all libraries","confirm":"This can take a long time"},{"value":"poll_custom_cover_dir","title":"Poll Custom Group Covers Dir","desc":"Update Custom Group Covers if changes detected"},{"value":"poll_custom_cover_dir_force","title":"Force Update Custom Group Covers","desc":"Forcibly update all group custom covers"}]},{"title":"Covers","tasks":[{"value":"purge_comic_covers","title":"Remove Comic Covers","desc":"from every library","confirm":"Are you sure?"},{"value":"create_all_comic_covers","title":"Create All Comic Covers","desc":"Pre-generate covers for every comic in every library and all custom covers","confirm":"Are you sure?"}]},{"title":"Search Index","tasks":[{"value":"search_index_update","title":"Update Search Index","desc":"with recently changed comics"},{"value":"search_index_rebuild","title":"Rebuild Search Index","desc":"Delete and rebuild the search index from scratch","confirm":"This can take a long time"},{"value":"search_index_remove_stale","title":"Remove Stale Index Entries","desc":"Remove search index entries that are no longer in the library."},{"value":"search_index_merge_small","title":"Merge Small Search Index Segments","desc":"Improves search lookup times. Runs nightly if the Optimize Admin Flag is off."},{"value":"search_index_optimize","title":"Merge Search Index Into One Segment","desc":"Reduces disk space and improves search lookup times. Runs nightly if the Optimize Admin Flag is on.","confirm":"This can take a long time."},{"value":"search_index_abort","title":"Abort Search Indexing","desc":"Aborts search index update and remove tasks."},{"value":"search_index_clear","title":"Clear Search Index","desc":"of all entries"}]},{"title":"Database","tasks":[{"value":"db_vacuum","title":"Optimize & Compact Database","desc":"Run the sqlite3 OPTIMIZE and VACUUM pragmas. Runs nightly"},{"value":"db_backup","title":"Backup Database","desc":"Runs nightly"},{"value":"db_search_sync","title":"Sync Search Index to DB","desc":"Check to see if this database matches the current search index. If there is a mismatch, rebuild the search index. Runs on startup."},{"value":"watchdog_sync","title":"Sync Watchdog with DB","desc":"Ensure the Watchdog file watcher is enabled per database preferences for each library"}]},{"title":"Codex Software","tasks":[{"value":"codex_update","title":"Update Codex","desc":"If Codex updates to a new version, it will restart","confirm":"Are you sure?"},{"value":"codex_restart","title":"Restart Codex Server","desc":"Immediately","confirm":"Are you sure?"},{"value":"codex_shutdown","title":"Shutdown Codex Server","desc":"Immediately","confirm":"Are you sure?"}]},{"title":"Notify","tasks":[{"value":"notify_library_changed","title":"Notify Library Changed ","desc":"Signal all clients that the libraries have changed and the browser should fetch new data."},{"value":"notify_librarian_status","title":"Notify Librarian Status","desc":"Signal Admin clients to fetch librarian status."}]},{"title":"Cleanup","tasks":[{"value":"cleanup_fks","title":"Remove Orphan Tags","desc":"After deleting comics, unused linked objects remain in case new comics use them. Runs nightly."},{"value":"cleanup_db_custom_covers","title":"Remove Orphan Database Custom Covers","desc":"Remove Custom Covers from the db that no longer represent custom cover images on disk. Runs nightly."},{"value":"cleanup_sessions","title":"Cleanup Sessions","desc":"Remove corrupt and expired sessions. Runs nightly."},{"value":"cleanup_covers","title":"Remove Orphan Cover Thumbnails","desc":"no longer have source comics or custom images. Runs nightly."},{"value":"librarian_clear_status","title":"Clear Librarian Statuses","desc":"Mark all Librarian tasks finished."},{"value":"janitor_nightly","title":"Run Nightly Maintenance","desc":"Runs several tasks above that also run nightly.","confirm":"Launches several tasks that run nightly anyway."}]}],"adminFlags":{"FV":"Folder View","RG":"Registration","NU":"Non Users","AU":"Auto Update","SO":"Search Index Full Optimization","IM":"Import Metadata on Library Scan"}}
codex/views/cover.py DELETED
@@ -1,76 +0,0 @@
1
- """Comic cover thumbnail view."""
2
-
3
- from django.http import HttpResponse
4
- from drf_spectacular.types import OpenApiTypes
5
- from drf_spectacular.utils import extend_schema
6
- from rest_framework.renderers import BaseRenderer
7
-
8
- from codex.librarian.covers.create import CoverCreateMixin
9
- from codex.librarian.covers.path import CoverPathMixin
10
- from codex.librarian.mp_queue import LIBRARIAN_QUEUE
11
- from codex.logger.logging import get_logger
12
- from codex.views.auth import (
13
- AuthAPIView,
14
- )
15
- from codex.views.const import MISSING_COVER_FN, MISSING_COVER_NAME_MAP, STATIC_IMG_PATH
16
-
17
- LOG = get_logger(__name__)
18
-
19
-
20
- class WEBPRenderer(BaseRenderer):
21
- """Render WEBP images."""
22
-
23
- media_type = "image/webp"
24
- format = "webp"
25
- charset = None
26
- render_style = "binary"
27
-
28
- def render(self, data, *_args, **_kwargs):
29
- """Return raw data."""
30
- return data
31
-
32
-
33
- class CoverView(AuthAPIView):
34
- """ComicCover View."""
35
-
36
- renderer_classes = (WEBPRenderer,)
37
- content_type = "image/webp"
38
-
39
- def _get_missing_cover_path(self):
40
- # Get the missing cover, which is a default svg if fetched for a group.
41
- data = self.request.GET
42
- group: str = data.get("group", "c") # type: ignore
43
- cover_name = MISSING_COVER_NAME_MAP.get(group)
44
- if cover_name:
45
- cover_fn = cover_name + ".svg"
46
- content_type = "image/svg+xml"
47
- else:
48
- cover_fn = MISSING_COVER_FN
49
- content_type = "image/webp"
50
- cover_path = STATIC_IMG_PATH / cover_fn
51
- return cover_path, content_type
52
-
53
- @extend_schema(responses={(200, content_type): OpenApiTypes.BINARY})
54
- def get(self, *_args, **_kwargs):
55
- """Get comic cover."""
56
- thumb_image_data = None
57
- content_type = "image/webp"
58
-
59
- custom: bool = self.request.GET.get("custom") == "1"
60
- pk = self.kwargs.get("pk")
61
- cover_path = CoverPathMixin.get_cover_path(pk, custom)
62
- if not cover_path.exists():
63
- thumb_image_data = CoverCreateMixin.create_cover_from_path(
64
- pk, cover_path, LOG, LIBRARIAN_QUEUE, custom
65
- )
66
- if not thumb_image_data:
67
- cover_path, content_type = self._get_missing_cover_path()
68
- elif cover_path.stat().st_size == 0:
69
- cover_path, content_type = self._get_missing_cover_path()
70
-
71
- if not thumb_image_data:
72
- # if not thumb_image_data:
73
- with cover_path.open("rb") as f:
74
- thumb_image_data = f.read()
75
-
76
- return HttpResponse(thumb_image_data, content_type=content_type)
codex/views/utils.py DELETED
@@ -1,26 +0,0 @@
1
- """Utility functions for views."""
2
-
3
- import json
4
- from contextlib import suppress
5
- from json.decoder import JSONDecodeError
6
- from urllib.parse import unquote_plus
7
-
8
- from djangorestframework_camel_case.settings import api_settings
9
- from djangorestframework_camel_case.util import underscoreize
10
-
11
-
12
- def reparse_json_query_params(query_params, keys) -> dict:
13
- """Reparse JSON encoded query_params."""
14
- # It is an unbelievable amount of trouble to try to parse axios native bracket
15
- # encoded complex objects in python
16
- parsed_dict = {}
17
- for key, value in query_params.items():
18
- if key in keys:
19
- parsed_value = unquote_plus(value)
20
- with suppress(JSONDecodeError):
21
- parsed_value = json.loads(parsed_value)
22
- else:
23
- parsed_value = value
24
-
25
- parsed_dict[key] = parsed_value
26
- return dict(underscoreize(parsed_dict, **api_settings.JSON_UNDERSCOREIZE)) # type:ignore