plain 0.71.0__tar.gz → 0.72.1__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.
- {plain-0.71.0 → plain-0.72.1}/.gitignore +1 -0
- {plain-0.71.0 → plain-0.72.1}/PKG-INFO +1 -1
- {plain-0.71.0 → plain-0.72.1}/plain/CHANGELOG.md +22 -0
- {plain-0.71.0 → plain-0.72.1}/plain/runtime/README.md +0 -1
- {plain-0.71.0 → plain-0.72.1}/plain/test/client.py +7 -3
- {plain-0.71.0 → plain-0.72.1}/plain/views/README.md +5 -5
- {plain-0.71.0 → plain-0.72.1}/pyproject.toml +1 -1
- {plain-0.71.0 → plain-0.72.1}/LICENSE +0 -0
- {plain-0.71.0 → plain-0.72.1}/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/AGENTS.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/__main__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/compile.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/finders.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/fingerprints.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/urls.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/assets/views.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/chores/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/chores/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/chores/registry.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/agent/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/agent/docs.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/agent/llmdocs.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/agent/md.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/agent/prompt.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/agent/request.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/build.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/changelog.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/chores.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/core.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/docs.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/formatting.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/install.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/output.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/preflight.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/print.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/registry.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/scaffold.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/settings.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/shell.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/startup.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/upgrade.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/urls.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/cli/utils.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/csrf/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/csrf/middleware.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/csrf/views.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/debug.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/exceptions.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/forms/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/forms/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/forms/boundfield.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/forms/exceptions.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/forms/fields.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/forms/forms.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/http/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/http/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/http/cookie.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/http/multipartparser.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/http/request.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/http/response.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/base.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/locks.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/move.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/temp.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/files/utils.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/handlers/base.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/handlers/exception.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/middleware/headers.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/middleware/hosts.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/middleware/https.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/internal/middleware/slash.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/json.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/configure.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/debug.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/formatters.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/loggers.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/logs/utils.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/packages/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/packages/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/packages/config.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/packages/registry.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/paginator.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/checks.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/files.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/registry.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/results.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/security.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/preflight/urls.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/runtime/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/runtime/global_settings.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/runtime/user_settings.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/runtime/utils.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/signals/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/signals/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/signing.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/AGENTS.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/core.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/jinja/environments.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/jinja/filters.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/templates/jinja/globals.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/test/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/test/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/test/encoding.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/test/exceptions.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/converters.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/exceptions.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/patterns.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/resolvers.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/routers.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/urls/utils.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/README.md +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/cache.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/crypto.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/datastructures.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/dateparse.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/deconstruct.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/decorators.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/duration.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/encoding.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/functional.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/hashable.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/html.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/http.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/inspect.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/ipv6.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/itercompat.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/module_loading.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/regex_helper.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/safestring.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/text.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/timesince.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/timezone.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/utils/tree.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/validators.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/base.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/errors.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/exceptions.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/forms.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/objects.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/redirect.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/views/templates.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/plain/wsgi.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/.gitignore +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/app/.gitignore +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/app/settings.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/app/test/__init__.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/app/test/default_settings.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/app/urls.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/conftest.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/test_cli.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/test_csrf.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/test_http_hosts.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/test_logs.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/test_runtime.py +0 -0
- {plain-0.71.0 → plain-0.72.1}/tests/test_wsgi.py +0 -0
@@ -1,5 +1,27 @@
|
|
1
1
|
# plain changelog
|
2
2
|
|
3
|
+
## [0.72.1](https://github.com/dropseed/plain/releases/plain@0.72.1) (2025-10-02)
|
4
|
+
|
5
|
+
### What's changed
|
6
|
+
|
7
|
+
- Fixed documentation examples to use the correct view attribute names (`self.user` instead of `self.request.user`) ([f6278d9](https://github.com/dropseed/plain/commit/f6278d9bb4))
|
8
|
+
|
9
|
+
### Upgrade instructions
|
10
|
+
|
11
|
+
- No changes required
|
12
|
+
|
13
|
+
## [0.72.0](https://github.com/dropseed/plain/releases/plain@0.72.0) (2025-10-02)
|
14
|
+
|
15
|
+
### What's changed
|
16
|
+
|
17
|
+
- Request attributes `user` and `session` are no longer set directly on the request object ([154ee10](https://github.com/dropseed/plain/commit/154ee10375))
|
18
|
+
- Test client now uses `plain.auth.requests.get_request_user()` to retrieve user for response object when available ([154ee10](https://github.com/dropseed/plain/commit/154ee10375))
|
19
|
+
- Removed `plain.auth.middleware.AuthenticationMiddleware` from default middleware configuration ([154ee10](https://github.com/dropseed/plain/commit/154ee10375))
|
20
|
+
|
21
|
+
### Upgrade instructions
|
22
|
+
|
23
|
+
- No changes required
|
24
|
+
|
3
25
|
## [0.71.0](https://github.com/dropseed/plain/releases/plain@0.71.0) (2025-09-30)
|
4
26
|
|
5
27
|
### What's changed
|
@@ -494,9 +494,13 @@ class Client:
|
|
494
494
|
response.request = request
|
495
495
|
response.json = partial(self._parse_json, response)
|
496
496
|
|
497
|
-
# If the request had a user
|
498
|
-
|
499
|
-
|
497
|
+
# If the request had a user, make it available on the response.
|
498
|
+
try:
|
499
|
+
from plain.auth.requests import get_request_user
|
500
|
+
|
501
|
+
response.user = get_request_user(response.wsgi_request)
|
502
|
+
except ImportError:
|
503
|
+
pass
|
500
504
|
|
501
505
|
# Attach the ResolverMatch instance to the response.
|
502
506
|
resolver = get_resolver()
|
@@ -181,7 +181,7 @@ class ExampleDetailView(DetailView):
|
|
181
181
|
def get_object(self):
|
182
182
|
return MyObjectClass.query.get(
|
183
183
|
id=self.url_kwargs["id"],
|
184
|
-
user=self.
|
184
|
+
user=self.user, # Limit access
|
185
185
|
)
|
186
186
|
|
187
187
|
|
@@ -199,7 +199,7 @@ class ExampleUpdateView(UpdateView):
|
|
199
199
|
def get_object(self):
|
200
200
|
return MyObjectClass.query.get(
|
201
201
|
id=self.url_kwargs["id"],
|
202
|
-
user=self.
|
202
|
+
user=self.user, # Limit access
|
203
203
|
)
|
204
204
|
|
205
205
|
|
@@ -213,7 +213,7 @@ class ExampleDeleteView(DeleteView):
|
|
213
213
|
def get_object(self):
|
214
214
|
return MyObjectClass.query.get(
|
215
215
|
id=self.url_kwargs["id"],
|
216
|
-
user=self.
|
216
|
+
user=self.user, # Limit access
|
217
217
|
)
|
218
218
|
|
219
219
|
|
@@ -222,7 +222,7 @@ class ExampleListView(ListView):
|
|
222
222
|
|
223
223
|
def get_objects(self):
|
224
224
|
return MyObjectClass.query.filter(
|
225
|
-
user=self.
|
225
|
+
user=self.user, # Limit access
|
226
226
|
)
|
227
227
|
```
|
228
228
|
|
@@ -241,7 +241,7 @@ from plain.http import Response
|
|
241
241
|
|
242
242
|
class ExampleView(DetailView):
|
243
243
|
def get_object(self):
|
244
|
-
if self.
|
244
|
+
if self.user and self.user.exceeds_rate_limit:
|
245
245
|
raise ResponseException(
|
246
246
|
Response("Rate limit exceeded", status_code=429)
|
247
247
|
)
|
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
|
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
|