You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

94 lines
3.7 KiB

# -*- coding: utf-8 -*-
from django.contrib.contenttypes.models import ContentType
from django.conf import settings
#models
from file.models import FileModel, TmpFile
from custom_fields import IMG_TYPES
import shutil, os
def get_alternative_filename(directory, filename):
"""Function have two incoming arguments:
- directory ( like u'/tmp' or u'/tmp/' does not a meter )
- filename
Return alternative free file name without directory name
"""
# Adding last slash
if not directory.endswith(r'/'):
directory += r'/'
# If this name is free skip code execution end return it
if not os.path.exists(directory + filename):
return filename
# split filename by dots
fnamearr = filename.split(r'.')
# Loop next code until find a free file name
while os.path.exists(directory + '.'.join(fnamearr)):
# name is to short. add iterator to the end
if len(fnamearr) == 1:
fnamearr.append(u'1')
# its iterable short name
elif len(fnamearr) == 2 and fnamearr[-1].isdigit():
fnamearr[-1] = unicode( int(fnamearr[-1]) + 1 )
# name is long and have iterator. increase it
elif len(fnamearr) > 1 and fnamearr[-2].isdigit():
fnamearr[-2] = unicode( int(fnamearr[-2]) + 1 )
# name is long and have not an iterator. add it
elif len(fnamearr) > 1:
fnamearr.insert(-1, u'1')
return '.'.join(fnamearr)
def check_tmp_files(object, key=None):
"""
compare key in TmpFile with hidden key in form
(form with new object has key, form with object which exist doesnt have key)
if key is equal copy TmpFile object to FileModel table like FileModel object with content_type and obj_id
than delete TmpFile object
"""
if key == None:
pass
else:
list = TmpFile.objects.filter(key=key)
for item in list:
file_obj = FileModel()
#ContentType information
file_obj.content_type = ContentType.objects.get_for_model(object)
file_obj.object_id = getattr(object, 'id')
file_name = str(item.file_path).split('/')[-1]
#check file type and move it in 'media/imgs/' if type is in IMG_TYPES
#else move it in 'media/files/'
if str(item.file_type).upper() in IMG_TYPES:
alt_name = get_alternative_filename(settings.MEDIA_ROOT+'imgs/',file_name)
os.rename(settings.MEDIA_ROOT+'tmp_files/%s'%file_name, settings.MEDIA_ROOT+'tmp_files/%s'%alt_name)
shutil.move(settings.MEDIA_ROOT +'tmp_files/%s'%alt_name, settings.MEDIA_ROOT+'imgs/')
file_obj.file_path = 'imgs/'+alt_name
#move file to '/imgs/'
else:
alt_name = get_alternative_filename(settings.MEDIA_ROOT+'files/',file_name)
os.rename(settings.MEDIA_ROOT+'tmp_files/%s'%file_name, settings.MEDIA_ROOT+'tmp_files/%s'%alt_name)
shutil.move(settings.MEDIA_ROOT +'tmp_files/%s'%alt_name, settings.MEDIA_ROOT+'files/')
file_obj.file_path = 'files/'+alt_name
#another data
file_obj.file_type = item.file_type
file_obj.img_height = item.img_height
file_obj.img_width = item.img_width
file_obj.purpose = item.purpose
file_obj.save()
#translated fields
for code, name in settings.LANGUAGES:
file_obj.translate(code)
trans_object = TmpFile._meta.translations_model.objects.get(language_code = code,master__id=getattr(item,'id'))
file_obj.file_name = trans_object.file_name
file_obj.description = trans_object.description
file_obj.save()
list.delete()