Files
shopback/blog/admin.py
Beyhan Oğur d9f1ea341e first commit
2026-04-26 22:27:56 +03:00

198 lines
6.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from django.contrib import admin
from django.utils.html import format_html
from blog.models import PCategory, Post, PComment, PCategoryView
class ChildInline(admin.TabularInline):
"""Alt kategorileri inline olarak göster"""
model = PCategory
extra = 0
fk_name = 'parent'
fields = ('title', 'is_active', 'order', 'slug')
readonly_fields = ('slug',)
@admin.register(PCategory)
class PCategoryAdmin(admin.ModelAdmin):
list_display = ('title', 'parent', 'is_active', 'order', 'created_at', 'post_count', 'view_count', 'image_preview')
list_filter = ('is_active', 'created_at', 'parent')
search_fields = ('title', 'keywords', 'description', 'slug')
list_editable = ('order', 'is_active')
prepopulated_fields = {'slug': ('title',)}
readonly_fields = ('created_at', 'updated_at', 'image_preview', 'view_count')
fieldsets = (
('Temel Bilgiler', {
'fields': ('title', 'parent', 'order', 'is_active')
}),
('SEO Bilgileri', {
'fields': ('slug', 'keywords', 'description')
}),
('Görsel', {
'fields': ('image', 'image_preview')
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
inlines = [ChildInline]
def image_preview(self, obj):
if obj.image:
return format_html('<img src="{}" width="100" height="100" style="object-fit: cover;" />', obj.image.url)
return "Resim Yok"
image_preview.short_description = 'Resim Önizleme'
def post_count(self, obj):
return obj.post_categories.count()
post_count.short_description = 'Post Sayısı'
def view_count(self, obj):
return obj.category_views.count()
view_count.short_description = 'Görüntülenme'
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.prefetch_related('post_categories', 'category_views')
return queryset
class PostCategoriesInline(admin.TabularInline):
"""Post kategorilerini inline olarak göster"""
model = Post.categories.through
extra = 1
verbose_name = 'Kategori'
verbose_name_plural = 'Kategoriler'
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'user', 'is_active', 'is_front', 'created_at', 'comment_count', 'image_preview')
list_filter = ('is_active', 'is_front', 'created_at', 'updated_at', 'categories')
search_fields = ('title', 'content', 'keywords', 'slug')
list_editable = ('is_active', 'is_front')
readonly_fields = ('created_at', 'updated_at', 'slug', 'image_preview', 'thumb_preview', 'thumb', 'parent')
filter_horizontal = ('categories',)
fieldsets = (
('Temel Bilgiler', {
'fields': ('title', 'user', 'content', 'categories')
}),
('SEO ve Medya', {
'fields': ('slug', 'keywords', 'video')
}),
('Görseller', {
'fields': ('image', 'image_preview', 'thumb_preview'),
'description': 'Thumb otomatik oluşturulur, image yüklediğinizde.'
}),
('Durum', {
'fields': ('is_active', 'is_front', 'parent')
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def image_preview(self, obj):
if obj.image:
return format_html('<img src="{0}" width="150" height="90" style="object-fit: cover; border: 1px solid #ddd;" />', obj.image.url)
return "Resim Yok"
image_preview.short_description = 'Ana Resim Önizleme'
def thumb_preview(self, obj):
if obj.thumb:
return format_html('<img src="{0}" width="100" height="60" style="object-fit: cover; border: 1px solid #ddd;" />', obj.thumb.url)
return "Thumb Yok (Kaydet ve otomatik oluşur)"
thumb_preview.short_description = 'Thumb Önizleme'
def comment_count(self, obj):
return obj._post.filter(is_active=True).count()
comment_count.short_description = 'Yorum Sayısı'
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.prefetch_related('categories', '_post').select_related('user')
return queryset
def save_model(self, request, obj, form, change):
"""Post kaydedilirken user otomatik atanabilir"""
if not obj.user:
obj.user = request.user
super().save_model(request, obj, form, change)
class ChildCommentInline(admin.TabularInline):
"""Alt yorumları inline olarak göster"""
model = PComment
extra = 0
fk_name = 'parent'
fields = ('user', 'title', 'body', 'is_active')
readonly_fields = ('user',)
@admin.register(PComment)
class PCommentAdmin(admin.ModelAdmin):
list_display = ('title', 'user', 'post', 'parent', 'is_active', 'created_at', 'child_count')
list_filter = ('is_active', 'created_at', 'post')
search_fields = ('title', 'body', 'user__username', 'user__email', 'post__title')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at', 'slug', 'user', 'post')
fieldsets = (
('Yorum Bilgileri', {
'fields': ('user', 'post', 'parent')
}),
('İçerik', {
'fields': ('title', 'body', 'slug')
}),
('Durum', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
inlines = [ChildCommentInline]
def child_count(self, obj):
return obj.child.count()
child_count.short_description = 'Alt Yorum Sayısı'
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.select_related('user', 'post', 'parent').prefetch_related('child')
return queryset
@admin.register(PCategoryView)
class PCategoryViewAdmin(admin.ModelAdmin):
list_display = ('category', 'ip_address', 'created_at', 'short_user_agent')
list_filter = ('created_at', 'category')
search_fields = ('ip_address', 'user_agent', 'category__title')
readonly_fields = ('category', 'ip_address', 'user_agent', 'created_at')
date_hierarchy = 'created_at'
def short_user_agent(self, obj):
if obj.user_agent:
return obj.user_agent[:50] + '...' if len(obj.user_agent) > 50 else obj.user_agent
return '-'
short_user_agent.short_description = 'User Agent'
def has_add_permission(self, request):
"""Kategori ziyaretleri manuel eklenemez"""
return False
def has_change_permission(self, request, obj=None):
"""Kategori ziyaretleri düzenlenemez"""
return False
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.select_related('category')
return queryset