Add cached name and size fields to attachment model.

remotes/origin/enhancement/email-actions
Andrey Antukh 2014-09-16 12:20:24 +02:00
parent 95845b4eda
commit b20a9d1199
4 changed files with 49 additions and 16 deletions

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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")

View File

@ -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)
]

View File

@ -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:

View File

@ -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