From 18fc249770b01c830e6df9c8a66bfa5c5e2f4dc5 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Sun, 1 Jun 2014 01:11:11 +0100 Subject: [PATCH] Added storage --- spa/storage.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 spa/storage.py diff --git a/spa/storage.py b/spa/storage.py new file mode 100644 index 0000000..fd07d59 --- /dev/null +++ b/spa/storage.py @@ -0,0 +1,64 @@ +from django.conf import settings +from django.core.files.storage import Storage +from django.core.files.base import ContentFile + +import azure +from azure.storage import * +from datetime import datetime +import os, mimetypes + +class AzureStorage(Storage): + + def __init__(self, container=None): + self.blob_service = BlobService(account_name=settings.AZURE_STORAGE_ACCOUNT, account_key=settings.AZURE_STORAGE_KEY) + if not container: + self.container = settings.AZURE_STORAGE_CONTAINER + else: + self.container = container + self.blob_service.create_container(self.container, x_ms_blob_public_access='blob') + + def _open(self, name, mode='rb'): + data = self.blob_service.get_blob(self.container, name) + return ContentFile(data) + + def _save(self, name, content): + content.open(mode="rb") + data = content.read() + content_type = mimetypes.guess_type(name)[0] + metadata = {"modified_time": "%f" % os.path.getmtime(content.name)} + self.blob_service.put_blob(self.container, name, data, x_ms_blob_type='BlockBlob', x_ms_blob_content_type=content_type, x_ms_meta_name_values=metadata) + return name + + def delete(self, name): + self.blob_service.delete_blob(self.container, name) + + def exists(self, name): + try: + self.blob_service.get_blob_properties(self.container, name) + return True + except: + return False + + + def listdir(self, path): + dirs = [] + files = [] + blobs = self.blob_service.list_blobs(self.container, prefix=(path or None)) + for blob in blobs: + directory, file_name = os.path.split(blob.name) + dirs.append(directory) + files.append(file_name) + return (dirs, files) + + def size(self, name): + properties = self.blob_service.get_blob_properties(self.container, name) + return properties.get('content-length') + + def url(self, name): + blob = self.blob_service.list_blobs(self.container, prefix=name) + return blob.blobs[0].url + + def modified_time(self, name): + metadata = self.blob_service.get_blob_metadata(self.container, name) + modified_time = float(metadata.get('x-ms-meta-modified_time')) + return datetime.fromtimestamp(modified_time)