Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
b47efd5
added base wizard view with step class
MartinCervenkaSB Mar 30, 2026
aefb18c
autocomplete create on enter
MartinCervenkaSB Mar 30, 2026
7da4b2f
bump version
MartinCervenkaSB Mar 30, 2026
40a66fd
refactor formset js
MartinCervenkaSB Apr 1, 2026
298b2f3
bump b version
MartinCervenkaSB Apr 1, 2026
0768144
bump version
MartinCervenkaSB Apr 2, 2026
a905ae7
fix dark mode handling for pages without color picker
MartinCervenkaSB Apr 7, 2026
a9e7a5a
updated sprite
MartinCervenkaSB Apr 7, 2026
acb346a
added SBAdminTextTagsWidget
MartinCervenkaSB Apr 7, 2026
ebbaee1
missing template
MartinCervenkaSB Apr 7, 2026
67f766a
bump beta version
MartinCervenkaSB Apr 7, 2026
b03af45
fix multipart form context
MartinCervenkaSB Apr 8, 2026
76bf569
fixed icon names
MartinCervenkaSB Apr 8, 2026
ecdcebd
move property to top
MartinCervenkaSB Apr 8, 2026
5ae0697
fix tooltip initialization after htmx swap and when formset is added
MartinCervenkaSB Apr 9, 2026
3330227
added option to disable empty option in select widget - disabled by d…
MartinCervenkaSB Apr 14, 2026
a2f0a5d
bump beta version
MartinCervenkaSB Apr 14, 2026
96dee68
black
MartinCervenkaSB Apr 14, 2026
5a4b08f
feat: added option to define own SBAdminSite in same way as default d…
mihalikv Apr 15, 2026
1263399
added missing badge types
MartinCervenkaSB Apr 15, 2026
b67f3ae
fix sb_admin_site import
MartinCervenkaSB Apr 15, 2026
fa9df0b
triv: fixed style and allow to use with django 6
mihalikv Apr 15, 2026
9e26c73
new icons
MartinCervenkaSB Apr 15, 2026
842698c
triv: added cs and de translations
mihalikv Apr 15, 2026
e613f7e
triv: bump up release
mihalikv Apr 15, 2026
f7eef61
update poetry lock
MartinCervenkaSB Apr 15, 2026
7563861
triv: bump up release update code with django 6 syntax
mihalikv Apr 15, 2026
b16b95c
triv: bump up release update code with django 6 syntax
mihalikv Apr 15, 2026
18bf035
added new icon and show action icons in detail action
MartinCervenkaSB Apr 16, 2026
15fc15b
feat: automatically focus input in select and allow forward also for …
mihalikv Apr 16, 2026
f529218
triv: bump up release
mihalikv Apr 16, 2026
62aecc6
feat: added translations in autocomplete.js
mihalikv Apr 16, 2026
0afcd10
added primary badge type
MartinCervenkaSB Apr 20, 2026
aa1697a
Merge branch 'main' into dev_wizard
MartinCervenkaSB Apr 20, 2026
4898a55
updated AGENTS.md
MartinCervenkaSB Apr 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
413 changes: 410 additions & 3 deletions AGENTS.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 10 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,32 @@ license = "MIT"
homepage = "https://smartbase-sk.github.io/django-smartbase-admin-docs/"
repository = "https://github.com/SmartBase-SK/django-smartbase-admin"
include = [
"**/static/sb_admin/dist/**/*"
"**/static/sb_admin/dist/**/*",
"**/static/sb_admin/js/wizard_formset.js",
]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: Web Environment",
"Framework :: Django",
"Framework :: Django :: 4.1",
"Framework :: Django :: 4.2",
"Framework :: Django :: 5.0",
"Framework :: Django :: 5.1",
"Framework :: Django :: 6.0",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13"
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14"
]

[tool.poetry.dependencies]
python = "^3.10"
django = ">= 4.1, < 6.0"
django = ">= 4.1, < 7.0"
django-ckeditor = "^6.7.1"
django-admin-inline-paginator = "^0.4.0"
django-nested-admin = "^4.1.1"
Expand Down
2 changes: 1 addition & 1 deletion src/django_smartbase_admin/actions/advanced_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ def from_filter_widget(cls, filter_widget: "SBAdminFilterWidget"):
"filter_widget": filter_widget_for_context,
"prefix_to_replace": QB_JS_PREFIX,
},
).replace("</script>", "<\/script>"),
).replace("</script>", r"<\/script>"),
)


Expand Down
17 changes: 13 additions & 4 deletions src/django_smartbase_admin/admin/admin_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,10 +337,19 @@ def __init__(self, *args, **kwargs):
)
super().__init__(*args, **kwargs)
self.init_widgets_dynamic(threadsafe_request)
for field in self.declared_fields:
form_field = self.fields.get(field)
if form_field:
self.assign_widget_to_form_field(form_field, request=threadsafe_request)
model = getattr(getattr(self, "_meta", None), "model", None)
for field_name, form_field in self.fields.items():
db_field = None
if model is not None:
try:
db_field = model._meta.get_field(field_name)
except FieldDoesNotExist:
db_field = None
self.assign_widget_to_form_field(
form_field,
db_field=db_field,
request=threadsafe_request,
)

