Modify: Archive model - add size field, now use this field for web and admin page
This commit is contained in:
		
							parent
							
								
									332764fca2
								
							
						
					
					
						commit
						eec55b803d
					
				| @ -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) | ||||||
|  | |||||||
| @ -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)), | ||||||
|  | |||||||
| @ -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), |  | ||||||
|         ), |  | ||||||
|     ] |  | ||||||
| @ -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() | ||||||
|  | |||||||
| @ -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" > | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user