plain 0.62.0__tar.gz → 0.63.0__tar.gz

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.
Files changed (179) hide show
  1. {plain-0.62.0 → plain-0.63.0}/PKG-INFO +1 -1
  2. {plain-0.62.0 → plain-0.63.0}/plain/CHANGELOG.md +25 -1
  3. {plain-0.62.0 → plain-0.63.0}/plain/chores/README.md +1 -1
  4. {plain-0.62.0 → plain-0.63.0}/plain/cli/agent/request.py +1 -1
  5. {plain-0.62.0 → plain-0.63.0}/plain/internal/middleware/https.py +4 -17
  6. {plain-0.62.0 → plain-0.63.0}/plain/runtime/global_settings.py +3 -9
  7. {plain-0.62.0 → plain-0.63.0}/plain/test/README.md +1 -1
  8. {plain-0.62.0 → plain-0.63.0}/plain/views/README.md +4 -4
  9. {plain-0.62.0 → plain-0.63.0}/pyproject.toml +1 -1
  10. {plain-0.62.0 → plain-0.63.0}/.gitignore +0 -0
  11. {plain-0.62.0 → plain-0.63.0}/LICENSE +0 -0
  12. {plain-0.62.0 → plain-0.63.0}/README.md +0 -0
  13. {plain-0.62.0 → plain-0.63.0}/plain/AGENTS.md +0 -0
  14. {plain-0.62.0 → plain-0.63.0}/plain/README.md +0 -0
  15. {plain-0.62.0 → plain-0.63.0}/plain/__main__.py +0 -0
  16. {plain-0.62.0 → plain-0.63.0}/plain/assets/README.md +0 -0
  17. {plain-0.62.0 → plain-0.63.0}/plain/assets/__init__.py +0 -0
  18. {plain-0.62.0 → plain-0.63.0}/plain/assets/compile.py +0 -0
  19. {plain-0.62.0 → plain-0.63.0}/plain/assets/finders.py +0 -0
  20. {plain-0.62.0 → plain-0.63.0}/plain/assets/fingerprints.py +0 -0
  21. {plain-0.62.0 → plain-0.63.0}/plain/assets/urls.py +0 -0
  22. {plain-0.62.0 → plain-0.63.0}/plain/assets/views.py +0 -0
  23. {plain-0.62.0 → plain-0.63.0}/plain/chores/__init__.py +0 -0
  24. {plain-0.62.0 → plain-0.63.0}/plain/chores/registry.py +0 -0
  25. {plain-0.62.0 → plain-0.63.0}/plain/cli/README.md +0 -0
  26. {plain-0.62.0 → plain-0.63.0}/plain/cli/__init__.py +0 -0
  27. {plain-0.62.0 → plain-0.63.0}/plain/cli/agent/__init__.py +0 -0
  28. {plain-0.62.0 → plain-0.63.0}/plain/cli/agent/docs.py +0 -0
  29. {plain-0.62.0 → plain-0.63.0}/plain/cli/agent/llmdocs.py +0 -0
  30. {plain-0.62.0 → plain-0.63.0}/plain/cli/agent/md.py +0 -0
  31. {plain-0.62.0 → plain-0.63.0}/plain/cli/agent/prompt.py +0 -0
  32. {plain-0.62.0 → plain-0.63.0}/plain/cli/build.py +0 -0
  33. {plain-0.62.0 → plain-0.63.0}/plain/cli/changelog.py +0 -0
  34. {plain-0.62.0 → plain-0.63.0}/plain/cli/chores.py +0 -0
  35. {plain-0.62.0 → plain-0.63.0}/plain/cli/core.py +0 -0
  36. {plain-0.62.0 → plain-0.63.0}/plain/cli/docs.py +0 -0
  37. {plain-0.62.0 → plain-0.63.0}/plain/cli/formatting.py +0 -0
  38. {plain-0.62.0 → plain-0.63.0}/plain/cli/install.py +0 -0
  39. {plain-0.62.0 → plain-0.63.0}/plain/cli/output.py +0 -0
  40. {plain-0.62.0 → plain-0.63.0}/plain/cli/preflight.py +0 -0
  41. {plain-0.62.0 → plain-0.63.0}/plain/cli/print.py +0 -0
  42. {plain-0.62.0 → plain-0.63.0}/plain/cli/registry.py +0 -0
  43. {plain-0.62.0 → plain-0.63.0}/plain/cli/scaffold.py +0 -0
  44. {plain-0.62.0 → plain-0.63.0}/plain/cli/settings.py +0 -0
  45. {plain-0.62.0 → plain-0.63.0}/plain/cli/shell.py +0 -0
  46. {plain-0.62.0 → plain-0.63.0}/plain/cli/startup.py +0 -0
  47. {plain-0.62.0 → plain-0.63.0}/plain/cli/upgrade.py +0 -0
  48. {plain-0.62.0 → plain-0.63.0}/plain/cli/urls.py +0 -0
  49. {plain-0.62.0 → plain-0.63.0}/plain/cli/utils.py +0 -0
  50. {plain-0.62.0 → plain-0.63.0}/plain/csrf/README.md +0 -0
  51. {plain-0.62.0 → plain-0.63.0}/plain/csrf/middleware.py +0 -0
  52. {plain-0.62.0 → plain-0.63.0}/plain/csrf/views.py +0 -0
  53. {plain-0.62.0 → plain-0.63.0}/plain/debug.py +0 -0
  54. {plain-0.62.0 → plain-0.63.0}/plain/exceptions.py +0 -0
  55. {plain-0.62.0 → plain-0.63.0}/plain/forms/README.md +0 -0
  56. {plain-0.62.0 → plain-0.63.0}/plain/forms/__init__.py +0 -0
  57. {plain-0.62.0 → plain-0.63.0}/plain/forms/boundfield.py +0 -0
  58. {plain-0.62.0 → plain-0.63.0}/plain/forms/exceptions.py +0 -0
  59. {plain-0.62.0 → plain-0.63.0}/plain/forms/fields.py +0 -0
  60. {plain-0.62.0 → plain-0.63.0}/plain/forms/forms.py +0 -0
  61. {plain-0.62.0 → plain-0.63.0}/plain/http/README.md +0 -0
  62. {plain-0.62.0 → plain-0.63.0}/plain/http/__init__.py +0 -0
  63. {plain-0.62.0 → plain-0.63.0}/plain/http/cookie.py +0 -0
  64. {plain-0.62.0 → plain-0.63.0}/plain/http/multipartparser.py +0 -0
  65. {plain-0.62.0 → plain-0.63.0}/plain/http/request.py +0 -0
  66. {plain-0.62.0 → plain-0.63.0}/plain/http/response.py +0 -0
  67. {plain-0.62.0 → plain-0.63.0}/plain/internal/__init__.py +0 -0
  68. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/__init__.py +0 -0
  69. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/base.py +0 -0
  70. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/locks.py +0 -0
  71. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/move.py +0 -0
  72. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/temp.py +0 -0
  73. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/uploadedfile.py +0 -0
  74. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/uploadhandler.py +0 -0
  75. {plain-0.62.0 → plain-0.63.0}/plain/internal/files/utils.py +0 -0
  76. {plain-0.62.0 → plain-0.63.0}/plain/internal/handlers/__init__.py +0 -0
  77. {plain-0.62.0 → plain-0.63.0}/plain/internal/handlers/base.py +0 -0
  78. {plain-0.62.0 → plain-0.63.0}/plain/internal/handlers/exception.py +0 -0
  79. {plain-0.62.0 → plain-0.63.0}/plain/internal/handlers/wsgi.py +0 -0
  80. {plain-0.62.0 → plain-0.63.0}/plain/internal/middleware/__init__.py +0 -0
  81. {plain-0.62.0 → plain-0.63.0}/plain/internal/middleware/headers.py +0 -0
  82. {plain-0.62.0 → plain-0.63.0}/plain/internal/middleware/slash.py +0 -0
  83. {plain-0.62.0 → plain-0.63.0}/plain/json.py +0 -0
  84. {plain-0.62.0 → plain-0.63.0}/plain/logs/README.md +0 -0
  85. {plain-0.62.0 → plain-0.63.0}/plain/logs/__init__.py +0 -0
  86. {plain-0.62.0 → plain-0.63.0}/plain/logs/configure.py +0 -0
  87. {plain-0.62.0 → plain-0.63.0}/plain/logs/debug.py +0 -0
  88. {plain-0.62.0 → plain-0.63.0}/plain/logs/formatters.py +0 -0
  89. {plain-0.62.0 → plain-0.63.0}/plain/logs/loggers.py +0 -0
  90. {plain-0.62.0 → plain-0.63.0}/plain/logs/utils.py +0 -0
  91. {plain-0.62.0 → plain-0.63.0}/plain/packages/README.md +0 -0
  92. {plain-0.62.0 → plain-0.63.0}/plain/packages/__init__.py +0 -0
  93. {plain-0.62.0 → plain-0.63.0}/plain/packages/config.py +0 -0
  94. {plain-0.62.0 → plain-0.63.0}/plain/packages/registry.py +0 -0
  95. {plain-0.62.0 → plain-0.63.0}/plain/paginator.py +0 -0
  96. {plain-0.62.0 → plain-0.63.0}/plain/preflight/README.md +0 -0
  97. {plain-0.62.0 → plain-0.63.0}/plain/preflight/__init__.py +0 -0
  98. {plain-0.62.0 → plain-0.63.0}/plain/preflight/files.py +0 -0
  99. {plain-0.62.0 → plain-0.63.0}/plain/preflight/messages.py +0 -0
  100. {plain-0.62.0 → plain-0.63.0}/plain/preflight/registry.py +0 -0
  101. {plain-0.62.0 → plain-0.63.0}/plain/preflight/security.py +0 -0
  102. {plain-0.62.0 → plain-0.63.0}/plain/preflight/urls.py +0 -0
  103. {plain-0.62.0 → plain-0.63.0}/plain/runtime/README.md +0 -0
  104. {plain-0.62.0 → plain-0.63.0}/plain/runtime/__init__.py +0 -0
  105. {plain-0.62.0 → plain-0.63.0}/plain/runtime/user_settings.py +0 -0
  106. {plain-0.62.0 → plain-0.63.0}/plain/runtime/utils.py +0 -0
  107. {plain-0.62.0 → plain-0.63.0}/plain/signals/README.md +0 -0
  108. {plain-0.62.0 → plain-0.63.0}/plain/signals/__init__.py +0 -0
  109. {plain-0.62.0 → plain-0.63.0}/plain/signals/dispatch/__init__.py +0 -0
  110. {plain-0.62.0 → plain-0.63.0}/plain/signals/dispatch/dispatcher.py +0 -0
  111. {plain-0.62.0 → plain-0.63.0}/plain/signals/dispatch/license.txt +0 -0
  112. {plain-0.62.0 → plain-0.63.0}/plain/signing.py +0 -0
  113. {plain-0.62.0 → plain-0.63.0}/plain/templates/AGENTS.md +0 -0
  114. {plain-0.62.0 → plain-0.63.0}/plain/templates/README.md +0 -0
  115. {plain-0.62.0 → plain-0.63.0}/plain/templates/__init__.py +0 -0
  116. {plain-0.62.0 → plain-0.63.0}/plain/templates/core.py +0 -0
  117. {plain-0.62.0 → plain-0.63.0}/plain/templates/jinja/__init__.py +0 -0
  118. {plain-0.62.0 → plain-0.63.0}/plain/templates/jinja/environments.py +0 -0
  119. {plain-0.62.0 → plain-0.63.0}/plain/templates/jinja/extensions.py +0 -0
  120. {plain-0.62.0 → plain-0.63.0}/plain/templates/jinja/filters.py +0 -0
  121. {plain-0.62.0 → plain-0.63.0}/plain/templates/jinja/globals.py +0 -0
  122. {plain-0.62.0 → plain-0.63.0}/plain/test/__init__.py +0 -0
  123. {plain-0.62.0 → plain-0.63.0}/plain/test/client.py +0 -0
  124. {plain-0.62.0 → plain-0.63.0}/plain/test/encoding.py +0 -0
  125. {plain-0.62.0 → plain-0.63.0}/plain/test/exceptions.py +0 -0
  126. {plain-0.62.0 → plain-0.63.0}/plain/urls/README.md +0 -0
  127. {plain-0.62.0 → plain-0.63.0}/plain/urls/__init__.py +0 -0
  128. {plain-0.62.0 → plain-0.63.0}/plain/urls/converters.py +0 -0
  129. {plain-0.62.0 → plain-0.63.0}/plain/urls/exceptions.py +0 -0
  130. {plain-0.62.0 → plain-0.63.0}/plain/urls/patterns.py +0 -0
  131. {plain-0.62.0 → plain-0.63.0}/plain/urls/resolvers.py +0 -0
  132. {plain-0.62.0 → plain-0.63.0}/plain/urls/routers.py +0 -0
  133. {plain-0.62.0 → plain-0.63.0}/plain/urls/utils.py +0 -0
  134. {plain-0.62.0 → plain-0.63.0}/plain/utils/README.md +0 -0
  135. {plain-0.62.0 → plain-0.63.0}/plain/utils/__init__.py +0 -0
  136. {plain-0.62.0 → plain-0.63.0}/plain/utils/cache.py +0 -0
  137. {plain-0.62.0 → plain-0.63.0}/plain/utils/crypto.py +0 -0
  138. {plain-0.62.0 → plain-0.63.0}/plain/utils/datastructures.py +0 -0
  139. {plain-0.62.0 → plain-0.63.0}/plain/utils/dateparse.py +0 -0
  140. {plain-0.62.0 → plain-0.63.0}/plain/utils/deconstruct.py +0 -0
  141. {plain-0.62.0 → plain-0.63.0}/plain/utils/decorators.py +0 -0
  142. {plain-0.62.0 → plain-0.63.0}/plain/utils/duration.py +0 -0
  143. {plain-0.62.0 → plain-0.63.0}/plain/utils/encoding.py +0 -0
  144. {plain-0.62.0 → plain-0.63.0}/plain/utils/functional.py +0 -0
  145. {plain-0.62.0 → plain-0.63.0}/plain/utils/hashable.py +0 -0
  146. {plain-0.62.0 → plain-0.63.0}/plain/utils/html.py +0 -0
  147. {plain-0.62.0 → plain-0.63.0}/plain/utils/http.py +0 -0
  148. {plain-0.62.0 → plain-0.63.0}/plain/utils/inspect.py +0 -0
  149. {plain-0.62.0 → plain-0.63.0}/plain/utils/ipv6.py +0 -0
  150. {plain-0.62.0 → plain-0.63.0}/plain/utils/itercompat.py +0 -0
  151. {plain-0.62.0 → plain-0.63.0}/plain/utils/module_loading.py +0 -0
  152. {plain-0.62.0 → plain-0.63.0}/plain/utils/regex_helper.py +0 -0
  153. {plain-0.62.0 → plain-0.63.0}/plain/utils/safestring.py +0 -0
  154. {plain-0.62.0 → plain-0.63.0}/plain/utils/text.py +0 -0
  155. {plain-0.62.0 → plain-0.63.0}/plain/utils/timesince.py +0 -0
  156. {plain-0.62.0 → plain-0.63.0}/plain/utils/timezone.py +0 -0
  157. {plain-0.62.0 → plain-0.63.0}/plain/utils/tree.py +0 -0
  158. {plain-0.62.0 → plain-0.63.0}/plain/validators.py +0 -0
  159. {plain-0.62.0 → plain-0.63.0}/plain/views/__init__.py +0 -0
  160. {plain-0.62.0 → plain-0.63.0}/plain/views/base.py +0 -0
  161. {plain-0.62.0 → plain-0.63.0}/plain/views/errors.py +0 -0
  162. {plain-0.62.0 → plain-0.63.0}/plain/views/exceptions.py +0 -0
  163. {plain-0.62.0 → plain-0.63.0}/plain/views/forms.py +0 -0
  164. {plain-0.62.0 → plain-0.63.0}/plain/views/objects.py +0 -0
  165. {plain-0.62.0 → plain-0.63.0}/plain/views/redirect.py +0 -0
  166. {plain-0.62.0 → plain-0.63.0}/plain/views/templates.py +0 -0
  167. {plain-0.62.0 → plain-0.63.0}/plain/wsgi.py +0 -0
  168. {plain-0.62.0 → plain-0.63.0}/tests/.gitignore +0 -0
  169. {plain-0.62.0 → plain-0.63.0}/tests/app/.gitignore +0 -0
  170. {plain-0.62.0 → plain-0.63.0}/tests/app/settings.py +0 -0
  171. {plain-0.62.0 → plain-0.63.0}/tests/app/test/__init__.py +0 -0
  172. {plain-0.62.0 → plain-0.63.0}/tests/app/test/default_settings.py +0 -0
  173. {plain-0.62.0 → plain-0.63.0}/tests/app/urls.py +0 -0
  174. {plain-0.62.0 → plain-0.63.0}/tests/conftest.py +0 -0
  175. {plain-0.62.0 → plain-0.63.0}/tests/test_cli.py +0 -0
  176. {plain-0.62.0 → plain-0.63.0}/tests/test_csrf.py +0 -0
  177. {plain-0.62.0 → plain-0.63.0}/tests/test_logs.py +0 -0
  178. {plain-0.62.0 → plain-0.63.0}/tests/test_runtime.py +0 -0
  179. {plain-0.62.0 → plain-0.63.0}/tests/test_wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.62.0
