codex 1.4.1__py3-none-any.whl → 1.4.3__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 (237) hide show
  1. codex/applications/websocket.py +1 -1
  2. codex/librarian/importer/aggregate_metadata.py +38 -25
  3. codex/librarian/importer/clean_metadata.py +26 -13
  4. codex/librarian/importer/create_fks.py +1 -1
  5. codex/librarian/librariand.py +7 -4
  6. codex/librarian/watchdog/db_snapshot.py +1 -1
  7. codex/librarian/watchdog/event_batcherd.py +14 -11
  8. codex/librarian/watchdog/events.py +1 -1
  9. codex/logger/loggerd.py +14 -11
  10. codex/migrations/0001_init.py +3 -2
  11. codex/migrations/0002_auto_20200826_0622.py +4 -2
  12. codex/migrations/0003_auto_20200831_2033.py +4 -2
  13. codex/migrations/0004_failedimport.py +4 -2
  14. codex/migrations/0005_auto_20200918_0146.py +4 -2
  15. codex/migrations/0006_update_default_names_and_remove_duplicate_comics.py +12 -7
  16. codex/migrations/0007_auto_20211210_1710.py +3 -2
  17. codex/migrations/0008_alter_comic_created_at_alter_comic_format_and_more.py +4 -2
  18. codex/migrations/0009_alter_comic_parent_folder.py +4 -2
  19. codex/migrations/0010_haystack.py +4 -2
  20. codex/migrations/0011_library_groups_and_metadata_changes.py +3 -2
  21. codex/migrations/0012_rename_description_comic_comments.py +4 -2
  22. codex/migrations/0013_int_issue_count_longer_charfields.py +3 -3
  23. codex/migrations/0014_pdf_issue_suffix_remove_cover_image_sort_name.py +3 -2
  24. codex/migrations/0015_link_comics_to_top_level_folders.py +5 -2
  25. codex/migrations/0016_remove_comic_cover_path_librarianstatus.py +3 -3
  26. codex/migrations/0017_alter_timestamp_options_alter_adminflag_name_and_more.py +3 -3
  27. codex/migrations/0018_rename_userbookmark_bookmark.py +3 -2
  28. codex/migrations/0019_delete_queuejob.py +3 -2
  29. codex/migrations/0020_remove_search_tables.py +3 -2
  30. codex/migrations/0021_bookmark_fit_to_choices_read_in_reverse.py +3 -2
  31. codex/migrations/0022_bookmark_vertical_useractive_null_statuses.py +3 -2
  32. codex/migrations/0023_rename_credit_creator_and_more.py +3 -2
  33. codex/migrations/0024_comic_gtin_comic_story_arc_number.py +4 -2
  34. codex/migrations/0025_add_story_arc_number.py +4 -2
  35. codex/models.py +3 -4
  36. codex/search/backend.py +34 -31
  37. codex/serializers/auth.py +2 -1
  38. codex/serializers/choices.py +1 -0
  39. codex/static_root/assets/admin-b2b56cd6.f68d07d2bf93.js +41 -0
  40. codex/static_root/assets/admin-b2b56cd6.f68d07d2bf93.js.br +0 -0
  41. codex/static_root/assets/admin-b2b56cd6.f68d07d2bf93.js.gz +0 -0
  42. codex/static_root/assets/admin-b2b56cd6.js +41 -0
  43. codex/static_root/assets/admin-b2b56cd6.js.br +0 -0
  44. codex/static_root/assets/admin-b2b56cd6.js.gz +0 -0
  45. codex/static_root/assets/{admin-drawer-panel-522f1e6c.089d70878270.js → admin-drawer-panel-efc525ec.ddab36a24e08.js} +1 -1
  46. codex/static_root/assets/admin-drawer-panel-efc525ec.ddab36a24e08.js.br +0 -0
  47. codex/static_root/assets/admin-drawer-panel-efc525ec.ddab36a24e08.js.gz +0 -0
  48. codex/static_root/assets/{admin-drawer-panel-522f1e6c.js → admin-drawer-panel-efc525ec.js} +1 -1
  49. codex/static_root/assets/admin-drawer-panel-efc525ec.js.br +0 -0
  50. codex/static_root/assets/admin-drawer-panel-efc525ec.js.gz +0 -0
  51. codex/static_root/assets/admin-f2bb1dc8.css +1 -0
  52. codex/static_root/assets/admin-f2bb1dc8.css.br +0 -0
  53. codex/static_root/assets/admin-f2bb1dc8.css.gz +0 -0
  54. codex/static_root/assets/admin-f2bb1dc8.ecec18791c01.css +1 -0
  55. codex/static_root/assets/admin-f2bb1dc8.ecec18791c01.css.br +0 -0
  56. codex/static_root/assets/admin-f2bb1dc8.ecec18791c01.css.gz +0 -0
  57. codex/static_root/assets/{browser-7f7d7134.0fe3749b0f2f.css → browser-198df919.css} +1 -1
  58. codex/static_root/assets/browser-198df919.css.br +0 -0
  59. codex/static_root/assets/browser-198df919.css.gz +0 -0
  60. codex/static_root/assets/{browser-7f7d7134.css → browser-198df919.f06301531790.css} +1 -1
  61. codex/static_root/assets/browser-198df919.f06301531790.css.br +0 -0
  62. codex/static_root/assets/browser-198df919.f06301531790.css.gz +0 -0
  63. codex/static_root/assets/browser-ca158ba5.980d652eb174.js +1 -0
  64. codex/static_root/assets/browser-ca158ba5.980d652eb174.js.br +0 -0
  65. codex/static_root/assets/browser-ca158ba5.980d652eb174.js.gz +0 -0
  66. codex/static_root/assets/browser-ca158ba5.js +1 -0
  67. codex/static_root/assets/browser-ca158ba5.js.br +0 -0
  68. codex/static_root/assets/browser-ca158ba5.js.gz +0 -0
  69. codex/static_root/assets/{http-error-5e17b794.77ceeb2d4641.js → http-error-d31fd3bd.6ab9acf65973.js} +1 -1
  70. codex/static_root/assets/http-error-d31fd3bd.6ab9acf65973.js.br +0 -0
  71. codex/static_root/assets/http-error-d31fd3bd.6ab9acf65973.js.gz +0 -0
  72. codex/static_root/assets/{http-error-5e17b794.js → http-error-d31fd3bd.js} +1 -1
  73. codex/static_root/assets/http-error-d31fd3bd.js.br +0 -0
  74. codex/static_root/assets/http-error-d31fd3bd.js.gz +0 -0
  75. codex/static_root/assets/{main-0898f4bb.181e0145c642.css → main-c11eb0f1.776522baac3b.css} +1 -1
  76. codex/static_root/assets/main-c11eb0f1.776522baac3b.css.br +0 -0
  77. codex/static_root/assets/{main-0898f4bb.181e0145c642.css.gz → main-c11eb0f1.776522baac3b.css.gz} +0 -0
  78. codex/static_root/assets/{main-0898f4bb.css → main-c11eb0f1.css} +1 -1
  79. codex/static_root/assets/main-c11eb0f1.css.br +0 -0
  80. codex/static_root/assets/{main-0898f4bb.css.gz → main-c11eb0f1.css.gz} +0 -0
  81. codex/static_root/assets/main-c5736dea.a4790dbdb569.js +1 -0
  82. codex/static_root/assets/main-c5736dea.a4790dbdb569.js.br +0 -0
  83. codex/static_root/assets/main-c5736dea.a4790dbdb569.js.gz +0 -0
  84. codex/static_root/assets/main-c5736dea.js +1 -0
  85. codex/static_root/assets/main-c5736dea.js.br +0 -0
  86. codex/static_root/assets/main-c5736dea.js.gz +0 -0
  87. codex/static_root/assets/metadata-dialog-83c74d48.b5cccc13c737.css +1 -0
  88. codex/static_root/assets/metadata-dialog-83c74d48.b5cccc13c737.css.br +0 -0
  89. codex/static_root/assets/metadata-dialog-83c74d48.b5cccc13c737.css.gz +0 -0
  90. codex/static_root/assets/metadata-dialog-83c74d48.css +1 -0
  91. codex/static_root/assets/metadata-dialog-83c74d48.css.br +0 -0
  92. codex/static_root/assets/metadata-dialog-83c74d48.css.gz +0 -0
  93. codex/static_root/assets/metadata-dialog-8c0a11ff.b281b7635db5.js +1 -0
  94. codex/static_root/assets/metadata-dialog-8c0a11ff.b281b7635db5.js.br +0 -0
  95. codex/static_root/assets/metadata-dialog-8c0a11ff.b281b7635db5.js.gz +0 -0
  96. codex/static_root/assets/metadata-dialog-8c0a11ff.js +1 -0
  97. codex/static_root/assets/metadata-dialog-8c0a11ff.js.br +0 -0
  98. codex/static_root/assets/metadata-dialog-8c0a11ff.js.gz +0 -0
  99. codex/static_root/assets/{page-pdf-157ba97e.613d7c2beb77.js → page-pdf-ed976750.730244f14d16.js} +1 -1
  100. codex/static_root/assets/page-pdf-ed976750.730244f14d16.js.br +0 -0
  101. codex/static_root/assets/page-pdf-ed976750.730244f14d16.js.gz +0 -0
  102. codex/static_root/assets/{page-pdf-157ba97e.js → page-pdf-ed976750.js} +1 -1
  103. codex/static_root/assets/page-pdf-ed976750.js.br +0 -0
  104. codex/static_root/assets/page-pdf-ed976750.js.gz +0 -0
  105. codex/static_root/assets/reader-5540ffcb.8ea3c63a3154.css +1 -0
  106. codex/static_root/assets/reader-5540ffcb.8ea3c63a3154.css.br +0 -0
  107. codex/static_root/assets/reader-5540ffcb.8ea3c63a3154.css.gz +0 -0
  108. codex/static_root/assets/reader-5540ffcb.css +1 -0
  109. codex/static_root/assets/reader-5540ffcb.css.br +0 -0
  110. codex/static_root/assets/reader-5540ffcb.css.gz +0 -0
  111. codex/static_root/assets/reader-c562377d.7f78718f4c63.js +1 -0
  112. codex/static_root/assets/reader-c562377d.7f78718f4c63.js.br +0 -0
  113. codex/static_root/assets/reader-c562377d.7f78718f4c63.js.gz +0 -0
  114. codex/static_root/assets/reader-c562377d.js +1 -0
  115. codex/static_root/assets/reader-c562377d.js.br +0 -0
  116. codex/static_root/assets/reader-c562377d.js.gz +0 -0
  117. codex/static_root/{manifest.d2f93a519ada.json → manifest.55457ccaa01c.json} +32 -32
  118. codex/static_root/manifest.55457ccaa01c.json.br +0 -0
  119. codex/static_root/manifest.55457ccaa01c.json.gz +0 -0
  120. codex/static_root/manifest.json +32 -32
  121. codex/static_root/manifest.json.br +0 -0
  122. codex/static_root/manifest.json.gz +0 -0
  123. codex/static_root/pwa/{offline.37a4206d79f0.html → offline.7bfaf9f94bf9.html} +1 -1
  124. codex/static_root/pwa/offline.7bfaf9f94bf9.html.br +0 -0
  125. codex/static_root/pwa/offline.7bfaf9f94bf9.html.gz +0 -0
  126. codex/static_root/pwa/offline.html +1 -1
  127. codex/static_root/pwa/offline.html.br +0 -0
  128. codex/static_root/pwa/offline.html.gz +0 -0
  129. codex/static_root/staticfiles.json +1 -1
  130. codex/threads.py +1 -1
  131. codex/views/admin/api_key.py +3 -1
  132. codex/views/admin/flag.py +3 -1
  133. codex/views/admin/group.py +3 -1
  134. codex/views/admin/library.py +5 -4
  135. codex/views/admin/stats.py +10 -6
  136. codex/views/admin/tasks.py +35 -30
  137. codex/views/admin/user.py +4 -2
  138. codex/views/bookmark.py +6 -4
  139. codex/views/browser/base.py +30 -28
  140. codex/views/browser/browser.py +78 -80
  141. codex/views/browser/browser_annotations.py +15 -10
  142. codex/views/browser/browser_order_by.py +21 -16
  143. codex/views/browser/choices.py +37 -22
  144. codex/views/browser/filters/search.py +19 -16
  145. codex/views/browser/metadata.py +50 -41
  146. codex/views/cover.py +3 -1
  147. codex/views/download.py +4 -2
  148. codex/views/frontend.py +3 -2
  149. codex/views/mixins.py +13 -9
  150. codex/views/opds/authentication_v1.py +45 -41
  151. codex/views/opds/const.py +20 -13
  152. codex/views/opds/v1/entry/data.py +2 -1
  153. codex/views/opds/v1/facets.py +2 -1
  154. codex/views/opds/v1/feed.py +11 -4
  155. codex/views/opds/v1/links.py +8 -6
  156. codex/views/opds/v1/opensearch_v1.py +1 -1
  157. codex/views/opds/v2/feed.py +2 -1
  158. codex/views/opds/v2/publications.py +15 -12
  159. codex/views/reader/page.py +1 -1
  160. codex/views/session.py +50 -43
  161. codex/views/template.py +2 -2
  162. codex/websockets/listener.py +10 -7
  163. {codex-1.4.1.dist-info → codex-1.4.3.dist-info}/METADATA +24 -28
  164. {codex-1.4.1.dist-info → codex-1.4.3.dist-info}/RECORD +167 -167
  165. {codex-1.4.1.dist-info → codex-1.4.3.dist-info}/WHEEL +1 -1
  166. codex/static_root/assets/admin-12749881.ef0f50bac290.js +0 -41
  167. codex/static_root/assets/admin-12749881.ef0f50bac290.js.br +0 -0
  168. codex/static_root/assets/admin-12749881.ef0f50bac290.js.gz +0 -0
  169. codex/static_root/assets/admin-12749881.js +0 -41
  170. codex/static_root/assets/admin-12749881.js.br +0 -0
  171. codex/static_root/assets/admin-12749881.js.gz +0 -0
  172. codex/static_root/assets/admin-beda768d.a614eee46307.css +0 -1
  173. codex/static_root/assets/admin-beda768d.a614eee46307.css.br +0 -0
  174. codex/static_root/assets/admin-beda768d.a614eee46307.css.gz +0 -0
  175. codex/static_root/assets/admin-beda768d.css +0 -1
  176. codex/static_root/assets/admin-beda768d.css.br +0 -0
  177. codex/static_root/assets/admin-beda768d.css.gz +0 -0
  178. codex/static_root/assets/admin-drawer-panel-522f1e6c.089d70878270.js.br +0 -0
  179. codex/static_root/assets/admin-drawer-panel-522f1e6c.089d70878270.js.gz +0 -0
  180. codex/static_root/assets/admin-drawer-panel-522f1e6c.js.br +0 -0
  181. codex/static_root/assets/admin-drawer-panel-522f1e6c.js.gz +0 -0
  182. codex/static_root/assets/browser-7f7d7134.0fe3749b0f2f.css.br +0 -0
  183. codex/static_root/assets/browser-7f7d7134.0fe3749b0f2f.css.gz +0 -0
  184. codex/static_root/assets/browser-7f7d7134.css.br +0 -0
  185. codex/static_root/assets/browser-7f7d7134.css.gz +0 -0
  186. codex/static_root/assets/browser-af622672.d51aca96d64d.js +0 -1
  187. codex/static_root/assets/browser-af622672.d51aca96d64d.js.br +0 -0
  188. codex/static_root/assets/browser-af622672.d51aca96d64d.js.gz +0 -0
  189. codex/static_root/assets/browser-af622672.js +0 -1
  190. codex/static_root/assets/browser-af622672.js.br +0 -0
  191. codex/static_root/assets/browser-af622672.js.gz +0 -0
  192. codex/static_root/assets/http-error-5e17b794.77ceeb2d4641.js.br +0 -0
  193. codex/static_root/assets/http-error-5e17b794.77ceeb2d4641.js.gz +0 -0
  194. codex/static_root/assets/http-error-5e17b794.js.br +0 -0
  195. codex/static_root/assets/http-error-5e17b794.js.gz +0 -0
  196. codex/static_root/assets/main-0898f4bb.181e0145c642.css.br +0 -0
  197. codex/static_root/assets/main-0898f4bb.css.br +0 -0
  198. codex/static_root/assets/main-9e76a4c3.6844a407d14c.js +0 -1
  199. codex/static_root/assets/main-9e76a4c3.6844a407d14c.js.br +0 -0
  200. codex/static_root/assets/main-9e76a4c3.6844a407d14c.js.gz +0 -0
  201. codex/static_root/assets/main-9e76a4c3.js +0 -1
  202. codex/static_root/assets/main-9e76a4c3.js.br +0 -0
  203. codex/static_root/assets/main-9e76a4c3.js.gz +0 -0
  204. codex/static_root/assets/metadata-dialog-62c29ce0.8418785c0453.js +0 -1
  205. codex/static_root/assets/metadata-dialog-62c29ce0.8418785c0453.js.br +0 -0
  206. codex/static_root/assets/metadata-dialog-62c29ce0.8418785c0453.js.gz +0 -0
  207. codex/static_root/assets/metadata-dialog-62c29ce0.js +0 -1
  208. codex/static_root/assets/metadata-dialog-62c29ce0.js.br +0 -0
  209. codex/static_root/assets/metadata-dialog-62c29ce0.js.gz +0 -0
  210. codex/static_root/assets/metadata-dialog-cb306ffd.cc304996d7bb.css +0 -1
  211. codex/static_root/assets/metadata-dialog-cb306ffd.cc304996d7bb.css.br +0 -0
  212. codex/static_root/assets/metadata-dialog-cb306ffd.cc304996d7bb.css.gz +0 -0
  213. codex/static_root/assets/metadata-dialog-cb306ffd.css +0 -1
  214. codex/static_root/assets/metadata-dialog-cb306ffd.css.br +0 -0
  215. codex/static_root/assets/metadata-dialog-cb306ffd.css.gz +0 -0
  216. codex/static_root/assets/page-pdf-157ba97e.613d7c2beb77.js.br +0 -0
  217. codex/static_root/assets/page-pdf-157ba97e.613d7c2beb77.js.gz +0 -0
  218. codex/static_root/assets/page-pdf-157ba97e.js.br +0 -0
  219. codex/static_root/assets/page-pdf-157ba97e.js.gz +0 -0
  220. codex/static_root/assets/reader-36266549.0b2cf1291f27.js +0 -1
  221. codex/static_root/assets/reader-36266549.0b2cf1291f27.js.br +0 -0
  222. codex/static_root/assets/reader-36266549.0b2cf1291f27.js.gz +0 -0
  223. codex/static_root/assets/reader-36266549.js +0 -1
  224. codex/static_root/assets/reader-36266549.js.br +0 -0
  225. codex/static_root/assets/reader-36266549.js.gz +0 -0
  226. codex/static_root/assets/reader-7f004141.506eecc6954b.css +0 -1
  227. codex/static_root/assets/reader-7f004141.506eecc6954b.css.br +0 -0
  228. codex/static_root/assets/reader-7f004141.506eecc6954b.css.gz +0 -0
  229. codex/static_root/assets/reader-7f004141.css +0 -1
  230. codex/static_root/assets/reader-7f004141.css.br +0 -0
  231. codex/static_root/assets/reader-7f004141.css.gz +0 -0
  232. codex/static_root/manifest.d2f93a519ada.json.br +0 -0
  233. codex/static_root/manifest.d2f93a519ada.json.gz +0 -0
  234. codex/static_root/pwa/offline.37a4206d79f0.html.br +0 -0
  235. codex/static_root/pwa/offline.37a4206d79f0.html.gz +0 -0
  236. {codex-1.4.1.dist-info → codex-1.4.3.dist-info}/LICENSE +0 -0
  237. {codex-1.4.1.dist-info → codex-1.4.3.dist-info}/entry_points.txt +0 -0
