accrete 0.0.104__py3-none-any.whl → 0.0.105__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.
- accrete/contrib/ui/__init__.py +6 -29
- accrete/contrib/ui/context.py +26 -297
- accrete/contrib/ui/filter.py +316 -324
- accrete/contrib/ui/middleware.py +44 -0
- accrete/contrib/ui/models.py +3 -0
- accrete/contrib/ui/static/bulma/README.md +4 -2
- accrete/contrib/ui/static/bulma/bulma.css +21551 -0
- accrete/contrib/ui/static/bulma/bulma.css.map +1 -0
- accrete/contrib/ui/static/bulma/bulma.scss +1 -1
- accrete/contrib/ui/static/bulma/css/bulma.css +1988 -2874
- accrete/contrib/ui/static/bulma/css/bulma.css.map +1 -1
- accrete/contrib/ui/static/bulma/css/bulma.min.css +2 -2
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +19648 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +1 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +2 -2
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +11136 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +1 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +2 -2
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +11136 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +1 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +2 -2
- accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +21550 -2
- accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css.map +1 -1
- accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.min.css +3 -0
- accrete/contrib/ui/static/bulma/package.json +12 -11
- accrete/contrib/ui/static/bulma/sass/base/animations.css +15 -0
- accrete/contrib/ui/static/bulma/sass/base/animations.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/base/generic.css +196 -0
- accrete/contrib/ui/static/bulma/sass/base/generic.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/base/minireset.css +82 -0
- accrete/contrib/ui/static/bulma/sass/base/minireset.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/base/skeleton.css +113 -0
- accrete/contrib/ui/static/bulma/sass/base/skeleton.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -12
- accrete/contrib/ui/static/bulma/sass/components/breadcrumb.css +108 -0
- accrete/contrib/ui/static/bulma/sass/components/breadcrumb.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/card.css +130 -0
- accrete/contrib/ui/static/bulma/sass/components/card.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/dropdown.css +119 -0
- accrete/contrib/ui/static/bulma/sass/components/dropdown.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/menu.css +119 -0
- accrete/contrib/ui/static/bulma/sass/components/menu.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/message.css +191 -0
- accrete/contrib/ui/static/bulma/sass/components/message.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/modal.css +194 -0
- accrete/contrib/ui/static/bulma/sass/components/modal.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/navbar.css +768 -0
- accrete/contrib/ui/static/bulma/sass/components/navbar.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/navbar.scss +41 -30
- accrete/contrib/ui/static/bulma/sass/components/pagination.css +302 -0
- accrete/contrib/ui/static/bulma/sass/components/pagination.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/panel.css +224 -0
- accrete/contrib/ui/static/bulma/sass/components/panel.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/components/panel.scss +2 -2
- accrete/contrib/ui/static/bulma/sass/components/tabs.css +192 -0
- accrete/contrib/ui/static/bulma/sass/components/tabs.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/block.css +17 -0
- accrete/contrib/ui/static/bulma/sass/elements/block.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/box.css +43 -0
- accrete/contrib/ui/static/bulma/sass/elements/box.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/button.css +685 -0
- accrete/contrib/ui/static/bulma/sass/elements/button.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/button.scss +9 -2
- accrete/contrib/ui/static/bulma/sass/elements/content.css +208 -0
- accrete/contrib/ui/static/bulma/sass/elements/content.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/content.scss +8 -2
- accrete/contrib/ui/static/bulma/sass/elements/delete.css +60 -0
- accrete/contrib/ui/static/bulma/sass/elements/delete.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/icon.css +51 -0
- accrete/contrib/ui/static/bulma/sass/elements/icon.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/image.css +253 -0
- accrete/contrib/ui/static/bulma/sass/elements/image.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/loader.css +14 -0
- accrete/contrib/ui/static/bulma/sass/elements/loader.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/notification.css +213 -0
- accrete/contrib/ui/static/bulma/sass/elements/notification.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/progress.css +119 -0
- accrete/contrib/ui/static/bulma/sass/elements/progress.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/table.css +294 -0
- accrete/contrib/ui/static/bulma/sass/elements/table.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/tag.css +252 -0
- accrete/contrib/ui/static/bulma/sass/elements/tag.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/elements/title.css +131 -0
- accrete/contrib/ui/static/bulma/sass/elements/title.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.css +72 -0
- accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +7 -3
- accrete/contrib/ui/static/bulma/sass/form/file.css +374 -0
- accrete/contrib/ui/static/bulma/sass/form/file.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/input-textarea.css +284 -0
- accrete/contrib/ui/static/bulma/sass/form/input-textarea.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -10
- accrete/contrib/ui/static/bulma/sass/form/select.css +347 -0
- accrete/contrib/ui/static/bulma/sass/form/select.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/select.scss +1 -0
- accrete/contrib/ui/static/bulma/sass/form/shared.css +48 -0
- accrete/contrib/ui/static/bulma/sass/form/shared.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/shared.scss +5 -1
- accrete/contrib/ui/static/bulma/sass/form/tools.css +356 -0
- accrete/contrib/ui/static/bulma/sass/form/tools.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/form/tools.scss +23 -12
- accrete/contrib/ui/static/bulma/sass/grid/columns-v2.css +1635 -0
- accrete/contrib/ui/static/bulma/sass/grid/columns-v2.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/grid/columns.css +1652 -0
- accrete/contrib/ui/static/bulma/sass/grid/columns.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/grid/columns.scss +109 -25
- accrete/contrib/ui/static/bulma/sass/grid/grid.css +3011 -0
- accrete/contrib/ui/static/bulma/sass/grid/grid.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/grid/grid.scss +3 -3
- accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.css +61 -0
- accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/border.css +17 -0
- accrete/contrib/ui/static/bulma/sass/helpers/border.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/color.css +5582 -0
- accrete/contrib/ui/static/bulma/sass/helpers/color.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/color.scss +166 -186
- accrete/contrib/ui/static/bulma/sass/helpers/flexbox.css +217 -0
- accrete/contrib/ui/static/bulma/sass/helpers/flexbox.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/float.css +37 -0
- accrete/contrib/ui/static/bulma/sass/helpers/float.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/gap.css +209 -0
- accrete/contrib/ui/static/bulma/sass/helpers/gap.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/other.css +34 -0
- accrete/contrib/ui/static/bulma/sass/helpers/other.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/overflow.css +65 -0
- accrete/contrib/ui/static/bulma/sass/helpers/overflow.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/position.css +45 -0
- accrete/contrib/ui/static/bulma/sass/helpers/position.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/spacing.css +489 -0
- accrete/contrib/ui/static/bulma/sass/helpers/spacing.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/typography.css +423 -0
- accrete/contrib/ui/static/bulma/sass/helpers/typography.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/helpers/visibility.css +485 -0
- accrete/contrib/ui/static/bulma/sass/helpers/visibility.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/layout/container.scss +16 -8
- accrete/contrib/ui/static/bulma/sass/layout/footer.css +9 -0
- accrete/contrib/ui/static/bulma/sass/layout/footer.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/layout/hero.css +534 -0
- accrete/contrib/ui/static/bulma/sass/layout/hero.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/layout/level.css +102 -0
- accrete/contrib/ui/static/bulma/sass/layout/level.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/layout/media.css +90 -0
- accrete/contrib/ui/static/bulma/sass/layout/media.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/layout/section.css +23 -0
- accrete/contrib/ui/static/bulma/sass/layout/section.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/layout/section.scss +4 -0
- accrete/contrib/ui/static/bulma/sass/themes/dark.css +3 -0
- accrete/contrib/ui/static/bulma/sass/themes/dark.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/themes/light.css +3 -0
- accrete/contrib/ui/static/bulma/sass/themes/light.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/themes/light.scss +1 -0
- accrete/contrib/ui/static/bulma/sass/themes/setup.css +3 -0
- accrete/contrib/ui/static/bulma/sass/themes/setup.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/controls.css +13 -0
- accrete/contrib/ui/static/bulma/sass/utilities/controls.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/css-variables.css +3 -0
- accrete/contrib/ui/static/bulma/sass/utilities/css-variables.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +3 -2
- accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.css +3 -0
- accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/extends.css +13 -0
- accrete/contrib/ui/static/bulma/sass/utilities/extends.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +2 -2
- accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.css +3 -0
- accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +4 -4
- accrete/contrib/ui/static/bulma/sass/utilities/mixins.css +3 -0
- accrete/contrib/ui/static/bulma/sass/utilities/mixins.css.map +1 -0
- accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +1 -1
- accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.css +19648 -0
- accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.css.map +1 -0
- accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +2 -1
- accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.css +11136 -0
- accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.css.map +1 -0
- accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +1 -1
- accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.css +11136 -0
- accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.css.map +1 -0
- accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +1 -1
- accrete/contrib/ui/static/bulma/versions/bulma-prefixed.css +21551 -0
- accrete/contrib/ui/static/bulma/versions/bulma-prefixed.css.map +1 -0
- accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +1 -1
- accrete/contrib/ui/static/css/accrete.css +20757 -19997
- accrete/contrib/ui/static/css/accrete.css.map +1 -1
- accrete/contrib/ui/static/css/accrete.scss +185 -462
- accrete/contrib/ui/static/js/filter.js +97 -679
- accrete/contrib/ui/static/js/htmx.min.js +1 -1
- accrete/contrib/ui/templates/django/forms/widgets/date.html +5 -9
- accrete/contrib/ui/templates/django/forms/widgets/select.html +7 -5
- accrete/contrib/ui/templates/ui/content_right.html +7 -0
- accrete/contrib/ui/templates/ui/filter/filter.html +27 -0
- accrete/contrib/ui/templates/ui/filter/query_input.html +31 -0
- accrete/contrib/ui/templates/ui/filter/query_operator.html +11 -0
- accrete/contrib/ui/templates/ui/filter/query_params.html +106 -0
- accrete/contrib/ui/templates/ui/filter/query_tags.html +26 -0
- accrete/contrib/ui/templates/ui/layout.html +162 -233
- accrete/contrib/ui/templates/ui/list.html +39 -28
- accrete/contrib/ui/templates/ui/list_update.html +3 -0
- accrete/contrib/ui/templates/ui/message.html +13 -0
- accrete/contrib/ui/templates/ui/{partials/modal.html → modal.html} +9 -5
- accrete/contrib/ui/templates/ui/oob.html +3 -0
- accrete/contrib/ui/templates/ui/table.html +67 -71
- accrete/contrib/ui/templates/ui/table_row_update.html +14 -0
- accrete/contrib/ui/templates/ui/widgets/model_search_select.html +2 -2
- accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +24 -13
- accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +1 -1
- accrete/contrib/ui/templatetags/{accrete_ui.py → ui.py} +67 -56
- accrete/contrib/ui/urls.py +3 -1
- accrete/contrib/ui/views.py +33 -3
- accrete/contrib/ui/widgets/__init__.py +1 -0
- accrete/contrib/ui/{forms/widgets.py → widgets/search_select.py} +7 -2
- accrete/contrib/user/templates/user/login.html +71 -23
- accrete/forms.py +0 -2
- accrete/managers.py +4 -4
- accrete/middleware.py +43 -66
- accrete/models.py +7 -1
- accrete/storage.py +4 -1
- accrete/tenant.py +9 -4
- accrete/utils/__init__.py +2 -0
- accrete/utils/models.py +9 -1
- accrete/utils/views.py +36 -20
- accrete/views.py +9 -5
- {accrete-0.0.104.dist-info → accrete-0.0.105.dist-info}/METADATA +3 -2
- accrete-0.0.105.dist-info/RECORD +370 -0
- {accrete-0.0.104.dist-info → accrete-0.0.105.dist-info}/WHEEL +1 -1
- accrete/contrib/ui/components/__init__.py +0 -1
- accrete/contrib/ui/components/search_select.py +0 -18
- accrete/contrib/ui/elements.py +0 -95
- accrete/contrib/ui/forms/__init__.py +0 -0
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css.map +0 -1
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css.map +0 -1
- accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css.map +0 -1
- accrete/contrib/ui/static/bulma/sass/grid/columns-v2.scss +0 -957
- accrete/contrib/ui/static/js/ui.js +0 -30
- accrete/contrib/ui/templates/ui/dashboard.html +0 -7
- accrete/contrib/ui/templates/ui/detail.html +0 -19
- accrete/contrib/ui/templates/ui/form.html +0 -21
- accrete/contrib/ui/templates/ui/partials/filter.html +0 -146
- accrete/contrib/ui/templates/ui/partials/form_errors.html +0 -34
- accrete/contrib/ui/templates/ui/partials/header.html +0 -123
- accrete/contrib/ui/templates/ui/partials/modal_form.html +0 -46
- accrete/contrib/ui/templates/ui/partials/onchange_form.html +0 -1
- accrete/contrib/ui/templates/ui/partials/pagination_detail.html +0 -23
- accrete/contrib/ui/templates/ui/partials/pagination_list.html +0 -28
- accrete/contrib/ui/templates/ui/partials/table_field_tags.html +0 -17
- accrete/contrib/ui/templates/ui/widgets/model_search_select_multi_selected_options.html +0 -3
- accrete/contrib/ui/templates/ui/widgets/model_search_select_multi_tags.html +0 -6
- accrete-0.0.104.dist-info/RECORD +0 -238
- {accrete-0.0.104.dist-info → accrete-0.0.105.dist-info}/licenses/LICENSE +0 -0
accrete/contrib/ui/__init__.py
CHANGED
@@ -1,33 +1,10 @@
|
|
1
|
+
from . import widgets
|
1
2
|
from .filter import Filter
|
2
|
-
from .context import (
|
3
|
+
from . context import (
|
3
4
|
Context,
|
4
|
-
DetailContext,
|
5
|
-
TableContext,
|
6
5
|
ListContext,
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
list_page,
|
12
|
-
detail_page,
|
13
|
-
cast_param,
|
14
|
-
url_param_dict,
|
15
|
-
extract_url_params,
|
16
|
-
exclude_params,
|
17
|
-
url_param_str,
|
18
|
-
get_table_fields,
|
19
|
-
table_context_factory,
|
20
|
-
list_context_factory
|
21
|
-
)
|
22
|
-
from .elements import (
|
23
|
-
ClientActionGroup,
|
24
|
-
ClientAction,
|
25
|
-
ActionMethod,
|
26
|
-
BreadCrumb,
|
27
|
-
TableField,
|
28
|
-
TableFieldAlignment,
|
29
|
-
TableFieldType,
|
30
|
-
Icon
|
6
|
+
ListUpdateContext,
|
7
|
+
TableContext,
|
8
|
+
TableRowContext,
|
9
|
+
ModalContext
|
31
10
|
)
|
32
|
-
|
33
|
-
from . import components
|
accrete/contrib/ui/context.py
CHANGED
@@ -1,36 +1,11 @@
|
|
1
1
|
import logging
|
2
|
-
import json
|
3
|
-
from urllib.parse import quote_plus
|
4
|
-
from uuid import uuid4
|
5
2
|
from dataclasses import dataclass, field
|
6
|
-
from
|
7
|
-
from
|
8
|
-
from django.utils.translation import gettext_lazy as _t
|
9
|
-
from django.db import models
|
10
|
-
from django.db.models import Model, QuerySet
|
11
|
-
from django.core.paginator import Paginator
|
12
|
-
from django.core import paginator, exceptions
|
13
|
-
from django.forms import Form, ModelForm
|
14
|
-
from accrete.annotation import Annotation
|
15
|
-
from accrete.utils.views import cast_param
|
16
|
-
from .elements import (
|
17
|
-
ClientAction, BreadCrumb, TableField, TableFieldType, TableFieldAlignment,
|
18
|
-
ClientActionGroup
|
19
|
-
)
|
3
|
+
from django.core import paginator
|
4
|
+
from django.db.models import QuerySet, Model
|
20
5
|
from .filter import Filter
|
21
|
-
from accrete.utils import filter_from_querystring
|
22
6
|
|
23
7
|
_logger = logging.getLogger(__name__)
|
24
8
|
|
25
|
-
DEFAULT_PAGINATE_BY = 40
|
26
|
-
|
27
|
-
|
28
|
-
class DetailPagination(TypedDict):
|
29
|
-
previous_object_url: str
|
30
|
-
next_object_url: str
|
31
|
-
current_object_idx: int
|
32
|
-
total_objects: int
|
33
|
-
|
34
9
|
|
35
10
|
@dataclass(kw_only=True)
|
36
11
|
class BaseContext:
|
@@ -52,306 +27,60 @@ class BaseContext:
|
|
52
27
|
class Context(BaseContext):
|
53
28
|
|
54
29
|
title: str = ''
|
55
|
-
breadcrumbs: list[BreadCrumb] = field(default_factory=list)
|
56
|
-
actions: list[ClientAction | ClientActionGroup] = field(default_factory=list)
|
57
|
-
|
58
|
-
|
59
|
-
@dataclass
|
60
|
-
class TableContext(Context):
|
61
|
-
|
62
|
-
object_label: str
|
63
|
-
fields: list[TableField]
|
64
|
-
list_page: paginator.Page
|
65
|
-
pagination_param_str: str
|
66
|
-
endless_scroll: bool
|
67
|
-
filter: Filter
|
68
|
-
object_param_str: str = field(default='', kw_only=True)
|
69
|
-
field_selection: bool = True
|
70
|
-
|
71
|
-
|
72
|
-
def table_context_factory(model: Type[Model], params: dict, queryset=None, **kwargs) -> TableContext:
|
73
|
-
if queryset is None:
|
74
|
-
queryset = filter_from_querystring(model, params)
|
75
|
-
page = list_page(
|
76
|
-
queryset,
|
77
|
-
cast_param(params, 'paginate_by', int, 40),
|
78
|
-
cast_param(params, 'page', int, 1)
|
79
|
-
)
|
80
|
-
try:
|
81
|
-
has_name_field = (
|
82
|
-
model._meta.get_field('name').get_internal_type() == 'CharField'
|
83
|
-
)
|
84
|
-
except exceptions.FieldDoesNotExist:
|
85
|
-
has_name_field = False
|
86
|
-
|
87
|
-
ctx = partial(TableContext, **dict(
|
88
|
-
title=str(model._meta.verbose_name_plural),
|
89
|
-
object_label=str(model._meta.verbose_name),
|
90
|
-
object_param_str=url_param_str(
|
91
|
-
params,
|
92
|
-
['q', 'paginate_by', 'page', 'fields']
|
93
|
-
),
|
94
|
-
fields=get_table_fields(
|
95
|
-
cast_param(params, 'fields', json.loads, []), model
|
96
|
-
),
|
97
|
-
list_page=page,
|
98
|
-
pagination_param_str=url_param_str(
|
99
|
-
params, ['q', 'paginate_by', 'fields']
|
100
|
-
),
|
101
|
-
endless_scroll=True,
|
102
|
-
filter=Filter(
|
103
|
-
model,
|
104
|
-
default_filter_term='name__icontains' if has_name_field else ''
|
105
|
-
)
|
106
|
-
))
|
107
|
-
return ctx(**kwargs)
|
108
30
|
|
109
31
|
|
110
32
|
@dataclass
|
111
33
|
class ListContext(Context):
|
112
34
|
|
113
|
-
|
114
|
-
|
115
|
-
list_page: paginator.Page
|
116
|
-
pagination_param_str: str
|
117
|
-
filter: Filter = None
|
35
|
+
page: paginator.Page
|
36
|
+
queryset: QuerySet
|
118
37
|
endless_scroll: bool = True
|
119
|
-
|
120
|
-
|
121
|
-
|
38
|
+
detail_enabled: bool = True
|
39
|
+
filter: Filter = None
|
40
|
+
column_count: int = 1
|
122
41
|
column_height: int = 150
|
123
42
|
column_height_unit: str = 'px'
|
124
|
-
field_selection: bool = False
|
125
43
|
|
126
44
|
def __post_init__(self):
|
127
45
|
super().__post_init__()
|
128
|
-
if self.
|
46
|
+
if self.column_count not in range(1, 13):
|
129
47
|
_logger.warning(
|
130
|
-
'ListContext parameter
|
48
|
+
'ListContext parameter column_count should be in range 1 - 12'
|
131
49
|
)
|
132
|
-
if self.column_width_widescreen is None:
|
133
|
-
self.column_width_widescreen = self.column_width
|
134
|
-
if self.column_width_desktop is None:
|
135
|
-
self.column_width_desktop = self.column_width
|
136
|
-
|
137
|
-
|
138
|
-
def list_context_factory(model: Type[Model], params: dict, queryset=None, paginate_by=None, **kwargs) -> ListContext:
|
139
|
-
if queryset is None:
|
140
|
-
queryset = filter_from_querystring(model, params)
|
141
|
-
page = list_page(
|
142
|
-
queryset,
|
143
|
-
cast_param(params, 'paginate_by', int, paginate_by or 20),
|
144
|
-
cast_param(params, 'page', int, 1)
|
145
|
-
)
|
146
|
-
try:
|
147
|
-
has_name_field = (
|
148
|
-
model._meta.get_field('name').get_internal_type() == 'CharField'
|
149
|
-
)
|
150
|
-
except exceptions.FieldDoesNotExist:
|
151
|
-
has_name_field = False
|
152
|
-
|
153
|
-
ctx = partial(ListContext, **dict(
|
154
|
-
title=str(model._meta.verbose_name_plural),
|
155
|
-
object_label=str(model._meta.verbose_name),
|
156
|
-
object_param_str=url_param_str(
|
157
|
-
params,
|
158
|
-
['q', 'paginate_by', 'page']
|
159
|
-
),
|
160
|
-
list_page=page,
|
161
|
-
pagination_param_str=url_param_str(
|
162
|
-
params, ['q', 'paginate_by']
|
163
|
-
),
|
164
|
-
endless_scroll=True,
|
165
|
-
filter=Filter(
|
166
|
-
model,
|
167
|
-
default_filter_term='name__icontains' if has_name_field else ''
|
168
|
-
),
|
169
|
-
column_width=4,
|
170
|
-
column_height=150
|
171
|
-
))
|
172
|
-
return ctx(**kwargs)
|
173
50
|
|
174
51
|
|
175
52
|
@dataclass
|
176
|
-
class
|
53
|
+
class ListUpdateContext(BaseContext):
|
177
54
|
|
178
55
|
object: Model
|
179
|
-
|
180
|
-
pagination_param_str: str = ''
|
56
|
+
template: str
|
181
57
|
|
182
58
|
|
183
59
|
@dataclass
|
184
|
-
class
|
60
|
+
class TableContext(Context):
|
185
61
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
62
|
+
object_label: str
|
63
|
+
fields: list[str]
|
64
|
+
page: paginator.Page
|
65
|
+
queryset: QuerySet
|
66
|
+
footer: dict = field(default_factory=dict)
|
67
|
+
endless_scroll: bool = True
|
68
|
+
detail_enabled: bool = True
|
69
|
+
filter: Filter = None
|
190
70
|
|
191
71
|
|
192
72
|
@dataclass
|
193
|
-
class
|
73
|
+
class TableRowContext(BaseContext):
|
194
74
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
75
|
+
object: Model
|
76
|
+
fields: list[str]
|
77
|
+
queryset: QuerySet
|
78
|
+
footer: dict = field(default_factory=dict)
|
199
79
|
|
200
80
|
|
201
81
|
@dataclass
|
202
82
|
class ModalContext(BaseContext):
|
203
83
|
|
204
84
|
title: str
|
85
|
+
modal_id: str
|
205
86
|
blocking: bool = False
|
206
|
-
modal_id: str = None
|
207
|
-
|
208
|
-
def __post_init__(self):
|
209
|
-
super().__post_init__()
|
210
|
-
if not self.modal_id:
|
211
|
-
self.modal_id = f'modal{str(uuid4())[:8]}'
|
212
|
-
|
213
|
-
|
214
|
-
def url_param_dict(get_params: dict) -> dict:
|
215
|
-
return {
|
216
|
-
key: f'&{key}={quote_plus(value)}'
|
217
|
-
for key, value in get_params.items()
|
218
|
-
}
|
219
|
-
|
220
|
-
|
221
|
-
def url_param_str(params: dict, extract: list[str] = None) -> str:
|
222
|
-
"""
|
223
|
-
Return a URL Querystring from the given params dict.
|
224
|
-
If extract is supplied, only specified keys will be used.
|
225
|
-
"""
|
226
|
-
if extract:
|
227
|
-
params = extract_url_params(params, extract)
|
228
|
-
param_str = (
|
229
|
-
"".join(str(value) for value in url_param_dict(params).values())
|
230
|
-
.replace('&&', '&')
|
231
|
-
.replace('?&', '?')
|
232
|
-
.strip('?&')
|
233
|
-
)
|
234
|
-
return f'?{param_str}'
|
235
|
-
|
236
|
-
|
237
|
-
def extract_url_params(params: dict, keys: list[str]) -> dict:
|
238
|
-
return {key: params[key] for key in keys if key in params}
|
239
|
-
|
240
|
-
|
241
|
-
def exclude_params(params: dict, keys: list[str]) -> dict:
|
242
|
-
return {key: val for key, val in params.items() if key not in keys}
|
243
|
-
|
244
|
-
|
245
|
-
def list_page(
|
246
|
-
queryset: QuerySet, paginate_by: int, page_number: int
|
247
|
-
) -> paginator.Page:
|
248
|
-
pages = Paginator(queryset, per_page=paginate_by)
|
249
|
-
return pages.page(
|
250
|
-
page_number <= pages.num_pages and page_number or pages.num_pages
|
251
|
-
)
|
252
|
-
|
253
|
-
|
254
|
-
def detail_page(queryset: QuerySet, obj: Model) -> dict:
|
255
|
-
if not hasattr(obj, 'get_absolute_url'):
|
256
|
-
_logger.warning(
|
257
|
-
'Detail pagination disabled for models without the '
|
258
|
-
'get_absolute_url attribute. Set paginate_by to 0 to '
|
259
|
-
'deactivate pagination.'
|
260
|
-
)
|
261
|
-
return {}
|
262
|
-
if obj not in queryset:
|
263
|
-
url = obj.get_absolute_url()
|
264
|
-
return {
|
265
|
-
'previous_object_url': url,
|
266
|
-
'next_object_url': url,
|
267
|
-
'current_object_idx': 1,
|
268
|
-
'total_objects': 1
|
269
|
-
}
|
270
|
-
|
271
|
-
idx = (*queryset,).index(obj)
|
272
|
-
previous_object_url = (
|
273
|
-
queryset[idx - 1] if idx - 1 >= 0 else queryset.last()
|
274
|
-
).get_absolute_url()
|
275
|
-
next_object_url = (
|
276
|
-
queryset[idx + 1] if idx + 1 <= queryset.count() - 1 else queryset.first()
|
277
|
-
).get_absolute_url()
|
278
|
-
return {
|
279
|
-
'previous_object_url': previous_object_url,
|
280
|
-
'next_object_url': next_object_url,
|
281
|
-
'current_object_idx': idx + 1,
|
282
|
-
'total_objects': queryset.count()
|
283
|
-
}
|
284
|
-
|
285
|
-
|
286
|
-
def form_actions(discard_url: str, form_id: str = 'form') -> list[ClientAction]:
|
287
|
-
return [
|
288
|
-
ClientAction(
|
289
|
-
name=_t('Save'),
|
290
|
-
submit=True,
|
291
|
-
class_list=['is-success'],
|
292
|
-
form_id=form_id,
|
293
|
-
),
|
294
|
-
ClientAction(
|
295
|
-
name=_t('Discard'),
|
296
|
-
url=discard_url
|
297
|
-
)
|
298
|
-
]
|
299
|
-
|
300
|
-
|
301
|
-
def get_table_fields(
|
302
|
-
fields: list[str],
|
303
|
-
model: type[Model],
|
304
|
-
field_definition: dict[str | TableField] = None
|
305
|
-
) -> list[TableField]:
|
306
|
-
|
307
|
-
def get_alignment(field_attr) -> TableFieldAlignment:
|
308
|
-
number_field_types = (
|
309
|
-
models.DecimalField, models.IntegerField, models.FloatField
|
310
|
-
)
|
311
|
-
if (
|
312
|
-
isinstance(field_attr, number_field_types)
|
313
|
-
or (
|
314
|
-
isinstance(field_attr, Annotation)
|
315
|
-
and field_attr.field in number_field_types
|
316
|
-
)
|
317
|
-
):
|
318
|
-
return TableFieldAlignment.RIGHT
|
319
|
-
return TableFieldAlignment.LEFT
|
320
|
-
|
321
|
-
def get_field_definition(f_name: str) -> TableField:
|
322
|
-
if definition := field_definition.get(f_name):
|
323
|
-
return definition
|
324
|
-
try:
|
325
|
-
return model.table_field_definition[f_name]
|
326
|
-
except (AttributeError, KeyError):
|
327
|
-
attr = getattr(model, f_name)
|
328
|
-
if not isinstance(attr, Annotation) and hasattr(attr, 'field'):
|
329
|
-
attr = attr.field
|
330
|
-
is_relation = (
|
331
|
-
hasattr(attr, 'related_model')
|
332
|
-
and hasattr(attr.related_model, 'get_absolute_url')
|
333
|
-
)
|
334
|
-
field_type = TableFieldType.NONE
|
335
|
-
if getattr(attr, 'choices', False):
|
336
|
-
field_type = TableFieldType.CHOICE_DISPLAY
|
337
|
-
table_field = TableField(
|
338
|
-
label=attr.verbose_name,
|
339
|
-
name=f_name,
|
340
|
-
field_type=field_type,
|
341
|
-
alignment=get_alignment(attr),
|
342
|
-
is_relation=is_relation
|
343
|
-
)
|
344
|
-
if hasattr(attr, 'get_internal_type') and attr.get_internal_type() == 'ManyToManyField':
|
345
|
-
table_field.template = 'ui/partials/table_field_tags.html'
|
346
|
-
return table_field
|
347
|
-
|
348
|
-
if field_definition is None:
|
349
|
-
field_definition = {}
|
350
|
-
table_fields = []
|
351
|
-
for field_name in fields:
|
352
|
-
try:
|
353
|
-
table_fields.append(get_field_definition(field_name))
|
354
|
-
except AttributeError as e:
|
355
|
-
_logger.error(e)
|
356
|
-
pass
|
357
|
-
return table_fields
|