151 lines
4.5 KiB
Python
151 lines
4.5 KiB
Python
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'<a href="{url}">{instance.numero}</a>')
|
|
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'<a href="{obj.arquivo.url}" target="_blank">Download PDF</a>'
|
|
)
|
|
return "-"
|
|
|
|
arquivo_link.short_description = "Arquivo"
|
|
arquivo_link.allow_tags = True
|
|
|
|
def link_externo(self, obj):
|
|
if obj.link:
|
|
return mark_safe(f'<a href="{obj.link}" target="_blank">Acessar Online</a>')
|
|
return "-"
|
|
|
|
link_externo.short_description = "Link Externo"
|
|
link_externo.allow_tags = True
|
|
|
|
def arquivo_preview(self, obj):
|
|
if obj.arquivo:
|
|
return mark_safe(
|
|
f'<a href="{obj.arquivo.url}" target="_blank">Visualizar PDF</a>'
|
|
)
|
|
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'<a href="{url}">{obj.diario}</a>')
|
|
|
|
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")
|