codex/views/session.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """Manage user sessions with appropriate defaults."""
2
2
  from abc import ABC, abstractmethod
3
3
  from copy import deepcopy
4
+ from types import MappingProxyType
4
5
 
5
6
  from drf_spectacular.utils import extend_schema
6
7
  from rest_framework.generics import GenericAPIView
@@ -24,7 +25,7 @@ class SessionViewBaseBase(GenericAPIView, ABC):
24
25
  """Implement the session key string."""
25
26
  raise NotImplementedError
26
27
 
27
- SESSION_DEFAULTS = {}
28
+ SESSION_DEFAULTS = MappingProxyType({})
28
29
 
29
30
  @classmethod
30
31
  def _get_source_values_or_set_defaults(cls, defaults_dict, source_dict, data):
@@ -64,60 +65,66 @@ class BrowserSessionViewBase(SessionViewBaseBase):
64
65
  SESSION_KEY = "browser" # type: ignore
65
66
  CREATOR_PERSON_UI_FIELD = "creators"
66
67
  STORY_ARC_UI_FIELD = "story_arcs"
67
- _DYNAMIC_FILTER_DEFAULTS = {
68
- "age_rating": [],
69
- "characters": [],
70
- "country": [],
71
- CREATOR_PERSON_UI_FIELD: [],
72
- "community_rating": [],
73
- "critical_rating": [],
74
- "decade": [],
75
- "file_type": [],
76
- "genres": [],
77
- "language": [],
78
- "locations": [],
79
- "original_format": [],
80
- "q": "",
81
- "read_ltr": [],
82
- "series_groups": [],
83
- STORY_ARC_UI_FIELD: [],
84
- "tags": [],
85
- "teams": [],
86
- "year": [],
87
- }
68
+ _DYNAMIC_FILTER_DEFAULTS = MappingProxyType(
69
+ {
70
+ "age_rating": [],
71
+ "characters": [],
72
+ "country": [],
73
+ CREATOR_PERSON_UI_FIELD: [],
74
+ "community_rating": [],
75
+ "critical_rating": [],
76
+ "decade": [],
77
+ "file_type": [],
78
+ "genres": [],
79
+ "language": [],
80
+ "locations": [],
81
+ "original_format": [],
82
+ "q": "",
83
+ "read_ltr": [],
84
+ "series_groups": [],
85
+ STORY_ARC_UI_FIELD: [],
86
+ "tags": [],
87
+ "teams": [],
88
+ "year": [],
89
+ }
90
+ )
88
91
  FILTER_ATTRIBUTES = frozenset(_DYNAMIC_FILTER_DEFAULTS.keys())
89
- SESSION_DEFAULTS = {
90
- "filters": {
91
- "bookmark": DEFAULTS["bookmarkFilter"],
92
- **_DYNAMIC_FILTER_DEFAULTS,
93
- },
94
- "order_by": DEFAULTS["orderBy"],
95
- "order_reverse": False,
96
- "q": DEFAULTS["q"],
97
- "route": DEFAULTS["route"],
98
- "show": DEFAULTS["show"],
99
- "twenty_four_hour_time": False,
100
- "top_group": DEFAULTS["topGroup"],
101
- }
92
+ SESSION_DEFAULTS = MappingProxyType(
93
+ {
94
+ "filters": {
95
+ "bookmark": DEFAULTS["bookmarkFilter"],
96
+ **_DYNAMIC_FILTER_DEFAULTS,
97
+ },
98
+ "order_by": DEFAULTS["orderBy"],
99
+ "order_reverse": False,
100
+ "q": DEFAULTS["q"],
101
+ "route": DEFAULTS["route"],
102
+ "show": DEFAULTS["show"],
103
+ "twenty_four_hour_time": False,
104
+ "top_group": DEFAULTS["topGroup"],
105
+ }
106
+ )
102
107
 
103
108
 
104
109
  class ReaderSessionViewBase(SessionViewBaseBase):
105
110
  """Reader session base."""
106
111
 
107
112
  SESSION_KEY = "reader" # type: ignore
108
- SESSION_DEFAULTS = {
109
- "fit_to": DEFAULTS["fitTo"],
110
- "two_pages": False,
111
- "read_in_reverse": False,
112
- "read_rtl_in_reverse": False,
113
- "vertical": False,
114
- }
113
+ SESSION_DEFAULTS = MappingProxyType(
114
+ {
115
+ "fit_to": DEFAULTS["fitTo"],
116
+ "two_pages": False,
117
+ "read_in_reverse": False,
118
+ "read_rtl_in_reverse": False,
119
+ "vertical": False,
120
+ }
121
+ )
115
122
 
116
123
 
117
124
  class SessionViewBase(SessionViewBaseBase, ABC):
118
125
  """Session view for retrieving stored settings."""
119
126
 
120
- permission_classes = [IsAuthenticatedOrEnabledNonUsers]
127
+ permission_classes = (IsAuthenticatedOrEnabledNonUsers,)
121
128
 
122
129
  @property
123
130
  @classmethod
codex/views/template.py CHANGED
@@ -28,12 +28,12 @@ class SimpleAPIView(APIView):
28
28
  class CodexTemplateView(SimpleAPIView):
29
29
  """HTML Template View."""
