/apps/converter/utils.py

https://github.com/fccoelho/mayan · Python · 85 lines · 59 code · 13 blank · 13 comment · 19 complexity · 0e253235a0d8a1a98ff014b06dc5c7b8 MD5 · raw file

  1. import os
  2. from django.core.exceptions import ImproperlyConfigured
  3. from django.utils.importlib import import_module
  4. #http://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python
  5. def copyfile(source, dest, buffer_size=1024 * 1024):
  6. """
  7. Copy a file from source to dest. source and dest
  8. can either be strings or any object with a read or
  9. write method, like StringIO for example.
  10. """
  11. if not hasattr(source, 'read'):
  12. source = open(source, 'rb')
  13. if not hasattr(dest, 'write'):
  14. dest = open(dest, 'wb')
  15. while 1:
  16. copy_buffer = source.read(buffer_size)
  17. if copy_buffer:
  18. dest.write(copy_buffer)
  19. else:
  20. break
  21. source.close()
  22. dest.close()
  23. def _lazy_load(fn):
  24. _cached = []
  25. def _decorated():
  26. if not _cached:
  27. _cached.append(fn())
  28. return _cached[0]
  29. return _decorated
  30. @_lazy_load
  31. def load_backend():
  32. from converter.conf.settings import GRAPHICS_BACKEND as backend_name
  33. try:
  34. module = import_module('.base', 'converter.backends.%s' % backend_name)
  35. import warnings
  36. warnings.warn(
  37. "Short names for CONVERTER_BACKEND are deprecated; prepend with 'converter.backends.'",
  38. PendingDeprecationWarning
  39. )
  40. return module
  41. except ImportError, e:
  42. # Look for a fully qualified converter backend name
  43. try:
  44. return import_module('.base', backend_name)
  45. except ImportError, e_user:
  46. # The converter backend wasn't found. Display a helpful error message
  47. # listing all possible (built-in) converter backends.
  48. backend_dir = os.path.join(os.path.dirname(__file__), 'backends')
  49. try:
  50. available_backends = [f for f in os.listdir(backend_dir)
  51. if os.path.isdir(os.path.join(backend_dir, f))
  52. and not f.startswith('.')]
  53. except EnvironmentError:
  54. available_backends = []
  55. available_backends.sort()
  56. if backend_name not in available_backends:
  57. error_msg = ("%r isn't an available converter backend. \n" +
  58. "Try using converter.backends.XXX, where XXX is one of:\n %s\n" +
  59. "Error was: %s") % \
  60. (backend_name, ", ".join(map(repr, available_backends)), e_user)
  61. raise ImproperlyConfigured(error_msg)
  62. else:
  63. # If there's some other error, this must be an error in Mayan itself.
  64. raise
  65. def cleanup(filename):
  66. """
  67. Tries to remove the given filename. Ignores non-existent files
  68. """
  69. try:
  70. os.remove(filename)
  71. except OSError:
  72. pass