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('', 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('', obj.image.url) return "Resim Yok" image_preview.short_description = 'Ana Resim Önizleme' def thumb_preview(self, obj): if obj.thumb: return format_html('', 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