30
30
 
31
- renderer_classes = [TemplateHTMLRenderer]
31
+ renderer_classes = (TemplateHTMLRenderer,)
32
32
  content_type = "text/html"
33
33
 
34
34
 
35
35
  class CodexXMLTemplateView(SimpleAPIView):
36
36
  """XML Template View."""
37
37
 
38
- renderer_classes = [TemplateXMLRenderer]
38
+ renderer_classes = (TemplateXMLRenderer,)
39
39
  content_type = "application/xml"
@@ -1,5 +1,6 @@
1
1
  """Listens to the Broadcast Queue and sends its messages to channels."""
2
2
  from queue import Empty
3
+ from types import MappingProxyType
3
4
 
4
5
  from channels.exceptions import InvalidChannelLayerError
5
6
  from channels.layers import get_channel_layer
@@ -12,13 +13,15 @@ from codex.websockets.consumers import ChannelGroups
12
13
  class BroadcastListener(LoggerBaseMixin):
13
14
  """Listens to the Broadcast Queue and sends its messages to channels."""
14
15
 
15
- _WS_DISCONNECT_EVENT = {
16
- "group": ChannelGroups.ALL.name,
17
- "message": {
18
- "type": "websocket_disconnect",
19
- "code": CloseReason.NORMAL_CLOSURE.value,
20
- },
21
- }
16
+ _WS_DISCONNECT_EVENT = MappingProxyType(
17
+ {
18
+ "group": ChannelGroups.ALL.name,
19
+ "message": {
20
+ "type": "websocket_disconnect",
21
+ "code": CloseReason.NORMAL_CLOSURE.value,
22
+ },
23
+ }
24
+ )
22
25
 
