codex 1.8.6__py3-none-any.whl → 1.8.9__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (531) hide show
  1. codex/choices/admin.py +1 -0
  2. codex/librarian/scribe/importer/const.py +7 -3
  3. codex/librarian/scribe/importer/create/comics.py +0 -3
  4. codex/librarian/scribe/importer/delete/comics.py +5 -2
  5. codex/librarian/scribe/importer/delete/folders.py +2 -1
  6. codex/librarian/scribe/importer/link/many_to_many.py +1 -0
  7. codex/librarian/scribe/importer/link/prepare.py +6 -1
  8. codex/librarian/scribe/importer/query/update_comics.py +22 -12
  9. codex/librarian/scribe/importer/read/aggregate_path.py +53 -13
  10. codex/librarian/scribe/importer/read/extract.py +16 -13
  11. codex/librarian/scribe/importer/search/prepare.py +1 -8
  12. codex/librarian/scribe/importer/search/sync_m2m.py +2 -1
  13. codex/librarian/scribe/importer/search/update.py +28 -86
  14. codex/librarian/scribe/{importer/search → search}/const.py +1 -13
  15. codex/librarian/scribe/search/prepare.py +162 -0
  16. codex/librarian/scribe/search/remove.py +22 -2
  17. codex/librarian/scribe/search/sync.py +47 -134
  18. codex/migrations/0035_fts_optmize.py +136 -0
  19. codex/models/comic.py +0 -16
  20. codex/models/functions.py +3 -1
  21. codex/serializers/admin/tasks.py +1 -1
  22. codex/settings/__init__.py +17 -1
  23. codex/static_root/assets/VCheckbox-BI6iNIZR.0d8e2dbdeb09.js +1 -0
  24. codex/static_root/assets/VCheckbox-BI6iNIZR.0d8e2dbdeb09.js.br +0 -0
  25. codex/static_root/assets/VCheckbox-BI6iNIZR.0d8e2dbdeb09.js.gz +0 -0
  26. codex/static_root/assets/VCheckbox-BI6iNIZR.js +1 -0
  27. codex/static_root/assets/VCheckbox-BI6iNIZR.js.br +0 -0
  28. codex/static_root/assets/VCheckbox-BI6iNIZR.js.gz +0 -0
  29. codex/static_root/assets/{VCheckboxBtn-BzgViWAb.1400a41af9da.js → VCheckboxBtn-D_jRtvPm.7d253b804bed.js} +1 -1
  30. codex/static_root/assets/VCheckboxBtn-D_jRtvPm.7d253b804bed.js.br +0 -0
  31. codex/static_root/assets/VCheckboxBtn-D_jRtvPm.7d253b804bed.js.gz +0 -0
  32. codex/static_root/assets/{VCheckboxBtn-BzgViWAb.js → VCheckboxBtn-D_jRtvPm.js} +1 -1
  33. codex/static_root/assets/VCheckboxBtn-D_jRtvPm.js.br +0 -0
  34. codex/static_root/assets/VCheckboxBtn-D_jRtvPm.js.gz +0 -0
  35. codex/static_root/assets/VCombobox-lKOmP-Yq.85384eec8906.js +1 -0
  36. codex/static_root/assets/VCombobox-lKOmP-Yq.85384eec8906.js.br +0 -0
  37. codex/static_root/assets/VCombobox-lKOmP-Yq.85384eec8906.js.gz +0 -0
  38. codex/static_root/assets/VCombobox-lKOmP-Yq.js +1 -0
  39. codex/static_root/assets/VCombobox-lKOmP-Yq.js.br +0 -0
  40. codex/static_root/assets/VCombobox-lKOmP-Yq.js.gz +0 -0
  41. codex/static_root/assets/VDialog-DwpHVF2o.f988d86f776c.js +1 -0
  42. codex/static_root/assets/VDialog-DwpHVF2o.f988d86f776c.js.br +0 -0
  43. codex/static_root/assets/VDialog-DwpHVF2o.f988d86f776c.js.gz +0 -0
  44. codex/static_root/assets/VDialog-DwpHVF2o.js +1 -0
  45. codex/static_root/assets/VDialog-DwpHVF2o.js.br +0 -0
  46. codex/static_root/assets/VDialog-DwpHVF2o.js.gz +0 -0
  47. codex/static_root/assets/{VDivider-CSRFyKQO.5f8e1ffafbaf.js → VDivider-CGh9hHPI.8fac42f0d85c.js} +1 -1
  48. codex/static_root/assets/VDivider-CGh9hHPI.8fac42f0d85c.js.br +0 -0
  49. codex/static_root/assets/VDivider-CGh9hHPI.8fac42f0d85c.js.gz +0 -0
  50. codex/static_root/assets/{VDivider-CSRFyKQO.js → VDivider-CGh9hHPI.js} +1 -1
  51. codex/static_root/assets/VDivider-CGh9hHPI.js.br +0 -0
  52. codex/static_root/assets/VDivider-CGh9hHPI.js.gz +0 -0
  53. codex/static_root/assets/{VExpansionPanels-82Ocr2Kh.1ccaea91f07c.js → VExpansionPanels-DFd72CFw.b232fadc31db.js} +1 -1
  54. codex/static_root/assets/VExpansionPanels-DFd72CFw.b232fadc31db.js.br +0 -0
  55. codex/static_root/assets/VExpansionPanels-DFd72CFw.b232fadc31db.js.gz +0 -0
  56. codex/static_root/assets/{VExpansionPanels-82Ocr2Kh.js → VExpansionPanels-DFd72CFw.js} +1 -1
  57. codex/static_root/assets/VExpansionPanels-DFd72CFw.js.br +0 -0
  58. codex/static_root/assets/VExpansionPanels-DFd72CFw.js.gz +0 -0
  59. codex/static_root/assets/{VForm-BaeKMRS9.be058cf1518f.js → VForm-C7W9kTbJ.02412068f578.js} +1 -1
  60. codex/static_root/assets/VForm-C7W9kTbJ.02412068f578.js.br +0 -0
  61. codex/static_root/assets/VForm-C7W9kTbJ.02412068f578.js.gz +0 -0
  62. codex/static_root/assets/{VForm-BaeKMRS9.js → VForm-C7W9kTbJ.js} +1 -1
  63. codex/static_root/assets/VForm-C7W9kTbJ.js.br +0 -0
  64. codex/static_root/assets/VForm-C7W9kTbJ.js.gz +0 -0
  65. codex/static_root/assets/{VRadioGroup-DeB10IRm.4ea874709ffb.js → VRadioGroup-E0wBXF2E.fd8052060d44.js} +1 -1
  66. codex/static_root/assets/VRadioGroup-E0wBXF2E.fd8052060d44.js.br +0 -0
  67. codex/static_root/assets/VRadioGroup-E0wBXF2E.fd8052060d44.js.gz +0 -0
  68. codex/static_root/assets/{VRadioGroup-DeB10IRm.js → VRadioGroup-E0wBXF2E.js} +1 -1
  69. codex/static_root/assets/VRadioGroup-E0wBXF2E.js.br +0 -0
  70. codex/static_root/assets/VRadioGroup-E0wBXF2E.js.gz +0 -0
  71. codex/static_root/assets/VSelect-DLKX5Mr6.d84e1c59fa18.js +1 -0
  72. codex/static_root/assets/VSelect-DLKX5Mr6.d84e1c59fa18.js.br +0 -0
  73. codex/static_root/assets/VSelect-DLKX5Mr6.d84e1c59fa18.js.gz +0 -0
  74. codex/static_root/assets/VSelect-DLKX5Mr6.js +1 -0
  75. codex/static_root/assets/VSelect-DLKX5Mr6.js.br +0 -0
  76. codex/static_root/assets/VSelect-DLKX5Mr6.js.gz +0 -0
  77. codex/static_root/assets/VSelectionControl-B8hJUO0p.1dda62fe0677.js +1 -0
  78. codex/static_root/assets/VSelectionControl-B8hJUO0p.1dda62fe0677.js.br +0 -0
  79. codex/static_root/assets/VSelectionControl-B8hJUO0p.1dda62fe0677.js.gz +0 -0
  80. codex/static_root/assets/VSelectionControl-B8hJUO0p.js +1 -0
  81. codex/static_root/assets/VSelectionControl-B8hJUO0p.js.br +0 -0
  82. codex/static_root/assets/VSelectionControl-B8hJUO0p.js.gz +0 -0
  83. codex/static_root/assets/VTable-BsI6FsWH.css +1 -0
  84. codex/static_root/assets/VTable-BsI6FsWH.css.br +0 -0
  85. codex/static_root/assets/VTable-BsI6FsWH.css.gz +0 -0
  86. codex/static_root/assets/VTable-BsI6FsWH.d4c54d44a5ab.css +1 -0
  87. codex/static_root/assets/VTable-BsI6FsWH.d4c54d44a5ab.css.br +0 -0
  88. codex/static_root/assets/VTable-BsI6FsWH.d4c54d44a5ab.css.gz +0 -0
  89. codex/static_root/assets/VTable-D0uqeonL.a9897896b818.js +1 -0
  90. codex/static_root/assets/VTable-D0uqeonL.a9897896b818.js.br +0 -0
  91. codex/static_root/assets/VTable-D0uqeonL.a9897896b818.js.gz +0 -0
  92. codex/static_root/assets/VTable-D0uqeonL.js +1 -0
  93. codex/static_root/assets/VTable-D0uqeonL.js.br +0 -0
  94. codex/static_root/assets/VTable-D0uqeonL.js.gz +0 -0
  95. codex/static_root/assets/{VWindowItem-Dwb7oeu0.6a4505330db3.js → VWindowItem-DnxUM-gG.242f232488e3.js} +1 -1
  96. codex/static_root/assets/VWindowItem-DnxUM-gG.242f232488e3.js.br +0 -0
  97. codex/static_root/assets/VWindowItem-DnxUM-gG.242f232488e3.js.gz +0 -0
  98. codex/static_root/assets/{VWindowItem-Dwb7oeu0.js → VWindowItem-DnxUM-gG.js} +1 -1
  99. codex/static_root/assets/VWindowItem-DnxUM-gG.js.br +0 -0
  100. codex/static_root/assets/VWindowItem-DnxUM-gG.js.gz +0 -0
  101. codex/static_root/assets/VWindowItem-QQWUVqMX.c22e707ac99c.css +1 -0
  102. codex/static_root/assets/VWindowItem-QQWUVqMX.c22e707ac99c.css.br +5 -0
  103. codex/static_root/assets/VWindowItem-QQWUVqMX.c22e707ac99c.css.gz +0 -0
  104. codex/static_root/assets/VWindowItem-QQWUVqMX.css +1 -0
  105. codex/static_root/assets/VWindowItem-QQWUVqMX.css.br +5 -0
  106. codex/static_root/assets/VWindowItem-QQWUVqMX.css.gz +0 -0
  107. codex/static_root/assets/{admin-mQ-F7brp.cc388b064f3a.js → admin-B9U01BEM.7c8747c54803.js} +1 -1
  108. codex/static_root/assets/admin-B9U01BEM.7c8747c54803.js.br +0 -0
  109. codex/static_root/assets/admin-B9U01BEM.7c8747c54803.js.gz +0 -0
  110. codex/static_root/assets/{admin-mQ-F7brp.js → admin-B9U01BEM.js} +1 -1
  111. codex/static_root/assets/admin-B9U01BEM.js.br +0 -0
  112. codex/static_root/assets/admin-B9U01BEM.js.gz +0 -0
  113. codex/static_root/assets/{admin-nYIgbfe8.d2acbae0b198.js → admin-DmYMMUnm.58b7b9f4dadf.js} +1 -1
  114. codex/static_root/assets/admin-DmYMMUnm.58b7b9f4dadf.js.br +0 -0
  115. codex/static_root/assets/admin-DmYMMUnm.58b7b9f4dadf.js.gz +0 -0
  116. codex/static_root/assets/{admin-nYIgbfe8.js → admin-DmYMMUnm.js} +1 -1
  117. codex/static_root/assets/admin-DmYMMUnm.js.br +0 -0
  118. codex/static_root/assets/admin-DmYMMUnm.js.gz +0 -0
  119. codex/static_root/assets/admin-menu-CuNW4Urn.25020f907bb8.js +1 -0
  120. codex/static_root/assets/admin-menu-CuNW4Urn.25020f907bb8.js.br +0 -0
  121. codex/static_root/assets/admin-menu-CuNW4Urn.25020f907bb8.js.gz +0 -0
  122. codex/static_root/assets/admin-menu-CuNW4Urn.js +1 -0
  123. codex/static_root/assets/admin-menu-CuNW4Urn.js.br +0 -0
  124. codex/static_root/assets/admin-menu-CuNW4Urn.js.gz +0 -0
  125. codex/static_root/assets/{admin-settings-button-progress-BBRW69l3.697026d00887.js → admin-settings-button-progress-Bzr-gkG2.b17f5bcba7bb.js} +1 -1
  126. codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.b17f5bcba7bb.js.br +3 -0
  127. codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.b17f5bcba7bb.js.gz +0 -0
  128. codex/static_root/assets/{admin-settings-button-progress-BBRW69l3.js → admin-settings-button-progress-Bzr-gkG2.js} +1 -1
  129. codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.js.br +3 -0
  130. codex/static_root/assets/admin-settings-button-progress-Bzr-gkG2.js.gz +0 -0
  131. codex/static_root/assets/browser-CIw7xQ-1.8d16d2b270d5.js +1 -0
  132. codex/static_root/assets/browser-CIw7xQ-1.8d16d2b270d5.js.br +0 -0
  133. codex/static_root/assets/browser-CIw7xQ-1.8d16d2b270d5.js.gz +0 -0
  134. codex/static_root/assets/browser-CIw7xQ-1.js +1 -0
  135. codex/static_root/assets/browser-CIw7xQ-1.js.br +0 -0
  136. codex/static_root/assets/browser-CIw7xQ-1.js.gz +0 -0
  137. codex/static_root/assets/{browser-Cdi7U5ku.bab9fccf0326.css → browser-TRzEFz_k.css} +1 -1
  138. codex/static_root/assets/browser-TRzEFz_k.css.br +0 -0
  139. codex/static_root/assets/browser-TRzEFz_k.css.gz +0 -0
  140. codex/static_root/assets/{browser-Cdi7U5ku.css → browser-TRzEFz_k.e8ae750c4a41.css} +1 -1
  141. codex/static_root/assets/browser-TRzEFz_k.e8ae750c4a41.css.br +0 -0
  142. codex/static_root/assets/browser-TRzEFz_k.e8ae750c4a41.css.gz +0 -0
  143. codex/static_root/assets/change-password-dialog-CXaB7k3y.01788b2cb59e.js +1 -0
  144. codex/static_root/assets/change-password-dialog-CXaB7k3y.01788b2cb59e.js.br +0 -0
  145. codex/static_root/assets/change-password-dialog-CXaB7k3y.01788b2cb59e.js.gz +0 -0
  146. codex/static_root/assets/change-password-dialog-CXaB7k3y.js +1 -0
  147. codex/static_root/assets/change-password-dialog-CXaB7k3y.js.br +0 -0
  148. codex/static_root/assets/change-password-dialog-CXaB7k3y.js.gz +0 -0
  149. codex/static_root/assets/{confirm-dialog-uoXMmYq3.0ec4c4eba588.js → confirm-dialog-gXeRF5bD.4ae6e7a9790a.js} +1 -1
  150. codex/static_root/assets/confirm-dialog-gXeRF5bD.4ae6e7a9790a.js.br +0 -0
  151. codex/static_root/assets/confirm-dialog-gXeRF5bD.4ae6e7a9790a.js.gz +0 -0
  152. codex/static_root/assets/{confirm-dialog-uoXMmYq3.js → confirm-dialog-gXeRF5bD.js} +1 -1
  153. codex/static_root/assets/confirm-dialog-gXeRF5bD.js.br +0 -0
  154. codex/static_root/assets/confirm-dialog-gXeRF5bD.js.gz +0 -0
  155. codex/static_root/assets/{datetime-column-GkTrMP1-.bf4adfaa4e02.js → datetime-column-C5ZBHxV-.35957e684ec2.js} +1 -1
  156. codex/static_root/assets/datetime-column-C5ZBHxV-.35957e684ec2.js.br +0 -0
  157. codex/static_root/assets/datetime-column-C5ZBHxV-.35957e684ec2.js.gz +0 -0
  158. codex/static_root/assets/{datetime-column-GkTrMP1-.js → datetime-column-C5ZBHxV-.js} +1 -1
  159. codex/static_root/assets/datetime-column-C5ZBHxV-.js.br +0 -0
  160. codex/static_root/assets/datetime-column-C5ZBHxV-.js.gz +0 -0
  161. codex/static_root/assets/{filter-CRnAKgPp.cc654b8f8155.js → filter-CQ83UjMF.7cd979df64da.js} +1 -1
  162. codex/static_root/assets/filter-CQ83UjMF.7cd979df64da.js.br +0 -0
  163. codex/static_root/assets/filter-CQ83UjMF.7cd979df64da.js.gz +0 -0
  164. codex/static_root/assets/{filter-CRnAKgPp.js → filter-CQ83UjMF.js} +1 -1
  165. codex/static_root/assets/filter-CQ83UjMF.js.br +0 -0
  166. codex/static_root/assets/filter-CQ83UjMF.js.gz +0 -0
  167. codex/static_root/assets/{flag-tab-BA4kiUXn.408cc0a71ec1.js → flag-tab-CN3Y0PZS.f5f7122a015e.js} +1 -1
  168. codex/static_root/assets/flag-tab-CN3Y0PZS.f5f7122a015e.js.br +0 -0
  169. codex/static_root/assets/flag-tab-CN3Y0PZS.f5f7122a015e.js.gz +0 -0
  170. codex/static_root/assets/{flag-tab-BA4kiUXn.js → flag-tab-CN3Y0PZS.js} +1 -1
  171. codex/static_root/assets/flag-tab-CN3Y0PZS.js.br +0 -0
  172. codex/static_root/assets/flag-tab-CN3Y0PZS.js.gz +0 -0
  173. codex/static_root/assets/{forwardRefs-B_sUWZn6.css → forwardRefs-C3Z4qL85.48fb131ece85.css} +1 -1
  174. codex/static_root/assets/forwardRefs-C3Z4qL85.48fb131ece85.css.br +0 -0
  175. codex/static_root/assets/forwardRefs-C3Z4qL85.48fb131ece85.css.gz +0 -0
  176. codex/static_root/assets/{forwardRefs-B_sUWZn6.5114f206ca9c.css → forwardRefs-C3Z4qL85.css} +1 -1
  177. codex/static_root/assets/forwardRefs-C3Z4qL85.css.br +0 -0
  178. codex/static_root/assets/forwardRefs-C3Z4qL85.css.gz +0 -0
  179. codex/static_root/assets/forwardRefs-DBxFdh0r.03d9552a8e4c.js +1 -0
  180. codex/static_root/assets/forwardRefs-DBxFdh0r.03d9552a8e4c.js.br +0 -0
  181. codex/static_root/assets/forwardRefs-DBxFdh0r.03d9552a8e4c.js.gz +0 -0
  182. codex/static_root/assets/forwardRefs-DBxFdh0r.js +1 -0
  183. codex/static_root/assets/forwardRefs-DBxFdh0r.js.br +0 -0
  184. codex/static_root/assets/forwardRefs-DBxFdh0r.js.gz +0 -0
  185. codex/static_root/assets/{group-tab-BD9iJZwB.b3e2b1b68d3a.js → group-tab-DMPL6FiK.82f53e5c353a.js} +1 -1
  186. codex/static_root/assets/group-tab-DMPL6FiK.82f53e5c353a.js.br +0 -0
  187. codex/static_root/assets/group-tab-DMPL6FiK.82f53e5c353a.js.gz +0 -0
  188. codex/static_root/assets/{group-tab-BD9iJZwB.js → group-tab-DMPL6FiK.js} +1 -1
  189. codex/static_root/assets/group-tab-DMPL6FiK.js.br +0 -0
  190. codex/static_root/assets/group-tab-DMPL6FiK.js.gz +0 -0
  191. codex/static_root/assets/http-error-DgJ8-SFZ.da2fe4d026ce.js +1 -0
  192. codex/static_root/assets/http-error-DgJ8-SFZ.da2fe4d026ce.js.br +0 -0
  193. codex/static_root/assets/http-error-DgJ8-SFZ.da2fe4d026ce.js.gz +0 -0
  194. codex/static_root/assets/http-error-DgJ8-SFZ.js +1 -0
  195. codex/static_root/assets/http-error-DgJ8-SFZ.js.br +0 -0
  196. codex/static_root/assets/http-error-DgJ8-SFZ.js.gz +0 -0
  197. codex/static_root/assets/{index-DCZ6v5x6.848976e7722c.js → index-CQ0ue0KC.b38e465abad4.js} +1 -1
  198. codex/static_root/assets/index-CQ0ue0KC.b38e465abad4.js.br +0 -0
  199. codex/static_root/assets/index-CQ0ue0KC.b38e465abad4.js.gz +0 -0
  200. codex/static_root/assets/{index-DCZ6v5x6.js → index-CQ0ue0KC.js} +1 -1
  201. codex/static_root/assets/index-CQ0ue0KC.js.br +0 -0
  202. codex/static_root/assets/index-CQ0ue0KC.js.gz +0 -0
  203. codex/static_root/assets/library-tab-CfuZgnol.880ba8bd0149.js +1 -0
  204. codex/static_root/assets/library-tab-CfuZgnol.880ba8bd0149.js.br +0 -0
  205. codex/static_root/assets/library-tab-CfuZgnol.880ba8bd0149.js.gz +0 -0
  206. codex/static_root/assets/library-tab-CfuZgnol.js +1 -0
  207. codex/static_root/assets/library-tab-CfuZgnol.js.br +0 -0
  208. codex/static_root/assets/library-tab-CfuZgnol.js.gz +0 -0
  209. codex/static_root/assets/{main-Bmi4BPiO.d75c8b55081b.js → main-G8n9PNCf.cad6fa53a574.js} +16 -16
  210. codex/static_root/assets/main-G8n9PNCf.cad6fa53a574.js.br +0 -0
  211. codex/static_root/assets/main-G8n9PNCf.cad6fa53a574.js.gz +0 -0
  212. codex/static_root/assets/{main-Bmi4BPiO.js → main-G8n9PNCf.js} +16 -16
  213. codex/static_root/assets/main-G8n9PNCf.js.br +0 -0
  214. codex/static_root/assets/main-G8n9PNCf.js.gz +0 -0
  215. codex/static_root/assets/pager-full-pdf-BKZayLN3.4b724ad0595f.js +1 -0
  216. codex/static_root/assets/pager-full-pdf-BKZayLN3.4b724ad0595f.js.br +0 -0
  217. codex/static_root/assets/pager-full-pdf-BKZayLN3.4b724ad0595f.js.gz +0 -0
  218. codex/static_root/assets/pager-full-pdf-BKZayLN3.js +1 -0
  219. codex/static_root/assets/pager-full-pdf-BKZayLN3.js.br +0 -0
  220. codex/static_root/assets/pager-full-pdf-BKZayLN3.js.gz +0 -0
  221. codex/static_root/assets/pagination-toolbar-0vkF7yjo.d32720f76776.js +1 -0
  222. codex/static_root/assets/pagination-toolbar-0vkF7yjo.d32720f76776.js.br +0 -0
  223. codex/static_root/assets/pagination-toolbar-0vkF7yjo.d32720f76776.js.gz +0 -0
  224. codex/static_root/assets/pagination-toolbar-0vkF7yjo.js +1 -0
  225. codex/static_root/assets/pagination-toolbar-0vkF7yjo.js.br +0 -0
  226. codex/static_root/assets/pagination-toolbar-0vkF7yjo.js.gz +0 -0
  227. codex/static_root/assets/{pagination-toolbar-741OafNw.4f9155469274.css → pagination-toolbar-rUdD4-Qi.3a224c7806a5.css} +1 -1
  228. codex/static_root/assets/pagination-toolbar-rUdD4-Qi.3a224c7806a5.css.br +0 -0
  229. codex/static_root/assets/pagination-toolbar-rUdD4-Qi.3a224c7806a5.css.gz +0 -0
  230. codex/static_root/assets/{pagination-toolbar-741OafNw.css → pagination-toolbar-rUdD4-Qi.css} +1 -1
  231. codex/static_root/assets/pagination-toolbar-rUdD4-Qi.css.br +0 -0
  232. codex/static_root/assets/pagination-toolbar-rUdD4-Qi.css.gz +0 -0
  233. codex/static_root/assets/{pdf-doc-DQBmNe4l.8dbdebf30643.js → pdf-doc-CHmFdwy6.4142a4f31d20.js} +1 -1
  234. codex/static_root/assets/pdf-doc-CHmFdwy6.4142a4f31d20.js.br +0 -0
  235. codex/static_root/assets/pdf-doc-CHmFdwy6.4142a4f31d20.js.gz +0 -0
  236. codex/static_root/assets/{pdf-doc-DQBmNe4l.js → pdf-doc-CHmFdwy6.js} +1 -1
  237. codex/static_root/assets/pdf-doc-CHmFdwy6.js.br +0 -0
  238. codex/static_root/assets/pdf-doc-CHmFdwy6.js.gz +0 -0
  239. codex/static_root/assets/reader-YIWmNjj6.c96fc7891aec.js +2 -0
  240. codex/static_root/assets/reader-YIWmNjj6.c96fc7891aec.js.br +0 -0
  241. codex/static_root/assets/reader-YIWmNjj6.c96fc7891aec.js.gz +0 -0
  242. codex/static_root/assets/reader-YIWmNjj6.js +2 -0
  243. codex/static_root/assets/reader-YIWmNjj6.js.br +0 -0
  244. codex/static_root/assets/reader-YIWmNjj6.js.gz +0 -0
  245. codex/static_root/assets/{relation-chips-CcFgPQOM.0b468249b62e.css → relation-chips-CpiT_4k-.b72d78f512e6.css} +1 -1
  246. codex/static_root/assets/relation-chips-CpiT_4k-.b72d78f512e6.css.br +0 -0
  247. codex/static_root/assets/relation-chips-CpiT_4k-.b72d78f512e6.css.gz +0 -0
  248. codex/static_root/assets/{relation-chips-CcFgPQOM.css → relation-chips-CpiT_4k-.css} +1 -1
  249. codex/static_root/assets/relation-chips-CpiT_4k-.css.br +0 -0
  250. codex/static_root/assets/relation-chips-CpiT_4k-.css.gz +0 -0
  251. codex/static_root/assets/relation-chips-DzoiGrOj.95f663c6c18d.js +1 -0
  252. codex/static_root/assets/relation-chips-DzoiGrOj.95f663c6c18d.js.br +0 -0
  253. codex/static_root/assets/relation-chips-DzoiGrOj.95f663c6c18d.js.gz +0 -0
  254. codex/static_root/assets/relation-chips-DzoiGrOj.js +1 -0
  255. codex/static_root/assets/relation-chips-DzoiGrOj.js.br +0 -0
  256. codex/static_root/assets/relation-chips-DzoiGrOj.js.gz +0 -0
  257. codex/static_root/assets/settings-drawer-CUC-r4sg.e019f5467d25.js +2 -0
  258. codex/static_root/assets/settings-drawer-CUC-r4sg.e019f5467d25.js.br +0 -0
  259. codex/static_root/assets/settings-drawer-CUC-r4sg.e019f5467d25.js.gz +0 -0
  260. codex/static_root/assets/settings-drawer-CUC-r4sg.js +2 -0
  261. codex/static_root/assets/settings-drawer-CUC-r4sg.js.br +0 -0
  262. codex/static_root/assets/settings-drawer-CUC-r4sg.js.gz +0 -0
  263. codex/static_root/assets/{ssrBoot-B6P0M2z2.38ab2f4bde57.js → ssrBoot-D7foQ-7h.31c07ef6f646.js} +1 -1
  264. codex/static_root/assets/ssrBoot-D7foQ-7h.31c07ef6f646.js.br +0 -0
  265. codex/static_root/assets/ssrBoot-D7foQ-7h.31c07ef6f646.js.gz +0 -0
  266. codex/static_root/assets/{ssrBoot-B6P0M2z2.js → ssrBoot-D7foQ-7h.js} +1 -1
  267. codex/static_root/assets/ssrBoot-D7foQ-7h.js.br +0 -0
  268. codex/static_root/assets/ssrBoot-D7foQ-7h.js.gz +0 -0
  269. codex/static_root/assets/{stats-tab-C5m62fu3.8482d96809e9.js → stats-tab-BSy-9tZm.2a7560872f5c.js} +1 -1
  270. codex/static_root/assets/stats-tab-BSy-9tZm.2a7560872f5c.js.br +0 -0
  271. codex/static_root/assets/stats-tab-BSy-9tZm.2a7560872f5c.js.gz +0 -0
  272. codex/static_root/assets/{stats-tab-C5m62fu3.js → stats-tab-BSy-9tZm.js} +1 -1
  273. codex/static_root/assets/stats-tab-BSy-9tZm.js.br +0 -0
  274. codex/static_root/assets/stats-tab-BSy-9tZm.js.gz +0 -0
  275. codex/static_root/assets/task-tab-Sp49fYRT.3a1aab3f3716.js +1 -0
  276. codex/static_root/assets/task-tab-Sp49fYRT.3a1aab3f3716.js.br +0 -0
  277. codex/static_root/assets/task-tab-Sp49fYRT.3a1aab3f3716.js.gz +0 -0
  278. codex/static_root/assets/task-tab-Sp49fYRT.js +1 -0
  279. codex/static_root/assets/task-tab-Sp49fYRT.js.br +0 -0
  280. codex/static_root/assets/task-tab-Sp49fYRT.js.gz +0 -0
  281. codex/static_root/assets/{unauthorized-DXoWE_v2.19c70a140f9b.js → unauthorized-BM6KzvCy.4c114d9693c1.js} +1 -1
  282. codex/static_root/assets/unauthorized-BM6KzvCy.4c114d9693c1.js.br +0 -0
  283. codex/static_root/assets/unauthorized-BM6KzvCy.4c114d9693c1.js.gz +0 -0
  284. codex/static_root/assets/{unauthorized-DXoWE_v2.js → unauthorized-BM6KzvCy.js} +1 -1
  285. codex/static_root/assets/unauthorized-BM6KzvCy.js.br +0 -0
  286. codex/static_root/assets/unauthorized-BM6KzvCy.js.gz +0 -0
  287. codex/static_root/assets/user-tab-yQ60jtVd.ad593cc6e6ea.js +1 -0
  288. codex/static_root/assets/user-tab-yQ60jtVd.ad593cc6e6ea.js.br +0 -0
  289. codex/static_root/assets/user-tab-yQ60jtVd.ad593cc6e6ea.js.gz +0 -0
  290. codex/static_root/assets/user-tab-yQ60jtVd.js +1 -0
  291. codex/static_root/assets/user-tab-yQ60jtVd.js.br +0 -0
  292. codex/static_root/assets/user-tab-yQ60jtVd.js.gz +0 -0
  293. codex/static_root/{manifest.db295ed1ca03.json → manifest.a059c4dc5443.json} +308 -308
  294. codex/static_root/manifest.a059c4dc5443.json.br +0 -0
  295. codex/static_root/manifest.a059c4dc5443.json.gz +0 -0
  296. codex/static_root/manifest.json +308 -308
  297. codex/static_root/manifest.json.br +0 -0
  298. codex/static_root/manifest.json.gz +0 -0
  299. codex/static_root/staticfiles.json +1 -1
  300. codex/views/browser/filters/filter.py +1 -1
  301. codex/views/browser/filters/search/field/column.py +3 -3
  302. codex/views/browser/filters/search/parse.py +15 -10
  303. {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/METADATA +5 -5
  304. {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/RECORD +307 -305
  305. codex/static_root/assets/VCheckbox--IZv20K5.121e571f623b.js +0 -1
  306. codex/static_root/assets/VCheckbox--IZv20K5.121e571f623b.js.br +0 -0
  307. codex/static_root/assets/VCheckbox--IZv20K5.121e571f623b.js.gz +0 -0
  308. codex/static_root/assets/VCheckbox--IZv20K5.js +0 -1
  309. codex/static_root/assets/VCheckbox--IZv20K5.js.br +0 -0
  310. codex/static_root/assets/VCheckbox--IZv20K5.js.gz +0 -0
  311. codex/static_root/assets/VCheckboxBtn-BzgViWAb.1400a41af9da.js.br +0 -0
  312. codex/static_root/assets/VCheckboxBtn-BzgViWAb.1400a41af9da.js.gz +0 -0
  313. codex/static_root/assets/VCheckboxBtn-BzgViWAb.js.br +0 -0
  314. codex/static_root/assets/VCheckboxBtn-BzgViWAb.js.gz +0 -0
  315. codex/static_root/assets/VCombobox-0VKjtXTP.f7c9bb8e7f77.js +0 -1
  316. codex/static_root/assets/VCombobox-0VKjtXTP.f7c9bb8e7f77.js.br +0 -0
  317. codex/static_root/assets/VCombobox-0VKjtXTP.f7c9bb8e7f77.js.gz +0 -0
  318. codex/static_root/assets/VCombobox-0VKjtXTP.js +0 -1
  319. codex/static_root/assets/VCombobox-0VKjtXTP.js.br +0 -0
  320. codex/static_root/assets/VCombobox-0VKjtXTP.js.gz +0 -0
  321. codex/static_root/assets/VDialog-Oz6-kM3S.2244675141c7.js +0 -1
  322. codex/static_root/assets/VDialog-Oz6-kM3S.2244675141c7.js.br +0 -0
  323. codex/static_root/assets/VDialog-Oz6-kM3S.2244675141c7.js.gz +0 -0
  324. codex/static_root/assets/VDialog-Oz6-kM3S.js +0 -1
  325. codex/static_root/assets/VDialog-Oz6-kM3S.js.br +0 -0
  326. codex/static_root/assets/VDialog-Oz6-kM3S.js.gz +0 -0
  327. codex/static_root/assets/VDivider-CSRFyKQO.5f8e1ffafbaf.js.br +0 -0
  328. codex/static_root/assets/VDivider-CSRFyKQO.5f8e1ffafbaf.js.gz +0 -0
  329. codex/static_root/assets/VDivider-CSRFyKQO.js.br +0 -0
  330. codex/static_root/assets/VDivider-CSRFyKQO.js.gz +0 -0
  331. codex/static_root/assets/VExpansionPanels-82Ocr2Kh.1ccaea91f07c.js.br +0 -0
  332. codex/static_root/assets/VExpansionPanels-82Ocr2Kh.1ccaea91f07c.js.gz +0 -0
  333. codex/static_root/assets/VExpansionPanels-82Ocr2Kh.js.br +0 -0
  334. codex/static_root/assets/VExpansionPanels-82Ocr2Kh.js.gz +0 -0
  335. codex/static_root/assets/VForm-BaeKMRS9.be058cf1518f.js.br +0 -0
  336. codex/static_root/assets/VForm-BaeKMRS9.be058cf1518f.js.gz +0 -0
  337. codex/static_root/assets/VForm-BaeKMRS9.js.br +0 -0
  338. codex/static_root/assets/VForm-BaeKMRS9.js.gz +0 -0
  339. codex/static_root/assets/VRadioGroup-DeB10IRm.4ea874709ffb.js.br +0 -0
  340. codex/static_root/assets/VRadioGroup-DeB10IRm.4ea874709ffb.js.gz +0 -0
  341. codex/static_root/assets/VRadioGroup-DeB10IRm.js.br +0 -0
  342. codex/static_root/assets/VRadioGroup-DeB10IRm.js.gz +0 -0
  343. codex/static_root/assets/VSelect-4ozzBEef.36f749b6f4ab.js +0 -1
  344. codex/static_root/assets/VSelect-4ozzBEef.36f749b6f4ab.js.br +0 -0
  345. codex/static_root/assets/VSelect-4ozzBEef.36f749b6f4ab.js.gz +0 -0
  346. codex/static_root/assets/VSelect-4ozzBEef.js +0 -1
  347. codex/static_root/assets/VSelect-4ozzBEef.js.br +0 -0
  348. codex/static_root/assets/VSelect-4ozzBEef.js.gz +0 -0
  349. codex/static_root/assets/VSelectionControl-D3h7FjSM.6cf4ba197995.js +0 -1
  350. codex/static_root/assets/VSelectionControl-D3h7FjSM.6cf4ba197995.js.br +0 -0
  351. codex/static_root/assets/VSelectionControl-D3h7FjSM.6cf4ba197995.js.gz +0 -0
  352. codex/static_root/assets/VSelectionControl-D3h7FjSM.js +0 -1
  353. codex/static_root/assets/VSelectionControl-D3h7FjSM.js.br +0 -0
  354. codex/static_root/assets/VSelectionControl-D3h7FjSM.js.gz +0 -0
  355. codex/static_root/assets/VTable-CQyv0wyO.1740239d481b.css +0 -1
  356. codex/static_root/assets/VTable-CQyv0wyO.1740239d481b.css.br +0 -0
  357. codex/static_root/assets/VTable-CQyv0wyO.1740239d481b.css.gz +0 -0
  358. codex/static_root/assets/VTable-CQyv0wyO.css +0 -1
  359. codex/static_root/assets/VTable-CQyv0wyO.css.br +0 -0
  360. codex/static_root/assets/VTable-CQyv0wyO.css.gz +0 -0
  361. codex/static_root/assets/VTable-Dj5EC5Aq.7abc9daf78be.js +0 -1
  362. codex/static_root/assets/VTable-Dj5EC5Aq.7abc9daf78be.js.br +0 -0
  363. codex/static_root/assets/VTable-Dj5EC5Aq.7abc9daf78be.js.gz +0 -0
  364. codex/static_root/assets/VTable-Dj5EC5Aq.js +0 -1
  365. codex/static_root/assets/VTable-Dj5EC5Aq.js.br +0 -0
  366. codex/static_root/assets/VTable-Dj5EC5Aq.js.gz +0 -0
  367. codex/static_root/assets/VWindowItem-ChYLiXSE.a9c679a2977e.css +0 -1
  368. codex/static_root/assets/VWindowItem-ChYLiXSE.a9c679a2977e.css.br +0 -0
  369. codex/static_root/assets/VWindowItem-ChYLiXSE.a9c679a2977e.css.gz +0 -0
  370. codex/static_root/assets/VWindowItem-ChYLiXSE.css +0 -1
  371. codex/static_root/assets/VWindowItem-ChYLiXSE.css.br +0 -0
  372. codex/static_root/assets/VWindowItem-ChYLiXSE.css.gz +0 -0
  373. codex/static_root/assets/VWindowItem-Dwb7oeu0.6a4505330db3.js.br +0 -0
  374. codex/static_root/assets/VWindowItem-Dwb7oeu0.6a4505330db3.js.gz +0 -0
  375. codex/static_root/assets/VWindowItem-Dwb7oeu0.js.br +0 -0
  376. codex/static_root/assets/VWindowItem-Dwb7oeu0.js.gz +0 -0
  377. codex/static_root/assets/admin-mQ-F7brp.cc388b064f3a.js.br +0 -0
  378. codex/static_root/assets/admin-mQ-F7brp.cc388b064f3a.js.gz +0 -0
  379. codex/static_root/assets/admin-mQ-F7brp.js.br +0 -0
  380. codex/static_root/assets/admin-mQ-F7brp.js.gz +0 -0
  381. codex/static_root/assets/admin-menu-CfGPKhvz.1e224da855f5.js +0 -1
  382. codex/static_root/assets/admin-menu-CfGPKhvz.1e224da855f5.js.br +0 -0
  383. codex/static_root/assets/admin-menu-CfGPKhvz.1e224da855f5.js.gz +0 -0
  384. codex/static_root/assets/admin-menu-CfGPKhvz.js +0 -1
  385. codex/static_root/assets/admin-menu-CfGPKhvz.js.br +0 -0
  386. codex/static_root/assets/admin-menu-CfGPKhvz.js.gz +0 -0
  387. codex/static_root/assets/admin-nYIgbfe8.d2acbae0b198.js.br +0 -0
  388. codex/static_root/assets/admin-nYIgbfe8.d2acbae0b198.js.gz +0 -0
  389. codex/static_root/assets/admin-nYIgbfe8.js.br +0 -0
  390. codex/static_root/assets/admin-nYIgbfe8.js.gz +0 -0
  391. codex/static_root/assets/admin-settings-button-progress-BBRW69l3.697026d00887.js.br +0 -0
  392. codex/static_root/assets/admin-settings-button-progress-BBRW69l3.697026d00887.js.gz +0 -0
  393. codex/static_root/assets/admin-settings-button-progress-BBRW69l3.js.br +0 -0
  394. codex/static_root/assets/admin-settings-button-progress-BBRW69l3.js.gz +0 -0
  395. codex/static_root/assets/browser-BzV_-1Jg.e39184a92bab.js +0 -1
  396. codex/static_root/assets/browser-BzV_-1Jg.e39184a92bab.js.br +0 -0
  397. codex/static_root/assets/browser-BzV_-1Jg.e39184a92bab.js.gz +0 -0
  398. codex/static_root/assets/browser-BzV_-1Jg.js +0 -1
  399. codex/static_root/assets/browser-BzV_-1Jg.js.br +0 -0
  400. codex/static_root/assets/browser-BzV_-1Jg.js.gz +0 -0
  401. codex/static_root/assets/browser-Cdi7U5ku.bab9fccf0326.css.br +0 -0
  402. codex/static_root/assets/browser-Cdi7U5ku.bab9fccf0326.css.gz +0 -0
  403. codex/static_root/assets/browser-Cdi7U5ku.css.br +0 -0
  404. codex/static_root/assets/browser-Cdi7U5ku.css.gz +0 -0
  405. codex/static_root/assets/change-password-dialog-DpqXgZ53.3f22c3114669.js +0 -1
  406. codex/static_root/assets/change-password-dialog-DpqXgZ53.3f22c3114669.js.br +0 -0
  407. codex/static_root/assets/change-password-dialog-DpqXgZ53.3f22c3114669.js.gz +0 -0
  408. codex/static_root/assets/change-password-dialog-DpqXgZ53.js +0 -1
  409. codex/static_root/assets/change-password-dialog-DpqXgZ53.js.br +0 -0
  410. codex/static_root/assets/change-password-dialog-DpqXgZ53.js.gz +0 -0
  411. codex/static_root/assets/confirm-dialog-uoXMmYq3.0ec4c4eba588.js.br +0 -0
  412. codex/static_root/assets/confirm-dialog-uoXMmYq3.0ec4c4eba588.js.gz +0 -0
  413. codex/static_root/assets/confirm-dialog-uoXMmYq3.js.br +0 -0
  414. codex/static_root/assets/confirm-dialog-uoXMmYq3.js.gz +0 -0
  415. codex/static_root/assets/datetime-column-GkTrMP1-.bf4adfaa4e02.js.br +0 -0
  416. codex/static_root/assets/datetime-column-GkTrMP1-.bf4adfaa4e02.js.gz +0 -0
  417. codex/static_root/assets/datetime-column-GkTrMP1-.js.br +0 -0
  418. codex/static_root/assets/datetime-column-GkTrMP1-.js.gz +0 -0
  419. codex/static_root/assets/filter-CRnAKgPp.cc654b8f8155.js.br +0 -0
  420. codex/static_root/assets/filter-CRnAKgPp.cc654b8f8155.js.gz +0 -0
  421. codex/static_root/assets/filter-CRnAKgPp.js.br +0 -0
  422. codex/static_root/assets/filter-CRnAKgPp.js.gz +0 -0
  423. codex/static_root/assets/flag-tab-BA4kiUXn.408cc0a71ec1.js.br +0 -0
  424. codex/static_root/assets/flag-tab-BA4kiUXn.408cc0a71ec1.js.gz +0 -0
  425. codex/static_root/assets/flag-tab-BA4kiUXn.js.br +0 -0
  426. codex/static_root/assets/flag-tab-BA4kiUXn.js.gz +0 -0
  427. codex/static_root/assets/forwardRefs-B_sUWZn6.5114f206ca9c.css.br +0 -0
  428. codex/static_root/assets/forwardRefs-B_sUWZn6.5114f206ca9c.css.gz +0 -0
  429. codex/static_root/assets/forwardRefs-B_sUWZn6.css.br +0 -0
  430. codex/static_root/assets/forwardRefs-B_sUWZn6.css.gz +0 -0
  431. codex/static_root/assets/forwardRefs-FxOC1qa_.6e14881eedf1.js +0 -1
  432. codex/static_root/assets/forwardRefs-FxOC1qa_.6e14881eedf1.js.br +0 -0
  433. codex/static_root/assets/forwardRefs-FxOC1qa_.6e14881eedf1.js.gz +0 -0
  434. codex/static_root/assets/forwardRefs-FxOC1qa_.js +0 -1
  435. codex/static_root/assets/forwardRefs-FxOC1qa_.js.br +0 -0
  436. codex/static_root/assets/forwardRefs-FxOC1qa_.js.gz +0 -0
  437. codex/static_root/assets/group-tab-BD9iJZwB.b3e2b1b68d3a.js.br +0 -0
  438. codex/static_root/assets/group-tab-BD9iJZwB.b3e2b1b68d3a.js.gz +0 -0
  439. codex/static_root/assets/group-tab-BD9iJZwB.js.br +0 -0
  440. codex/static_root/assets/group-tab-BD9iJZwB.js.gz +0 -0
  441. codex/static_root/assets/http-error-D-b5OfHC.e661fa6e0000.js +0 -1
  442. codex/static_root/assets/http-error-D-b5OfHC.e661fa6e0000.js.br +0 -2
  443. codex/static_root/assets/http-error-D-b5OfHC.e661fa6e0000.js.gz +0 -0
  444. codex/static_root/assets/http-error-D-b5OfHC.js +0 -1
  445. codex/static_root/assets/http-error-D-b5OfHC.js.br +0 -2
  446. codex/static_root/assets/http-error-D-b5OfHC.js.gz +0 -0
  447. codex/static_root/assets/index-DCZ6v5x6.848976e7722c.js.br +0 -0
  448. codex/static_root/assets/index-DCZ6v5x6.848976e7722c.js.gz +0 -0
  449. codex/static_root/assets/index-DCZ6v5x6.js.br +0 -0
  450. codex/static_root/assets/index-DCZ6v5x6.js.gz +0 -0
  451. codex/static_root/assets/library-tab-ju4WtRth.97949bf344d7.js +0 -1
  452. codex/static_root/assets/library-tab-ju4WtRth.97949bf344d7.js.br +0 -0
  453. codex/static_root/assets/library-tab-ju4WtRth.97949bf344d7.js.gz +0 -0
  454. codex/static_root/assets/library-tab-ju4WtRth.js +0 -1
  455. codex/static_root/assets/library-tab-ju4WtRth.js.br +0 -0
  456. codex/static_root/assets/library-tab-ju4WtRth.js.gz +0 -0
  457. codex/static_root/assets/main-Bmi4BPiO.d75c8b55081b.js.br +0 -0
  458. codex/static_root/assets/main-Bmi4BPiO.d75c8b55081b.js.gz +0 -0
  459. codex/static_root/assets/main-Bmi4BPiO.js.br +0 -0
  460. codex/static_root/assets/main-Bmi4BPiO.js.gz +0 -0
  461. codex/static_root/assets/pager-full-pdf-BjSr3CzH.ffbe3d735455.js +0 -1
  462. codex/static_root/assets/pager-full-pdf-BjSr3CzH.ffbe3d735455.js.br +0 -0
  463. codex/static_root/assets/pager-full-pdf-BjSr3CzH.ffbe3d735455.js.gz +0 -0
  464. codex/static_root/assets/pager-full-pdf-BjSr3CzH.js +0 -1
  465. codex/static_root/assets/pager-full-pdf-BjSr3CzH.js.br +0 -0
  466. codex/static_root/assets/pager-full-pdf-BjSr3CzH.js.gz +0 -0
  467. codex/static_root/assets/pagination-toolbar-741OafNw.4f9155469274.css.br +0 -0
  468. codex/static_root/assets/pagination-toolbar-741OafNw.4f9155469274.css.gz +0 -0
  469. codex/static_root/assets/pagination-toolbar-741OafNw.css.br +0 -0
  470. codex/static_root/assets/pagination-toolbar-741OafNw.css.gz +0 -0
  471. codex/static_root/assets/pagination-toolbar-DpMVSiz_.86ce692ff9b4.js +0 -1
  472. codex/static_root/assets/pagination-toolbar-DpMVSiz_.86ce692ff9b4.js.br +0 -0
  473. codex/static_root/assets/pagination-toolbar-DpMVSiz_.86ce692ff9b4.js.gz +0 -0
  474. codex/static_root/assets/pagination-toolbar-DpMVSiz_.js +0 -1
  475. codex/static_root/assets/pagination-toolbar-DpMVSiz_.js.br +0 -0
  476. codex/static_root/assets/pagination-toolbar-DpMVSiz_.js.gz +0 -0
  477. codex/static_root/assets/pdf-doc-DQBmNe4l.8dbdebf30643.js.br +0 -0
  478. codex/static_root/assets/pdf-doc-DQBmNe4l.8dbdebf30643.js.gz +0 -0
  479. codex/static_root/assets/pdf-doc-DQBmNe4l.js.br +0 -0
  480. codex/static_root/assets/pdf-doc-DQBmNe4l.js.gz +0 -0
  481. codex/static_root/assets/reader-BQVYc_LF.e327430a14a1.js +0 -2
  482. codex/static_root/assets/reader-BQVYc_LF.e327430a14a1.js.br +0 -0
  483. codex/static_root/assets/reader-BQVYc_LF.e327430a14a1.js.gz +0 -0
  484. codex/static_root/assets/reader-BQVYc_LF.js +0 -2
  485. codex/static_root/assets/reader-BQVYc_LF.js.br +0 -0
  486. codex/static_root/assets/reader-BQVYc_LF.js.gz +0 -0
  487. codex/static_root/assets/relation-chips-CcFgPQOM.0b468249b62e.css.br +0 -0
  488. codex/static_root/assets/relation-chips-CcFgPQOM.0b468249b62e.css.gz +0 -0
  489. codex/static_root/assets/relation-chips-CcFgPQOM.css.br +0 -0
  490. codex/static_root/assets/relation-chips-CcFgPQOM.css.gz +0 -0
  491. codex/static_root/assets/relation-chips-TRmABTTI.918cb21596f9.js +0 -1
  492. codex/static_root/assets/relation-chips-TRmABTTI.918cb21596f9.js.br +0 -0
  493. codex/static_root/assets/relation-chips-TRmABTTI.918cb21596f9.js.gz +0 -0
  494. codex/static_root/assets/relation-chips-TRmABTTI.js +0 -1
  495. codex/static_root/assets/relation-chips-TRmABTTI.js.br +0 -0
  496. codex/static_root/assets/relation-chips-TRmABTTI.js.gz +0 -0
  497. codex/static_root/assets/settings-drawer-BoAnrKCI.46b6a030c81f.js +0 -2
  498. codex/static_root/assets/settings-drawer-BoAnrKCI.46b6a030c81f.js.br +0 -0
  499. codex/static_root/assets/settings-drawer-BoAnrKCI.46b6a030c81f.js.gz +0 -0
  500. codex/static_root/assets/settings-drawer-BoAnrKCI.js +0 -2
  501. codex/static_root/assets/settings-drawer-BoAnrKCI.js.br +0 -0
  502. codex/static_root/assets/settings-drawer-BoAnrKCI.js.gz +0 -0
  503. codex/static_root/assets/ssrBoot-B6P0M2z2.38ab2f4bde57.js.br +0 -0
  504. codex/static_root/assets/ssrBoot-B6P0M2z2.38ab2f4bde57.js.gz +0 -0
  505. codex/static_root/assets/ssrBoot-B6P0M2z2.js.br +0 -0
  506. codex/static_root/assets/ssrBoot-B6P0M2z2.js.gz +0 -0
  507. codex/static_root/assets/stats-tab-C5m62fu3.8482d96809e9.js.br +0 -0
  508. codex/static_root/assets/stats-tab-C5m62fu3.8482d96809e9.js.gz +0 -0
  509. codex/static_root/assets/stats-tab-C5m62fu3.js.br +0 -0
  510. codex/static_root/assets/stats-tab-C5m62fu3.js.gz +0 -0
  511. codex/static_root/assets/task-tab-B3WOGyYT.508fce185a28.js +0 -1
  512. codex/static_root/assets/task-tab-B3WOGyYT.508fce185a28.js.br +0 -0
  513. codex/static_root/assets/task-tab-B3WOGyYT.508fce185a28.js.gz +0 -0
  514. codex/static_root/assets/task-tab-B3WOGyYT.js +0 -1
  515. codex/static_root/assets/task-tab-B3WOGyYT.js.br +0 -0
  516. codex/static_root/assets/task-tab-B3WOGyYT.js.gz +0 -0
  517. codex/static_root/assets/unauthorized-DXoWE_v2.19c70a140f9b.js.br +0 -0
  518. codex/static_root/assets/unauthorized-DXoWE_v2.19c70a140f9b.js.gz +0 -0
  519. codex/static_root/assets/unauthorized-DXoWE_v2.js.br +0 -0
  520. codex/static_root/assets/unauthorized-DXoWE_v2.js.gz +0 -0
  521. codex/static_root/assets/user-tab-DhsQxTkZ.8a8167f9f2c4.js +0 -1
  522. codex/static_root/assets/user-tab-DhsQxTkZ.8a8167f9f2c4.js.br +0 -0
  523. codex/static_root/assets/user-tab-DhsQxTkZ.8a8167f9f2c4.js.gz +0 -0
  524. codex/static_root/assets/user-tab-DhsQxTkZ.js +0 -1
  525. codex/static_root/assets/user-tab-DhsQxTkZ.js.br +0 -0
  526. codex/static_root/assets/user-tab-DhsQxTkZ.js.gz +0 -0
  527. codex/static_root/manifest.db295ed1ca03.json.br +0 -0
  528. codex/static_root/manifest.db295ed1ca03.json.gz +0 -0
  529. {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/WHEEL +0 -0
  530. {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/entry_points.txt +0 -0
  531. {codex-1.8.6.dist-info → codex-1.8.9.dist-info}/licenses/LICENSE +0 -0
codex/choices/admin.py CHANGED
@@ -109,6 +109,7 @@ ADMIN_TASK_GROUPS: MappingProxyType[
109
109
  "value": "search_index_clear",
110
110
  "title": "Clear Search Index",
111
111
  "desc": "of all entries",
112
+ "confirm": "Are you sure? Resyncing the search index can take a while.",
112
113
  },
113
114
  {
114
115
  "value": "db_fts_integrity_check",
@@ -52,24 +52,29 @@ PARENT_FOLDER_FIELD_NAME = "parent_folder"
52
52
  VOLUME_COUNT_FIELD_NAME = "volume_count"
53
53
  ISSUE_COUNT_FIELD_NAME = "issue_count"
54
54
  PATH_FIELD_NAME = "path"
55
+ IDENTIFIERS_FIELD_NAME = "identifiers"
55
56
  NON_FTS_FIELDS = frozenset(
56
57
  {
57
58
  # Attributes
58
59
  "critical_rating",
59
60
  "day",
61
+ "file_type",
62
+ "issue_number",
63
+ "issue_suffix",
60
64
  "metadata_mtime",
61
65
  "monochrome",
62
66
  "month",
67
+ "notes",
63
68
  "page_count",
64
69
  "path",
70
+ "reading_direction",
65
71
  "year",
66
- "issue_number",
67
- "issue_suffix",
68
72
  # FKs
69
73
  PARENT_FOLDER_FIELD_NAME,
70
74
  VOLUME_FIELD_NAME,
71
75
  # M2Ms
72
76
  FOLDERS_FIELD_NAME,
77
+ IDENTIFIERS_FIELD_NAME,
73
78
  }
74
79
  )
75
80
 
@@ -127,7 +132,6 @@ CREDIT_ROLE_FIELD_NAME = "role"
127
132
  STORY_ARC_NUMBERS_FIELD_NAME = "story_arc_numbers"
128
133
  STORY_ARC_FIELD_NAME = "story_arc"
129
134
  NUMBER_FIELD_NAME = "number"
130
- IDENTIFIERS_FIELD_NAME = "identifiers"
131
135
  IDENTIFIER_SOURCE_FIELD_NAME = "source"
132
136
  IDENTIFIER_TYPE_FIELD_NAME = "id_type"
133
137
  IDENTIFIER_ID_KEY_FIELD_NAME = "key"
@@ -34,9 +34,6 @@ class CreateComicsImporter(CreateForeignKeyLinksImporter):
34
34
  if field_name not in NON_FTS_FIELDS:
35
35
  self.metadata[key][sub_key][field_name] = (value,)
36
36
 
37
- issue = (str(md.get("issue_number", "")) + md.get("issue_suffix", ""),)
38
- self.metadata[key][sub_key]["issue"] = issue
39
-
40
37
  def _update_comic_values(self, comic: Comic, update_comics: list, comic_pks: list):
41
38
  md = self.metadata[UPDATE_COMICS].pop(comic.pk, {})
42
39
  for field_name, value in md.items():
@@ -47,10 +47,12 @@ class DeletedComicsImporter(DeletedCoversImporter):
47
47
 
48
48
  def bulk_comics_deleted(self, **kwargs) -> tuple[int, dict]:
49
49
  """Bulk delete comics found missing from the filesystem."""
50
+ count = 0
51
+ deleted_comic_groups = {}
50
52
  status = ImporterRemoveComicsStatus(0, len(self.task.files_deleted))
51
53
  try:
52
54
  if not self.task.files_deleted:
53
- return 0, {}
55
+ return count, deleted_comic_groups
54
56
  self.status_controller.start(status)
55
57
  delete_qs = Comic.objects.filter(
56
58
  library=self.library, path__in=self.task.files_deleted
@@ -60,7 +62,8 @@ class DeletedComicsImporter(DeletedCoversImporter):
60
62
  deleted_comic_groups = self._populate_deleted_comic_groups(delete_qs)
61
63
 
62
64
  delete_comic_pks = frozenset(delete_qs.values_list("pk", flat=True))
63
- count, _ = delete_qs.delete()
65
+ delete_qs.delete()
66
+ count = len(delete_comic_pks)
64
67
 
65
68
  self.remove_covers(delete_comic_pks, custom=False)
66
69
  finally:
@@ -25,7 +25,8 @@ class DeletedFoldersImporter(DeletedComicsImporter):
25
25
  .distinct()
26
26
  .values_list("pk", flat=True)
27
27
  )
28
- count, _ = folders.delete()
28
+ folders.delete()
29
+ count = len(delete_comic_pks)
29
30
 
30
31
  self.remove_covers(delete_comic_pks, custom=False)
31
32
  finally:
@@ -84,5 +84,6 @@ class LinkManyToManyImporter(LinkSumImporter):
84
84
  except Exception:
85
85
  self.log.exception(f"Error recreating m2m field: {field_name}")
86
86
  finally:
87
+ self.metadata.pop(LINK_M2MS, None)
87
88
  self.status_controller.finish(status)
88
89
  return created_total + del_total
@@ -11,6 +11,7 @@ from codex.librarian.scribe.importer.const import (
11
11
  FTS_CREATED_M2MS,
12
12
  IDENTIFIERS_FIELD_NAME,
13
13
  LINK_M2MS,
14
+ NON_FTS_FIELDS,
14
15
  )
15
16
  from codex.librarian.scribe.importer.link.const import COMPLEX_MODEL_FIELD_NAMES
16
17
  from codex.librarian.scribe.importer.link.covers import (
@@ -47,9 +48,13 @@ class LinkComicsImporterPrepare(LinkCoversImporter):
47
48
  ):
48
49
  if field_name == IDENTIFIERS_FIELD_NAME:
49
50
  # sources extracton must come before identifiers is minified
50
- sources = tuple(subvalues[0] for subvalues in values)
51
+ # but now identifiers is not indexed at all, yet sources are.
52
+ sources = tuple(sorted({subvalues[0] for subvalues in values}))
51
53
  self.add_links_to_fts(comic_pk, "sources", sources)
52
54
 
55
+ if field_name in NON_FTS_FIELDS:
56
+ return
57
+
53
58
  field_name, fts_values = self.minify_complex_link_to_fts_tuple(
54
59
  field_name, values
55
60
  )
@@ -13,12 +13,31 @@ from codex.librarian.scribe.importer.statii.create import (
13
13
  ImporterUpdateComicsStatus,
14
14
  )
15
15
  from codex.librarian.scribe.importer.statii.query import ImporterQueryComicUpdatesStatus
16
+ from codex.librarian.status import Status
16
17
  from codex.models import Comic
17
18
 
18
19
 
19
20
  class QueryUpdateComics(QueryForeignKeysQueryImporter):
20
21
  """Move comics that need only updating into correct structure."""
21
22
 
23
+ def _query_update_comic(self, comic: Comic, status: Status):
24
+ """Query for update one comic."""
25
+ proposed_comic_dict = self.metadata[CREATE_COMICS].pop(comic.path, None)
26
+ if not proposed_comic_dict:
27
+ self.log.warning(
28
+ f"{comic.path} can be updated, but the update metadata was not found."
29
+ )
30
+ return
31
+ update_comic_dict = {
32
+ key: value
33
+ for key, value in proposed_comic_dict.items()
34
+ if getattr(comic, key) != value
35
+ }
36
+ # Update even if update_comic_dict is empty to set stat
37
+ self.metadata[UPDATE_COMICS][comic.pk] = update_comic_dict
38
+ status.increment_complete()
39
+ self.status_controller.update(status)
40
+
22
41
  def query_update_comics(self):
23
42
  """Pop existing comics from create & move to update if needed."""
24
43
  paths = tuple(self.metadata[CREATE_COMICS].keys())
@@ -34,18 +53,9 @@ class QueryUpdateComics(QueryForeignKeysQueryImporter):
34
53
  status.increment_complete(len(paths) - comics.count())
35
54
 
36
55
  for comic in comics:
37
- if self.abort_event.is_set():
38
- return
39
- proposed_comic_dict = self.metadata[CREATE_COMICS].pop(comic.path)
40
- update_comic_dict = {
41
- key: value
42
- for key, value in proposed_comic_dict.items()
43
- if getattr(comic, key) != value
44
- }
45
- if update_comic_dict:
46
- self.metadata[UPDATE_COMICS][comic.pk] = update_comic_dict
47
- status.increment_complete()
48
- self.status_controller.update(status)
56
+ self._query_update_comic(comic, status)
57
+ if self.abort_event.is_set():
58
+ return
49
59
 
50
60
  create_status = ImporterCreateComicsStatus(
51
61
  None, len(self.metadata[CREATE_COMICS])
@@ -23,17 +23,56 @@ from codex.librarian.scribe.importer.statii.failed import (
23
23
  )
24
24
  from codex.librarian.scribe.importer.statii.read import ImporterAggregateStatus
25
25
 
26
- _UNUSED_COMICBOX_FIELDS = (
27
- "alternate_images",
28
- "bookmark",
29
- "credit_primaries",
30
- "ext",
31
- "manga",
32
- "pages",
33
- "prices",
34
- "remainders",
35
- "reprints",
36
- "updated_at",
26
+ _USED_COMICBOX_FIELDS = frozenset(
27
+ {
28
+ # "alternate_images",
29
+ "age_rating",
30
+ "arcs",
31
+ # "bookmark",
32
+ "characters",
33
+ "collection_title",
34
+ "country",
35
+ "credits",
36
+ # "credit_primaries",
37
+ "critical_rating",
38
+ "date",
39
+ # "ext",
40
+ "file_type", # extra
41
+ "genres",
42
+ "identifiers",
43
+ # "identifier_primary_source",
44
+ "imprint",
45
+ "issue",
46
+ "language",
47
+ "locations",
48
+ "metadata_mtime", # extra
49
+ "monochrome",
50
+ "notes",
51
+ "original_format",
52
+ "path", # extra
53
+ # "pages",
54
+ "page_count",
55
+ "protagonist",
56
+ # "prices",
57
+ "publisher",
58
+ "reading_direction",
59
+ # "remainders",
60
+ # "reprints",
61
+ "review",
62
+ # "rights",
63
+ "scan_info",
64
+ "series",
65
+ "series_groups",
66
+ "stories",
67
+ "summary",
68
+ "tagger",
69
+ "tags",
70
+ "teams",
71
+ "title",
72
+ "universes",
73
+ # "updated_at",
74
+ "volume",
75
+ }
37
76
  )
38
77
 
39
78
 
@@ -42,8 +81,9 @@ class AggregateMetadataImporter(AggregatePathMetadataImporter):
42
81
 
43
82
  @staticmethod
44
83
  def _transform_metadata(md):
45
- for key in _UNUSED_COMICBOX_FIELDS:
46
- md.pop(key, None)
84
+ for key in tuple(md.keys()):
85
+ if key not in _USED_COMICBOX_FIELDS:
86
+ md.pop(key, None)
47
87
 
48
88
  if date := md.pop(DATE_KEY, None):
49
89
  date.pop(COVER_DATE_KEY, None)
@@ -1,6 +1,6 @@
1
1
  """Extract metadata from comic archive."""
2
2
 
3
- from datetime import datetime
3
+ from datetime import datetime, timezone
4
4
  from tarfile import TarError
5
5
  from zipfile import BadZipFile, LargeZipFile
6
6
 
@@ -29,7 +29,10 @@ class ExtractMetadataImporter(AggregateMetadataImporter):
29
29
  comic = Comic.objects.get(path=path)
30
30
  except Comic.DoesNotExist:
31
31
  return None
32
- return comic.metadata_mtime
32
+ mtime = comic.metadata_mtime
33
+ if mtime and (mtime.tzinfo is None or mtime.tzinfo.utcoffset(mtime) is None):
34
+ mtime = mtime.replace(tzinfo=timezone.utc)
35
+ return mtime
33
36
 
34
37
  def _set_import_metadata_flag(self):
35
38
  """Set import_metadata flag."""
@@ -50,17 +53,17 @@ class ExtractMetadataImporter(AggregateMetadataImporter):
50
53
  with Comicbox(path, config=COMICBOX_CONFIG, logger=self.log) as cb:
51
54
  if import_metadata:
52
55
  new_md_mtime = cb.get_metadata_mtime()
53
- if self.task.check_metadata_mtime:
54
- old_md_mtime = self._metadata_mtime(path)
55
- if (
56
- old_md_mtime
57
- and new_md_mtime
58
- and new_md_mtime <= old_md_mtime
59
- ):
60
- return md
61
- md = cb.to_dict()
62
- md = md.get("comicbox", {})
63
- md["metadata_mtime"] = new_md_mtime
56
+ if (
57
+ not self.task.check_metadata_mtime
58
+ or not new_md_mtime
59
+ or not (old_md_mtime := self._metadata_mtime(path))
60
+ or (new_md_mtime > old_md_mtime)
61
+ ):
62
+ md = cb.to_dict()
63
+ md = md.get("comicbox", {})
64
+ md["metadata_mtime"] = new_md_mtime
65
+ else:
66
+ md["page_count"] = cb.get_page_count()
64
67
  else:
65
68
  md["page_count"] = cb.get_page_count()
66
69
  md["file_type"] = cb.get_file_type()
@@ -6,7 +6,6 @@ from codex.librarian.scribe.importer.const import (
6
6
  FTS_CREATED_M2MS,
7
7
  FTS_EXISTING_M2MS,
8
8
  FTS_UPDATE,
9
- IDENTIFIERS_FIELD_NAME,
10
9
  NON_FTS_FIELDS,
11
10
  STORY_ARC_FIELD_NAME,
12
11
  STORY_ARC_NUMBERS_FIELD_NAME,
@@ -25,8 +24,6 @@ class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter):
25
24
  """Only store the fts relevant parts of complex links."""
26
25
  if field_name == CREDITS_FIELD_NAME:
27
26
  values = tuple(subvalues[0] for subvalues in values)
28
- if field_name == IDENTIFIERS_FIELD_NAME:
29
- values = tuple(subvalues[-1] for subvalues in values)
30
27
  elif field_name == STORY_ARC_NUMBERS_FIELD_NAME:
31
28
  field_name = STORY_ARC_FIELD_NAME + "s"
32
29
  return field_name, tuple(values)
@@ -41,10 +38,6 @@ class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter):
41
38
  """Add the existing values for creating a changed search entry."""
42
39
  if field_name in NON_FTS_FIELDS or not values:
43
40
  return
44
- if field_name == IDENTIFIERS_FIELD_NAME:
45
- # sources extracton must come before identifiers is minified
46
- sources = tuple(subvalues[0] for subvalues in values)
47
- self.add_to_fts_existing(pk, "sources", sources)
48
41
  field_name, values = self.minify_complex_link_to_fts_tuple(field_name, values)
49
42
  fts_values = self._to_fts_tuple(values)
50
43
  if not fts_values:
@@ -72,7 +65,7 @@ class SearchIndexPrepareImporter(SearchIndexCreateUpdateImporter):
72
65
  self.metadata[key] = {}
73
66
  if sub_key not in self.metadata[key]:
74
67
  self.metadata[key][sub_key] = {}
75
- self.log.warning(
68
+ self.log.debug(
76
69
  f"FTS import anomaly, attempting FTS update for comic {sub_key} {field_name}"
77
70
  )
78
71
  # Alternative might be kicking off an FTS sync
@@ -52,7 +52,8 @@ class SearchIndexSyncManyToManyImporter(FinishImporter):
52
52
  .only(*update_fields)
53
53
  )
54
54
  for comicfts in comicftss:
55
- setattr(comicfts, field_name, comicfts.fts_value) # pyright: ignore[reportAttributeAccessIssue]
55
+ value = comicfts.fts_value.strip(",") # pyright: ignore[reportAttributeAccessIssue]
56
+ setattr(comicfts, field_name, value)
56
57
  comicfts.updated_at = Now()
57
58
  update_objs.append(comicfts)
58
59
 
@@ -1,11 +1,7 @@
1
1
  """Search Index update."""
2
2
 
3
- from contextlib import suppress
4
3
  from time import time
5
4
 
6
- from comicbox.enums.comicbox import IdSources
7
- from comicbox.enums.maps.identifiers import ID_SOURCE_NAME_MAP
8
- from django.db.models.functions.datetime import Now
9
5
  from humanize import naturaldelta
10
6
 
11
7
  from codex.librarian.scribe.importer.const import (
@@ -13,10 +9,6 @@ from codex.librarian.scribe.importer.const import (
13
9
  FTS_EXISTING_M2MS,
14
10
  FTS_UPDATE,
15
11
  )
16
- from codex.librarian.scribe.importer.search.const import (
17
- COMICFTS_UPDATE_FIELDS,
18
- PYCOUNTRY_FIELDS,
19
- )
20
12
  from codex.librarian.scribe.importer.search.sync_m2m import (
21
13
  SearchIndexSyncManyToManyImporter,
22
14
  )
@@ -25,6 +17,8 @@ from codex.librarian.scribe.importer.statii.search import (
25
17
  ImporterFTSStatus,
26
18
  ImporterFTSUpdateStatus,
27
19
  )
20
+ from codex.librarian.scribe.search.const import COMICFTS_UPDATE_FIELDS
21
+ from codex.librarian.scribe.search.prepare import SearchEntryPrepare
28
22
  from codex.librarian.status import Status
29
23
  from codex.models.comic import ComicFTS
30
24
 
@@ -32,73 +26,20 @@ from codex.models.comic import ComicFTS
32
26
  class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
33
27
  """Search Index update methods."""
34
28
 
35
- @staticmethod
36
- def _get_pycountry_fts_field(entry, field_name) -> str:
37
- iso_code = entry.get(field_name)
38
- if not iso_code:
39
- return ""
40
- field = PYCOUNTRY_FIELDS[field_name]
41
- return ",".join((iso_code, field.to_representation(iso_code)))
42
-
43
- @staticmethod
44
- def _get_sources_fts_field(entry) -> tuple[str, ...]:
45
- sources = entry.get("sources", ())
46
- names = []
47
- for source_str in sources:
48
- names.append(source_str)
49
- with suppress(ValueError):
50
- id_source = IdSources(source_str)
51
- if long_name := ID_SOURCE_NAME_MAP.get(id_source):
52
- names.append(long_name)
53
- return tuple(names)
54
-
55
- @staticmethod
56
- def _create_comicfts_entry_attributes(entry, *, create: bool):
57
- now = Now()
58
- entry["updated_at"] = now
59
- if create:
60
- entry["created_at"] = now
61
-
62
- @classmethod
63
- def _create_comicfts_entry_fks(cls, entry):
64
- entry["country"] = cls._get_pycountry_fts_field(entry, "country")
65
- entry["language"] = cls._get_pycountry_fts_field(entry, "language")
66
-
67
- @staticmethod
68
- def _to_fts_values(value):
69
- """Create a tuple of fts value strings."""
70
- return tuple(
71
- subvalue
72
- for values_tuple in value
73
- for subvalue in values_tuple
74
- if isinstance(subvalue, str)
75
- )
76
-
77
- def _create_comicfts_entry_m2ms(self, pk: int, entry):
78
- if sources := self._get_sources_fts_field(entry):
79
- entry["sources"] = sources
80
- if existing_values := self.metadata[FTS_EXISTING_M2MS].get(pk):
81
- for field_name in tuple(existing_values.keys()):
82
- if values := existing_values.get(field_name):
83
- entry[field_name] = entry.get(field_name, ()) + values
84
-
85
29
  def _create_comicfts_entry(
86
30
  self,
87
- pk,
88
- entry,
31
+ pk: int,
32
+ entry: dict,
89
33
  obj_list: list[ComicFTS],
90
34
  status: Status,
91
35
  ):
92
- self._create_comicfts_entry_m2ms(pk, entry)
93
- for field_name in entry:
94
- value = entry[field_name]
95
- if isinstance(value, tuple):
96
- entry[field_name] = ",".join(sorted(value))
97
- self._create_comicfts_entry_attributes(entry, create=True)
98
- self._create_comicfts_entry_fks(entry)
99
- comicfts = ComicFTS(comic_id=pk, **entry)
100
- obj_list.append(comicfts)
101
- status.increment_complete()
36
+ if entry:
37
+ existing_m2m_values = self.metadata[FTS_EXISTING_M2MS].get(pk)
38
+ SearchEntryPrepare.prepare_import_fts_entry(
39
+ pk, entry, existing_m2m_values, None, obj_list, status, create=True
40
+ )
41
+ else:
42
+ status.decrement_total()
102
43
  self.status_controller.update(status)
103
44
 
104
45
  def _update_comicfts_entry(
@@ -108,18 +49,19 @@ class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
108
49
  status: Status,
109
50
  ):
110
51
  comic_id = comicfts.comic_id # pyright:ignore[reportAttributeAccessIssue], # ty: ignore[unresolved-attribute]
111
- entry = self.metadata[FTS_UPDATE].pop(comic_id)
112
- self._create_comicfts_entry_m2ms(comic_id, entry)
113
- for field_name in entry:
114
- value = entry[field_name]
115
- if isinstance(value, tuple):
116
- entry[field_name] = ",".join(sorted(value))
117
- self._create_comicfts_entry_attributes(entry, create=True)
118
- self._create_comicfts_entry_fks(entry)
119
- for field_name, value in entry.items():
120
- setattr(comicfts, field_name, value)
121
- obj_list.append(comicfts)
122
- status.increment_complete()
52
+ if entry := self.metadata[FTS_UPDATE].pop(comic_id):
53
+ existing_m2m_values = self.metadata[FTS_EXISTING_M2MS].get(comic_id)
54
+ SearchEntryPrepare.prepare_import_fts_entry(
55
+ comic_id,
56
+ entry,
57
+ existing_m2m_values,
58
+ comicfts,
59
+ obj_list,
60
+ status,
61
+ create=False,
62
+ )
63
+ else:
64
+ status.decrement_total()
123
65
  self.status_controller.update(status)
124
66
 
125
67
  def _update_search_index_operate_get_status(
@@ -134,9 +76,9 @@ class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
134
76
  entries = self.metadata.pop(FTS_CREATE, {})
135
77
  pks = tuple(sorted(entries.keys()))
136
78
  obj_list = []
79
+ if self.abort_event.is_set():
80
+ return tuple(obj_list), ()
137
81
  for pk in pks:
138
- if self.abort_event.is_set():
139
- return tuple(obj_list), ()
140
82
  entry = entries.pop(pk)
141
83
  self._create_comicfts_entry(pk, entry, obj_list, status)
142
84
  return tuple(obj_list), pks
@@ -147,9 +89,9 @@ class SearchIndexCreateUpdateImporter(SearchIndexSyncManyToManyImporter):
147
89
  obj_list = []
148
90
  if pks := tuple(sorted(self.metadata.get(FTS_UPDATE, {}).keys())):
149
91
  comicftss = ComicFTS.objects.filter(comic_id__in=pks)
92
+ if self.abort_event.is_set():
93
+ return tuple(obj_list), ()
150
94
  for comicfts in comicftss:
151
- if self.abort_event.is_set():
152
- return tuple(obj_list), ()
153
95
  self._update_comicfts_entry(comicfts, obj_list, status)
154
96
  if self.metadata[FTS_UPDATE]:
155
97
  # If updates not popped, turn them into creates.
@@ -1,16 +1,8 @@
1
- """Search import consts."""
2
-
3
- from types import MappingProxyType
4
-
5
- from codex.serializers.fields.browser import CountryField, LanguageField
1
+ """FTS constants."""
6
2
 
7
3
  _COMICFTS_ATTRIBUTES = (
8
4
  "collection_title",
9
- "file_type",
10
- "issue",
11
5
  "name",
12
- "notes",
13
- "reading_direction",
14
6
  "review",
15
7
  "summary",
16
8
  "updated_at",
@@ -30,7 +22,6 @@ _COMICFTS_M2MS = (
30
22
  "characters",
31
23
  "credits",
32
24
  "genres",
33
- "identifiers",
34
25
  "locations",
35
26
  "series_groups",
36
27
  "sources",
@@ -45,6 +36,3 @@ COMICFTS_UPDATE_FIELDS = (
45
36
  *_COMICFTS_FKS,
46
37
  *_COMICFTS_M2MS,
47
38
  )
48
- PYCOUNTRY_FIELDS = MappingProxyType(
49
- {"country": CountryField(), "language": LanguageField()}
50
- )