2014-12-10 21:25:09 +00:00
import os
2014-11-01 21:02:31 +00:00
import uuid
import StringIO
from django import forms
from django . conf import settings
from django . utils . translation import ugettext_lazy as _
from django . core . files . uploadedfile import InMemoryUploadedFile
from django . template import defaultfilters as filters
from . utils import scale_and_crop
from . settings import (
MARKDOWNX_IMAGE_SIZE ,
MARKDOWNX_MEDIA_PATH ,
MARKDOWNX_CONTENT_TYPES ,
MARKDOWNX_MAX_UPLOAD_SIZE ,
)
class ImageForm ( forms . Form ) :
image = forms . ImageField ( )
def save ( self , commit = True ) :
img = scale_and_crop ( self . files [ ' image ' ] , * * MARKDOWNX_IMAGE_SIZE )
thumb_io = StringIO . StringIO ( )
img . save ( thumb_io , self . files [ ' image ' ] . content_type . split ( ' / ' ) [ - 1 ] . upper ( ) )
file_name = str ( self . files [ ' image ' ] )
img = InMemoryUploadedFile ( thumb_io , " image " , file_name , self . files [ ' image ' ] . content_type , thumb_io . len , None )
unique_file_name = self . get_unique_file_name ( file_name )
2014-12-10 21:25:09 +00:00
full_path = os . path . join ( settings . MEDIA_ROOT , MARKDOWNX_MEDIA_PATH , unique_file_name )
2014-11-01 21:02:31 +00:00
if not os . path . exists ( os . path . dirname ( full_path ) ) :
os . makedirs ( os . path . dirname ( full_path ) )
destination = open ( full_path , ' wb+ ' )
for chunk in img . chunks ( ) :
destination . write ( chunk )
destination . close ( )
2014-12-10 21:25:09 +00:00
return os . path . join ( settings . MEDIA_URL , MARKDOWNX_MEDIA_PATH , unique_file_name )
2014-11-01 21:02:31 +00:00
def get_unique_file_name ( instance , filename ) :
ext = filename . split ( ' . ' ) [ - 1 ]
filename = " %s . %s " % ( uuid . uuid4 ( ) , ext )
return filename
def clean ( self ) :
upload = self . cleaned_data [ ' image ' ]
content_type = upload . content_type
if content_type in MARKDOWNX_CONTENT_TYPES :
if upload . _size > MARKDOWNX_MAX_UPLOAD_SIZE :
raise forms . ValidationError ( _ ( ' Please keep filesize under %(max)s . Current filesize %(current)s ' ) % { ' max ' : filters . filesizeformat ( MARKDOWNX_MAX_UPLOAD_SIZE ) , ' current ' : filters . filesizeformat ( upload . _size ) } )
else :
raise forms . ValidationError ( _ ( ' File type is not supported ' ) )
return upload