def init_widgets_dynamic(self, request):
for field in self.fields:
Expand Down
19 changes: 17 additions & 2 deletions src/django_smartbase_admin/admin/site.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import login_not_required
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
from django.urls import path, reverse_lazy, URLPattern, URLResolver, reverse
from django.urls import URLPattern, URLResolver, path, reverse, reverse_lazy
from django.utils.decorators import method_decorator
from django.utils.functional import LazyObject
from django.utils.module_loading import import_string
from django.utils.translation import gettext_lazy as _
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
Expand Down Expand Up @@ -248,4 +250,17 @@ def login(self, request: HttpRequest, extra_context: dict[str, Any] | None = Non
)


sb_admin_site = SBAdminSite(name="sb_admin")
class DefaultAdminSite(LazyObject):
def _setup(self):
from django.apps import apps

AdminSiteClass = import_string(
apps.get_app_config("django_smartbase_admin").default_site
)
self._wrapped = AdminSiteClass(name="sb_admin")

def __repr__(self):
return repr(self._wrapped)


sb_admin_site = DefaultAdminSite()
44 changes: 42 additions & 2 deletions src/django_smartbase_admin/admin/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,22 @@ def __init__(self, form_field=None, attrs=None):
super().__init__(form_field, attrs={"class": "input", **(attrs or {})})


class SBAdminTextTagsWidget(SBAdminBaseWidget, forms.TextInput):
template_name = "sb_admin/widgets/text_tags.html"
input_type = "text"

def __init__(self, form_field=None, attrs=None, *, delimiter: str = ","):
super().__init__(
form_field,
attrs={
"class": "input js-sbadmin-text-tags",
"data-choices-delimiter": delimiter,
"autocomplete": "off",
**(attrs or {}),
},
)


class SBAdminPasswordInputWidget(SBAdminBaseWidget, forms.PasswordInput):
template_name = "sb_admin/widgets/password.html"

Expand Down Expand Up @@ -193,11 +209,35 @@ class SBAdminSelectWidget(SBAdminBaseWidget, forms.Select):
template_name = "sb_admin/widgets/select.html"
option_template_name = "sb_admin/widgets/select_option.html"

def __init__(self, form_field=None, attrs=None, choices=()):
def __init__(
self,
form_field=None,
attrs=None,
choices=(),
disable_empty_option=True,
):
self.disable_empty_option = disable_empty_option
super().__init__(
form_field, attrs={"class": "input", **(attrs or {})}, choices=choices
)

def create_option(
self, name, value, label, selected, index, subindex=None, attrs=None
):
option = super().create_option(
name, value, label, selected, index, subindex=subindex, attrs=attrs
)
if (
self.disable_empty_option
and (value is None or str(value) == "")
and self.form_field is not None
and getattr(self.form_field, "required", False)
):
option_attrs = dict(option.get("attrs") or {})
option_attrs["disabled"] = True
option["attrs"] = option_attrs
return option


class SBAdminRadioWidget(SBAdminBaseWidget, forms.RadioSelect):
template_name = "sb_admin/widgets/radio.html"
Expand Down Expand Up @@ -888,7 +928,7 @@ class Media:
"sb_admin/js/codemirror/codemirror.min.js",
"sb_admin/js/codemirror/overlay.min.js",
"sb_admin/js/codemirror/django.min.js",
"sb_admin/src/js/code.js",
"sb_admin/js/code.js",
]


Expand Down
4 changes: 2 additions & 2 deletions src/django_smartbase_admin/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
from django.utils.module_loading import autodiscover_modules
from django.conf import settings

from django_smartbase_admin.admin.site import sb_admin_site


class SBAdminConfig(AppConfig):
name = "django_smartbase_admin"
default_auto_field = "django.db.models.AutoField"
default_site = "django_smartbase_admin.admin.site.SBAdminSite"

def ready(self):
super().ready()
from .monkeypatch import fake_inline_monkeypatch
from .monkeypatch import admin_readonly_field_monkeypatch
from django_smartbase_admin.admin.site import sb_admin_site

if settings.SB_ADMIN_CONFIGURATION:
autodiscover_modules("sb_admin", register_to=sb_admin_site)
10 changes: 10 additions & 0 deletions src/django_smartbase_admin/compilemessages.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@
DEBUG=True,
LANGUAGES=[
("sk", "Slovak"),
("en", "English"),
("de", "German"),
("cs", "Czech"),
("hu", "Hungarian"),
("ro", "Romanian"),
("sl", "Slovenian"),
("hr", "Croatian"),
("fr", "French"),
("pl", "Polish"),
("it", "Italian"),
],
USE_I18N=True,
USE_L10N=True,
Expand Down
3 changes: 3 additions & 0 deletions src/django_smartbase_admin/engine/field_formatter.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ class BadgeType(Enum):
NOTICE = "notice"
WARNING = "warning"
ERROR = "negative"
NEUTRAL = "neutral"
POSITIVE = "positive"
PRIMARY = "primary"


def datetime_formatter(object_id, value):
Expand Down
Binary file not shown.
Loading
Loading