codex 1.6.7__py3-none-any.whl → 1.6.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 (431) hide show
  1. codex/librarian/cron/__init__.py +1 -0
  2. codex/librarian/cron/crond.py +84 -0
  3. codex/librarian/janitor/time.py +12 -0
  4. codex/librarian/librariand.py +9 -3
  5. codex/librarian/tasks.py +5 -1
  6. codex/librarian/telemeter/__init__.py +1 -0
  7. codex/librarian/{stats.py → telemeter/stats.py} +1 -0
  8. codex/librarian/telemeter/tasks.py +8 -0
  9. codex/librarian/telemeter/telemeter.py +77 -0
  10. codex/librarian/telemeter/time.py +48 -0
  11. codex/migrations/0028_telemeter.py +48 -0
  12. codex/models/admin.py +2 -0
  13. codex/settings/settings.py +1 -1
  14. codex/static_root/assets/{VCheckbox-CNCrUhbz.58c18f2fb2cd.js → VCheckbox-dIScsEcb.d54e90dd2ea2.js} +1 -1
  15. codex/static_root/assets/VCheckbox-dIScsEcb.d54e90dd2ea2.js.br +0 -0
  16. codex/static_root/assets/VCheckbox-dIScsEcb.d54e90dd2ea2.js.gz +0 -0
  17. codex/static_root/assets/{VCheckbox-CNCrUhbz.js → VCheckbox-dIScsEcb.js} +1 -1
  18. codex/static_root/assets/VCheckbox-dIScsEcb.js.br +0 -0
  19. codex/static_root/assets/VCheckbox-dIScsEcb.js.gz +0 -0
  20. codex/static_root/assets/{VCheckboxBtn-BQpfgjoJ.073ee1642f91.js → VCheckboxBtn-BpLxL6DP.a4cfab2286b6.js} +1 -1
  21. codex/static_root/assets/VCheckboxBtn-BpLxL6DP.a4cfab2286b6.js.br +0 -0
  22. codex/static_root/assets/VCheckboxBtn-BpLxL6DP.a4cfab2286b6.js.gz +0 -0
  23. codex/static_root/assets/{VCheckboxBtn-BQpfgjoJ.js → VCheckboxBtn-BpLxL6DP.js} +1 -1
  24. codex/static_root/assets/VCheckboxBtn-BpLxL6DP.js.br +0 -0
  25. codex/static_root/assets/VCheckboxBtn-BpLxL6DP.js.gz +0 -0
  26. codex/static_root/assets/{VCombobox-Bg-XK8ZC.5e53616e3bf3.js → VCombobox-BiTvNSAL.d1884eaf76e6.js} +1 -1
  27. codex/static_root/assets/VCombobox-BiTvNSAL.d1884eaf76e6.js.br +0 -0
  28. codex/static_root/assets/VCombobox-BiTvNSAL.d1884eaf76e6.js.gz +0 -0
  29. codex/static_root/assets/{VCombobox-Bg-XK8ZC.js → VCombobox-BiTvNSAL.js} +1 -1
  30. codex/static_root/assets/VCombobox-BiTvNSAL.js.br +0 -0
  31. codex/static_root/assets/VCombobox-BiTvNSAL.js.gz +0 -0
  32. codex/static_root/assets/{VDialog-C2lwLEJ5.2bf46190a6d5.js → VDialog-DO_IeNl2.1e644515ee26.js} +1 -1
  33. codex/static_root/assets/VDialog-DO_IeNl2.1e644515ee26.js.br +0 -0
  34. codex/static_root/assets/VDialog-DO_IeNl2.1e644515ee26.js.gz +0 -0
  35. codex/static_root/assets/{VDialog-C2lwLEJ5.js → VDialog-DO_IeNl2.js} +1 -1
  36. codex/static_root/assets/VDialog-DO_IeNl2.js.br +0 -0
  37. codex/static_root/assets/VDialog-DO_IeNl2.js.gz +0 -0
  38. codex/static_root/assets/{VExpansionPanels-CXR8yBcB.a8008489f539.js → VExpansionPanels-paVX7c3D.3be9407a80fd.js} +1 -1
  39. codex/static_root/assets/VExpansionPanels-paVX7c3D.3be9407a80fd.js.br +0 -0
  40. codex/static_root/assets/VExpansionPanels-paVX7c3D.3be9407a80fd.js.gz +0 -0
  41. codex/static_root/assets/{VExpansionPanels-CXR8yBcB.js → VExpansionPanels-paVX7c3D.js} +1 -1
  42. codex/static_root/assets/VExpansionPanels-paVX7c3D.js.br +0 -0
  43. codex/static_root/assets/VExpansionPanels-paVX7c3D.js.gz +0 -0
  44. codex/static_root/assets/{VRadioGroup-DL9_Ywre.a7b73019c5f4.js → VRadioGroup-CLZGmBdz.1e41ea70fba8.js} +1 -1
  45. codex/static_root/assets/VRadioGroup-CLZGmBdz.1e41ea70fba8.js.br +0 -0
  46. codex/static_root/assets/VRadioGroup-CLZGmBdz.1e41ea70fba8.js.gz +0 -0
  47. codex/static_root/assets/{VRadioGroup-DL9_Ywre.js → VRadioGroup-CLZGmBdz.js} +1 -1
  48. codex/static_root/assets/VRadioGroup-CLZGmBdz.js.br +0 -0
  49. codex/static_root/assets/VRadioGroup-CLZGmBdz.js.gz +0 -0
  50. codex/static_root/assets/{VSelect-CRvxnYwi.9a9bcedf5919.js → VSelect-Cwd7Ke2J.fd98b8f830af.js} +1 -1
  51. codex/static_root/assets/VSelect-Cwd7Ke2J.fd98b8f830af.js.br +0 -0
  52. codex/static_root/assets/VSelect-Cwd7Ke2J.fd98b8f830af.js.gz +0 -0
  53. codex/static_root/assets/{VSelect-CRvxnYwi.js → VSelect-Cwd7Ke2J.js} +1 -1
  54. codex/static_root/assets/VSelect-Cwd7Ke2J.js.br +0 -0
  55. codex/static_root/assets/VSelect-Cwd7Ke2J.js.gz +0 -0
  56. codex/static_root/assets/VSelectionControl-BFq--28I.9687c77461fc.css +1 -0
  57. codex/static_root/assets/VSelectionControl-BFq--28I.9687c77461fc.css.br +0 -0
  58. codex/static_root/assets/VSelectionControl-BFq--28I.9687c77461fc.css.gz +0 -0
  59. codex/static_root/assets/VSelectionControl-BFq--28I.css +1 -0
  60. codex/static_root/assets/VSelectionControl-BFq--28I.css.br +0 -0
  61. codex/static_root/assets/VSelectionControl-BFq--28I.css.gz +0 -0
  62. codex/static_root/assets/VSelectionControl-BTjn8uTI.3e9f6e646a35.js +1 -0
  63. codex/static_root/assets/VSelectionControl-BTjn8uTI.3e9f6e646a35.js.br +0 -0
  64. codex/static_root/assets/VSelectionControl-BTjn8uTI.3e9f6e646a35.js.gz +0 -0
  65. codex/static_root/assets/VSelectionControl-BTjn8uTI.js +1 -0
  66. codex/static_root/assets/VSelectionControl-BTjn8uTI.js.br +0 -0
  67. codex/static_root/assets/VSelectionControl-BTjn8uTI.js.gz +0 -0
  68. codex/static_root/assets/{VSlideGroup-CW34YaB5.5ca4ce80da01.js → VSlideGroup-D4BlVRr8.10a79fd58813.js} +1 -1
  69. codex/static_root/assets/VSlideGroup-D4BlVRr8.10a79fd58813.js.br +0 -0
  70. codex/static_root/assets/VSlideGroup-D4BlVRr8.10a79fd58813.js.gz +0 -0
  71. codex/static_root/assets/{VSlideGroup-CW34YaB5.js → VSlideGroup-D4BlVRr8.js} +1 -1
  72. codex/static_root/assets/VSlideGroup-D4BlVRr8.js.br +0 -0
  73. codex/static_root/assets/VSlideGroup-D4BlVRr8.js.gz +0 -0
  74. codex/static_root/assets/{VTable-CQQRjtmk.ea08a8b7b98e.js → VTable-IQf8Xj4J.2e69b517b235.js} +1 -1
  75. codex/static_root/assets/VTable-IQf8Xj4J.2e69b517b235.js.br +0 -0
  76. codex/static_root/assets/VTable-IQf8Xj4J.2e69b517b235.js.gz +0 -0
  77. codex/static_root/assets/{VTable-CQQRjtmk.js → VTable-IQf8Xj4J.js} +1 -1
  78. codex/static_root/assets/VTable-IQf8Xj4J.js.br +0 -0
  79. codex/static_root/assets/VTable-IQf8Xj4J.js.gz +0 -0
  80. codex/static_root/assets/VTextField-BssVoDhB.4cc388b4aa3c.css +1 -0
  81. codex/static_root/assets/VTextField-BssVoDhB.4cc388b4aa3c.css.br +0 -0
  82. codex/static_root/assets/VTextField-BssVoDhB.4cc388b4aa3c.css.gz +0 -0
  83. codex/static_root/assets/VTextField-BssVoDhB.css +1 -0
  84. codex/static_root/assets/VTextField-BssVoDhB.css.br +0 -0
  85. codex/static_root/assets/VTextField-BssVoDhB.css.gz +0 -0
  86. codex/static_root/assets/VTextField-DKXmWQyx.53d9e13b9847.js +1 -0
  87. codex/static_root/assets/VTextField-DKXmWQyx.53d9e13b9847.js.br +0 -0
  88. codex/static_root/assets/VTextField-DKXmWQyx.53d9e13b9847.js.gz +0 -0
  89. codex/static_root/assets/VTextField-DKXmWQyx.js +1 -0
  90. codex/static_root/assets/VTextField-DKXmWQyx.js.br +0 -0
  91. codex/static_root/assets/VTextField-DKXmWQyx.js.gz +0 -0
  92. codex/static_root/assets/{VWindowItem-C-ieUh3X.b48eab9f2068.js → VWindowItem-clwRzf0Z.01620e37f020.js} +1 -1
  93. codex/static_root/assets/VWindowItem-clwRzf0Z.01620e37f020.js.br +0 -0
  94. codex/static_root/assets/VWindowItem-clwRzf0Z.01620e37f020.js.gz +0 -0
  95. codex/static_root/assets/{VWindowItem-C-ieUh3X.js → VWindowItem-clwRzf0Z.js} +1 -1
  96. codex/static_root/assets/VWindowItem-clwRzf0Z.js.br +0 -0
  97. codex/static_root/assets/VWindowItem-clwRzf0Z.js.gz +0 -0
  98. codex/static_root/assets/{admin-DogdiwQo.74b6a788601b.js → admin-BMM4khnn.eeb686da7f67.js} +1 -1
  99. codex/static_root/assets/admin-BMM4khnn.eeb686da7f67.js.br +0 -0
  100. codex/static_root/assets/admin-BMM4khnn.eeb686da7f67.js.gz +0 -0
  101. codex/static_root/assets/{admin-DogdiwQo.js → admin-BMM4khnn.js} +1 -1
  102. codex/static_root/assets/admin-BMM4khnn.js.br +0 -0
  103. codex/static_root/assets/admin-BMM4khnn.js.gz +0 -0
  104. codex/static_root/assets/admin-drawer-panel-DOrhl9Nb.3a7af8ec4462.css +1 -0
  105. codex/static_root/assets/admin-drawer-panel-DOrhl9Nb.3a7af8ec4462.css.br +0 -0
  106. codex/static_root/assets/admin-drawer-panel-DOrhl9Nb.3a7af8ec4462.css.gz +0 -0
  107. codex/static_root/assets/admin-drawer-panel-DOrhl9Nb.css +1 -0
  108. codex/static_root/assets/admin-drawer-panel-DOrhl9Nb.css.br +0 -0
  109. codex/static_root/assets/admin-drawer-panel-DOrhl9Nb.css.gz +0 -0
  110. codex/static_root/assets/admin-drawer-panel-SQytza6T.d94cc92fef08.js +56 -0
  111. codex/static_root/assets/admin-drawer-panel-SQytza6T.d94cc92fef08.js.br +0 -0
  112. codex/static_root/assets/admin-drawer-panel-SQytza6T.d94cc92fef08.js.gz +0 -0
  113. codex/static_root/assets/admin-drawer-panel-SQytza6T.js +56 -0
  114. codex/static_root/assets/admin-drawer-panel-SQytza6T.js.br +0 -0
  115. codex/static_root/assets/admin-drawer-panel-SQytza6T.js.gz +0 -0
  116. codex/static_root/assets/browser-D6WDXwID.011e4a20946c.js +1 -0
  117. codex/static_root/assets/browser-D6WDXwID.011e4a20946c.js.br +0 -0
  118. codex/static_root/assets/browser-D6WDXwID.011e4a20946c.js.gz +0 -0
  119. codex/static_root/assets/browser-D6WDXwID.js +1 -0
  120. codex/static_root/assets/browser-D6WDXwID.js.br +0 -0
  121. codex/static_root/assets/browser-D6WDXwID.js.gz +0 -0
  122. codex/static_root/assets/{change-password-dialog-DA5q-03T.dee52c2bee1d.js → change-password-dialog-CD1pdXK9.8b94f4f171c6.js} +1 -1
  123. codex/static_root/assets/change-password-dialog-CD1pdXK9.8b94f4f171c6.js.br +0 -0
  124. codex/static_root/assets/change-password-dialog-CD1pdXK9.8b94f4f171c6.js.gz +0 -0
  125. codex/static_root/assets/{change-password-dialog-DA5q-03T.js → change-password-dialog-CD1pdXK9.js} +1 -1
  126. codex/static_root/assets/change-password-dialog-CD1pdXK9.js.br +0 -0
  127. codex/static_root/assets/change-password-dialog-CD1pdXK9.js.gz +0 -0
  128. codex/static_root/assets/{confirm-dialog-BQg9lyfv.583f88254cd6.js → confirm-dialog-_HotKBZZ.2e586037b3e1.js} +1 -1
  129. codex/static_root/assets/confirm-dialog-_HotKBZZ.2e586037b3e1.js.br +0 -0
  130. codex/static_root/assets/confirm-dialog-_HotKBZZ.2e586037b3e1.js.gz +0 -0
  131. codex/static_root/assets/{confirm-dialog-BQg9lyfv.js → confirm-dialog-_HotKBZZ.js} +1 -1
  132. codex/static_root/assets/confirm-dialog-_HotKBZZ.js.br +0 -0
  133. codex/static_root/assets/confirm-dialog-_HotKBZZ.js.gz +0 -0
  134. codex/static_root/assets/{datetime-column-D_0U7O5k.82d3bf46f6f0.js → datetime-column-D93BsvcX.5caf2255bdc3.js} +1 -1
  135. codex/static_root/assets/datetime-column-D93BsvcX.5caf2255bdc3.js.br +0 -0
  136. codex/static_root/assets/datetime-column-D93BsvcX.5caf2255bdc3.js.gz +0 -0
  137. codex/static_root/assets/{datetime-column-D_0U7O5k.js → datetime-column-D93BsvcX.js} +1 -1
  138. codex/static_root/assets/datetime-column-D93BsvcX.js.br +0 -0
  139. codex/static_root/assets/datetime-column-D93BsvcX.js.gz +0 -0
  140. codex/static_root/assets/{filter-Cd_ZATJq.d632f2f33be8.js → filter-ji46VTOR.f7b9ed6fec13.js} +1 -1
  141. codex/static_root/assets/filter-ji46VTOR.f7b9ed6fec13.js.br +0 -0
  142. codex/static_root/assets/filter-ji46VTOR.f7b9ed6fec13.js.gz +0 -0
  143. codex/static_root/assets/{filter-Cd_ZATJq.js → filter-ji46VTOR.js} +1 -1
  144. codex/static_root/assets/filter-ji46VTOR.js.br +0 -0
  145. codex/static_root/assets/filter-ji46VTOR.js.gz +0 -0
  146. codex/static_root/assets/flag-tab-CRfBTBsz.0d8f084eea6e.js +1 -0
  147. codex/static_root/assets/flag-tab-CRfBTBsz.0d8f084eea6e.js.br +0 -0
  148. codex/static_root/assets/flag-tab-CRfBTBsz.0d8f084eea6e.js.gz +0 -0
  149. codex/static_root/assets/flag-tab-CRfBTBsz.js +1 -0
  150. codex/static_root/assets/flag-tab-CRfBTBsz.js.br +0 -0
  151. codex/static_root/assets/flag-tab-CRfBTBsz.js.gz +0 -0
  152. codex/static_root/assets/{group-tab-DjLTMu0n.ec5e6c7d8fd4.js → group-tab-CMX07Y1c.98dd5e2d0bfc.js} +1 -1
  153. codex/static_root/assets/group-tab-CMX07Y1c.98dd5e2d0bfc.js.br +0 -0
  154. codex/static_root/assets/group-tab-CMX07Y1c.98dd5e2d0bfc.js.gz +0 -0
  155. codex/static_root/assets/{group-tab-DjLTMu0n.js → group-tab-CMX07Y1c.js} +1 -1
  156. codex/static_root/assets/group-tab-CMX07Y1c.js.br +0 -0
  157. codex/static_root/assets/group-tab-CMX07Y1c.js.gz +0 -0
  158. codex/static_root/assets/{http-error-6oixwfCY.fc79a5c9cec4.js → http-error-CzJHczxG.6ee3173d40a5.js} +1 -1
  159. codex/static_root/assets/http-error-CzJHczxG.6ee3173d40a5.js.br +0 -0
  160. codex/static_root/assets/http-error-CzJHczxG.6ee3173d40a5.js.gz +0 -0
  161. codex/static_root/assets/{http-error-6oixwfCY.js → http-error-CzJHczxG.js} +1 -1
  162. codex/static_root/assets/http-error-CzJHczxG.js.br +0 -0
  163. codex/static_root/assets/http-error-CzJHczxG.js.gz +0 -0
  164. codex/static_root/assets/{library-tab-DOkzAkbS.62feecf67428.js → library-tab-DfZENbbA.1117ad225bde.js} +1 -1
  165. codex/static_root/assets/library-tab-DfZENbbA.1117ad225bde.js.br +0 -0
  166. codex/static_root/assets/library-tab-DfZENbbA.1117ad225bde.js.gz +0 -0
  167. codex/static_root/assets/{library-tab-DOkzAkbS.js → library-tab-DfZENbbA.js} +1 -1
  168. codex/static_root/assets/library-tab-DfZENbbA.js.br +0 -0
  169. codex/static_root/assets/library-tab-DfZENbbA.js.gz +0 -0
  170. codex/static_root/assets/{main-DzK0FyQ4.64342c46e52e.js → main-EAqCu0p6.e749a8bc2923.js} +3 -3
  171. codex/static_root/assets/main-EAqCu0p6.e749a8bc2923.js.br +0 -0
  172. codex/static_root/assets/main-EAqCu0p6.e749a8bc2923.js.gz +0 -0
  173. codex/static_root/assets/{main-DzK0FyQ4.js → main-EAqCu0p6.js} +3 -3
  174. codex/static_root/assets/main-EAqCu0p6.js.br +0 -0
  175. codex/static_root/assets/main-EAqCu0p6.js.gz +0 -0
  176. codex/static_root/assets/{pagination-toolbar-Btd4gD8q.dccad5e791aa.js → pagination-toolbar-m4o9cYJ6.df24ef17e904.js} +1 -1
  177. codex/static_root/assets/pagination-toolbar-m4o9cYJ6.df24ef17e904.js.br +0 -0
  178. codex/static_root/assets/pagination-toolbar-m4o9cYJ6.df24ef17e904.js.gz +0 -0
  179. codex/static_root/assets/{pagination-toolbar-Btd4gD8q.js → pagination-toolbar-m4o9cYJ6.js} +1 -1
  180. codex/static_root/assets/pagination-toolbar-m4o9cYJ6.js.br +0 -0
  181. codex/static_root/assets/pagination-toolbar-m4o9cYJ6.js.gz +0 -0
  182. codex/static_root/assets/{pdf-doc-DJFTgxDu.b2f20f4fcce8.js → pdf-doc-RJuKdcoH.4be4a68338de.js} +1 -1
  183. codex/static_root/assets/pdf-doc-RJuKdcoH.4be4a68338de.js.br +0 -0
  184. codex/static_root/assets/pdf-doc-RJuKdcoH.4be4a68338de.js.gz +0 -0
  185. codex/static_root/assets/{pdf-doc-DJFTgxDu.js → pdf-doc-RJuKdcoH.js} +1 -1
  186. codex/static_root/assets/pdf-doc-RJuKdcoH.js.br +0 -0
  187. codex/static_root/assets/pdf-doc-RJuKdcoH.js.gz +0 -0
  188. codex/static_root/assets/{reader-BZ1zrFjp.37c92f19b36e.js → reader-BYz5uPEm.e2db8893aa10.js} +2 -2
  189. codex/static_root/assets/reader-BYz5uPEm.e2db8893aa10.js.br +0 -0
  190. codex/static_root/assets/reader-BYz5uPEm.e2db8893aa10.js.gz +0 -0
  191. codex/static_root/assets/{reader-BZ1zrFjp.js → reader-BYz5uPEm.js} +2 -2
  192. codex/static_root/assets/reader-BYz5uPEm.js.br +0 -0
  193. codex/static_root/assets/reader-BYz5uPEm.js.gz +0 -0
  194. codex/static_root/assets/relation-chips-BQX3oeiS.acfd60628c35.js +1 -0
  195. codex/static_root/assets/relation-chips-BQX3oeiS.acfd60628c35.js.br +0 -0
  196. codex/static_root/assets/relation-chips-BQX3oeiS.acfd60628c35.js.gz +0 -0
  197. codex/static_root/assets/relation-chips-BQX3oeiS.js +1 -0
  198. codex/static_root/assets/relation-chips-BQX3oeiS.js.br +0 -0
  199. codex/static_root/assets/relation-chips-BQX3oeiS.js.gz +0 -0
  200. codex/static_root/assets/{settings-drawer-DG-CKNyF.js → settings-drawer-C5t3OYPS.3fb97d35ae92.js} +2 -2
  201. codex/static_root/assets/settings-drawer-C5t3OYPS.3fb97d35ae92.js.br +0 -0
  202. codex/static_root/assets/settings-drawer-C5t3OYPS.3fb97d35ae92.js.gz +0 -0
  203. codex/static_root/assets/{settings-drawer-DG-CKNyF.442b7b74fcd2.js → settings-drawer-C5t3OYPS.js} +2 -2
  204. codex/static_root/assets/settings-drawer-C5t3OYPS.js.br +0 -0
  205. codex/static_root/assets/settings-drawer-C5t3OYPS.js.gz +0 -0
  206. codex/static_root/assets/{stats-tab-CI0u-X7Y.2d1b6a0d4139.css → stats-tab-BVZzfwi1.28f07f038e88.css} +1 -1
  207. codex/static_root/assets/stats-tab-BVZzfwi1.28f07f038e88.css.br +0 -0
  208. codex/static_root/assets/stats-tab-BVZzfwi1.28f07f038e88.css.gz +0 -0
  209. codex/static_root/assets/{stats-tab-CI0u-X7Y.css → stats-tab-BVZzfwi1.css} +1 -1
  210. codex/static_root/assets/stats-tab-BVZzfwi1.css.br +0 -0
  211. codex/static_root/assets/stats-tab-BVZzfwi1.css.gz +0 -0
  212. codex/static_root/assets/stats-tab-BZrcMjtP.b8d127a34aa7.js +1 -0
  213. codex/static_root/assets/stats-tab-BZrcMjtP.b8d127a34aa7.js.br +0 -0
  214. codex/static_root/assets/stats-tab-BZrcMjtP.b8d127a34aa7.js.gz +0 -0
  215. codex/static_root/assets/stats-tab-BZrcMjtP.js +1 -0
  216. codex/static_root/assets/stats-tab-BZrcMjtP.js.br +0 -0
  217. codex/static_root/assets/stats-tab-BZrcMjtP.js.gz +0 -0
  218. codex/static_root/assets/{task-tab-BPIRLtMw.e11b108187cb.js → task-tab-aLrGKXQT.f8498ed38d40.js} +1 -1
  219. codex/static_root/assets/task-tab-aLrGKXQT.f8498ed38d40.js.br +0 -0
  220. codex/static_root/assets/task-tab-aLrGKXQT.f8498ed38d40.js.gz +0 -0
  221. codex/static_root/assets/{task-tab-BPIRLtMw.js → task-tab-aLrGKXQT.js} +1 -1
  222. codex/static_root/assets/task-tab-aLrGKXQT.js.br +0 -0
  223. codex/static_root/assets/task-tab-aLrGKXQT.js.gz +0 -0
  224. codex/static_root/assets/{unauthorized-D99cAzQr.3fcb871efc34.js → unauthorized-DpTUrdQV.0c1bfe81f457.js} +1 -1
  225. codex/static_root/assets/unauthorized-DpTUrdQV.0c1bfe81f457.js.br +0 -0
  226. codex/static_root/assets/unauthorized-DpTUrdQV.0c1bfe81f457.js.gz +0 -0
  227. codex/static_root/assets/{unauthorized-D99cAzQr.js → unauthorized-DpTUrdQV.js} +1 -1
  228. codex/static_root/assets/unauthorized-DpTUrdQV.js.br +0 -0
  229. codex/static_root/assets/unauthorized-DpTUrdQV.js.gz +0 -0
  230. codex/static_root/assets/{user-tab-DhN1GEZN.f7c314e1f210.js → user-tab-B_CPCP10.d1a264b97a0f.js} +1 -1
  231. codex/static_root/assets/user-tab-B_CPCP10.d1a264b97a0f.js.br +0 -0
  232. codex/static_root/assets/user-tab-B_CPCP10.d1a264b97a0f.js.gz +0 -0
  233. codex/static_root/assets/{user-tab-DhN1GEZN.js → user-tab-B_CPCP10.js} +1 -1
  234. codex/static_root/assets/user-tab-B_CPCP10.js.br +0 -0
  235. codex/static_root/assets/user-tab-B_CPCP10.js.gz +0 -0
  236. codex/static_root/js/{choices-admin.3521e2a863df.json → choices-admin.1eca6d2c22cf.json} +1 -1
  237. codex/static_root/js/choices-admin.1eca6d2c22cf.json.br +0 -0
  238. codex/static_root/js/choices-admin.1eca6d2c22cf.json.gz +0 -0
  239. codex/static_root/js/choices-admin.json +1 -1
  240. codex/static_root/js/choices-admin.json.br +0 -0
  241. codex/static_root/js/choices-admin.json.gz +0 -0
  242. codex/static_root/{manifest.15533be94933.json → manifest.3d6dd67354d1.json} +220 -220
  243. codex/static_root/manifest.3d6dd67354d1.json.br +0 -0
  244. codex/static_root/manifest.3d6dd67354d1.json.gz +0 -0
  245. codex/static_root/manifest.json +220 -220
  246. codex/static_root/manifest.json.br +0 -0
  247. codex/static_root/manifest.json.gz +0 -0
  248. codex/static_root/staticfiles.json +1 -1
  249. codex/views/admin/flag.py +10 -1
  250. codex/views/admin/stats.py +1 -1
  251. codex/views/opds/v1/entry/links.py +14 -2
  252. codex/views/opds/v1/feed.py +13 -34
  253. codex/views/reader/page.py +3 -4
  254. {codex-1.6.7.dist-info → codex-1.6.9.dist-info}/METADATA +39 -44
  255. {codex-1.6.7.dist-info → codex-1.6.9.dist-info}/RECORD +258 -251
  256. codex/librarian/janitor/janitord.py +0 -76
  257. codex/static_root/assets/VCheckbox-CNCrUhbz.58c18f2fb2cd.js.br +0 -0
  258. codex/static_root/assets/VCheckbox-CNCrUhbz.58c18f2fb2cd.js.gz +0 -0
  259. codex/static_root/assets/VCheckbox-CNCrUhbz.js.br +0 -0
  260. codex/static_root/assets/VCheckbox-CNCrUhbz.js.gz +0 -0
  261. codex/static_root/assets/VCheckboxBtn-BQpfgjoJ.073ee1642f91.js.br +0 -0
  262. codex/static_root/assets/VCheckboxBtn-BQpfgjoJ.073ee1642f91.js.gz +0 -0
  263. codex/static_root/assets/VCheckboxBtn-BQpfgjoJ.js.br +0 -0
  264. codex/static_root/assets/VCheckboxBtn-BQpfgjoJ.js.gz +0 -0
  265. codex/static_root/assets/VCombobox-Bg-XK8ZC.5e53616e3bf3.js.br +0 -0
  266. codex/static_root/assets/VCombobox-Bg-XK8ZC.5e53616e3bf3.js.gz +0 -0
  267. codex/static_root/assets/VCombobox-Bg-XK8ZC.js.br +0 -0
  268. codex/static_root/assets/VCombobox-Bg-XK8ZC.js.gz +0 -0
  269. codex/static_root/assets/VDialog-C2lwLEJ5.2bf46190a6d5.js.br +0 -0
  270. codex/static_root/assets/VDialog-C2lwLEJ5.2bf46190a6d5.js.gz +0 -0
  271. codex/static_root/assets/VDialog-C2lwLEJ5.js.br +0 -0
  272. codex/static_root/assets/VDialog-C2lwLEJ5.js.gz +0 -0
  273. codex/static_root/assets/VExpansionPanels-CXR8yBcB.a8008489f539.js.br +0 -0
  274. codex/static_root/assets/VExpansionPanels-CXR8yBcB.a8008489f539.js.gz +0 -0
  275. codex/static_root/assets/VExpansionPanels-CXR8yBcB.js.br +0 -0
  276. codex/static_root/assets/VExpansionPanels-CXR8yBcB.js.gz +0 -0
  277. codex/static_root/assets/VRadioGroup-DL9_Ywre.a7b73019c5f4.js.br +0 -0
  278. codex/static_root/assets/VRadioGroup-DL9_Ywre.a7b73019c5f4.js.gz +0 -0
  279. codex/static_root/assets/VRadioGroup-DL9_Ywre.js.br +0 -0
  280. codex/static_root/assets/VRadioGroup-DL9_Ywre.js.gz +0 -0
  281. codex/static_root/assets/VSelect-CRvxnYwi.9a9bcedf5919.js.br +0 -0
  282. codex/static_root/assets/VSelect-CRvxnYwi.9a9bcedf5919.js.gz +0 -0
  283. codex/static_root/assets/VSelect-CRvxnYwi.js.br +0 -0
  284. codex/static_root/assets/VSelect-CRvxnYwi.js.gz +0 -0
  285. codex/static_root/assets/VSelectionControl-AnuOsZjr.0ca164ae628f.css +0 -1
  286. codex/static_root/assets/VSelectionControl-AnuOsZjr.0ca164ae628f.css.br +0 -0
  287. codex/static_root/assets/VSelectionControl-AnuOsZjr.0ca164ae628f.css.gz +0 -0
  288. codex/static_root/assets/VSelectionControl-AnuOsZjr.css +0 -1
  289. codex/static_root/assets/VSelectionControl-AnuOsZjr.css.br +0 -0
  290. codex/static_root/assets/VSelectionControl-AnuOsZjr.css.gz +0 -0
  291. codex/static_root/assets/VSelectionControl-Cg44PiY9.a2ae0de72544.js +0 -1
  292. codex/static_root/assets/VSelectionControl-Cg44PiY9.a2ae0de72544.js.br +0 -0
  293. codex/static_root/assets/VSelectionControl-Cg44PiY9.a2ae0de72544.js.gz +0 -0
  294. codex/static_root/assets/VSelectionControl-Cg44PiY9.js +0 -1
  295. codex/static_root/assets/VSelectionControl-Cg44PiY9.js.br +0 -0
  296. codex/static_root/assets/VSelectionControl-Cg44PiY9.js.gz +0 -0
  297. codex/static_root/assets/VSlideGroup-CW34YaB5.5ca4ce80da01.js.br +0 -0
  298. codex/static_root/assets/VSlideGroup-CW34YaB5.5ca4ce80da01.js.gz +0 -0
  299. codex/static_root/assets/VSlideGroup-CW34YaB5.js.br +0 -0
  300. codex/static_root/assets/VSlideGroup-CW34YaB5.js.gz +0 -0
  301. codex/static_root/assets/VTable-CQQRjtmk.ea08a8b7b98e.js.br +0 -0
  302. codex/static_root/assets/VTable-CQQRjtmk.ea08a8b7b98e.js.gz +0 -0
  303. codex/static_root/assets/VTable-CQQRjtmk.js.br +0 -0
  304. codex/static_root/assets/VTable-CQQRjtmk.js.gz +0 -0
  305. codex/static_root/assets/VTextField-Bc1tD4nS.2026682c8437.css +0 -1
  306. codex/static_root/assets/VTextField-Bc1tD4nS.2026682c8437.css.br +0 -0
  307. codex/static_root/assets/VTextField-Bc1tD4nS.2026682c8437.css.gz +0 -0
  308. codex/static_root/assets/VTextField-Bc1tD4nS.css +0 -1
  309. codex/static_root/assets/VTextField-Bc1tD4nS.css.br +0 -0
  310. codex/static_root/assets/VTextField-Bc1tD4nS.css.gz +0 -0
  311. codex/static_root/assets/VTextField-BkcCIE7o.b563f2af1649.js +0 -1
  312. codex/static_root/assets/VTextField-BkcCIE7o.b563f2af1649.js.br +0 -0
  313. codex/static_root/assets/VTextField-BkcCIE7o.b563f2af1649.js.gz +0 -0
  314. codex/static_root/assets/VTextField-BkcCIE7o.js +0 -1
  315. codex/static_root/assets/VTextField-BkcCIE7o.js.br +0 -0
  316. codex/static_root/assets/VTextField-BkcCIE7o.js.gz +0 -0
  317. codex/static_root/assets/VWindowItem-C-ieUh3X.b48eab9f2068.js.br +0 -0
  318. codex/static_root/assets/VWindowItem-C-ieUh3X.b48eab9f2068.js.gz +0 -0
  319. codex/static_root/assets/VWindowItem-C-ieUh3X.js.br +0 -0
  320. codex/static_root/assets/VWindowItem-C-ieUh3X.js.gz +0 -0
  321. codex/static_root/assets/admin-DogdiwQo.74b6a788601b.js.br +0 -0
  322. codex/static_root/assets/admin-DogdiwQo.74b6a788601b.js.gz +0 -0
  323. codex/static_root/assets/admin-DogdiwQo.js.br +0 -0
  324. codex/static_root/assets/admin-DogdiwQo.js.gz +0 -0
  325. codex/static_root/assets/admin-drawer-panel-DC6Y8jEw.2a38b027f538.js +0 -56
  326. codex/static_root/assets/admin-drawer-panel-DC6Y8jEw.2a38b027f538.js.br +0 -0
  327. codex/static_root/assets/admin-drawer-panel-DC6Y8jEw.2a38b027f538.js.gz +0 -0
  328. codex/static_root/assets/admin-drawer-panel-DC6Y8jEw.js +0 -56
  329. codex/static_root/assets/admin-drawer-panel-DC6Y8jEw.js.br +0 -0
  330. codex/static_root/assets/admin-drawer-panel-DC6Y8jEw.js.gz +0 -0
  331. codex/static_root/assets/admin-drawer-panel-Dm28c2tG.css +0 -1
  332. codex/static_root/assets/admin-drawer-panel-Dm28c2tG.css.br +0 -0
  333. codex/static_root/assets/admin-drawer-panel-Dm28c2tG.css.gz +0 -0
  334. codex/static_root/assets/admin-drawer-panel-Dm28c2tG.fb4e885ba7c4.css +0 -1
  335. codex/static_root/assets/admin-drawer-panel-Dm28c2tG.fb4e885ba7c4.css.br +0 -0
  336. codex/static_root/assets/admin-drawer-panel-Dm28c2tG.fb4e885ba7c4.css.gz +0 -0
  337. codex/static_root/assets/browser-CpAQokFL.107f9f92f55c.js +0 -1
  338. codex/static_root/assets/browser-CpAQokFL.107f9f92f55c.js.br +0 -0
  339. codex/static_root/assets/browser-CpAQokFL.107f9f92f55c.js.gz +0 -0
  340. codex/static_root/assets/browser-CpAQokFL.js +0 -1
  341. codex/static_root/assets/browser-CpAQokFL.js.br +0 -0
  342. codex/static_root/assets/browser-CpAQokFL.js.gz +0 -0
  343. codex/static_root/assets/change-password-dialog-DA5q-03T.dee52c2bee1d.js.br +0 -0
  344. codex/static_root/assets/change-password-dialog-DA5q-03T.dee52c2bee1d.js.gz +0 -0
  345. codex/static_root/assets/change-password-dialog-DA5q-03T.js.br +0 -0
  346. codex/static_root/assets/change-password-dialog-DA5q-03T.js.gz +0 -0
  347. codex/static_root/assets/confirm-dialog-BQg9lyfv.583f88254cd6.js.br +0 -0
  348. codex/static_root/assets/confirm-dialog-BQg9lyfv.583f88254cd6.js.gz +0 -0
  349. codex/static_root/assets/confirm-dialog-BQg9lyfv.js.br +0 -0
  350. codex/static_root/assets/confirm-dialog-BQg9lyfv.js.gz +0 -0
  351. codex/static_root/assets/datetime-column-D_0U7O5k.82d3bf46f6f0.js.br +0 -0
  352. codex/static_root/assets/datetime-column-D_0U7O5k.82d3bf46f6f0.js.gz +0 -0
  353. codex/static_root/assets/datetime-column-D_0U7O5k.js.br +0 -0
  354. codex/static_root/assets/datetime-column-D_0U7O5k.js.gz +0 -0
  355. codex/static_root/assets/filter-Cd_ZATJq.d632f2f33be8.js.br +0 -0
  356. codex/static_root/assets/filter-Cd_ZATJq.d632f2f33be8.js.gz +0 -0
  357. codex/static_root/assets/filter-Cd_ZATJq.js.br +0 -0
  358. codex/static_root/assets/filter-Cd_ZATJq.js.gz +0 -0
  359. codex/static_root/assets/flag-tab-BDStg-L6.542821f0bf3a.js +0 -1
  360. codex/static_root/assets/flag-tab-BDStg-L6.542821f0bf3a.js.br +0 -0
  361. codex/static_root/assets/flag-tab-BDStg-L6.542821f0bf3a.js.gz +0 -0
  362. codex/static_root/assets/flag-tab-BDStg-L6.js +0 -1
  363. codex/static_root/assets/flag-tab-BDStg-L6.js.br +0 -0
  364. codex/static_root/assets/flag-tab-BDStg-L6.js.gz +0 -0
  365. codex/static_root/assets/group-tab-DjLTMu0n.ec5e6c7d8fd4.js.br +0 -0
  366. codex/static_root/assets/group-tab-DjLTMu0n.ec5e6c7d8fd4.js.gz +0 -0
  367. codex/static_root/assets/group-tab-DjLTMu0n.js.br +0 -0
  368. codex/static_root/assets/group-tab-DjLTMu0n.js.gz +0 -0
  369. codex/static_root/assets/http-error-6oixwfCY.fc79a5c9cec4.js.br +0 -0
  370. codex/static_root/assets/http-error-6oixwfCY.fc79a5c9cec4.js.gz +0 -0
  371. codex/static_root/assets/http-error-6oixwfCY.js.br +0 -0
  372. codex/static_root/assets/http-error-6oixwfCY.js.gz +0 -0
  373. codex/static_root/assets/library-tab-DOkzAkbS.62feecf67428.js.br +0 -0
  374. codex/static_root/assets/library-tab-DOkzAkbS.62feecf67428.js.gz +0 -0
  375. codex/static_root/assets/library-tab-DOkzAkbS.js.br +0 -0
  376. codex/static_root/assets/library-tab-DOkzAkbS.js.gz +0 -0
  377. codex/static_root/assets/main-DzK0FyQ4.64342c46e52e.js.br +0 -0
  378. codex/static_root/assets/main-DzK0FyQ4.64342c46e52e.js.gz +0 -0
  379. codex/static_root/assets/main-DzK0FyQ4.js.br +0 -0
  380. codex/static_root/assets/main-DzK0FyQ4.js.gz +0 -0
  381. codex/static_root/assets/pagination-toolbar-Btd4gD8q.dccad5e791aa.js.br +0 -0
  382. codex/static_root/assets/pagination-toolbar-Btd4gD8q.dccad5e791aa.js.gz +0 -0
  383. codex/static_root/assets/pagination-toolbar-Btd4gD8q.js.br +0 -0
  384. codex/static_root/assets/pagination-toolbar-Btd4gD8q.js.gz +0 -0
  385. codex/static_root/assets/pdf-doc-DJFTgxDu.b2f20f4fcce8.js.br +0 -0
  386. codex/static_root/assets/pdf-doc-DJFTgxDu.b2f20f4fcce8.js.gz +0 -0
  387. codex/static_root/assets/pdf-doc-DJFTgxDu.js.br +0 -0
  388. codex/static_root/assets/pdf-doc-DJFTgxDu.js.gz +0 -0
  389. codex/static_root/assets/reader-BZ1zrFjp.37c92f19b36e.js.br +0 -0
  390. codex/static_root/assets/reader-BZ1zrFjp.37c92f19b36e.js.gz +0 -0
  391. codex/static_root/assets/reader-BZ1zrFjp.js.br +0 -0
  392. codex/static_root/assets/reader-BZ1zrFjp.js.gz +0 -0
  393. codex/static_root/assets/relation-chips-Do3jKDRV.90b12692b374.js +0 -1
  394. codex/static_root/assets/relation-chips-Do3jKDRV.90b12692b374.js.br +0 -0
  395. codex/static_root/assets/relation-chips-Do3jKDRV.90b12692b374.js.gz +0 -0
  396. codex/static_root/assets/relation-chips-Do3jKDRV.js +0 -1
  397. codex/static_root/assets/relation-chips-Do3jKDRV.js.br +0 -0
  398. codex/static_root/assets/relation-chips-Do3jKDRV.js.gz +0 -0
  399. codex/static_root/assets/settings-drawer-DG-CKNyF.442b7b74fcd2.js.br +0 -0
  400. codex/static_root/assets/settings-drawer-DG-CKNyF.442b7b74fcd2.js.gz +0 -0
  401. codex/static_root/assets/settings-drawer-DG-CKNyF.js.br +0 -0
  402. codex/static_root/assets/settings-drawer-DG-CKNyF.js.gz +0 -0
  403. codex/static_root/assets/stats-tab-CI0u-X7Y.2d1b6a0d4139.css.br +0 -0
  404. codex/static_root/assets/stats-tab-CI0u-X7Y.2d1b6a0d4139.css.gz +0 -0
  405. codex/static_root/assets/stats-tab-CI0u-X7Y.css.br +0 -0
  406. codex/static_root/assets/stats-tab-CI0u-X7Y.css.gz +0 -0
  407. codex/static_root/assets/stats-tab-GFSKUO2d.423e5a929890.js +0 -1
  408. codex/static_root/assets/stats-tab-GFSKUO2d.423e5a929890.js.br +0 -0
  409. codex/static_root/assets/stats-tab-GFSKUO2d.423e5a929890.js.gz +0 -0
  410. codex/static_root/assets/stats-tab-GFSKUO2d.js +0 -1
  411. codex/static_root/assets/stats-tab-GFSKUO2d.js.br +0 -0
  412. codex/static_root/assets/stats-tab-GFSKUO2d.js.gz +0 -0
  413. codex/static_root/assets/task-tab-BPIRLtMw.e11b108187cb.js.br +0 -0
  414. codex/static_root/assets/task-tab-BPIRLtMw.e11b108187cb.js.gz +0 -0
  415. codex/static_root/assets/task-tab-BPIRLtMw.js.br +0 -0
  416. codex/static_root/assets/task-tab-BPIRLtMw.js.gz +0 -0
  417. codex/static_root/assets/unauthorized-D99cAzQr.3fcb871efc34.js.br +0 -0
  418. codex/static_root/assets/unauthorized-D99cAzQr.3fcb871efc34.js.gz +0 -0
  419. codex/static_root/assets/unauthorized-D99cAzQr.js.br +0 -0
  420. codex/static_root/assets/unauthorized-D99cAzQr.js.gz +0 -0
  421. codex/static_root/assets/user-tab-DhN1GEZN.f7c314e1f210.js.br +0 -0
  422. codex/static_root/assets/user-tab-DhN1GEZN.f7c314e1f210.js.gz +0 -0
  423. codex/static_root/assets/user-tab-DhN1GEZN.js.br +0 -0
  424. codex/static_root/assets/user-tab-DhN1GEZN.js.gz +0 -0
  425. codex/static_root/js/choices-admin.3521e2a863df.json.br +0 -0
  426. codex/static_root/js/choices-admin.3521e2a863df.json.gz +0 -0
  427. codex/static_root/manifest.15533be94933.json.br +0 -0
  428. codex/static_root/manifest.15533be94933.json.gz +0 -0
  429. {codex-1.6.7.dist-info → codex-1.6.9.dist-info}/LICENSE +0 -0
  430. {codex-1.6.7.dist-info → codex-1.6.9.dist-info}/WHEEL +0 -0
  431. {codex-1.6.7.dist-info → codex-1.6.9.dist-info}/entry_points.txt +0 -0
