filer.management.commands.import_files: 71 total statements, 0.0% covered

Generated: Wed 2013-03-13 10:33 CET

Source file: /media/Envs/Envs/filer-gallery/lib/python2.7/site-packages/filer/management/commands/import_files.py

Stats: 0 executed, 60 missed, 11 excluded, 62 ignored

  1. #-*- coding: utf-8 -*-
  2. from django.core.files import File as DjangoFile
  3. from django.core.management.base import BaseCommand, NoArgsCommand
  4. from filer.models.filemodels import File
  5. from filer.models.foldermodels import Folder
  6. from filer.models.imagemodels import Image
  7. from filer.settings import FILER_IS_PUBLIC_DEFAULT
  8. from optparse import make_option
  9. import os
  10. class FileImporter(object):
  11. def __init__(self, * args, **kwargs):
  12. self.path = kwargs.get('path')
  13. self.base_folder = kwargs.get('base_folder')
  14. self.verbosity = int(kwargs.get('verbosity', 1))
  15. self.file_created = 0
  16. self.image_created = 0
  17. self.folder_created = 0
  18. def import_file(self, file_obj, folder):
  19. """
  20. Create a File or an Image into the given folder
  21. """
  22. try:
  23. iext = os.path.splitext(file_obj.name)[1].lower()
  24. except:
  25. iext = ''
  26. if iext in ['.jpg', '.jpeg', '.png', '.gif']:
  27. obj, created = Image.objects.get_or_create(
  28. original_filename=file_obj.name,
  29. file=file_obj,
  30. folder=folder,
  31. is_public=FILER_IS_PUBLIC_DEFAULT)
  32. if created:
  33. self.image_created += 1
  34. else:
  35. obj, created = File.objects.get_or_create(
  36. original_filename=file_obj.name,
  37. file=file_obj,
  38. folder=folder,
  39. is_public=FILER_IS_PUBLIC_DEFAULT)
  40. if created:
  41. self.file_created += 1
  42. if self.verbosity >= 2:
  43. print u"file_created #%s / image_created #%s -- file : %s -- created : %s" % (self.file_created,
  44. self.image_created,
  45. obj, created)
  46. return obj
  47. def get_or_create_folder(self, folder_names):
  48. """
  49. Gets or creates a Folder based the list of folder names in hierarchical
  50. order (like breadcrumbs).
  51. get_or_create_folder(['root', 'subfolder', 'subsub folder'])
  52. creates the folders with correct parent relations and returns the
  53. 'subsub folder' instance.
  54. """
  55. if not len(folder_names):
  56. return None
  57. current_parent = None
  58. for folder_name in folder_names:
  59. current_parent, created = Folder.objects.get_or_create(name=folder_name, parent=current_parent)
  60. if created:
  61. self.folder_created += 1
  62. if self.verbosity >= 2:
  63. print u"folder_created #%s folder : %s -- created : %s" % (self.folder_created,
  64. current_parent, created)
  65. return current_parent
  66. def walker(self, path=None, base_folder=None):
  67. """
  68. This method walk a directory structure and create the
  69. Folders and Files as they appear.
  70. """
  71. path = path or self.path
  72. base_folder = base_folder or self.base_folder
  73. # prevent trailing slashes and other inconsistencies on path.
  74. # cast to unicode so that os.walk returns path names in unicode
  75. # (prevents encoding/decoding errors)
  76. path = unicode(os.path.normpath(path))
  77. if base_folder:
  78. base_folder = unicode(os.path.normpath(base_folder))
  79. print u"The directory structure will be imported in %s" % (base_folder,)
  80. if self.verbosity >= 1:
  81. print u"Import the folders and files in %s" % (path,)
  82. root_folder_name = os.path.basename(path)
  83. for root, dirs, files in os.walk(path):
  84. rel_folders = root.partition(path)[2].strip(os.path.sep).split(os.path.sep)
  85. while '' in rel_folders:
  86. rel_folders.remove('')
  87. if base_folder:
  88. folder_names = base_folder.split('/') + [root_folder_name] + rel_folders
  89. else:
  90. folder_names = [root_folder_name] + rel_folders
  91. folder = self.get_or_create_folder(folder_names)
  92. for file_obj in files:
  93. dj_file = DjangoFile(open(os.path.join(root, file_obj)),
  94. name=file_obj)
  95. self.import_file(file_obj=dj_file, folder=folder)
  96. if self.verbosity >= 1:
  97. print ('folder_created #%s / file_created #%s / ' + \
  98. 'image_created #%s') % (
  99. self.folder_created, self.file_created,
  100. self.image_created)
  101. class Command(NoArgsCommand):
  102. """
  103. Import directory structure into the filer ::
  104. manage.py --path=/tmp/assets/images
  105. manage.py --path=/tmp/assets/news --folder=images
  106. """
  107. option_list = BaseCommand.option_list + (
  108. make_option('--path',
  109. action='store',
  110. dest='path',
  111. default=False,
  112. help='Import files located in the path into django-filer'),
  113. make_option('--folder',
  114. action='store',
  115. dest='base_folder',
  116. default=False,
  117. help='Specify the destination folder in which the directory structure should be imported'),
  118. )
  119. def handle_noargs(self, **options):
  120. file_importer = FileImporter(**options)
  121. file_importer.walker()