class GoogleDriveProvider(ExternalProvider): name = 'Google Drive' short_name = 'googledrive' client_id = drive_settings.CLIENT_ID client_secret = drive_settings.CLIENT_SECRET auth_url_base = '{}{}'.format( drive_settings.OAUTH_BASE_URL, 'auth?access_type=offline&approval_prompt=force') callback_url = '{}{}'.format(drive_settings.API_BASE_URL, 'oauth2/v3/token') auto_refresh_url = callback_url refresh_time = drive_settings.REFRESH_TIME expiry_time = drive_settings.EXPIRY_TIME default_scopes = drive_settings.OAUTH_SCOPE _auth_client = GoogleAuthClient() _drive_client = GoogleDriveClient() def handle_callback(self, response): client = self._auth_client info = client.userinfo(response['access_token']) return { 'provider_id': info['sub'], 'display_name': info['name'], 'profile_url': info.get('profile', None) } def fetch_access_token(self, force_refresh=False): self.refresh_oauth_key(force=force_refresh) return self.account.oauth_key
def get_folders(self, **kwargs): node = self.owner # Defaults exist when called by the API, but are `None` path = kwargs.get('path') or '' folder_id = kwargs.get('folder_id') or 'root' try: access_token = self.fetch_access_token() except exceptions.InvalidAuthError: raise HTTPError(403) client = GoogleDriveClient(access_token) if folder_id == 'root': about = client.about() return [{ 'addon': self.config.short_name, 'path': '/', 'kind': 'folder', 'id': about['rootFolderId'], 'name': '/ (Full Google Drive)', 'urls': { 'folders': api_v2_url('nodes/{}/addons/googledrive/folders/'.format( self.owner._id), params={ 'path': '/', 'id': about['rootFolderId'] }) } }] contents = [ to_hgrid(item, node, path=path) for item in client.folders(folder_id) ] return contents
def get_folders(self, **kwargs): node = self.owner # Defaults exist when called by the API, but are `None` path = kwargs.get('path') or '' folder_id = kwargs.get('folder_id') or 'root' try: access_token = self.fetch_access_token() except exceptions.InvalidAuthError: raise HTTPError(403) client = GoogleDriveClient(access_token) if folder_id == 'root': about = client.about() return [{ 'addon': self.config.short_name, 'path': '/', 'kind': 'folder', 'id': about['rootFolderId'], 'name': '/ (Full Google Drive)', 'urls': { 'folders': api_v2_url('nodes/{}/addons/googledrive/folders/'.format(self.owner._id), params={ 'path': '/', 'id': about['rootFolderId'] }) } }] contents = [ to_hgrid(item, node, path=path) for item in client.folders(folder_id) ] return contents