Binary file
Binary file
@@ -1 +1 @@
1
- {"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "js/choices.json": "js/choices.2f6b0359e1ef.json", "js/choices-admin.json": "js/choices-admin.3521e2a863df.json", "assets/group-tab-CBKuS3Iv.css": "assets/group-tab-CBKuS3Iv.7e4746634782.css", "assets/group-tab-DjLTMu0n.js": "assets/group-tab-DjLTMu0n.ec5e6c7d8fd4.js", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/VSelect-ARDhJiQK.css": "assets/VSelect-ARDhJiQK.372c098fb475.css", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/pagination-toolbar-Btd4gD8q.js": "assets/pagination-toolbar-Btd4gD8q.dccad5e791aa.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/admin-drawer-panel-Dm28c2tG.css": "assets/admin-drawer-panel-Dm28c2tG.fb4e885ba7c4.css", "assets/VSlideGroup-Dk_1upHt.css": "assets/VSlideGroup-Dk_1upHt.2c836070ec75.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/settings-drawer-nZ9HvKSZ.css": "assets/settings-drawer-nZ9HvKSZ.01744e131806.css", "assets/VDialog-lQ13FnRR.css": "assets/VDialog-lQ13FnRR.1c801ad756b2.css", "assets/relation-chips-BGitp3yx.css": "assets/relation-chips-BGitp3yx.b3e7d178a615.css", "assets/VTextField-BkcCIE7o.js": "assets/VTextField-BkcCIE7o.b563f2af1649.js", "assets/reader-BZ1zrFjp.js": "assets/reader-BZ1zrFjp.37c92f19b36e.js", "assets/main-Ztp855PW.css": "assets/main-Ztp855PW.d46d718fac45.css", "assets/VDialog-C2lwLEJ5.js": "assets/VDialog-C2lwLEJ5.2bf46190a6d5.js", "assets/http-error-6oixwfCY.js": "assets/http-error-6oixwfCY.fc79a5c9cec4.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/VWindowItem-C-ieUh3X.js": "assets/VWindowItem-C-ieUh3X.b48eab9f2068.js", "assets/admin-D4sw3N4T.css": "assets/admin-D4sw3N4T.b590f88a62cf.css", "assets/filter-Cd_ZATJq.js": "assets/filter-Cd_ZATJq.d632f2f33be8.js", "assets/admin-drawer-panel-DC6Y8jEw.js": "assets/admin-drawer-panel-DC6Y8jEw.2a38b027f538.js", "assets/relation-chips-Do3jKDRV.js": "assets/relation-chips-Do3jKDRV.90b12692b374.js", "assets/settings-drawer-DG-CKNyF.js": "assets/settings-drawer-DG-CKNyF.442b7b74fcd2.js", "assets/VSlideGroup-CW34YaB5.js": "assets/VSlideGroup-CW34YaB5.5ca4ce80da01.js", "assets/confirm-dialog-BQg9lyfv.js": "assets/confirm-dialog-BQg9lyfv.583f88254cd6.js", "assets/reader-YbzUiD0T.css": "assets/reader-YbzUiD0T.efb15835b39d.css", "assets/change-password-dialog-0u6IJA87.css": "assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/pagination-toolbar-BA9ifTed.css": "assets/pagination-toolbar-BA9ifTed.b4865334ee08.css", "assets/library-tab-BygwYPnO.css": "assets/library-tab-BygwYPnO.94e92aa60bf2.css", "assets/user-tab-DhN1GEZN.js": "assets/user-tab-DhN1GEZN.f7c314e1f210.js", "assets/browser-Cy0OgQJC.css": "assets/browser-Cy0OgQJC.fabbd1aaffcf.css", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/VTextField-Bc1tD4nS.css": "assets/VTextField-Bc1tD4nS.2026682c8437.css", "assets/VTable-CQQRjtmk.js": "assets/VTable-CQQRjtmk.ea08a8b7b98e.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/VSelect-CRvxnYwi.js": "assets/VSelect-CRvxnYwi.9a9bcedf5919.js", "assets/unauthorized-DGIM1VFy.css": "assets/unauthorized-DGIM1VFy.c93d0b3ea5a4.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/VCheckboxBtn-BQpfgjoJ.js": "assets/VCheckboxBtn-BQpfgjoJ.073ee1642f91.js", "assets/VCheckbox-CNCrUhbz.js": "assets/VCheckbox-CNCrUhbz.58c18f2fb2cd.js", "assets/flag-tab-DBqpLKi7.css": "assets/flag-tab-DBqpLKi7.dcfef39f541e.css", "assets/browser-CpAQokFL.js": "assets/browser-CpAQokFL.107f9f92f55c.js", "assets/datetime-column-D_0U7O5k.js": "assets/datetime-column-D_0U7O5k.82d3bf46f6f0.js", "assets/VSelectionControl-AnuOsZjr.css": "assets/VSelectionControl-AnuOsZjr.0ca164ae628f.css", "assets/VSelectionControl-Cg44PiY9.js": "assets/VSelectionControl-Cg44PiY9.a2ae0de72544.js", "assets/task-tab-1XiWn9xP.css": "assets/task-tab-1XiWn9xP.06cb8e1b794d.css", "assets/pdf-doc-DJFTgxDu.js": "assets/pdf-doc-DJFTgxDu.b2f20f4fcce8.js", "assets/main-DzK0FyQ4.js": "assets/main-DzK0FyQ4.64342c46e52e.js", "assets/flag-tab-BDStg-L6.js": "assets/flag-tab-BDStg-L6.542821f0bf3a.js", "assets/change-password-dialog-DA5q-03T.js": "assets/change-password-dialog-DA5q-03T.dee52c2bee1d.js", "assets/admin-DogdiwQo.js": "assets/admin-DogdiwQo.74b6a788601b.js", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/task-tab-BPIRLtMw.js": "assets/task-tab-BPIRLtMw.e11b108187cb.js", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/stats-tab-CI0u-X7Y.css": "assets/stats-tab-CI0u-X7Y.2d1b6a0d4139.css", "assets/unauthorized-D99cAzQr.js": "assets/unauthorized-D99cAzQr.3fcb871efc34.js", "assets/VExpansionPanels-DsEXVcCv.css": "assets/VExpansionPanels-DsEXVcCv.20b475255e66.css", "assets/stats-tab-GFSKUO2d.js": "assets/stats-tab-GFSKUO2d.423e5a929890.js", "assets/VRadioGroup-DL9_Ywre.js": "assets/VRadioGroup-DL9_Ywre.a7b73019c5f4.js", "assets/VExpansionPanels-CXR8yBcB.js": "assets/VExpansionPanels-CXR8yBcB.a8008489f539.js", "assets/VCombobox-Bg-XK8ZC.js": "assets/VCombobox-Bg-XK8ZC.5e53616e3bf3.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "assets/library-tab-DOkzAkbS.js": "assets/library-tab-DOkzAkbS.62feecf67428.js", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.15533be94933.json"}, "version": "1.1", "hash": "88f87462cf7f"}
1
+ {"paths": {"rest_framework/docs/js/api.js": "rest_framework/docs/js/api.18a5ba8a1bd8.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.e630f8f4990e.css", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.4e1cdcb7acab.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.455080a7b2ce.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "rest_framework/js/jquery-3.7.1.min.js": "rest_framework/js/jquery-3.7.1.min.2c872dbe60f4.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.2f34b630ffe3.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/load-ajax-form.js": "rest_framework/js/load-ajax-form.8cdb3a9f3466.js", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/css/bootstrap.min.css.map": "rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map", "rest_framework/css/default.css": "rest_framework/css/default.789dfb5732d7.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.f17d4516b026.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/bootstrap-theme.min.css.map": "rest_framework/css/bootstrap-theme.min.css.51806092cc05.map", "img/publisher.svg": "img/publisher.82d378fcd601.svg", "img/logo-32.webp": "img/logo-32.5688944495bf.webp", "img/logo.svg": "img/logo.0f5344a028ca.svg", "img/story-arc.svg": "img/story-arc.ca10014355ef.svg", "img/missing-cover-165.webp": "img/missing-cover-165.0743171f2148.webp", "img/series.svg": "img/series.ec8a889b8f95.svg", "img/logo-maskable-180.webp": "img/logo-maskable-180.c58d966aa64e.webp", "img/missing-cover.svg": "img/missing-cover.ddb038cc2c56.svg", "img/folder.svg": "img/folder.f28936a3701d.svg", "img/volume.svg": "img/volume.814e4c79461a.svg", "img/logo-maskable.svg": "img/logo-maskable.8f7de7f1c6a8.svg", "img/imprint.svg": "img/imprint.7c2adebb76d6.svg", "pwa/offline.html": "pwa/offline.7bfaf9f94bf9.html", "js/choices.json": "js/choices.2f6b0359e1ef.json", "js/choices-admin.json": "js/choices-admin.1eca6d2c22cf.json", "assets/group-tab-CBKuS3Iv.css": "assets/group-tab-CBKuS3Iv.7e4746634782.css", "assets/http-error-DKulXuTl.css": "assets/http-error-DKulXuTl.95e42988d5d5.css", "assets/VSelect-ARDhJiQK.css": "assets/VSelect-ARDhJiQK.372c098fb475.css", "assets/VTextField-DKXmWQyx.js": "assets/VTextField-DKXmWQyx.53d9e13b9847.js", "assets/VSelectionControl-BFq--28I.css": "assets/VSelectionControl-BFq--28I.9687c77461fc.css", "assets/VSelect-Cwd7Ke2J.js": "assets/VSelect-Cwd7Ke2J.fd98b8f830af.js", "assets/pdf-doc-CMzaSV_K.css": "assets/pdf-doc-CMzaSV_K.8cd4b3e65f9a.css", "assets/library-tab-DfZENbbA.js": "assets/library-tab-DfZENbbA.1117ad225bde.js", "assets/materialdesignicons-webfont-PXm3-2wK.woff": "assets/materialdesignicons-webfont-PXm3-2wK.026b7ac9c43c.woff", "assets/VSlideGroup-Dk_1upHt.css": "assets/VSlideGroup-Dk_1upHt.2c836070ec75.css", "assets/VTable-DflzroDq.css": "assets/VTable-DflzroDq.160504d82195.css", "assets/settings-drawer-nZ9HvKSZ.css": "assets/settings-drawer-nZ9HvKSZ.01744e131806.css", "assets/VTable-IQf8Xj4J.js": "assets/VTable-IQf8Xj4J.2e69b517b235.js", "assets/VDialog-lQ13FnRR.css": "assets/VDialog-lQ13FnRR.1c801ad756b2.css", "assets/VCombobox-BiTvNSAL.js": "assets/VCombobox-BiTvNSAL.d1884eaf76e6.js", "assets/relation-chips-BGitp3yx.css": "assets/relation-chips-BGitp3yx.b3e7d178a615.css", "assets/main-Ztp855PW.css": "assets/main-Ztp855PW.d46d718fac45.css", "assets/stats-tab-BZrcMjtP.js": "assets/stats-tab-BZrcMjtP.b8d127a34aa7.js", "assets/VRadioGroup-i2qP9Wu9.css": "assets/VRadioGroup-i2qP9Wu9.8e3741381961.css", "assets/admin-D4sw3N4T.css": "assets/admin-D4sw3N4T.b590f88a62cf.css", "assets/browser-D6WDXwID.js": "assets/browser-D6WDXwID.011e4a20946c.js", "assets/datetime-column-D93BsvcX.js": "assets/datetime-column-D93BsvcX.5caf2255bdc3.js", "assets/VWindowItem-clwRzf0Z.js": "assets/VWindowItem-clwRzf0Z.01620e37f020.js", "assets/reader-YbzUiD0T.css": "assets/reader-YbzUiD0T.efb15835b39d.css", "assets/change-password-dialog-0u6IJA87.css": "assets/change-password-dialog-0u6IJA87.5f9a9aa573b7.css", "assets/copy-to-clipboard-DoUvDJVx.js": "assets/copy-to-clipboard-DoUvDJVx.bec27f144aca.js", "assets/VWindowItem-ByIod57Y.css": "assets/VWindowItem-ByIod57Y.f7fb19752bf3.css", "assets/VExpansionPanels-paVX7c3D.js": "assets/VExpansionPanels-paVX7c3D.3be9407a80fd.js", "assets/user-tab-B_CPCP10.js": "assets/user-tab-B_CPCP10.d1a264b97a0f.js", "assets/pagination-toolbar-BA9ifTed.css": "assets/pagination-toolbar-BA9ifTed.b4865334ee08.css", "assets/VSlideGroup-D4BlVRr8.js": "assets/VSlideGroup-D4BlVRr8.10a79fd58813.js", "assets/VRadioGroup-CLZGmBdz.js": "assets/VRadioGroup-CLZGmBdz.1e41ea70fba8.js", "assets/library-tab-BygwYPnO.css": "assets/library-tab-BygwYPnO.94e92aa60bf2.css", "assets/admin-drawer-panel-DOrhl9Nb.css": "assets/admin-drawer-panel-DOrhl9Nb.3a7af8ec4462.css", "assets/filter-ji46VTOR.js": "assets/filter-ji46VTOR.f7b9ed6fec13.js", "assets/pdf-doc-RJuKdcoH.js": "assets/pdf-doc-RJuKdcoH.4be4a68338de.js", "assets/browser-Cy0OgQJC.css": "assets/browser-Cy0OgQJC.fabbd1aaffcf.css", "assets/confirm-dialog-BmhedLCx.css": "assets/confirm-dialog-BmhedLCx.7c2103d319d4.css", "assets/main-EAqCu0p6.js": "assets/main-EAqCu0p6.e749a8bc2923.js", "assets/settings-drawer-C5t3OYPS.js": "assets/settings-drawer-C5t3OYPS.3fb97d35ae92.js", "assets/group-tab-CMX07Y1c.js": "assets/group-tab-CMX07Y1c.98dd5e2d0bfc.js", "assets/materialdesignicons-webfont-B7mPwVP_.ttf": "assets/materialdesignicons-webfont-B7mPwVP_.6e435534bd35.ttf", "assets/unauthorized-DGIM1VFy.css": "assets/unauthorized-DGIM1VFy.c93d0b3ea5a4.css", "assets/VCombobox-BksEr4D_.css": "assets/VCombobox-BksEr4D_.73429bb75f42.css", "assets/task-tab-aLrGKXQT.js": "assets/task-tab-aLrGKXQT.f8498ed38d40.js", "assets/VCheckboxBtn-BpLxL6DP.js": "assets/VCheckboxBtn-BpLxL6DP.a4cfab2286b6.js", "assets/admin-BMM4khnn.js": "assets/admin-BMM4khnn.eeb686da7f67.js", "assets/flag-tab-DBqpLKi7.css": "assets/flag-tab-DBqpLKi7.dcfef39f541e.css", "assets/relation-chips-BQX3oeiS.js": "assets/relation-chips-BQX3oeiS.acfd60628c35.js", "assets/confirm-dialog-_HotKBZZ.js": "assets/confirm-dialog-_HotKBZZ.2e586037b3e1.js", "assets/reader-BYz5uPEm.js": "assets/reader-BYz5uPEm.e2db8893aa10.js", "assets/VSelectionControl-BTjn8uTI.js": "assets/VSelectionControl-BTjn8uTI.3e9f6e646a35.js", "assets/VCheckbox-dIScsEcb.js": "assets/VCheckbox-dIScsEcb.d54e90dd2ea2.js", "assets/unauthorized-DpTUrdQV.js": "assets/unauthorized-DpTUrdQV.0c1bfe81f457.js", "assets/change-password-dialog-CD1pdXK9.js": "assets/change-password-dialog-CD1pdXK9.8b94f4f171c6.js", "assets/admin-drawer-panel-SQytza6T.js": "assets/admin-drawer-panel-SQytza6T.d94cc92fef08.js", "assets/task-tab-1XiWn9xP.css": "assets/task-tab-1XiWn9xP.06cb8e1b794d.css", "assets/VDialog-DO_IeNl2.js": "assets/VDialog-DO_IeNl2.1e644515ee26.js", "assets/datetime-column-DeCthByU.css": "assets/datetime-column-DeCthByU.1f3bf499e063.css", "assets/materialdesignicons-webfont-CSr8KVlo.eot": "assets/materialdesignicons-webfont-CSr8KVlo.8ced95a05e3c.eot", "assets/flag-tab-CRfBTBsz.js": "assets/flag-tab-CRfBTBsz.0d8f084eea6e.js", "assets/http-error-CzJHczxG.js": "assets/http-error-CzJHczxG.6ee3173d40a5.js", "assets/VExpansionPanels-DsEXVcCv.css": "assets/VExpansionPanels-DsEXVcCv.20b475255e66.css", "assets/stats-tab-BVZzfwi1.css": "assets/stats-tab-BVZzfwi1.28f07f038e88.css", "assets/pagination-toolbar-m4o9cYJ6.js": "assets/pagination-toolbar-m4o9cYJ6.df24ef17e904.js", "assets/VCheckbox-CMKdyl0R.css": "assets/VCheckbox-CMKdyl0R.016ed8d222c4.css", "assets/VTextField-BssVoDhB.css": "assets/VTextField-BssVoDhB.4cc388b4aa3c.css", "assets/materialdesignicons-webfont-Dp5v-WZN.woff2": "assets/materialdesignicons-webfont-Dp5v-WZN.1d7bcee1b302.woff2", "robots.txt": "robots.b6216d61c03e.txt", "manifest.json": "manifest.3d6dd67354d1.json"}, "version": "1.1", "hash": "262253ef875c"}
codex/views/admin/flag.py CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  from codex.librarian.mp_queue import LIBRARIAN_QUEUE
4
4
  from codex.librarian.notifier.tasks import LIBRARY_CHANGED_TASK
5
+ from codex.librarian.tasks import WakeCronTask
5
6
  from codex.logger.logging import get_logger
6
7
  from codex.models import AdminFlag
7
8
  from codex.registration import patch_registration_setting
@@ -10,6 +11,11 @@ from codex.views.admin.auth import AdminModelViewSet
10
11
 
11
12
  LOG = get_logger(__name__)
12
13
 
14
+ _REFRESH_LIBRARY_FLAGS = frozenset(
15
+ flag.value
16
+ for flag in (AdminFlag.FlagChoices.FOLDER_VIEW, AdminFlag.FlagChoices.NON_USERS)
17
+ )
18
+
13
19
 
14
20
  class AdminFlagViewSet(AdminModelViewSet):
15
21
  """Admin Flag Viewset."""
@@ -23,10 +29,13 @@ class AdminFlagViewSet(AdminModelViewSet):
23
29
  key = self.kwargs.get("key")
24
30
  if key == AdminFlag.FlagChoices.REGISTRATION.value:
25
31
  patch_registration_setting()
32
+ elif key == AdminFlag.FlagChoices.SEND_TELEMETRY.value:
33
+ LIBRARIAN_QUEUE.put(WakeCronTask())
26
34
  # Heavy handed refresh everything, but simple.
27
35
  # Folder View could only change the group view and let the ui decide
28
36
  # Registration only needs to change the enable flag
29
- LIBRARIAN_QUEUE.put(LIBRARY_CHANGED_TASK)
37
+ if key in _REFRESH_LIBRARY_FLAGS:
38
+ LIBRARIAN_QUEUE.put(LIBRARY_CHANGED_TASK)
30
39
 
31
40
  def perform_update(self, serializer):
32
41
  """Perform update and hook for change."""
@@ -6,7 +6,7 @@ from drf_spectacular.utils import extend_schema
6
6
  from rest_framework.response import Response
7
7
  from rest_framework.serializers import empty
8
8
 
9
- from codex.librarian.stats import CodexStats
9
+ from codex.librarian.telemeter.stats import CodexStats
10
10
  from codex.logger.logging import get_logger
11
11
  from codex.models.admin import Timestamp
12
12
  from codex.permissions import HasAPIKeyOrIsAdminUser
@@ -4,6 +4,7 @@ from datetime import datetime
4
4
  from math import floor
5
5
  from urllib.parse import quote_plus
6
6
 
7
+ from comicbox.box import Comicbox
7
8
  from django.urls import reverse
8
9
 
9
10
  from codex.logger.logging import get_logger
@@ -96,6 +97,16 @@ class OPDS1EntryLinksMixin:
96
97
  mime_type = self.mime_type_map.get(self.obj.file_type, MimeType.OCTET)
97
98
  return OPDS1Link(Rel.ACQUISITION, href, mime_type, length=self.obj.size)
98
99
 
100
+ def lazy_metadata(self):
101
+ """Get barebones metadata lazily to make pse work for chunky-like readers."""
102
+ if self.obj.page_count and self.obj.file_type:
103
+ return False
104
+ with Comicbox(self.obj.path) as cb:
105
+ self.obj.page_count = cb.get_page_count()
106
+ self.obj.file_type = cb.get_file_type()
107
+ LOG.debug(f"Got lazy opds pse metadata for {self.obj.path}")
108
+ return True
109
+
99
110
  def _stream_link(self):
100
111
  pk = self.obj.pk
101
112
  if not pk:
@@ -107,13 +118,14 @@ class OPDS1EntryLinksMixin:
107
118
  href = href.replace("0/page.jpg", "{pageNumber}/page.jpg")
108
119
  page = self.obj.page
109
120
  # extra stupid pse chunky fix for no metadata
110
- count = max(self.obj.page_count, 1)
121
+ self.lazy_metadata()
122
+ pse_count = self.obj.page_count
111
123
  bookmark_updated_at = self.obj.bookmark_updated_at
112
124
  return OPDS1Link(
113
125
  Rel.STREAM,
114
126
  href,
115
127
  MimeType.STREAM,
116
- pse_count=count,
128
+ pse_count=pse_count,
117
129
  pse_last_read=page,
118
130
  pse_last_read_date=bookmark_updated_at,
119
131
  )
@@ -3,7 +3,6 @@
3
3
  from types import MappingProxyType
4
4
  from typing import TYPE_CHECKING, Any
5
5
 
6
- from comicbox.box import Comicbox
7
6
  from drf_spectacular.utils import extend_schema
8
7
  from rest_framework.response import Response
9
8
  from rest_framework.throttling import ScopedRateThrottle
@@ -30,7 +29,6 @@ from codex.views.opds.v1.links import (
30
29
  if TYPE_CHECKING:
31
30
  from collections.abc import Mapping
32
31
 
33
- from django.db.models import QuerySet
34
32
 
35
33
  LOG = get_logger(__name__)
36
34
 
@@ -132,15 +130,20 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
132
130
  self.acquisition_groups, zero_pad, metadata, self.mime_type_map
133
131
  )
134
132
  fallback = bool(self.admin_flags.get("folder_view"))
133
+ import_pks = set()
135
134
  for obj in objs: # type: ignore
136
- entries += [
137
- OPDS1Entry(
138
- obj,
139
- self.request.GET,
140
- data,
141
- title_filename_fallback=fallback,
142
- )
143
- ]
135
+ entry = OPDS1Entry(
136
+ obj,
137
+ self.request.GET,
138
+ data,
139
+ title_filename_fallback=fallback,
140
+ )
141
+ if key == "books" and entry.lazy_metadata():
142
+ import_pks.add(obj.pk)
143
+ entries.append(entry)
144
+ if import_pks:
145
+ task = LazyImportComicsTask(frozenset(import_pks))
146
+ LIBRARIAN_QUEUE.put(task)
144
147
  return entries
145
148
 
146
149
  @property
@@ -162,28 +165,6 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
162
165
  LOG.exception("Getting OPDS v1 entries")
163
166
  return entries
164
167
 
165
- def _ensure_page_counts(self):
166
- """Ensure page counts on books with just in time comicbox."""
167
- if self.admin_flags.get("import_metadata"):
168
- return
169
- books_qs: QuerySet = self.obj["books"] # type: ignore
170
- import_pks = set()
171
- new_books = []
172
- for book in books_qs:
173
- if book.page_count is not None:
174
- continue
175
- with Comicbox(book.path) as cb:
176
- book.file_type = cb.get_file_type()
177
- book.page_count = cb.get_page_count()
178
- new_books.append(book)
179
- import_pks.add(book.pk)
180
- if new_books:
181
- writable_obj = dict(self.obj)
182
- writable_obj["books"] = new_books # type: ignore
183
- self.obj = MappingProxyType(writable_obj)
184
- task = LazyImportComicsTask(frozenset(import_pks))
185
- LIBRARIAN_QUEUE.put(task)
186
-
187
168
  def get_object(self): # type: ignore
188
169
  """Get the browser page and serialize it for this subclass."""
189
170
  group_qs, book_qs, num_pages, total_count, zero_pad, mtime = (
@@ -206,8 +187,6 @@ class OPDS1FeedView(OPDS1LinksView, OPDSTemplateView):
206
187
 
207
188
  self.is_aq_feed = self.model_group in ("c", "f")
208
189
 
209
- self._ensure_page_counts()
210
-
211
190
  # Do not return a Mapping despite the type. Return self for the serializer.
212
191
  return self
213
192
 
@@ -92,17 +92,16 @@ class ReaderPageView(BookmarkBaseView):
92
92
  )
93
93
  def get(self, *_args, **_kwargs):
94
94
  """Get the comic page from the archive."""
95
- pk = self.kwargs.get("pk")
96
- comic = None
97
95
  try:
98
96
  page_image, content_type = self._get_page_image()
99
97
  self._update_bookmark()
100
98
  except Comic.DoesNotExist as exc:
99
+ pk = self.kwargs.get("pk")
101
100
  detail = f"comic {pk} not found in db."
102
101
  raise NotFound(detail=detail) from exc
103
102
  except FileNotFoundError as exc:
104
- path = comic.path if comic else f"path for {pk}"
105
- detail = f"comic {path} not found."
103
+ pk = self.kwargs.get("pk")
104
+ detail = f"comic path for {pk} not found: {exc}."
106
105
  raise NotFound(detail=detail) from exc
107
106
  except Exception as exc:
108
107
  LOG.warning(exc)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codex
3
- Version: 1.6.7
3
+ Version: 1.6.9
4
4
  Summary: A comic archive web server.
5
5
  Home-page: https://github.com/ajslater/codex
6
6
  License: GPL-3.0-only
@@ -115,27 +115,31 @@ the recommended way to run Codex.
115
115
  You'll then want to read the [Administration](#administration) section of this
116
116
  document.
117
117
 
118
- ### Install & Run as a Native Application
118
+ ### Install & Run on <a href="homeassistant">HomeAssistant</a> server
119
119
 
120
- You can also run Codex as a natively installed python application with pip.
120
+ If you have a [HomeAssistant](https://www.home-assistant.io/) server, Codex can
121
+ be installed with the following steps :
121
122
 
122
- #### Wheel Build Dependencies
123
+ - Add the `https://github.com/alexbelgium/hassio-addons` repository by
124
+ [clicking here](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
125
+ - Install the addon :
126
+ [click here to automatically open the addon store, then install the addon](https://my.home-assistant.io/redirect/supervisor)
127
+ - Customize addon options, then then start the add-on.
123
128
 
124
- You'll need to install these system dependencies before installing Codex.
129
+ ### Install & Run as a Native Application
125
130
 
126
- ##### macOS
131
+ You can also run Codex as a natively installed python application with pip.
127
132
 
128
- <!-- eslint-skip -->
133
+ #### Binary Dependencies
129
134
 
130
- ```sh
131
- brew install jpeg libffi libyaml libzip openssl python unrar webp
132
- ```
135
+ You'll need to install the appropriate system dependencies for your platform
136
+ before installing Codex.
133
137
 
134
- ##### Linux
138
+ ##### Linux Dependencies
135
139
 
136
- ###### <a href="#debian">Debian</a>
140
+ ###### <a href="#debian">Debian</a> Dependencies
137
141
 
138
- ...and Ubuntu, Mint, MX and others (and WSL).
142
+ ...and Ubuntu, Mint, MX, Window Subsystem for Linux, and others.
139
143
 
140
144
  <!-- eslint-skip -->
141
145
 
@@ -144,8 +148,9 @@ apt install build-essential libimagequant0 libjpeg-turbo8 libopenjp2-7 libssl li
144
148
  ```
145
149
 
146
150
  Versions of packages like libjpeg, libssl, libtiff may differ between flavors
147
- and versions of Debian. If the version above is not available, try searching for
148
- one that is with apt-cache or aptitude.
151
+ and versions of your distribution. If the package versions listed in the example
152
+ above are not available, try searching for ones that are with `apt-cache` or
153
+ `aptitude`.
149
154
 
150
155
  <!-- eslint-skip -->
151
156
 
@@ -153,7 +158,7 @@ one that is with apt-cache or aptitude.
153
158
  apt-cache search libjpeg-turbo
154
159
  ```
155
160
 
156
- ###### Alpine
161
+ ###### <a href="alpine">Alpine</a> Dependencies
157
162
 
158
163
  <!-- eslint-skip -->
159
164
 
@@ -169,31 +174,28 @@ packaged for Linux, but here are some instructions:
169
174
 
170
175
  Unrar as packaged for Alpine Linux v3.14 seems to work on Alpine v3.15+
171
176
 
172
- #### Windows
173
-
174
- Windows users should use Docker to run Codex until this documentation section is
175
- complete.
177
+ ##### macOS Dependencies
176
178
 
177
- Codex can _probably_ run on the Windows Linux Subsystem but I haven't personally
178
- tested it yet. Try following the instructions for [Debian](#debian) above. There
179
- may be outstanding platform related bugs.
180
-
181
- Contributions to the Windows documentation will be gratefully accepted on
182
- [the outstanding issue](https://github.com/ajslater/codex/issues/76) or Discord.
183
-
184
- #### Install Codex with pip
185
-
186
- You may now install Codex with pip
179
+ Using [Homebrew](https://brew.sh/):
187
180
 
188
181
  <!-- eslint-skip -->
189
182
 
190
183
  ```sh
191
- pip3 install codex
184
+ brew install jpeg libffi libyaml libzip openssl python unrar webp
192
185
  ```
193
186
 
194
- #### Run Codex Natively
187
+ ##### <a href="#windows">Windows</a> Dependencies
195
188
 
196
- pip should install the codex binary on your path. Run
189
+ Windows users are encouraged to use Docker to run Codex, but it will also run
190
+ natively on the Windows Subsystem for Linux.
191
+
192
+ Installation instructions are in the <a href="/WINDOWS.md">Native Windows
193
+ Dependencies Installation Document</a>.
194
+
195
+ #### <a href="#run">Run</a> Codex Natively
196
+
197
+ Once you have installed codex, the codex binary should be on your path. To start
198
+ codex, run:
197
199
 
198
200
  <!-- eslint-skip -->
199
201
 
@@ -201,18 +203,9 @@ pip should install the codex binary on your path. Run
201
203
  codex
202
204
  ```
203
205
 
204
- and then navigate to <http://localhost:9810/>
205
-
206
- ### Install & Run on your preexisting HomeAssistant server
206
+ ### Use Codex
207
207
 
208
- If you have a [HomeAssistant](https://www.home-assistant.io/) server, Codex can
209
- be installed with the following steps :
210
-
211
- - Add the `https://github.com/alexbelgium/hassio-addons` repository by
212
- [clicking here](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
213
- - Install the addon :
214
- [click here to automatically open the addon store, then install the addon](https://my.home-assistant.io/redirect/supervisor)
215
- - Customize addon options, then then start the add-on.
208
+ Once installed and running you may navigate to <http://localhost:9810/>
216
209
 
217
210
  ## <a name="administration">👑 Administration</a>
218
211
 
@@ -579,6 +572,8 @@ questions on the [Mylar Discord](https://discord.gg/6UG94R7E8T). Please use the
579
572
 
580
573
  - Thanks to [Aurélien Mazurie](https://pypi.org/user/ajmazurie/) for allowing me
581
574
  to use the PyPi name 'codex'.
575
+ - To [ProfessionalTart](https://github.com/professionaltart) for providing
576
+ native Windows installation instructions.
582
577
  - Thanks to the good people of
583
578
  [#mylar](https://github.com/mylar3/mylar3#live-support--conversation) for
584
579
  continuous feedback and comic ecosystem education.