23
26
  def __init__(self, queue, log_queue):
24
27
  """Initialize."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: codex
3
- Version: 1.4.1
3
+ Version: 1.4.3
4
4
  Summary: A comic archive web server.
5
5
  Home-page: https://github.com/ajslater/codex
6
6
  License: GPL-3.0-only
@@ -23,7 +23,7 @@ Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3 :: Only
24
24
  Classifier: Topic :: Internet :: WWW/HTTP
25
25
  Classifier: Topic :: Multimedia :: Graphics :: Viewers
26
- Requires-Dist: Pillow (>=9.1.0,<10.0.0)
26
+ Requires-Dist: Pillow (>=10.0.0,<11.0.0)
27
27
  Requires-Dist: aioprocessing (>=2.0.1,<3.0.0)
28
28
  Requires-Dist: ansicolors (>=1.1,<2.0)
29
29
  Requires-Dist: case-converter (>=1.1.0,<2.0.0)
@@ -33,7 +33,7 @@ Requires-Dist: django (>=4.2,<5.0)
33
33
  Requires-Dist: django-cors-headers (>=4.0,<5.0)
34
34
  Requires-Dist: django-haystack (>=3.2.1,<4.0.0)
35
35
  Requires-Dist: django-rest-registration (>=0.8.0,<0.9.0)
36
- Requires-Dist: django-vite (==2.1.1)
36
+ Requires-Dist: django-vite (>=2.1.3,<3.0.0)
37
37
  Requires-Dist: djangorestframework (>=3.11,<4.0)
38
38
  Requires-Dist: djangorestframework-camel-case (>=1.3.0,<2.0.0)
39
39
  Requires-Dist: drf-spectacular (>=0.26.0,<0.27.0)
@@ -234,7 +234,7 @@ CODEX_RESET_ADMIN=1 codex
234
234
  or, if using Docker:
235
235
 
236
236
  ```sh
237
- docker run -e CODEX_RESET_ADMIN=1 -v <host path to config>/config:/config ajslater/codex
237
+ docker run -e CODEX_RESET_ADMIN=1 -v host-parent-dir/config:/config ajslater/codex
238
238
  ```
239
239
 
240
240
  ### Private Libraries
@@ -307,29 +307,25 @@ index, a Django cache and comic book cover thumbnails.
307
307
  Here's an example nginx config with a subpath named '/codex'.
308
308
 
309
309
  ```nginx
310
- # HTTP
311
- proxy_set_header Host $http_host;
312
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
313
- proxy_set_header X-Forwarded-Host $server_name;
314
- proxy_set_header X-Forwarded-Port $server_port;
315
- proxy_set_header X-Forwarded-Proto $scheme;
316
- proxy_set_header X-Real-IP $remote_addr;
317
- proxy_set_header X-Scheme $scheme;
318
-
319
- # Websockets
320
- proxy_http_version 1.1;
321
- proxy_set_header Upgrade $http_upgrade;
322
- proxy_set_header Connection "Upgrade"
323
-
324
- # This example uses a docker container named 'codex' at sub-path /codex
325
- # Use a valid IP or resolvable host name for other configurations.
326
- location /codex {
327
- proxy_pass http://codex:9810;
328
- # Codex reads http basic authentication.
329
- # If the nginx credentials are different than codex credentials use this line to
330
- # not forward the authorization.
331
- proxy_set_header Authorization "";
332
- }
310
+ # HTTP
311
+ proxy_set_header Host $http_host;
312
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
313
+ proxy_set_header X-Forwarded-Host $server_name;
314
+ proxy_set_header X-Forwarded-Port $server_port;
315
+ proxy_set_header X-Forwarded-Proto $scheme;
316
+ proxy_set_header X-Real-IP $remote_addr;
317
+ proxy_set_header X-Scheme $scheme;
318
+ # Websockets
319
+ proxy_http_version 1.1;
320
+ proxy_set_header Upgrade $http_upgrade;
321
+
322
+ proxy_set_header Connection "Upgrade" location /codex {
323
+ proxy_pass http://codex:9810;
324
+ # Codex reads http basic authentication.
325
+ # If the nginx credentials are different than codex credentials use this line to
326
+ # not forward the authorization.
327
+ proxy_set_header Authorization "";
328
+ }
333
329
  ```
334
330
 
335
331
  Specify a reverse proxy sub path (if you have one) in `config/hypercorn.toml`
@@ -445,7 +441,7 @@ database. Place a file named `rebuild_db` in your Codex config directory like
445
441
  so:
446
442
 
447
443
  ```sh
448
- touch config/rebuild_db
444
+ touch config/rebuild_db
449
445
  ```
450
446
 
451
447
  Shut down and restart Codex.