accrete 0.0.150__tar.gz → 0.0.151__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.
- {accrete-0.0.150 → accrete-0.0.151}/PKG-INFO +1 -1
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/queries.py +3 -1
- accrete-0.0.151/accrete/contrib/ui/admin.py +11 -0
- accrete-0.0.151/accrete/contrib/ui/forms.py +57 -0
- accrete-0.0.151/accrete/contrib/ui/migrations/0001_initial.py +39 -0
- accrete-0.0.151/accrete/contrib/ui/migrations/0002_alter_theme_color_danger_alter_theme_color_link_and_more.py +38 -0
- accrete-0.0.151/accrete/contrib/ui/migrations/0003_alter_theme_check_user_or_tenant.py +21 -0
- accrete-0.0.151/accrete/contrib/ui/migrations/0004_theme_force_tenant_theme.py +18 -0
- accrete-0.0.151/accrete/contrib/ui/models.py +117 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/response.py +11 -4
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/css/accrete.css +23 -57
- accrete-0.0.151/accrete/contrib/ui/static/css/accrete.css.map +7 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/css/accrete.scss +76 -55
- accrete-0.0.151/accrete/contrib/ui/templates/django/forms/widgets/input.html +1 -0
- accrete-0.0.151/accrete/contrib/ui/templates/ui/custom_theme.html +19 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/layout.html +9 -9
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/list.html +2 -2
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/message.html +2 -2
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/modal.html +3 -3
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/table.html +5 -5
- accrete-0.0.151/accrete/contrib/ui/templates/ui/templatetags/field.html +66 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/date_weekday.html +1 -1
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +4 -3
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +5 -4
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templatetags/ui.py +34 -4
- accrete-0.0.151/accrete/contrib/ui/views.py +123 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/widgets/search_select.py +2 -2
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/forms.py +1 -1
- accrete-0.0.151/accrete/contrib/user/migrations/0009_alter_user_theme.py +18 -0
- accrete-0.0.151/accrete/contrib/user/migrations/0010_alter_user_theme.py +18 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/models.py +5 -3
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/templates/user/login.html +3 -11
- accrete-0.0.151/accrete/contrib/user/templates/user/user_preferences.html +55 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/views.py +7 -2
- {accrete-0.0.150 → accrete-0.0.151}/accrete/fields.py +4 -2
- {accrete-0.0.150 → accrete-0.0.151}/accrete/managers.py +9 -0
- accrete-0.0.151/accrete/migrations/0009_alter_accessgroup_name.py +30 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/models.py +6 -4
- {accrete-0.0.150 → accrete-0.0.151}/accrete/views.py +32 -20
- {accrete-0.0.150 → accrete-0.0.151}/pyproject.toml +1 -1
- accrete-0.0.150/accrete/contrib/ui/admin.py +0 -3
- accrete-0.0.150/accrete/contrib/ui/models.py +0 -3
- accrete-0.0.150/accrete/contrib/ui/static/css/accrete.css.map +0 -7
- accrete-0.0.150/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -1
- accrete-0.0.150/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -27
- accrete-0.0.150/accrete/contrib/ui/views.py +0 -35
- accrete-0.0.150/accrete/contrib/user/templates/user/user_preferences.html +0 -43
- {accrete-0.0.150 → accrete-0.0.151}/.gitignore +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/LICENSE +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/README.md +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/config.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/context_processors.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/country/models.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/config.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/helper.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/models.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/signals.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/log/views.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/forms.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/models.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/queries.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/sequence/views.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/forms.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/models.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/tasks.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/system_mail/views.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/filter.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/middleware.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/README.md +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/package.json +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/css/fa.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/css/icons.css +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/js/filter.js +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/content.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/detail.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/favicon.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/form_error.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/oob.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/templatetags/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/urls.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/widgets/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/ui/widgets/date_weekday.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/auth_backends.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/middleware.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/templates/user/change_email.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/templates/user/change_password.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/templates/user/password_forgotten.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user/urls.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/admin.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/apps.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/config.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/forms.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/models.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/urls.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/contrib/user_registration/views.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/forms.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/middleware.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0001_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0002_initial.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0003_remove_member_name.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0006_alter_member_user.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0007_accessgroup_description.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/0008_alter_member_access_groups_and_more.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/migrations/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/storage.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/tenant.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/tests.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/urls.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/utils/__init__.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/utils/dates.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/utils/forms.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/utils/log.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/utils/models.py +0 -0
- {accrete-0.0.150 → accrete-0.0.151}/accrete/utils/views.py +0 -0
@@ -1,8 +1,10 @@
|
|
1
|
+
from django.db.models.query import RawQuerySet
|
2
|
+
|
1
3
|
from .models import Log
|
2
4
|
from accrete.tenant import get_tenant
|
3
5
|
|
4
6
|
|
5
|
-
def current_log_state(model: str, object_id: int):
|
7
|
+
def current_log_state(model: str, object_id: int) -> RawQuerySet:
|
6
8
|
tenant = get_tenant()
|
7
9
|
tenant_id = tenant and tenant.id or None
|
8
10
|
logs = Log.objects.raw("""
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from django import forms
|
2
|
+
from django.db.models import Q
|
3
|
+
from django.utils.translation import gettext_lazy as _
|
4
|
+
from . models import Theme
|
5
|
+
|
6
|
+
|
7
|
+
class ThemeForm(forms.ModelForm):
|
8
|
+
|
9
|
+
class Meta:
|
10
|
+
model = Theme
|
11
|
+
fields = [
|
12
|
+
'user',
|
13
|
+
'tenant',
|
14
|
+
'color_primary',
|
15
|
+
'color_success',
|
16
|
+
'color_link',
|
17
|
+
'color_warning',
|
18
|
+
'color_danger'
|
19
|
+
]
|
20
|
+
widgets = {
|
21
|
+
'color_primary': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
|
22
|
+
'color_success': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
|
23
|
+
'color_link': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
|
24
|
+
'color_warning': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
|
25
|
+
'color_danger': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
|
26
|
+
'user': forms.widgets.HiddenInput(),
|
27
|
+
'tenant': forms.widgets.HiddenInput()
|
28
|
+
}
|
29
|
+
|
30
|
+
def _clean_color(self, hex_color: str):
|
31
|
+
if not hex_color.startswith('#'):
|
32
|
+
hex_color = f'#{hex_color}'
|
33
|
+
if len(hex_color) != 7:
|
34
|
+
raise forms.ValidationError(_(
|
35
|
+
'Color must be of length 7 and including the starting "#"'
|
36
|
+
))
|
37
|
+
return hex_color
|
38
|
+
|
39
|
+
def clean_color_primary(self):
|
40
|
+
color = self._clean_color(self.cleaned_data.get('color_primary'))
|
41
|
+
return color
|
42
|
+
|
43
|
+
def clean_color_success(self):
|
44
|
+
color = self._clean_color(self.cleaned_data.get('color_success'))
|
45
|
+
return color
|
46
|
+
|
47
|
+
def clean_color_link(self):
|
48
|
+
color = self._clean_color(self.cleaned_data.get('color_link'))
|
49
|
+
return color
|
50
|
+
|
51
|
+
def clean_color_warning(self):
|
52
|
+
color = self._clean_color(self.cleaned_data.get('color_warning'))
|
53
|
+
return color
|
54
|
+
|
55
|
+
def clean_color_danger(self):
|
56
|
+
color = self._clean_color(self.cleaned_data.get('color_danger'))
|
57
|
+
return color
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Generated by Django 5.2.1 on 2025-08-07 16:18
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
from django.conf import settings
|
5
|
+
from django.db import migrations, models
|
6
|
+
|
7
|
+
|
8
|
+
class Migration(migrations.Migration):
|
9
|
+
|
10
|
+
initial = True
|
11
|
+
|
12
|
+
dependencies = [
|
13
|
+
('accrete', '0009_alter_accessgroup_name'),
|
14
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
15
|
+
]
|
16
|
+
|
17
|
+
operations = [
|
18
|
+
migrations.CreateModel(
|
19
|
+
name='Theme',
|
20
|
+
fields=[
|
21
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
22
|
+
('color_primary', models.CharField(max_length=7, verbose_name='Primary Color')),
|
23
|
+
('color_success', models.CharField(max_length=7, verbose_name='Success Color')),
|
24
|
+
('color_link', models.CharField(max_length=7, verbose_name='Link Color')),
|
25
|
+
('color_warning', models.CharField(max_length=7, verbose_name='Warning Color')),
|
26
|
+
('color_danger', models.CharField(max_length=7, verbose_name='Danger Color')),
|
27
|
+
('theme_markup', models.TextField(blank=True, null=True, verbose_name='Theme Markup')),
|
28
|
+
('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tenant_themes', to='accrete.tenant', verbose_name='Tenant')),
|
29
|
+
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_themes', to=settings.AUTH_USER_MODEL, verbose_name='User')),
|
30
|
+
],
|
31
|
+
options={
|
32
|
+
'verbose_name': 'Theme',
|
33
|
+
'verbose_name_plural': 'Themes',
|
34
|
+
'db_table': 'accrete_theme',
|
35
|
+
'ordering': ['pk'],
|
36
|
+
'constraints': [models.CheckConstraint(condition=models.Q(('user__isnull', True), ('tenant__isnull', True), _connector='XOR'), name='check_user_or_tenant', violation_error_message='')],
|
37
|
+
},
|
38
|
+
),
|
39
|
+
]
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Generated by Django 5.2.1 on 2025-08-07 17:11
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
('ui', '0001_initial'),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AlterField(
|
14
|
+
model_name='theme',
|
15
|
+
name='color_danger',
|
16
|
+
field=models.CharField(default='#FF6584', max_length=7, verbose_name='Danger Color'),
|
17
|
+
),
|
18
|
+
migrations.AlterField(
|
19
|
+
model_name='theme',
|
20
|
+
name='color_link',
|
21
|
+
field=models.CharField(default='#65D0FE', max_length=7, verbose_name='Link Color'),
|
22
|
+
),
|
23
|
+
migrations.AlterField(
|
24
|
+
model_name='theme',
|
25
|
+
name='color_primary',
|
26
|
+
field=models.CharField(default='#46C68D', max_length=7, verbose_name='Primary Color'),
|
27
|
+
),
|
28
|
+
migrations.AlterField(
|
29
|
+
model_name='theme',
|
30
|
+
name='color_success',
|
31
|
+
field=models.CharField(default='#46C68D', max_length=7, verbose_name='Success Color'),
|
32
|
+
),
|
33
|
+
migrations.AlterField(
|
34
|
+
model_name='theme',
|
35
|
+
name='color_warning',
|
36
|
+
field=models.CharField(default='#FEB600', max_length=7, verbose_name='Warning Color'),
|
37
|
+
),
|
38
|
+
]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Generated by Django 5.2.1 on 2025-08-08 06:13
|
2
|
+
|
3
|
+
from django.conf import settings
|
4
|
+
from django.db import migrations, models
|
5
|
+
|
6
|
+
|
7
|
+
class Migration(migrations.Migration):
|
8
|
+
|
9
|
+
dependencies = [
|
10
|
+
('accrete', '0009_alter_accessgroup_name'),
|
11
|
+
('ui', '0002_alter_theme_color_danger_alter_theme_color_link_and_more'),
|
12
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
13
|
+
]
|
14
|
+
|
15
|
+
operations = [
|
16
|
+
migrations.AlterConstraint(
|
17
|
+
model_name='theme',
|
18
|
+
name='check_user_or_tenant',
|
19
|
+
constraint=models.CheckConstraint(condition=models.Q(('user__isnull', True), ('tenant__isnull', True), _connector='XOR'), name='check_user_or_tenant', violation_error_message='A theme must be assigned either to a user or a tenant.'),
|
20
|
+
),
|
21
|
+
]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated by Django 5.2.1 on 2025-08-08 06:27
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
('ui', '0003_alter_theme_check_user_or_tenant'),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AddField(
|
14
|
+
model_name='theme',
|
15
|
+
name='force_tenant_theme',
|
16
|
+
field=models.BooleanField(default=False, help_text='Apply this theme regardless of user preferences', verbose_name='Force Tenant Theme'),
|
17
|
+
),
|
18
|
+
]
|
@@ -0,0 +1,117 @@
|
|
1
|
+
import colorsys
|
2
|
+
|
3
|
+
from django.conf import settings
|
4
|
+
from django.db import models
|
5
|
+
from django.utils.translation import gettext_lazy as _
|
6
|
+
from django.template.loader import render_to_string
|
7
|
+
|
8
|
+
|
9
|
+
class Theme(models.Model):
|
10
|
+
|
11
|
+
class Meta:
|
12
|
+
verbose_name = _('Theme')
|
13
|
+
verbose_name_plural = _('Themes')
|
14
|
+
db_table = 'accrete_theme'
|
15
|
+
ordering = ['pk']
|
16
|
+
constraints = [
|
17
|
+
models.CheckConstraint(
|
18
|
+
name='check_user_or_tenant',
|
19
|
+
violation_error_message=_(
|
20
|
+
'A theme must be assigned either to a user or a tenant.'
|
21
|
+
),
|
22
|
+
condition=(
|
23
|
+
models.Q(user__isnull=True) ^ models.Q(tenant__isnull=True)
|
24
|
+
)
|
25
|
+
)
|
26
|
+
]
|
27
|
+
|
28
|
+
user = models.ForeignKey(
|
29
|
+
verbose_name=_('User'),
|
30
|
+
to=settings.AUTH_USER_MODEL,
|
31
|
+
on_delete=models.CASCADE,
|
32
|
+
related_name='user_themes',
|
33
|
+
null=True,
|
34
|
+
blank=True
|
35
|
+
)
|
36
|
+
|
37
|
+
tenant = models.ForeignKey(
|
38
|
+
verbose_name=_('Tenant'),
|
39
|
+
to='accrete.Tenant',
|
40
|
+
on_delete=models.CASCADE,
|
41
|
+
related_name='tenant_themes',
|
42
|
+
null=True,
|
43
|
+
blank=True
|
44
|
+
)
|
45
|
+
|
46
|
+
force_tenant_theme = models.BooleanField(
|
47
|
+
verbose_name=_('Force Tenant Theme'),
|
48
|
+
default=False,
|
49
|
+
help_text=_('Apply this theme regardless of user preferences')
|
50
|
+
)
|
51
|
+
|
52
|
+
color_primary = models.CharField(
|
53
|
+
verbose_name=_('Primary Color'),
|
54
|
+
max_length=7,
|
55
|
+
default='#46C68D'
|
56
|
+
)
|
57
|
+
|
58
|
+
color_success = models.CharField(
|
59
|
+
verbose_name=_('Success Color'),
|
60
|
+
max_length=7,
|
61
|
+
default='#46C68D'
|
62
|
+
)
|
63
|
+
|
64
|
+
color_link = models.CharField(
|
65
|
+
verbose_name=_('Link Color'),
|
66
|
+
max_length=7,
|
67
|
+
default='#65D0FE'
|
68
|
+
)
|
69
|
+
|
70
|
+
color_warning = models.CharField(
|
71
|
+
verbose_name=_('Warning Color'),
|
72
|
+
max_length=7,
|
73
|
+
default='#FEB600'
|
74
|
+
)
|
75
|
+
|
76
|
+
color_danger = models.CharField(
|
77
|
+
verbose_name=_('Danger Color'),
|
78
|
+
max_length=7,
|
79
|
+
default='#FF6584'
|
80
|
+
)
|
81
|
+
|
82
|
+
theme_markup = models.TextField(
|
83
|
+
verbose_name=_('Theme Markup'),
|
84
|
+
null=True,
|
85
|
+
blank=True
|
86
|
+
)
|
87
|
+
|
88
|
+
def generate_markup(self) -> str:
|
89
|
+
def hex_to_hsl(hex_color: str) -> dict:
|
90
|
+
hex_color = hex_color.removeprefix('#')
|
91
|
+
rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
|
92
|
+
rgb = [x/255.0 for x in rgb]
|
93
|
+
h, l, s = colorsys.rgb_to_hls(*rgb)
|
94
|
+
|
95
|
+
return {
|
96
|
+
'h': round(h * 360),
|
97
|
+
's': round(s * 100),
|
98
|
+
'l': round(l * 100)
|
99
|
+
}
|
100
|
+
ctx = {
|
101
|
+
'primary': hex_to_hsl(self.color_primary),
|
102
|
+
'success': hex_to_hsl(self.color_success),
|
103
|
+
'link': hex_to_hsl(self.color_link),
|
104
|
+
'warning': hex_to_hsl(self.color_warning),
|
105
|
+
'danger': hex_to_hsl(self.color_danger)
|
106
|
+
}
|
107
|
+
return render_to_string('ui/custom_theme.html', ctx)
|
108
|
+
|
109
|
+
def save(
|
110
|
+
self,
|
111
|
+
force_insert=False,
|
112
|
+
force_update=False,
|
113
|
+
using=None,
|
114
|
+
update_fields=None,
|
115
|
+
):
|
116
|
+
self.theme_markup = self.generate_markup()
|
117
|
+
super().save(force_insert, force_update, using, update_fields)
|
@@ -8,6 +8,7 @@ from django.db.models import Model
|
|
8
8
|
from django.http import HttpResponse
|
9
9
|
from django.template.loader import render_to_string
|
10
10
|
from django.utils.translation import gettext_lazy as _
|
11
|
+
from django.utils.functional import Promise
|
11
12
|
from accrete.contrib.ui import Filter
|
12
13
|
|
13
14
|
|
@@ -121,7 +122,8 @@ class ListResponse(WindowResponse):
|
|
121
122
|
column_height: str = '150px',
|
122
123
|
overview_template: str = 'ui/list.html',
|
123
124
|
detail_header_template: str = None,
|
124
|
-
detail_data_template: str = None
|
125
|
+
detail_data_template: str = None,
|
126
|
+
detail_enabled: bool = True
|
125
127
|
):
|
126
128
|
assert page is not None or ui_filter is not None, _(
|
127
129
|
'Argument page or ui_filter must be supplied'
|
@@ -141,6 +143,7 @@ class ListResponse(WindowResponse):
|
|
141
143
|
self.column_height = column_height
|
142
144
|
self.detail_header_template = detail_header_template
|
143
145
|
self.detail_data_template = detail_data_template
|
146
|
+
self.detail_enabled = detail_enabled
|
144
147
|
|
145
148
|
def _has_panel(self):
|
146
149
|
return bool(self.panel_template or self.ui_filter)
|
@@ -154,6 +157,7 @@ class ListResponse(WindowResponse):
|
|
154
157
|
'endless_scroll': self.endless_scroll,
|
155
158
|
'column_count': self.column_count,
|
156
159
|
'column_height': self.column_height,
|
160
|
+
'detail_enabled': self.detail_enabled,
|
157
161
|
'detail_header_template': self.detail_header_template,
|
158
162
|
'detail_data_template': self.detail_data_template,
|
159
163
|
'show_content_right': str(bool(
|
@@ -215,10 +219,10 @@ class TableResponse(WindowResponse):
|
|
215
219
|
|
216
220
|
def __init__(
|
217
221
|
self, *,
|
218
|
-
title: str,
|
222
|
+
title: str | Promise,
|
219
223
|
context: dict,
|
220
|
-
instance_label: str,
|
221
224
|
fields: list[str],
|
225
|
+
instance_label: str | Promise | None = None,
|
222
226
|
footer: dict = None,
|
223
227
|
page: paginator.Page = None,
|
224
228
|
ui_filter: Filter = None,
|
@@ -280,12 +284,14 @@ class TableRowResponse(Response):
|
|
280
284
|
self, *,
|
281
285
|
instance: Model,
|
282
286
|
fields: list[str],
|
287
|
+
instance_label: str | Promise | None = None,
|
283
288
|
footer: dict = None,
|
284
289
|
page: paginator.Page = None,
|
285
290
|
):
|
286
291
|
super().__init__(template=self.base_template, context={})
|
287
292
|
self.instance = instance
|
288
293
|
self.fields = fields
|
294
|
+
self.instance_label = instance_label
|
289
295
|
self.footer = footer
|
290
296
|
self.page = page
|
291
297
|
|
@@ -294,6 +300,7 @@ class TableRowResponse(Response):
|
|
294
300
|
context.update({
|
295
301
|
'instance': self.instance,
|
296
302
|
'fields': self.fields,
|
303
|
+
'instance_label': self.instance_label,
|
297
304
|
'footer': self.footer,
|
298
305
|
'page': self.page
|
299
306
|
})
|
@@ -346,7 +353,7 @@ class ModalResponse(Response):
|
|
346
353
|
modal_id: str,
|
347
354
|
template: str,
|
348
355
|
context: dict,
|
349
|
-
title: str = None,
|
356
|
+
title: str | Promise = None,
|
350
357
|
is_update: bool = False,
|
351
358
|
is_blocking: bool = False,
|
352
359
|
modal_width: str = None
|
@@ -1,30 +1,18 @@
|
|
1
|
-
@import url(../bulma/css/bulma.css);
|
1
|
+
@import url(../bulma/css/bulma.min.css);
|
2
2
|
:root {
|
3
3
|
--bulma-body-size: .9em;
|
4
4
|
--bulma-navbar-height: 40px;
|
5
|
-
--bulma-menu-item-selected-h: --bulma-
|
6
|
-
--accrete-detail-width:
|
5
|
+
--bulma-menu-item-selected-h: var(--bulma-primary-h);
|
6
|
+
--accrete-detail-width: 35em;
|
7
|
+
--bulma-primary-h: 153.28deg;
|
8
|
+
--bulma-primary-s: 52.89%;
|
9
|
+
--bulma-primary-l: 52.55%;
|
7
10
|
--accrete-action-panel-width: 320px;
|
8
|
-
--bulma-input-
|
9
|
-
--bulma-
|
10
|
-
--bulma-arrow-color: var(--bulma-success);
|
11
|
-
--bulma-menu-nested-list-margin: .5em 0 0.5em 0.75em;
|
12
|
-
--bulma-navbar-burger-color: var(--bulma-success);
|
13
|
-
--accrete-hover-color: #F0F2F4; }
|
14
|
-
|
15
|
-
html[data-theme='light'] {
|
16
|
-
--bulma-menu-item-h: var(--bulma-success-h);
|
17
|
-
--bulma-menu-item-s: var(--bulma-success-s);
|
18
|
-
--bulma-menu-item-l: var(--bulma-success-l);
|
19
|
-
--bulma-menu-item-background-l: 50%;
|
20
|
-
--bulma-menu-item-color-l: 10%;
|
21
|
-
--bulma-navbar-burger-color: var(--bulma-success);
|
22
|
-
--bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
|
11
|
+
--bulma-input-arrow: var(--bulma-primary);
|
12
|
+
--bulma-arrow-color: var(--bulma-primary);
|
23
13
|
--accrete-hover-color: #F0F2F4; }
|
24
14
|
|
25
15
|
html[data-theme='dark'] {
|
26
|
-
--bulma-navbar-burger-color: var(--bulma-success);
|
27
|
-
--bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
|
28
16
|
--accrete-hover-color: #1E2128; }
|
29
17
|
html[data-theme='dark'] .button.is-light {
|
30
18
|
--bulma-button-h: var(--bulma-dark-h);
|
@@ -61,20 +49,9 @@ a {
|
|
61
49
|
border-bottom-color: transparent;
|
62
50
|
border-left-color: transparent; }
|
63
51
|
|
64
|
-
.input {
|
65
|
-
border-top: none;
|
66
|
-
border-right: none;
|
67
|
-
border-left: none;
|
68
|
-
border-top-left-radius: 0;
|
69
|
-
border-top-right-radius: 0;
|
70
|
-
border-bottom-right-radius: 0;
|
71
|
-
border-bottom-left-radius: 0;
|
72
|
-
box-shadow: none;
|
73
|
-
font-weight: bold; }
|
74
|
-
|
75
52
|
.input:focus, .input:focus-within {
|
76
53
|
box-shadow: none;
|
77
|
-
border
|
54
|
+
border: 1px solid var(--bulma-primary); }
|
78
55
|
|
79
56
|
input[disabled] {
|
80
57
|
background-color: transparent !important;
|
@@ -87,32 +64,21 @@ textarea {
|
|
87
64
|
box-shadow: none !important; }
|
88
65
|
|
89
66
|
textarea:focus {
|
90
|
-
border-color: var(--bulma-
|
67
|
+
border-color: var(--bulma-primary) !important; }
|
91
68
|
|
92
69
|
.is-small.textarea, .is-small.input {
|
93
70
|
border-radius: 0;
|
94
71
|
font-size: var(--bulma-size-small); }
|
95
72
|
|
96
73
|
td > .input, td * .input, td * select, td * .select {
|
97
|
-
border-
|
98
|
-
border-right: none !important;
|
99
|
-
border-bottom: none !important;
|
100
|
-
border-left: none !important; }
|
101
|
-
|
102
|
-
td:has(.input:focus) {
|
103
|
-
border-bottom: 1px solid var(--bulma-success) !important; }
|
74
|
+
border-radius: 0; }
|
104
75
|
|
105
76
|
select {
|
106
|
-
|
107
|
-
border-right: transparent !important;
|
108
|
-
border-left: transparent !important;
|
109
|
-
border-radius: 0 !important;
|
110
|
-
box-shadow: none !important;
|
111
|
-
font-weight: bold; }
|
77
|
+
box-shadow: none !important; }
|
112
78
|
|
113
79
|
select:focus {
|
114
80
|
box-shadow: none;
|
115
|
-
border
|
81
|
+
border: 1px solid var(--bulma-primary) !important; }
|
116
82
|
|
117
83
|
#detail-container {
|
118
84
|
flex-shrink: 0;
|
@@ -157,7 +123,7 @@ select:focus {
|
|
157
123
|
max-width: calc(var(--accrete-detail-width) - 6%); }
|
158
124
|
|
159
125
|
.list-entry > .box:hover, .box.selected {
|
160
|
-
box-shadow: 0 0 5px 2px var(--bulma-
|
126
|
+
box-shadow: 0 0 5px 2px var(--bulma-primary); }
|
161
127
|
|
162
128
|
.helptext {
|
163
129
|
font-style: italic !important;
|
@@ -190,11 +156,11 @@ select:focus {
|
|
190
156
|
table.can-compact * tr:first-child {
|
191
157
|
border-top: 1px solid var(--bulma-grey-light); }
|
192
158
|
|
193
|
-
table.can-compact * tr.is-
|
194
|
-
background-color: var(--bulma-
|
159
|
+
table.can-compact * tr.is-primary {
|
160
|
+
background-color: var(--bulma-primary); }
|
195
161
|
|
196
|
-
table.can-compact * tr.is-
|
197
|
-
background-color: var(--bulma-
|
162
|
+
table.can-compact * tr.is-primary:hover {
|
163
|
+
background-color: var(--bulma-primary) !important; }
|
198
164
|
|
199
165
|
table.can-compact > thead {
|
200
166
|
display: none; }
|
@@ -239,11 +205,11 @@ select:focus {
|
|
239
205
|
z-index: 40;
|
240
206
|
box-shadow: 2px 0 20px 0 var(--bulma-grey-light); } }
|
241
207
|
.menu-list a.is-active, .menu-list a.is-selected, .menu-list button.is-active, .menu-list button.is-selected, .menu-list .menu-item.is-active, .menu-list .menu-item.is-selected {
|
242
|
-
--bulma-menu-item-h: var(--bulma-
|
243
|
-
--bulma-menu-item-s: var(--bulma-
|
244
|
-
--bulma-menu-item-l: var(--bulma-
|
245
|
-
--bulma-menu-item-background-l: var(--bulma-
|
246
|
-
--bulma-menu-item-color-l: var(--bulma-
|
208
|
+
--bulma-menu-item-h: var(--bulma-primary-h);
|
209
|
+
--bulma-menu-item-s: var(--bulma-primary-s);
|
210
|
+
--bulma-menu-item-l: var(--bulma-primary-l);
|
211
|
+
--bulma-menu-item-background-l: var(--bulma-primary-l);
|
212
|
+
--bulma-menu-item-color-l: var(--bulma-primary-invert-l); }
|
247
213
|
|
248
214
|
.hoverable *:hover {
|
249
215
|
background-color: var(--accrete-hover-color); }
|
@@ -0,0 +1,7 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"mappings": "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",
|
4
|
+
"sources": ["accrete.scss"],
|
5
|
+
"names": [],
|
6
|
+
"file": "accrete.css"
|
7
|
+
}
|