From cdc2073ed927d93b8064205a122765c72fbd3272 Mon Sep 17 00:00:00 2001 From: Andrew Northall Date: Fri, 21 Jul 2023 17:37:03 +0100 Subject: [PATCH] Add django-unfold admin panel --- app/comments/admin.py | 9 ++++++--- app/core/admin.py | 5 ++++- app/logger/admin.py | 19 ++++++++++++++----- app/users/admin.py | 10 ++++++---- config/django/settings/base.py | 1 + config/requirements/development.txt | 1 + config/requirements/production.txt | 1 + 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/app/comments/admin.py b/app/comments/admin.py index 58333605..d029f2ca 100644 --- a/app/comments/admin.py +++ b/app/comments/admin.py @@ -1,8 +1,11 @@ -from comments.models import Comment -from django.contrib.admin import ModelAdmin, register +from django.contrib import admin +from unfold.admin import ModelAdmin -@register(Comment) +from .models import Comment + + +@admin.register(Comment) class CommentAdmin(ModelAdmin): list_display = ("author", "trip", "added") list_filter = ("added",) diff --git a/app/core/admin.py b/app/core/admin.py index b13ac6d7..2666f2ef 100644 --- a/app/core/admin.py +++ b/app/core/admin.py @@ -1,8 +1,11 @@ from django.conf import settings from django.contrib import admin +from unfold.admin import ModelAdmin + from .models import FAQ, News + # Set global admin site headers admin.site.site_header = "caves.app" admin.site.site_title = "caves.app" @@ -12,7 +15,7 @@ admin.site.site_title = "caves.app dev" -class AutoAssignAuthorModelAdmin(admin.ModelAdmin): +class AutoAssignAuthorModelAdmin(ModelAdmin): def save_model(self, request, obj, form, change): """Set the author to the current user if it is a new item""" if obj.author is None: diff --git a/app/logger/admin.py b/app/logger/admin.py index 2377f279..18c89b4f 100644 --- a/app/logger/admin.py +++ b/app/logger/admin.py @@ -2,6 +2,10 @@ from django.forms import ModelForm from logger.forms import DistanceUnitFormMixin +from distancefield import DistanceField +from unfold.admin import ModelAdmin, TabularInline +from unfold.widgets import UnfoldAdminTextInputWidget + from .models import Trip, TripPhoto, TripReport @@ -9,7 +13,7 @@ class TripAdminForm(DistanceUnitFormMixin, ModelForm): pass -class TripPhotoInline(admin.TabularInline): +class TripPhotoInline(TabularInline): model = TripPhoto fk_name = "trip" extra = 0 @@ -21,7 +25,7 @@ def has_add_permission(self, request, obj=None): return False -class TripReportInline(admin.TabularInline): +class TripReportInline(TabularInline): model = TripReport fk_name = "trip" extra = 0 @@ -34,7 +38,7 @@ def has_add_permission(self, request, obj=None): @admin.register(Trip) -class TripAdmin(admin.ModelAdmin): +class TripAdmin(ModelAdmin): form = TripAdminForm inlines = [TripPhotoInline, TripReportInline] search_fields = ( @@ -68,6 +72,11 @@ class TripAdmin(admin.ModelAdmin): "updated", ) ordering = ("-added",) + formfield_overrides = { + DistanceField: { + "widget": UnfoldAdminTextInputWidget, + } + } fieldsets = ( ( "Internal data", @@ -131,7 +140,7 @@ class TripAdmin(admin.ModelAdmin): @admin.register(TripPhoto) -class TripPhotoAdmin(admin.ModelAdmin): +class TripPhotoAdmin(ModelAdmin): list_display = ("user", "trip", "deleted_at", "taken", "added") list_display_links = ("taken",) list_filter = ("is_valid", "deleted_at", "added") @@ -169,7 +178,7 @@ class TripPhotoAdmin(admin.ModelAdmin): @admin.register(TripReport) -class TripReportAdmin(admin.ModelAdmin): +class TripReportAdmin(ModelAdmin): list_display = ("user", "title", "trip", "added") list_display_links = ("title",) list_filter = ("added", "updated", "pub_date") diff --git a/app/users/admin.py b/app/users/admin.py index bbddbfb2..6acdcbf8 100644 --- a/app/users/admin.py +++ b/app/users/admin.py @@ -2,13 +2,15 @@ from django.contrib.auth import get_user_model from django.contrib.auth.admin import UserAdmin as BaseUserAdmin +from unfold.admin import ModelAdmin, TabularInline + from .forms import UserAdminChangeForm, UserCreationForm from .models import FriendRequest, Notification User = get_user_model() -class NotificationInline(admin.TabularInline): +class NotificationInline(TabularInline): model = Notification readonly_fields = ["message", "url", "read"] can_delete = False @@ -16,7 +18,7 @@ class NotificationInline(admin.TabularInline): max_num = 0 -class FriendRequestSentInline(admin.TabularInline): +class FriendRequestSentInline(TabularInline): model = FriendRequest readonly_fields = ["user_from"] can_delete = False @@ -26,7 +28,7 @@ class FriendRequestSentInline(admin.TabularInline): max_num = 0 -class FriendRequestRecdInline(admin.TabularInline): +class FriendRequestRecdInline(TabularInline): model = FriendRequest readonly_fields = ["user_to"] can_delete = False @@ -37,7 +39,7 @@ class FriendRequestRecdInline(admin.TabularInline): @admin.register(User) -class CavingUserAdmin(BaseUserAdmin): +class CavingUserAdmin(BaseUserAdmin, ModelAdmin): inlines = [ NotificationInline, FriendRequestSentInline, diff --git a/config/django/settings/base.py b/config/django/settings/base.py index 4ce38df2..5bd54ffb 100644 --- a/config/django/settings/base.py +++ b/config/django/settings/base.py @@ -108,6 +108,7 @@ def env(name, default=None, force_type: Any = str): "crispy_bootstrap5", "django_htmx", "markdownify.apps.MarkdownifyConfig", + "unfold", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", diff --git a/config/requirements/development.txt b/config/requirements/development.txt index 2800d36a..7734d39f 100644 --- a/config/requirements/development.txt +++ b/config/requirements/development.txt @@ -16,6 +16,7 @@ django-rich==1.7.0 django-storages==1.13.2 django-timezone-field==5.1 django-tinymce==3.6.1 +django-unfold==0.6.9 ExifRead==3.0.0 factory-boy==3.3.0 Faker==19.1.0 diff --git a/config/requirements/production.txt b/config/requirements/production.txt index 1555bbed..b0266179 100644 --- a/config/requirements/production.txt +++ b/config/requirements/production.txt @@ -14,6 +14,7 @@ django-ratelimit==4.0.0 django-storages==1.13.2 django-timezone-field==5.1 django-tinymce==3.6.1 +django-unfold==0.6.9 ExifRead==3.0.0 gunicorn==21.2.0 hiredis==2.2.3