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.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-06-21 18:35:34 +03:00
parent 3cb6576258
commit 3ab95e9b56
9 changed files with 83 additions and 67 deletions

View file

@ -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):

View file

@ -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):

View file

@ -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,

View file

@ -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);
}
}

View file

@ -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

View file

@ -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

41
evibes/settings/daisy.py Normal file
View file

@ -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"),
},
},
}

View file

@ -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

View file

@ -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