import os
import mimetypes
from django.db import models
from django.utils.translation import ugettext_lazy as _
from kawaz.core.personas.models import Persona
[ドキュメント]class Material(models.Model):
"""
添付素材用のモデルです
"""
def _get_upload_path(self, filename):
basedir = os.path.join('attachments', self.author.username)
return os.path.join(basedir, filename)
content_file = models.FileField(_('Content file'), upload_to=_get_upload_path)
# TODO Fix ME
# django-rest-framework 2.3.14から、editable=Falseにした場合、API経由で変更ができない
# 原因は調査中だが、直した方が良さそう
#author = models.ForeignKey(Persona, verbose_name=_('Author'), edifable=False)
author = models.ForeignKey(Persona, verbose_name=_('Author'))
slug = models.SlugField(_('Material slug'), unique=True, editable=False, blank=True)
ip_address = models.GenericIPAddressField("IP Address", editable=False)
created_at = models.DateTimeField(_('Created at'), auto_now_add=True)
class Meta:
ordering = ('created_at',)
verbose_name = _('Material')
verbose_name_plural = _('Materials')
def __str__(self):
return self.filename
[ドキュメント] def save(self, *args, **kwargs):
# 同名ファイルの存在衝突を避けるためにまずファイルを保存する
super().save(*args, **kwargs)
# 変更されたファイル名を元に slug を作成し、適用する
from hashlib import sha1
self.slug = sha1(self.content_file.name.encode('utf-8')).hexdigest()
# ref: https://docs.djangoproject.com/en/dev/ref/models/instances/#specifying-which-fields-to-save
super().save(update_fields=['slug'])
return self
@models.permalink
[ドキュメント] def get_absolute_url(self):
return ('attachments_material_detail', (self.slug,), {})
@property
def ext(self):
"""
アップされたファイルから拡張子を返します
拡張子は小文字になります。2つ以上拡張子がついている場合は最後の物のみが返却されます。
hoge.mp3 -> mp3
hoge.tar.gz -> gz
hoge.WAV -> wav
README ->
"""
ext = os.path.splitext(self.content_file.name)[1]
if ext:
return ext[1:].lower()
return ''
@property
def is_image (self):
"""
画像ファイルかどうかを返します
"""
extensions = ['jpg', 'jpeg', 'png', 'gif']
return self.ext in extensions
@property
def is_audio(self):
"""
音声ファイルかどうかを返します
"""
extensions = ['wav', 'mp3', 'ogg']
return self.ext in extensions
@property
def is_movie(self):
"""
動画ファイルかどうかを返します
"""
extensions = ['mov', 'mp4']
return self.ext in extensions
@property
def is_pdf(self):
"""
PDFかどうかを返します
"""
return self.ext == 'pdf'
@property
def filename(self):
"""
ファイル名を返します
"""
return os.path.split(self.content_file.name)[1]
[ドキュメント] def get_thumbnail_display(self):
from .utils.thumbnails import get_thumbnail_html
return get_thumbnail_html(self)
@property
def mimetype(self):
"""
Mimetypeを返します
"""
mime_type_guess = mimetypes.guess_type(self.filename)
return mime_type_guess[0]
[ドキュメント] def get_attachment_tag(self):
return "{attachments:%s}" % (self.slug,)
from permission import add_permission_logic
from kawaz.core.personas.perms import ChildrenPermissionLogic
add_permission_logic(Material, ChildrenPermissionLogic(
add_permission=True,
change_permission=False,
delete_permission=False
))