plain.admin 0.31.3__tar.gz → 0.31.4__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_admin-0.31.3 → plain_admin-0.31.4}/PKG-INFO +32 -1
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/README.md +31 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/list.html +3 -3
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/models.py +20 -2
- {plain_admin-0.31.3 → plain_admin-0.31.4}/pyproject.toml +1 -1
- {plain_admin-0.31.3 → plain_admin-0.31.4}/.gitignore +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/LICENSE +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/README.md +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/__init__.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/admin.css +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/admin.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/list.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/vendor/chart.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/vendor/jquery-3.6.1.slim.min.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/vendor/popper.min.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/vendor/tippy-bundle.umd.min.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/toolbar/toolbar.js +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/cards/__init__.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/cards/base.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/cards/charts.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/cards/tables.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/config.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/dates.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/default_settings.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/README.md +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/__init__.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/middleware.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/models.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/permissions.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/settings.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/urls.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/impersonate/views.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/middleware.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/querystats/README.md +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/querystats/__init__.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/querystats/core.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/querystats/middleware.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/querystats/urls.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/querystats/views.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/base.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/cards/base.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/cards/card.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/cards/chart.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/cards/table.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/delete.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/detail.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/index.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/page.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/search.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/UUID.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/bool.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/datetime.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/default.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/dict.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/get_display.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/img.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/list.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/model.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/queryset.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Checkbox.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/CheckboxField.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/FieldErrors.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Help.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Input.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/InputField.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Label.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Select.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/SelectField.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Submit.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Textarea.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/TextareaField.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/querystats/querystats.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/querystats/toolbar.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/toolbar/exception.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/toolbar/querystats.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/toolbar/request.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/toolbar/toolbar.html +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/toolbar.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/urls.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/__init__.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/base.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/objects.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/registry.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/types.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/views/viewsets.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/tests/app/settings.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/tests/app/urls.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/tests/app/users/migrations/0001_initial.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/tests/app/users/migrations/__init__.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/tests/app/users/models.py +0 -0
- {plain_admin-0.31.3 → plain_admin-0.31.4}/tests/test_admin.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: plain.admin
|
3
|
-
Version: 0.31.
|
3
|
+
Version: 0.31.4
|
4
4
|
Summary: Admin dashboard and tools for Plain.
|
5
5
|
Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
|
6
6
|
License-Expression: BSD-3-Clause
|
@@ -165,6 +165,37 @@ TODO
|
|
165
165
|
|
166
166
|
TODO
|
167
167
|
|
168
|
+
## List `displays`
|
169
|
+
|
170
|
+
On admin list views, you can define different `displays` to build predefined views of your data. The display choices will be shown in the UI, and you can use the current `self.display` in your view.
|
171
|
+
|
172
|
+
```python
|
173
|
+
# app/users/admin.py
|
174
|
+
from plain.admin.views import AdminModelListView, register_viewset
|
175
|
+
|
176
|
+
from .models import User
|
177
|
+
|
178
|
+
|
179
|
+
@register_viewset
|
180
|
+
class UserAdmin(AdminViewset):
|
181
|
+
class ListView(AdminModelListView):
|
182
|
+
model = User
|
183
|
+
fields = [
|
184
|
+
"id",
|
185
|
+
"email",
|
186
|
+
"created_at__date",
|
187
|
+
]
|
188
|
+
displays = ["Users without email"]
|
189
|
+
|
190
|
+
def get_objects(self):
|
191
|
+
objects = super().get_objects()
|
192
|
+
|
193
|
+
if self.display == "Users without email":
|
194
|
+
objects = objects.filter(email="")
|
195
|
+
|
196
|
+
return objects
|
197
|
+
```
|
198
|
+
|
168
199
|
## Toolbar
|
169
200
|
|
170
201
|
TODO
|
@@ -150,6 +150,37 @@ TODO
|
|
150
150
|
|
151
151
|
TODO
|
152
152
|
|
153
|
+
## List `displays`
|
154
|
+
|
155
|
+
On admin list views, you can define different `displays` to build predefined views of your data. The display choices will be shown in the UI, and you can use the current `self.display` in your view.
|
156
|
+
|
157
|
+
```python
|
158
|
+
# app/users/admin.py
|
159
|
+
from plain.admin.views import AdminModelListView, register_viewset
|
160
|
+
|
161
|
+
from .models import User
|
162
|
+
|
163
|
+
|
164
|
+
@register_viewset
|
165
|
+
class UserAdmin(AdminViewset):
|
166
|
+
class ListView(AdminModelListView):
|
167
|
+
model = User
|
168
|
+
fields = [
|
169
|
+
"id",
|
170
|
+
"email",
|
171
|
+
"created_at__date",
|
172
|
+
]
|
173
|
+
displays = ["Users without email"]
|
174
|
+
|
175
|
+
def get_objects(self):
|
176
|
+
objects = super().get_objects()
|
177
|
+
|
178
|
+
if self.display == "Users without email":
|
179
|
+
objects = objects.filter(email="")
|
180
|
+
|
181
|
+
return objects
|
182
|
+
```
|
183
|
+
|
153
184
|
## Toolbar
|
154
185
|
|
155
186
|
TODO
|
@@ -41,7 +41,7 @@
|
|
41
41
|
<form method="GET" class="inline-flex space-x-5">
|
42
42
|
{% if displays %}
|
43
43
|
<select data-autosubmit name="display" class="text-sm">
|
44
|
-
<option value="">
|
44
|
+
<option value="">Choose a display</option>
|
45
45
|
{% for display in displays %}
|
46
46
|
<option {% if display == current_display %}selected{% endif %}>{{ display }}</option>
|
47
47
|
{% endfor %}
|
@@ -89,9 +89,9 @@
|
|
89
89
|
{% else %}
|
90
90
|
<a
|
91
91
|
data-merge-params
|
92
|
-
class="font-mono text-xs font-normal"
|
92
|
+
class="font-mono text-xs font-normal flex space-x-1 items-center"
|
93
93
|
href="?page=1&order_by={{ '-' if not order_by_direction else '' }}{{ field }}">
|
94
|
-
{{ field }}
|
94
|
+
<span>{{ field }}</span>
|
95
95
|
{% if field == order_by_field %}
|
96
96
|
{% if order_by_direction == "-" %}
|
97
97
|
<span class="text-xs">▲</span>
|
@@ -1,6 +1,7 @@
|
|
1
1
|
from typing import TYPE_CHECKING
|
2
2
|
|
3
3
|
from plain import models
|
4
|
+
from plain.exceptions import FieldError
|
4
5
|
from plain.models import Manager, Q
|
5
6
|
|
6
7
|
from .objects import (
|
@@ -92,8 +93,8 @@ class AdminModelListView(AdminListView):
|
|
92
93
|
|
93
94
|
def get_objects(self):
|
94
95
|
queryset = self.get_initial_queryset()
|
95
|
-
queryset = self.order_queryset(queryset)
|
96
96
|
queryset = self.search_queryset(queryset)
|
97
|
+
queryset = self.order_queryset(queryset)
|
97
98
|
return queryset
|
98
99
|
|
99
100
|
def get_initial_queryset(self):
|
@@ -103,7 +104,24 @@ class AdminModelListView(AdminListView):
|
|
103
104
|
|
104
105
|
def order_queryset(self, queryset):
|
105
106
|
if order_by := self.request.query_params.get("order_by"):
|
106
|
-
|
107
|
+
try:
|
108
|
+
queryset = queryset.order_by(order_by)
|
109
|
+
except FieldError:
|
110
|
+
# Fallback to sorting in Python if the field is not valid
|
111
|
+
# Note this can be an expensive operation!
|
112
|
+
if order_by.startswith("-"):
|
113
|
+
order_by = order_by[1:]
|
114
|
+
queryset = sorted(
|
115
|
+
queryset,
|
116
|
+
key=lambda obj: self.get_field_value(obj, order_by),
|
117
|
+
reverse=True,
|
118
|
+
)
|
119
|
+
else:
|
120
|
+
queryset = sorted(
|
121
|
+
queryset,
|
122
|
+
key=lambda obj: self.get_field_value(obj, order_by),
|
123
|
+
reverse=False,
|
124
|
+
)
|
107
125
|
elif self.queryset_order:
|
108
126
|
queryset = queryset.order_by(*self.queryset_order)
|
109
127
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/vendor/jquery-3.6.1.slim.min.js
RENAMED
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/assets/admin/vendor/tippy-bundle.umd.min.js
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/admin/values/get_display.html
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Checkbox.html
RENAMED
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/CheckboxField.html
RENAMED
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/FieldErrors.html
RENAMED
File without changes
|
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/InputField.html
RENAMED
File without changes
|
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/SelectField.html
RENAMED
File without changes
|
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/Textarea.html
RENAMED
File without changes
|
{plain_admin-0.31.3 → plain_admin-0.31.4}/plain/admin/templates/elements/admin/TextareaField.html
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|