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.
95 lines
3.8 KiB
95 lines
3.8 KiB
# -*- coding: utf-8 -*-
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.conf import settings
|
|
#models
|
|
from file.models import FileModel, TmpFile
|
|
from my_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()
|
|
|
|
|
|
TmpFile.objects.filter(key=key).delete() |