from django.contrib import admin from django.utils.html import format_html from django.urls import reverse from django.utils.safestring import mark_safe from .models import TipoDiarioOficial, DiarioOficial, PageDiarioOficial from .forms import PageDiarioOficialInlineForm @admin.register(TipoDiarioOficial) class TipoDiarioOficialAdmin(admin.ModelAdmin): list_display = ("nome", "quantidade_diarios") search_fields = ("nome",) ordering = ("nome",) def quantidade_diarios(self, obj): return obj.diarios.count() quantidade_diarios.short_description = "Nº de Diários" class PageDiarioOficialInline(admin.TabularInline): form = PageDiarioOficialInlineForm model = PageDiarioOficial extra = 0 fields = ("id", "numero", "conteudo") can_delete = False def numero_link(self, instance): if instance.id: url = reverse("admin:diarios_pagediariooficial_change", args=[instance.id]) return mark_safe(f'{instance.numero}') return instance.numero def conteudo_resumido(self, instance): return ( (instance.conteudo[:100] + "...") if len(instance.conteudo) > 100 else instance.conteudo ) conteudo_resumido.short_description = "Conteúdo (resumo)" @admin.register(DiarioOficial) class DiarioOficialAdmin(admin.ModelAdmin): list_display = ( "numero", "tipo_nome", "data_formatada_admin", "arquivo_link", "link_externo", "paginas_count", ) list_filter = ("tipo", "data") search_fields = ("numero", "tipo__nome", "data") date_hierarchy = "data" ordering = ("-data", "-numero") readonly_fields = ( "data_formatada_admin", "arquivo_preview", "paginas_count", "link_externo", ) fieldsets = ( ( "Informações Básicas", {"fields": ("numero", "tipo", "data", "data_formatada_admin")}, ), ( "Arquivos e Links", {"fields": ("arquivo", "arquivo_preview", "link", "link_externo")}, ), ("Estatísticas", {"fields": ("paginas_count",), "classes": ("collapse",)}), ) # inlines = (PageDiarioOficialInline,) def tipo_nome(self, obj): return obj.tipo.nome if obj.tipo else "-" tipo_nome.short_description = "Tipo" tipo_nome.admin_order_field = "tipo__nome" def data_formatada_admin(self, obj): return obj.data_formatada data_formatada_admin.short_description = "Data" def arquivo_link(self, obj): if obj.arquivo: return mark_safe( f'Download PDF' ) return "-" arquivo_link.short_description = "Arquivo" arquivo_link.allow_tags = True def link_externo(self, obj): if obj.link: return mark_safe(f'Acessar Online') return "-" link_externo.short_description = "Link Externo" link_externo.allow_tags = True def arquivo_preview(self, obj): if obj.arquivo: return mark_safe( f'Visualizar PDF' ) return "-" arquivo_preview.short_description = "Pré-visualização" arquivo_preview.allow_tags = True def paginas_count(self, obj): return obj.paginas.count() paginas_count.short_description = "Nº de Páginas" def get_queryset(self, request): return super().get_queryset(request).prefetch_related("paginas") @admin.register(PageDiarioOficial) class PageDiarioOficialAdmin(admin.ModelAdmin): autocomplete_fields = ("diario",) list_display = ("id", "diario_link", "numero", "conteudo_resumido") list_display_links = ('id', 'numero') list_filter = ("diario__tipo", "diario__data", "layout_duas_colunas") search_fields = ("conteudo", "diario__numero") readonly_fields = ( "diario_link", ) def diario_link(self, obj): url = reverse("admin:diarios_diariooficial_change", args=[obj.diario.id]) return mark_safe(f'{obj.diario}') diario_link.short_description = "Diário Oficial" diario_link.allow_tags = True def conteudo_resumido(self, obj): return (obj.conteudo[:100] + "...") if len(obj.conteudo) > 100 else obj.conteudo conteudo_resumido.short_description = "Conteúdo" def get_queryset(self, request): return super().get_queryset(request).select_related("diario")