diff --git a/addons.json b/addons.json index 91f61ebd35f..57c1997c391 100644 --- a/addons.json +++ b/addons.json @@ -17,7 +17,8 @@ "twofactor", "wiki", "googledrive", - "bitbucket" + "bitbucket", + "azureblobstorage" ], "addons_default": [ "osfstorage" diff --git a/addons/azureblobstorage/__init__.py b/addons/azureblobstorage/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/azureblobstorage/apps.py b/addons/azureblobstorage/apps.py new file mode 100644 index 00000000000..308f9aeba75 --- /dev/null +++ b/addons/azureblobstorage/apps.py @@ -0,0 +1,36 @@ +from addons.base.apps import BaseAddonAppConfig + + +class AzureBlobStorageAddonAppConfig(BaseAddonAppConfig): + + default = True + name = 'addons.azureblobstorage' + label = 'addons_azureblobstorage' + full_name = 'Azure Blob Storage' + short_name = 'azureblobstorage' + owners = ['user', 'node'] + configs = ['accounts', 'node'] + categories = ['storage'] + has_hgrid_files = True + + # Define actions for NodeLog + FOLDER_SELECTED = 'azureblobstorage_folder_selected' + NODE_AUTHORIZED = 'azureblobstorage_node_authorized' + NODE_DEAUTHORIZED = 'azureblobstorage_node_deauthorized' + + actions = (FOLDER_SELECTED, NODE_AUTHORIZED, NODE_DEAUTHORIZED, ) + + @property + def routes(self): + # No Flask routes needed for gravyvalet-managed addon + return [] + + @property + def user_settings(self): + # No UserSettings for gravyvalet-managed addon + return None + + @property + def node_settings(self): + # No NodeSettings for gravyvalet-managed addon + return None diff --git a/addons/azureblobstorage/models.py b/addons/azureblobstorage/models.py new file mode 100644 index 00000000000..9592ba1be27 --- /dev/null +++ b/addons/azureblobstorage/models.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from osf.models.files import File, Folder, BaseFileNode +from osf.models.external import ExternalProvider + +class AzureBlobStorageFileNode(BaseFileNode): + _provider = 'azureblobstorage' + + +class AzureBlobStorageFolder(AzureBlobStorageFileNode, Folder): + pass + + +class AzureBlobStorageFile(AzureBlobStorageFileNode, File): + version_identifier = 'version' + + +class AzureBlobStorageProvider(ExternalProvider): + """An alternative to `ExternalProvider` not tied to OAuth""" + + name = 'Azure Blob Storage' + short_name = 'azureblobstorage' + + def __init__(self, account=None): + super(AzureBlobStorageProvider, self).__init__() + + self.account = account + + def __repr__(self): + return '<{name}: {status}>'.format( + name=self.__class__.__name__, + status=self.account.display_name if self.account else 'anonymous' + ) diff --git a/api/base/settings/defaults.py b/api/base/settings/defaults.py index 367ca1b04f9..6f3564eeb8a 100644 --- a/api/base/settings/defaults.py +++ b/api/base/settings/defaults.py @@ -101,6 +101,7 @@ # Addons 'addons.osfstorage', + 'addons.azureblobstorage', 'addons.bitbucket', 'addons.boa', 'addons.box',