Modify: Archive model - add size field, now use this field for web and admin page

This commit is contained in:
Stepan Zhukovsky 2023-09-02 20:22:40 +09:00
parent 332764fca2
commit eec55b803d
6 changed files with 16 additions and 49 deletions

View File

@ -1,4 +1,5 @@
from django.contrib import admin, messages from django.contrib import admin, messages
from django.db.models import F
from django.urls import reverse from django.urls import reverse
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.translation import ngettext from django.utils.translation import ngettext
@ -66,15 +67,20 @@ class ArchiveAdmin(admin.ModelAdmin):
search_fields = ('ticket',) search_fields = ('ticket',)
list_filter = ('time_create', 'ticket') list_filter = ('time_create', 'ticket')
def get_queryset(self, request):
qs = super(ArchiveAdmin, self).get_queryset(request)
qs = qs.annotate(file_size=F('size'))
return qs
def file_size(self, obj): def file_size(self, obj):
return sizify(obj.file.size) return sizify(obj.size)
def file_link(self, obj): def file_link(self, obj):
if obj.file: if obj.file:
file_name = obj.file.name.rpartition('/')[-1] file_name = obj.file.name.rpartition('/')[-1]
file_path = reverse( file_path = reverse(
'collector:download', 'collector:download',
kwargs={'path': file_name} kwargs={'path': obj.file}
) )
return format_html( return format_html(
'<a href="{file_path}">{file_name}</a>', '<a href="{file_path}">{file_name}</a>',
@ -86,6 +92,7 @@ class ArchiveAdmin(admin.ModelAdmin):
file_link.allow_tags = True file_link.allow_tags = True
file_link.short_description = 'File Download' file_link.short_description = 'File Download'
file_size.admin_order_field = 'file_size'
admin.site.register(Platform, PlatformAdmin) admin.site.register(Platform, PlatformAdmin)

View File

@ -1,4 +1,4 @@
# Generated by Django 4.2 on 2023-08-30 05:52 # Generated by Django 4.2 on 2023-09-02 09:30
import collector.utils import collector.utils
from django.conf import settings from django.conf import settings
@ -47,7 +47,8 @@ class Migration(migrations.Migration):
name='Archive', name='Archive',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('file', models.FileField(blank=True, null=True, upload_to=collector.utils.logs_dir_path)), ('file', models.FileField(upload_to=collector.utils.logs_dir_path)),
('size', models.BigIntegerField(editable=False)),
('md5', models.CharField(editable=False, max_length=1024)), ('md5', models.CharField(editable=False, max_length=1024)),
('time_create', models.DateTimeField(auto_now_add=True)), ('time_create', models.DateTimeField(auto_now_add=True)),
('time_update', models.DateTimeField(auto_now=True)), ('time_update', models.DateTimeField(auto_now=True)),

View File

@ -1,19 +0,0 @@
# Generated by Django 4.2 on 2023-08-30 08:40
import collector.utils
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('collector', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='archive',
name='file',
field=models.FileField(upload_to=collector.utils.logs_dir_path),
),
]

View File

@ -11,6 +11,7 @@ from .utils import logs_dir_path
class Archive(models.Model): class Archive(models.Model):
file = models.FileField(upload_to=logs_dir_path) file = models.FileField(upload_to=logs_dir_path)
size = models.BigIntegerField(editable=False)
md5 = models.CharField(max_length=1024, editable=False) md5 = models.CharField(max_length=1024, editable=False)
time_create = models.DateTimeField(auto_now_add=True) time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True) time_update = models.DateTimeField(auto_now=True)
@ -22,6 +23,8 @@ class Archive(models.Model):
) )
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# add file size in bytes
self.size = self.file.size
# calculate md5 hash sum and write md5 field to db # calculate md5 hash sum and write md5 field to db
with self.file.open('rb') as f: with self.file.open('rb') as f:
md5 = hashlib.md5() md5 = hashlib.md5()

View File

@ -19,7 +19,7 @@
<br> <br>
<small> <small>
<b>Size:</b> <b>Size:</b>
<span style="word-wrap: break-word">{{ archive.file.size|sizify }}</span> <span style="word-wrap: break-word">{{ archive.size|filesizeformat }}</span>
</small> </small>
<div class="row"> <div class="row">
<div class="d-flex justify-content-sm-start justify-content-between" > <div class="d-flex justify-content-sm-start justify-content-between" >

View File

@ -13,31 +13,6 @@ def get_platforms():
return Platform.objects.all() return Platform.objects.all()
@register.filter(name='sizify')
def sizify(value: int) -> str:
"""Simple kb/mb/gb size snippet for templates:
{{ Archive.file.size|sizify }}
Args:
value (int): size of file from Filefield
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:
value = value / 1073741824.0
ext = 'Gb'
return f'{round(value, 2)} {ext}'
@register.filter(name='clean_filename') @register.filter(name='clean_filename')
def clean_filename(filename: str) -> str: def clean_filename(filename: str) -> str:
"""delete prefix ticket number folder for template """delete prefix ticket number folder for template