accrete 0.0.138__tar.gz → 0.0.140__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.138 → accrete-0.0.140}/PKG-INFO +1 -1
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/__init__.py +2 -1
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/context.py +7 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/filter.py +0 -2
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/form_error.html +1 -1
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/layout.html +1 -1
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/list.html +5 -5
- accrete-0.0.140/accrete/contrib/ui/templates/ui/message.html +14 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/modal.html +2 -2
- accrete-0.0.140/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +23 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/models.py +10 -10
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/views.py +2 -2
- accrete-0.0.140/accrete/migrations/0006_alter_member_user.py +21 -0
- accrete-0.0.140/accrete/migrations/0007_accessgroup_description.py +18 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/models.py +7 -1
- {accrete-0.0.138 → accrete-0.0.140}/accrete/tenant.py +10 -6
- {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/views.py +3 -6
- {accrete-0.0.138 → accrete-0.0.140}/accrete/views.py +17 -9
- {accrete-0.0.138 → accrete-0.0.140}/pyproject.toml +1 -1
- accrete-0.0.138/accrete/contrib/ui/templates/ui/message.html +0 -13
- {accrete-0.0.138 → accrete-0.0.140}/.gitignore +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/LICENSE +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/README.md +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/config.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/context_processors.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/models.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/config.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/helper.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/models.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/queries.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/signals.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/views.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/forms.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/models.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/queries.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/views.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/forms.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/models.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/tasks.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/views.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/middleware.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/models.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/README.md +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/package.json +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/.sass-cache/15adf1eed05371361b08787c918a7f18fc15be79/accrete.scssc +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/accrete.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/accrete.css.map +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/accrete.scss +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/fa.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/icons.css +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/filter.js +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/oob.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/table.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templatetags/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templatetags/ui.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/urls.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/utils.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/views.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/widgets/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/widgets/search_select.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/auth_backends.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/forms.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/middleware.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/change_email.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/change_password.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/login.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/user_form.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/urls.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/admin.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/apps.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/config.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/forms.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/models.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/urls.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/views.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/fields.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/forms.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/managers.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/middleware.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0001_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0002_initial.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0003_remove_member_name.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/storage.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/tests.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/urls.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/__init__.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/dates.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/forms.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/log.py +0 -0
- {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/models.py +0 -0
@@ -1,7 +1,7 @@
|
|
1
1
|
{% load i18n %}
|
2
2
|
|
3
3
|
{% if form.non_field_errors or form.save_error %}
|
4
|
-
<div class="notification is-danger is-light">
|
4
|
+
<div class="notification is-danger is-light" style="word-wrap: break-word;">
|
5
5
|
{{ form.non_field_errors }}
|
6
6
|
{% if form.save_error %}
|
7
7
|
<p>{{ form.save_error }}</p>
|
@@ -203,7 +203,7 @@
|
|
203
203
|
<div id="content-right-header" class="is-flex is-flex-wrap-wrap">
|
204
204
|
{% block header_right %}{% endblock %}
|
205
205
|
</div>
|
206
|
-
<button class="button is-
|
206
|
+
<button class="button is-light is-align-self-baseline m-1" style="border-radius: var(--bulma-radius-medium)" x-on:click="showContentRight = false;">
|
207
207
|
<span class="icon"><i class="fa fa-xmark"></i></span>
|
208
208
|
</button>
|
209
209
|
</div>
|
@@ -10,11 +10,11 @@
|
|
10
10
|
<div id="list-entry-{{ object.pk }}" class="list-entry cell pb-0" style="height: {{ column_height }}{{ column_height_unit }}">
|
11
11
|
<div class="box p-3"
|
12
12
|
style="word-break: break-word; height: 100%; overflow-y: auto; {% if object.get_absolute_url %}cursor:pointer;{% endif %}"
|
13
|
-
{% if object.get_absolute_url %}
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
{%
|
13
|
+
{% if object.get_absolute_url and detail_enabled %}
|
14
|
+
hx-get="{{ object.get_absolute_url }}{% querystring %}" hx-target="#content-right-header" hx-select="#content-right-header" hx-select-oob="#content-right" hx-swap="outerHTML"
|
15
|
+
x-on:click="$dispatch('unselect-list-entry'); showContentRight = true; selected = true; $nextTick(() => { $el.scrollIntoView( {block: 'nearest'} ) });" x-bind:class="selected ? 'box selected' : ''"
|
16
|
+
{% elif object.get_absolute_url and not detail_enabled %}
|
17
|
+
hx-get="{{ object.get_absolute_url }}{% querystring %}" hx-target="body" hx-push-url="true"
|
18
18
|
{% endif %}
|
19
19
|
x-data="{selected: false}" @unselect-list-entry.window="selected = false"
|
20
20
|
>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{% load ui %}
|
2
|
+
|
3
|
+
{% if messages %}
|
4
|
+
{% for message in messages %}
|
5
|
+
<div hx-swap-oob="{% if append %}beforeend:#message{% else %}innerHTML:#message{% endif %}">
|
6
|
+
<div class="mb-2" style="min-width: 340px; max-width: 340px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; {% if not persistent %}setTimeout(() => show = false, 4000){% endif %}" x-transition.duration.200ms>
|
7
|
+
<div class="notification has-text-centered {{ message|message_class }}">
|
8
|
+
{% if persistent %}<button class="delete" x-on:click="show = false;"></button>{% endif %}
|
9
|
+
{{ message }}
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
{% endfor %}
|
14
|
+
{% endif %}
|
@@ -12,10 +12,10 @@
|
|
12
12
|
<button id="{{ modal_id }}-background" class="modal-background" @click="$dispatch('close-modal-{{ modal_id }}')" style="cursor: default"></button>
|
13
13
|
<div class="modal-card" x-show="showModal" x-transition.duration.200ms x-init="$nextTick(() => {showModal = true;})" >
|
14
14
|
<header class="modal-card-head">
|
15
|
-
<p class="modal-card-title">
|
15
|
+
<p class="modal-card-title is-flex-shrink-1">
|
16
16
|
{{ title }}
|
17
17
|
</p>
|
18
|
-
<button class="delete" aria-label="close" @click="$dispatch('close-modal-{{ modal_id }}')"></button>
|
18
|
+
<button class="delete is-align-self-baseline" aria-label="close" @click="$dispatch('close-modal-{{ modal_id }}')"></button>
|
19
19
|
</header>
|
20
20
|
<section class="modal-card-body">
|
21
21
|
{% block modal_content %}{% endblock %}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Generated by Django 5.1.7 on 2025-03-23 08:11
|
2
|
+
|
3
|
+
import accrete.contrib.user.models
|
4
|
+
from django.db import migrations, models
|
5
|
+
|
6
|
+
|
7
|
+
class Migration(migrations.Migration):
|
8
|
+
|
9
|
+
dependencies = [
|
10
|
+
('user', '0007_user_managed_login'),
|
11
|
+
]
|
12
|
+
|
13
|
+
operations = [
|
14
|
+
migrations.RemoveConstraint(
|
15
|
+
model_name='user',
|
16
|
+
name='no_email_for_managed_user',
|
17
|
+
),
|
18
|
+
migrations.AlterField(
|
19
|
+
model_name='user',
|
20
|
+
name='language_code',
|
21
|
+
field=models.CharField(blank=True, default=accrete.contrib.user.models.default_language_code, max_length=10, null=True, verbose_name='Language'),
|
22
|
+
),
|
23
|
+
]
|
@@ -35,6 +35,10 @@ def validate_member_login(login: str) -> None:
|
|
35
35
|
raise ValidationError(message)
|
36
36
|
|
37
37
|
|
38
|
+
def default_language_code():
|
39
|
+
return settings.LANGUAGE_CODE
|
40
|
+
|
41
|
+
|
38
42
|
class UserManager(BaseUserManager):
|
39
43
|
use_in_migrations = True
|
40
44
|
|
@@ -87,11 +91,6 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|
87
91
|
name='email_or_login_set',
|
88
92
|
violation_error_message='E-Mail or Login must be set'
|
89
93
|
),
|
90
|
-
models.CheckConstraint(
|
91
|
-
condition=Q(is_managed=False, email__isnull=False) | Q(is_managed=True, email__isnull=True),
|
92
|
-
name='no_email_for_managed_user',
|
93
|
-
violation_error_message='Managed users must not have an E-Mail address'
|
94
|
-
),
|
95
94
|
models.CheckConstraint(
|
96
95
|
condition=Q(is_managed=True, login__isnull=False) | Q(is_managed=False),
|
97
96
|
name='managed_login',
|
@@ -99,10 +98,6 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|
99
98
|
)
|
100
99
|
]
|
101
100
|
|
102
|
-
filter_exclude = [
|
103
|
-
'password'
|
104
|
-
]
|
105
|
-
|
106
101
|
username_validator = UnicodeUsernameValidator()
|
107
102
|
login_validator = validate_member_login
|
108
103
|
|
@@ -178,7 +173,8 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|
178
173
|
verbose_name=_('Language'),
|
179
174
|
max_length=10,
|
180
175
|
null=True,
|
181
|
-
blank=True
|
176
|
+
blank=True,
|
177
|
+
default=default_language_code
|
182
178
|
)
|
183
179
|
|
184
180
|
theme = models.CharField(
|
@@ -211,3 +207,7 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|
211
207
|
def all_tenants(self):
|
212
208
|
tenants = Tenant.objects.filter(members__user=self)
|
213
209
|
return tenants
|
210
|
+
|
211
|
+
@staticmethod
|
212
|
+
def exclude_from_filter():
|
213
|
+
return ['password']
|
@@ -80,7 +80,7 @@ def user_change_password(request):
|
|
80
80
|
+ f'?{request.GET.urlencode()}'
|
81
81
|
)
|
82
82
|
ctx.update(form=form)
|
83
|
-
return ui.modal_response(request, 'user/change_password.html', ctx)
|
83
|
+
return ui.modal_response(request, 'user/change_password.html', ctx, update=True)
|
84
84
|
return render(request, 'user/change_password.html', ctx)
|
85
85
|
|
86
86
|
|
@@ -103,5 +103,5 @@ def user_change_email(request):
|
|
103
103
|
if form.is_saved:
|
104
104
|
return redirect('user:detail')
|
105
105
|
ctx.update(form=form)
|
106
|
-
return ui.modal_response(request, 'user/change_email.html', ctx)
|
106
|
+
return ui.modal_response(request, 'user/change_email.html', ctx, update=True)
|
107
107
|
return render(request, 'user/change_email.html', ctx)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Generated by Django 5.1.7 on 2025-03-23 10:21
|
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
|
+
dependencies = [
|
11
|
+
('accrete', '0005_accessgroup_apply_on_alter_member_access_groups_and_more'),
|
12
|
+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
13
|
+
]
|
14
|
+
|
15
|
+
operations = [
|
16
|
+
migrations.AlterField(
|
17
|
+
model_name='member',
|
18
|
+
name='user',
|
19
|
+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to=settings.AUTH_USER_MODEL),
|
20
|
+
),
|
21
|
+
]
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated by Django 5.1.7 on 2025-03-31 20:23
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
|
8
|
+
dependencies = [
|
9
|
+
('accrete', '0006_alter_member_user'),
|
10
|
+
]
|
11
|
+
|
12
|
+
operations = [
|
13
|
+
migrations.AddField(
|
14
|
+
model_name='accessgroup',
|
15
|
+
name='description',
|
16
|
+
field=models.TextField(blank=True, null=True, verbose_name='Description'),
|
17
|
+
),
|
18
|
+
]
|
@@ -90,7 +90,7 @@ class Member(models.Model):
|
|
90
90
|
user = models.ForeignKey(
|
91
91
|
to=settings.AUTH_USER_MODEL,
|
92
92
|
related_name='memberships',
|
93
|
-
on_delete=models.
|
93
|
+
on_delete=models.CASCADE
|
94
94
|
)
|
95
95
|
|
96
96
|
tenant = models.ForeignKey(
|
@@ -136,6 +136,12 @@ class AccessGroup(models.Model):
|
|
136
136
|
max_length=255
|
137
137
|
)
|
138
138
|
|
139
|
+
description = models.TextField(
|
140
|
+
verbose_name=_('Description'),
|
141
|
+
null=True,
|
142
|
+
blank=True
|
143
|
+
)
|
144
|
+
|
139
145
|
code = models.CharField(
|
140
146
|
verbose_name=_('Code'),
|
141
147
|
max_length=100
|
@@ -39,11 +39,6 @@ class Unscoped:
|
|
39
39
|
self.tenant = tenant
|
40
40
|
|
41
41
|
def __enter__(self):
|
42
|
-
if self.tenant is None:
|
43
|
-
_logger.warning(
|
44
|
-
'Entering unscoped context manager with tenant already set to None!',
|
45
|
-
stack_info=True
|
46
|
-
)
|
47
42
|
set_tenant(False)
|
48
43
|
|
49
44
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
@@ -57,7 +52,7 @@ def unscoped():
|
|
57
52
|
def per_tenant(include: Q = None, exclude: Q = None):
|
58
53
|
def decorator(f):
|
59
54
|
def wrapper(*args, **kwargs):
|
60
|
-
tenants
|
55
|
+
tenants = apps.get_model('accrete', 'Tenant').objects.all()
|
61
56
|
if include is not None:
|
62
57
|
tenants = tenants.filter(include)
|
63
58
|
if exclude is not None:
|
@@ -74,6 +69,15 @@ def per_tenant(include: Q = None, exclude: Q = None):
|
|
74
69
|
return decorator
|
75
70
|
|
76
71
|
|
72
|
+
def unscope():
|
73
|
+
def decorator(f):
|
74
|
+
def wrapper(*args, **kwargs):
|
75
|
+
with unscoped():
|
76
|
+
f(*args, **kwargs)
|
77
|
+
return wrapper
|
78
|
+
return decorator
|
79
|
+
|
80
|
+
|
77
81
|
def tenant_has_group(access_group_code: str) -> bool:
|
78
82
|
tenant = get_tenant()
|
79
83
|
if not tenant:
|
@@ -141,8 +141,7 @@ def method_not_allowed(method: str, allowed: list[str]) -> HttpResponseNotAllowe
|
|
141
141
|
def render_templates(
|
142
142
|
templates: list[str | tuple[str, dict]],
|
143
143
|
context: dict = None,
|
144
|
-
request=None
|
145
|
-
log_not_found: bool = False
|
144
|
+
request=None
|
146
145
|
) -> str:
|
147
146
|
context = {} if context is None else context
|
148
147
|
content = ''
|
@@ -150,13 +149,11 @@ def render_templates(
|
|
150
149
|
if isinstance(template, tuple):
|
151
150
|
template_name, template_context = template
|
152
151
|
else:
|
153
|
-
template_name = template
|
154
|
-
template_context = context
|
152
|
+
template_name, template_context = template, context
|
155
153
|
try:
|
156
154
|
content += render_to_string(template_name, template_context, request)
|
157
155
|
except TemplateDoesNotExist as e:
|
158
|
-
|
159
|
-
_logger.warning(repr(e))
|
156
|
+
_logger.warning(repr(e))
|
160
157
|
except Exception as e:
|
161
158
|
_logger.exception(repr(e))
|
162
159
|
raise e
|
@@ -1,29 +1,34 @@
|
|
1
1
|
import os
|
2
|
-
from enum import Enum
|
3
2
|
from functools import wraps
|
4
3
|
from django.http import HttpResponse, HttpResponseNotFound
|
5
4
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
6
5
|
from django.contrib.auth.views import login_required
|
7
6
|
from django.core.exceptions import ImproperlyConfigured
|
8
|
-
from django.shortcuts import redirect, get_object_or_404
|
7
|
+
from django.shortcuts import redirect, get_object_or_404, resolve_url
|
9
8
|
from django.conf import settings
|
10
9
|
from accrete.models import Tenant, Member
|
11
10
|
from accrete.tenant import get_tenant, tenant_has_group, member_has_group
|
12
|
-
from
|
11
|
+
from accrete import config
|
13
12
|
|
14
13
|
|
15
14
|
class TenantRequiredMixin(LoginRequiredMixin):
|
16
15
|
|
16
|
+
# Redirect to the specified url if the group check fails
|
17
17
|
TENANT_NOT_SET_URL = None
|
18
18
|
GROUP_NOT_SET_URL = None
|
19
|
+
|
20
|
+
# If set, one of the supplied groups must be present on the
|
21
|
+
# tenant or member respectively. If the list item is of type tuple,
|
22
|
+
# all the groups in the tuple must be present.
|
19
23
|
TENANT_GROUPS: list[str | tuple[str]] = []
|
20
24
|
MEMBER_GROUPS: list[str | tuple[str]] = []
|
21
25
|
|
22
26
|
def dispatch(self, request, *args, **kwargs):
|
23
27
|
res = super().dispatch(request, *args, **kwargs)
|
24
|
-
|
25
|
-
if not tenant:
|
28
|
+
if not self.get_tenant():
|
26
29
|
return self.handle_tenant_not_set()
|
30
|
+
if self.request.user.is_superuser:
|
31
|
+
return res
|
27
32
|
if not self.check_tenant_group():
|
28
33
|
return self.handle_tenant_group_not_set()
|
29
34
|
if not self.check_member_group():
|
@@ -31,7 +36,10 @@ class TenantRequiredMixin(LoginRequiredMixin):
|
|
31
36
|
return res
|
32
37
|
|
33
38
|
def handle_tenant_not_set(self):
|
34
|
-
return redirect(
|
39
|
+
return redirect(
|
40
|
+
resolve_url(self.get_tenant_not_set_url())
|
41
|
+
+ f'?next={self.request.get_full_path_info()}'
|
42
|
+
)
|
35
43
|
|
36
44
|
def handle_tenant_group_not_set(self):
|
37
45
|
return redirect(self.get_group_not_set_url())
|
@@ -41,8 +49,8 @@ class TenantRequiredMixin(LoginRequiredMixin):
|
|
41
49
|
|
42
50
|
def get_tenant_not_set_url(self):
|
43
51
|
tenant_not_set_url = (
|
44
|
-
|
45
|
-
|
52
|
+
self.TENANT_NOT_SET_URL
|
53
|
+
or config.ACCRETE_TENANT_NOT_SET_URL
|
46
54
|
)
|
47
55
|
if not tenant_not_set_url:
|
48
56
|
cls_name = self.__class__.__name__
|
@@ -57,7 +65,7 @@ class TenantRequiredMixin(LoginRequiredMixin):
|
|
57
65
|
def get_group_not_set_url(self):
|
58
66
|
group_not_set_url = (
|
59
67
|
self.GROUP_NOT_SET_URL
|
60
|
-
or
|
68
|
+
or config.ACCRETE_GROUP_NOT_SET_URL
|
61
69
|
)
|
62
70
|
if not group_not_set_url:
|
63
71
|
cls_name = self.__class__.__name__
|
@@ -1,13 +0,0 @@
|
|
1
|
-
{% load ui %}
|
2
|
-
|
3
|
-
{% if messages %}
|
4
|
-
{% for message in messages %}
|
5
|
-
<div hx-swap-oob="beforeend:#message">
|
6
|
-
<div class="mb-2" style="min-width: 330px; max-width: 330px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; setTimeout(() => show = false, 4000)" x-transition.duration.200ms>
|
7
|
-
<div class="notification has-text-centered is-light {{ message|message_class }}">
|
8
|
-
<p>{{ message }}</p>
|
9
|
-
</div>
|
10
|
-
</div>
|
11
|
-
</div>
|
12
|
-
{% endfor %}
|
13
|
-
{% endif %}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py
RENAMED
File without changes
|
{accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0003_alter_country_options.py
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
|
{accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py
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
|
{accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py
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
|
{accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css
RENAMED
File without changes
|
File without changes
|
File without changes
|