codex 1.7.0__py3-none-any.whl → 1.7.0a0__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 (717) hide show
  1. codex/db.py +17 -32
  2. codex/exceptions.py +3 -2
  3. codex/librarian/covers/coverd.py +4 -3
  4. codex/librarian/covers/create.py +7 -8
  5. codex/librarian/covers/path.py +2 -1
  6. codex/librarian/covers/purge.py +2 -2
  7. codex/librarian/janitor/integrity.py +10 -12
  8. codex/librarian/janitor/tasks.py +1 -1
  9. codex/librarian/librariand.py +0 -5
  10. codex/librarian/watchdog/emitter.py +19 -21
  11. codex/librarian/watchdog/event_batcherd.py +1 -0
  12. codex/migrations/0030_nocase_collation_day_month_indexes_status_types.py +0 -4
  13. codex/models/admin.py +5 -0
  14. codex/models/functions.py +5 -6
  15. codex/models/query.py +0 -6
  16. codex/run.py +9 -11
  17. codex/serializers/admin/tasks.py +2 -2
  18. codex/serializers/browser/mixins.py +14 -18
  19. codex/serializers/browser/settings.py +4 -4
  20. codex/serializers/choices.py +196 -0
  21. codex/serializers/fields.py +5 -9
  22. codex/startup.py +4 -6
  23. codex/static_root/assets/VCheckbox-CWiqcZ7a.3feebd47daab.js +1 -0
  24. codex/static_root/assets/VCheckbox-CWiqcZ7a.3feebd47daab.js.br +0 -0
  25. codex/static_root/assets/VCheckbox-CWiqcZ7a.3feebd47daab.js.gz +0 -0
  26. codex/static_root/assets/VCheckbox-CWiqcZ7a.js +1 -0
  27. codex/static_root/assets/VCheckbox-CWiqcZ7a.js.br +0 -0
  28. codex/static_root/assets/VCheckbox-CWiqcZ7a.js.gz +0 -0
  29. codex/static_root/assets/VCheckboxBtn-Dk3iB62X.bc66d5351baa.js +1 -0
  30. codex/static_root/assets/VCheckboxBtn-Dk3iB62X.bc66d5351baa.js.br +0 -0
  31. codex/static_root/assets/VCheckboxBtn-Dk3iB62X.bc66d5351baa.js.gz +0 -0
  32. codex/static_root/assets/VCheckboxBtn-Dk3iB62X.js +1 -0
  33. codex/static_root/assets/VCheckboxBtn-Dk3iB62X.js.br +0 -0
  34. codex/static_root/assets/VCheckboxBtn-Dk3iB62X.js.gz +0 -0
  35. codex/static_root/assets/VCombobox-D1_KU27A.b1d30587a973.js +1 -0
  36. codex/static_root/assets/VCombobox-D1_KU27A.b1d30587a973.js.br +0 -0
  37. codex/static_root/assets/VCombobox-D1_KU27A.b1d30587a973.js.gz +0 -0
  38. codex/static_root/assets/VCombobox-D1_KU27A.js +1 -0
  39. codex/static_root/assets/VCombobox-D1_KU27A.js.br +0 -0
  40. codex/static_root/assets/VCombobox-D1_KU27A.js.gz +0 -0
  41. codex/static_root/assets/VDialog-38np3TSA.5a0cb7a9e56d.css +1 -0
  42. codex/static_root/assets/VDialog-38np3TSA.5a0cb7a9e56d.css.br +0 -0
  43. codex/static_root/assets/VDialog-38np3TSA.5a0cb7a9e56d.css.gz +0 -0
  44. codex/static_root/assets/VDialog-38np3TSA.css +1 -0
  45. codex/static_root/assets/VDialog-38np3TSA.css.br +0 -0
  46. codex/static_root/assets/VDialog-38np3TSA.css.gz +0 -0
  47. codex/static_root/assets/VDialog-GbxvFMMN.594fb3a39ced.js +1 -0
  48. codex/static_root/assets/VDialog-GbxvFMMN.594fb3a39ced.js.br +0 -0
  49. codex/static_root/assets/VDialog-GbxvFMMN.594fb3a39ced.js.gz +0 -0
  50. codex/static_root/assets/VDialog-GbxvFMMN.js +1 -0
  51. codex/static_root/assets/VDialog-GbxvFMMN.js.br +0 -0
  52. codex/static_root/assets/VDialog-GbxvFMMN.js.gz +0 -0
  53. codex/static_root/assets/VExpansionPanels-Cywv_bEj.a762e63858e5.js +1 -0
  54. codex/static_root/assets/VExpansionPanels-Cywv_bEj.a762e63858e5.js.br +0 -0
  55. codex/static_root/assets/VExpansionPanels-Cywv_bEj.a762e63858e5.js.gz +0 -0
  56. codex/static_root/assets/VExpansionPanels-Cywv_bEj.js +1 -0
  57. codex/static_root/assets/VExpansionPanels-Cywv_bEj.js.br +0 -0
  58. codex/static_root/assets/VExpansionPanels-Cywv_bEj.js.gz +0 -0
  59. codex/static_root/assets/VRadioGroup-C0etmxpZ.0eb3009a6300.js +1 -0
  60. codex/static_root/assets/VRadioGroup-C0etmxpZ.0eb3009a6300.js.br +0 -0
  61. codex/static_root/assets/VRadioGroup-C0etmxpZ.0eb3009a6300.js.gz +0 -0
  62. codex/static_root/assets/VRadioGroup-C0etmxpZ.js +1 -0
  63. codex/static_root/assets/VRadioGroup-C0etmxpZ.js.br +0 -0
  64. codex/static_root/assets/VRadioGroup-C0etmxpZ.js.gz +0 -0
  65. codex/static_root/assets/VSelect-Ca2bIOso.6613989e4c45.css +1 -0
  66. codex/static_root/assets/VSelect-Ca2bIOso.6613989e4c45.css.br +0 -0
  67. codex/static_root/assets/VSelect-Ca2bIOso.6613989e4c45.css.gz +0 -0
  68. codex/static_root/assets/VSelect-Ca2bIOso.css +1 -0
  69. codex/static_root/assets/VSelect-Ca2bIOso.css.br +0 -0
  70. codex/static_root/assets/VSelect-Ca2bIOso.css.gz +0 -0
  71. codex/static_root/assets/VSelect-txrnRiNJ.a5625760018c.js +1 -0
  72. codex/static_root/assets/VSelect-txrnRiNJ.a5625760018c.js.br +0 -0
  73. codex/static_root/assets/VSelect-txrnRiNJ.a5625760018c.js.gz +0 -0
  74. codex/static_root/assets/VSelect-txrnRiNJ.js +1 -0
  75. codex/static_root/assets/VSelect-txrnRiNJ.js.br +0 -0
  76. codex/static_root/assets/VSelect-txrnRiNJ.js.gz +0 -0
  77. codex/static_root/assets/VSelectionControl-CY6RmcvW.7e8824224f6c.js +1 -0
  78. codex/static_root/assets/VSelectionControl-CY6RmcvW.7e8824224f6c.js.br +0 -0
  79. codex/static_root/assets/VSelectionControl-CY6RmcvW.7e8824224f6c.js.gz +0 -0
  80. codex/static_root/assets/VSelectionControl-CY6RmcvW.js +1 -0
  81. codex/static_root/assets/VSelectionControl-CY6RmcvW.js.br +0 -0
  82. codex/static_root/assets/VSelectionControl-CY6RmcvW.js.gz +0 -0
  83. codex/static_root/assets/VSlideGroup-Dk_1upHt.2c836070ec75.css +1 -0
  84. codex/static_root/assets/VSlideGroup-Dk_1upHt.2c836070ec75.css.br +0 -0
  85. codex/static_root/assets/VSlideGroup-Dk_1upHt.2c836070ec75.css.gz +0 -0
  86. codex/static_root/assets/VSlideGroup-Dk_1upHt.css +1 -0
  87. codex/static_root/assets/VSlideGroup-Dk_1upHt.css.br +0 -0
  88. codex/static_root/assets/VSlideGroup-Dk_1upHt.css.gz +0 -0
  89. codex/static_root/assets/VSlideGroup-DtEQMwY1.6c72325635ed.js +1 -0
  90. codex/static_root/assets/VSlideGroup-DtEQMwY1.6c72325635ed.js.br +0 -0
  91. codex/static_root/assets/VSlideGroup-DtEQMwY1.6c72325635ed.js.gz +0 -0
  92. codex/static_root/assets/VSlideGroup-DtEQMwY1.js +1 -0
  93. codex/static_root/assets/VSlideGroup-DtEQMwY1.js.br +0 -0
  94. codex/static_root/assets/VSlideGroup-DtEQMwY1.js.gz +0 -0
  95. codex/static_root/assets/VTable-2af995xo.6c5bf36631b2.js +1 -0
  96. codex/static_root/assets/VTable-2af995xo.6c5bf36631b2.js.br +0 -0
  97. codex/static_root/assets/VTable-2af995xo.6c5bf36631b2.js.gz +0 -0
  98. codex/static_root/assets/VTable-2af995xo.js +1 -0
  99. codex/static_root/assets/VTable-2af995xo.js.br +0 -0
  100. codex/static_root/assets/VTable-2af995xo.js.gz +0 -0
  101. codex/static_root/assets/VTextField-Crc3gdNh.39995ccf4d52.css +1 -0
  102. codex/static_root/assets/VTextField-Crc3gdNh.39995ccf4d52.css.br +0 -0
  103. codex/static_root/assets/VTextField-Crc3gdNh.39995ccf4d52.css.gz +0 -0
  104. codex/static_root/assets/VTextField-Crc3gdNh.css +1 -0
  105. codex/static_root/assets/VTextField-Crc3gdNh.css.br +0 -0
  106. codex/static_root/assets/VTextField-Crc3gdNh.css.gz +0 -0
  107. codex/static_root/assets/VTextField-G6CMj7yO.657a130dd302.js +1 -0
  108. codex/static_root/assets/VTextField-G6CMj7yO.657a130dd302.js.br +0 -0
  109. codex/static_root/assets/VTextField-G6CMj7yO.657a130dd302.js.gz +0 -0
  110. codex/static_root/assets/VTextField-G6CMj7yO.js +1 -0
  111. codex/static_root/assets/VTextField-G6CMj7yO.js.br +0 -0
  112. codex/static_root/assets/VTextField-G6CMj7yO.js.gz +0 -0
  113. codex/static_root/assets/VWindowItem-CzoGd6Ul.721e5da11ad4.js +1 -0
  114. codex/static_root/assets/VWindowItem-CzoGd6Ul.721e5da11ad4.js.br +0 -0
  115. codex/static_root/assets/VWindowItem-CzoGd6Ul.721e5da11ad4.js.gz +0 -0
  116. codex/static_root/assets/VWindowItem-CzoGd6Ul.js +1 -0
  117. codex/static_root/assets/VWindowItem-CzoGd6Ul.js.br +0 -0
  118. codex/static_root/assets/VWindowItem-CzoGd6Ul.js.gz +0 -0
  119. codex/static_root/assets/{admin-DJ7pIXDQ.css → admin-CWEjaFr5.7d4523387384.css} +1 -1
  120. codex/static_root/assets/admin-CWEjaFr5.7d4523387384.css.br +0 -0
  121. codex/static_root/assets/admin-CWEjaFr5.7d4523387384.css.gz +0 -0
  122. codex/static_root/assets/{admin-DJ7pIXDQ.e2a77af73ef2.css → admin-CWEjaFr5.css} +1 -1
  123. codex/static_root/assets/admin-CWEjaFr5.css.br +0 -0
  124. codex/static_root/assets/admin-CWEjaFr5.css.gz +0 -0
  125. codex/static_root/assets/admin-CsPAIQeG.5175467148a3.js +1 -0
  126. codex/static_root/assets/admin-CsPAIQeG.5175467148a3.js.br +0 -0
  127. codex/static_root/assets/admin-CsPAIQeG.5175467148a3.js.gz +0 -0
  128. codex/static_root/assets/admin-CsPAIQeG.js +1 -0
  129. codex/static_root/assets/admin-CsPAIQeG.js.br +0 -0
  130. codex/static_root/assets/admin-CsPAIQeG.js.gz +0 -0
  131. codex/static_root/assets/admin-drawer-panel-BAT7GA64.73a064628c19.js +30 -0
  132. codex/static_root/assets/admin-drawer-panel-BAT7GA64.73a064628c19.js.br +0 -0
  133. codex/static_root/assets/admin-drawer-panel-BAT7GA64.73a064628c19.js.gz +0 -0
  134. codex/static_root/assets/admin-drawer-panel-BAT7GA64.js +30 -0
  135. codex/static_root/assets/admin-drawer-panel-BAT7GA64.js.br +0 -0
  136. codex/static_root/assets/admin-drawer-panel-BAT7GA64.js.gz +0 -0
  137. codex/static_root/assets/admin-drawer-panel-Bs2wgKj3.3cb33056e994.css +1 -0
  138. codex/static_root/assets/admin-drawer-panel-Bs2wgKj3.3cb33056e994.css.br +0 -0
  139. codex/static_root/assets/admin-drawer-panel-Bs2wgKj3.3cb33056e994.css.gz +0 -0
  140. codex/static_root/assets/admin-drawer-panel-Bs2wgKj3.css +1 -0
  141. codex/static_root/assets/admin-drawer-panel-Bs2wgKj3.css.br +0 -0
  142. codex/static_root/assets/admin-drawer-panel-Bs2wgKj3.css.gz +0 -0
  143. codex/static_root/assets/browser-C18l93yc.923860009ef4.js +1 -0
  144. codex/static_root/assets/browser-C18l93yc.923860009ef4.js.br +0 -0
  145. codex/static_root/assets/browser-C18l93yc.923860009ef4.js.gz +0 -0
  146. codex/static_root/assets/browser-C18l93yc.js +1 -0
  147. codex/static_root/assets/browser-C18l93yc.js.br +0 -0
  148. codex/static_root/assets/browser-C18l93yc.js.gz +0 -0
  149. codex/static_root/assets/browser-DaAqlBYO.708ecf0904bb.css +1 -0
  150. codex/static_root/assets/browser-DaAqlBYO.708ecf0904bb.css.br +0 -0
  151. codex/static_root/assets/browser-DaAqlBYO.708ecf0904bb.css.gz +0 -0
  152. codex/static_root/assets/browser-DaAqlBYO.css +1 -0
  153. codex/static_root/assets/browser-DaAqlBYO.css.br +0 -0
  154. codex/static_root/assets/browser-DaAqlBYO.css.gz +0 -0
  155. codex/static_root/assets/change-password-dialog-BazJdNs9.0a4e02656a35.js +1 -0
  156. codex/static_root/assets/change-password-dialog-BazJdNs9.0a4e02656a35.js.br +0 -0
  157. codex/static_root/assets/change-password-dialog-BazJdNs9.0a4e02656a35.js.gz +0 -0
  158. codex/static_root/assets/change-password-dialog-BazJdNs9.js +1 -0
  159. codex/static_root/assets/change-password-dialog-BazJdNs9.js.br +0 -0
  160. codex/static_root/assets/change-password-dialog-BazJdNs9.js.gz +0 -0
  161. codex/static_root/assets/change-password-dialog-Mlmvz8_4.111421f51e79.css +1 -0
  162. codex/static_root/assets/change-password-dialog-Mlmvz8_4.111421f51e79.css.br +0 -0
  163. codex/static_root/assets/change-password-dialog-Mlmvz8_4.111421f51e79.css.gz +0 -0
  164. codex/static_root/assets/change-password-dialog-Mlmvz8_4.css +1 -0
  165. codex/static_root/assets/change-password-dialog-Mlmvz8_4.css.br +0 -0
  166. codex/static_root/assets/change-password-dialog-Mlmvz8_4.css.gz +0 -0
  167. codex/static_root/assets/confirm-dialog-BmhedLCx.7c2103d319d4.css +1 -0
  168. codex/static_root/assets/confirm-dialog-BmhedLCx.css +1 -0
  169. codex/static_root/assets/confirm-dialog-CbW3hlOp.9dd39b443c31.js +1 -0
  170. codex/static_root/assets/confirm-dialog-CbW3hlOp.9dd39b443c31.js.br +0 -0
  171. codex/static_root/assets/confirm-dialog-CbW3hlOp.9dd39b443c31.js.gz +0 -0
  172. codex/static_root/assets/confirm-dialog-CbW3hlOp.js +1 -0
  173. codex/static_root/assets/confirm-dialog-CbW3hlOp.js.br +0 -0
  174. codex/static_root/assets/confirm-dialog-CbW3hlOp.js.gz +0 -0
  175. codex/static_root/assets/datetime-column-uSqKZU37.b157b0743db5.js +1 -0
  176. codex/static_root/assets/datetime-column-uSqKZU37.b157b0743db5.js.br +0 -0
  177. codex/static_root/assets/datetime-column-uSqKZU37.b157b0743db5.js.gz +0 -0
  178. codex/static_root/assets/datetime-column-uSqKZU37.js +1 -0
  179. codex/static_root/assets/datetime-column-uSqKZU37.js.br +0 -0
  180. codex/static_root/assets/datetime-column-uSqKZU37.js.gz +0 -0
  181. codex/static_root/assets/filter-CBl5KEsB.845a81573c2e.js +1 -0
  182. codex/static_root/assets/filter-CBl5KEsB.845a81573c2e.js.br +0 -0
  183. codex/static_root/assets/filter-CBl5KEsB.845a81573c2e.js.gz +0 -0
  184. codex/static_root/assets/filter-CBl5KEsB.js +1 -0
  185. codex/static_root/assets/filter-CBl5KEsB.js.br +0 -0
  186. codex/static_root/assets/filter-CBl5KEsB.js.gz +0 -0
  187. codex/static_root/assets/flag-tab-CT8pqM4r.ecb6eee2e7a0.js +1 -0
  188. codex/static_root/assets/flag-tab-CT8pqM4r.ecb6eee2e7a0.js.br +0 -0
  189. codex/static_root/assets/flag-tab-CT8pqM4r.ecb6eee2e7a0.js.gz +0 -0
  190. codex/static_root/assets/flag-tab-CT8pqM4r.js +1 -0
  191. codex/static_root/assets/flag-tab-CT8pqM4r.js.br +0 -0
  192. codex/static_root/assets/flag-tab-CT8pqM4r.js.gz +0 -0
  193. codex/static_root/assets/flag-tab-DBqpLKi7.css +1 -0
  194. codex/static_root/assets/flag-tab-DBqpLKi7.css.br +0 -0
  195. codex/static_root/assets/flag-tab-DBqpLKi7.css.gz +0 -0
  196. codex/static_root/assets/flag-tab-DBqpLKi7.dcfef39f541e.css +1 -0
  197. codex/static_root/assets/flag-tab-DBqpLKi7.dcfef39f541e.css.br +0 -0
  198. codex/static_root/assets/flag-tab-DBqpLKi7.dcfef39f541e.css.gz +0 -0
  199. codex/static_root/assets/group-tab-BOW9kigw.7e5007596367.js +1 -0
  200. codex/static_root/assets/group-tab-BOW9kigw.7e5007596367.js.br +0 -0
  201. codex/static_root/assets/group-tab-BOW9kigw.7e5007596367.js.gz +0 -0
  202. codex/static_root/assets/group-tab-BOW9kigw.js +1 -0
  203. codex/static_root/assets/group-tab-BOW9kigw.js.br +0 -0
  204. codex/static_root/assets/group-tab-BOW9kigw.js.gz +0 -0
  205. codex/static_root/assets/group-tab-CBKuS3Iv.7e4746634782.css +1 -0
  206. codex/static_root/assets/group-tab-CBKuS3Iv.7e4746634782.css.br +0 -0
  207. codex/static_root/assets/group-tab-CBKuS3Iv.7e4746634782.css.gz +0 -0
  208. codex/static_root/assets/group-tab-CBKuS3Iv.css +1 -0
  209. codex/static_root/assets/group-tab-CBKuS3Iv.css.br +0 -0
  210. codex/static_root/assets/group-tab-CBKuS3Iv.css.gz +0 -0
  211. codex/static_root/assets/http-error-C6yuLApo.45cf99eb7a70.js +1 -0
  212. codex/static_root/assets/http-error-C6yuLApo.45cf99eb7a70.js.br +4 -0
  213. codex/static_root/assets/http-error-C6yuLApo.45cf99eb7a70.js.gz +0 -0
  214. codex/static_root/assets/http-error-C6yuLApo.js +1 -0
  215. codex/static_root/assets/http-error-C6yuLApo.js.br +4 -0
  216. codex/static_root/assets/http-error-C6yuLApo.js.gz +0 -0
  217. codex/static_root/assets/{library-tab-Wew8YOLv.0c1780a6b68e.css → library-tab-Bh7ErAk7.7c44200ee727.css} +1 -1
  218. codex/static_root/assets/library-tab-Bh7ErAk7.7c44200ee727.css.br +2 -0
  219. codex/static_root/assets/library-tab-Bh7ErAk7.7c44200ee727.css.gz +0 -0
  220. codex/static_root/assets/{library-tab-Wew8YOLv.css → library-tab-Bh7ErAk7.css} +1 -1
  221. codex/static_root/assets/library-tab-Bh7ErAk7.css.br +2 -0
  222. codex/static_root/assets/library-tab-Bh7ErAk7.css.gz +0 -0
  223. codex/static_root/assets/library-tab-D3WOtpE0.9af34e6e7235.js +1 -0
  224. codex/static_root/assets/library-tab-D3WOtpE0.9af34e6e7235.js.br +0 -0
  225. codex/static_root/assets/library-tab-D3WOtpE0.9af34e6e7235.js.gz +0 -0
  226. codex/static_root/assets/library-tab-D3WOtpE0.js +1 -0
  227. codex/static_root/assets/library-tab-D3WOtpE0.js.br +0 -0
  228. codex/static_root/assets/library-tab-D3WOtpE0.js.gz +0 -0
  229. codex/static_root/assets/main-CmjU2oTp.6a471f6900e5.js +6 -0
  230. codex/static_root/assets/main-CmjU2oTp.6a471f6900e5.js.br +0 -0
  231. codex/static_root/assets/main-CmjU2oTp.6a471f6900e5.js.gz +0 -0
  232. codex/static_root/assets/main-CmjU2oTp.js +6 -0
  233. codex/static_root/assets/main-CmjU2oTp.js.br +0 -0
  234. codex/static_root/assets/main-CmjU2oTp.js.gz +0 -0
  235. codex/static_root/assets/pager-full-pdf-BH54_5f6.6e92d0555cd7.js +1 -0
  236. codex/static_root/assets/pager-full-pdf-BH54_5f6.6e92d0555cd7.js.br +0 -0
  237. codex/static_root/assets/pager-full-pdf-BH54_5f6.6e92d0555cd7.js.gz +0 -0
  238. codex/static_root/assets/pager-full-pdf-BH54_5f6.js +1 -0
  239. codex/static_root/assets/pager-full-pdf-BH54_5f6.js.br +0 -0
  240. codex/static_root/assets/pager-full-pdf-BH54_5f6.js.gz +0 -0
  241. codex/static_root/assets/pagination-toolbar-JH3Kbffr.451171f7ac33.js +1 -0
  242. codex/static_root/assets/pagination-toolbar-JH3Kbffr.451171f7ac33.js.br +0 -0
  243. codex/static_root/assets/pagination-toolbar-JH3Kbffr.451171f7ac33.js.gz +0 -0
  244. codex/static_root/assets/pagination-toolbar-JH3Kbffr.js +1 -0
  245. codex/static_root/assets/pagination-toolbar-JH3Kbffr.js.br +0 -0
  246. codex/static_root/assets/pagination-toolbar-JH3Kbffr.js.gz +0 -0
  247. codex/static_root/assets/{pdf-doc-ctqZIwOP.7e7b2c815ea4.js → pdf-doc-BcRNpoaW.882f6e967869.js} +3 -3
  248. codex/static_root/assets/pdf-doc-BcRNpoaW.882f6e967869.js.br +0 -0
  249. codex/static_root/assets/pdf-doc-BcRNpoaW.882f6e967869.js.gz +0 -0
  250. codex/static_root/assets/{pdf-doc-ctqZIwOP.js → pdf-doc-BcRNpoaW.js} +3 -3
  251. codex/static_root/assets/pdf-doc-BcRNpoaW.js.br +0 -0
  252. codex/static_root/assets/pdf-doc-BcRNpoaW.js.gz +0 -0
  253. codex/static_root/assets/reader-DIPRg2VB.900370e097aa.js +2 -0
  254. codex/static_root/assets/reader-DIPRg2VB.900370e097aa.js.br +0 -0
  255. codex/static_root/assets/reader-DIPRg2VB.900370e097aa.js.gz +0 -0
  256. codex/static_root/assets/reader-DIPRg2VB.js +2 -0
  257. codex/static_root/assets/reader-DIPRg2VB.js.br +0 -0
  258. codex/static_root/assets/reader-DIPRg2VB.js.gz +0 -0
  259. codex/static_root/assets/{reader-nD70BeEz.06e85e73c391.css → reader-DveZZr9x.7b21b9f8f628.css} +1 -1
  260. codex/static_root/assets/reader-DveZZr9x.7b21b9f8f628.css.br +0 -0
  261. codex/static_root/assets/reader-DveZZr9x.7b21b9f8f628.css.gz +0 -0
  262. codex/static_root/assets/{reader-nD70BeEz.css → reader-DveZZr9x.css} +1 -1
  263. codex/static_root/assets/reader-DveZZr9x.css.br +0 -0
  264. codex/static_root/assets/reader-DveZZr9x.css.gz +0 -0
  265. codex/static_root/assets/relation-chips-3tTlR5QH.71f18bc92adc.js +1 -0
  266. codex/static_root/assets/relation-chips-3tTlR5QH.71f18bc92adc.js.br +0 -0
  267. codex/static_root/assets/relation-chips-3tTlR5QH.71f18bc92adc.js.gz +0 -0
  268. codex/static_root/assets/relation-chips-3tTlR5QH.js +1 -0
  269. codex/static_root/assets/relation-chips-3tTlR5QH.js.br +0 -0
  270. codex/static_root/assets/relation-chips-3tTlR5QH.js.gz +0 -0
  271. codex/static_root/assets/settings-drawer-BdyFhA_r.151f4c3061ed.js +2 -0
  272. codex/static_root/assets/settings-drawer-BdyFhA_r.151f4c3061ed.js.br +0 -0
  273. codex/static_root/assets/settings-drawer-BdyFhA_r.151f4c3061ed.js.gz +0 -0
  274. codex/static_root/assets/settings-drawer-BdyFhA_r.js +2 -0
  275. codex/static_root/assets/settings-drawer-BdyFhA_r.js.br +0 -0
  276. codex/static_root/assets/settings-drawer-BdyFhA_r.js.gz +0 -0
  277. codex/static_root/assets/stats-tab-DeKjwvmh.7557c71b4cfa.js +1 -0
  278. codex/static_root/assets/stats-tab-DeKjwvmh.7557c71b4cfa.js.br +0 -0
  279. codex/static_root/assets/stats-tab-DeKjwvmh.7557c71b4cfa.js.gz +0 -0
  280. codex/static_root/assets/stats-tab-DeKjwvmh.js +1 -0
  281. codex/static_root/assets/stats-tab-DeKjwvmh.js.br +0 -0
  282. codex/static_root/assets/stats-tab-DeKjwvmh.js.gz +0 -0
  283. codex/static_root/assets/{stats-tab-BAYTqQNg.5f715428c394.css → stats-tab-DpfGsVX3.1cb66f2649a9.css} +1 -1
  284. codex/static_root/assets/stats-tab-DpfGsVX3.1cb66f2649a9.css.br +0 -0
  285. codex/static_root/assets/stats-tab-DpfGsVX3.1cb66f2649a9.css.gz +0 -0
  286. codex/static_root/assets/{stats-tab-BAYTqQNg.css → stats-tab-DpfGsVX3.css} +1 -1
  287. codex/static_root/assets/stats-tab-DpfGsVX3.css.br +0 -0
  288. codex/static_root/assets/stats-tab-DpfGsVX3.css.gz +0 -0
  289. codex/static_root/assets/task-tab-1XiWn9xP.06cb8e1b794d.css +1 -0
  290. codex/static_root/assets/{task-tab--cXi48kg.5dfd6890a1c2.css.br → task-tab-1XiWn9xP.06cb8e1b794d.css.br} +1 -1
  291. codex/static_root/assets/task-tab-1XiWn9xP.06cb8e1b794d.css.gz +0 -0
  292. codex/static_root/assets/task-tab-1XiWn9xP.css +1 -0
  293. codex/static_root/assets/{task-tab--cXi48kg.css.br → task-tab-1XiWn9xP.css.br} +1 -1
  294. codex/static_root/assets/task-tab-1XiWn9xP.css.gz +0 -0
  295. codex/static_root/assets/task-tab-C8D0qRP_.d4ab174c69a3.js +1 -0
  296. codex/static_root/assets/task-tab-C8D0qRP_.d4ab174c69a3.js.br +0 -0
  297. codex/static_root/assets/task-tab-C8D0qRP_.d4ab174c69a3.js.gz +0 -0
  298. codex/static_root/assets/task-tab-C8D0qRP_.js +1 -0
  299. codex/static_root/assets/task-tab-C8D0qRP_.js.br +0 -0
  300. codex/static_root/assets/task-tab-C8D0qRP_.js.gz +0 -0
  301. codex/static_root/assets/unauthorized-BHgBRF4z.8e5c1b9e52b0.js +1 -0
  302. codex/static_root/assets/unauthorized-BHgBRF4z.8e5c1b9e52b0.js.br +0 -0
  303. codex/static_root/assets/unauthorized-BHgBRF4z.8e5c1b9e52b0.js.gz +0 -0
  304. codex/static_root/assets/unauthorized-BHgBRF4z.js +1 -0
  305. codex/static_root/assets/unauthorized-BHgBRF4z.js.br +0 -0
  306. codex/static_root/assets/unauthorized-BHgBRF4z.js.gz +0 -0
  307. codex/static_root/assets/user-tab-BU31Z92y.35613c713faf.js +1 -0
  308. codex/static_root/assets/user-tab-BU31Z92y.35613c713faf.js.br +0 -0
  309. codex/static_root/assets/user-tab-BU31Z92y.35613c713faf.js.gz +0 -0
  310. codex/static_root/assets/user-tab-BU31Z92y.js +1 -0
  311. codex/static_root/assets/user-tab-BU31Z92y.js.br +0 -0
  312. codex/static_root/assets/user-tab-BU31Z92y.js.gz +0 -0
  313. codex/static_root/js/choices-admin.8aa64c911203.json +1 -0
  314. codex/static_root/js/choices-admin.8aa64c911203.json.br +0 -0
  315. codex/static_root/js/choices-admin.8aa64c911203.json.gz +0 -0
  316. codex/static_root/js/choices-admin.json +1 -0
  317. codex/static_root/js/choices-admin.json.br +0 -0
  318. codex/static_root/js/choices-admin.json.gz +0 -0
  319. codex/static_root/js/choices.2f6b0359e1ef.json +1 -0
  320. codex/static_root/js/choices.2f6b0359e1ef.json.br +0 -0
  321. codex/static_root/js/choices.2f6b0359e1ef.json.gz +0 -0
  322. codex/static_root/js/choices.json +1 -0
  323. codex/static_root/js/choices.json.br +0 -0
  324. codex/static_root/js/choices.json.gz +0 -0
  325. codex/static_root/manifest.45cb46e19686.json +635 -0
  326. codex/static_root/manifest.45cb46e19686.json.br +0 -0
  327. codex/static_root/manifest.45cb46e19686.json.gz +0 -0
  328. codex/static_root/manifest.json +300 -377
  329. codex/static_root/manifest.json.br +0 -0
  330. codex/static_root/manifest.json.gz +0 -0
  331. codex/static_root/staticfiles.json +1 -1
  332. codex/status_controller.py +6 -5
  333. codex/threads.py +1 -1
  334. codex/urls/api/auth.py +1 -1
  335. codex/urls/api/browser.py +1 -1
  336. codex/views/admin/library.py +13 -18
  337. codex/views/admin/stats.py +16 -23
  338. codex/views/admin/tasks.py +2 -1
  339. codex/views/auth.py +77 -42
  340. codex/views/bookmark.py +153 -16
  341. codex/views/browser/annotations.py +339 -0
  342. codex/views/browser/base.py +139 -0
  343. codex/views/browser/breadcrumbs.py +11 -90
  344. codex/views/browser/browser.py +110 -44
  345. codex/views/browser/choices.py +18 -15
  346. codex/views/browser/cover.py +20 -10
  347. codex/views/browser/filters/annotations.py +125 -0
  348. codex/views/browser/filters/bookmark.py +19 -18
  349. codex/views/browser/filters/field.py +3 -8
  350. codex/views/browser/filters/group.py +6 -9
  351. codex/views/browser/filters/search/fts.py +19 -5
  352. codex/views/browser/filters/search/parse.py +24 -54
  353. codex/views/browser/metadata.py +332 -0
  354. codex/views/browser/mtime.py +10 -2
  355. codex/views/browser/order_by.py +22 -22
  356. codex/views/browser/page_in_bounds.py +2 -2
  357. codex/views/browser/paginate.py +15 -9
  358. codex/views/browser/title.py +6 -1
  359. codex/views/browser/validate.py +33 -68
  360. codex/views/download.py +1 -1
  361. codex/views/mixins.py +15 -27
  362. codex/views/opds/const.py +3 -2
  363. codex/views/opds/urls.py +2 -2
  364. codex/views/opds/util.py +3 -2
  365. codex/views/opds/v1/entry/links.py +1 -3
  366. codex/views/opds/v1/facets.py +12 -65
  367. codex/views/opds/v1/feed.py +64 -5
  368. codex/views/opds/v1/links.py +4 -5
  369. codex/views/opds/v2/feed.py +28 -1
  370. codex/views/opds/v2/links.py +1 -26
  371. codex/views/opds/v2/publications.py +6 -5
  372. codex/views/opds/v2/top_links.py +6 -3
  373. codex/views/public.py +2 -2
  374. codex/views/reader/arcs.py +3 -0
  375. codex/views/reader/books.py +41 -57
  376. codex/views/reader/{params.py → init.py} +31 -37
  377. codex/views/reader/page.py +4 -10
  378. codex/views/reader/reader.py +2 -1
  379. codex/views/session.py +54 -43
  380. codex/views/version.py +1 -1
  381. {codex-1.7.0.dist-info → codex-1.7.0a0.dist-info}/METADATA +5 -2
  382. {codex-1.7.0.dist-info → codex-1.7.0a0.dist-info}/RECORD +385 -419
  383. codex/choices.py +0 -419
  384. codex/choices_to_json.py +0 -122
  385. codex/librarian/bookmark/__init__.py +0 -1
  386. codex/librarian/bookmark/bookmarkd.py +0 -38
  387. codex/librarian/bookmark/tasks.py +0 -19
  388. codex/librarian/bookmark/update.py +0 -154
  389. codex/static_root/assets/VCheckbox-D_CWEmqR.84f2b49311e8.js +0 -1
  390. codex/static_root/assets/VCheckbox-D_CWEmqR.84f2b49311e8.js.br +0 -0
  391. codex/static_root/assets/VCheckbox-D_CWEmqR.84f2b49311e8.js.gz +0 -0
  392. codex/static_root/assets/VCheckbox-D_CWEmqR.js +0 -1
  393. codex/static_root/assets/VCheckbox-D_CWEmqR.js.br +0 -0
  394. codex/static_root/assets/VCheckbox-D_CWEmqR.js.gz +0 -0
  395. codex/static_root/assets/VCheckboxBtn-B1BhcFvi.0eaf3c516474.js +0 -1
  396. codex/static_root/assets/VCheckboxBtn-B1BhcFvi.0eaf3c516474.js.br +0 -0
  397. codex/static_root/assets/VCheckboxBtn-B1BhcFvi.0eaf3c516474.js.gz +0 -0
  398. codex/static_root/assets/VCheckboxBtn-B1BhcFvi.js +0 -1
  399. codex/static_root/assets/VCheckboxBtn-B1BhcFvi.js.br +0 -0
  400. codex/static_root/assets/VCheckboxBtn-B1BhcFvi.js.gz +0 -0
  401. codex/static_root/assets/VCombobox-CZAW6_3Q.0e2401e819a5.js +0 -1
  402. codex/static_root/assets/VCombobox-CZAW6_3Q.0e2401e819a5.js.br +0 -0
  403. codex/static_root/assets/VCombobox-CZAW6_3Q.0e2401e819a5.js.gz +0 -0
  404. codex/static_root/assets/VCombobox-CZAW6_3Q.js +0 -1
  405. codex/static_root/assets/VCombobox-CZAW6_3Q.js.br +0 -0
  406. codex/static_root/assets/VCombobox-CZAW6_3Q.js.gz +0 -0
  407. codex/static_root/assets/VDialog-CSHgHIlG.a0bcd336cb7b.js +0 -1
  408. codex/static_root/assets/VDialog-CSHgHIlG.a0bcd336cb7b.js.br +0 -0
  409. codex/static_root/assets/VDialog-CSHgHIlG.a0bcd336cb7b.js.gz +0 -0
  410. codex/static_root/assets/VDialog-CSHgHIlG.js +0 -1
  411. codex/static_root/assets/VDialog-CSHgHIlG.js.br +0 -0
  412. codex/static_root/assets/VDialog-CSHgHIlG.js.gz +0 -0
  413. codex/static_root/assets/VDialog-CSvrKKb2.css +0 -1
  414. codex/static_root/assets/VDialog-CSvrKKb2.css.br +0 -0
  415. codex/static_root/assets/VDialog-CSvrKKb2.css.gz +0 -0
  416. codex/static_root/assets/VDialog-CSvrKKb2.fd4d50904b17.css +0 -1
  417. codex/static_root/assets/VDialog-CSvrKKb2.fd4d50904b17.css.br +0 -0
  418. codex/static_root/assets/VDialog-CSvrKKb2.fd4d50904b17.css.gz +0 -0
  419. codex/static_root/assets/VExpansionPanels-CG6MpdMC.e96ae8afad97.js +0 -1
  420. codex/static_root/assets/VExpansionPanels-CG6MpdMC.e96ae8afad97.js.br +0 -0
  421. codex/static_root/assets/VExpansionPanels-CG6MpdMC.e96ae8afad97.js.gz +0 -0
  422. codex/static_root/assets/VExpansionPanels-CG6MpdMC.js +0 -1
  423. codex/static_root/assets/VExpansionPanels-CG6MpdMC.js.br +0 -0
  424. codex/static_root/assets/VExpansionPanels-CG6MpdMC.js.gz +0 -0
  425. codex/static_root/assets/VRadioGroup-CAgQxkiU.f26ecb0c3e34.js +0 -1
  426. codex/static_root/assets/VRadioGroup-CAgQxkiU.f26ecb0c3e34.js.br +0 -0
  427. codex/static_root/assets/VRadioGroup-CAgQxkiU.f26ecb0c3e34.js.gz +0 -0
  428. codex/static_root/assets/VRadioGroup-CAgQxkiU.js +0 -1
  429. codex/static_root/assets/VRadioGroup-CAgQxkiU.js.br +0 -0
  430. codex/static_root/assets/VRadioGroup-CAgQxkiU.js.gz +0 -0
  431. codex/static_root/assets/VSelect-C1gez8rl.9b11d2f00faf.js +0 -1
  432. codex/static_root/assets/VSelect-C1gez8rl.9b11d2f00faf.js.br +0 -0
  433. codex/static_root/assets/VSelect-C1gez8rl.9b11d2f00faf.js.gz +0 -0
  434. codex/static_root/assets/VSelect-C1gez8rl.js +0 -1
  435. codex/static_root/assets/VSelect-C1gez8rl.js.br +0 -0
  436. codex/static_root/assets/VSelect-C1gez8rl.js.gz +0 -0
  437. codex/static_root/assets/VSelect-DLu8bpcs.98bdcf35411c.css +0 -1
  438. codex/static_root/assets/VSelect-DLu8bpcs.98bdcf35411c.css.br +0 -0
  439. codex/static_root/assets/VSelect-DLu8bpcs.98bdcf35411c.css.gz +0 -0
  440. codex/static_root/assets/VSelect-DLu8bpcs.css +0 -1
  441. codex/static_root/assets/VSelect-DLu8bpcs.css.br +0 -0
  442. codex/static_root/assets/VSelect-DLu8bpcs.css.gz +0 -0
  443. codex/static_root/assets/VSelectionControl-DBqDlKjK.160beaa1b56c.js +0 -1
  444. codex/static_root/assets/VSelectionControl-DBqDlKjK.160beaa1b56c.js.br +0 -0
  445. codex/static_root/assets/VSelectionControl-DBqDlKjK.160beaa1b56c.js.gz +0 -0
  446. codex/static_root/assets/VSelectionControl-DBqDlKjK.js +0 -1
  447. codex/static_root/assets/VSelectionControl-DBqDlKjK.js.br +0 -0
  448. codex/static_root/assets/VSelectionControl-DBqDlKjK.js.gz +0 -0
  449. codex/static_root/assets/VSlideGroup-BtXPhMOT.830f136ffd41.css +0 -1
  450. codex/static_root/assets/VSlideGroup-BtXPhMOT.830f136ffd41.css.br +0 -0
  451. codex/static_root/assets/VSlideGroup-BtXPhMOT.830f136ffd41.css.gz +0 -0
  452. codex/static_root/assets/VSlideGroup-BtXPhMOT.css +0 -1
  453. codex/static_root/assets/VSlideGroup-BtXPhMOT.css.br +0 -0
  454. codex/static_root/assets/VSlideGroup-BtXPhMOT.css.gz +0 -0
  455. codex/static_root/assets/VSlideGroup-SqR_NAL1.40ba1d838a6e.js +0 -1
  456. codex/static_root/assets/VSlideGroup-SqR_NAL1.40ba1d838a6e.js.br +0 -0
  457. codex/static_root/assets/VSlideGroup-SqR_NAL1.40ba1d838a6e.js.gz +0 -0
  458. codex/static_root/assets/VSlideGroup-SqR_NAL1.js +0 -1
  459. codex/static_root/assets/VSlideGroup-SqR_NAL1.js.br +0 -0
  460. codex/static_root/assets/VSlideGroup-SqR_NAL1.js.gz +0 -0
  461. codex/static_root/assets/VTable-CYC-wMpk.8f15d66044da.js +0 -1
  462. codex/static_root/assets/VTable-CYC-wMpk.8f15d66044da.js.br +0 -0
  463. codex/static_root/assets/VTable-CYC-wMpk.8f15d66044da.js.gz +0 -0
  464. codex/static_root/assets/VTable-CYC-wMpk.js +0 -1
  465. codex/static_root/assets/VTable-CYC-wMpk.js.br +0 -0
  466. codex/static_root/assets/VTable-CYC-wMpk.js.gz +0 -0
  467. codex/static_root/assets/VTextField-BnCEPZIq.b0c32b2c0b14.css +0 -1
  468. codex/static_root/assets/VTextField-BnCEPZIq.b0c32b2c0b14.css.br +0 -0
  469. codex/static_root/assets/VTextField-BnCEPZIq.b0c32b2c0b14.css.gz +0 -0
  470. codex/static_root/assets/VTextField-BnCEPZIq.css +0 -1
  471. codex/static_root/assets/VTextField-BnCEPZIq.css.br +0 -0
  472. codex/static_root/assets/VTextField-BnCEPZIq.css.gz +0 -0
  473. codex/static_root/assets/VTextField-DMRKRbbT.911ac84d8c9d.js +0 -1
  474. codex/static_root/assets/VTextField-DMRKRbbT.911ac84d8c9d.js.br +0 -0
  475. codex/static_root/assets/VTextField-DMRKRbbT.911ac84d8c9d.js.gz +0 -0
  476. codex/static_root/assets/VTextField-DMRKRbbT.js +0 -1
  477. codex/static_root/assets/VTextField-DMRKRbbT.js.br +0 -0
  478. codex/static_root/assets/VTextField-DMRKRbbT.js.gz +0 -0
  479. codex/static_root/assets/VWindowItem-D0P2xNJl.6a10e3f3a153.js +0 -1
  480. codex/static_root/assets/VWindowItem-D0P2xNJl.6a10e3f3a153.js.br +0 -0
  481. codex/static_root/assets/VWindowItem-D0P2xNJl.6a10e3f3a153.js.gz +0 -0
  482. codex/static_root/assets/VWindowItem-D0P2xNJl.js +0 -1
  483. codex/static_root/assets/VWindowItem-D0P2xNJl.js.br +0 -0
  484. codex/static_root/assets/VWindowItem-D0P2xNJl.js.gz +0 -0
  485. codex/static_root/assets/admin-CD90VMen.4c2b6f2a5111.js +0 -1
  486. codex/static_root/assets/admin-CD90VMen.4c2b6f2a5111.js.br +0 -0
  487. codex/static_root/assets/admin-CD90VMen.4c2b6f2a5111.js.gz +0 -0
  488. codex/static_root/assets/admin-CD90VMen.js +0 -1
  489. codex/static_root/assets/admin-CD90VMen.js.br +0 -0
  490. codex/static_root/assets/admin-CD90VMen.js.gz +0 -0
  491. codex/static_root/assets/admin-DJ7pIXDQ.css.br +0 -0
  492. codex/static_root/assets/admin-DJ7pIXDQ.css.gz +0 -0
  493. codex/static_root/assets/admin-DJ7pIXDQ.e2a77af73ef2.css.br +0 -0
  494. codex/static_root/assets/admin-DJ7pIXDQ.e2a77af73ef2.css.gz +0 -0
  495. codex/static_root/assets/admin-menu-B9bzD6hV.c13b7df2ff57.css +0 -1
  496. codex/static_root/assets/admin-menu-B9bzD6hV.c13b7df2ff57.css.br +0 -0
  497. codex/static_root/assets/admin-menu-B9bzD6hV.c13b7df2ff57.css.gz +0 -0
  498. codex/static_root/assets/admin-menu-B9bzD6hV.css +0 -1
  499. codex/static_root/assets/admin-menu-B9bzD6hV.css.br +0 -0
  500. codex/static_root/assets/admin-menu-B9bzD6hV.css.gz +0 -0
  501. codex/static_root/assets/admin-menu-BpEPGKr_.c9f9178c5a82.js +0 -1
  502. codex/static_root/assets/admin-menu-BpEPGKr_.c9f9178c5a82.js.br +0 -0
  503. codex/static_root/assets/admin-menu-BpEPGKr_.c9f9178c5a82.js.gz +0 -0
  504. codex/static_root/assets/admin-menu-BpEPGKr_.js +0 -1
  505. codex/static_root/assets/admin-menu-BpEPGKr_.js.br +0 -0
  506. codex/static_root/assets/admin-menu-BpEPGKr_.js.gz +0 -0
  507. codex/static_root/assets/admin-settings-button-progress-DDF4rY07.4f1158b650ab.js +0 -1
  508. codex/static_root/assets/admin-settings-button-progress-DDF4rY07.4f1158b650ab.js.br +0 -0
  509. codex/static_root/assets/admin-settings-button-progress-DDF4rY07.4f1158b650ab.js.gz +0 -0
  510. codex/static_root/assets/admin-settings-button-progress-DDF4rY07.js +0 -1
  511. codex/static_root/assets/admin-settings-button-progress-DDF4rY07.js.br +0 -0
  512. codex/static_root/assets/admin-settings-button-progress-DDF4rY07.js.gz +0 -0
  513. codex/static_root/assets/admin-settings-button-progress-DUUQfVsZ.2548c49a853e.css +0 -1
  514. codex/static_root/assets/admin-settings-button-progress-DUUQfVsZ.css +0 -1
  515. codex/static_root/assets/browser-C0KS3g2E.0bf1c9c6319c.js +0 -1
  516. codex/static_root/assets/browser-C0KS3g2E.0bf1c9c6319c.js.br +0 -0
  517. codex/static_root/assets/browser-C0KS3g2E.0bf1c9c6319c.js.gz +0 -0
  518. codex/static_root/assets/browser-C0KS3g2E.js +0 -1
  519. codex/static_root/assets/browser-C0KS3g2E.js.br +0 -0
  520. codex/static_root/assets/browser-C0KS3g2E.js.gz +0 -0
  521. codex/static_root/assets/browser-JFL2hLjt.21cb2f7335f7.css +0 -1
  522. codex/static_root/assets/browser-JFL2hLjt.21cb2f7335f7.css.br +0 -0
  523. codex/static_root/assets/browser-JFL2hLjt.21cb2f7335f7.css.gz +0 -0
  524. codex/static_root/assets/browser-JFL2hLjt.css +0 -1
  525. codex/static_root/assets/browser-JFL2hLjt.css.br +0 -0
  526. codex/static_root/assets/browser-JFL2hLjt.css.gz +0 -0
  527. codex/static_root/assets/change-password-dialog-DXJalgW4.a9f34729599d.js +0 -1
  528. codex/static_root/assets/change-password-dialog-DXJalgW4.a9f34729599d.js.br +0 -0
  529. codex/static_root/assets/change-password-dialog-DXJalgW4.a9f34729599d.js.gz +0 -0
  530. codex/static_root/assets/change-password-dialog-DXJalgW4.js +0 -1
  531. codex/static_root/assets/change-password-dialog-DXJalgW4.js.br +0 -0
  532. codex/static_root/assets/change-password-dialog-DXJalgW4.js.gz +0 -0
  533. codex/static_root/assets/change-password-dialog-DrIXdKUC.217574b45b02.css +0 -1
  534. codex/static_root/assets/change-password-dialog-DrIXdKUC.217574b45b02.css.br +0 -0
  535. codex/static_root/assets/change-password-dialog-DrIXdKUC.217574b45b02.css.gz +0 -0
  536. codex/static_root/assets/change-password-dialog-DrIXdKUC.css +0 -1
  537. codex/static_root/assets/change-password-dialog-DrIXdKUC.css.br +0 -0
  538. codex/static_root/assets/change-password-dialog-DrIXdKUC.css.gz +0 -0
  539. codex/static_root/assets/confirm-dialog-B7w6z2rf.472011c06253.css +0 -1
  540. codex/static_root/assets/confirm-dialog-B7w6z2rf.css +0 -1
  541. codex/static_root/assets/confirm-dialog-CqDEpU9k.e1811488121d.js +0 -1
  542. codex/static_root/assets/confirm-dialog-CqDEpU9k.e1811488121d.js.br +0 -0
  543. codex/static_root/assets/confirm-dialog-CqDEpU9k.e1811488121d.js.gz +0 -0
  544. codex/static_root/assets/confirm-dialog-CqDEpU9k.js +0 -1
  545. codex/static_root/assets/confirm-dialog-CqDEpU9k.js.br +0 -0
  546. codex/static_root/assets/confirm-dialog-CqDEpU9k.js.gz +0 -0
  547. codex/static_root/assets/datetime-column-UxNaJr8b.c06a11531af3.js +0 -1
  548. codex/static_root/assets/datetime-column-UxNaJr8b.c06a11531af3.js.br +0 -0
  549. codex/static_root/assets/datetime-column-UxNaJr8b.c06a11531af3.js.gz +0 -0
  550. codex/static_root/assets/datetime-column-UxNaJr8b.js +0 -1
  551. codex/static_root/assets/datetime-column-UxNaJr8b.js.br +0 -0
  552. codex/static_root/assets/datetime-column-UxNaJr8b.js.gz +0 -0
  553. codex/static_root/assets/filter-DskcqZHA.e707b5a05b4b.js +0 -1
  554. codex/static_root/assets/filter-DskcqZHA.e707b5a05b4b.js.br +0 -0
  555. codex/static_root/assets/filter-DskcqZHA.e707b5a05b4b.js.gz +0 -0
  556. codex/static_root/assets/filter-DskcqZHA.js +0 -1
  557. codex/static_root/assets/filter-DskcqZHA.js.br +0 -0
  558. codex/static_root/assets/filter-DskcqZHA.js.gz +0 -0
  559. codex/static_root/assets/flag-tab-CqWovuBu.4dfc6b251e85.css +0 -1
  560. codex/static_root/assets/flag-tab-CqWovuBu.4dfc6b251e85.css.br +0 -0
  561. codex/static_root/assets/flag-tab-CqWovuBu.4dfc6b251e85.css.gz +0 -0
  562. codex/static_root/assets/flag-tab-CqWovuBu.css +0 -1
  563. codex/static_root/assets/flag-tab-CqWovuBu.css.br +0 -0
  564. codex/static_root/assets/flag-tab-CqWovuBu.css.gz +0 -0
  565. codex/static_root/assets/flag-tab-xBeWEQ0w.582e77d9e885.js +0 -1
  566. codex/static_root/assets/flag-tab-xBeWEQ0w.582e77d9e885.js.br +0 -0
  567. codex/static_root/assets/flag-tab-xBeWEQ0w.582e77d9e885.js.gz +0 -0
  568. codex/static_root/assets/flag-tab-xBeWEQ0w.js +0 -1
  569. codex/static_root/assets/flag-tab-xBeWEQ0w.js.br +0 -0
  570. codex/static_root/assets/flag-tab-xBeWEQ0w.js.gz +0 -0
  571. codex/static_root/assets/group-tab-Czt2x61x.56e2886b1bac.js +0 -1
  572. codex/static_root/assets/group-tab-Czt2x61x.56e2886b1bac.js.br +0 -0
  573. codex/static_root/assets/group-tab-Czt2x61x.56e2886b1bac.js.gz +0 -0
  574. codex/static_root/assets/group-tab-Czt2x61x.js +0 -1
  575. codex/static_root/assets/group-tab-Czt2x61x.js.br +0 -0
  576. codex/static_root/assets/group-tab-Czt2x61x.js.gz +0 -0
  577. codex/static_root/assets/group-tab-DkIN1Heu.948e907b1e6b.css +0 -1
  578. codex/static_root/assets/group-tab-DkIN1Heu.948e907b1e6b.css.br +0 -0
  579. codex/static_root/assets/group-tab-DkIN1Heu.948e907b1e6b.css.gz +0 -0
  580. codex/static_root/assets/group-tab-DkIN1Heu.css +0 -1
  581. codex/static_root/assets/group-tab-DkIN1Heu.css.br +0 -0
  582. codex/static_root/assets/group-tab-DkIN1Heu.css.gz +0 -0
  583. codex/static_root/assets/http-error-NHcwE5e_.d49089e40589.js +0 -1
  584. codex/static_root/assets/http-error-NHcwE5e_.d49089e40589.js.br +0 -0
  585. codex/static_root/assets/http-error-NHcwE5e_.d49089e40589.js.gz +0 -0
  586. codex/static_root/assets/http-error-NHcwE5e_.js +0 -1
  587. codex/static_root/assets/http-error-NHcwE5e_.js.br +0 -0
  588. codex/static_root/assets/http-error-NHcwE5e_.js.gz +0 -0
  589. codex/static_root/assets/index-CL_6g4tJ.523d7b3d350f.css +0 -1
  590. codex/static_root/assets/index-CL_6g4tJ.523d7b3d350f.css.br +0 -0
  591. codex/static_root/assets/index-CL_6g4tJ.523d7b3d350f.css.gz +0 -0
  592. codex/static_root/assets/index-CL_6g4tJ.css +0 -1
  593. codex/static_root/assets/index-CL_6g4tJ.css.br +0 -0
  594. codex/static_root/assets/index-CL_6g4tJ.css.gz +0 -0
  595. codex/static_root/assets/index-DYNNO5kn.24a2d270253a.js +0 -1
  596. codex/static_root/assets/index-DYNNO5kn.24a2d270253a.js.br +0 -0
  597. codex/static_root/assets/index-DYNNO5kn.24a2d270253a.js.gz +0 -0
  598. codex/static_root/assets/index-DYNNO5kn.js +0 -1
  599. codex/static_root/assets/index-DYNNO5kn.js.br +0 -0
  600. codex/static_root/assets/index-DYNNO5kn.js.gz +0 -0
  601. codex/static_root/assets/library-tab-CgIqcjvj.60327dfa8ecb.js +0 -1
  602. codex/static_root/assets/library-tab-CgIqcjvj.60327dfa8ecb.js.br +0 -0
  603. codex/static_root/assets/library-tab-CgIqcjvj.60327dfa8ecb.js.gz +0 -0
  604. codex/static_root/assets/library-tab-CgIqcjvj.js +0 -1
  605. codex/static_root/assets/library-tab-CgIqcjvj.js.br +0 -0
  606. codex/static_root/assets/library-tab-CgIqcjvj.js.gz +0 -0
  607. codex/static_root/assets/library-tab-Wew8YOLv.0c1780a6b68e.css.br +0 -0
  608. codex/static_root/assets/library-tab-Wew8YOLv.0c1780a6b68e.css.gz +0 -0
  609. codex/static_root/assets/library-tab-Wew8YOLv.css.br +0 -0
  610. codex/static_root/assets/library-tab-Wew8YOLv.css.gz +0 -0
  611. codex/static_root/assets/main-B3EwXQ3Q.14dfc21e272c.js +0 -35
  612. codex/static_root/assets/main-B3EwXQ3Q.14dfc21e272c.js.br +0 -0
  613. codex/static_root/assets/main-B3EwXQ3Q.14dfc21e272c.js.gz +0 -0
  614. codex/static_root/assets/main-B3EwXQ3Q.js +0 -35
  615. codex/static_root/assets/main-B3EwXQ3Q.js.br +0 -0
  616. codex/static_root/assets/main-B3EwXQ3Q.js.gz +0 -0
  617. codex/static_root/assets/pager-full-pdf-YkzUXx0B.f39d84e2380a.js +0 -1
  618. codex/static_root/assets/pager-full-pdf-YkzUXx0B.f39d84e2380a.js.br +0 -0
  619. codex/static_root/assets/pager-full-pdf-YkzUXx0B.f39d84e2380a.js.gz +0 -0
  620. codex/static_root/assets/pager-full-pdf-YkzUXx0B.js +0 -1
  621. codex/static_root/assets/pager-full-pdf-YkzUXx0B.js.br +0 -0
  622. codex/static_root/assets/pager-full-pdf-YkzUXx0B.js.gz +0 -0
  623. codex/static_root/assets/pagination-toolbar-CrruiVov.3bf9b795350d.js +0 -1
  624. codex/static_root/assets/pagination-toolbar-CrruiVov.3bf9b795350d.js.br +0 -0
  625. codex/static_root/assets/pagination-toolbar-CrruiVov.3bf9b795350d.js.gz +0 -0
  626. codex/static_root/assets/pagination-toolbar-CrruiVov.js +0 -1
  627. codex/static_root/assets/pagination-toolbar-CrruiVov.js.br +0 -0
  628. codex/static_root/assets/pagination-toolbar-CrruiVov.js.gz +0 -0
  629. codex/static_root/assets/pdf-doc-ctqZIwOP.7e7b2c815ea4.js.br +0 -0
  630. codex/static_root/assets/pdf-doc-ctqZIwOP.7e7b2c815ea4.js.gz +0 -0
  631. codex/static_root/assets/pdf-doc-ctqZIwOP.js.br +0 -0
  632. codex/static_root/assets/pdf-doc-ctqZIwOP.js.gz +0 -0
  633. codex/static_root/assets/reader-DPLhdrJD.268417c618c5.js +0 -2
  634. codex/static_root/assets/reader-DPLhdrJD.268417c618c5.js.br +0 -0
  635. codex/static_root/assets/reader-DPLhdrJD.268417c618c5.js.gz +0 -0
  636. codex/static_root/assets/reader-DPLhdrJD.js +0 -2
  637. codex/static_root/assets/reader-DPLhdrJD.js.br +0 -0
  638. codex/static_root/assets/reader-DPLhdrJD.js.gz +0 -0
  639. codex/static_root/assets/reader-nD70BeEz.06e85e73c391.css.br +0 -0
  640. codex/static_root/assets/reader-nD70BeEz.06e85e73c391.css.gz +0 -0
  641. codex/static_root/assets/reader-nD70BeEz.css.br +0 -0
  642. codex/static_root/assets/reader-nD70BeEz.css.gz +0 -0
  643. codex/static_root/assets/relation-chips-DOALMcWL.5d3b8100ba03.js +0 -1
  644. codex/static_root/assets/relation-chips-DOALMcWL.5d3b8100ba03.js.br +0 -0
  645. codex/static_root/assets/relation-chips-DOALMcWL.5d3b8100ba03.js.gz +0 -0
  646. codex/static_root/assets/relation-chips-DOALMcWL.js +0 -1
  647. codex/static_root/assets/relation-chips-DOALMcWL.js.br +0 -0
  648. codex/static_root/assets/relation-chips-DOALMcWL.js.gz +0 -0
  649. codex/static_root/assets/settings-drawer-BVj1U_LC.c68369e0c2de.js +0 -2
  650. codex/static_root/assets/settings-drawer-BVj1U_LC.c68369e0c2de.js.br +0 -0
  651. codex/static_root/assets/settings-drawer-BVj1U_LC.c68369e0c2de.js.gz +0 -0
  652. codex/static_root/assets/settings-drawer-BVj1U_LC.js +0 -2
  653. codex/static_root/assets/settings-drawer-BVj1U_LC.js.br +0 -0
  654. codex/static_root/assets/settings-drawer-BVj1U_LC.js.gz +0 -0
  655. codex/static_root/assets/stats-tab-BAYTqQNg.5f715428c394.css.br +0 -0
  656. codex/static_root/assets/stats-tab-BAYTqQNg.5f715428c394.css.gz +0 -0
  657. codex/static_root/assets/stats-tab-BAYTqQNg.css.br +0 -0
  658. codex/static_root/assets/stats-tab-BAYTqQNg.css.gz +0 -0
  659. codex/static_root/assets/stats-tab-DDLwwwnP.35305258097b.js +0 -1
  660. codex/static_root/assets/stats-tab-DDLwwwnP.35305258097b.js.br +0 -0
  661. codex/static_root/assets/stats-tab-DDLwwwnP.35305258097b.js.gz +0 -0
  662. codex/static_root/assets/stats-tab-DDLwwwnP.js +0 -1
  663. codex/static_root/assets/stats-tab-DDLwwwnP.js.br +0 -0
  664. codex/static_root/assets/stats-tab-DDLwwwnP.js.gz +0 -0
  665. codex/static_root/assets/task-tab--cXi48kg.5dfd6890a1c2.css +0 -1
  666. codex/static_root/assets/task-tab--cXi48kg.5dfd6890a1c2.css.gz +0 -0
  667. codex/static_root/assets/task-tab--cXi48kg.css +0 -1
  668. codex/static_root/assets/task-tab--cXi48kg.css.gz +0 -0
  669. codex/static_root/assets/task-tab-BpP3n2dO.c853eb565200.js +0 -1
  670. codex/static_root/assets/task-tab-BpP3n2dO.c853eb565200.js.br +0 -0
  671. codex/static_root/assets/task-tab-BpP3n2dO.c853eb565200.js.gz +0 -0
  672. codex/static_root/assets/task-tab-BpP3n2dO.js +0 -1
  673. codex/static_root/assets/task-tab-BpP3n2dO.js.br +0 -0
  674. codex/static_root/assets/task-tab-BpP3n2dO.js.gz +0 -0
  675. codex/static_root/assets/transition-3g2arGgl.c6e6f91b7978.js +0 -1
  676. codex/static_root/assets/transition-3g2arGgl.c6e6f91b7978.js.br +0 -0
  677. codex/static_root/assets/transition-3g2arGgl.c6e6f91b7978.js.gz +0 -0
  678. codex/static_root/assets/transition-3g2arGgl.js +0 -1
  679. codex/static_root/assets/transition-3g2arGgl.js.br +0 -0
  680. codex/static_root/assets/transition-3g2arGgl.js.gz +0 -0
  681. codex/static_root/assets/transition-5LRFTPo5.3d726f9bbcb0.css +0 -1
  682. codex/static_root/assets/transition-5LRFTPo5.3d726f9bbcb0.css.br +0 -4
  683. codex/static_root/assets/transition-5LRFTPo5.3d726f9bbcb0.css.gz +0 -0
  684. codex/static_root/assets/transition-5LRFTPo5.css +0 -1
  685. codex/static_root/assets/transition-5LRFTPo5.css.br +0 -4
  686. codex/static_root/assets/transition-5LRFTPo5.css.gz +0 -0
  687. codex/static_root/assets/unauthorized-CdumQ1Vf.79d9a61eb572.js +0 -1
  688. codex/static_root/assets/unauthorized-CdumQ1Vf.79d9a61eb572.js.br +0 -0
  689. codex/static_root/assets/unauthorized-CdumQ1Vf.79d9a61eb572.js.gz +0 -0
  690. codex/static_root/assets/unauthorized-CdumQ1Vf.js +0 -1
  691. codex/static_root/assets/unauthorized-CdumQ1Vf.js.br +0 -0
  692. codex/static_root/assets/unauthorized-CdumQ1Vf.js.gz +0 -0
  693. codex/static_root/assets/user-tab-D6oOKZTP.05944b00c700.js +0 -1
  694. codex/static_root/assets/user-tab-D6oOKZTP.05944b00c700.js.br +0 -0
  695. codex/static_root/assets/user-tab-D6oOKZTP.05944b00c700.js.gz +0 -0
  696. codex/static_root/assets/user-tab-D6oOKZTP.js +0 -1
  697. codex/static_root/assets/user-tab-D6oOKZTP.js.br +0 -0
  698. codex/static_root/assets/user-tab-D6oOKZTP.js.gz +0 -0
  699. codex/static_root/manifest.c5f1de88b1ac.json +0 -712
  700. codex/static_root/manifest.c5f1de88b1ac.json.br +0 -0
  701. codex/static_root/manifest.c5f1de88b1ac.json.gz +0 -0
  702. codex/views/browser/annotate/__init__.py +0 -1
  703. codex/views/browser/annotate/bookmark.py +0 -112
  704. codex/views/browser/annotate/card.py +0 -61
  705. codex/views/browser/annotate/order.py +0 -247
  706. codex/views/browser/filters/filter.py +0 -69
  707. codex/views/browser/group_mtime.py +0 -83
  708. codex/views/browser/metadata/__init__.py +0 -1
  709. codex/views/browser/metadata/annotate.py +0 -109
  710. codex/views/browser/metadata/copy_intersections.py +0 -90
  711. codex/views/browser/metadata/metadata.py +0 -83
  712. codex/views/browser/metadata/query_intersections.py +0 -112
  713. codex/views/browser/params.py +0 -64
  714. codex/views/timezone.py +0 -54
  715. {codex-1.7.0.dist-info → codex-1.7.0a0.dist-info}/LICENSE +0 -0
  716. {codex-1.7.0.dist-info → codex-1.7.0a0.dist-info}/WHEEL +0 -0
  717. {codex-1.7.0.dist-info → codex-1.7.0a0.dist-info}/entry_points.txt +0 -0