3
+ Version: 0.63.0
4
4
  Summary: A web framework for building products with Python.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-File: LICENSE
@@ -1,5 +1,27 @@
1
1
  # plain changelog
2
2
 
3
+ ## [0.63.0](https://github.com/dropseed/plain/releases/plain@0.63.0) (2025-09-12)
4
+
5
+ ### What's changed
6
+
7
+ - Model manager attribute renamed from `objects` to `query` throughout codebase ([037a239](https://github.com/dropseed/plain/commit/037a239ef4))
8
+ - Simplified HTTPS redirect middleware by removing `HTTPS_REDIRECT_EXEMPT_PATHS` and `HTTPS_REDIRECT_HOST` settings ([d264cd3](https://github.com/dropseed/plain/commit/d264cd306b))
9
+ - Database backups are now created automatically during migrations when `DEBUG=True` unless explicitly disabled ([c802307](https://github.com/dropseed/plain/commit/c8023074e9))
10
+
11
+ ### Upgrade instructions
12
+
13
+ - Remove any `HTTPS_REDIRECT_EXEMPT_PATHS` and `HTTPS_REDIRECT_HOST` settings from your configuration - the HTTPS redirect middleware now performs a blanket redirect. For advanced redirect logic, write custom middleware.
14
+
15
+ ## [0.62.1](https://github.com/dropseed/plain/releases/plain@0.62.1) (2025-09-09)
16
+
17
+ ### What's changed
18
+
19
+ - Added clarification about `app_logger.kv` removal to 0.62.0 changelog ([106636f](https://github.com/dropseed/plain/commit/106636fca6))
20
+
21
+ ### Upgrade instructions
22
+
23
+ - No changes required
24
+
3
25
  ## [0.62.0](https://github.com/dropseed/plain/releases/plain@0.62.0) (2025-09-09)
4
26
 
5
27
  ### What's changed
@@ -7,10 +29,12 @@
7
29
  - Complete rewrite of logging settings and AppLogger with improved formatters and debug capabilities ([ea7c953](https://github.com/dropseed/plain/commit/ea7c9537e3))
8
30
  - Added `app_logger.debug_mode()` context manager to temporarily change log level ([f535459](https://github.com/dropseed/plain/commit/f53545f9fa))
9
31
  - Minimum Python version updated to 3.13 ([d86e307](https://github.com/dropseed/plain/commit/d86e307efb))
32
+ - Removed `app_logger.kv` in favor of context kwargs ([ea7c953](https://github.com/dropseed/plain/commit/ea7c9537e3))
10
33
 
11
34
  ### Upgrade instructions
12
35
 
13
36
  - Make sure you are using Python 3.13 or higher
37
+ - Replace any `app_logger.kv.info("message", key=value)` calls with `app_logger.info("message", key=value)` or appropriate log level
14
38
 
15
39
  ## [0.61.0](https://github.com/dropseed/plain/releases/plain@0.61.0) (2025-09-03)
16
40
 
@@ -114,7 +138,7 @@
114
138
 
115
139
  - Update your URL patterns from `<int:pk>` to `<int:id>` in your URLconf
116
140
  - Update view code that accesses `self.url_kwargs["pk"]` to use `self.url_kwargs["id"]` instead
117
- - Replace any QuerySet filters using `pk` with `id` (e.g., `Model.objects.get(pk=1)` becomes `Model.objects.get(id=1)`)
141
+ - Replace any QuerySet filters using `pk` with `id` (e.g., `Model.query.get(pk=1)` becomes `Model.query.get(id=1)`)
118
142
 
119
143
  ## [0.54.1](https://github.com/dropseed/plain/releases/plain@0.54.1) (2025-07-20)
120
144
 
@@ -27,7 +27,7 @@ def clear_expired():
27
27
  """
28
28
  Delete sessions that have expired.
29
29
  """
30
- result = Session.objects.filter(expires_at__lt=timezone.now()).delete()
30
+ result = Session.query.filter(expires_at__lt=timezone.now()).delete()
31
31
  return f"{result[0]} expired sessions deleted"
32
32
  ```
33
33
 
@@ -64,7 +64,7 @@ def request(path, method, data, user_id, follow, content_type, headers):
64
64
 
65
65
  # Get the user
66
66
  try:
67
- user = User.objects.get(id=user_id)
67
+ user = User.query.get(id=user_id)
68
68
  client.force_login(user)
69
69
  click.secho(
70
70
  f"Authenticated as user {user_id}", fg="green", dim=True
@@ -1,5 +1,3 @@
1
- import re
2
-
3
1
  from plain.http import ResponseRedirect
4
2
  from plain.runtime import settings
5
3
 
@@ -8,16 +6,12 @@ class HttpsRedirectMiddleware:
8
6
  def __init__(self, get_response):
9
7
  self.get_response = get_response
10
8
 
11
- # Settings for https (compile regexes once)
9
+ # Settings for HTTPS
12
10
  self.https_redirect_enabled = settings.HTTPS_REDIRECT_ENABLED
13
- self.https_redirect_host = settings.HTTPS_REDIRECT_HOST
14
- self.https_redirect_exempt = [
15
- re.compile(r) for r in settings.HTTPS_REDIRECT_EXEMPT_PATHS
16
- ]
17
11
 
18
12
  def __call__(self, request):
19
13
  """
20
- Rewrite the URL based on settings.APPEND_SLASH
14
+ Perform a blanket HTTP→HTTPS redirect when enabled.
21
15
  """
22
16
 
23
17
  if redirect_response := self.maybe_https_redirect(request):
@@ -26,15 +20,8 @@ class HttpsRedirectMiddleware:
26
20
  return self.get_response(request)
27
21
 
28
22
  def maybe_https_redirect(self, request):
29
- if (
30
- self.https_redirect_enabled
31
- and not request.is_https()
32
- and not any(
33
- pattern.search(request.path_info)
34
- for pattern in self.https_redirect_exempt
35
- )
36
- ):
37
- host = self.https_redirect_host or request.get_host()
23
+ if self.https_redirect_enabled and not request.is_https():
24
+ host = request.get_host()
38
25
  return ResponseRedirect(
39
26
  f"https://{host}{request.get_full_path()}", status_code=301
40
27
  )
@@ -37,17 +37,11 @@ DEFAULT_RESPONSE_HEADERS = {
37
37
  "X-Frame-Options": "DENY",
38
38
  }
39
39
 
40
- # Whether to redirect all non-HTTPS requests to HTTPS.
40
+ # Whether to redirect all non-HTTPS requests to HTTPS (blanket redirect).
41
+ # For anything more advanced (custom host, path exemptions, etc.), write
42
+ # your own middleware.
41
43
  HTTPS_REDIRECT_ENABLED = True
42
44
 
43
- # Regex patterns for paths that should be exempt from HTTPS redirect
44
- # Examples: [r"^/health$", r"/api/internal/.*", r"/dev/.*"]
45
- HTTPS_REDIRECT_EXEMPT_PATHS: list[str] = []
46
-
47
- # Custom host to redirect to for HTTPS. If None, uses the same host as the request.
48
- # Useful for redirecting to a different domain (e.g., "secure.example.com")
49
- HTTPS_REDIRECT_HOST = None
50
-
51
45
  # If your Plain app is behind a proxy that sets a header to specify secure
52
46
  # connections, AND that proxy ensures that user-submitted headers with the
53
47
  # same name are ignored (so that people can't spoof it), set this value to
@@ -24,7 +24,7 @@ def test_client_example():
24
24
  assert client.session["example"] == "value"
25
25
 
26
26
  # Logging in
27
- user = User.objects.first()
27
+ user = User.query.first()
28
28
  client.force_login(user)
29
29
  response = client.get("/protected/")
30
30
  assert response.status_code == 200
@@ -179,7 +179,7 @@ class ExampleDetailView(DetailView):
179
179
  template_name = "detail.html"
180
180
 
181
181
  def get_object(self):
182
- return MyObjectClass.objects.get(
182
+ return MyObjectClass.query.get(
183
183
  id=self.url_kwargs["id"],
184
184
  user=self.request.user, # Limit access
185
185
  )
@@ -197,7 +197,7 @@ class ExampleUpdateView(UpdateView):
197
197
  success_url = "."
198
198
 
199
199
  def get_object(self):
200
- return MyObjectClass.objects.get(
200
+ return MyObjectClass.query.get(
201
201
  id=self.url_kwargs["id"],
202
202
  user=self.request.user, # Limit access
203
203
  )
@@ -211,7 +211,7 @@ class ExampleDeleteView(DeleteView):
211
211
  # Just POST to this view to delete the object.
212
212
 
213
213
  def get_object(self):
214
- return MyObjectClass.objects.get(
214
+ return MyObjectClass.query.get(
215
215
  id=self.url_kwargs["id"],
216
216
  user=self.request.user, # Limit access
217
217
  )
@@ -221,7 +221,7 @@ class ExampleListView(ListView):
221
221
  template_name = "list.html"
222
222
 
223
223
  def get_objects(self):
224
- return MyObjectClass.objects.filter(
224
+ return MyObjectClass.query.filter(
225
225
  user=self.request.user, # Limit access
226
226
  )
227
227
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain"
3
- version = "0.62.0"
3
+ version = "0.63.0"
4
4
  description = "A web framework for building products with Python."
5
5
  authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes