from django.contrib import admin
from django import forms
from .models import (
AnonymousCommentUser,
Category,
Comment,
Post,
Tag,
Weblog,
PostTranslation,
CategoryTranslation,
TagTranslation,
)
class PostTranslationInline(admin.StackedInline):
model = PostTranslation
extra = 1
fields = ("language", "title", "body")
class CategoryTranslationInline(admin.TabularInline):
model = CategoryTranslation
extra = 1
fields = ("language", "name", "description")
class TagTranslationInline(admin.TabularInline):
model = TagTranslation
extra = 1
fields = ("language", "name", "description")
class PostAdminForm(forms.ModelForm):
class Meta:
model = Post
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.weblog_id:
self.fields["category"].queryset = Category.objects.filter(
weblog=self.instance.weblog
)
self.fields["tags"].queryset = Tag.objects.filter(
weblog=self.instance.weblog
)
from django.utils.safestring import mark_safe
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
class CommentInline(admin.TabularInline):
model = Comment
extra = 0
readonly_fields = (
"comment_display",
"user_display",
"created_at",
"edited",
"edited_at",
)
fields = ("comment_display", "user_display", "created_at", "edited")
exclude = ("body", "user", "anonymous_user", "level", "parent")
can_delete = False
max_num = 0
def user_display(self, obj):
if obj.user:
return mark_safe(
f'{obj.user.username}'
)
elif obj.anonymous_user:
return mark_safe(
f''
f"Anonymous: {obj.anonymous_user.name}"
)
return "None"
user_display.short_description = "User"
def comment_display(self, obj):
return mark_safe(
f'{obj.body[:100]}{"..." if len(obj.body) > 100 else ""}'
)
comment_display.short_description = "Comment"
form = PostAdminForm
list_display = (
"title",
"weblog",
"author",
"date",
"is_public",
"views",
"comment_count",
)
list_filter = ("weblog", "is_public", "category", "tags")
search_fields = ("title", "body")
prepopulated_fields = {"slug": ("title",)}
inlines = [PostTranslationInline, CommentInline]
date_hierarchy = "date"
def comment_count(self, obj):
return obj.comments.count()
comment_count.short_description = "Comments"
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
if obj is None:
form.base_fields["category"].queryset = Category.objects.none()
form.base_fields["tags"].queryset = Tag.objects.none()
return form
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "category" and request._obj_ is not None:
kwargs["queryset"] = Category.objects.filter(weblog=request._obj_.weblog)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
def get_queryset(self, request):
qs = super().get_queryset(request)
request._obj_ = None
return qs
def get_object(self, request, object_id, from_field=None):
obj = super().get_object(request, object_id, from_field=from_field)
if obj:
request._obj_ = obj
return obj
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ("name", "weblog", "created_at")
list_filter = ("weblog",)
search_fields = ("name", "description")
prepopulated_fields = {"slug": ("name",)}
inlines = [CategoryTranslationInline]
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
list_display = ("name", "weblog", "created_at")
list_filter = ("weblog",)
search_fields = ("name", "description")
prepopulated_fields = {"slug": ("name",)}
inlines = [TagTranslationInline]
@admin.register(Weblog)
class WeblogAdmin(admin.ModelAdmin):
class PostInline(admin.TabularInline):
model = Post
extra = 0
readonly_fields = ("title", "author", "date", "is_public", "views")
can_delete = False
fields = ("title", "author", "date", "is_public", "views")
def has_add_permission(self, request, obj=None):
return False
class CategoryInline(admin.TabularInline):
model = Category
extra = 0
readonly_fields = ("name", "created_at")
can_delete = False
fields = ("name", "created_at")
def has_add_permission(self, request, obj=None):
return False
class TagInline(admin.TabularInline):
model = Tag
extra = 0
readonly_fields = ("name", "created_at")
can_delete = False
fields = ("name", "created_at")
def has_add_permission(self, request, obj=None):
return False
list_display = ("name", "owner", "created_at")
search_fields = ("name", "description")
prepopulated_fields = {"slug": ("name",)}
inlines = [PostInline, CategoryInline, TagInline]
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = (
"post",
"get_author",
"created_at",
"edited",
"upvotes",
"downvotes",
)
list_filter = ("edited", "created_at")
search_fields = ("body", "user__username", "anonymous_user__name")
readonly_fields = ("created_at", "edited_at")
def get_author(self, obj):
return obj.user.username if obj.user else obj.anonymous_user.name
get_author.short_description = "Author"
@admin.register(AnonymousCommentUser)
class AnonymousCommentUserAdmin(admin.ModelAdmin):
list_display = ("name", "email", "created_at")
search_fields = ("name", "email")
readonly_fields = ("created_at",)