From eec55b803d4125258afe04a95d5656a4930d9947 Mon Sep 17 00:00:00 2001
From: MOIS3Y <s.zhukovskii@ispsystem.com>
Date: Sat, 2 Sep 2023 20:22:40 +0900
Subject: [PATCH] Modify: Archive model - add size field, now use this field
 for web and admin page

---
 logs_collector/collector/admin.py             | 11 ++++++--
 .../collector/migrations/0001_initial.py      |  5 ++--
 .../migrations/0002_alter_archive_file.py     | 19 --------------
 logs_collector/collector/models.py            |  3 +++
 .../collector/includes/ticket_archives.html   |  2 +-
 .../templatetags/collector_extras.py          | 25 -------------------
 6 files changed, 16 insertions(+), 49 deletions(-)
 delete mode 100644 logs_collector/collector/migrations/0002_alter_archive_file.py

diff --git a/logs_collector/collector/admin.py b/logs_collector/collector/admin.py
index 08fa41a..e205677 100644
--- a/logs_collector/collector/admin.py
+++ b/logs_collector/collector/admin.py
@@ -1,4 +1,5 @@
 from django.contrib import admin, messages
+from django.db.models import F
 from django.urls import reverse
 from django.utils.html import format_html
 from django.utils.translation import ngettext
@@ -66,15 +67,20 @@ class ArchiveAdmin(admin.ModelAdmin):
     search_fields = ('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):
-        return sizify(obj.file.size)
+        return sizify(obj.size)
 
     def file_link(self, obj):
         if obj.file:
             file_name = obj.file.name.rpartition('/')[-1]
             file_path = reverse(
                 'collector:download',
-                kwargs={'path': file_name}
+                kwargs={'path': obj.file}
             )
             return format_html(
                 '<a href="{file_path}">{file_name}</a>',
@@ -86,6 +92,7 @@ class ArchiveAdmin(admin.ModelAdmin):
 
     file_link.allow_tags = True
     file_link.short_description = 'File Download'
+    file_size.admin_order_field = 'file_size'
 
 
 admin.site.register(Platform, PlatformAdmin)
diff --git a/logs_collector/collector/migrations/0001_initial.py b/logs_collector/collector/migrations/0001_initial.py
index 80282ac..fce79fc 100644
--- a/logs_collector/collector/migrations/0001_initial.py
+++ b/logs_collector/collector/migrations/0001_initial.py
@@ -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
 from django.conf import settings
@@ -47,7 +47,8 @@ class Migration(migrations.Migration):
             name='Archive',
             fields=[
                 ('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)),
                 ('time_create', models.DateTimeField(auto_now_add=True)),
                 ('time_update', models.DateTimeField(auto_now=True)),
diff --git a/logs_collector/collector/migrations/0002_alter_archive_file.py b/logs_collector/collector/migrations/0002_alter_archive_file.py
deleted file mode 100644
index 8cc4cd2..0000000
--- a/logs_collector/collector/migrations/0002_alter_archive_file.py
+++ /dev/null
@@ -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),
-        ),
-    ]
diff --git a/logs_collector/collector/models.py b/logs_collector/collector/models.py
index 4e4295f..2296cbd 100644
--- a/logs_collector/collector/models.py
+++ b/logs_collector/collector/models.py
@@ -11,6 +11,7 @@ from .utils import logs_dir_path
 
 class Archive(models.Model):
     file = models.FileField(upload_to=logs_dir_path)
+    size = models.BigIntegerField(editable=False)
     md5 = models.CharField(max_length=1024, editable=False)
     time_create = models.DateTimeField(auto_now_add=True)
     time_update = models.DateTimeField(auto_now=True)
@@ -22,6 +23,8 @@ class Archive(models.Model):
     )
 
     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
         with self.file.open('rb') as f:
             md5 = hashlib.md5()
diff --git a/logs_collector/collector/templates/collector/includes/ticket_archives.html b/logs_collector/collector/templates/collector/includes/ticket_archives.html
index 4cec5ae..2e55656 100644
--- a/logs_collector/collector/templates/collector/includes/ticket_archives.html
+++ b/logs_collector/collector/templates/collector/includes/ticket_archives.html
@@ -19,7 +19,7 @@
     <br>
   <small>
     <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>
   <div class="row">
     <div class="d-flex justify-content-sm-start justify-content-between" >
diff --git a/logs_collector/collector/templatetags/collector_extras.py b/logs_collector/collector/templatetags/collector_extras.py
index c4e4d77..5665a47 100644
--- a/logs_collector/collector/templatetags/collector_extras.py
+++ b/logs_collector/collector/templatetags/collector_extras.py
@@ -13,31 +13,6 @@ def get_platforms():
     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')
 def clean_filename(filename: str) -> str:
     """delete prefix ticket number folder for template