Modify: admin panel fields, filters and decorations

This commit is contained in:
Stepan Zhukovsky 2023-09-02 17:54:53 +09:00
parent d314fe7e4e
commit 332764fca2
3 changed files with 101 additions and 25 deletions

View File

@ -1,25 +1,96 @@
from django.contrib import admin from django.contrib import admin, messages
from django.urls import reverse
from django.utils.html import format_html
from django.utils.translation import ngettext
from .models import Platform, Archive, Ticket from .models import Platform, Archive, Ticket
from .utils import sizify
# Register your models here.
class PlatformAdmin(admin.ModelAdmin): class PlatformAdmin(admin.ModelAdmin):
pass list_display = ('id', 'name', 'pretty_name')
search_fields = ('name',)
class TicketAdmin(admin.ModelAdmin): class TicketAdmin(admin.ModelAdmin):
pass list_display = (
'id',
'number',
'token',
'platform',
'user',
'time_create',
'time_update',
'resolved',
)
search_fields = ('number',)
list_filter = ('platform', 'resolved', 'time_create',)
actions = ['make_resolved', 'make_unresolved']
@admin.action(description='Mark selected ticket(s) as resolved')
def make_resolved(self, request, queryset):
updated = queryset.update(resolved=True)
self.message_user(
request,
ngettext(
f'{updated} ticket was successfully marked as resolved.',
f'{updated} tickets were successfully marked as resolved.',
number=updated,
),
messages.SUCCESS,
)
@admin.action(description='Mark selected ticket(s) as unresolved')
def make_unresolved(self, request, queryset):
updated = queryset.update(resolved=False)
self.message_user(
request,
ngettext(
f'{updated} ticket was successfully marked as unresolved.',
f'{updated} tickets were successfully marked as unresolved.',
number=updated,
),
messages.SUCCESS,
)
class ArchiveAdmin(admin.ModelAdmin): class ArchiveAdmin(admin.ModelAdmin):
pass list_display = (
'id',
'file_link',
'file_size',
'md5',
'ticket',
'time_create'
)
search_fields = ('ticket',)
list_filter = ('time_create', 'ticket')
def file_size(self, obj):
return sizify(obj.file.size)
class TokenAdmin(admin.ModelAdmin): def file_link(self, obj):
pass if obj.file:
file_name = obj.file.name.rpartition('/')[-1]
file_path = reverse(
'collector:download',
kwargs={'path': file_name}
)
return format_html(
'<a href="{file_path}">{file_name}</a>',
file_path=file_path,
file_name=file_name
)
else:
return "No attachment"
file_link.allow_tags = True
file_link.short_description = 'File Download'
admin.site.register(Platform, PlatformAdmin) admin.site.register(Platform, PlatformAdmin)
admin.site.register(Ticket, TicketAdmin) admin.site.register(Ticket, TicketAdmin)
admin.site.register(Archive, ArchiveAdmin) admin.site.register(Archive, ArchiveAdmin)
admin.site.site_title = 'Logs Collector'
admin.site.site_header = 'LOGS COLLECTOR'

View File

@ -1,6 +1,3 @@
import os
def logs_dir_path(instance, filename): def logs_dir_path(instance, filename):
""" """
file will be uploaded to file will be uploaded to
@ -9,22 +6,25 @@ def logs_dir_path(instance, filename):
return f'{instance.ticket.number}/{filename}' return f'{instance.ticket.number}/{filename}'
# deprecated def sizify(value: int) -> str:
def get_file_size(file_path, unit='bytes'): """Simple kb/mb/gb size snippet for admin panel custom field:
file_size = os.path.getsize(file_path)
exponents_map = {'bytes': 0, 'kb': 1, 'mb': 2, 'gb': 3} Args:
if unit not in exponents_map: value (int): size of file from Filefield
raise ValueError("Must select from \
['bytes', 'kb', 'mb', 'gb']") Returns:
str: format human readable size like 4.2 Gb
"""
if value < 512000:
value = value / 1024.0
ext = 'Kb'
elif value < 4194304000:
value = value / 1048576.0
ext = 'Mb'
else: else:
size = file_size / 1024 ** exponents_map[unit] value = value / 1073741824.0
return round(size, 3) ext = 'Gb'
return f'{round(value, 2)} {ext}'
# deprecated
def is_ajax(request):
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return True
class PageTitleViewMixin: class PageTitleViewMixin:

View File

@ -0,0 +1,5 @@
{% extends "admin/base_site.html" %}
{% load static %}
{% block extrahead %}
<link rel="shortcut icon" href="{% static 'img/favicon.ico' %}" />
{% endblock %}