Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #
  3. # Author Ondrej Barta
  4. # ondrej@ondrej.it
  5. # Copyright 2017
  6.  
  7. import os
  8. import boto3
  9. import easywebdav
  10. import magic
  11. import tempfile
  12.  
  13. from urllib import unquote
  14. from urlparse import urlparse
  15.  
  16.  
  17. class BaseStorage(object):
  18. def __init__(self, url):
  19. self.parse = urlparse(url)
  20.  
  21. def get_public_url(self):
  22. raise NotImplementedError
  23.  
  24. def save(self, data):
  25. raise NotImplementedError
  26.  
  27.  
  28. class AmazonS3(BaseStorage):
  29. def __init__(self, url):
  30. super(AmazonS3, self).__init__(url, acl="private")
  31.  
  32. self.region = os.environ.get("AWS_REGION", "eu-west-1")
  33. self.storage_class = os.environ.get("AWS_STORAGE_CLASS", "STANDARD_IA")
  34. self.username = unquote(self.parse.username)
  35. self.password = unquote(self.parse.password)
  36. self.key = self.parse.path.lstrip("/")
  37. self.acl = acl
  38.  
  39. def get_public_url(self, expires_in=3600 * 24):
  40. s3 = boto3.client(
  41. "s3",
  42. aws_access_key_id=self.username,
  43. aws_secret_access_key=self.password,
  44. region_name=self.region,
  45. )
  46. return s3.generate_presigned_url(
  47. ClientMethod="get_object",
  48. Params={
  49. "Bucket": self.parse.hostname,
  50. "Key": self.key,
  51. },
  52. ExpiresIn=expires_in
  53. )
  54.  
  55. def save(self, data):
  56. s3 = boto3.resource(
  57. "s3",
  58. aws_access_key_id=self.username,
  59. aws_secret_access_key=self.password,
  60. region_name=self.region,
  61. )
  62. s3.Object(self.parse.hostname, self.key).put(
  63. Body=data,
  64. ContentType=get_content_type(data),
  65. ACL=self.acl,
  66. StorageClass=self.storage_class
  67. )
  68.  
  69.  
  70. class WebDAV(BaseStorage):
  71. def get_public_url(self):
  72. return self.parse.geturl()
  73.  
  74. def save(self, data, verify_ssl=False):
  75. dav = easywebdav.connect(
  76. host=self.parse.netloc,
  77. protocol=self.parse.scheme,
  78. username=self.parse.username,
  79. password=self.parse.password,
  80. verify_ssl=verify_ssl
  81. )
  82. dav.upload(data, self.parse.path)
  83.  
  84.  
  85. def storage_driver(url):
  86. parse = urlparse(url)
  87. wrapper, params = {
  88. "s3": (AmazonS3, dict()),
  89. "s3-public": (AmazonS3, dict(acl="public")),
  90. "s3-public-read": (AmazonS3, dict(acl="public-read")),
  91. }.get(scheme, (WebDAV, dict()))
  92. return wrapper(url, **params)
  93.  
  94.  
  95. def get_content_type(temp_file):
  96. path = os.path.join(tempfile.gettempdir(), temp_file.name)
  97. mime = magic.from_file(path, mime=True)
  98. return mime
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement