From 3ab95e9b5658374169b2e4ac6cdd93f89764a7b2 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sat, 21 Jun 2025 18:35:34 +0300 Subject: [PATCH] Features: 1) Added icons, divider titles, priorities, and hide settings to apps; 2) Introduced Daisy settings file for customizable UI configuration; 3) Implemented new CSS styles for paginator component with hover and active states. Fixes: 1) Updated AutoSlugField to enhance slug generation logic in core models. Extra: 1) Removed redundant Daisy settings from base configurations; 2) Minor code cleanup and organization. --- blog/apps.py | 4 +++ core/apps.py | 4 +++ core/models.py | 4 +-- core/static/css/constance.css | 23 +++++++++++++ evibes/settings/__init__.py | 1 + evibes/settings/base.py | 65 ----------------------------------- evibes/settings/daisy.py | 41 ++++++++++++++++++++++ payments/apps.py | 4 +++ vibes_auth/apps.py | 4 +++ 9 files changed, 83 insertions(+), 67 deletions(-) create mode 100644 core/static/css/constance.css create mode 100644 evibes/settings/daisy.py diff --git a/blog/apps.py b/blog/apps.py index 3ae7a64e..cc870e6b 100644 --- a/blog/apps.py +++ b/blog/apps.py @@ -6,6 +6,10 @@ class BlogConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "blog" verbose_name = _("blog") + icon = "fa fa-solid fa-book" + divider_title = _("eVibes Engine") + priority = 86 + hide = False # noinspection PyUnresolvedReferences def ready(self): diff --git a/core/apps.py b/core/apps.py index 6b2a3247..e4a25f5d 100644 --- a/core/apps.py +++ b/core/apps.py @@ -6,6 +6,10 @@ class CoreConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "core" verbose_name = _("core") + icon = "fa fa-solid fa-star" + divider_title = _("eVibes Engine") + priority = 88 + hide = False # noinspection PyUnresolvedReferences def ready(self): diff --git a/core/models.py b/core/models.py index bcedb6c6..9eedd3e7 100644 --- a/core/models.py +++ b/core/models.py @@ -214,7 +214,7 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): ) slug: str = AutoSlugField( # type: ignore - populate_from=("name",), + populate_from=("name", "parent__slug"), allow_unicode=True, unique=True, editable=False, @@ -355,7 +355,7 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): verbose_name=_("part number"), ) slug: str | None = AutoSlugField( # type: ignore - populate_from=("category__slug", "brand__slug", "name", "uuid"), + populate_from=("uuid", "category__slug", "brand__slug", "name"), allow_unicode=True, unique=True, editable=False, diff --git a/core/static/css/constance.css b/core/static/css/constance.css new file mode 100644 index 00000000..ffc37adb --- /dev/null +++ b/core/static/css/constance.css @@ -0,0 +1,23 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer components { + .paginator.sticky-footer input.default { + @apply btn btn-primary; + @apply shadow-md; + padding: 0.5rem 1rem; + border-radius: 0.375rem; + transition: background-color 0.2s, transform 0.1s; + } + + .paginator.sticky-footer input.default:hover { + @apply btn-primary; + transform: translateY(-1px); + } + + .paginator.sticky-footer input.default:active { + transform: translateY(0); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } +} diff --git a/evibes/settings/__init__.py b/evibes/settings/__init__.py index 37041f6b..74696a6d 100644 --- a/evibes/settings/__init__.py +++ b/evibes/settings/__init__.py @@ -2,6 +2,7 @@ from .caches import * # noqa: F403 from .celery import * # noqa: F403 from .constance import * # noqa: F403 from .csp import * # noqa: F403 +from .daisy import * # noqa: F403 from .database import * # noqa: F403 from .dbbackup import * # noqa: F403 from .drf import * # noqa: F403 diff --git a/evibes/settings/base.py b/evibes/settings/base.py index 9ba6f040..75f05b49 100644 --- a/evibes/settings/base.py +++ b/evibes/settings/base.py @@ -274,71 +274,6 @@ INTERNAL_IPS: list[str] = [ "127.0.0.1", ] -DAISY_SETTINGS: dict = { - "SITE_LOGO": "/static/favicon.ico", - "EXTRA_STYLES": [], - "EXTRA_SCRIPTS": [], - "LOAD_FULL_STYLES": True, - "SHOW_CHANGELIST_FILTER": True, - "DONT_SUPPORT_ME": True, - "SIDEBAR_FOOTNOTE": "eVibes by Wiseless", - "APPS_REORDER": { - "django_celery_results": { - "hide": True, - "app": "django_celery_results", - }, - "django_celery_beat": { - "icon": "fa fa-solid fa-timeline", - "hide": False, - "app": "django_celery_beat", - "priority": 0, - "apps": "", - }, - "django_mailbox": { - "icon": "fa fa-solid fa-envelope", - "hide": False, - "app": "django_mailbox", - "priority": 1, - "apps": "", - }, - "payments": { - "icon": "fa fa-solid fa-wallet", - "hide": False, - "app": "payments", - "priority": 2, - "apps": "", - }, - "django_summernote": { - "icon": "fa fa-solid fa-note-sticky", - "hide": False, - "app": "payments", - "priority": 3, - "apps": "", - }, - "blog": { - "icon": "fa fa-solid fa-book", - "hide": False, - "app": "blog", - "priority": 4, - "apps": "", - }, - "core": { - "icon": "fa fa-solid fa-house", - "hide": False, - "app": "core", - "priority": 5, - "apps": "", - }, - "vibes_auth": { - "icon": "fa fa-solid fa-user", - "hide": False, - "app": "vibes_auth", - "priority": 6, - "apps": "", - }, - }, -} - if getenv("SENTRY_DSN"): import sentry_sdk from sentry_sdk.integrations.celery import CeleryIntegration diff --git a/evibes/settings/daisy.py b/evibes/settings/daisy.py new file mode 100644 index 00000000..335d4fdf --- /dev/null +++ b/evibes/settings/daisy.py @@ -0,0 +1,41 @@ +from django.utils.translation import gettext_lazy as _ + +DAISY_SETTINGS: dict = { + "SITE_LOGO": "/static/favicon.ico", + "EXTRA_STYLES": [ + "core/css/constance.css", + ], + "EXTRA_SCRIPTS": [], + "SHOW_CHANGELIST_FILTER": True, + "DONT_SUPPORT_ME": True, + "SIDEBAR_FOOTNOTE": "eVibes by Wiseless", + "LOAD_FULL_STYLES": True, + "APPS_REORDER": { + "django_celery_results": { + "hide": True, + "app": "django_celery_results", + "divider_title": _("eVibes System"), + }, + "django_celery_beat": { + "icon": "fa fa-solid fa-timeline", + "hide": False, + "app": "django_celery_beat", + "priority": 0, + "divider_title": _("eVibes System"), + }, + "django_mailbox": { + "icon": "fa fa-solid fa-envelope", + "hide": False, + "app": "django_mailbox", + "priority": 1, + "divider_title": _("eVibes System"), + }, + "django_summernote": { + "icon": "fa fa-solid fa-note-sticky", + "hide": False, + "app": "django_summernote", + "priority": 2, + "divider_title": _("eVibes System"), + }, + }, +} diff --git a/payments/apps.py b/payments/apps.py index 1c05c589..46580ace 100644 --- a/payments/apps.py +++ b/payments/apps.py @@ -6,6 +6,10 @@ class PaymentsConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "payments" verbose_name = _("payments") + icon = "fa fa-solid fa-star" + divider_title = _("eVibes Engine") + priority = 87 + hide = False def ready(self): import payments.signals # noqa: F401 diff --git a/vibes_auth/apps.py b/vibes_auth/apps.py index ba2658cc..602876dd 100644 --- a/vibes_auth/apps.py +++ b/vibes_auth/apps.py @@ -6,6 +6,10 @@ class VibesAuthConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "vibes_auth" verbose_name = _("authentication") + icon = "fa fa-solid fa-user" + divider_title = _("eVibes Auth") + priority = 89 + hide = False def ready(self): import vibes_auth.signals # noqa: F401