diff --git a/taiga/projects/attachments/api.py b/taiga/projects/attachments/api.py index b1494387..d2f93caa 100644 --- a/taiga/projects/attachments/api.py +++ b/taiga/projects/attachments/api.py @@ -15,6 +15,7 @@ # along with this program. If not, see . import os +import os.path as path import hashlib import mimetypes mimetypes.init() @@ -59,6 +60,8 @@ class BaseAttachmentViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCru if not obj.id: obj.content_type = self.get_content_type() obj.owner = self.request.user + obj.size = obj.attached_file.size + obj.name = path.basename(obj.attached_file.name).lower() if obj.project_id != obj.content_object.project_id: raise exc.WrongArguments("Project ID not matches between object and project") diff --git a/taiga/projects/attachments/migrations/0002_add_size_and_name_fields.py b/taiga/projects/attachments/migrations/0002_add_size_and_name_fields.py new file mode 100644 index 00000000..48468e05 --- /dev/null +++ b/taiga/projects/attachments/migrations/0002_add_size_and_name_fields.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import os.path as path +from django.db import models, migrations + + +def parse_filenames_and_sizes(apps, schema_editor): + Attachment = apps.get_model("attachments", "Attachment") + + for item in Attachment.objects.all(): + try: + item.size = item.attached_file.size + except Exception as e: + item.size = 0 + + item.name = path.basename(item.attached_file.name) + item.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('attachments', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='attachment', + name='name', + field=models.CharField(default='', blank=True, max_length=500), + preserve_default=True, + ), + migrations.AddField( + model_name='attachment', + name='size', + field=models.IntegerField(editable=False, null=True, blank=True, default=None), + preserve_default=True, + ), + migrations.RunPython(parse_filenames_and_sizes) + ] diff --git a/taiga/projects/attachments/models.py b/taiga/projects/attachments/models.py index f780025c..2008c502 100644 --- a/taiga/projects/attachments/models.py +++ b/taiga/projects/attachments/models.py @@ -51,13 +51,17 @@ class Attachment(models.Model): default=timezone.now) modified_date = models.DateTimeField(null=False, blank=False, verbose_name=_("modified date")) - + name = models.CharField(blank=True, default="", max_length=500) + size = models.IntegerField(null=True, blank=True, editable=False, default=None) attached_file = models.FileField(max_length=500, null=True, blank=True, upload_to=get_attachment_file_path, verbose_name=_("attached file")) + + is_deprecated = models.BooleanField(default=False, verbose_name=_("is deprecated")) description = models.TextField(null=False, blank=True, verbose_name=_("description")) order = models.IntegerField(default=0, null=False, blank=False, verbose_name=_("order")) + _importing = None class Meta: diff --git a/taiga/projects/attachments/serializers.py b/taiga/projects/attachments/serializers.py index 46ba0b97..2939f78a 100644 --- a/taiga/projects/attachments/serializers.py +++ b/taiga/projects/attachments/serializers.py @@ -28,10 +28,7 @@ from . import models class AttachmentSerializer(serializers.ModelSerializer): - name = serializers.SerializerMethodField("get_name") url = serializers.SerializerMethodField("get_url") - size = serializers.SerializerMethodField("get_size") - attached_file = serializers.FileField(required=True) class Meta: @@ -41,11 +38,6 @@ class AttachmentSerializer(serializers.ModelSerializer): "object_id", "order") read_only_fields = ("owner", "created_date", "modified_date") - def get_name(self, obj): - if obj.attached_file: - return path.basename(obj.attached_file.path) - return "" - def get_url(self, obj): token = None @@ -59,10 +51,3 @@ class AttachmentSerializer(serializers.ModelSerializer): return url - def get_size(self, obj): - if obj.attached_file: - try: - return obj.attached_file.size - except FileNotFoundError: - pass - return 0