codex/choices.py DELETED
@@ -1,419 +0,0 @@
1
- """Frontend Choices, Defaults and Messages."""
2
-
3
- from collections.abc import Mapping
4
- from types import MappingProxyType
5
-
6
- BROWSER_BOOKMARK_FILTER_CHOICES = MappingProxyType(
7
- {
8
- "": "All",
9
- "IN_PROGRESS": "In Progress",
10
- "READ": "Read",
11
- "UNREAD": "Unread",
12
- },
13
- )
14
- BROWSER_ORDER_BY_CHOICES = MappingProxyType(
15
- {
16
- "age_rating": "Age Rating",
17
- "bookmark_updated_at": "Last Read",
18
- "community_rating": "Community Rating",
19
- "created_at": "Added Time",
20
- "critical_rating": "Critical Rating",
21
- "date": "Publish Date",
22
- "filename": "Filename",
23
- "page_count": "Page Count",
24
- "search_score": "Search Score",
25
- "size": "File Size",
26
- "sort_name": "Name",
27
- "story_arc_number": "Story Arc Number",
28
- "updated_at": "Updated Time",
29
- }
30
- )
31
- _GROUP_NAMES = {
32
- "p": "Publishers",
33
- "i": "Imprints",
34
- "s": "Series",
35
- "v": "Volumes",
36
- }
37
- BROWSER_TOP_GROUP_CHOICES = MappingProxyType(
38
- {
39
- **_GROUP_NAMES,
40
- "c": "Issues",
41
- "f": "Folders",
42
- "a": "Story Arcs",
43
- },
44
- )
45
- VUETIFY_NULL_CODE = -1
46
- BROWSER_CHOICES = MappingProxyType(
47
- {
48
- "bookmark_filter": BROWSER_BOOKMARK_FILTER_CHOICES,
49
- "order_by": BROWSER_ORDER_BY_CHOICES,
50
- "top_group": BROWSER_TOP_GROUP_CHOICES,
51
- "vuetify_null_code": VUETIFY_NULL_CODE,
52
- "settings_group": {**_GROUP_NAMES},
53
- "identifier_types": {
54
- "comicvine": "Comic Vine",
55
- "comixology": "Comixology",
56
- "asin": "Amazon",
57
- "gtin": "GTIN",
58
- "isbn": "ISBN",
59
- "upc": "UPC",
60
- },
61
- }
62
- )
63
-
64
- READER_CHOICES = MappingProxyType(
65
- {
66
- "fit_to": MappingProxyType(
67
- {
68
- "H": "Fit to Height",
69
- "O": "Original Size",
70
- "S": "Fit to Screen",
71
- "W": "Fit to Width",
72
- }
73
- ),
74
- "reading_direction": MappingProxyType(
75
- {
76
- "btt": "Bottom to Top",
77
- "ltr": "Left to Right",
78
- "rtl": "Right to Left",
79
- "ttb": "Top to Bottom",
80
- }
81
- ),
82
- }
83
- )
84
- DEFAULT_BROWSER_ROUTE = MappingProxyType({"group": "r", "pks": (0,), "page": 1})
85
- _DEFAULT_BROWSER_BREADCRUMBS = (DEFAULT_BROWSER_ROUTE,)
86
- _DEFAULT_SHOW = MappingProxyType({"i": False, "p": True, "s": True, "v": False})
87
- BROWSER_DEFAULTS = MappingProxyType(
88
- {
89
- "bookmark_filter": "",
90
- "breadcrumbs": _DEFAULT_BROWSER_BREADCRUMBS,
91
- "custom_covers": True,
92
- "dynamic_covers": True,
93
- "order_by": "sort_name",
94
- "order_reverse": False,
95
- "q": "",
96
- # "search_results_limit": 100,
97
- "show": _DEFAULT_SHOW,
98
- "top_group": "p",
99
- "twenty_four_hour_time": False,
100
- }
101
- )
102
- READER_DEFAULTS = MappingProxyType(
103
- {
104
- "finish_on_last_page": True,
105
- "fit_to": "S",
106
- "reading_direction": "ltr",
107
- "read_rtl_in_reverse": False,
108
- "two_pages": False,
109
- }
110
- )
111
-
112
- ADMIN_FLAG_CHOICES = MappingProxyType(
113
- {
114
- "AU": "Auto Update",
115
- "FV": "Folder View",
116
- "IM": "Import Metadata on Library Scan",
117
- "NU": "Non Users",
118
- "RG": "Registration",
119
- "ST": "Send Stats",
120
- }
121
- )
122
-
123
- ADMIN_STATUS_TITLES = MappingProxyType(
124
- {
125
- "CCC": "Create Covers",
126
- "CCD": "Remove Covers",
127
- "CFO": "Find Orphan Covers",
128
- "IAF": "Adopt Orphan Folders",
129
- "ICC": "Create Custom Covers",
130
- "ICD": "Delete Custom Covers",
131
- "ICL": "Link Custom Covers",
132
- "ICM": "Custom Covers Moved",
133
- "ICQ": "Discover Missing Custom Covers",
134
- "ICU": "Modify Custom Covers",
135
- "IDD": "Remove Folders",
136
- "IDM": "Move Folders",
137
- "IDU": "Modify Folders",
138
- "IFC": "Create Books",
139
- "IFD": "Remove Books",
140
- "IFI": "Record Failed Imports",
141
- "IFM": "Move Books",
142
- "IFU": "Modify Books",
143
- "IGU": "Update First Covers",
144
- "IMC": "Link Books to Tags",
145
- "IMQ": "Prepare Tags for Linking",
146
- "ITC": "Create Missing Tags",
147
- "ITQ": "Discover Missing Tags",
148
- "ITR": "Read Book Tags",
149
- "JCB": "Cleanup Orphan Bookmarks",
150
- "JCD": "Cleanup Custom Covers",
151
- "JCR": "Restart Codex",
152
- "JCS": "Stop Codex",
153
- "JCU": "Update Codex Software",
154
- "JDB": "Backup Database",
155
- "JDO": "Optimize Database",
156
- "JFC": "Search Index Integrity Check",
157
- "JFR": "Search Index Repair",
158
- "JIC": "Database Integrity Check",
159
- "JIF": "Database Foreign Key Check",
160
- "JLV": "Check Codex Latest Version",
161
- "JSD": "Cleanup Expired Sessions",
162
- "JTD": "Cleanup Stale Tags",
163
- "SIC": "Search Index Create",
164
- "SID": "Search Index Remove Stale Records",
165
- "SIO": "Search Index Optimize",
166
- "SIU": "Search Index Update",
167
- "SIX": "Search Index Clear",
168
- "WPO": "Poll Library",
169
- }
170
- )
171
-
172
- # Easier to store in vuetify format
173
- ADMIN_TASK_GROUPS = MappingProxyType(
174
- {
175
- "tasks": (
176
- {
177
- "title": "Libraries",
178
- "tasks": [
179
- {
180
- "value": "poll",
181
- "title": "Poll All Libraries",
182
- "desc": "Update Libraries if changes detected",
183
- },
184
- {
185
- "value": "poll_force",
186
- "title": "Force Update All Libraries",
187
- "desc": "Forcibly update all comics in all libraries",
188
- "confirm": "This can take a long time",
189
- },
190
- {
191
- "value": "force_update_all_failed_imports",
192
- "title": "Update All Failed Imports",
193
- "desc": "Forcibly update all failed imports in all libraries",
194
- "confirm": "This can take a long time",
195
- },
196
- {
197
- "value": "watchdog_sync",
198
- "title": "Sync Watchdog with DB",
199
- "desc": "Ensure the Watchdog file watcher is enabled per database preferences for each library",
200
- },
201
- ],
202
- },
203
- {
204
- "title": "Covers",
205
- "tasks": [
206
- {
207
- "value": "purge_comic_covers",
208
- "title": "Remove Comic Covers",
209
- "desc": "from every library",
210
- "confirm": "Are you sure?",
211
- },
212
- {
213
- "value": "create_all_comic_covers",
214
- "title": "Create All Comic Covers",
215
- "desc": "Pre-generate covers for every comic in every library and all custom covers",
216
- "confirm": "Are you sure?",
217
- },
218
- {
219
- "value": "force_update_groups",
220
- "title": "Update Group Timestamps",
221
- "desc": "Force the update of group timestamps. Will bust the browser cache for browser views and covers.",
222
- },
223
- ],
224
- },
225
- {
226
- "title": "Search Index",
227
- "tasks": [
228
- {
229
- "value": "search_index_update",
230
- "title": "Update Search Index",
231
- "desc": "with recently changed comics",
232
- },
233
- {
234
- "value": "search_index_optimize",
235
- "title": "Optimize Search Index",
236
- "desc": "Merge Search Index for optimal lookup time. Runs nightly.",
237
- },
238
- {
239
- "value": "search_index_rebuild",
240
- "title": "Rebuild Search Index",
241
- "desc": "Delete and rebuild the search index from scratch",
242
- "confirm": "This can take a long time",
243
- },
244
- {
245
- "value": "search_index_remove_stale",
246
- "title": "Remove Stale Index Entries",
247
- "desc": "Remove search index entries that are no longer in the library.",
248
- },
249
- {
250
- "value": "search_index_abort",
251
- "title": "Abort Search Indexing",
252
- "desc": "Aborts search index update and remove tasks.",
253
- },
254
- {
255
- "value": "search_index_clear",
256
- "title": "Clear Search Index",
257
- "desc": "of all entries",
258
- },
259
- {
260
- "value": "db_fts_integrity_check",
261
- "title": "Integrity Check Search Index",
262
- "desc": "Repairs Search Index on failure. Runs nightly",
263
- },
264
- {
265
- "value": "db_fts_rebuild",
266
- "title": "Repair Search Index",
267
- "desc": "Probably faster than Rebuild if integrity check fails.",
268
- },
269
- ],
270
- },
271
- {
272
- "title": "Database",
273
- "tasks": [
274
- {
275
- "value": "db_vacuum",
276
- "title": "Optimize & Compact Database",
277
- "desc": "Run the sqlite3 OPTIMIZE and VACUUM pragmas. Runs nightly",
278
- },
279
- {
280
- "value": "db_backup",
281
- "title": "Backup Database",
282
- "desc": "Runs nightly",
283
- },
284
- {
285
- "value": "db_foreign_key_check",
286
- "title": "Remove Illegal Foreign Keys",
287
- "desc": "Check for and remove illegal foreign keys. Mark affected comics for update. Runs nightly.",
288
- },
289
- {
290
- "value": "db_integrity_check",
291
- "title": "Check Database Integrity",
292
- "desc": "Check logs for results. Runs nightly.",
293
- "confirm": "Can take a while on large databases, Are you sure?",
294
- },
295
- ],
296
- },
297
- {
298
- "title": "Codex Software",
299
- "tasks": [
300
- {
301
- "value": "codex_latest_version",
302
- "title": "Check for Codex Latest Version",
303
- "desc": "Check PyPi for the latest version of Codex",
304
- },
305
- {
306
- "value": "codex_update",
307
- "title": "Update Codex",
308
- "desc": "If Codex updates to a new version, it will restart",
309
- "confirm": "Are you sure?",
310
- },
311
- {
312
- "value": "codex_restart",
313
- "title": "Restart Codex Server",
314
- "desc": "Immediately",
315
- "confirm": "Are you sure?",
316
- },
317
- {
318
- "value": "codex_shutdown",
319
- "title": "Shutdown Codex Server",
320
- "desc": "Immediately",
321
- "confirm": "Are you sure?",
322
- },
323
- ],
324
- },
325
- {
326
- "title": "Notify",
327
- "tasks": [
328
- {
329
- "value": "notify_library_changed",
330
- "title": "Notify Library Changed ",
331
- "desc": "Signal all clients that the libraries have changed and the browser should fetch new data.",
332
- },
333
- {
334
- "value": "notify_librarian_status",
335
- "title": "Notify Librarian Status",
336
- "desc": "Signal Admin clients to fetch librarian status.",
337
- },
338
- ],
339
- },
340
- {
341
- "title": "Cleanup",
342
- "tasks": [
343
- {
344
- "value": "cleanup_fks",
345
- "title": "Remove Orphan Tags",
346
- "desc": "After deleting comics, unused linked objects remain in case new comics use them. Runs nightly.",
347
- },
348
- {
349
- "value": "cleanup_db_custom_covers",
350
- "title": "Remove Orphan Database Custom Covers",
351
- "desc": "Remove Custom Covers from the db that no longer represent custom cover images on disk. Runs nightly.",
352
- },
353
- {
354
- "value": "cleanup_sessions",
355
- "title": "Cleanup Sessions",
356
- "desc": "Remove corrupt and expired sessions. Runs nightly.",
357
- },
358
- {
359
- "value": "cleanup_covers",
360
- "title": "Remove Orphan Cover Thumbnails",
361
- "desc": "no longer have source comics or custom images. Runs nightly.",
362
- },
363
- {
364
- "value": "cleanup_bookmarks",
365
- "title": "Remove Orphan Bookmarks",
366
- "desc": "Owned by no session or user. Runs nightly.",
367
- },
368
- {
369
- "value": "adopt_folders",
370
- "title": "Adopt Orphan Folders",
371
- "desc": "Move orphaned folders from the top of the folder tree to under their correct parent. Runs nightly and at startup.",
372
- },
373
- {
374
- "value": "librarian_clear_status",
375
- "title": "Clear Librarian Statuses",
376
- "desc": "Mark all Librarian tasks finished.",
377
- },
378
- {
379
- "value": "janitor_nightly",
380
- "title": "Run Nightly Maintenance",
381
- "desc": "Runs several tasks above that also run nightly.",
382
- "confirm": "Launches several tasks that run nightly anyway.",
383
- },
384
- ],
385
- },
386
- )
387
- }
388
- )
389
-
390
-
391
- def _group_task_values(groups):
392
- """Extract values into sorted tuple."""
393
- values = []
394
- for group in groups["tasks"]:
395
- for item in group["tasks"]:
396
- values.append(item["value"])
397
- return tuple(sorted(values))
398
-
399
-
400
- ADMIN_TASKS = _group_task_values(ADMIN_TASK_GROUPS)
401
- WEBSOCKET_MESSAGES = MappingProxyType(
402
- {
403
- "messages": {
404
- "FAILED_IMPORTS": "FAILED_IMPORTS",
405
- "LIBRARY_CHANGED": "LIBRARY_CHANGED",
406
- "LIBRARIAN_STATUS": "LIBRARIAN_STATUS",
407
- }
408
- }
409
- )
410
- DUMMY_NULL_NAME = "_none_"
411
-
412
-
413
- def mapping_to_dict(data):
414
- """Convert nested Mapping objects to dicts."""
415
- if isinstance(data, Mapping):
416
- return {key: mapping_to_dict(value) for key, value in data.items()}
417
- if isinstance(data, list | tuple | frozenset | set):
418
- return [mapping_to_dict(item) for item in data]
419
- return data
codex/choices_to_json.py DELETED
@@ -1,122 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Dump choices to JSON."""
3
-
4
- import json
5
- from collections.abc import Mapping
6
- from pathlib import Path
7
- from types import MappingProxyType
8
-
9
- from caseconverter import camelcase
10
-
11
- from codex.choices import (
12
- ADMIN_FLAG_CHOICES,
13
- ADMIN_STATUS_TITLES,
14
- ADMIN_TASK_GROUPS,
15
- BROWSER_CHOICES,
16
- BROWSER_DEFAULTS,
17
- READER_CHOICES,
18
- READER_DEFAULTS,
19
- WEBSOCKET_MESSAGES,
20
- )
21
-
22
- _DEFAULTS = MappingProxyType(
23
- {"browser-choices.json": BROWSER_DEFAULTS, "reader-choices.json": READER_DEFAULTS}
24
- )
25
-
26
- _DUMPS = MappingProxyType(
27
- {
28
- "admin-flag-choices.json": ADMIN_FLAG_CHOICES,
29
- "admin-status-titles.json": ADMIN_STATUS_TITLES,
30
- "browser-choices.json": BROWSER_CHOICES,
31
- "reader-choices.json": READER_CHOICES,
32
- }
33
- )
34
-
35
- _MAP_DUMPS = MappingProxyType(
36
- {
37
- "admin-tasks.json": ADMIN_TASK_GROUPS,
38
- "browser-defaults.json": BROWSER_DEFAULTS,
39
- "browser-map.json": BROWSER_CHOICES,
40
- "reader-map.json": READER_CHOICES,
41
- "websocket-messages.json": WEBSOCKET_MESSAGES,
42
- }
43
- )
44
-
45
-
46
- def _to_vuetify_choices(defaults, key, obj_map):
47
- """Transform a dict into a list of vuetify choices."""
48
- default = defaults.get(key)
49
- vuetify_list = []
50
- for value, title in obj_map.items():
51
- vuetify_dict = {
52
- "value": value,
53
- "title": title,
54
- }
55
- if default == value:
56
- vuetify_dict["default"] = True
57
- vuetify_list.append(vuetify_dict)
58
- return vuetify_list
59
-
60
-
61
- def _json_key(key):
62
- """Transform key to json version."""
63
- return key if key.upper() == key else camelcase(key)
64
-
65
-
66
- def _make_json_serializable(data):
67
- """Convert nested Mapping objects to dicts."""
68
- if isinstance(data, Mapping):
69
- json_dict = {}
70
- for key, value in data.items():
71
- if key == "pks":
72
- # Special route serializer
73
- # XXX possibly should use actual route serializer for route not just pks
74
- json_dict[key] = ",".join(str(pk) for pk in sorted(value))
75
- else:
76
- json_dict[_json_key(key)] = _make_json_serializable(value)
77
- return json_dict
78
- if isinstance(data, list | tuple | frozenset | set):
79
- return [_make_json_serializable(item) for item in data]
80
- return data
81
-
82
-
83
- def _to_vuetify_dict(fn, data):
84
- """Convert mappings to vuetify dict list."""
85
- vuetify_data = {}
86
- defaults = _DEFAULTS.get(fn) or {}
87
- for key, obj in data.items():
88
- if isinstance(obj, Mapping):
89
- vuetify_value = _to_vuetify_choices(defaults, key, obj)
90
- else:
91
- vuetify_value = _make_json_serializable(obj)
92
- vuetify_data[_json_key(key)] = vuetify_value
93
- return vuetify_data
94
-
95
-
96
- def _dump(parent_path, fn, data, vuetify=True):
97
- """Dump data to json file."""
98
- vuetify_data = (
99
- _to_vuetify_dict(fn, data) if vuetify else _make_json_serializable(data)
100
- )
101
- path = parent_path / Path(fn)
102
- with path.open("w") as json_file:
103
- json.dump(vuetify_data, json_file, indent=2)
104
- json_file.write("\n")
105
-
106
-
107
- def main():
108
- """Dump all files."""
109
- import sys
110
-
111
- parent_path = sys.argv[1] if len(sys.argv) > 1 else "."
112
- parent_path = Path(parent_path)
113
- parent_path.mkdir(exist_ok=True)
114
- for fn, data in _DUMPS.items():
115
- _dump(parent_path, fn, data)
116
-
117
- for fn, data in _MAP_DUMPS.items():
118
- _dump(parent_path, fn, data, False)
119
-
120
-
121
- if __name__ == "__main__":
122
- main()
@@ -1 +0,0 @@
1
- """Bookmark Thread."""
@@ -1,38 +0,0 @@
1
- """Sends notifications to connections, reading from a queue."""
2
-
3
- from codex.librarian.bookmark.tasks import BookmarkUpdateTask
4
- from codex.librarian.bookmark.update import BookmarkUpdate
5
- from codex.threads import AggregateMessageQueuedThread
6
-
7
-
8
- class BookmarkThread(AggregateMessageQueuedThread, BookmarkUpdate):
9
- """Aggregates Bookmark updates preventing floods updates db in batches.."""
10
-
11
- FLOOD_DELAY = 3.0
12
- MAX_DELAY = 5.0
13
-
14
- def aggregate_items(self, item):
15
- """Aggregate bookmark updates."""
16
- if isinstance(item, BookmarkUpdateTask):
17
- key = (tuple(item.auth_filter.items()), tuple(item.comic_filter.items()))
18
- if key not in self.cache:
19
- self.cache[key] = {}
20
- self.cache[key].update(item.updates)
21
- else:
22
- self.log.warning(f"Unknown Bookmark task {item}")
23
-
24
- def send_all_items(self):
25
- """Run the task method."""
26
- cleanup = set()
27
- for filters, updates in self.cache.items():
28
- try:
29
- auth_filter, comic_filter = filters
30
- auth_filter = dict(auth_filter)
31
- comic_filter = dict(comic_filter)
32
- self.update_bookmarks(auth_filter, comic_filter, updates)
33
- self.log.debug(f"updated {auth_filter | comic_filter}")
34
- cleanup.add(filters)
35
- except Exception:
36
- self.log.exception("Updating bookmarks")
37
-
38
- self.cleanup_cache(cleanup)
@@ -1,19 +0,0 @@
1
- """Bookmark Tasks."""
2
-
3
- from collections.abc import Mapping
4
- from dataclasses import dataclass
5
- from typing import Any
6
-
7
-
8
- @dataclass
9
- class BookmarkTask:
10
- """Bookmark Base Class."""
11
-
12
-
13
- @dataclass
14
- class BookmarkUpdateTask(BookmarkTask):
15
- """Bookmark a page."""
16
-
17
- auth_filter: Mapping[str, int | str]
18
- comic_filter: Mapping[str, Any]
19
- updates: Mapping[str, Any]