From 7b9869fb92996e413df4f991039273b25763bab5 Mon Sep 17 00:00:00 2001 From: Ken Elkabany Date: Thu, 28 Jan 2016 15:46:50 -0800 Subject: [PATCH] Added support for Business API. --- docs/conf.py | 4 +- docs/moduledoc.rst | 16 +- dropbox/__init__.py | 2 +- dropbox/auth.py | 84 + dropbox/babel_validators.py | 2 +- dropbox/base.py | 2243 ++++--- dropbox/base_team.py | 1063 +++ dropbox/dropbox.py | 142 +- dropbox/files.py | 6946 ++++++++++---------- dropbox/rest.py | 2 +- dropbox/session.py | 1 - dropbox/sharing.py | 10990 ++++++++++++++++++++----------- dropbox/team.py | 12049 +++++++++++++++++++++++++++++++++- dropbox/users.py | 991 +-- setup.py | 2 +- test/test_dropbox.py | 22 +- tox.ini | 2 +- 17 files changed, 25772 insertions(+), 8789 deletions(-) create mode 100644 dropbox/auth.py create mode 100644 dropbox/base_team.py diff --git a/docs/conf.py b/docs/conf.py index 49e9b73d..a7cc4f94 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,9 +59,9 @@ # built documents. # # The short X.Y version. -version = '4.0.1' +version = '5.0' # The full version, including alpha/beta/rc tags. -release = '4.0.1' +release = '5.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/moduledoc.rst b/docs/moduledoc.rst index 6fe38f6d..6b3e1388 100644 --- a/docs/moduledoc.rst +++ b/docs/moduledoc.rst @@ -8,18 +8,12 @@ SDK Documentation :members: :undoc-members: -:mod:`dropbox.base` -- Base -============================================ -.. autoclass:: dropbox.base.DropboxBase - :members: - :show-inheritance: - :undoc-members: - :mod:`dropbox.dropbox` -- Dropbox ============================================ .. automodule:: dropbox.dropbox :members: :show-inheritance: + :inherited-members: :special-members: __init__ :undoc-members: @@ -38,6 +32,14 @@ SDK Documentation :special-members: __init__ :undoc-members: +:mod:`dropbox.team` -- Team +============================================ +.. automodule:: dropbox.team + :members: + :show-inheritance: + :special-members: __init__ + :undoc-members: + :mod:`dropbox.users` -- Users ============================================ .. automodule:: dropbox.users diff --git a/dropbox/__init__.py b/dropbox/__init__.py index 44066ad9..d747593c 100644 --- a/dropbox/__init__.py +++ b/dropbox/__init__.py @@ -1,7 +1,7 @@ from __future__ import absolute_import from .dropbox import __version__ -from .dropbox import Dropbox +from .dropbox import Dropbox, DropboxTeam, create_session from .oauth import DropboxOAuth2Flow, DropboxOAuth2FlowNoRedirect # Compatibility with the deprecated v1 client. diff --git a/dropbox/auth.py b/dropbox/auth.py new file mode 100644 index 00000000..50e3ff84 --- /dev/null +++ b/dropbox/auth.py @@ -0,0 +1,84 @@ +# Auto-generated by BabelAPI, do not modify. +try: + from . import babel_validators as bv +except (SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import babel_validators as bv + +class AuthError(object): + """ + Errors occurred during authentication. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_access_token: The access token is invalid. + :ivar invalid_select_user: The user specified in 'Dropbox-API-Select-User' + is no longer on the team. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_access_token = None + # Attribute is overwritten below the class definition + invalid_select_user = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_invalid_access_token(self): + """ + Check if the union tag is ``invalid_access_token``. + + :rtype: bool + """ + return self._tag == 'invalid_access_token' + + def is_invalid_select_user(self): + """ + Check if the union tag is ``invalid_select_user``. + + :rtype: bool + """ + return self._tag == 'invalid_select_user' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'AuthError(%r, %r)' % (self._tag, self._value) + +AuthError._invalid_access_token_validator = bv.Void() +AuthError._invalid_select_user_validator = bv.Void() +AuthError._other_validator = bv.Void() +AuthError._tagmap = { + 'invalid_access_token': AuthError._invalid_access_token_validator, + 'invalid_select_user': AuthError._invalid_select_user_validator, + 'other': AuthError._other_validator, +} + +AuthError.invalid_access_token = AuthError('invalid_access_token') +AuthError.invalid_select_user = AuthError('invalid_select_user') +AuthError.other = AuthError('other') + diff --git a/dropbox/babel_validators.py b/dropbox/babel_validators.py index ce30c63c..41d106aa 100644 --- a/dropbox/babel_validators.py +++ b/dropbox/babel_validators.py @@ -264,7 +264,7 @@ def __init__(self, min_length=None, max_length=None, pattern=None): if pattern: try: - self.pattern_re = re.compile(r"\A" + pattern + r"\Z") + self.pattern_re = re.compile(r"\A(?:" + pattern + r")\Z") except re.error as e: raise AssertionError('Regex {!r} failed: {}'.format( pattern, e.args[0])) diff --git a/dropbox/base.py b/dropbox/base.py index 20407c4c..e46437ee 100644 --- a/dropbox/base.py +++ b/dropbox/base.py @@ -6,12 +6,14 @@ from . import ( async, + auth, files, sharing, team, users, ) + class DropboxBase(object): __metaclass__ = ABCMeta @@ -19,12 +21,158 @@ class DropboxBase(object): def request(self): pass - # ------------------------------------------ - # Routes in async namespace - # ------------------------------------------ # Routes in files namespace + def files_copy(self, + from_path, + to_path): + """ + Copy a file or folder to a different location in the user's Dropbox. If + the source path is a folder all its contents will be copied. + + :param str from_path: Path in the user's Dropbox to be copied or moved. + :param str to_path: Path in the user's Dropbox that is the destination. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.RelocationError` + """ + arg = files.RelocationArg(from_path, + to_path) + r = self.request( + 'api', + 'files/copy', + 'rpc', + bv.Struct(files.RelocationArg), + bv.StructTree(files.Metadata), + bv.Union(files.RelocationError), + arg, + None, + ) + return r + + def files_create_folder(self, + path): + """ + Create a folder at a given path. + + :param str path: Path in the user's Dropbox to create. + :rtype: :class:`dropbox.files.FolderMetadata` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.CreateFolderError` + """ + arg = files.CreateFolderArg(path) + r = self.request( + 'api', + 'files/create_folder', + 'rpc', + bv.Struct(files.CreateFolderArg), + bv.Struct(files.FolderMetadata), + bv.Union(files.CreateFolderError), + arg, + None, + ) + return r + + def files_delete(self, + path): + """ + Delete the file or folder at a given path. If the path is a folder, all + its contents will be deleted too. + + :param str path: Path in the user's Dropbox to delete. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.DeleteError` + """ + arg = files.DeleteArg(path) + r = self.request( + 'api', + 'files/delete', + 'rpc', + bv.Struct(files.DeleteArg), + bv.StructTree(files.Metadata), + bv.Union(files.DeleteError), + arg, + None, + ) + return r + + def files_download(self, + path, + rev=None): + """ + Download a file from a user's Dropbox. + + :param str path: The path of the file to download. + :param Nullable rev: Deprecated. Please specify revision in + :field:'path' instead + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.DownloadError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = files.DownloadArg(path, + rev) + r = self.request( + 'content', + 'files/download', + 'download', + bv.Struct(files.DownloadArg), + bv.Struct(files.FileMetadata), + bv.Union(files.DownloadError), + arg, + None, + ) + return r + + def files_download_to_file(self, + download_path, + path, + rev=None): + """ + Download a file from a user's Dropbox. + + :param str download_path: Path on local machine to save file. + :param str path: The path of the file to download. + :param Nullable rev: Deprecated. Please specify revision in + :field:'path' instead + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.DownloadError` + """ + arg = files.DownloadArg(path, + rev) + r = self.request( + 'content', + 'files/download', + 'download', + bv.Struct(files.DownloadArg), + bv.Struct(files.FileMetadata), + bv.Union(files.DownloadError), + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + def files_get_metadata(self, path, include_media_info=False): @@ -40,55 +188,180 @@ def files_get_metadata(self, If this raises, ApiError.reason is of type: :class:`dropbox.files.GetMetadataError` """ - o = files.GetMetadataArg(path, - include_media_info) - r = self.request(self.HOST_API, - 'files/get_metadata', - self.ROUTE_STYLE_RPC, - bv.Struct(files.GetMetadataArg), - bv.StructTree(files.Metadata), - bv.Union(files.GetMetadataError), - o, - None) + arg = files.GetMetadataArg(path, + include_media_info) + r = self.request( + 'api', + 'files/get_metadata', + 'rpc', + bv.Struct(files.GetMetadataArg), + bv.StructTree(files.Metadata), + bv.Union(files.GetMetadataError), + arg, + None, + ) return r - def files_list_folder_longpoll(self, - cursor, - timeout=30): + def files_get_preview(self, + path, + rev=None): """ - A longpoll endpoint to wait for changes on an account. In conjunction - with :meth:`list_folder`, this call gives you a low-latency way to - monitor an account for file changes. The connection will block until - there are changes available or a timeout occurs. This endpoint is useful - mostly for client-side apps. If you're looking for server-side - notifications, check out our `webhooks documentation - `_. + Get a preview for a file. Currently previews are only generated for the + files with the following extensions: .doc, .docx, .docm, .ppt, .pps, + .ppsx, .ppsm, .pptx, .pptm, .xls, .xlsx, .xlsm, .rtf - :param str cursor: A cursor as returned by :meth:`list_folder` or - :meth:`list_folder_continue` - :param long timeout: A timeout in seconds. The request will block for at - most this length of time, plus up to 90 seconds of random jitter - added to avoid the thundering herd problem. Care should be taken - when using this parameter, as some network infrastructure does not - support long timeouts. - :rtype: :class:`dropbox.files.ListFolderLongpollResult` + :param str path: The path of the file to preview. + :param Nullable rev: Deprecated. Please specify revision in + :field:'path' instead + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.ListFolderLongpollError` + :class:`dropbox.files.PreviewError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = files.PreviewArg(path, + rev) + r = self.request( + 'content', + 'files/get_preview', + 'download', + bv.Struct(files.PreviewArg), + bv.Struct(files.FileMetadata), + bv.Union(files.PreviewError), + arg, + None, + ) + return r + + def files_get_preview_to_file(self, + download_path, + path, + rev=None): + """ + Get a preview for a file. Currently previews are only generated for the + files with the following extensions: .doc, .docx, .docm, .ppt, .pps, + .ppsx, .ppsm, .pptx, .pptm, .xls, .xlsx, .xlsm, .rtf + + :param str download_path: Path on local machine to save file. + :param str path: The path of the file to preview. + :param Nullable rev: Deprecated. Please specify revision in + :field:'path' instead + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.PreviewError` + """ + arg = files.PreviewArg(path, + rev) + r = self.request( + 'content', + 'files/get_preview', + 'download', + bv.Struct(files.PreviewArg), + bv.Struct(files.FileMetadata), + bv.Union(files.PreviewError), + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def files_get_thumbnail(self, + path, + format=files.ThumbnailFormat.jpeg, + size=files.ThumbnailSize.w64h64): + """ + Get a thumbnail for an image. This method currently supports files with + the following file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. + Photos that are larger than 20MB in size won't be converted to a + thumbnail. + + :param str path: The path to the image file you want to thumbnail. + :param format: The format for the thumbnail image, jpeg (default) or + png. For images that are photos, jpeg should be preferred, while + png is better for screenshots and digital arts. + :type format: :class:`dropbox.files.ThumbnailFormat` + :param size: The size for the thumbnail image. + :type size: :class:`dropbox.files.ThumbnailSize` + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.ThumbnailError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. """ - o = files.ListFolderLongpollArg(cursor, - timeout) - r = self.request(self.HOST_NOTIFY, - 'files/list_folder/longpoll', - self.ROUTE_STYLE_RPC, - bv.Struct(files.ListFolderLongpollArg), - bv.Struct(files.ListFolderLongpollResult), - bv.Union(files.ListFolderLongpollError), - o, - None) + arg = files.ThumbnailArg(path, + format, + size) + r = self.request( + 'content', + 'files/get_thumbnail', + 'download', + bv.Struct(files.ThumbnailArg), + bv.Struct(files.FileMetadata), + bv.Union(files.ThumbnailError), + arg, + None, + ) return r + def files_get_thumbnail_to_file(self, + download_path, + path, + format=files.ThumbnailFormat.jpeg, + size=files.ThumbnailSize.w64h64): + """ + Get a thumbnail for an image. This method currently supports files with + the following file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. + Photos that are larger than 20MB in size won't be converted to a + thumbnail. + + :param str download_path: Path on local machine to save file. + :param str path: The path to the image file you want to thumbnail. + :param format: The format for the thumbnail image, jpeg (default) or + png. For images that are photos, jpeg should be preferred, while + png is better for screenshots and digital arts. + :type format: :class:`dropbox.files.ThumbnailFormat` + :param size: The size for the thumbnail image. + :type size: :class:`dropbox.files.ThumbnailSize` + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.ThumbnailError` + """ + arg = files.ThumbnailArg(path, + format, + size) + r = self.request( + 'content', + 'files/get_thumbnail', + 'download', + bv.Struct(files.ThumbnailArg), + bv.Struct(files.FileMetadata), + bv.Union(files.ThumbnailError), + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + def files_list_folder(self, path, recursive=False, @@ -111,18 +384,20 @@ def files_list_folder(self, If this raises, ApiError.reason is of type: :class:`dropbox.files.ListFolderError` """ - o = files.ListFolderArg(path, - recursive, - include_media_info, - include_deleted) - r = self.request(self.HOST_API, - 'files/list_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(files.ListFolderArg), - bv.Struct(files.ListFolderResult), - bv.Union(files.ListFolderError), - o, - None) + arg = files.ListFolderArg(path, + recursive, + include_media_info, + include_deleted) + r = self.request( + 'api', + 'files/list_folder', + 'rpc', + bv.Struct(files.ListFolderArg), + bv.Struct(files.ListFolderResult), + bv.Union(files.ListFolderError), + arg, + None, + ) return r def files_list_folder_continue(self, @@ -139,15 +414,17 @@ def files_list_folder_continue(self, If this raises, ApiError.reason is of type: :class:`dropbox.files.ListFolderContinueError` """ - o = files.ListFolderContinueArg(cursor) - r = self.request(self.HOST_API, - 'files/list_folder/continue', - self.ROUTE_STYLE_RPC, - bv.Struct(files.ListFolderContinueArg), - bv.Struct(files.ListFolderResult), - bv.Union(files.ListFolderContinueError), - o, - None) + arg = files.ListFolderContinueArg(cursor) + r = self.request( + 'api', + 'files/list_folder/continue', + 'rpc', + bv.Struct(files.ListFolderContinueArg), + bv.Struct(files.ListFolderResult), + bv.Union(files.ListFolderContinueError), + arg, + None, + ) return r def files_list_folder_get_latest_cursor(self, @@ -176,171 +453,216 @@ def files_list_folder_get_latest_cursor(self, If this raises, ApiError.reason is of type: :class:`dropbox.files.ListFolderError` """ - o = files.ListFolderArg(path, - recursive, - include_media_info, - include_deleted) - r = self.request(self.HOST_API, - 'files/list_folder/get_latest_cursor', - self.ROUTE_STYLE_RPC, - bv.Struct(files.ListFolderArg), - bv.Struct(files.ListFolderGetLatestCursorResult), - bv.Union(files.ListFolderError), - o, - None) + arg = files.ListFolderArg(path, + recursive, + include_media_info, + include_deleted) + r = self.request( + 'api', + 'files/list_folder/get_latest_cursor', + 'rpc', + bv.Struct(files.ListFolderArg), + bv.Struct(files.ListFolderGetLatestCursorResult), + bv.Union(files.ListFolderError), + arg, + None, + ) return r - def files_download(self, - path, - rev=None): + def files_list_folder_longpoll(self, + cursor, + timeout=30): """ - Download a file from a user's Dropbox. + A longpoll endpoint to wait for changes on an account. In conjunction + with :meth:`list_folder`, this call gives you a low-latency way to + monitor an account for file changes. The connection will block until + there are changes available or a timeout occurs. This endpoint is useful + mostly for client-side apps. If you're looking for server-side + notifications, check out our `webhooks documentation + `_. - :param str path: The path of the file to download. - :param Nullable rev: Deprecated. Please specify revision in - :field:'path' instead - :rtype: (:class:`dropbox.files.FileMetadata`, - :class:`requests.models.Response`) + :param str cursor: A cursor as returned by :meth:`list_folder` or + :meth:`list_folder_continue` + :param long timeout: A timeout in seconds. The request will block for at + most this length of time, plus up to 90 seconds of random jitter + added to avoid the thundering herd problem. Care should be taken + when using this parameter, as some network infrastructure does not + support long timeouts. + :rtype: :class:`dropbox.files.ListFolderLongpollResult` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.DownloadError` - - If you do not consume the entire response body, then you must call close - on the response object, otherwise you will max out your available - connections. We recommend using the `contextlib.closing - `_ - context manager to ensure this. + :class:`dropbox.files.ListFolderLongpollError` """ - o = files.DownloadArg(path, - rev) - r = self.request(self.HOST_CONTENT, - 'files/download', - self.ROUTE_STYLE_DOWNLOAD, - bv.Struct(files.DownloadArg), - bv.Struct(files.FileMetadata), - bv.Union(files.DownloadError), - o, - None) + arg = files.ListFolderLongpollArg(cursor, + timeout) + r = self.request( + 'notify', + 'files/list_folder/longpoll', + 'rpc', + bv.Struct(files.ListFolderLongpollArg), + bv.Struct(files.ListFolderLongpollResult), + bv.Union(files.ListFolderLongpollError), + arg, + None, + ) return r - def files_download_to_file(self, - download_path, - path, - rev=None): + def files_list_revisions(self, + path, + limit=10): """ - Download a file from a user's Dropbox. + Return revisions of a file - :param str download_path: Path on local machine to save file. - :param str path: The path of the file to download. - :param Nullable rev: Deprecated. Please specify revision in - :field:'path' instead - :rtype: (:class:`dropbox.files.FileMetadata`, - :class:`requests.models.Response`) + :param str path: The path to the file you want to see the revisions of. + :param long limit: The maximum number of revision entries returned. + :rtype: :class:`dropbox.files.ListRevisionsResult` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.DownloadError` + :class:`dropbox.files.ListRevisionsError` """ - o = files.DownloadArg(path, - rev) - r = self.request(self.HOST_CONTENT, - 'files/download', - self.ROUTE_STYLE_DOWNLOAD, - bv.Struct(files.DownloadArg), - bv.Struct(files.FileMetadata), - bv.Union(files.DownloadError), - o, - None) - self._save_body_to_file(download_path, r[1]) - return r[0] + arg = files.ListRevisionsArg(path, + limit) + r = self.request( + 'api', + 'files/list_revisions', + 'rpc', + bv.Struct(files.ListRevisionsArg), + bv.Struct(files.ListRevisionsResult), + bv.Union(files.ListRevisionsError), + arg, + None, + ) + return r - def files_upload_session_start(self, - f): + def files_move(self, + from_path, + to_path): """ - Upload sessions allow you to upload a single file using multiple - requests. This call starts a new upload session with the given data. - You can then use :meth:`upload_session_append` to add more data and - :meth:`upload_session_finish` to save all the data to a file in Dropbox. - A single request should not upload more than 150 MB of file contents. + Move a file or folder to a different location in the user's Dropbox. If + the source path is a folder all its contents will be moved. - :param f: A string or file-like obj of data. - :rtype: :class:`dropbox.files.UploadSessionStartResult` + :param str from_path: Path in the user's Dropbox to be copied or moved. + :param str to_path: Path in the user's Dropbox that is the destination. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.RelocationError` """ - o = None - r = self.request(self.HOST_CONTENT, - 'files/upload_session/start', - self.ROUTE_STYLE_UPLOAD, - bv.Void(), - bv.Struct(files.UploadSessionStartResult), - bv.Void(), - o, - f) + arg = files.RelocationArg(from_path, + to_path) + r = self.request( + 'api', + 'files/move', + 'rpc', + bv.Struct(files.RelocationArg), + bv.StructTree(files.Metadata), + bv.Union(files.RelocationError), + arg, + None, + ) return r - def files_upload_session_append(self, - f, - session_id, - offset): + def files_permanently_delete(self, + path): """ - Append more data to an upload session. A single request should not - upload more than 150 MB of file contents. + Permanently delete the file or folder at a given path (see + https://www.dropbox.com/en/help/40). Note: This endpoint is only + available for Dropbox Business apps. - :param f: A string or file-like obj of data. - :param str session_id: The upload session ID (returned by - :meth:`upload_session_start`). - :param long offset: The amount of data that has been uploaded so far. We - use this to make sure upload data isn't lost or duplicated in the - event of a network error. + :param str path: Path in the user's Dropbox to delete. :rtype: None :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.UploadSessionLookupError` + :class:`dropbox.files.DeleteError` """ - o = files.UploadSessionCursor(session_id, - offset) - r = self.request(self.HOST_CONTENT, - 'files/upload_session/append', - self.ROUTE_STYLE_UPLOAD, - bv.Struct(files.UploadSessionCursor), - bv.Void(), - bv.Union(files.UploadSessionLookupError), - o, - f) + arg = files.DeleteArg(path) + r = self.request( + 'api', + 'files/permanently_delete', + 'rpc', + bv.Struct(files.DeleteArg), + bv.Void(), + bv.Union(files.DeleteError), + arg, + None, + ) return None - def files_upload_session_finish(self, - f, - cursor, - commit): + def files_restore(self, + path, + rev): """ - Finish an upload session and save the uploaded data to the given file - path. A single request should not upload more than 150 MB of file - contents. + Restore a file to a specific revision - :param f: A string or file-like obj of data. - :param cursor: Contains the upload session ID and the offset. - :type cursor: :class:`dropbox.files.UploadSessionCursor` - :param commit: Contains the path and other optional modifiers for the - commit. - :type commit: :class:`dropbox.files.CommitInfo` + :param str path: The path to the file you want to restore. + :param str rev: The revision to restore for the file. :rtype: :class:`dropbox.files.FileMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.UploadSessionFinishError` + :class:`dropbox.files.RestoreError` """ - o = files.UploadSessionFinishArg(cursor, - commit) - r = self.request(self.HOST_CONTENT, - 'files/upload_session/finish', - self.ROUTE_STYLE_UPLOAD, - bv.Struct(files.UploadSessionFinishArg), - bv.Struct(files.FileMetadata), - bv.Union(files.UploadSessionFinishError), - o, - f) + arg = files.RestoreArg(path, + rev) + r = self.request( + 'api', + 'files/restore', + 'rpc', + bv.Struct(files.RestoreArg), + bv.Struct(files.FileMetadata), + bv.Union(files.RestoreError), + arg, + None, + ) + return r + + def files_search(self, + path, + query, + start=0, + max_results=100, + mode=files.SearchMode.filename): + """ + Searches for files and folders. + + :param str path: The path in the user's Dropbox to search. Should + probably be a folder. + :param str query: The string to search for. The search string is split + on spaces into multiple tokens. For file name searching, the last + token is used for prefix matching (i.e. "bat c" matches "bat cave" + but not "batman car"). + :param long start: The starting index within the search results (used + for paging). + :param long max_results: The maximum number of search results to return. + :param mode: The search mode (filename, filename_and_content, or + deleted_filename). Note that searching file content is only + available for Dropbox Business accounts. + :type mode: :class:`dropbox.files.SearchMode` + :rtype: :class:`dropbox.files.SearchResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.files.SearchError` + """ + arg = files.SearchArg(path, + query, + start, + max_results, + mode) + r = self.request( + 'api', + 'files/search', + 'rpc', + bv.Struct(files.SearchArg), + bv.Struct(files.SearchResult), + bv.Union(files.SearchError), + arg, + None, + ) return r def files_upload(self, @@ -378,290 +700,342 @@ def files_upload(self, If this raises, ApiError.reason is of type: :class:`dropbox.files.UploadError` """ - o = files.CommitInfo(path, - mode, - autorename, - client_modified, - mute) - r = self.request(self.HOST_CONTENT, - 'files/upload', - self.ROUTE_STYLE_UPLOAD, - bv.Struct(files.CommitInfo), - bv.Struct(files.FileMetadata), - bv.Union(files.UploadError), - o, - f) + arg = files.CommitInfo(path, + mode, + autorename, + client_modified, + mute) + r = self.request( + 'content', + 'files/upload', + 'upload', + bv.Struct(files.CommitInfo), + bv.Struct(files.FileMetadata), + bv.Union(files.UploadError), + arg, + f, + ) return r - def files_search(self, - path, - query, - start=0, - max_results=100, - mode=files.SearchMode.filename): + def files_upload_session_append(self, + f, + session_id, + offset): """ - Searches for files and folders. + Append more data to an upload session. A single request should not + upload more than 150 MB of file contents. - :param str path: The path in the user's Dropbox to search. Should - probably be a folder. - :param str query: The string to search for. The search string is split - on spaces into multiple tokens. For file name searching, the last - token is used for prefix matching (i.e. "bat c" matches "bat cave" - but not "batman car"). - :param long start: The starting index within the search results (used - for paging). - :param long max_results: The maximum number of search results to return. - :param mode: The search mode (filename, filename_and_content, or - deleted_filename). Note that searching file content is only - available for Dropbox Business accounts. - :type mode: :class:`dropbox.files.SearchMode` - :rtype: :class:`dropbox.files.SearchResult` + :param f: A string or file-like obj of data. + :param str session_id: The upload session ID (returned by + :meth:`upload_session_start`). + :param long offset: The amount of data that has been uploaded so far. We + use this to make sure upload data isn't lost or duplicated in the + event of a network error. + :rtype: None :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.SearchError` + :class:`dropbox.files.UploadSessionLookupError` """ - o = files.SearchArg(path, - query, - start, - max_results, - mode) - r = self.request(self.HOST_API, - 'files/search', - self.ROUTE_STYLE_RPC, - bv.Struct(files.SearchArg), - bv.Struct(files.SearchResult), - bv.Union(files.SearchError), - o, - None) - return r + arg = files.UploadSessionCursor(session_id, + offset) + r = self.request( + 'content', + 'files/upload_session/append', + 'upload', + bv.Struct(files.UploadSessionCursor), + bv.Void(), + bv.Union(files.UploadSessionLookupError), + arg, + f, + ) + return None - def files_create_folder(self, - path): + def files_upload_session_finish(self, + f, + cursor, + commit): """ - Create a folder at a given path. + Finish an upload session and save the uploaded data to the given file + path. A single request should not upload more than 150 MB of file + contents. - :param str path: Path in the user's Dropbox to create. - :rtype: :class:`dropbox.files.FolderMetadata` + :param f: A string or file-like obj of data. + :param cursor: Contains the upload session ID and the offset. + :type cursor: :class:`dropbox.files.UploadSessionCursor` + :param commit: Contains the path and other optional modifiers for the + commit. + :type commit: :class:`dropbox.files.CommitInfo` + :rtype: :class:`dropbox.files.FileMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.CreateFolderError` + :class:`dropbox.files.UploadSessionFinishError` """ - o = files.CreateFolderArg(path) - r = self.request(self.HOST_API, - 'files/create_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(files.CreateFolderArg), - bv.Struct(files.FolderMetadata), - bv.Union(files.CreateFolderError), - o, - None) + arg = files.UploadSessionFinishArg(cursor, + commit) + r = self.request( + 'content', + 'files/upload_session/finish', + 'upload', + bv.Struct(files.UploadSessionFinishArg), + bv.Struct(files.FileMetadata), + bv.Union(files.UploadSessionFinishError), + arg, + f, + ) return r - def files_delete(self, - path): + def files_upload_session_start(self, + f): """ - Delete the file or folder at a given path. If the path is a folder, all - its contents will be deleted too. + Upload sessions allow you to upload a single file using multiple + requests. This call starts a new upload session with the given data. + You can then use :meth:`upload_session_append` to add more data and + :meth:`upload_session_finish` to save all the data to a file in Dropbox. + A single request should not upload more than 150 MB of file contents. - :param str path: Path in the user's Dropbox to delete. - :rtype: :class:`dropbox.files.Metadata` + :param f: A string or file-like obj of data. + :rtype: :class:`dropbox.files.UploadSessionStartResult` + """ + arg = None + r = self.request( + 'content', + 'files/upload_session/start', + 'upload', + bv.Void(), + bv.Struct(files.UploadSessionStartResult), + bv.Void(), + arg, + f, + ) + return r + + # ------------------------------------------ + # Routes in sharing namespace + + def sharing_add_folder_member(self, + shared_folder_id, + members, + quiet=False, + custom_message=None): + """ + Allows an owner or editor (if the ACL update policy allows) of a shared + folder to add another member. For the new member to get access to all + the functionality for this folder, you will need to call + :meth:`mount_folder` on their behalf. Apps must have full Dropbox access + to use this endpoint. Warning: This endpoint is in beta and is subject + to minor but possibly backwards-incompatible changes. + + :param str shared_folder_id: The ID for the shared folder. + :param list members: The intended list of members to add. Added members + will receive invites to join the shared folder. + :param bool quiet: Whether added members should be notified via email + and device notifications of their invite. + :param Nullable custom_message: Optional message to display to added + members in their invitation. + :rtype: None :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.DeleteError` + :class:`dropbox.sharing.AddFolderMemberError` """ - o = files.DeleteArg(path) - r = self.request(self.HOST_API, - 'files/delete', - self.ROUTE_STYLE_RPC, - bv.Struct(files.DeleteArg), - bv.StructTree(files.Metadata), - bv.Union(files.DeleteError), - o, - None) - return r + arg = sharing.AddFolderMemberArg(shared_folder_id, + members, + quiet, + custom_message) + r = self.request( + 'api', + 'sharing/add_folder_member', + 'rpc', + bv.Struct(sharing.AddFolderMemberArg), + bv.Void(), + bv.Union(sharing.AddFolderMemberError), + arg, + None, + ) + return None - def files_permanently_delete(self, - path): + def sharing_check_job_status(self, + async_job_id): """ - Permanently delete the file or folder at a given path (see - https://www.dropbox.com/en/help/40). Note: This endpoint is only - available for Dropbox Business apps. + Returns the status of an asynchronous job. Apps must have full Dropbox + access to use this endpoint. Warning: This endpoint is in beta and is + subject to minor but possibly backwards-incompatible changes. - :param str path: Path in the user's Dropbox to delete. - :rtype: None + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.sharing.JobStatus` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.DeleteError` + :class:`dropbox.sharing.PollError` """ - o = files.DeleteArg(path) - r = self.request(self.HOST_API, - 'files/permanently_delete', - self.ROUTE_STYLE_RPC, - bv.Struct(files.DeleteArg), - bv.Void(), - bv.Union(files.DeleteError), - o, - None) - return None + arg = async.PollArg(async_job_id) + r = self.request( + 'api', + 'sharing/check_job_status', + 'rpc', + bv.Struct(async.PollArg), + bv.Union(sharing.JobStatus), + bv.Union(async.PollError), + arg, + None, + ) + return r - def files_copy(self, - from_path, - to_path): + def sharing_check_share_job_status(self, + async_job_id): """ - Copy a file or folder to a different location in the user's Dropbox. If - the source path is a folder all its contents will be copied. + Returns the status of an asynchronous job for sharing a folder. Apps + must have full Dropbox access to use this endpoint. Warning: This + endpoint is in beta and is subject to minor but possibly + backwards-incompatible changes. - :param str from_path: Path in the user's Dropbox to be copied or moved. - :param str to_path: Path in the user's Dropbox that is the destination. - :rtype: :class:`dropbox.files.Metadata` + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.sharing.ShareFolderJobStatus` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.RelocationError` + :class:`dropbox.sharing.PollError` """ - o = files.RelocationArg(from_path, - to_path) - r = self.request(self.HOST_API, - 'files/copy', - self.ROUTE_STYLE_RPC, - bv.Struct(files.RelocationArg), - bv.StructTree(files.Metadata), - bv.Union(files.RelocationError), - o, - None) + arg = async.PollArg(async_job_id) + r = self.request( + 'api', + 'sharing/check_share_job_status', + 'rpc', + bv.Struct(async.PollArg), + bv.Union(sharing.ShareFolderJobStatus), + bv.Union(async.PollError), + arg, + None, + ) return r - def files_move(self, - from_path, - to_path): + def sharing_create_shared_link(self, + path, + short_url=False, + pending_upload=None): """ - Move a file or folder to a different location in the user's Dropbox. If - the source path is a folder all its contents will be moved. + Create a shared link. If a shared link already exists for the given + path, that link is returned. Note that in the returned + :class:`PathLinkMetadata`, the ``PathLinkMetadata.url`` field is the + shortened URL if ``CreateSharedLinkArg.short_url`` argument is set to + ``True``. Previously, it was technically possible to break a shared link + by moving or renaming the corresponding file or folder. In the future, + this will no longer be the case, so your app shouldn't rely on this + behavior. Instead, if your app needs to revoke a shared link, use + :meth:`revoke_shared_link`. - :param str from_path: Path in the user's Dropbox to be copied or moved. - :param str to_path: Path in the user's Dropbox that is the destination. - :rtype: :class:`dropbox.files.Metadata` + :param str path: The path to share. + :param bool short_url: Whether to return a shortened URL. + :param Nullable pending_upload: If it's okay to share a path that does + not yet exist, set this to either ``PendingUploadMode.file`` or + ``PendingUploadMode.folder`` to indicate whether to assume it's a + file or folder. + :rtype: :class:`dropbox.sharing.PathLinkMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.RelocationError` + :class:`dropbox.sharing.CreateSharedLinkError` """ - o = files.RelocationArg(from_path, - to_path) - r = self.request(self.HOST_API, - 'files/move', - self.ROUTE_STYLE_RPC, - bv.Struct(files.RelocationArg), - bv.StructTree(files.Metadata), - bv.Union(files.RelocationError), - o, - None) + arg = sharing.CreateSharedLinkArg(path, + short_url, + pending_upload) + r = self.request( + 'api', + 'sharing/create_shared_link', + 'rpc', + bv.Struct(sharing.CreateSharedLinkArg), + bv.Struct(sharing.PathLinkMetadata), + bv.Union(sharing.CreateSharedLinkError), + arg, + None, + ) return r - def files_get_thumbnail(self, - path, - format=files.ThumbnailFormat.jpeg, - size=files.ThumbnailSize.w64h64): + def sharing_create_shared_link_with_settings(self, + path, + settings=None): """ - Get a thumbnail for an image. This method currently supports files with - the following file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. - Photos that are larger than 20MB in size won't be converted to a - thumbnail. + Create a shared link with custom settings. If no settings are given then + the default visibility is ``RequestedVisibility.public`` (The resolved + visibility, though, may depend on other aspects such as team and shared + folder settings). - :param str path: The path to the image file you want to thumbnail. - :param format: The format for the thumbnail image, jpeg (default) or - png. For images that are photos, jpeg should be preferred, while - png is better for screenshots and digital arts. - :type format: :class:`dropbox.files.ThumbnailFormat` - :param size: The size for the thumbnail image. - :type size: :class:`dropbox.files.ThumbnailSize` - :rtype: (:class:`dropbox.files.FileMetadata`, - :class:`requests.models.Response`) + :param str path: The path to be shared by the shared link + :param Nullable settings: The requested settings for the newly created + shared link + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.ThumbnailError` - - If you do not consume the entire response body, then you must call close - on the response object, otherwise you will max out your available - connections. We recommend using the `contextlib.closing - `_ - context manager to ensure this. - """ - o = files.ThumbnailArg(path, - format, - size) - r = self.request(self.HOST_CONTENT, - 'files/get_thumbnail', - self.ROUTE_STYLE_DOWNLOAD, - bv.Struct(files.ThumbnailArg), - bv.Struct(files.FileMetadata), - bv.Union(files.ThumbnailError), - o, - None) + :class:`dropbox.sharing.CreateSharedLinkWithSettingsError` + """ + arg = sharing.CreateSharedLinkWithSettingsArg(path, + settings) + r = self.request( + 'api', + 'sharing/create_shared_link_with_settings', + 'rpc', + bv.Struct(sharing.CreateSharedLinkWithSettingsArg), + bv.StructTree(sharing.SharedLinkMetadata), + bv.Union(sharing.CreateSharedLinkWithSettingsError), + arg, + None, + ) return r - def files_get_thumbnail_to_file(self, - download_path, - path, - format=files.ThumbnailFormat.jpeg, - size=files.ThumbnailSize.w64h64): + def sharing_get_folder_metadata(self, + shared_folder_id, + actions=None): """ - Get a thumbnail for an image. This method currently supports files with - the following file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. - Photos that are larger than 20MB in size won't be converted to a - thumbnail. + Returns shared folder metadata by its folder ID. Apps must have full + Dropbox access to use this endpoint. Warning: This endpoint is in beta + and is subject to minor but possibly backwards-incompatible changes. - :param str download_path: Path on local machine to save file. - :param str path: The path to the image file you want to thumbnail. - :param format: The format for the thumbnail image, jpeg (default) or - png. For images that are photos, jpeg should be preferred, while - png is better for screenshots and digital arts. - :type format: :class:`dropbox.files.ThumbnailFormat` - :param size: The size for the thumbnail image. - :type size: :class:`dropbox.files.ThumbnailSize` - :rtype: (:class:`dropbox.files.FileMetadata`, - :class:`requests.models.Response`) + :param str shared_folder_id: The ID for the shared folder. + :param Nullable actions: Folder actions to query. + :rtype: :class:`dropbox.sharing.SharedFolderMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.ThumbnailError` + :class:`dropbox.sharing.SharedFolderAccessError` """ - o = files.ThumbnailArg(path, - format, - size) - r = self.request(self.HOST_CONTENT, - 'files/get_thumbnail', - self.ROUTE_STYLE_DOWNLOAD, - bv.Struct(files.ThumbnailArg), - bv.Struct(files.FileMetadata), - bv.Union(files.ThumbnailError), - o, - None) - self._save_body_to_file(download_path, r[1]) - return r[0] + arg = sharing.GetMetadataArgs(shared_folder_id, + actions) + r = self.request( + 'api', + 'sharing/get_folder_metadata', + 'rpc', + bv.Struct(sharing.GetMetadataArgs), + bv.Struct(sharing.SharedFolderMetadata), + bv.Union(sharing.SharedFolderAccessError), + arg, + None, + ) + return r - def files_get_preview(self, - path, - rev=None): + def sharing_get_shared_link_file(self, + url, + path=None, + link_password=None): """ - Get a preview for a file. Currently previews are only generated for the - files with the following extensions: .doc, .docx, .docm, .ppt, .pps, - .ppsx, .ppsm, .pptx, .pptm, .xls, .xlsx, .xlsm, .rtf + Download the shared link's file from a user's Dropbox. - :param str path: The path of the file to preview. - :param Nullable rev: Deprecated. Please specify revision in - :field:'path' instead - :rtype: (:class:`dropbox.files.FileMetadata`, + :param str url: URL of the shared link. + :param Nullable path: If the shared link is to a folder, this parameter + can be used to retrieve the metadata for a specific file or + sub-folder in this folder. A relative path should be used. + :param Nullable link_password: If the shared link has a password, this + parameter can be used. + :rtype: (:class:`dropbox.sharing.SharedLinkMetadata`, :class:`requests.models.Response`) :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.PreviewError` + :class:`dropbox.sharing.GetSharedLinkFileError` If you do not consume the entire response body, then you must call close on the response object, otherwise you will max out your available @@ -669,106 +1043,93 @@ def files_get_preview(self, `_ context manager to ensure this. """ - o = files.PreviewArg(path, - rev) - r = self.request(self.HOST_CONTENT, - 'files/get_preview', - self.ROUTE_STYLE_DOWNLOAD, - bv.Struct(files.PreviewArg), - bv.Struct(files.FileMetadata), - bv.Union(files.PreviewError), - o, - None) + arg = sharing.GetSharedLinkMetadataArg(url, + path, + link_password) + r = self.request( + 'content', + 'sharing/get_shared_link_file', + 'download', + bv.Struct(sharing.GetSharedLinkMetadataArg), + bv.StructTree(sharing.SharedLinkMetadata), + bv.Union(sharing.GetSharedLinkFileError), + arg, + None, + ) return r - def files_get_preview_to_file(self, - download_path, - path, - rev=None): + def sharing_get_shared_link_file_to_file(self, + download_path, + url, + path=None, + link_password=None): """ - Get a preview for a file. Currently previews are only generated for the - files with the following extensions: .doc, .docx, .docm, .ppt, .pps, - .ppsx, .ppsm, .pptx, .pptm, .xls, .xlsx, .xlsm, .rtf + Download the shared link's file from a user's Dropbox. :param str download_path: Path on local machine to save file. - :param str path: The path of the file to preview. - :param Nullable rev: Deprecated. Please specify revision in - :field:'path' instead - :rtype: (:class:`dropbox.files.FileMetadata`, + :param str url: URL of the shared link. + :param Nullable path: If the shared link is to a folder, this parameter + can be used to retrieve the metadata for a specific file or + sub-folder in this folder. A relative path should be used. + :param Nullable link_password: If the shared link has a password, this + parameter can be used. + :rtype: (:class:`dropbox.sharing.SharedLinkMetadata`, :class:`requests.models.Response`) :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.PreviewError` - """ - o = files.PreviewArg(path, - rev) - r = self.request(self.HOST_CONTENT, - 'files/get_preview', - self.ROUTE_STYLE_DOWNLOAD, - bv.Struct(files.PreviewArg), - bv.Struct(files.FileMetadata), - bv.Union(files.PreviewError), - o, - None) + :class:`dropbox.sharing.GetSharedLinkFileError` + """ + arg = sharing.GetSharedLinkMetadataArg(url, + path, + link_password) + r = self.request( + 'content', + 'sharing/get_shared_link_file', + 'download', + bv.Struct(sharing.GetSharedLinkMetadataArg), + bv.StructTree(sharing.SharedLinkMetadata), + bv.Union(sharing.GetSharedLinkFileError), + arg, + None, + ) self._save_body_to_file(download_path, r[1]) return r[0] - def files_list_revisions(self, - path, - limit=10): - """ - Return revisions of a file - - :param str path: The path to the file you want to see the revisions of. - :param long limit: The maximum number of revision entries returned. - :rtype: :class:`dropbox.files.ListRevisionsResult` - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.files.ListRevisionsError` - """ - o = files.ListRevisionsArg(path, - limit) - r = self.request(self.HOST_API, - 'files/list_revisions', - self.ROUTE_STYLE_RPC, - bv.Struct(files.ListRevisionsArg), - bv.Struct(files.ListRevisionsResult), - bv.Union(files.ListRevisionsError), - o, - None) - return r - - def files_restore(self, - path, - rev): + def sharing_get_shared_link_metadata(self, + url, + path=None, + link_password=None): """ - Restore a file to a specific revision + Get the shared link's metadata. - :param str path: The path to the file you want to restore. - :param str rev: The revision to restore for the file. - :rtype: :class:`dropbox.files.FileMetadata` + :param str url: URL of the shared link. + :param Nullable path: If the shared link is to a folder, this parameter + can be used to retrieve the metadata for a specific file or + sub-folder in this folder. A relative path should be used. + :param Nullable link_password: If the shared link has a password, this + parameter can be used. + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.files.RestoreError` - """ - o = files.RestoreArg(path, - rev) - r = self.request(self.HOST_API, - 'files/restore', - self.ROUTE_STYLE_RPC, - bv.Struct(files.RestoreArg), - bv.Struct(files.FileMetadata), - bv.Union(files.RestoreError), - o, - None) + :class:`dropbox.sharing.SharedLinkError` + """ + arg = sharing.GetSharedLinkMetadataArg(url, + path, + link_password) + r = self.request( + 'api', + 'sharing/get_shared_link_metadata', + 'rpc', + bv.Struct(sharing.GetSharedLinkMetadataArg), + bv.StructTree(sharing.SharedLinkMetadata), + bv.Union(sharing.SharedLinkError), + arg, + None, + ) return r - # ------------------------------------------ - # Routes in sharing namespace - def sharing_get_shared_links(self, path=None): """ @@ -787,201 +1148,321 @@ def sharing_get_shared_links(self, If this raises, ApiError.reason is of type: :class:`dropbox.sharing.GetSharedLinksError` """ - o = sharing.GetSharedLinksArg(path) - r = self.request(self.HOST_API, - 'sharing/get_shared_links', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.GetSharedLinksArg), - bv.Struct(sharing.GetSharedLinksResult), - bv.Union(sharing.GetSharedLinksError), - o, - None) + arg = sharing.GetSharedLinksArg(path) + r = self.request( + 'api', + 'sharing/get_shared_links', + 'rpc', + bv.Struct(sharing.GetSharedLinksArg), + bv.Struct(sharing.GetSharedLinksResult), + bv.Union(sharing.GetSharedLinksError), + arg, + None, + ) return r - def sharing_create_shared_link(self, - path, - short_url=False, - pending_upload=None): + def sharing_list_folder_members(self, + shared_folder_id, + actions=None): """ - Create a shared link. If a shared link already exists for the given - path, that link is returned. Note that in the returned - :class:`PathLinkMetadata`, the ``PathLinkMetadata.url`` field is the - shortened URL if ``CreateSharedLinkArg.short_url`` argument is set to - ``True``. Previously, it was technically possible to break a shared link - by moving or renaming the corresponding file or folder. In the future, - this will no longer be the case, so your app shouldn't rely on this - behavior. Instead, if your app needs to revoke a shared link, use - :meth:`revoke_shared_link`. + Returns shared folder membership by its folder ID. Apps must have full + Dropbox access to use this endpoint. Warning: This endpoint is in beta + and is subject to minor but possibly backwards-incompatible changes. - :param str path: The path to share. - :param bool short_url: Whether to return a shortened URL. - :param Nullable pending_upload: If it's okay to share a path that does - not yet exist, set this to either ``PendingUploadMode.file`` or - ``PendingUploadMode.folder`` to indicate whether to assume it's a - file or folder. - :rtype: :class:`dropbox.sharing.PathLinkMetadata` + :param str shared_folder_id: The ID for the shared folder. + :param Nullable actions: Member actions to query. + :rtype: :class:`dropbox.sharing.SharedFolderMembers` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.CreateSharedLinkError` + :class:`dropbox.sharing.SharedFolderAccessError` """ - o = sharing.CreateSharedLinkArg(path, - short_url, - pending_upload) - r = self.request(self.HOST_API, - 'sharing/create_shared_link', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.CreateSharedLinkArg), - bv.Struct(sharing.PathLinkMetadata), - bv.Union(sharing.CreateSharedLinkError), - o, - None) + arg = sharing.ListFolderMembersArgs(shared_folder_id, + actions) + r = self.request( + 'api', + 'sharing/list_folder_members', + 'rpc', + bv.Struct(sharing.ListFolderMembersArgs), + bv.Struct(sharing.SharedFolderMembers), + bv.Union(sharing.SharedFolderAccessError), + arg, + None, + ) return r - def sharing_revoke_shared_link(self, - url): + def sharing_list_folder_members_continue(self, + cursor): """ - Revoke a shared link. This API is only supported for full dropbox apps. + Once a cursor has been retrieved from :meth:`list_folder_members`, use + this to paginate through all shared folder members. Apps must have full + Dropbox access to use this endpoint. Warning: This endpoint is in beta + and is subject to minor but possibly backwards-incompatible changes. - :param str url: URL of the shared link. - :rtype: None + :param str cursor: The cursor returned by your last call to + :meth:`list_folder_members` or :meth:`list_folder_members_continue`. + :rtype: :class:`dropbox.sharing.SharedFolderMembers` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.RevokeSharedLinkError` + :class:`dropbox.sharing.ListFolderMembersContinueError` """ - o = sharing.RevokeSharedLinkArg(url) - r = self.request(self.HOST_API, - 'sharing/revoke_shared_link', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.RevokeSharedLinkArg), - bv.Void(), - bv.Union(sharing.RevokeSharedLinkError), - o, - None) - return None + arg = sharing.ListFolderMembersContinueArg(cursor) + r = self.request( + 'api', + 'sharing/list_folder_members/continue', + 'rpc', + bv.Struct(sharing.ListFolderMembersContinueArg), + bv.Struct(sharing.SharedFolderMembers), + bv.Union(sharing.ListFolderMembersContinueError), + arg, + None, + ) + return r def sharing_list_folders(self): """ Return the list of all shared folders the current user has access to. - Warning: This endpoint is in beta and is subject to minor but possibly + Apps must have full Dropbox access to use this endpoint. Warning: This + endpoint is in beta and is subject to minor but possibly backwards-incompatible changes. :rtype: :class:`dropbox.sharing.ListFoldersResult` """ - o = None - r = self.request(self.HOST_API, - 'sharing/list_folders', - self.ROUTE_STYLE_RPC, - bv.Void(), - bv.Struct(sharing.ListFoldersResult), - bv.Void(), - o, - None) + arg = None + r = self.request( + 'api', + 'sharing/list_folders', + 'rpc', + bv.Void(), + bv.Struct(sharing.ListFoldersResult), + bv.Void(), + arg, + None, + ) return r def sharing_list_folders_continue(self, cursor): """ Once a cursor has been retrieved from :meth:`list_folders`, use this to - paginate through all shared folders. Warning: This endpoint is in beta - and is subject to minor but possibly backwards-incompatible changes. + paginate through all shared folders. Apps must have full Dropbox access + to use this endpoint. Warning: This endpoint is in beta and is subject + to minor but possibly backwards-incompatible changes. + + :param str cursor: The cursor returned by your last call to + :meth:`list_folders` or :meth:`list_folders_continue`. + :rtype: :class:`dropbox.sharing.ListFoldersResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.sharing.ListFoldersContinueError` + """ + arg = sharing.ListFoldersContinueArg(cursor) + r = self.request( + 'api', + 'sharing/list_folders/continue', + 'rpc', + bv.Struct(sharing.ListFoldersContinueArg), + bv.Struct(sharing.ListFoldersResult), + bv.Union(sharing.ListFoldersContinueError), + arg, + None, + ) + return r + + def sharing_list_shared_links(self, + path=None, + cursor=None): + """ + List shared links of this user. If no path is given or the path is + empty, returns a list of all shared links for the current user. If a + non-empty path is given, returns a list of all shared links that allow + access to the given path - direct links to the given path and links to + parent folders of the given path. + + :param Nullable path: See :meth:`list_shared_links` description. + :param Nullable cursor: The cursor returned by your last call to + :meth:`list_shared_links`. + :rtype: :class:`dropbox.sharing.ListSharedLinksResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.sharing.ListSharedLinksError` + """ + arg = sharing.ListSharedLinksArg(path, + cursor) + r = self.request( + 'api', + 'sharing/list_shared_links', + 'rpc', + bv.Struct(sharing.ListSharedLinksArg), + bv.Struct(sharing.ListSharedLinksResult), + bv.Union(sharing.ListSharedLinksError), + arg, + None, + ) + return r + + def sharing_modify_shared_link_settings(self, + url, + settings): + """ + Modify the shared link's settings. If the requested visibility conflict + with the shared links policy of the team or the shared folder (in case + the linked file is part of a shared folder) then the + ``LinkPermissions.resolved_visibility`` of the returned + :class:`SharedLinkMetadata` will reflect the actual visibility of the + shared link and the ``LinkPermissions.requested_visibility`` will + reflect the requested visibility. + + :param str url: URL of the shared link to change its settings + :param settings: Set of settings for the shared link. + :type settings: :class:`dropbox.sharing.SharedLinkSettings` + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.sharing.ModifySharedLinkSettingsError` + """ + arg = sharing.ModifySharedLinkSettingsArgs(url, + settings) + r = self.request( + 'api', + 'sharing/modify_shared_link_settings', + 'rpc', + bv.Struct(sharing.ModifySharedLinkSettingsArgs), + bv.StructTree(sharing.SharedLinkMetadata), + bv.Union(sharing.ModifySharedLinkSettingsError), + arg, + None, + ) + return r + + def sharing_mount_folder(self, + shared_folder_id): + """ + The current user mounts the designated folder. Mount a shared folder for + a user after they have been added as a member. Once mounted, the shared + folder will appear in their Dropbox. Apps must have full Dropbox access + to use this endpoint. Warning: This endpoint is in beta and is subject + to minor but possibly backwards-incompatible changes. - :param str cursor: The cursor returned by your last call to - :meth:`list_folders` or :meth:`list_folders_continue`. - :rtype: :class:`dropbox.sharing.ListFoldersResult` + :param str shared_folder_id: The ID of the shared folder to mount. + :rtype: :class:`dropbox.sharing.SharedFolderMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.ListFoldersContinueError` + :class:`dropbox.sharing.MountFolderError` """ - o = sharing.ListFoldersContinueArg(cursor) - r = self.request(self.HOST_API, - 'sharing/list_folders/continue', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.ListFoldersContinueArg), - bv.Struct(sharing.ListFoldersResult), - bv.Union(sharing.ListFoldersContinueError), - o, - None) + arg = sharing.MountFolderArg(shared_folder_id) + r = self.request( + 'api', + 'sharing/mount_folder', + 'rpc', + bv.Struct(sharing.MountFolderArg), + bv.Struct(sharing.SharedFolderMetadata), + bv.Union(sharing.MountFolderError), + arg, + None, + ) return r - def sharing_get_folder_metadata(self, - shared_folder_id): + def sharing_relinquish_folder_membership(self, + shared_folder_id): """ - Returns shared folder metadata by its folder ID. Warning: This endpoint - is in beta and is subject to minor but possibly backwards-incompatible - changes. + The current user relinquishes their membership in the designated shared + folder and will no longer have access to the folder. A folder owner + cannot relinquish membership in their own folder. Apps must have full + Dropbox access to use this endpoint. Warning: This endpoint is in beta + and is subject to minor but possibly backwards-incompatible changes. :param str shared_folder_id: The ID for the shared folder. - :rtype: :class:`dropbox.sharing.SharedFolderMetadata` + :rtype: None :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.SharedFolderAccessError` + :class:`dropbox.sharing.RelinquishFolderMembershipError` """ - o = sharing.GetMetadataArgs(shared_folder_id) - r = self.request(self.HOST_API, - 'sharing/get_folder_metadata', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.GetMetadataArgs), - bv.Struct(sharing.SharedFolderMetadata), - bv.Union(sharing.SharedFolderAccessError), - o, - None) - return r + arg = sharing.RelinquishFolderMembershipArg(shared_folder_id) + r = self.request( + 'api', + 'sharing/relinquish_folder_membership', + 'rpc', + bv.Struct(sharing.RelinquishFolderMembershipArg), + bv.Void(), + bv.Union(sharing.RelinquishFolderMembershipError), + arg, + None, + ) + return None - def sharing_list_folder_members(self, - shared_folder_id): + def sharing_remove_folder_member(self, + shared_folder_id, + member, + leave_a_copy): """ - Returns shared folder membership by its folder ID. Warning: This - endpoint is in beta and is subject to minor but possibly - backwards-incompatible changes. + Allows an owner or editor (if the ACL update policy allows) of a shared + folder to remove another member. Apps must have full Dropbox access to + use this endpoint. Warning: This endpoint is in beta and is subject to + minor but possibly backwards-incompatible changes. :param str shared_folder_id: The ID for the shared folder. - :rtype: :class:`dropbox.sharing.SharedFolderMembers` + :param member: The member to remove from the folder. + :type member: :class:`dropbox.sharing.MemberSelector` + :param bool leave_a_copy: If true, the removed user will keep their copy + of the folder after it's unshared, assuming it was mounted. + Otherwise, it will be removed from their Dropbox. Also, this must be + set to false when kicking a group. + :rtype: :class:`dropbox.sharing.LaunchEmptyResult` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.SharedFolderAccessError` + :class:`dropbox.sharing.RemoveFolderMemberError` """ - o = sharing.ListFolderMembersArgs(shared_folder_id) - r = self.request(self.HOST_API, - 'sharing/list_folder_members', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.ListFolderMembersArgs), - bv.Struct(sharing.SharedFolderMembers), - bv.Union(sharing.SharedFolderAccessError), - o, - None) + arg = sharing.RemoveFolderMemberArg(shared_folder_id, + member, + leave_a_copy) + r = self.request( + 'api', + 'sharing/remove_folder_member', + 'rpc', + bv.Struct(sharing.RemoveFolderMemberArg), + bv.Union(async.LaunchEmptyResult), + bv.Union(sharing.RemoveFolderMemberError), + arg, + None, + ) return r - def sharing_list_folder_members_continue(self, - cursor): + def sharing_revoke_shared_link(self, + url): """ - Once a cursor has been retrieved from :meth:`list_folder_members`, use - this to paginate through all shared folder members. Warning: This - endpoint is in beta and is subject to minor but possibly - backwards-incompatible changes. + Revoke a shared link. Note that even after revoking a shared link to a + file, the file may be accessible if there are shared links leading to + any of the file parent folders. To list all shared links that enable + access to a specific file, you can use the :meth:`list_shared_links` + with the file as the ``ListSharedLinksArg.path`` argument. - :param str cursor: The cursor returned by your last call to - :meth:`list_folder_members` or :meth:`list_folder_members_continue`. - :rtype: :class:`dropbox.sharing.SharedFolderMembers` + :param str url: URL of the shared link. + :rtype: None :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.ListFolderMembersContinueError` + :class:`dropbox.sharing.RevokeSharedLinkError` """ - o = sharing.ListFolderMembersContinueArg(cursor) - r = self.request(self.HOST_API, - 'sharing/list_folder_members/continue', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.ListFolderMembersContinueArg), - bv.Struct(sharing.SharedFolderMembers), - bv.Union(sharing.ListFolderMembersContinueError), - o, - None) - return r + arg = sharing.RevokeSharedLinkArg(url) + r = self.request( + 'api', + 'sharing/revoke_shared_link', + 'rpc', + bv.Struct(sharing.RevokeSharedLinkArg), + bv.Void(), + bv.Union(sharing.RevokeSharedLinkError), + arg, + None, + ) + return None def sharing_share_folder(self, path, @@ -995,8 +1476,9 @@ def sharing_share_folder(self, testing the async case repeatable, set `ShareFolderArg.force_async`. If a ``ShareFolderLaunch.async_job_id`` is returned, you'll need to call :meth:`check_share_job_status` until the action completes to get the - metadata for the folder. Warning: This endpoint is in beta and is - subject to minor but possibly backwards-incompatible changes. + metadata for the folder. Apps must have full Dropbox access to use this + endpoint. Warning: This endpoint is in beta and is subject to minor but + possibly backwards-incompatible changes. :param str path: The path to the folder to share. If it does not exist, then a new one is created. @@ -1016,103 +1498,21 @@ def sharing_share_folder(self, If this raises, ApiError.reason is of type: :class:`dropbox.sharing.ShareFolderError` """ - o = sharing.ShareFolderArg(path, - member_policy, - acl_update_policy, - shared_link_policy, - force_async) - r = self.request(self.HOST_API, - 'sharing/share_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.ShareFolderArg), - bv.Union(sharing.ShareFolderLaunch), - bv.Union(sharing.ShareFolderError), - o, - None) - return r - - def sharing_check_share_job_status(self, - async_job_id): - """ - Returns the status of an asynchronous job for sharing a folder. Warning: - This endpoint is in beta and is subject to minor but possibly - backwards-incompatible changes. - - :param str async_job_id: Id of the asynchronous job. This is the value - of a response returned from the method that launched the job. - :rtype: :class:`dropbox.sharing.ShareFolderJobStatus` - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.PollError` - """ - o = async.PollArg(async_job_id) - r = self.request(self.HOST_API, - 'sharing/check_share_job_status', - self.ROUTE_STYLE_RPC, - bv.Struct(async.PollArg), - bv.Union(sharing.ShareFolderJobStatus), - bv.Union(async.PollError), - o, - None) - return r - - def sharing_check_job_status(self, - async_job_id): - """ - Returns the status of an asynchronous job. Warning: This endpoint is in - beta and is subject to minor but possibly backwards-incompatible - changes. - - :param str async_job_id: Id of the asynchronous job. This is the value - of a response returned from the method that launched the job. - :rtype: :class:`dropbox.sharing.JobStatus` - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.PollError` - """ - o = async.PollArg(async_job_id) - r = self.request(self.HOST_API, - 'sharing/check_job_status', - self.ROUTE_STYLE_RPC, - bv.Struct(async.PollArg), - bv.Union(sharing.JobStatus), - bv.Union(async.PollError), - o, - None) - return r - - def sharing_unshare_folder(self, - shared_folder_id, - leave_a_copy): - """ - Allows a shared folder owner to unshare the folder. You'll need to call - :meth:`check_job_status` to determine if the action has completed - successfully. Warning: This endpoint is in beta and is subject to minor - but possibly backwards-incompatible changes. - - :param str shared_folder_id: The ID for the shared folder. - :param bool leave_a_copy: If true, members of this shared folder will - get a copy of this folder after it's unshared. Otherwise, it will be - removed from their Dropbox. The current user, who is an owner, will - always retain their copy. - :rtype: :class:`dropbox.sharing.LaunchEmptyResult` - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.UnshareFolderError` - """ - o = sharing.UnshareFolderArg(shared_folder_id, - leave_a_copy) - r = self.request(self.HOST_API, - 'sharing/unshare_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.UnshareFolderArg), - bv.Union(async.LaunchEmptyResult), - bv.Union(sharing.UnshareFolderError), - o, - None) + arg = sharing.ShareFolderArg(path, + member_policy, + acl_update_policy, + shared_link_policy, + force_async) + r = self.request( + 'api', + 'sharing/share_folder', + 'rpc', + bv.Struct(sharing.ShareFolderArg), + bv.Union(sharing.ShareFolderLaunch), + bv.Union(sharing.ShareFolderError), + arg, + None, + ) return r def sharing_transfer_folder(self, @@ -1120,7 +1520,8 @@ def sharing_transfer_folder(self, to_dropbox_id): """ Transfer ownership of a shared folder to a member of the shared folder. - Warning: This endpoint is in beta and is subject to minor but possibly + Apps must have full Dropbox access to use this endpoint. Warning: This + endpoint is in beta and is subject to minor but possibly backwards-incompatible changes. :param str shared_folder_id: The ID for the shared folder. @@ -1132,127 +1533,81 @@ def sharing_transfer_folder(self, If this raises, ApiError.reason is of type: :class:`dropbox.sharing.TransferFolderError` """ - o = sharing.TransferFolderArg(shared_folder_id, - to_dropbox_id) - r = self.request(self.HOST_API, - 'sharing/transfer_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.TransferFolderArg), - bv.Void(), - bv.Union(sharing.TransferFolderError), - o, - None) + arg = sharing.TransferFolderArg(shared_folder_id, + to_dropbox_id) + r = self.request( + 'api', + 'sharing/transfer_folder', + 'rpc', + bv.Struct(sharing.TransferFolderArg), + bv.Void(), + bv.Union(sharing.TransferFolderError), + arg, + None, + ) return None - def sharing_update_folder_policy(self, - shared_folder_id, - member_policy=None, - acl_update_policy=None, - shared_link_policy=None): - """ - Update the sharing policies for a shared folder. Warning: This endpoint - is in beta and is subject to minor but possibly backwards-incompatible - changes. - - :param str shared_folder_id: The ID for the shared folder. - :param Nullable member_policy: Who can be a member of this shared - folder. Only set this if the current user is on a team. - :param Nullable acl_update_policy: Who can add and remove members of - this shared folder. - :param Nullable shared_link_policy: The policy to apply to shared links - created for content inside this shared folder. - :rtype: :class:`dropbox.sharing.SharedFolderMetadata` - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.UpdateFolderPolicyError` - """ - o = sharing.UpdateFolderPolicyArg(shared_folder_id, - member_policy, - acl_update_policy, - shared_link_policy) - r = self.request(self.HOST_API, - 'sharing/update_folder_policy', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.UpdateFolderPolicyArg), - bv.Struct(sharing.SharedFolderMetadata), - bv.Union(sharing.UpdateFolderPolicyError), - o, - None) - return r - - def sharing_add_folder_member(self, - shared_folder_id, - members, - quiet=False, - custom_message=None): + def sharing_unmount_folder(self, + shared_folder_id): """ - Allows an owner or editor (if the ACL update policy allows) of a shared - folder to add another member. For the new member to get access to all - the functionality for this folder, you will need to call - :meth:`mount_folder` on their behalf. Warning: This endpoint is in beta + The current user unmounts the designated folder. They can re-mount the + folder at a later time using :meth:`mount_folder`. Apps must have full + Dropbox access to use this endpoint. Warning: This endpoint is in beta and is subject to minor but possibly backwards-incompatible changes. :param str shared_folder_id: The ID for the shared folder. - :param list members: The intended list of members to add. Added members - will receive invites to join the shared folder. - :param bool quiet: Whether added members should be notified via email - and device notifications of their invite. - :param Nullable custom_message: Optional message to display to added - members in their invitation. :rtype: None :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.AddFolderMemberError` + :class:`dropbox.sharing.UnmountFolderError` """ - o = sharing.AddFolderMemberArg(shared_folder_id, - members, - quiet, - custom_message) - r = self.request(self.HOST_API, - 'sharing/add_folder_member', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.AddFolderMemberArg), - bv.Void(), - bv.Union(sharing.AddFolderMemberError), - o, - None) + arg = sharing.UnmountFolderArg(shared_folder_id) + r = self.request( + 'api', + 'sharing/unmount_folder', + 'rpc', + bv.Struct(sharing.UnmountFolderArg), + bv.Void(), + bv.Union(sharing.UnmountFolderError), + arg, + None, + ) return None - def sharing_remove_folder_member(self, - shared_folder_id, - member, - leave_a_copy): + def sharing_unshare_folder(self, + shared_folder_id, + leave_a_copy): """ - Allows an owner or editor (if the ACL update policy allows) of a shared - folder to remove another member. Warning: This endpoint is in beta and - is subject to minor but possibly backwards-incompatible changes. + Allows a shared folder owner to unshare the folder. You'll need to call + :meth:`check_job_status` to determine if the action has completed + successfully. Apps must have full Dropbox access to use this endpoint. + Warning: This endpoint is in beta and is subject to minor but possibly + backwards-incompatible changes. :param str shared_folder_id: The ID for the shared folder. - :param member: The member to remove from the folder. - :type member: :class:`dropbox.sharing.MemberSelector` - :param bool leave_a_copy: If true, the removed user will keep their copy - of the folder after it's unshared, assuming it was mounted. - Otherwise, it will be removed from their Dropbox. Also, this must be - set to false when kicking a group. + :param bool leave_a_copy: If true, members of this shared folder will + get a copy of this folder after it's unshared. Otherwise, it will be + removed from their Dropbox. The current user, who is an owner, will + always retain their copy. :rtype: :class:`dropbox.sharing.LaunchEmptyResult` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.RemoveFolderMemberError` + :class:`dropbox.sharing.UnshareFolderError` """ - o = sharing.RemoveFolderMemberArg(shared_folder_id, - member, - leave_a_copy) - r = self.request(self.HOST_API, - 'sharing/remove_folder_member', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.RemoveFolderMemberArg), - bv.Union(async.LaunchEmptyResult), - bv.Union(sharing.RemoveFolderMemberError), - o, - None) + arg = sharing.UnshareFolderArg(shared_folder_id, + leave_a_copy) + r = self.request( + 'api', + 'sharing/unshare_folder', + 'rpc', + bv.Struct(sharing.UnshareFolderArg), + bv.Union(async.LaunchEmptyResult), + bv.Union(sharing.UnshareFolderError), + arg, + None, + ) return r def sharing_update_folder_member(self, @@ -1261,8 +1616,9 @@ def sharing_update_folder_member(self, access_level): """ Allows an owner or editor of a shared folder to update another member's - permissions. Warning: This endpoint is in beta and is subject to minor - but possibly backwards-incompatible changes. + permissions. Apps must have full Dropbox access to use this endpoint. + Warning: This endpoint is in beta and is subject to minor but possibly + backwards-incompatible changes. :param str shared_folder_id: The ID for the shared folder. :param member: The member of the shared folder to update. Only the @@ -1277,101 +1633,60 @@ def sharing_update_folder_member(self, If this raises, ApiError.reason is of type: :class:`dropbox.sharing.UpdateFolderMemberError` """ - o = sharing.UpdateFolderMemberArg(shared_folder_id, - member, - access_level) - r = self.request(self.HOST_API, - 'sharing/update_folder_member', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.UpdateFolderMemberArg), - bv.Void(), - bv.Union(sharing.UpdateFolderMemberError), - o, - None) + arg = sharing.UpdateFolderMemberArg(shared_folder_id, + member, + access_level) + r = self.request( + 'api', + 'sharing/update_folder_member', + 'rpc', + bv.Struct(sharing.UpdateFolderMemberArg), + bv.Void(), + bv.Union(sharing.UpdateFolderMemberError), + arg, + None, + ) return None - def sharing_mount_folder(self, - shared_folder_id): + def sharing_update_folder_policy(self, + shared_folder_id, + member_policy=None, + acl_update_policy=None, + shared_link_policy=None): """ - The current user mounts the designated folder. Mount a shared folder for - a user after they have been added as a member. Once mounted, the shared - folder will appear in their Dropbox. Warning: This endpoint is in beta + Update the sharing policies for a shared folder. Apps must have full + Dropbox access to use this endpoint. Warning: This endpoint is in beta and is subject to minor but possibly backwards-incompatible changes. - :param str shared_folder_id: The ID of the shared folder to mount. + :param str shared_folder_id: The ID for the shared folder. + :param Nullable member_policy: Who can be a member of this shared + folder. Only set this if the current user is on a team. + :param Nullable acl_update_policy: Who can add and remove members of + this shared folder. + :param Nullable shared_link_policy: The policy to apply to shared links + created for content inside this shared folder. :rtype: :class:`dropbox.sharing.SharedFolderMetadata` :raises: :class:`dropbox.exceptions.ApiError` If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.MountFolderError` + :class:`dropbox.sharing.UpdateFolderPolicyError` """ - o = sharing.MountFolderArg(shared_folder_id) - r = self.request(self.HOST_API, - 'sharing/mount_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.MountFolderArg), - bv.Struct(sharing.SharedFolderMetadata), - bv.Union(sharing.MountFolderError), - o, - None) + arg = sharing.UpdateFolderPolicyArg(shared_folder_id, + member_policy, + acl_update_policy, + shared_link_policy) + r = self.request( + 'api', + 'sharing/update_folder_policy', + 'rpc', + bv.Struct(sharing.UpdateFolderPolicyArg), + bv.Struct(sharing.SharedFolderMetadata), + bv.Union(sharing.UpdateFolderPolicyError), + arg, + None, + ) return r - def sharing_unmount_folder(self, - shared_folder_id): - """ - The current user unmounts the designated folder. They can re-mount the - folder at a later time using :meth:`mount_folder`. Warning: This - endpoint is in beta and is subject to minor but possibly - backwards-incompatible changes. - - :param str shared_folder_id: The ID for the shared folder. - :rtype: None - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.UnmountFolderError` - """ - o = sharing.UnmountFolderArg(shared_folder_id) - r = self.request(self.HOST_API, - 'sharing/unmount_folder', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.UnmountFolderArg), - bv.Void(), - bv.Union(sharing.UnmountFolderError), - o, - None) - return None - - def sharing_relinquish_folder_membership(self, - shared_folder_id): - """ - The current user relinquishes their membership in the designated shared - folder and will no longer have access to the folder. A folder owner - cannot relinquish membership in their own folder. Warning: This endpoint - is in beta and is subject to minor but possibly backwards-incompatible - changes. - - :param str shared_folder_id: The ID for the shared folder. - :rtype: None - :raises: :class:`dropbox.exceptions.ApiError` - - If this raises, ApiError.reason is of type: - :class:`dropbox.sharing.RelinquishFolderMembershipError` - """ - o = sharing.RelinquishFolderMembershipArg(shared_folder_id) - r = self.request(self.HOST_API, - 'sharing/relinquish_folder_membership', - self.ROUTE_STYLE_RPC, - bv.Struct(sharing.RelinquishFolderMembershipArg), - bv.Void(), - bv.Union(sharing.RelinquishFolderMembershipError), - o, - None) - return None - - # ------------------------------------------ - # Routes in team namespace - # ------------------------------------------ # Routes in users namespace @@ -1387,49 +1702,17 @@ def users_get_account(self, If this raises, ApiError.reason is of type: :class:`dropbox.users.GetAccountError` """ - o = users.GetAccountArg(account_id) - r = self.request(self.HOST_API, - 'users/get_account', - self.ROUTE_STYLE_RPC, - bv.Struct(users.GetAccountArg), - bv.Struct(users.BasicAccount), - bv.Union(users.GetAccountError), - o, - None) - return r - - def users_get_current_account(self): - """ - Get information about the current user's account. - - :rtype: :class:`dropbox.users.FullAccount` - """ - o = None - r = self.request(self.HOST_API, - 'users/get_current_account', - self.ROUTE_STYLE_RPC, - bv.Void(), - bv.Struct(users.FullAccount), - bv.Void(), - o, - None) - return r - - def users_get_space_usage(self): - """ - Get the space usage information for the current user's account. - - :rtype: :class:`dropbox.users.SpaceUsage` - """ - o = None - r = self.request(self.HOST_API, - 'users/get_space_usage', - self.ROUTE_STYLE_RPC, - bv.Void(), - bv.Struct(users.SpaceUsage), - bv.Void(), - o, - None) + arg = users.GetAccountArg(account_id) + r = self.request( + 'api', + 'users/get_account', + 'rpc', + bv.Struct(users.GetAccountArg), + bv.Struct(users.BasicAccount), + bv.Union(users.GetAccountError), + arg, + None, + ) return r def users_get_account_batch(self, @@ -1446,14 +1729,54 @@ def users_get_account_batch(self, If this raises, ApiError.reason is of type: :class:`dropbox.users.GetAccountBatchError` """ - o = users.GetAccountBatchArg(account_ids) - r = self.request(self.HOST_API, - 'users/get_account_batch', - self.ROUTE_STYLE_RPC, - bv.Struct(users.GetAccountBatchArg), - bv.List(bv.Struct(users.BasicAccount)), - bv.Union(users.GetAccountBatchError), - o, - None) + arg = users.GetAccountBatchArg(account_ids) + r = self.request( + 'api', + 'users/get_account_batch', + 'rpc', + bv.Struct(users.GetAccountBatchArg), + bv.List(bv.Struct(users.BasicAccount)), + bv.Union(users.GetAccountBatchError), + arg, + None, + ) + return r + + def users_get_current_account(self): + """ + Get information about the current user's account. + + :rtype: :class:`dropbox.users.FullAccount` + """ + arg = None + r = self.request( + 'api', + 'users/get_current_account', + 'rpc', + bv.Void(), + bv.Struct(users.FullAccount), + bv.Void(), + arg, + None, + ) + return r + + def users_get_space_usage(self): + """ + Get the space usage information for the current user's account. + + :rtype: :class:`dropbox.users.SpaceUsage` + """ + arg = None + r = self.request( + 'api', + 'users/get_space_usage', + 'rpc', + bv.Void(), + bv.Struct(users.SpaceUsage), + bv.Void(), + arg, + None, + ) return r diff --git a/dropbox/base_team.py b/dropbox/base_team.py new file mode 100644 index 00000000..b2757fff --- /dev/null +++ b/dropbox/base_team.py @@ -0,0 +1,1063 @@ +# Auto-generated by BabelAPI, do not modify. + +from abc import ABCMeta, abstractmethod + +from . import babel_validators as bv + +from . import ( + async, + auth, + files, + sharing, + team, + users, +) + + +class DropboxTeamBase(object): + __metaclass__ = ABCMeta + + @abstractmethod + def request(self): + pass + + # ------------------------------------------ + # Routes in team namespace + + def team_devices_list_member_devices(self, + team_member_id, + include_web_sessions=True, + include_desktop_clients=True, + include_mobile_clients=True): + """ + List all device sessions of a team's member. + + :param str team_member_id: The team's member id + :param bool include_web_sessions: Whether to list web sessions of the + team's member + :param bool include_desktop_clients: Whether to list linked desktop + devices of the team's member + :param bool include_mobile_clients: Whether to list linked mobile + devices of the team's member + :rtype: :class:`dropbox.team.ListMemberDevicesResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.ListMemberDevicesError` + """ + arg = team.ListMemberDevicesArg(team_member_id, + include_web_sessions, + include_desktop_clients, + include_mobile_clients) + r = self.request( + 'api', + 'team/devices/list_member_devices', + 'rpc', + bv.Struct(team.ListMemberDevicesArg), + bv.Struct(team.ListMemberDevicesResult), + bv.Union(team.ListMemberDevicesError), + arg, + None, + ) + return r + + def team_devices_list_team_devices(self, + cursor=None, + include_web_sessions=True, + include_desktop_clients=True, + include_mobile_clients=True): + """ + List all device sessions of a team. + + :param Nullable cursor: At the first call to the + :meth:`devices_list_team_devices` the cursor shouldn't be passed. + Then, if the result of the call includes a cursor, the following + requests should include the received cursors in order to receive the + next sub list of team devices + :param bool include_web_sessions: Whether to list web sessions of the + team members + :param bool include_desktop_clients: Whether to list desktop clients of + the team members + :param bool include_mobile_clients: Whether to list mobile clients of + the team members + :rtype: :class:`dropbox.team.ListTeamDevicesResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.ListTeamDevicesError` + """ + arg = team.ListTeamDevicesArg(cursor, + include_web_sessions, + include_desktop_clients, + include_mobile_clients) + r = self.request( + 'api', + 'team/devices/list_team_devices', + 'rpc', + bv.Struct(team.ListTeamDevicesArg), + bv.Struct(team.ListTeamDevicesResult), + bv.Union(team.ListTeamDevicesError), + arg, + None, + ) + return r + + def team_devices_revoke_device_session(self, + arg): + """ + Revoke a device session of a team's member + + :type arg: :class:`dropbox.team.RevokeDeviceSessionArg` + :rtype: None + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.RevokeDeviceSessionError` + """ + r = self.request( + 'api', + 'team/devices/revoke_device_session', + 'rpc', + bv.Union(team.RevokeDeviceSessionArg), + bv.Void(), + bv.Union(team.RevokeDeviceSessionError), + arg, + None, + ) + return None + + def team_devices_revoke_device_session_batch(self, + revoke_devices): + """ + Revoke a list of device sessions of team members + + :type revoke_devices: list + :rtype: :class:`dropbox.team.RevokeDeviceSessionBatchResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.RevokeDeviceSessionBatchError` + """ + arg = team.RevokeDeviceSessionBatchArg(revoke_devices) + r = self.request( + 'api', + 'team/devices/revoke_device_session_batch', + 'rpc', + bv.Struct(team.RevokeDeviceSessionBatchArg), + bv.Struct(team.RevokeDeviceSessionBatchResult), + bv.Union(team.RevokeDeviceSessionBatchError), + arg, + None, + ) + return r + + def team_get_info(self): + """ + Retrieves information about a team. + + :rtype: :class:`dropbox.team.TeamGetInfoResult` + """ + arg = None + r = self.request( + 'api', + 'team/get_info', + 'rpc', + bv.Void(), + bv.Struct(team.TeamGetInfoResult), + bv.Void(), + arg, + None, + ) + return r + + def team_groups_create(self, + group_name, + group_external_id=None): + """ + Creates a new, empty group, with a requested name. Permission : Team + member management + + :param str group_name: Group name. + :param Nullable group_external_id: Optional argument. The creator of a + team can associate an arbitrary external ID to the group. + :rtype: :class:`dropbox.team.GroupFullInfo` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupCreateError` + """ + arg = team.GroupCreateArg(group_name, + group_external_id) + r = self.request( + 'api', + 'team/groups/create', + 'rpc', + bv.Struct(team.GroupCreateArg), + bv.Struct(team.GroupFullInfo), + bv.Union(team.GroupCreateError), + arg, + None, + ) + return r + + def team_groups_delete(self, + arg): + """ + Deletes a group. The group is deleted immediately. However the revoking + of group-owned resources may take additional time. Use the + :meth:`groups_job_status_get` to determine whether this process has + completed. Permission : Team member management + + :param arg: Argument for selecting a single group, either by group_id or + by external group ID. + :type arg: :class:`dropbox.team.GroupSelector` + :rtype: :class:`dropbox.team.LaunchEmptyResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupDeleteError` + """ + r = self.request( + 'api', + 'team/groups/delete', + 'rpc', + bv.Union(team.GroupSelector), + bv.Union(async.LaunchEmptyResult), + bv.Union(team.GroupDeleteError), + arg, + None, + ) + return r + + def team_groups_get_info(self, + arg): + """ + Retrieves information about one or more groups. Permission : Team + Information + + :param arg: Argument for selecting a list of groups, either by + group_ids, or external group IDs. + :type arg: :class:`dropbox.team.GroupsSelector` + :rtype: list + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupsGetInfoError` + """ + r = self.request( + 'api', + 'team/groups/get_info', + 'rpc', + bv.Union(team.GroupsSelector), + bv.List(bv.Union(team.GroupsGetInfoItem)), + bv.Union(team.GroupsGetInfoError), + arg, + None, + ) + return r + + def team_groups_job_status_get(self, + async_job_id): + """ + Once an async_job_id is returned from :meth:`groups_delete`, + :meth:`groups_members_add` , or :meth:`groups_members_remove` use this + method to poll the status of granting/revoking group members' access to + group-owned resources. Permission : Team member management + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.PollEmptyResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupsPollError` + """ + arg = async.PollArg(async_job_id) + r = self.request( + 'api', + 'team/groups/job_status/get', + 'rpc', + bv.Struct(async.PollArg), + bv.Union(async.PollEmptyResult), + bv.Union(team.GroupsPollError), + arg, + None, + ) + return r + + def team_groups_list(self, + limit=1000): + """ + Lists groups on a team. Permission : Team Information + + :param long limit: Number of results to return per call. + :rtype: :class:`dropbox.team.GroupsListResult` + """ + arg = team.GroupsListArg(limit) + r = self.request( + 'api', + 'team/groups/list', + 'rpc', + bv.Struct(team.GroupsListArg), + bv.Struct(team.GroupsListResult), + bv.Void(), + arg, + None, + ) + return r + + def team_groups_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`groups_list`, use this to + paginate through all groups. Permission : Team information + + :param str cursor: Indicates from what point to get the next set of + groups. + :rtype: :class:`dropbox.team.GroupsListResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupsListContinueError` + """ + arg = team.GroupsListContinueArg(cursor) + r = self.request( + 'api', + 'team/groups/list/continue', + 'rpc', + bv.Struct(team.GroupsListContinueArg), + bv.Struct(team.GroupsListResult), + bv.Union(team.GroupsListContinueError), + arg, + None, + ) + return r + + def team_groups_members_add(self, + group, + members): + """ + Adds members to a group. The members are added immediately. However the + granting of group-owned resources may take additional time. Use the + :meth:`groups_job_status_get` to determine whether this process has + completed. Permission : Team member management + + :param group: Group to which users will be added. + :type group: :class:`dropbox.team.GroupSelector` + :param list members: List of users to be added to the group. + :rtype: :class:`dropbox.team.GroupMembersChangeResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupMembersAddError` + """ + arg = team.GroupMembersAddArg(group, + members) + r = self.request( + 'api', + 'team/groups/members/add', + 'rpc', + bv.Struct(team.GroupMembersAddArg), + bv.Struct(team.GroupMembersChangeResult), + bv.Union(team.GroupMembersAddError), + arg, + None, + ) + return r + + def team_groups_members_remove(self, + group, + users): + """ + Removes members from a group. The members are removed immediately. + However the revoking of group-owned resources may take additional time. + Use the :meth:`groups_job_status_get` to determine whether this process + has completed. Permission : Team member management + + :type group: :class:`dropbox.team.GroupSelector` + :type users: list + :rtype: :class:`dropbox.team.GroupMembersChangeResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupMembersRemoveError` + """ + arg = team.GroupMembersRemoveArg(group, + users) + r = self.request( + 'api', + 'team/groups/members/remove', + 'rpc', + bv.Struct(team.GroupMembersRemoveArg), + bv.Struct(team.GroupMembersChangeResult), + bv.Union(team.GroupMembersRemoveError), + arg, + None, + ) + return r + + def team_groups_members_set_access_type(self, + group, + user, + access_type): + """ + Sets a member's access type in a group. Permission : Team member + management + + :param access_type: New group access type the user will have. + :type access_type: :class:`dropbox.team.GroupAccessType` + :rtype: list + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupMemberSelectorError` + """ + arg = team.GroupMembersSetAccessTypeArg(group, + user, + access_type) + r = self.request( + 'api', + 'team/groups/members/set_access_type', + 'rpc', + bv.Struct(team.GroupMembersSetAccessTypeArg), + bv.List(bv.Union(team.GroupsGetInfoItem)), + bv.Union(team.GroupMemberSelectorError), + arg, + None, + ) + return r + + def team_groups_update(self, + group, + new_group_name=None, + new_group_external_id=None): + """ + Updates a group's name and/or external ID. Permission : Team member + management + + :param group: Specify a group. + :type group: :class:`dropbox.team.GroupSelector` + :param Nullable new_group_name: Optional argument. Set group name to + this if provided. + :param Nullable new_group_external_id: Optional argument. New group + external ID. If the argument is None, the group's external_id won't + be updated. If the argument is empty string, the group's external id + will be cleared. + :rtype: :class:`dropbox.team.GroupFullInfo` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.GroupUpdateError` + """ + arg = team.GroupUpdateArgs(group, + new_group_name, + new_group_external_id) + r = self.request( + 'api', + 'team/groups/update', + 'rpc', + bv.Struct(team.GroupUpdateArgs), + bv.Struct(team.GroupFullInfo), + bv.Union(team.GroupUpdateError), + arg, + None, + ) + return r + + def team_linked_apps_list_member_linked_apps(self, + team_member_id): + """ + List all linked applications of the team member. Note, this endpoint + doesn't list any team-linked applications. + + :param str team_member_id: The team member id + :rtype: :class:`dropbox.team.ListMemberAppsResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.ListMemberAppsError` + """ + arg = team.ListMemberAppsArg(team_member_id) + r = self.request( + 'api', + 'team/linked_apps/list_member_linked_apps', + 'rpc', + bv.Struct(team.ListMemberAppsArg), + bv.Struct(team.ListMemberAppsResult), + bv.Union(team.ListMemberAppsError), + arg, + None, + ) + return r + + def team_linked_apps_list_team_linked_apps(self, + cursor=None): + """ + List all applications linked to the team members' accounts. Note, this + endpoint doesn't list any team-linked applications. + + :param Nullable cursor: At the first call to the + :meth:`linked_apps_list_team_linked_apps` the cursor shouldn't be + passed. Then, if the result of the call includes a cursor, the + following requests should include the received cursors in order to + receive the next sub list of the team applications + :rtype: :class:`dropbox.team.ListTeamAppsResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.ListTeamAppsError` + """ + arg = team.ListTeamAppsArg(cursor) + r = self.request( + 'api', + 'team/linked_apps/list_team_linked_apps', + 'rpc', + bv.Struct(team.ListTeamAppsArg), + bv.Struct(team.ListTeamAppsResult), + bv.Union(team.ListTeamAppsError), + arg, + None, + ) + return r + + def team_linked_apps_revoke_linked_app(self, + app_id, + team_member_id, + keep_app_folder=True): + """ + Revoke a linked application of the team member + + :param str app_id: The application's unique id + :param str team_member_id: The unique id of the member owning the device + :param bool keep_app_folder: Whether to keep the application dedicated + folder (in case the application uses one) + :rtype: None + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.RevokeLinkedAppError` + """ + arg = team.RevokeLinkedApiAppArg(app_id, + team_member_id, + keep_app_folder) + r = self.request( + 'api', + 'team/linked_apps/revoke_linked_app', + 'rpc', + bv.Struct(team.RevokeLinkedApiAppArg), + bv.Void(), + bv.Union(team.RevokeLinkedAppError), + arg, + None, + ) + return None + + def team_linked_apps_revoke_linked_app_batch(self, + revoke_linked_app): + """ + Revoke a list of linked applications of the team members + + :type revoke_linked_app: list + :rtype: :class:`dropbox.team.RevokeLinkedAppBatchResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.RevokeLinkedAppBatchError` + """ + arg = team.RevokeLinkedApiAppBatchArg(revoke_linked_app) + r = self.request( + 'api', + 'team/linked_apps/revoke_linked_app_batch', + 'rpc', + bv.Struct(team.RevokeLinkedApiAppBatchArg), + bv.Struct(team.RevokeLinkedAppBatchResult), + bv.Union(team.RevokeLinkedAppBatchError), + arg, + None, + ) + return r + + def team_members_add(self, + new_members, + force_async=False): + """ + Adds members to a team. Permission : Team member management A maximum of + 20 members can be specified in a single call. If no Dropbox account + exists with the email address specified, a new Dropbox account will be + created with the given email address, and that account will be invited + to the team. If a personal Dropbox account exists with the email address + specified in the call, this call will create a placeholder Dropbox + account for the user on the team and send an email inviting the user to + migrate their existing personal account onto the team. Team member + management apps are required to set an initial given_name and surname + for a user to use in the team invitation and for 'Perform as team + member' actions taken on the user before they become 'active'. + + :param list new_members: Details of new members to be added to the team. + :param bool force_async: Whether to force the add to happen + asynchronously. + :rtype: :class:`dropbox.team.MembersAddLaunch` + """ + arg = team.MembersAddArg(new_members, + force_async) + r = self.request( + 'api', + 'team/members/add', + 'rpc', + bv.Struct(team.MembersAddArg), + bv.Union(team.MembersAddLaunch), + bv.Void(), + arg, + None, + ) + return r + + def team_members_add_job_status_get(self, + async_job_id): + """ + Once an async_job_id is returned from :meth:`members_add` , use this to + poll the status of the asynchronous request. Permission : Team member + management + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.MembersAddJobStatus` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.PollError` + """ + arg = async.PollArg(async_job_id) + r = self.request( + 'api', + 'team/members/add/job_status/get', + 'rpc', + bv.Struct(async.PollArg), + bv.Union(team.MembersAddJobStatus), + bv.Union(async.PollError), + arg, + None, + ) + return r + + def team_members_get_info(self, + members): + """ + Returns information about multiple team members. Permission : Team + information This endpoint will return an empty member_info item, for IDs + (or emails) that cannot be matched to a valid team member. + + :param list members: List of team members. + :rtype: list + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersGetInfoError` + """ + arg = team.MembersGetInfoArgs(members) + r = self.request( + 'api', + 'team/members/get_info', + 'rpc', + bv.Struct(team.MembersGetInfoArgs), + bv.List(bv.Union(team.MembersGetInfoItem)), + bv.Union(team.MembersGetInfoError), + arg, + None, + ) + return r + + def team_members_list(self, + limit=1000): + """ + Lists members of a team. Permission : Team information + + :param long limit: Number of results to return per call. + :rtype: :class:`dropbox.team.MembersListResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersListError` + """ + arg = team.MembersListArg(limit) + r = self.request( + 'api', + 'team/members/list', + 'rpc', + bv.Struct(team.MembersListArg), + bv.Struct(team.MembersListResult), + bv.Union(team.MembersListError), + arg, + None, + ) + return r + + def team_members_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`members_list`, use this to + paginate through all team members. Permission : Team information + + :param str cursor: Indicates from what point to get the next set of + members. + :rtype: :class:`dropbox.team.MembersListResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersListContinueError` + """ + arg = team.MembersListContinueArg(cursor) + r = self.request( + 'api', + 'team/members/list/continue', + 'rpc', + bv.Struct(team.MembersListContinueArg), + bv.Struct(team.MembersListResult), + bv.Union(team.MembersListContinueError), + arg, + None, + ) + return r + + def team_members_remove(self, + user, + wipe_data=True, + transfer_dest_id=None, + transfer_admin_id=None): + """ + Removes a member from a team. Permission : Team member management + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. This is not a deactivation where the account + can be re-activated again. Calling :meth:`members_add` with the removed + user's email address will create a new account with a new team_member_id + that will not have access to any content that was shared with the + initial account. This endpoint can also be used to cancel a pending + invite to join the team. This endpoint may initiate an asynchronous job. + To obtain the final result of the job, the client should periodically + poll :meth:`members_remove_job_status_get`. + + :param Nullable transfer_dest_id: If provided, files from the deleted + member account will be transferred to this user. + :param Nullable transfer_admin_id: If provided, errors during the + transfer process will be sent via email to this user. If the + transfer_dest_id argument was provided, then this argument must be + provided as well. + :rtype: :class:`dropbox.team.LaunchEmptyResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersRemoveError` + """ + arg = team.MembersRemoveArg(user, + wipe_data, + transfer_dest_id, + transfer_admin_id) + r = self.request( + 'api', + 'team/members/remove', + 'rpc', + bv.Struct(team.MembersRemoveArg), + bv.Union(async.LaunchEmptyResult), + bv.Union(team.MembersRemoveError), + arg, + None, + ) + return r + + def team_members_remove_job_status_get(self, + async_job_id): + """ + Once an async_job_id is returned from :meth:`members_remove` , use this + to poll the status of the asynchronous request. Permission : Team member + management + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.PollEmptyResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.PollError` + """ + arg = async.PollArg(async_job_id) + r = self.request( + 'api', + 'team/members/remove/job_status/get', + 'rpc', + bv.Struct(async.PollArg), + bv.Union(async.PollEmptyResult), + bv.Union(async.PollError), + arg, + None, + ) + return r + + def team_members_send_welcome_email(self, + arg): + """ + Sends welcome email to pending team member. Permission : Team member + management Exactly one of team_member_id, email, or external_id must be + provided to identify the user account. No-op if team member is not + pending. + + :param arg: Argument for selecting a single user, either by + team_member_id, external_id or email. + :type arg: :class:`dropbox.team.UserSelectorArg` + :rtype: None + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersSendWelcomeError` + """ + r = self.request( + 'api', + 'team/members/send_welcome_email', + 'rpc', + bv.Union(team.UserSelectorArg), + bv.Void(), + bv.Union(team.MembersSendWelcomeError), + arg, + None, + ) + return None + + def team_members_set_admin_permissions(self, + user, + new_role): + """ + Updates a team member's permissions. Permission : Team member management + + :param user: Identity of user whose role will be set. + :type user: :class:`dropbox.team.UserSelectorArg` + :param new_role: The new role of the member. + :type new_role: :class:`dropbox.team.AdminTier` + :rtype: :class:`dropbox.team.MembersSetPermissionsResult` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersSetPermissionsError` + """ + arg = team.MembersSetPermissionsArg(user, + new_role) + r = self.request( + 'api', + 'team/members/set_admin_permissions', + 'rpc', + bv.Struct(team.MembersSetPermissionsArg), + bv.Struct(team.MembersSetPermissionsResult), + bv.Union(team.MembersSetPermissionsError), + arg, + None, + ) + return r + + def team_members_set_profile(self, + user, + new_email=None, + new_external_id=None, + new_given_name=None, + new_surname=None): + """ + Updates a team member's profile. Permission : Team member management + + :param user: Identity of user whose profile will be set. + :type user: :class:`dropbox.team.UserSelectorArg` + :param Nullable new_email: New email for member. + :param Nullable new_external_id: New external ID for member. + :param Nullable new_given_name: New given name for member. + :param Nullable new_surname: New surname for member. + :rtype: :class:`dropbox.team.TeamMemberInfo` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersSetProfileError` + """ + arg = team.MembersSetProfileArg(user, + new_email, + new_external_id, + new_given_name, + new_surname) + r = self.request( + 'api', + 'team/members/set_profile', + 'rpc', + bv.Struct(team.MembersSetProfileArg), + bv.Struct(team.TeamMemberInfo), + bv.Union(team.MembersSetProfileError), + arg, + None, + ) + return r + + def team_members_suspend(self, + user, + wipe_data=True): + """ + Suspend a member from a team. Permission : Team member management + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :param user: Identity of user to remove/suspend. + :type user: :class:`dropbox.team.UserSelectorArg` + :param bool wipe_data: If provided, controls if the user's data will be + deleted on their linked devices. + :rtype: None + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersSuspendError` + """ + arg = team.MembersDeactivateArg(user, + wipe_data) + r = self.request( + 'api', + 'team/members/suspend', + 'rpc', + bv.Struct(team.MembersDeactivateArg), + bv.Void(), + bv.Union(team.MembersSuspendError), + arg, + None, + ) + return None + + def team_members_unsuspend(self, + user): + """ + Unsuspend a member from a team. Permission : Team member management + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :param user: Identity of user to unsuspend. + :type user: :class:`dropbox.team.UserSelectorArg` + :rtype: None + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.MembersUnsuspendError` + """ + arg = team.MembersUnsuspendArg(user) + r = self.request( + 'api', + 'team/members/unsuspend', + 'rpc', + bv.Struct(team.MembersUnsuspendArg), + bv.Void(), + bv.Union(team.MembersUnsuspendError), + arg, + None, + ) + return None + + def team_reports_get_activity(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's user activity. + + :param Nullable start_date: Optional starting date (inclusive) + :param Nullable end_date: Optional ending date (exclusive) + :rtype: :class:`dropbox.team.GetActivityReport` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + 'api', + 'team/reports/get_activity', + 'rpc', + bv.Struct(team.DateRange), + bv.Struct(team.GetActivityReport), + bv.Union(team.DateRangeError), + arg, + None, + ) + return r + + def team_reports_get_devices(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's linked devices. + + :param Nullable start_date: Optional starting date (inclusive) + :param Nullable end_date: Optional ending date (exclusive) + :rtype: :class:`dropbox.team.GetDevicesReport` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + 'api', + 'team/reports/get_devices', + 'rpc', + bv.Struct(team.DateRange), + bv.Struct(team.GetDevicesReport), + bv.Union(team.DateRangeError), + arg, + None, + ) + return r + + def team_reports_get_membership(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's membership. + + :param Nullable start_date: Optional starting date (inclusive) + :param Nullable end_date: Optional ending date (exclusive) + :rtype: :class:`dropbox.team.GetMembershipReport` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + 'api', + 'team/reports/get_membership', + 'rpc', + bv.Struct(team.DateRange), + bv.Struct(team.GetMembershipReport), + bv.Union(team.DateRangeError), + arg, + None, + ) + return r + + def team_reports_get_storage(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's storage usage. + + :param Nullable start_date: Optional starting date (inclusive) + :param Nullable end_date: Optional ending date (exclusive) + :rtype: :class:`dropbox.team.GetStorageReport` + :raises: :class:`dropbox.exceptions.ApiError` + + If this raises, ApiError.reason is of type: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + 'api', + 'team/reports/get_storage', + 'rpc', + bv.Struct(team.DateRange), + bv.Struct(team.GetStorageReport), + bv.Union(team.DateRangeError), + arg, + None, + ) + return r + diff --git a/dropbox/dropbox.py b/dropbox/dropbox.py index c6186fd3..cd458196 100644 --- a/dropbox/dropbox.py +++ b/dropbox/dropbox.py @@ -1,9 +1,11 @@ __all__ = [ 'Dropbox', + 'DropboxTeam', + 'create_session', ] # TODO(kelkabany): We need to auto populate this as done in the v1 SDK. -__version__ = '4.0.1' +__version__ = '5.0' import contextlib import json @@ -17,6 +19,7 @@ from . import babel_serializers from .base import DropboxBase +from .base_team import DropboxTeamBase from .exceptions import ( ApiError, AuthError, @@ -27,6 +30,7 @@ ) from .session import pinned_session + class RouteResult(object): """The successful result of a call to a route.""" @@ -46,6 +50,7 @@ def __init__(self, obj_result, http_resp=None): self.obj_result = obj_result self.http_resp = http_resp + class RouteErrorResult(object): """The error result of a call to a route.""" @@ -59,86 +64,119 @@ def __init__(self, request_id, obj_result): self.request_id = request_id self.obj_result = obj_result -class Dropbox(DropboxBase): + +def create_session(max_connections=8, proxies=None): + """ + Creates a session object that can be used by multiple :class:`Dropbox` and + :class:`DropboxTeam` instances. This lets you share a connection pool + amongst them, as well as proxy parameters. + + + :param int max_connections: Maximum connection pool size. + :param dict proxies: See the `requests module + `_ + for more details. + :rtype: :class:`requests.sessions.Session`. `See the requests module + `_ + for more details. + """ + # We only need as many pool_connections as we have unique hostnames. + session = pinned_session(pool_maxsize=max_connections) + if proxies: + session.proxies = proxies + return session + + +class _DropboxTransport(object): """ - Use this to make requests to the Dropbox API. + Responsible for implementing the wire protocol for making requests to the + Dropbox API. """ - API_VERSION = '2' + _API_VERSION = '2' - DEFAULT_DOMAIN = '.dropboxapi.com' + _DEFAULT_DOMAIN = '.dropboxapi.com' # Host for RPC-style routes. - HOST_API = 'api' + _HOST_API = 'api' # Host for upload and download-style routes. - HOST_CONTENT = 'content' + _HOST_CONTENT = 'content' # Host for longpoll routes. - HOST_NOTIFY = 'notify' + _HOST_NOTIFY = 'notify' # Download style means that the route argument goes in a Dropbox-API-Arg # header, and the result comes back in a Dropbox-API-Result header. The # HTTP response body contains a binary payload. - ROUTE_STYLE_DOWNLOAD = 'download' + _ROUTE_STYLE_DOWNLOAD = 'download' # Upload style means that the route argument goes in a Dropbox-API-Arg # header. The HTTP request body contains a binary payload. The result # comes back in a Dropbox-API-Result header. - ROUTE_STYLE_UPLOAD = 'upload' + _ROUTE_STYLE_UPLOAD = 'upload' # RPC style means that the argument and result of a route are contained in # the HTTP body. - ROUTE_STYLE_RPC = 'rpc' + _ROUTE_STYLE_RPC = 'rpc' def __init__(self, oauth2_access_token, - max_connections=8, max_retries_on_error=4, user_agent=None, - proxies=None): + session=None, + headers=None): """ :param str oauth2_access_token: OAuth2 access token for making client requests. - :param int max_connections: Maximum connection pool size. + :param int max_retries_on_error: On 5xx errors, the number of times to retry. :param str user_agent: The user agent to use when making requests. This helps us identify requests coming from your application. We recommend you use the format "AppName/Version". If set, we append "/OfficialDropboxPythonV2SDK/__version__" to the user_agent, - :param dict proxies: See the `requests module - `_ - for more details. + :param session: If not provided, a new session (connection pool) is + created. To share a session across multiple clients, use + :func:`create_session`. + :type session: :class:`requests.sessions.Session` + :param dict headers: Additional headers to add to requests. """ assert len(oauth2_access_token) > 0, \ 'OAuth2 access token cannot be empty.' + assert headers is None or isinstance(headers, dict), \ + 'Expected dict, got %r' % headers self._oauth2_access_token = oauth2_access_token - # We only need as many pool_connections as we have unique hostnames. - self._session = pinned_session(pool_maxsize=max_connections) - if proxies: - self._session.proxies = proxies self._max_retries_on_error = max_retries_on_error + if session: + assert isinstance(session, requests.sessions.Session), \ + 'Expected requests.sessions.Session, got %r' % session + self._session = session + else: + self._session = create_session() + self._headers = headers base_user_agent = 'OfficialDropboxPythonV2SDK/' + __version__ if user_agent: + self._raw_user_agent = user_agent self._user_agent = '{}/{}'.format(user_agent, base_user_agent) else: + self._raw_user_agent = None self._user_agent = base_user_agent self._logger = logging.getLogger('dropbox') - self._domain = os.environ.get('DROPBOX_DOMAIN', Dropbox.DEFAULT_DOMAIN) + self._domain = os.environ.get('DROPBOX_DOMAIN', Dropbox._DEFAULT_DOMAIN) self._api_hostname = os.environ.get( 'DROPBOX_API_HOST', 'api' + self._domain) self._api_content_hostname = os.environ.get( 'DROPBOX_API_CONTENT_HOST', 'content' + self._domain) self._api_notify_hostname = os.environ.get( 'DROPBOX_API_NOTIFY_HOST', 'notify' + self._domain) - self._host_map = {self.HOST_API: self._api_hostname, - self.HOST_CONTENT: self._api_content_hostname, - self.HOST_NOTIFY: self._api_notify_hostname} + self._host_map = {self._HOST_API: self._api_hostname, + self._HOST_CONTENT: self._api_content_hostname, + self._HOST_NOTIFY: self._api_notify_hostname} def request(self, host, @@ -199,7 +237,7 @@ def request(self, deserialized_result, user_message_text, user_message_locale) - elif route_style == self.ROUTE_STYLE_DOWNLOAD: + elif route_style == self._ROUTE_STYLE_DOWNLOAD: return (deserialized_result, res.http_resp) else: return deserialized_result @@ -290,8 +328,10 @@ def request_json_string(self, url = self._get_route_url(fq_hostname, func_name) headers = {'User-Agent': self._user_agent} - if host != self.HOST_NOTIFY: + if host != self._HOST_NOTIFY: headers['Authorization'] = 'Bearer %s' % self._oauth2_access_token + if self._headers: + headers.update(self._headers) # The contents of the body of the HTTP request body = None @@ -300,13 +340,13 @@ def request_json_string(self, # the HTTP response. stream = False - if route_style == self.ROUTE_STYLE_RPC: + if route_style == self._ROUTE_STYLE_RPC: headers['Content-Type'] = 'application/json' body = request_json_arg - elif route_style == self.ROUTE_STYLE_DOWNLOAD: + elif route_style == self._ROUTE_STYLE_DOWNLOAD: headers['Dropbox-API-Arg'] = request_json_arg stream = True - elif route_style == self.ROUTE_STYLE_UPLOAD: + elif route_style == self._ROUTE_STYLE_UPLOAD: headers['Content-Type'] = 'application/octet-stream' headers['Dropbox-API-Arg'] = request_json_arg body = request_binary @@ -334,14 +374,14 @@ def request_json_string(self, # TODO(kelkabany): Use backoff if provided in response. raise RateLimitError(request_id) elif 200 <= r.status_code <= 299: - if route_style == self.ROUTE_STYLE_DOWNLOAD: + if route_style == self._ROUTE_STYLE_DOWNLOAD: raw_resp = r.headers['dropbox-api-result'] else: assert r.headers.get('content-type') == 'application/json', ( 'Expected content-type to be application/json, got %r' % r.headers.get('content-type')) raw_resp = r.content.decode('utf-8') - if route_style == self.ROUTE_STYLE_DOWNLOAD: + if route_style == self._ROUTE_STYLE_DOWNLOAD: return RouteResult(raw_resp, r) else: return RouteResult(raw_resp) @@ -360,7 +400,7 @@ def _get_route_url(self, hostname, route_name): """ return 'https://{hostname}/{version}/{route_name}'.format( hostname=hostname, - version=Dropbox.API_VERSION, + version=Dropbox._API_VERSION, route_name=route_name, ) @@ -377,3 +417,39 @@ def _save_body_to_file(self, download_path, http_resp, chunksize=2**16): with contextlib.closing(http_resp): for c in http_resp.iter_content(chunksize): f.write(c) + + +class Dropbox(_DropboxTransport, DropboxBase): + """ + Use this class to make requests to the Dropbox API using a user's access + token. Methods of this class are meant to act on the corresponding user's + Dropbox. + """ + pass + + +class DropboxTeam(_DropboxTransport, DropboxTeamBase): + """ + Use this class to make requests to the Dropbox API using a team's access + token. Methods of this class are meant to act on the team, but there is + also an :meth:`as_user` method for assuming a team member's identity. + """ + + def as_user(self, team_member_id): + """ + Allows a team credential to assume the identity of a member of the + team. + + :return: A :class:`Dropbox` object that can be used to query on behalf + of this member of the team. + :rtype: Dropbox + """ + new_headers = self._headers.copy() if self._headers else {} + new_headers['Dropbox-API-Select-User'] = team_member_id + return Dropbox( + self._oauth2_access_token, + max_retries_on_error=self._max_retries_on_error, + user_agent=self._raw_user_agent, + session=self._session, + headers=new_headers, + ) diff --git a/dropbox/files.py b/dropbox/files.py index 3a932d10..9338597c 100644 --- a/dropbox/files.py +++ b/dropbox/files.py @@ -10,513 +10,769 @@ # This makes testing this file directly (outside of a package) easier. import babel_validators as bv -class Metadata(object): +class CommitInfo(object): """ - Metadata for a file or folder. - - :ivar name: The last component of the path (including extension). This never - contains a slash. - :ivar path_lower: The lowercased full path in the user's Dropbox. This - always starts with a slash. - :ivar parent_shared_folder_id: Set if this file or folder is contained in a - shared folder. + :ivar path: Path in the user's Dropbox to save the file. + :ivar mode: Selects what to do if the file already exists. + :ivar autorename: If there's a conflict, as determined by ``mode``, have the + Dropbox server try to autorename the file to avoid conflict. + :ivar client_modified: The value to store as the ``client_modified`` + timestamp. Dropbox automatically records the time at which the file was + written to the Dropbox servers. It can also record an additional + timestamp, provided by Dropbox desktop clients, mobile clients, and API + apps of when the file was actually created or modified. + :ivar mute: Normally, users are made aware of any file modifications in + their Dropbox account via notifications in the client software. If + ``True``, this tells the clients that this modification shouldn't result + in a user notification. """ __slots__ = [ - '_name_value', - '_name_present', - '_path_lower_value', - '_path_lower_present', - '_parent_shared_folder_id_value', - '_parent_shared_folder_id_present', + '_path_value', + '_path_present', + '_mode_value', + '_mode_present', + '_autorename_value', + '_autorename_present', + '_client_modified_value', + '_client_modified_present', + '_mute_value', + '_mute_present', ] _has_required_fields = True def __init__(self, - name=None, - path_lower=None, - parent_shared_folder_id=None): - self._name_value = None - self._name_present = False - self._path_lower_value = None - self._path_lower_present = False - self._parent_shared_folder_id_value = None - self._parent_shared_folder_id_present = False - if name is not None: - self.name = name - if path_lower is not None: - self.path_lower = path_lower - if parent_shared_folder_id is not None: - self.parent_shared_folder_id = parent_shared_folder_id + path=None, + mode=None, + autorename=None, + client_modified=None, + mute=None): + self._path_value = None + self._path_present = False + self._mode_value = None + self._mode_present = False + self._autorename_value = None + self._autorename_present = False + self._client_modified_value = None + self._client_modified_present = False + self._mute_value = None + self._mute_present = False + if path is not None: + self.path = path + if mode is not None: + self.mode = mode + if autorename is not None: + self.autorename = autorename + if client_modified is not None: + self.client_modified = client_modified + if mute is not None: + self.mute = mute @property - def name(self): + def path(self): """ - The last component of the path (including extension). This never - contains a slash. + Path in the user's Dropbox to save the file. :rtype: str """ - if self._name_present: - return self._name_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'name'") + raise AttributeError("missing required field 'path'") - @name.setter - def name(self, val): - val = self._name_validator.validate(val) - self._name_value = val - self._name_present = True + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @name.deleter - def name(self): - self._name_value = None - self._name_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False @property - def path_lower(self): + def mode(self): """ - The lowercased full path in the user's Dropbox. This always starts with - a slash. + Selects what to do if the file already exists. - :rtype: str + :rtype: WriteMode """ - if self._path_lower_present: - return self._path_lower_value + if self._mode_present: + return self._mode_value else: - raise AttributeError("missing required field 'path_lower'") + return WriteMode.add - @path_lower.setter - def path_lower(self, val): - val = self._path_lower_validator.validate(val) - self._path_lower_value = val - self._path_lower_present = True + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True - @path_lower.deleter - def path_lower(self): - self._path_lower_value = None - self._path_lower_present = False + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False @property - def parent_shared_folder_id(self): + def autorename(self): """ - Set if this file or folder is contained in a shared folder. + If there's a conflict, as determined by ``mode``, have the Dropbox + server try to autorename the file to avoid conflict. - :rtype: str + :rtype: bool """ - if self._parent_shared_folder_id_present: - return self._parent_shared_folder_id_value + if self._autorename_present: + return self._autorename_value + else: + return False + + @autorename.setter + def autorename(self, val): + val = self._autorename_validator.validate(val) + self._autorename_value = val + self._autorename_present = True + + @autorename.deleter + def autorename(self): + self._autorename_value = None + self._autorename_present = False + + @property + def client_modified(self): + """ + The value to store as the ``client_modified`` timestamp. Dropbox + automatically records the time at which the file was written to the + Dropbox servers. It can also record an additional timestamp, provided by + Dropbox desktop clients, mobile clients, and API apps of when the file + was actually created or modified. + + :rtype: datetime.datetime + """ + if self._client_modified_present: + return self._client_modified_value else: return None - @parent_shared_folder_id.setter - def parent_shared_folder_id(self, val): + @client_modified.setter + def client_modified(self, val): if val is None: - del self.parent_shared_folder_id + del self.client_modified return - val = self._parent_shared_folder_id_validator.validate(val) - self._parent_shared_folder_id_value = val - self._parent_shared_folder_id_present = True + val = self._client_modified_validator.validate(val) + self._client_modified_value = val + self._client_modified_present = True - @parent_shared_folder_id.deleter - def parent_shared_folder_id(self): - self._parent_shared_folder_id_value = None - self._parent_shared_folder_id_present = False + @client_modified.deleter + def client_modified(self): + self._client_modified_value = None + self._client_modified_present = False + + @property + def mute(self): + """ + Normally, users are made aware of any file modifications in their + Dropbox account via notifications in the client software. If ``True``, + this tells the clients that this modification shouldn't result in a user + notification. + + :rtype: bool + """ + if self._mute_present: + return self._mute_value + else: + return False + + @mute.setter + def mute(self, val): + val = self._mute_validator.validate(val) + self._mute_value = val + self._mute_present = True + + @mute.deleter + def mute(self): + self._mute_value = None + self._mute_present = False def __repr__(self): - return 'Metadata(name={!r}, path_lower={!r}, parent_shared_folder_id={!r})'.format( - self._name_value, - self._path_lower_value, - self._parent_shared_folder_id_value, + return 'CommitInfo(path={!r}, mode={!r}, autorename={!r}, client_modified={!r}, mute={!r})'.format( + self._path_value, + self._mode_value, + self._autorename_value, + self._client_modified_value, + self._mute_value, ) -class Dimensions(object): +class CreateFolderArg(object): """ - Dimensions for a photo or video. - - :ivar height: Height of the photo/video. - :ivar width: Width of the photo/video. + :ivar path: Path in the user's Dropbox to create. """ __slots__ = [ - '_height_value', - '_height_present', - '_width_value', - '_width_present', + '_path_value', + '_path_present', ] _has_required_fields = True def __init__(self, - height=None, - width=None): - self._height_value = None - self._height_present = False - self._width_value = None - self._width_present = False - if height is not None: - self.height = height - if width is not None: - self.width = width - - @property - def height(self): + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path + + @property + def path(self): """ - Height of the photo/video. + Path in the user's Dropbox to create. - :rtype: long + :rtype: str """ - if self._height_present: - return self._height_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'height'") + raise AttributeError("missing required field 'path'") - @height.setter - def height(self, val): - val = self._height_validator.validate(val) - self._height_value = val - self._height_present = True + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @height.deleter - def height(self): - self._height_value = None - self._height_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False - @property - def width(self): + def __repr__(self): + return 'CreateFolderArg(path={!r})'.format( + self._path_value, + ) + +class CreateFolderError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def path(cls, val): """ - Width of the photo/video. + Create an instance of this class set to the ``path`` tag with value + ``val``. - :rtype: long + :param WriteError val: + :rtype: CreateFolderError """ - if self._width_present: - return self._width_value - else: - raise AttributeError("missing required field 'width'") + return cls('path', val) - @width.setter - def width(self, val): - val = self._width_validator.validate(val) - self._width_value = val - self._width_present = True + def is_path(self): + """ + Check if the union tag is ``path``. - @width.deleter - def width(self): - self._width_value = None - self._width_present = False + :rtype: bool + """ + return self._tag == 'path' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value def __repr__(self): - return 'Dimensions(height={!r}, width={!r})'.format( - self._height_value, - self._width_value, - ) + return 'CreateFolderError(%r, %r)' % (self._tag, self._value) -class GpsCoordinates(object): +class DeleteArg(object): """ - GPS coordinates for a photo or video. - - :ivar latitude: Latitude of the GPS coordinates. - :ivar longitude: Longitude of the GPS coordinates. + :ivar path: Path in the user's Dropbox to delete. """ __slots__ = [ - '_latitude_value', - '_latitude_present', - '_longitude_value', - '_longitude_present', + '_path_value', + '_path_present', ] _has_required_fields = True def __init__(self, - latitude=None, - longitude=None): - self._latitude_value = None - self._latitude_present = False - self._longitude_value = None - self._longitude_present = False - if latitude is not None: - self.latitude = latitude - if longitude is not None: - self.longitude = longitude + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path @property - def latitude(self): + def path(self): """ - Latitude of the GPS coordinates. + Path in the user's Dropbox to delete. - :rtype: float + :rtype: str """ - if self._latitude_present: - return self._latitude_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'latitude'") + raise AttributeError("missing required field 'path'") - @latitude.setter - def latitude(self, val): - val = self._latitude_validator.validate(val) - self._latitude_value = val - self._latitude_present = True + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @latitude.deleter - def latitude(self): - self._latitude_value = None - self._latitude_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False - @property - def longitude(self): + def __repr__(self): + return 'DeleteArg(path={!r})'.format( + self._path_value, + ) + +class DeleteError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def path_lookup(cls, val): """ - Longitude of the GPS coordinates. + Create an instance of this class set to the ``path_lookup`` tag with + value ``val``. - :rtype: float + :param LookupError val: + :rtype: DeleteError """ - if self._longitude_present: - return self._longitude_value - else: - raise AttributeError("missing required field 'longitude'") + return cls('path_lookup', val) - @longitude.setter - def longitude(self, val): - val = self._longitude_validator.validate(val) - self._longitude_value = val - self._longitude_present = True + @classmethod + def path_write(cls, val): + """ + Create an instance of this class set to the ``path_write`` tag with + value ``val``. - @longitude.deleter - def longitude(self): - self._longitude_value = None - self._longitude_present = False + :param WriteError val: + :rtype: DeleteError + """ + return cls('path_write', val) + + def is_path_lookup(self): + """ + Check if the union tag is ``path_lookup``. + + :rtype: bool + """ + return self._tag == 'path_lookup' + + def is_path_write(self): + """ + Check if the union tag is ``path_write``. + + :rtype: bool + """ + return self._tag == 'path_write' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path_lookup(self): + """ + Only call this if :meth:`is_path_lookup` is true. + + :rtype: LookupError + """ + if not self.is_path_lookup(): + raise AttributeError("tag 'path_lookup' not set") + return self._value + + def get_path_write(self): + """ + Only call this if :meth:`is_path_write` is true. + + :rtype: WriteError + """ + if not self.is_path_write(): + raise AttributeError("tag 'path_write' not set") + return self._value def __repr__(self): - return 'GpsCoordinates(latitude={!r}, longitude={!r})'.format( - self._latitude_value, - self._longitude_value, - ) + return 'DeleteError(%r, %r)' % (self._tag, self._value) -class MediaMetadata(object): +class Metadata(object): """ - Metadata for a photo or video. + Metadata for a file or folder. - :ivar dimensions: Dimension of the photo/video. - :ivar location: The GPS coordinate of the photo/video. - :ivar time_taken: The timestamp when the photo/video is taken. + :ivar name: The last component of the path (including extension). This never + contains a slash. + :ivar path_lower: The lowercased full path in the user's Dropbox. This + always starts with a slash. + :ivar parent_shared_folder_id: Deprecated. Please use + :field:'FileSharingInfo.parent_shared_folder_id' or + :field:'FolderSharingInfo.parent_shared_folder_id' instead. """ __slots__ = [ - '_dimensions_value', - '_dimensions_present', - '_location_value', - '_location_present', - '_time_taken_value', - '_time_taken_present', + '_name_value', + '_name_present', + '_path_lower_value', + '_path_lower_present', + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', ] - _has_required_fields = False + _has_required_fields = True def __init__(self, - dimensions=None, - location=None, - time_taken=None): - self._dimensions_value = None - self._dimensions_present = False - self._location_value = None - self._location_present = False - self._time_taken_value = None - self._time_taken_present = False - if dimensions is not None: - self.dimensions = dimensions - if location is not None: - self.location = location - if time_taken is not None: - self.time_taken = time_taken + name=None, + path_lower=None, + parent_shared_folder_id=None): + self._name_value = None + self._name_present = False + self._path_lower_value = None + self._path_lower_present = False + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + if name is not None: + self.name = name + if path_lower is not None: + self.path_lower = path_lower + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id @property - def dimensions(self): + def name(self): """ - Dimension of the photo/video. + The last component of the path (including extension). This never + contains a slash. - :rtype: Dimensions + :rtype: str """ - if self._dimensions_present: - return self._dimensions_value + if self._name_present: + return self._name_value else: - return None + raise AttributeError("missing required field 'name'") - @dimensions.setter - def dimensions(self, val): - if val is None: - del self.dimensions - return - self._dimensions_validator.validate_type_only(val) - self._dimensions_value = val - self._dimensions_present = True + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True - @dimensions.deleter - def dimensions(self): - self._dimensions_value = None - self._dimensions_present = False + @name.deleter + def name(self): + self._name_value = None + self._name_present = False @property - def location(self): + def path_lower(self): """ - The GPS coordinate of the photo/video. + The lowercased full path in the user's Dropbox. This always starts with + a slash. - :rtype: GpsCoordinates + :rtype: str """ - if self._location_present: - return self._location_value + if self._path_lower_present: + return self._path_lower_value else: - return None + raise AttributeError("missing required field 'path_lower'") - @location.setter - def location(self, val): - if val is None: - del self.location - return - self._location_validator.validate_type_only(val) - self._location_value = val - self._location_present = True + @path_lower.setter + def path_lower(self, val): + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True - @location.deleter - def location(self): - self._location_value = None - self._location_present = False + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False @property - def time_taken(self): + def parent_shared_folder_id(self): """ - The timestamp when the photo/video is taken. + Deprecated. Please use :field:'FileSharingInfo.parent_shared_folder_id' + or :field:'FolderSharingInfo.parent_shared_folder_id' instead. - :rtype: datetime.datetime + :rtype: str """ - if self._time_taken_present: - return self._time_taken_value + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value else: return None - @time_taken.setter - def time_taken(self, val): + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): if val is None: - del self.time_taken + del self.parent_shared_folder_id return - val = self._time_taken_validator.validate(val) - self._time_taken_value = val - self._time_taken_present = True + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True - @time_taken.deleter - def time_taken(self): - self._time_taken_value = None - self._time_taken_present = False + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False def __repr__(self): - return 'MediaMetadata(dimensions={!r}, location={!r}, time_taken={!r})'.format( - self._dimensions_value, - self._location_value, - self._time_taken_value, + return 'Metadata(name={!r}, path_lower={!r}, parent_shared_folder_id={!r})'.format( + self._name_value, + self._path_lower_value, + self._parent_shared_folder_id_value, ) -class PhotoMetadata(MediaMetadata): +class DeletedMetadata(Metadata): """ - Metadata for a photo. + Indicates that there used to be a file or folder at this path, but it no + longer exists. """ __slots__ = [ ] - _has_required_fields = False + _has_required_fields = True def __init__(self, - dimensions=None, - location=None, - time_taken=None): - super(PhotoMetadata, self).__init__(dimensions, - location, - time_taken) + name=None, + path_lower=None, + parent_shared_folder_id=None): + super(DeletedMetadata, self).__init__(name, + path_lower, + parent_shared_folder_id) def __repr__(self): - return 'PhotoMetadata(dimensions={!r}, location={!r}, time_taken={!r})'.format( - self._dimensions_value, - self._location_value, - self._time_taken_value, + return 'DeletedMetadata(name={!r}, path_lower={!r}, parent_shared_folder_id={!r})'.format( + self._name_value, + self._path_lower_value, + self._parent_shared_folder_id_value, ) -class VideoMetadata(MediaMetadata): +class Dimensions(object): """ - Metadata for a video. + Dimensions for a photo or video. - :ivar duration: The duration of the video in milliseconds. + :ivar height: Height of the photo/video. + :ivar width: Width of the photo/video. """ __slots__ = [ - '_duration_value', - '_duration_present', + '_height_value', + '_height_present', + '_width_value', + '_width_present', ] - _has_required_fields = False + _has_required_fields = True def __init__(self, - dimensions=None, - location=None, - time_taken=None, - duration=None): - super(VideoMetadata, self).__init__(dimensions, - location, - time_taken) - self._duration_value = None - self._duration_present = False - if duration is not None: - self.duration = duration + height=None, + width=None): + self._height_value = None + self._height_present = False + self._width_value = None + self._width_present = False + if height is not None: + self.height = height + if width is not None: + self.width = width @property - def duration(self): + def height(self): """ - The duration of the video in milliseconds. + Height of the photo/video. :rtype: long """ - if self._duration_present: - return self._duration_value + if self._height_present: + return self._height_value + else: + raise AttributeError("missing required field 'height'") + + @height.setter + def height(self, val): + val = self._height_validator.validate(val) + self._height_value = val + self._height_present = True + + @height.deleter + def height(self): + self._height_value = None + self._height_present = False + + @property + def width(self): + """ + Width of the photo/video. + + :rtype: long + """ + if self._width_present: + return self._width_value + else: + raise AttributeError("missing required field 'width'") + + @width.setter + def width(self, val): + val = self._width_validator.validate(val) + self._width_value = val + self._width_present = True + + @width.deleter + def width(self): + self._width_value = None + self._width_present = False + + def __repr__(self): + return 'Dimensions(height={!r}, width={!r})'.format( + self._height_value, + self._width_value, + ) + +class DownloadArg(object): + """ + :ivar path: The path of the file to download. + :ivar rev: Deprecated. Please specify revision in :field:'path' instead + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_rev_value', + '_rev_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + rev=None): + self._path_value = None + self._path_present = False + self._rev_value = None + self._rev_present = False + if path is not None: + self.path = path + if rev is not None: + self.rev = rev + + @property + def path(self): + """ + The path of the file to download. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def rev(self): + """ + Deprecated. Please specify revision in :field:'path' instead + + :rtype: str + """ + if self._rev_present: + return self._rev_value else: return None - @duration.setter - def duration(self, val): + @rev.setter + def rev(self, val): if val is None: - del self.duration - return - val = self._duration_validator.validate(val) - self._duration_value = val - self._duration_present = True + del self.rev + return + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True - @duration.deleter - def duration(self): - self._duration_value = None - self._duration_present = False + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False def __repr__(self): - return 'VideoMetadata(dimensions={!r}, location={!r}, time_taken={!r}, duration={!r})'.format( - self._dimensions_value, - self._location_value, - self._time_taken_value, - self._duration_value, + return 'DownloadArg(path={!r}, rev={!r})'.format( + self._path_value, + self._rev_value, ) -class MediaInfo(object): +class DownloadError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar pending: Indicate the photo/video is still under processing and - metadata is not available yet. - :ivar MediaMetadata metadata: The metadata for the photo/video. + :ivar other: An unspecified error. """ __slots__ = ['_tag', '_value'] - _catch_all = None + _catch_all = 'other' # Attribute is overwritten below the class definition - pending = None + other = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -531,46 +787,44 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def metadata(cls, val): + def path(cls, val): """ - Create an instance of this class set to the ``metadata`` tag with value + Create an instance of this class set to the ``path`` tag with value ``val``. - :param MediaMetadata val: - :rtype: MediaInfo + :param LookupError val: + :rtype: DownloadError """ - return cls('metadata', val) + return cls('path', val) - def is_pending(self): + def is_path(self): """ - Check if the union tag is ``pending``. + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'pending' + return self._tag == 'path' - def is_metadata(self): + def is_other(self): """ - Check if the union tag is ``metadata``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'metadata' + return self._tag == 'other' - def get_metadata(self): + def get_path(self): """ - The metadata for the photo/video. - - Only call this if :meth:`is_metadata` is true. + Only call this if :meth:`is_path` is true. - :rtype: MediaMetadata + :rtype: LookupError """ - if not self.is_metadata(): - raise AttributeError("tag 'metadata' not set") + if not self.is_path(): + raise AttributeError("tag 'path' not set") return self._value def __repr__(self): - return 'MediaInfo(%r, %r)' % (self._tag, self._value) + return 'DownloadError(%r, %r)' % (self._tag, self._value) class FileMetadata(Metadata): """ @@ -587,6 +841,7 @@ class FileMetadata(Metadata): changes and avoid conflicts. :ivar size: The file size in bytes. :ivar media_info: Additional information if the file is a photo or video. + :ivar sharing_info: Set if this file is contained in a shared folder. """ __slots__ = [ @@ -602,6 +857,8 @@ class FileMetadata(Metadata): '_size_present', '_media_info_value', '_media_info_present', + '_sharing_info_value', + '_sharing_info_present', ] _has_required_fields = True @@ -615,7 +872,8 @@ def __init__(self, size=None, parent_shared_folder_id=None, id=None, - media_info=None): + media_info=None, + sharing_info=None): super(FileMetadata, self).__init__(name, path_lower, parent_shared_folder_id) @@ -631,6 +889,8 @@ def __init__(self, self._size_present = False self._media_info_value = None self._media_info_present = False + self._sharing_info_value = None + self._sharing_info_present = False if id is not None: self.id = id if client_modified is not None: @@ -643,6 +903,8 @@ def __init__(self, self.size = size if media_info is not None: self.media_info = media_info + if sharing_info is not None: + self.sharing_info = sharing_info @property def id(self): @@ -794,8 +1056,34 @@ def media_info(self): self._media_info_value = None self._media_info_present = False + @property + def sharing_info(self): + """ + Set if this file is contained in a shared folder. + + :rtype: FileSharingInfo + """ + if self._sharing_info_present: + return self._sharing_info_value + else: + return None + + @sharing_info.setter + def sharing_info(self, val): + if val is None: + del self.sharing_info + return + self._sharing_info_validator.validate_type_only(val) + self._sharing_info_value = val + self._sharing_info_present = True + + @sharing_info.deleter + def sharing_info(self): + self._sharing_info_value = None + self._sharing_info_present = False + def __repr__(self): - return 'FileMetadata(name={!r}, path_lower={!r}, client_modified={!r}, server_modified={!r}, rev={!r}, size={!r}, parent_shared_folder_id={!r}, id={!r}, media_info={!r})'.format( + return 'FileMetadata(name={!r}, path_lower={!r}, client_modified={!r}, server_modified={!r}, rev={!r}, size={!r}, parent_shared_folder_id={!r}, id={!r}, media_info={!r}, sharing_info={!r})'.format( self._name_value, self._path_lower_value, self._client_modified_value, @@ -805,13 +1093,155 @@ def __repr__(self): self._parent_shared_folder_id_value, self._id_value, self._media_info_value, + self._sharing_info_value, + ) + +class SharingInfo(object): + """ + Sharing info for a file or folder. + + :ivar read_only: True if the file or folder is inside a read-only shared + folder. + """ + + __slots__ = [ + '_read_only_value', + '_read_only_present', + ] + + _has_required_fields = True + + def __init__(self, + read_only=None): + self._read_only_value = None + self._read_only_present = False + if read_only is not None: + self.read_only = read_only + + @property + def read_only(self): + """ + True if the file or folder is inside a read-only shared folder. + + :rtype: bool + """ + if self._read_only_present: + return self._read_only_value + else: + raise AttributeError("missing required field 'read_only'") + + @read_only.setter + def read_only(self, val): + val = self._read_only_validator.validate(val) + self._read_only_value = val + self._read_only_present = True + + @read_only.deleter + def read_only(self): + self._read_only_value = None + self._read_only_present = False + + def __repr__(self): + return 'SharingInfo(read_only={!r})'.format( + self._read_only_value, + ) + +class FileSharingInfo(SharingInfo): + """ + Sharing info for a file which is contained by a shared folder. + + :ivar parent_shared_folder_id: ID of shared folder that holds this file. + :ivar modified_by: The last user who modified the file. This field will be + null if the user's account has been deleted. + """ + + __slots__ = [ + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + '_modified_by_value', + '_modified_by_present', + ] + + _has_required_fields = True + + def __init__(self, + read_only=None, + parent_shared_folder_id=None, + modified_by=None): + super(FileSharingInfo, self).__init__(read_only) + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + self._modified_by_value = None + self._modified_by_present = False + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + if modified_by is not None: + self.modified_by = modified_by + + @property + def parent_shared_folder_id(self): + """ + ID of shared folder that holds this file. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + raise AttributeError("missing required field 'parent_shared_folder_id'") + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + + @property + def modified_by(self): + """ + The last user who modified the file. This field will be null if the + user's account has been deleted. + + :rtype: str + """ + if self._modified_by_present: + return self._modified_by_value + else: + return None + + @modified_by.setter + def modified_by(self, val): + if val is None: + del self.modified_by + return + val = self._modified_by_validator.validate(val) + self._modified_by_value = val + self._modified_by_present = True + + @modified_by.deleter + def modified_by(self): + self._modified_by_value = None + self._modified_by_present = False + + def __repr__(self): + return 'FileSharingInfo(read_only={!r}, parent_shared_folder_id={!r}, modified_by={!r})'.format( + self._read_only_value, + self._parent_shared_folder_id_value, + self._modified_by_value, ) class FolderMetadata(Metadata): """ :ivar id: A unique identifier for the folder. - :ivar shared_folder_id: If this folder is a shared folder mount point, the - ID of the shared folder mounted at this location. + :ivar shared_folder_id: Deprecated. Please use :field:'sharing_info' + instead. + :ivar sharing_info: Set if the folder is contained in a shared folder or is + a shared folder mount point. """ __slots__ = [ @@ -819,6 +1249,8 @@ class FolderMetadata(Metadata): '_id_present', '_shared_folder_id_value', '_shared_folder_id_present', + '_sharing_info_value', + '_sharing_info_present', ] _has_required_fields = True @@ -828,7 +1260,8 @@ def __init__(self, path_lower=None, parent_shared_folder_id=None, id=None, - shared_folder_id=None): + shared_folder_id=None, + sharing_info=None): super(FolderMetadata, self).__init__(name, path_lower, parent_shared_folder_id) @@ -836,10 +1269,14 @@ def __init__(self, self._id_present = False self._shared_folder_id_value = None self._shared_folder_id_present = False + self._sharing_info_value = None + self._sharing_info_present = False if id is not None: self.id = id if shared_folder_id is not None: self.shared_folder_id = shared_folder_id + if sharing_info is not None: + self.sharing_info = sharing_info @property def id(self): @@ -867,6 +1304,129 @@ def id(self): self._id_value = None self._id_present = False + @property + def shared_folder_id(self): + """ + Deprecated. Please use :field:'sharing_info' instead. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + return None + + @shared_folder_id.setter + def shared_folder_id(self, val): + if val is None: + del self.shared_folder_id + return + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def sharing_info(self): + """ + Set if the folder is contained in a shared folder or is a shared folder + mount point. + + :rtype: FolderSharingInfo + """ + if self._sharing_info_present: + return self._sharing_info_value + else: + return None + + @sharing_info.setter + def sharing_info(self, val): + if val is None: + del self.sharing_info + return + self._sharing_info_validator.validate_type_only(val) + self._sharing_info_value = val + self._sharing_info_present = True + + @sharing_info.deleter + def sharing_info(self): + self._sharing_info_value = None + self._sharing_info_present = False + + def __repr__(self): + return 'FolderMetadata(name={!r}, path_lower={!r}, parent_shared_folder_id={!r}, id={!r}, shared_folder_id={!r}, sharing_info={!r})'.format( + self._name_value, + self._path_lower_value, + self._parent_shared_folder_id_value, + self._id_value, + self._shared_folder_id_value, + self._sharing_info_value, + ) + +class FolderSharingInfo(SharingInfo): + """ + Sharing info for a folder which is contained in a shared folder or is a + shared folder mount point. + + :ivar parent_shared_folder_id: Set if the folder is contained by a shared + folder. + :ivar shared_folder_id: If this folder is a shared folder mount point, the + ID of the shared folder mounted at this location. + """ + + __slots__ = [ + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + read_only=None, + parent_shared_folder_id=None, + shared_folder_id=None): + super(FolderSharingInfo, self).__init__(read_only) + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def parent_shared_folder_id(self): + """ + Set if the folder is contained by a shared folder. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + return None + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + if val is None: + del self.parent_shared_folder_id + return + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + @property def shared_folder_id(self): """ @@ -895,95 +1455,12 @@ def shared_folder_id(self): self._shared_folder_id_present = False def __repr__(self): - return 'FolderMetadata(name={!r}, path_lower={!r}, parent_shared_folder_id={!r}, id={!r}, shared_folder_id={!r})'.format( - self._name_value, - self._path_lower_value, + return 'FolderSharingInfo(read_only={!r}, parent_shared_folder_id={!r}, shared_folder_id={!r})'.format( + self._read_only_value, self._parent_shared_folder_id_value, - self._id_value, self._shared_folder_id_value, ) -class DeletedMetadata(Metadata): - """ - Indicates that there used to be a file or folder at this path, but it no - longer exists. - """ - - __slots__ = [ - ] - - _has_required_fields = True - - def __init__(self, - name=None, - path_lower=None, - parent_shared_folder_id=None): - super(DeletedMetadata, self).__init__(name, - path_lower, - parent_shared_folder_id) - - def __repr__(self): - return 'DeletedMetadata(name={!r}, path_lower={!r}, parent_shared_folder_id={!r})'.format( - self._name_value, - self._path_lower_value, - self._parent_shared_folder_id_value, - ) - -class GetMetadataError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def path(cls, val): - """ - Create an instance of this class set to the ``path`` tag with value - ``val``. - - :param LookupError val: - :rtype: GetMetadataError - """ - return cls('path', val) - - def is_path(self): - """ - Check if the union tag is ``path``. - - :rtype: bool - """ - return self._tag == 'path' - - def get_path(self): - """ - Only call this if :meth:`is_path` is true. - - :rtype: LookupError - """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value - - def __repr__(self): - return 'GetMetadataError(%r, %r)' % (self._tag, self._value) - class GetMetadataArg(object): """ :ivar path: The path of a file or folder on Dropbox @@ -1031,228 +1508,49 @@ def path(self, val): self._path_present = True @path.deleter - def path(self): - self._path_value = None - self._path_present = False - - @property - def include_media_info(self): - """ - If true, :field:'FileMetadata.media_info' is set for photo and video. - - :rtype: bool - """ - if self._include_media_info_present: - return self._include_media_info_value - else: - return False - - @include_media_info.setter - def include_media_info(self, val): - val = self._include_media_info_validator.validate(val) - self._include_media_info_value = val - self._include_media_info_present = True - - @include_media_info.deleter - def include_media_info(self): - self._include_media_info_value = None - self._include_media_info_present = False - - def __repr__(self): - return 'GetMetadataArg(path={!r}, include_media_info={!r})'.format( - self._path_value, - self._include_media_info_value, - ) - -class ListFolderLongpollArg(object): - """ - :ivar cursor: A cursor as returned by list_folder or list_folder/continue - :ivar timeout: A timeout in seconds. The request will block for at most this - length of time, plus up to 90 seconds of random jitter added to avoid - the thundering herd problem. Care should be taken when using this - parameter, as some network infrastructure does not support long - timeouts. - """ - - __slots__ = [ - '_cursor_value', - '_cursor_present', - '_timeout_value', - '_timeout_present', - ] - - _has_required_fields = True - - def __init__(self, - cursor=None, - timeout=None): - self._cursor_value = None - self._cursor_present = False - self._timeout_value = None - self._timeout_present = False - if cursor is not None: - self.cursor = cursor - if timeout is not None: - self.timeout = timeout - - @property - def cursor(self): - """ - A cursor as returned by list_folder or list_folder/continue - - :rtype: str - """ - if self._cursor_present: - return self._cursor_value - else: - raise AttributeError("missing required field 'cursor'") - - @cursor.setter - def cursor(self, val): - val = self._cursor_validator.validate(val) - self._cursor_value = val - self._cursor_present = True - - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False - - @property - def timeout(self): - """ - A timeout in seconds. The request will block for at most this length of - time, plus up to 90 seconds of random jitter added to avoid the - thundering herd problem. Care should be taken when using this parameter, - as some network infrastructure does not support long timeouts. - - :rtype: long - """ - if self._timeout_present: - return self._timeout_value - else: - return 30 - - @timeout.setter - def timeout(self, val): - val = self._timeout_validator.validate(val) - self._timeout_value = val - self._timeout_present = True - - @timeout.deleter - def timeout(self): - self._timeout_value = None - self._timeout_present = False - - def __repr__(self): - return 'ListFolderLongpollArg(cursor={!r}, timeout={!r})'.format( - self._cursor_value, - self._timeout_value, - ) - -class ListFolderLongpollResult(object): - """ - :ivar changes: Indicates whether new changes are available. If true, call - list_folder to retrieve the changes. - :ivar backoff: If present, backoff for at least this many seconds before - calling list_folder/longpoll again. - """ - - __slots__ = [ - '_changes_value', - '_changes_present', - '_backoff_value', - '_backoff_present', - ] - - _has_required_fields = True - - def __init__(self, - changes=None, - backoff=None): - self._changes_value = None - self._changes_present = False - self._backoff_value = None - self._backoff_present = False - if changes is not None: - self.changes = changes - if backoff is not None: - self.backoff = backoff - - @property - def changes(self): - """ - Indicates whether new changes are available. If true, call list_folder - to retrieve the changes. - - :rtype: bool - """ - if self._changes_present: - return self._changes_value - else: - raise AttributeError("missing required field 'changes'") - - @changes.setter - def changes(self, val): - val = self._changes_validator.validate(val) - self._changes_value = val - self._changes_present = True - - @changes.deleter - def changes(self): - self._changes_value = None - self._changes_present = False + def path(self): + self._path_value = None + self._path_present = False @property - def backoff(self): + def include_media_info(self): """ - If present, backoff for at least this many seconds before calling - list_folder/longpoll again. + If true, :field:'FileMetadata.media_info' is set for photo and video. - :rtype: long + :rtype: bool """ - if self._backoff_present: - return self._backoff_value + if self._include_media_info_present: + return self._include_media_info_value else: - return None + return False - @backoff.setter - def backoff(self, val): - if val is None: - del self.backoff - return - val = self._backoff_validator.validate(val) - self._backoff_value = val - self._backoff_present = True + @include_media_info.setter + def include_media_info(self, val): + val = self._include_media_info_validator.validate(val) + self._include_media_info_value = val + self._include_media_info_present = True - @backoff.deleter - def backoff(self): - self._backoff_value = None - self._backoff_present = False + @include_media_info.deleter + def include_media_info(self): + self._include_media_info_value = None + self._include_media_info_present = False def __repr__(self): - return 'ListFolderLongpollResult(changes={!r}, backoff={!r})'.format( - self._changes_value, - self._backoff_value, + return 'GetMetadataArg(path={!r}, include_media_info={!r})'.format( + self._path_value, + self._include_media_info_value, ) -class ListFolderLongpollError(object): +class GetMetadataError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - - :ivar reset: Indicates that the cursor has been invalidated. Call - list_folder to obtain a new cursor. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' - # Attribute is overwritten below the class definition - reset = None - # Attribute is overwritten below the class definition - other = None + _catch_all = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -1266,24 +1564,118 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_reset(self): + @classmethod + def path(cls, val): """ - Check if the union tag is ``reset``. + Create an instance of this class set to the ``path`` tag with value + ``val``. - :rtype: bool + :param LookupError val: + :rtype: GetMetadataError """ - return self._tag == 'reset' + return cls('path', val) - def is_other(self): + def is_path(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'path' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value def __repr__(self): - return 'ListFolderLongpollError(%r, %r)' % (self._tag, self._value) + return 'GetMetadataError(%r, %r)' % (self._tag, self._value) + +class GpsCoordinates(object): + """ + GPS coordinates for a photo or video. + + :ivar latitude: Latitude of the GPS coordinates. + :ivar longitude: Longitude of the GPS coordinates. + """ + + __slots__ = [ + '_latitude_value', + '_latitude_present', + '_longitude_value', + '_longitude_present', + ] + + _has_required_fields = True + + def __init__(self, + latitude=None, + longitude=None): + self._latitude_value = None + self._latitude_present = False + self._longitude_value = None + self._longitude_present = False + if latitude is not None: + self.latitude = latitude + if longitude is not None: + self.longitude = longitude + + @property + def latitude(self): + """ + Latitude of the GPS coordinates. + + :rtype: float + """ + if self._latitude_present: + return self._latitude_value + else: + raise AttributeError("missing required field 'latitude'") + + @latitude.setter + def latitude(self, val): + val = self._latitude_validator.validate(val) + self._latitude_value = val + self._latitude_present = True + + @latitude.deleter + def latitude(self): + self._latitude_value = None + self._latitude_present = False + + @property + def longitude(self): + """ + Longitude of the GPS coordinates. + + :rtype: float + """ + if self._longitude_present: + return self._longitude_value + else: + raise AttributeError("missing required field 'longitude'") + + @longitude.setter + def longitude(self, val): + val = self._longitude_validator.validate(val) + self._longitude_value = val + self._longitude_present = True + + @longitude.deleter + def longitude(self): + self._longitude_value = None + self._longitude_present = False + + def __repr__(self): + return 'GpsCoordinates(latitude={!r}, longitude={!r})'.format( + self._latitude_value, + self._longitude_value, + ) class ListFolderArg(object): """ @@ -1434,120 +1826,132 @@ def __repr__(self): self._include_deleted_value, ) -class ListFolderResult(object): +class ListFolderContinueArg(object): """ - :ivar entries: The files and (direct) subfolders in the folder. - :ivar cursor: Pass the cursor into list_folder/continue to see what's - changed in the folder since your previous query. - :ivar has_more: If true, then there are more entries available. Pass the - cursor to list_folder/continue to retrieve the rest. + :ivar cursor: The cursor returned by your last call to list_folder or + list_folder/continue. """ __slots__ = [ - '_entries_value', - '_entries_present', '_cursor_value', '_cursor_present', - '_has_more_value', - '_has_more_present', ] _has_required_fields = True def __init__(self, - entries=None, - cursor=None, - has_more=None): - self._entries_value = None - self._entries_present = False + cursor=None): self._cursor_value = None self._cursor_present = False - self._has_more_value = None - self._has_more_present = False - if entries is not None: - self.entries = entries if cursor is not None: self.cursor = cursor - if has_more is not None: - self.has_more = has_more @property - def entries(self): + def cursor(self): """ - The files and (direct) subfolders in the folder. + The cursor returned by your last call to list_folder or + list_folder/continue. - :rtype: list of [Metadata] + :rtype: str """ - if self._entries_present: - return self._entries_value + if self._cursor_present: + return self._cursor_value else: - raise AttributeError("missing required field 'entries'") + raise AttributeError("missing required field 'cursor'") - @entries.setter - def entries(self, val): - val = self._entries_validator.validate(val) - self._entries_value = val - self._entries_present = True + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'ListFolderContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +class ListFolderContinueError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + list_folder to obtain a new cursor. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. - @entries.deleter - def entries(self): - self._entries_value = None - self._entries_present = False + :param LookupError val: + :rtype: ListFolderContinueError + """ + return cls('path', val) - @property - def cursor(self): + def is_path(self): """ - Pass the cursor into list_folder/continue to see what's changed in the - folder since your previous query. + Check if the union tag is ``path``. - :rtype: str + :rtype: bool """ - if self._cursor_present: - return self._cursor_value - else: - raise AttributeError("missing required field 'cursor'") + return self._tag == 'path' - @cursor.setter - def cursor(self, val): - val = self._cursor_validator.validate(val) - self._cursor_value = val - self._cursor_present = True + def is_reset(self): + """ + Check if the union tag is ``reset``. - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False + :rtype: bool + """ + return self._tag == 'reset' - @property - def has_more(self): + def is_other(self): """ - If true, then there are more entries available. Pass the cursor to - list_folder/continue to retrieve the rest. + Check if the union tag is ``other``. :rtype: bool """ - if self._has_more_present: - return self._has_more_value - else: - raise AttributeError("missing required field 'has_more'") + return self._tag == 'other' - @has_more.setter - def has_more(self, val): - val = self._has_more_validator.validate(val) - self._has_more_value = val - self._has_more_present = True + def get_path(self): + """ + Only call this if :meth:`is_path` is true. - @has_more.deleter - def has_more(self): - self._has_more_value = None - self._has_more_present = False + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value def __repr__(self): - return 'ListFolderResult(entries={!r}, cursor={!r}, has_more={!r})'.format( - self._entries_value, - self._cursor_value, - self._has_more_value, - ) + return 'ListFolderContinueError(%r, %r)' % (self._tag, self._value) class ListFolderError(object): """ @@ -1616,10 +2020,10 @@ def get_path(self): def __repr__(self): return 'ListFolderError(%r, %r)' % (self._tag, self._value) -class ListFolderContinueArg(object): +class ListFolderGetLatestCursorResult(object): """ - :ivar cursor: The cursor returned by your last call to list_folder or - list_folder/continue. + :ivar cursor: Pass the cursor into list_folder/continue to see what's + changed in the folder since your previous query. """ __slots__ = [ @@ -1639,8 +2043,8 @@ def __init__(self, @property def cursor(self): """ - The cursor returned by your last call to list_folder or - list_folder/continue. + Pass the cursor into list_folder/continue to see what's changed in the + folder since your previous query. :rtype: str """ @@ -1661,11 +2065,97 @@ def cursor(self): self._cursor_present = False def __repr__(self): - return 'ListFolderContinueArg(cursor={!r})'.format( + return 'ListFolderGetLatestCursorResult(cursor={!r})'.format( self._cursor_value, ) -class ListFolderContinueError(object): +class ListFolderLongpollArg(object): + """ + :ivar cursor: A cursor as returned by list_folder or list_folder/continue + :ivar timeout: A timeout in seconds. The request will block for at most this + length of time, plus up to 90 seconds of random jitter added to avoid + the thundering herd problem. Care should be taken when using this + parameter, as some network infrastructure does not support long + timeouts. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_timeout_value', + '_timeout_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None, + timeout=None): + self._cursor_value = None + self._cursor_present = False + self._timeout_value = None + self._timeout_present = False + if cursor is not None: + self.cursor = cursor + if timeout is not None: + self.timeout = timeout + + @property + def cursor(self): + """ + A cursor as returned by list_folder or list_folder/continue + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def timeout(self): + """ + A timeout in seconds. The request will block for at most this length of + time, plus up to 90 seconds of random jitter added to avoid the + thundering herd problem. Care should be taken when using this parameter, + as some network infrastructure does not support long timeouts. + + :rtype: long + """ + if self._timeout_present: + return self._timeout_value + else: + return 30 + + @timeout.setter + def timeout(self, val): + val = self._timeout_validator.validate(val) + self._timeout_value = val + self._timeout_present = True + + @timeout.deleter + def timeout(self): + self._timeout_value = None + self._timeout_present = False + + def __repr__(self): + return 'ListFolderLongpollArg(cursor={!r}, timeout={!r})'.format( + self._cursor_value, + self._timeout_value, + ) + +class ListFolderLongpollError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the @@ -1695,73 +2185,170 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def path(cls, val): + def is_reset(self): """ - Create an instance of this class set to the ``path`` tag with value - ``val``. + Check if the union tag is ``reset``. - :param LookupError val: - :rtype: ListFolderContinueError + :rtype: bool """ - return cls('path', val) + return self._tag == 'reset' - def is_path(self): + def is_other(self): """ - Check if the union tag is ``path``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'path' + return self._tag == 'other' - def is_reset(self): + def __repr__(self): + return 'ListFolderLongpollError(%r, %r)' % (self._tag, self._value) + +class ListFolderLongpollResult(object): + """ + :ivar changes: Indicates whether new changes are available. If true, call + list_folder to retrieve the changes. + :ivar backoff: If present, backoff for at least this many seconds before + calling list_folder/longpoll again. + """ + + __slots__ = [ + '_changes_value', + '_changes_present', + '_backoff_value', + '_backoff_present', + ] + + _has_required_fields = True + + def __init__(self, + changes=None, + backoff=None): + self._changes_value = None + self._changes_present = False + self._backoff_value = None + self._backoff_present = False + if changes is not None: + self.changes = changes + if backoff is not None: + self.backoff = backoff + + @property + def changes(self): """ - Check if the union tag is ``reset``. + Indicates whether new changes are available. If true, call list_folder + to retrieve the changes. :rtype: bool """ - return self._tag == 'reset' + if self._changes_present: + return self._changes_value + else: + raise AttributeError("missing required field 'changes'") - def is_other(self): + @changes.setter + def changes(self, val): + val = self._changes_validator.validate(val) + self._changes_value = val + self._changes_present = True + + @changes.deleter + def changes(self): + self._changes_value = None + self._changes_present = False + + @property + def backoff(self): """ - Check if the union tag is ``other``. + If present, backoff for at least this many seconds before calling + list_folder/longpoll again. - :rtype: bool + :rtype: long """ - return self._tag == 'other' + if self._backoff_present: + return self._backoff_value + else: + return None - def get_path(self): - """ - Only call this if :meth:`is_path` is true. + @backoff.setter + def backoff(self, val): + if val is None: + del self.backoff + return + val = self._backoff_validator.validate(val) + self._backoff_value = val + self._backoff_present = True - :rtype: LookupError - """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value + @backoff.deleter + def backoff(self): + self._backoff_value = None + self._backoff_present = False def __repr__(self): - return 'ListFolderContinueError(%r, %r)' % (self._tag, self._value) + return 'ListFolderLongpollResult(changes={!r}, backoff={!r})'.format( + self._changes_value, + self._backoff_value, + ) -class ListFolderGetLatestCursorResult(object): +class ListFolderResult(object): """ + :ivar entries: The files and (direct) subfolders in the folder. :ivar cursor: Pass the cursor into list_folder/continue to see what's changed in the folder since your previous query. + :ivar has_more: If true, then there are more entries available. Pass the + cursor to list_folder/continue to retrieve the rest. """ __slots__ = [ + '_entries_value', + '_entries_present', '_cursor_value', '_cursor_present', + '_has_more_value', + '_has_more_present', ] _has_required_fields = True def __init__(self, - cursor=None): + entries=None, + cursor=None, + has_more=None): + self._entries_value = None + self._entries_present = False self._cursor_value = None self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if entries is not None: + self.entries = entries if cursor is not None: self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def entries(self): + """ + The files and (direct) subfolders in the folder. + + :rtype: list of [Metadata] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False @property def cursor(self): @@ -1787,249 +2374,121 @@ def cursor(self): self._cursor_value = None self._cursor_present = False - def __repr__(self): - return 'ListFolderGetLatestCursorResult(cursor={!r})'.format( - self._cursor_value, - ) - -class DownloadError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar other: An unspecified error. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = 'other' - # Attribute is overwritten below the class definition - other = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def path(cls, val): - """ - Create an instance of this class set to the ``path`` tag with value - ``val``. - - :param LookupError val: - :rtype: DownloadError - """ - return cls('path', val) - - def is_path(self): - """ - Check if the union tag is ``path``. - - :rtype: bool - """ - return self._tag == 'path' - - def is_other(self): + @property + def has_more(self): """ - Check if the union tag is ``other``. + If true, then there are more entries available. Pass the cursor to + list_folder/continue to retrieve the rest. :rtype: bool """ - return self._tag == 'other' + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") - def get_path(self): - """ - Only call this if :meth:`is_path` is true. + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True - :rtype: LookupError - """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False def __repr__(self): - return 'DownloadError(%r, %r)' % (self._tag, self._value) + return 'ListFolderResult(entries={!r}, cursor={!r}, has_more={!r})'.format( + self._entries_value, + self._cursor_value, + self._has_more_value, + ) -class DownloadArg(object): +class ListRevisionsArg(object): """ - :ivar path: The path of the file to download. - :ivar rev: Deprecated. Please specify revision in :field:'path' instead + :ivar path: The path to the file you want to see the revisions of. + :ivar limit: The maximum number of revision entries returned. """ __slots__ = [ '_path_value', '_path_present', - '_rev_value', - '_rev_present', + '_limit_value', + '_limit_present', ] _has_required_fields = True def __init__(self, path=None, - rev=None): - self._path_value = None - self._path_present = False - self._rev_value = None - self._rev_present = False - if path is not None: - self.path = path - if rev is not None: - self.rev = rev - - @property - def path(self): - """ - The path of the file to download. - - :rtype: str - """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") - - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True - - @path.deleter - def path(self): - self._path_value = None - self._path_present = False - - @property - def rev(self): - """ - Deprecated. Please specify revision in :field:'path' instead - - :rtype: str - """ - if self._rev_present: - return self._rev_value - else: - return None - - @rev.setter - def rev(self, val): - if val is None: - del self.rev - return - val = self._rev_validator.validate(val) - self._rev_value = val - self._rev_present = True - - @rev.deleter - def rev(self): - self._rev_value = None - self._rev_present = False - - def __repr__(self): - return 'DownloadArg(path={!r}, rev={!r})'.format( - self._path_value, - self._rev_value, - ) - -class UploadWriteFailed(object): - """ - :ivar reason: The reason why the file couldn't be saved. - :ivar upload_session_id: The upload session ID; this may be used to retry - the commit. - """ - - __slots__ = [ - '_reason_value', - '_reason_present', - '_upload_session_id_value', - '_upload_session_id_present', - ] - - _has_required_fields = True - - def __init__(self, - reason=None, - upload_session_id=None): - self._reason_value = None - self._reason_present = False - self._upload_session_id_value = None - self._upload_session_id_present = False - if reason is not None: - self.reason = reason - if upload_session_id is not None: - self.upload_session_id = upload_session_id + limit=None): + self._path_value = None + self._path_present = False + self._limit_value = None + self._limit_present = False + if path is not None: + self.path = path + if limit is not None: + self.limit = limit @property - def reason(self): + def path(self): """ - The reason why the file couldn't be saved. + The path to the file you want to see the revisions of. - :rtype: WriteError + :rtype: str """ - if self._reason_present: - return self._reason_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'reason'") + raise AttributeError("missing required field 'path'") - @reason.setter - def reason(self, val): - self._reason_validator.validate_type_only(val) - self._reason_value = val - self._reason_present = True + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @reason.deleter - def reason(self): - self._reason_value = None - self._reason_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False @property - def upload_session_id(self): + def limit(self): """ - The upload session ID; this may be used to retry the commit. + The maximum number of revision entries returned. - :rtype: str + :rtype: long """ - if self._upload_session_id_present: - return self._upload_session_id_value + if self._limit_present: + return self._limit_value else: - raise AttributeError("missing required field 'upload_session_id'") + return 10 - @upload_session_id.setter - def upload_session_id(self, val): - val = self._upload_session_id_validator.validate(val) - self._upload_session_id_value = val - self._upload_session_id_present = True + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True - @upload_session_id.deleter - def upload_session_id(self): - self._upload_session_id_value = None - self._upload_session_id_present = False + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False def __repr__(self): - return 'UploadWriteFailed(reason={!r}, upload_session_id={!r})'.format( - self._reason_value, - self._upload_session_id_value, + return 'ListRevisionsArg(path={!r}, limit={!r})'.format( + self._path_value, + self._limit_value, ) -class UploadError(object): +class ListRevisionsError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - - :ivar UploadWriteFailed path: Unable to save the uploaded contents to a - file. - :ivar other: An unspecified error. """ __slots__ = ['_tag', '_value'] @@ -2056,8 +2515,8 @@ def path(cls, val): Create an instance of this class set to the ``path`` tag with value ``val``. - :param UploadWriteFailed val: - :rtype: UploadError + :param LookupError val: + :rtype: ListRevisionsError """ return cls('path', val) @@ -2079,80 +2538,111 @@ def is_other(self): def get_path(self): """ - Unable to save the uploaded contents to a file. - Only call this if :meth:`is_path` is true. - :rtype: UploadWriteFailed + :rtype: LookupError """ if not self.is_path(): raise AttributeError("tag 'path' not set") return self._value def __repr__(self): - return 'UploadError(%r, %r)' % (self._tag, self._value) + return 'ListRevisionsError(%r, %r)' % (self._tag, self._value) -class UploadSessionOffsetError(object): +class ListRevisionsResult(object): """ - :ivar correct_offset: The offset up to which data has been collected. + :ivar is_deleted: If the file is deleted. + :ivar entries: The revisions for the file. Only non-delete revisions will + show up here. """ __slots__ = [ - '_correct_offset_value', - '_correct_offset_present', + '_is_deleted_value', + '_is_deleted_present', + '_entries_value', + '_entries_present', ] _has_required_fields = True def __init__(self, - correct_offset=None): - self._correct_offset_value = None - self._correct_offset_present = False - if correct_offset is not None: - self.correct_offset = correct_offset + is_deleted=None, + entries=None): + self._is_deleted_value = None + self._is_deleted_present = False + self._entries_value = None + self._entries_present = False + if is_deleted is not None: + self.is_deleted = is_deleted + if entries is not None: + self.entries = entries @property - def correct_offset(self): + def is_deleted(self): """ - The offset up to which data has been collected. + If the file is deleted. - :rtype: long + :rtype: bool """ - if self._correct_offset_present: - return self._correct_offset_value + if self._is_deleted_present: + return self._is_deleted_value else: - raise AttributeError("missing required field 'correct_offset'") + raise AttributeError("missing required field 'is_deleted'") - @correct_offset.setter - def correct_offset(self, val): - val = self._correct_offset_validator.validate(val) - self._correct_offset_value = val - self._correct_offset_present = True + @is_deleted.setter + def is_deleted(self, val): + val = self._is_deleted_validator.validate(val) + self._is_deleted_value = val + self._is_deleted_present = True - @correct_offset.deleter - def correct_offset(self): - self._correct_offset_value = None - self._correct_offset_present = False + @is_deleted.deleter + def is_deleted(self): + self._is_deleted_value = None + self._is_deleted_present = False + + @property + def entries(self): + """ + The revisions for the file. Only non-delete revisions will show up here. + + :rtype: list of [FileMetadata] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False def __repr__(self): - return 'UploadSessionOffsetError(correct_offset={!r})'.format( - self._correct_offset_value, + return 'ListRevisionsResult(is_deleted={!r}, entries={!r})'.format( + self._is_deleted_value, + self._entries_value, ) -class UploadSessionLookupError(object): +class LookupError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar not_found: The upload session id was not found. - :ivar UploadSessionOffsetError incorrect_offset: The specified offset was - incorrect. See the value for the correct offset. (This error may occur - when a previous request was received and processed successfully but the - client did not receive the response, e.g. due to a network error.) - :ivar closed: You are attempting to append data to an upload session that - has alread been closed (i.e. committed). - :ivar other: An unspecified error. + :ivar not_found: There is nothing at the given path. + :ivar not_file: We were expecting a file, but the given path refers to + something that isn't a file. + :ivar not_folder: We were expecting a folder, but the given path refers to + something that isn't a folder. + :ivar restricted_content: The file cannot be transferred because the content + is restricted. For example, sometimes there are legal restrictions due + to copyright claims. """ __slots__ = ['_tag', '_value'] @@ -2161,7 +2651,11 @@ class UploadSessionLookupError(object): # Attribute is overwritten below the class definition not_found = None # Attribute is overwritten below the class definition - closed = None + not_file = None + # Attribute is overwritten below the class definition + not_folder = None + # Attribute is overwritten below the class definition + restricted_content = None # Attribute is overwritten below the class definition other = None @@ -2178,15 +2672,23 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def incorrect_offset(cls, val): + def malformed_path(cls, val): """ - Create an instance of this class set to the ``incorrect_offset`` tag - with value ``val``. + Create an instance of this class set to the ``malformed_path`` tag with + value ``val``. - :param UploadSessionOffsetError val: - :rtype: UploadSessionLookupError + :param str val: + :rtype: LookupError """ - return cls('incorrect_offset', val) + return cls('malformed_path', val) + + def is_malformed_path(self): + """ + Check if the union tag is ``malformed_path``. + + :rtype: bool + """ + return self._tag == 'malformed_path' def is_not_found(self): """ @@ -2196,21 +2698,29 @@ def is_not_found(self): """ return self._tag == 'not_found' - def is_incorrect_offset(self): + def is_not_file(self): """ - Check if the union tag is ``incorrect_offset``. + Check if the union tag is ``not_file``. :rtype: bool """ - return self._tag == 'incorrect_offset' + return self._tag == 'not_file' - def is_closed(self): + def is_not_folder(self): """ - Check if the union tag is ``closed``. + Check if the union tag is ``not_folder``. :rtype: bool """ - return self._tag == 'closed' + return self._tag == 'not_folder' + + def is_restricted_content(self): + """ + Check if the union tag is ``restricted_content``. + + :rtype: bool + """ + return self._tag == 'restricted_content' def is_other(self): """ @@ -2220,41 +2730,35 @@ def is_other(self): """ return self._tag == 'other' - def get_incorrect_offset(self): + def get_malformed_path(self): """ - The specified offset was incorrect. See the value for the correct - offset. (This error may occur when a previous request was received and - processed successfully but the client did not receive the response, e.g. - due to a network error.) - - Only call this if :meth:`is_incorrect_offset` is true. + Only call this if :meth:`is_malformed_path` is true. - :rtype: UploadSessionOffsetError + :rtype: str """ - if not self.is_incorrect_offset(): - raise AttributeError("tag 'incorrect_offset' not set") + if not self.is_malformed_path(): + raise AttributeError("tag 'malformed_path' not set") return self._value def __repr__(self): - return 'UploadSessionLookupError(%r, %r)' % (self._tag, self._value) + return 'LookupError(%r, %r)' % (self._tag, self._value) -class UploadSessionFinishError(object): +class MediaInfo(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar UploadSessionLookupError lookup_failed: The session arguments are - incorrect; the value explains the reason. - :ivar WriteError path: Unable to save the uploaded contents to a file. - :ivar other: An unspecified error. + :ivar pending: Indicate the photo/video is still under processing and + metadata is not available yet. + :ivar MediaMetadata metadata: The metadata for the photo/video. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' + _catch_all = None # Attribute is overwritten below the class definition - other = None + pending = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -2269,373 +2773,225 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def lookup_failed(cls, val): - """ - Create an instance of this class set to the ``lookup_failed`` tag with - value ``val``. - - :param UploadSessionLookupError val: - :rtype: UploadSessionFinishError - """ - return cls('lookup_failed', val) - - @classmethod - def path(cls, val): + def metadata(cls, val): """ - Create an instance of this class set to the ``path`` tag with value + Create an instance of this class set to the ``metadata`` tag with value ``val``. - :param WriteError val: - :rtype: UploadSessionFinishError - """ - return cls('path', val) - - def is_lookup_failed(self): - """ - Check if the union tag is ``lookup_failed``. - - :rtype: bool + :param MediaMetadata val: + :rtype: MediaInfo """ - return self._tag == 'lookup_failed' + return cls('metadata', val) - def is_path(self): + def is_pending(self): """ - Check if the union tag is ``path``. + Check if the union tag is ``pending``. :rtype: bool """ - return self._tag == 'path' + return self._tag == 'pending' - def is_other(self): + def is_metadata(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``metadata``. :rtype: bool """ - return self._tag == 'other' - - def get_lookup_failed(self): - """ - The session arguments are incorrect; the value explains the reason. - - Only call this if :meth:`is_lookup_failed` is true. - - :rtype: UploadSessionLookupError - """ - if not self.is_lookup_failed(): - raise AttributeError("tag 'lookup_failed' not set") - return self._value + return self._tag == 'metadata' - def get_path(self): + def get_metadata(self): """ - Unable to save the uploaded contents to a file. + The metadata for the photo/video. - Only call this if :meth:`is_path` is true. + Only call this if :meth:`is_metadata` is true. - :rtype: WriteError + :rtype: MediaMetadata """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") + if not self.is_metadata(): + raise AttributeError("tag 'metadata' not set") return self._value def __repr__(self): - return 'UploadSessionFinishError(%r, %r)' % (self._tag, self._value) + return 'MediaInfo(%r, %r)' % (self._tag, self._value) -class UploadSessionStartResult(object): - """ - :ivar session_id: A unique identifier for the upload session. Pass this to - upload_session/append and upload_session/finish. +class MediaMetadata(object): """ + Metadata for a photo or video. - __slots__ = [ - '_session_id_value', - '_session_id_present', - ] - - _has_required_fields = True - - def __init__(self, - session_id=None): - self._session_id_value = None - self._session_id_present = False - if session_id is not None: - self.session_id = session_id - - @property - def session_id(self): - """ - A unique identifier for the upload session. Pass this to - upload_session/append and upload_session/finish. - - :rtype: str - """ - if self._session_id_present: - return self._session_id_value - else: - raise AttributeError("missing required field 'session_id'") - - @session_id.setter - def session_id(self, val): - val = self._session_id_validator.validate(val) - self._session_id_value = val - self._session_id_present = True - - @session_id.deleter - def session_id(self): - self._session_id_value = None - self._session_id_present = False - - def __repr__(self): - return 'UploadSessionStartResult(session_id={!r})'.format( - self._session_id_value, - ) - -class UploadSessionCursor(object): - """ - :ivar session_id: The upload session ID (returned by upload_session/start). - :ivar offset: The amount of data that has been uploaded so far. We use this - to make sure upload data isn't lost or duplicated in the event of a - network error. + :ivar dimensions: Dimension of the photo/video. + :ivar location: The GPS coordinate of the photo/video. + :ivar time_taken: The timestamp when the photo/video is taken. """ __slots__ = [ - '_session_id_value', - '_session_id_present', - '_offset_value', - '_offset_present', + '_dimensions_value', + '_dimensions_present', + '_location_value', + '_location_present', + '_time_taken_value', + '_time_taken_present', ] - _has_required_fields = True + _has_required_fields = False def __init__(self, - session_id=None, - offset=None): - self._session_id_value = None - self._session_id_present = False - self._offset_value = None - self._offset_present = False - if session_id is not None: - self.session_id = session_id - if offset is not None: - self.offset = offset - - @property - def session_id(self): - """ - The upload session ID (returned by upload_session/start). - - :rtype: str - """ - if self._session_id_present: - return self._session_id_value - else: - raise AttributeError("missing required field 'session_id'") - - @session_id.setter - def session_id(self, val): - val = self._session_id_validator.validate(val) - self._session_id_value = val - self._session_id_present = True - - @session_id.deleter - def session_id(self): - self._session_id_value = None - self._session_id_present = False + dimensions=None, + location=None, + time_taken=None): + self._dimensions_value = None + self._dimensions_present = False + self._location_value = None + self._location_present = False + self._time_taken_value = None + self._time_taken_present = False + if dimensions is not None: + self.dimensions = dimensions + if location is not None: + self.location = location + if time_taken is not None: + self.time_taken = time_taken @property - def offset(self): - """ - The amount of data that has been uploaded so far. We use this to make - sure upload data isn't lost or duplicated in the event of a network - error. - - :rtype: long - """ - if self._offset_present: - return self._offset_value - else: - raise AttributeError("missing required field 'offset'") - - @offset.setter - def offset(self, val): - val = self._offset_validator.validate(val) - self._offset_value = val - self._offset_present = True - - @offset.deleter - def offset(self): - self._offset_value = None - self._offset_present = False - - def __repr__(self): - return 'UploadSessionCursor(session_id={!r}, offset={!r})'.format( - self._session_id_value, - self._offset_value, - ) - -class WriteMode(object): - """ - Your intent when writing a file to some path. This is used to determine what - constitutes a conflict and what the autorename strategy is. In some - situations, the conflict behavior is identical: (a) If the target path - doesn't contain anything, the file is always written; no conflict. (b) If - the target path contains a folder, it's always a conflict. (c) If the target - path contains a file with identical contents, nothing gets written; no - conflict. The conflict checking differs in the case where there's a file at - the target path with contents different from the contents you're trying to - write. - - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar add: Never overwrite the existing file. The autorename strategy is to - append a number to the file name. For example, "document.txt" might - become "document (2).txt". - :ivar overwrite: Always overwrite the existing file. The autorename strategy - is the same as it is for ``add``. - :ivar str update: Overwrite if the given "rev" matches the existing file's - "rev". The autorename strategy is to append the string "conflicted copy" - to the file name. For example, "document.txt" might become "document - (conflicted copy).txt" or "document (Panda's conflicted copy).txt". - """ + def dimensions(self): + """ + Dimension of the photo/video. - __slots__ = ['_tag', '_value'] + :rtype: Dimensions + """ + if self._dimensions_present: + return self._dimensions_value + else: + return None - _catch_all = None - # Attribute is overwritten below the class definition - add = None - # Attribute is overwritten below the class definition - overwrite = None + @dimensions.setter + def dimensions(self, val): + if val is None: + del self.dimensions + return + self._dimensions_validator.validate_type_only(val) + self._dimensions_value = val + self._dimensions_present = True - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + @dimensions.deleter + def dimensions(self): + self._dimensions_value = None + self._dimensions_present = False - @classmethod - def update(cls, val): + @property + def location(self): """ - Create an instance of this class set to the ``update`` tag with value - ``val``. + The GPS coordinate of the photo/video. - :param str val: - :rtype: WriteMode + :rtype: GpsCoordinates """ - return cls('update', val) + if self._location_present: + return self._location_value + else: + return None - def is_add(self): - """ - Check if the union tag is ``add``. + @location.setter + def location(self, val): + if val is None: + del self.location + return + self._location_validator.validate_type_only(val) + self._location_value = val + self._location_present = True - :rtype: bool - """ - return self._tag == 'add' + @location.deleter + def location(self): + self._location_value = None + self._location_present = False - def is_overwrite(self): + @property + def time_taken(self): """ - Check if the union tag is ``overwrite``. + The timestamp when the photo/video is taken. - :rtype: bool + :rtype: datetime.datetime """ - return self._tag == 'overwrite' + if self._time_taken_present: + return self._time_taken_value + else: + return None - def is_update(self): - """ - Check if the union tag is ``update``. + @time_taken.setter + def time_taken(self, val): + if val is None: + del self.time_taken + return + val = self._time_taken_validator.validate(val) + self._time_taken_value = val + self._time_taken_present = True - :rtype: bool - """ - return self._tag == 'update' + @time_taken.deleter + def time_taken(self): + self._time_taken_value = None + self._time_taken_present = False - def get_update(self): - """ - Overwrite if the given "rev" matches the existing file's "rev". The - autorename strategy is to append the string "conflicted copy" to the - file name. For example, "document.txt" might become "document - (conflicted copy).txt" or "document (Panda's conflicted copy).txt". + def __repr__(self): + return 'MediaMetadata(dimensions={!r}, location={!r}, time_taken={!r})'.format( + self._dimensions_value, + self._location_value, + self._time_taken_value, + ) - Only call this if :meth:`is_update` is true. +class PhotoMetadata(MediaMetadata): + """ + Metadata for a photo. + """ - :rtype: str - """ - if not self.is_update(): - raise AttributeError("tag 'update' not set") - return self._value + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + dimensions=None, + location=None, + time_taken=None): + super(PhotoMetadata, self).__init__(dimensions, + location, + time_taken) def __repr__(self): - return 'WriteMode(%r, %r)' % (self._tag, self._value) + return 'PhotoMetadata(dimensions={!r}, location={!r}, time_taken={!r})'.format( + self._dimensions_value, + self._location_value, + self._time_taken_value, + ) -class CommitInfo(object): +class PreviewArg(object): """ - :ivar path: Path in the user's Dropbox to save the file. - :ivar mode: Selects what to do if the file already exists. - :ivar autorename: If there's a conflict, as determined by ``mode``, have the - Dropbox server try to autorename the file to avoid conflict. - :ivar client_modified: The value to store as the ``client_modified`` - timestamp. Dropbox automatically records the time at which the file was - written to the Dropbox servers. It can also record an additional - timestamp, provided by Dropbox desktop clients, mobile clients, and API - apps of when the file was actually created or modified. - :ivar mute: Normally, users are made aware of any file modifications in - their Dropbox account via notifications in the client software. If - ``True``, this tells the clients that this modification shouldn't result - in a user notification. + :ivar path: The path of the file to preview. + :ivar rev: Deprecated. Please specify revision in :field:'path' instead """ __slots__ = [ '_path_value', '_path_present', - '_mode_value', - '_mode_present', - '_autorename_value', - '_autorename_present', - '_client_modified_value', - '_client_modified_present', - '_mute_value', - '_mute_present', + '_rev_value', + '_rev_present', ] _has_required_fields = True def __init__(self, path=None, - mode=None, - autorename=None, - client_modified=None, - mute=None): + rev=None): self._path_value = None self._path_present = False - self._mode_value = None - self._mode_present = False - self._autorename_value = None - self._autorename_present = False - self._client_modified_value = None - self._client_modified_present = False - self._mute_value = None - self._mute_present = False + self._rev_value = None + self._rev_present = False if path is not None: self.path = path - if mode is not None: - self.mode = mode - if autorename is not None: - self.autorename = autorename - if client_modified is not None: - self.client_modified = client_modified - if mute is not None: - self.mute = mute + if rev is not None: + self.rev = rev @property def path(self): """ - Path in the user's Dropbox to save the file. + The path of the file to preview. :rtype: str """ @@ -2650,223 +3006,246 @@ def path(self, val): self._path_value = val self._path_present = True - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def rev(self): + """ + Deprecated. Please specify revision in :field:'path' instead + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + return None + + @rev.setter + def rev(self, val): + if val is None: + del self.rev + return + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + def __repr__(self): + return 'PreviewArg(path={!r}, rev={!r})'.format( + self._path_value, + self._rev_value, + ) + +class PreviewError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar LookupError path: An error occurs when downloading metadata for the + file. + :ivar in_progress: This preview generation is still in progress and the file + is not ready for preview yet. + :ivar unsupported_extension: The file extension is not supported preview + generation. + :ivar unsupported_content: The file content is not supported for preview + generation. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + in_progress = None + # Attribute is overwritten below the class definition + unsupported_extension = None + # Attribute is overwritten below the class definition + unsupported_content = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value - @property - def mode(self): + @classmethod + def path(cls, val): """ - Selects what to do if the file already exists. + Create an instance of this class set to the ``path`` tag with value + ``val``. - :rtype: WriteMode + :param LookupError val: + :rtype: PreviewError """ - if self._mode_present: - return self._mode_value - else: - return WriteMode.add - - @mode.setter - def mode(self, val): - self._mode_validator.validate_type_only(val) - self._mode_value = val - self._mode_present = True - - @mode.deleter - def mode(self): - self._mode_value = None - self._mode_present = False + return cls('path', val) - @property - def autorename(self): + def is_path(self): """ - If there's a conflict, as determined by ``mode``, have the Dropbox - server try to autorename the file to avoid conflict. + Check if the union tag is ``path``. :rtype: bool """ - if self._autorename_present: - return self._autorename_value - else: - return False - - @autorename.setter - def autorename(self, val): - val = self._autorename_validator.validate(val) - self._autorename_value = val - self._autorename_present = True - - @autorename.deleter - def autorename(self): - self._autorename_value = None - self._autorename_present = False + return self._tag == 'path' - @property - def client_modified(self): + def is_in_progress(self): """ - The value to store as the ``client_modified`` timestamp. Dropbox - automatically records the time at which the file was written to the - Dropbox servers. It can also record an additional timestamp, provided by - Dropbox desktop clients, mobile clients, and API apps of when the file - was actually created or modified. + Check if the union tag is ``in_progress``. - :rtype: datetime.datetime + :rtype: bool """ - if self._client_modified_present: - return self._client_modified_value - else: - return None + return self._tag == 'in_progress' - @client_modified.setter - def client_modified(self, val): - if val is None: - del self.client_modified - return - val = self._client_modified_validator.validate(val) - self._client_modified_value = val - self._client_modified_present = True + def is_unsupported_extension(self): + """ + Check if the union tag is ``unsupported_extension``. - @client_modified.deleter - def client_modified(self): - self._client_modified_value = None - self._client_modified_present = False + :rtype: bool + """ + return self._tag == 'unsupported_extension' - @property - def mute(self): + def is_unsupported_content(self): """ - Normally, users are made aware of any file modifications in their - Dropbox account via notifications in the client software. If ``True``, - this tells the clients that this modification shouldn't result in a user - notification. + Check if the union tag is ``unsupported_content``. :rtype: bool """ - if self._mute_present: - return self._mute_value - else: - return False + return self._tag == 'unsupported_content' - @mute.setter - def mute(self, val): - val = self._mute_validator.validate(val) - self._mute_value = val - self._mute_present = True + def get_path(self): + """ + An error occurs when downloading metadata for the file. - @mute.deleter - def mute(self): - self._mute_value = None - self._mute_present = False + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value def __repr__(self): - return 'CommitInfo(path={!r}, mode={!r}, autorename={!r}, client_modified={!r}, mute={!r})'.format( - self._path_value, - self._mode_value, - self._autorename_value, - self._client_modified_value, - self._mute_value, - ) + return 'PreviewError(%r, %r)' % (self._tag, self._value) -class UploadSessionFinishArg(object): +class RelocationArg(object): """ - :ivar cursor: Contains the upload session ID and the offset. - :ivar commit: Contains the path and other optional modifiers for the commit. + :ivar from_path: Path in the user's Dropbox to be copied or moved. + :ivar to_path: Path in the user's Dropbox that is the destination. """ __slots__ = [ - '_cursor_value', - '_cursor_present', - '_commit_value', - '_commit_present', + '_from_path_value', + '_from_path_present', + '_to_path_value', + '_to_path_present', ] _has_required_fields = True def __init__(self, - cursor=None, - commit=None): - self._cursor_value = None - self._cursor_present = False - self._commit_value = None - self._commit_present = False - if cursor is not None: - self.cursor = cursor - if commit is not None: - self.commit = commit + from_path=None, + to_path=None): + self._from_path_value = None + self._from_path_present = False + self._to_path_value = None + self._to_path_present = False + if from_path is not None: + self.from_path = from_path + if to_path is not None: + self.to_path = to_path @property - def cursor(self): + def from_path(self): """ - Contains the upload session ID and the offset. + Path in the user's Dropbox to be copied or moved. - :rtype: UploadSessionCursor + :rtype: str """ - if self._cursor_present: - return self._cursor_value + if self._from_path_present: + return self._from_path_value else: - raise AttributeError("missing required field 'cursor'") + raise AttributeError("missing required field 'from_path'") - @cursor.setter - def cursor(self, val): - self._cursor_validator.validate_type_only(val) - self._cursor_value = val - self._cursor_present = True + @from_path.setter + def from_path(self, val): + val = self._from_path_validator.validate(val) + self._from_path_value = val + self._from_path_present = True - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False + @from_path.deleter + def from_path(self): + self._from_path_value = None + self._from_path_present = False @property - def commit(self): + def to_path(self): """ - Contains the path and other optional modifiers for the commit. + Path in the user's Dropbox that is the destination. - :rtype: CommitInfo + :rtype: str """ - if self._commit_present: - return self._commit_value + if self._to_path_present: + return self._to_path_value else: - raise AttributeError("missing required field 'commit'") + raise AttributeError("missing required field 'to_path'") - @commit.setter - def commit(self, val): - self._commit_validator.validate_type_only(val) - self._commit_value = val - self._commit_present = True + @to_path.setter + def to_path(self, val): + val = self._to_path_validator.validate(val) + self._to_path_value = val + self._to_path_present = True - @commit.deleter - def commit(self): - self._commit_value = None - self._commit_present = False + @to_path.deleter + def to_path(self): + self._to_path_value = None + self._to_path_present = False def __repr__(self): - return 'UploadSessionFinishArg(cursor={!r}, commit={!r})'.format( - self._cursor_value, - self._commit_value, + return 'RelocationArg(from_path={!r}, to_path={!r})'.format( + self._from_path_value, + self._to_path_value, ) -class SearchMode(object): +class RelocationError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar filename: Search file and folder names. - :ivar filename_and_content: Search file and folder names as well as file - contents. - :ivar deleted_filename: Search for deleted file and folder names. + :ivar cant_copy_shared_folder: Shared folders can't be copied. + :ivar cant_nest_shared_folder: Your move operation would result in nested + shared folders. This is not allowed. + :ivar cant_move_folder_into_itself: You cannot move a folder into itself. + :ivar too_many_files: The operation would involve more than 10,000 files and + folders. + :ivar other: An unspecified error. """ __slots__ = ['_tag', '_value'] - _catch_all = None + _catch_all = 'other' + # Attribute is overwritten below the class definition + cant_copy_shared_folder = None + # Attribute is overwritten below the class definition + cant_nest_shared_folder = None # Attribute is overwritten below the class definition - filename = None + cant_move_folder_into_itself = None # Attribute is overwritten below the class definition - filename_and_content = None + too_many_files = None # Attribute is overwritten below the class definition - deleted_filename = None + other = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -2880,94 +3259,167 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_filename(self): + @classmethod + def from_lookup(cls, val): """ - Check if the union tag is ``filename``. + Create an instance of this class set to the ``from_lookup`` tag with + value ``val``. + + :param LookupError val: + :rtype: RelocationError + """ + return cls('from_lookup', val) + + @classmethod + def from_write(cls, val): + """ + Create an instance of this class set to the ``from_write`` tag with + value ``val``. + + :param WriteError val: + :rtype: RelocationError + """ + return cls('from_write', val) + + @classmethod + def to(cls, val): + """ + Create an instance of this class set to the ``to`` tag with value + ``val``. + + :param WriteError val: + :rtype: RelocationError + """ + return cls('to', val) + + def is_from_lookup(self): + """ + Check if the union tag is ``from_lookup``. :rtype: bool """ - return self._tag == 'filename' + return self._tag == 'from_lookup' - def is_filename_and_content(self): + def is_from_write(self): """ - Check if the union tag is ``filename_and_content``. + Check if the union tag is ``from_write``. :rtype: bool """ - return self._tag == 'filename_and_content' + return self._tag == 'from_write' - def is_deleted_filename(self): + def is_to(self): """ - Check if the union tag is ``deleted_filename``. + Check if the union tag is ``to``. :rtype: bool """ - return self._tag == 'deleted_filename' + return self._tag == 'to' + + def is_cant_copy_shared_folder(self): + """ + Check if the union tag is ``cant_copy_shared_folder``. + + :rtype: bool + """ + return self._tag == 'cant_copy_shared_folder' + + def is_cant_nest_shared_folder(self): + """ + Check if the union tag is ``cant_nest_shared_folder``. + + :rtype: bool + """ + return self._tag == 'cant_nest_shared_folder' + + def is_cant_move_folder_into_itself(self): + """ + Check if the union tag is ``cant_move_folder_into_itself``. + + :rtype: bool + """ + return self._tag == 'cant_move_folder_into_itself' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_from_lookup(self): + """ + Only call this if :meth:`is_from_lookup` is true. + + :rtype: LookupError + """ + if not self.is_from_lookup(): + raise AttributeError("tag 'from_lookup' not set") + return self._value + + def get_from_write(self): + """ + Only call this if :meth:`is_from_write` is true. + + :rtype: WriteError + """ + if not self.is_from_write(): + raise AttributeError("tag 'from_write' not set") + return self._value + + def get_to(self): + """ + Only call this if :meth:`is_to` is true. + + :rtype: WriteError + """ + if not self.is_to(): + raise AttributeError("tag 'to' not set") + return self._value def __repr__(self): - return 'SearchMode(%r, %r)' % (self._tag, self._value) + return 'RelocationError(%r, %r)' % (self._tag, self._value) -class SearchArg(object): +class RestoreArg(object): """ - :ivar path: The path in the user's Dropbox to search. Should probably be a - folder. - :ivar query: The string to search for. The search string is split on spaces - into multiple tokens. For file name searching, the last token is used - for prefix matching (i.e. "bat c" matches "bat cave" but not "batman - car"). - :ivar start: The starting index within the search results (used for paging). - :ivar max_results: The maximum number of search results to return. - :ivar mode: The search mode (filename, filename_and_content, or - deleted_filename). Note that searching file content is only available - for Dropbox Business accounts. + :ivar path: The path to the file you want to restore. + :ivar rev: The revision to restore for the file. """ __slots__ = [ '_path_value', '_path_present', - '_query_value', - '_query_present', - '_start_value', - '_start_present', - '_max_results_value', - '_max_results_present', - '_mode_value', - '_mode_present', + '_rev_value', + '_rev_present', ] _has_required_fields = True def __init__(self, path=None, - query=None, - start=None, - max_results=None, - mode=None): + rev=None): self._path_value = None self._path_present = False - self._query_value = None - self._query_present = False - self._start_value = None - self._start_present = False - self._max_results_value = None - self._max_results_present = False - self._mode_value = None - self._mode_present = False + self._rev_value = None + self._rev_present = False if path is not None: self.path = path - if query is not None: - self.query = query - if start is not None: - self.start = start - if max_results is not None: - self.max_results = max_results - if mode is not None: - self.mode = mode + if rev is not None: + self.rev = rev @property def path(self): """ - The path in the user's Dropbox to search. Should probably be a folder. + The path to the file you want to restore. :rtype: str """ @@ -2988,133 +3440,55 @@ def path(self): self._path_present = False @property - def query(self): + def rev(self): """ - The string to search for. The search string is split on spaces into - multiple tokens. For file name searching, the last token is used for - prefix matching (i.e. "bat c" matches "bat cave" but not "batman car"). + The revision to restore for the file. :rtype: str """ - if self._query_present: - return self._query_value - else: - raise AttributeError("missing required field 'query'") - - @query.setter - def query(self, val): - val = self._query_validator.validate(val) - self._query_value = val - self._query_present = True - - @query.deleter - def query(self): - self._query_value = None - self._query_present = False - - @property - def start(self): - """ - The starting index within the search results (used for paging). - - :rtype: long - """ - if self._start_present: - return self._start_value - else: - return 0 - - @start.setter - def start(self, val): - val = self._start_validator.validate(val) - self._start_value = val - self._start_present = True - - @start.deleter - def start(self): - self._start_value = None - self._start_present = False - - @property - def max_results(self): - """ - The maximum number of search results to return. - - :rtype: long - """ - if self._max_results_present: - return self._max_results_value - else: - return 100 - - @max_results.setter - def max_results(self, val): - val = self._max_results_validator.validate(val) - self._max_results_value = val - self._max_results_present = True - - @max_results.deleter - def max_results(self): - self._max_results_value = None - self._max_results_present = False - - @property - def mode(self): - """ - The search mode (filename, filename_and_content, or deleted_filename). - Note that searching file content is only available for Dropbox Business - accounts. - - :rtype: SearchMode - """ - if self._mode_present: - return self._mode_value + if self._rev_present: + return self._rev_value else: - return SearchMode.filename + raise AttributeError("missing required field 'rev'") - @mode.setter - def mode(self, val): - self._mode_validator.validate_type_only(val) - self._mode_value = val - self._mode_present = True + @rev.setter + def rev(self, val): + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True - @mode.deleter - def mode(self): - self._mode_value = None - self._mode_present = False + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False def __repr__(self): - return 'SearchArg(path={!r}, query={!r}, start={!r}, max_results={!r}, mode={!r})'.format( + return 'RestoreArg(path={!r}, rev={!r})'.format( self._path_value, - self._query_value, - self._start_value, - self._max_results_value, - self._mode_value, + self._rev_value, ) -class SearchMatchType(object): +class RestoreError(object): """ - Indicates what type of match was found for a given item. - This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar filename: This item was matched on its file or folder name. - :ivar content: This item was matched based on its file contents. - :ivar both: This item was matched based on both its contents and its file - name. + :ivar LookupError path_lookup: An error occurs when downloading metadata for + the file. + :ivar WriteError path_write: An error occurs when trying to restore the file + to that path. + :ivar invalid_revision: The revision is invalid. It may point to a different + file. """ __slots__ = ['_tag', '_value'] - _catch_all = None - # Attribute is overwritten below the class definition - filename = None + _catch_all = 'other' # Attribute is overwritten below the class definition - content = None + invalid_revision = None # Attribute is overwritten below the class definition - both = None + other = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -3128,208 +3502,203 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_filename(self): + @classmethod + def path_lookup(cls, val): """ - Check if the union tag is ``filename``. + Create an instance of this class set to the ``path_lookup`` tag with + value ``val``. - :rtype: bool + :param LookupError val: + :rtype: RestoreError """ - return self._tag == 'filename' + return cls('path_lookup', val) - def is_content(self): + @classmethod + def path_write(cls, val): """ - Check if the union tag is ``content``. + Create an instance of this class set to the ``path_write`` tag with + value ``val``. - :rtype: bool + :param WriteError val: + :rtype: RestoreError """ - return self._tag == 'content' + return cls('path_write', val) - def is_both(self): + def is_path_lookup(self): """ - Check if the union tag is ``both``. + Check if the union tag is ``path_lookup``. :rtype: bool """ - return self._tag == 'both' - - def __repr__(self): - return 'SearchMatchType(%r, %r)' % (self._tag, self._value) + return self._tag == 'path_lookup' -class SearchMatch(object): - """ - :ivar match_type: The type of the match. - :ivar metadata: The metadata for the matched file or folder. - """ + def is_path_write(self): + """ + Check if the union tag is ``path_write``. - __slots__ = [ - '_match_type_value', - '_match_type_present', - '_metadata_value', - '_metadata_present', - ] + :rtype: bool + """ + return self._tag == 'path_write' - _has_required_fields = True + def is_invalid_revision(self): + """ + Check if the union tag is ``invalid_revision``. - def __init__(self, - match_type=None, - metadata=None): - self._match_type_value = None - self._match_type_present = False - self._metadata_value = None - self._metadata_present = False - if match_type is not None: - self.match_type = match_type - if metadata is not None: - self.metadata = metadata + :rtype: bool + """ + return self._tag == 'invalid_revision' - @property - def match_type(self): + def is_other(self): """ - The type of the match. + Check if the union tag is ``other``. - :rtype: SearchMatchType + :rtype: bool """ - if self._match_type_present: - return self._match_type_value - else: - raise AttributeError("missing required field 'match_type'") + return self._tag == 'other' - @match_type.setter - def match_type(self, val): - self._match_type_validator.validate_type_only(val) - self._match_type_value = val - self._match_type_present = True + def get_path_lookup(self): + """ + An error occurs when downloading metadata for the file. - @match_type.deleter - def match_type(self): - self._match_type_value = None - self._match_type_present = False + Only call this if :meth:`is_path_lookup` is true. - @property - def metadata(self): + :rtype: LookupError """ - The metadata for the matched file or folder. + if not self.is_path_lookup(): + raise AttributeError("tag 'path_lookup' not set") + return self._value - :rtype: Metadata + def get_path_write(self): """ - if self._metadata_present: - return self._metadata_value - else: - raise AttributeError("missing required field 'metadata'") + An error occurs when trying to restore the file to that path. - @metadata.setter - def metadata(self, val): - self._metadata_validator.validate_type_only(val) - self._metadata_value = val - self._metadata_present = True + Only call this if :meth:`is_path_write` is true. - @metadata.deleter - def metadata(self): - self._metadata_value = None - self._metadata_present = False + :rtype: WriteError + """ + if not self.is_path_write(): + raise AttributeError("tag 'path_write' not set") + return self._value def __repr__(self): - return 'SearchMatch(match_type={!r}, metadata={!r})'.format( - self._match_type_value, - self._metadata_value, - ) + return 'RestoreError(%r, %r)' % (self._tag, self._value) -class SearchResult(object): +class SearchArg(object): """ - :ivar matches: A list (possibly empty) of matches for the query. - :ivar more: Used for paging. If true, indicates there is another page of - results available that can be fetched by calling search again. - :ivar start: Used for paging. Value to set the start argument to when - calling search to fetch the next page of results. + :ivar path: The path in the user's Dropbox to search. Should probably be a + folder. + :ivar query: The string to search for. The search string is split on spaces + into multiple tokens. For file name searching, the last token is used + for prefix matching (i.e. "bat c" matches "bat cave" but not "batman + car"). + :ivar start: The starting index within the search results (used for paging). + :ivar max_results: The maximum number of search results to return. + :ivar mode: The search mode (filename, filename_and_content, or + deleted_filename). Note that searching file content is only available + for Dropbox Business accounts. """ __slots__ = [ - '_matches_value', - '_matches_present', - '_more_value', - '_more_present', + '_path_value', + '_path_present', + '_query_value', + '_query_present', '_start_value', '_start_present', + '_max_results_value', + '_max_results_present', + '_mode_value', + '_mode_present', ] _has_required_fields = True def __init__(self, - matches=None, - more=None, - start=None): - self._matches_value = None - self._matches_present = False - self._more_value = None - self._more_present = False + path=None, + query=None, + start=None, + max_results=None, + mode=None): + self._path_value = None + self._path_present = False + self._query_value = None + self._query_present = False self._start_value = None self._start_present = False - if matches is not None: - self.matches = matches - if more is not None: - self.more = more + self._max_results_value = None + self._max_results_present = False + self._mode_value = None + self._mode_present = False + if path is not None: + self.path = path + if query is not None: + self.query = query if start is not None: self.start = start + if max_results is not None: + self.max_results = max_results + if mode is not None: + self.mode = mode @property - def matches(self): + def path(self): """ - A list (possibly empty) of matches for the query. + The path in the user's Dropbox to search. Should probably be a folder. - :rtype: list of [SearchMatch] + :rtype: str """ - if self._matches_present: - return self._matches_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'matches'") + raise AttributeError("missing required field 'path'") - @matches.setter - def matches(self, val): - val = self._matches_validator.validate(val) - self._matches_value = val - self._matches_present = True + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @matches.deleter - def matches(self): - self._matches_value = None - self._matches_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False @property - def more(self): + def query(self): """ - Used for paging. If true, indicates there is another page of results - available that can be fetched by calling search again. + The string to search for. The search string is split on spaces into + multiple tokens. For file name searching, the last token is used for + prefix matching (i.e. "bat c" matches "bat cave" but not "batman car"). - :rtype: bool + :rtype: str """ - if self._more_present: - return self._more_value + if self._query_present: + return self._query_value else: - raise AttributeError("missing required field 'more'") + raise AttributeError("missing required field 'query'") - @more.setter - def more(self, val): - val = self._more_validator.validate(val) - self._more_value = val - self._more_present = True + @query.setter + def query(self, val): + val = self._query_validator.validate(val) + self._query_value = val + self._query_present = True - @more.deleter - def more(self): - self._more_value = None - self._more_present = False + @query.deleter + def query(self): + self._query_value = None + self._query_present = False @property def start(self): """ - Used for paging. Value to set the start argument to when calling search - to fetch the next page of results. + The starting index within the search results (used for paging). :rtype: long """ if self._start_present: return self._start_value else: - raise AttributeError("missing required field 'start'") + return 0 @start.setter def start(self, val): @@ -3342,11 +3711,61 @@ def start(self): self._start_value = None self._start_present = False + @property + def max_results(self): + """ + The maximum number of search results to return. + + :rtype: long + """ + if self._max_results_present: + return self._max_results_value + else: + return 100 + + @max_results.setter + def max_results(self, val): + val = self._max_results_validator.validate(val) + self._max_results_value = val + self._max_results_present = True + + @max_results.deleter + def max_results(self): + self._max_results_value = None + self._max_results_present = False + + @property + def mode(self): + """ + The search mode (filename, filename_and_content, or deleted_filename). + Note that searching file content is only available for Dropbox Business + accounts. + + :rtype: SearchMode + """ + if self._mode_present: + return self._mode_value + else: + return SearchMode.filename + + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True + + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False + def __repr__(self): - return 'SearchResult(matches={!r}, more={!r}, start={!r})'.format( - self._matches_value, - self._more_value, + return 'SearchArg(path={!r}, query={!r}, start={!r}, max_results={!r}, mode={!r})'.format( + self._path_value, + self._query_value, self._start_value, + self._max_results_value, + self._mode_value, ) class SearchError(object): @@ -3416,147 +3835,108 @@ def get_path(self): def __repr__(self): return 'SearchError(%r, %r)' % (self._tag, self._value) -class LookupError(object): +class SearchMatch(object): """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar not_found: There is nothing at the given path. - :ivar not_file: We were expecting a file, but the given path refers to - something that isn't a file. - :ivar not_folder: We were expecting a folder, but the given path refers to - something that isn't a folder. - :ivar restricted_content: The file cannot be transferred because the content - is restricted. For example, sometimes there are legal restrictions due - to copyright claims. + :ivar match_type: The type of the match. + :ivar metadata: The metadata for the matched file or folder. """ - __slots__ = ['_tag', '_value'] - - _catch_all = 'other' - # Attribute is overwritten below the class definition - not_found = None - # Attribute is overwritten below the class definition - not_file = None - # Attribute is overwritten below the class definition - not_folder = None - # Attribute is overwritten below the class definition - restricted_content = None - # Attribute is overwritten below the class definition - other = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def malformed_path(cls, val): - """ - Create an instance of this class set to the ``malformed_path`` tag with - value ``val``. - - :param str val: - :rtype: LookupError - """ - return cls('malformed_path', val) - - def is_malformed_path(self): - """ - Check if the union tag is ``malformed_path``. - - :rtype: bool - """ - return self._tag == 'malformed_path' - - def is_not_found(self): - """ - Check if the union tag is ``not_found``. - - :rtype: bool - """ - return self._tag == 'not_found' + __slots__ = [ + '_match_type_value', + '_match_type_present', + '_metadata_value', + '_metadata_present', + ] - def is_not_file(self): - """ - Check if the union tag is ``not_file``. + _has_required_fields = True - :rtype: bool - """ - return self._tag == 'not_file' + def __init__(self, + match_type=None, + metadata=None): + self._match_type_value = None + self._match_type_present = False + self._metadata_value = None + self._metadata_present = False + if match_type is not None: + self.match_type = match_type + if metadata is not None: + self.metadata = metadata - def is_not_folder(self): + @property + def match_type(self): """ - Check if the union tag is ``not_folder``. + The type of the match. - :rtype: bool + :rtype: SearchMatchType """ - return self._tag == 'not_folder' + if self._match_type_present: + return self._match_type_value + else: + raise AttributeError("missing required field 'match_type'") - def is_restricted_content(self): - """ - Check if the union tag is ``restricted_content``. + @match_type.setter + def match_type(self, val): + self._match_type_validator.validate_type_only(val) + self._match_type_value = val + self._match_type_present = True - :rtype: bool - """ - return self._tag == 'restricted_content' + @match_type.deleter + def match_type(self): + self._match_type_value = None + self._match_type_present = False - def is_other(self): + @property + def metadata(self): """ - Check if the union tag is ``other``. + The metadata for the matched file or folder. - :rtype: bool + :rtype: Metadata """ - return self._tag == 'other' + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") - def get_malformed_path(self): - """ - Only call this if :meth:`is_malformed_path` is true. + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True - :rtype: str - """ - if not self.is_malformed_path(): - raise AttributeError("tag 'malformed_path' not set") - return self._value + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False def __repr__(self): - return 'LookupError(%r, %r)' % (self._tag, self._value) + return 'SearchMatch(match_type={!r}, metadata={!r})'.format( + self._match_type_value, + self._metadata_value, + ) -class WriteError(object): +class SearchMatchType(object): """ + Indicates what type of match was found for a given item. + This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar WriteConflictError conflict: Couldn't write to the target path because - there was something in the way. - :ivar no_write_permission: The user doesn't have permissions to write to the - target location. - :ivar insufficient_space: The user doesn't have enough available space - (bytes) to write more data. - :ivar disallowed_name: Dropbox will not save the file or folder because it - of its name. + :ivar filename: This item was matched on its file or folder name. + :ivar content: This item was matched based on its file contents. + :ivar both: This item was matched based on both its contents and its file + name. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' - # Attribute is overwritten below the class definition - no_write_permission = None + _catch_all = None # Attribute is overwritten below the class definition - insufficient_space = None + filename = None # Attribute is overwritten below the class definition - disallowed_name = None + content = None # Attribute is overwritten below the class definition - other = None + both = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -3570,125 +3950,54 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def malformed_path(cls, val): - """ - Create an instance of this class set to the ``malformed_path`` tag with - value ``val``. - - :param str val: - :rtype: WriteError - """ - return cls('malformed_path', val) - - @classmethod - def conflict(cls, val): - """ - Create an instance of this class set to the ``conflict`` tag with value - ``val``. - - :param WriteConflictError val: - :rtype: WriteError - """ - return cls('conflict', val) - - def is_malformed_path(self): - """ - Check if the union tag is ``malformed_path``. - - :rtype: bool - """ - return self._tag == 'malformed_path' - - def is_conflict(self): - """ - Check if the union tag is ``conflict``. - - :rtype: bool - """ - return self._tag == 'conflict' - - def is_no_write_permission(self): - """ - Check if the union tag is ``no_write_permission``. - - :rtype: bool - """ - return self._tag == 'no_write_permission' - - def is_insufficient_space(self): + def is_filename(self): """ - Check if the union tag is ``insufficient_space``. + Check if the union tag is ``filename``. :rtype: bool """ - return self._tag == 'insufficient_space' + return self._tag == 'filename' - def is_disallowed_name(self): + def is_content(self): """ - Check if the union tag is ``disallowed_name``. + Check if the union tag is ``content``. :rtype: bool """ - return self._tag == 'disallowed_name' + return self._tag == 'content' - def is_other(self): + def is_both(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``both``. :rtype: bool """ - return self._tag == 'other' - - def get_malformed_path(self): - """ - Only call this if :meth:`is_malformed_path` is true. - - :rtype: str - """ - if not self.is_malformed_path(): - raise AttributeError("tag 'malformed_path' not set") - return self._value - - def get_conflict(self): - """ - Couldn't write to the target path because there was something in the - way. - - Only call this if :meth:`is_conflict` is true. - - :rtype: WriteConflictError - """ - if not self.is_conflict(): - raise AttributeError("tag 'conflict' not set") - return self._value + return self._tag == 'both' def __repr__(self): - return 'WriteError(%r, %r)' % (self._tag, self._value) + return 'SearchMatchType(%r, %r)' % (self._tag, self._value) -class WriteConflictError(object): +class SearchMode(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar file: There's a file in the way. - :ivar folder: There's a folder in the way. - :ivar file_ancestor: There's a file at an ancestor path, so we couldn't - create the required parent folders. + :ivar filename: Search file and folder names. + :ivar filename_and_content: Search file and folder names as well as file + contents. + :ivar deleted_filename: Search for deleted file and folder names. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' - # Attribute is overwritten below the class definition - file = None + _catch_all = None # Attribute is overwritten below the class definition - folder = None + filename = None # Attribute is overwritten below the class definition - file_ancestor = None + filename_and_content = None # Attribute is overwritten below the class definition - other = None + deleted_filename = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -3702,166 +4011,189 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_file(self): - """ - Check if the union tag is ``file``. - - :rtype: bool - """ - return self._tag == 'file' - - def is_folder(self): + def is_filename(self): """ - Check if the union tag is ``folder``. + Check if the union tag is ``filename``. :rtype: bool """ - return self._tag == 'folder' + return self._tag == 'filename' - def is_file_ancestor(self): + def is_filename_and_content(self): """ - Check if the union tag is ``file_ancestor``. + Check if the union tag is ``filename_and_content``. :rtype: bool """ - return self._tag == 'file_ancestor' + return self._tag == 'filename_and_content' - def is_other(self): + def is_deleted_filename(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``deleted_filename``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'deleted_filename' def __repr__(self): - return 'WriteConflictError(%r, %r)' % (self._tag, self._value) + return 'SearchMode(%r, %r)' % (self._tag, self._value) -class CreateFolderArg(object): +class SearchResult(object): """ - :ivar path: Path in the user's Dropbox to create. + :ivar matches: A list (possibly empty) of matches for the query. + :ivar more: Used for paging. If true, indicates there is another page of + results available that can be fetched by calling search again. + :ivar start: Used for paging. Value to set the start argument to when + calling search to fetch the next page of results. """ __slots__ = [ - '_path_value', - '_path_present', + '_matches_value', + '_matches_present', + '_more_value', + '_more_present', + '_start_value', + '_start_present', ] _has_required_fields = True def __init__(self, - path=None): - self._path_value = None - self._path_present = False - if path is not None: - self.path = path + matches=None, + more=None, + start=None): + self._matches_value = None + self._matches_present = False + self._more_value = None + self._more_present = False + self._start_value = None + self._start_present = False + if matches is not None: + self.matches = matches + if more is not None: + self.more = more + if start is not None: + self.start = start @property - def path(self): + def matches(self): """ - Path in the user's Dropbox to create. + A list (possibly empty) of matches for the query. - :rtype: str + :rtype: list of [SearchMatch] """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") - - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True - - @path.deleter - def path(self): - self._path_value = None - self._path_present = False - - def __repr__(self): - return 'CreateFolderArg(path={!r})'.format( - self._path_value, - ) - -class CreateFolderError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) + if self._matches_present: + return self._matches_value else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def path(cls, val): - """ - Create an instance of this class set to the ``path`` tag with value - ``val``. + raise AttributeError("missing required field 'matches'") - :param WriteError val: - :rtype: CreateFolderError - """ - return cls('path', val) + @matches.setter + def matches(self, val): + val = self._matches_validator.validate(val) + self._matches_value = val + self._matches_present = True - def is_path(self): + @matches.deleter + def matches(self): + self._matches_value = None + self._matches_present = False + + @property + def more(self): """ - Check if the union tag is ``path``. + Used for paging. If true, indicates there is another page of results + available that can be fetched by calling search again. :rtype: bool """ - return self._tag == 'path' + if self._more_present: + return self._more_value + else: + raise AttributeError("missing required field 'more'") - def get_path(self): + @more.setter + def more(self, val): + val = self._more_validator.validate(val) + self._more_value = val + self._more_present = True + + @more.deleter + def more(self): + self._more_value = None + self._more_present = False + + @property + def start(self): """ - Only call this if :meth:`is_path` is true. + Used for paging. Value to set the start argument to when calling search + to fetch the next page of results. - :rtype: WriteError + :rtype: long """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value + if self._start_present: + return self._start_value + else: + raise AttributeError("missing required field 'start'") + + @start.setter + def start(self, val): + val = self._start_validator.validate(val) + self._start_value = val + self._start_present = True + + @start.deleter + def start(self): + self._start_value = None + self._start_present = False def __repr__(self): - return 'CreateFolderError(%r, %r)' % (self._tag, self._value) + return 'SearchResult(matches={!r}, more={!r}, start={!r})'.format( + self._matches_value, + self._more_value, + self._start_value, + ) -class DeleteArg(object): +class ThumbnailArg(object): """ - :ivar path: Path in the user's Dropbox to delete. + :ivar path: The path to the image file you want to thumbnail. + :ivar format: The format for the thumbnail image, jpeg (default) or png. For + images that are photos, jpeg should be preferred, while png is better + for screenshots and digital arts. + :ivar size: The size for the thumbnail image. """ __slots__ = [ '_path_value', '_path_present', + '_format_value', + '_format_present', + '_size_value', + '_size_present', ] _has_required_fields = True def __init__(self, - path=None): + path=None, + format=None, + size=None): self._path_value = None self._path_present = False + self._format_value = None + self._format_present = False + self._size_value = None + self._size_present = False if path is not None: self.path = path + if format is not None: + self.format = format + if size is not None: + self.size = size @property def path(self): """ - Path in the user's Dropbox to delete. + The path to the image file you want to thumbnail. :rtype: str """ @@ -3881,23 +4213,84 @@ def path(self): self._path_value = None self._path_present = False + @property + def format(self): + """ + The format for the thumbnail image, jpeg (default) or png. For images + that are photos, jpeg should be preferred, while png is better for + screenshots and digital arts. + + :rtype: ThumbnailFormat + """ + if self._format_present: + return self._format_value + else: + return ThumbnailFormat.jpeg + + @format.setter + def format(self, val): + self._format_validator.validate_type_only(val) + self._format_value = val + self._format_present = True + + @format.deleter + def format(self): + self._format_value = None + self._format_present = False + + @property + def size(self): + """ + The size for the thumbnail image. + + :rtype: ThumbnailSize + """ + if self._size_present: + return self._size_value + else: + return ThumbnailSize.w64h64 + + @size.setter + def size(self, val): + self._size_validator.validate_type_only(val) + self._size_value = val + self._size_present = True + + @size.deleter + def size(self): + self._size_value = None + self._size_present = False + def __repr__(self): - return 'DeleteArg(path={!r})'.format( + return 'ThumbnailArg(path={!r}, format={!r}, size={!r})'.format( self._path_value, + self._format_value, + self._size_value, ) -class DeleteError(object): +class ThumbnailError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar LookupError path: An error occurs when downloading metadata for the + image. + :ivar unsupported_extension: The file extension doesn't allow conversion to + a thumbnail. + :ivar unsupported_image: The image cannot be converted to a thumbnail. + :ivar conversion_error: An error occurs during thumbnail conversion. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' + _catch_all = None # Attribute is overwritten below the class definition - other = None + unsupported_extension = None + # Attribute is overwritten below the class definition + unsupported_image = None + # Attribute is overwritten below the class definition + conversion_error = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -3912,178 +4305,135 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def path_lookup(cls, val): + def path(cls, val): """ - Create an instance of this class set to the ``path_lookup`` tag with - value ``val``. + Create an instance of this class set to the ``path`` tag with value + ``val``. :param LookupError val: - :rtype: DeleteError - """ - return cls('path_lookup', val) - - @classmethod - def path_write(cls, val): - """ - Create an instance of this class set to the ``path_write`` tag with - value ``val``. - - :param WriteError val: - :rtype: DeleteError + :rtype: ThumbnailError """ - return cls('path_write', val) + return cls('path', val) - def is_path_lookup(self): + def is_path(self): """ - Check if the union tag is ``path_lookup``. + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'path_lookup' + return self._tag == 'path' - def is_path_write(self): + def is_unsupported_extension(self): """ - Check if the union tag is ``path_write``. + Check if the union tag is ``unsupported_extension``. :rtype: bool """ - return self._tag == 'path_write' + return self._tag == 'unsupported_extension' - def is_other(self): + def is_unsupported_image(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``unsupported_image``. :rtype: bool """ - return self._tag == 'other' - - def get_path_lookup(self): - """ - Only call this if :meth:`is_path_lookup` is true. - - :rtype: LookupError - """ - if not self.is_path_lookup(): - raise AttributeError("tag 'path_lookup' not set") - return self._value + return self._tag == 'unsupported_image' - def get_path_write(self): + def is_conversion_error(self): """ - Only call this if :meth:`is_path_write` is true. + Check if the union tag is ``conversion_error``. - :rtype: WriteError + :rtype: bool """ - if not self.is_path_write(): - raise AttributeError("tag 'path_write' not set") - return self._value - - def __repr__(self): - return 'DeleteError(%r, %r)' % (self._tag, self._value) - -class RelocationArg(object): - """ - :ivar from_path: Path in the user's Dropbox to be copied or moved. - :ivar to_path: Path in the user's Dropbox that is the destination. - """ - - __slots__ = [ - '_from_path_value', - '_from_path_present', - '_to_path_value', - '_to_path_present', - ] - - _has_required_fields = True - - def __init__(self, - from_path=None, - to_path=None): - self._from_path_value = None - self._from_path_present = False - self._to_path_value = None - self._to_path_present = False - if from_path is not None: - self.from_path = from_path - if to_path is not None: - self.to_path = to_path - - @property - def from_path(self): + return self._tag == 'conversion_error' + + def get_path(self): """ - Path in the user's Dropbox to be copied or moved. + An error occurs when downloading metadata for the image. - :rtype: str + Only call this if :meth:`is_path` is true. + + :rtype: LookupError """ - if self._from_path_present: - return self._from_path_value - else: - raise AttributeError("missing required field 'from_path'") + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value - @from_path.setter - def from_path(self, val): - val = self._from_path_validator.validate(val) - self._from_path_value = val - self._from_path_present = True + def __repr__(self): + return 'ThumbnailError(%r, %r)' % (self._tag, self._value) - @from_path.deleter - def from_path(self): - self._from_path_value = None - self._from_path_present = False +class ThumbnailFormat(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ - @property - def to_path(self): + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + jpeg = None + # Attribute is overwritten below the class definition + png = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_jpeg(self): """ - Path in the user's Dropbox that is the destination. + Check if the union tag is ``jpeg``. - :rtype: str + :rtype: bool """ - if self._to_path_present: - return self._to_path_value - else: - raise AttributeError("missing required field 'to_path'") + return self._tag == 'jpeg' - @to_path.setter - def to_path(self, val): - val = self._to_path_validator.validate(val) - self._to_path_value = val - self._to_path_present = True + def is_png(self): + """ + Check if the union tag is ``png``. - @to_path.deleter - def to_path(self): - self._to_path_value = None - self._to_path_present = False + :rtype: bool + """ + return self._tag == 'png' def __repr__(self): - return 'RelocationArg(from_path={!r}, to_path={!r})'.format( - self._from_path_value, - self._to_path_value, - ) + return 'ThumbnailFormat(%r, %r)' % (self._tag, self._value) -class RelocationError(object): +class ThumbnailSize(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar cant_copy_shared_folder: Shared folders can't be copied. - :ivar cant_nest_shared_folder: Your move operation would result in nested - shared folders. This is not allowed. - :ivar too_many_files: The operation would involve more than 10,000 files and - folders. - :ivar other: An unspecified error. + :ivar w32h32: 32 by 32 px. + :ivar w64h64: 64 by 64 px. + :ivar w128h128: 128 by 128 px. + :ivar w640h480: 640 by 480 px. + :ivar w1024h768: 1024 by 768 """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' + _catch_all = None # Attribute is overwritten below the class definition - cant_copy_shared_folder = None + w32h32 = None # Attribute is overwritten below the class definition - cant_nest_shared_folder = None + w64h64 = None # Attribute is overwritten below the class definition - too_many_files = None + w128h128 = None # Attribute is overwritten below the class definition - other = None + w640h480 = None + # Attribute is overwritten below the class definition + w1024h768 = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -4097,224 +4447,299 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def from_lookup(cls, val): + def is_w32h32(self): """ - Create an instance of this class set to the ``from_lookup`` tag with - value ``val``. + Check if the union tag is ``w32h32``. - :param LookupError val: - :rtype: RelocationError + :rtype: bool """ - return cls('from_lookup', val) + return self._tag == 'w32h32' - @classmethod - def from_write(cls, val): + def is_w64h64(self): """ - Create an instance of this class set to the ``from_write`` tag with - value ``val``. + Check if the union tag is ``w64h64``. - :param WriteError val: - :rtype: RelocationError + :rtype: bool """ - return cls('from_write', val) + return self._tag == 'w64h64' - @classmethod - def to(cls, val): + def is_w128h128(self): """ - Create an instance of this class set to the ``to`` tag with value - ``val``. + Check if the union tag is ``w128h128``. - :param WriteError val: - :rtype: RelocationError + :rtype: bool """ - return cls('to', val) + return self._tag == 'w128h128' - def is_from_lookup(self): + def is_w640h480(self): """ - Check if the union tag is ``from_lookup``. + Check if the union tag is ``w640h480``. :rtype: bool """ - return self._tag == 'from_lookup' + return self._tag == 'w640h480' - def is_from_write(self): + def is_w1024h768(self): """ - Check if the union tag is ``from_write``. + Check if the union tag is ``w1024h768``. :rtype: bool """ - return self._tag == 'from_write' + return self._tag == 'w1024h768' - def is_to(self): + def __repr__(self): + return 'ThumbnailSize(%r, %r)' % (self._tag, self._value) + +class UploadError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UploadWriteFailed path: Unable to save the uploaded contents to a + file. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def path(cls, val): """ - Check if the union tag is ``to``. + Create an instance of this class set to the ``path`` tag with value + ``val``. - :rtype: bool + :param UploadWriteFailed val: + :rtype: UploadError """ - return self._tag == 'to' + return cls('path', val) - def is_cant_copy_shared_folder(self): + def is_path(self): """ - Check if the union tag is ``cant_copy_shared_folder``. + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'cant_copy_shared_folder' + return self._tag == 'path' - def is_cant_nest_shared_folder(self): + def is_other(self): """ - Check if the union tag is ``cant_nest_shared_folder``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'cant_nest_shared_folder' + return self._tag == 'other' - def is_too_many_files(self): + def get_path(self): """ - Check if the union tag is ``too_many_files``. + Unable to save the uploaded contents to a file. - :rtype: bool + Only call this if :meth:`is_path` is true. + + :rtype: UploadWriteFailed """ - return self._tag == 'too_many_files' + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value - def is_other(self): + def __repr__(self): + return 'UploadError(%r, %r)' % (self._tag, self._value) + +class UploadSessionCursor(object): + """ + :ivar session_id: The upload session ID (returned by upload_session/start). + :ivar offset: The amount of data that has been uploaded so far. We use this + to make sure upload data isn't lost or duplicated in the event of a + network error. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + '_offset_value', + '_offset_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + offset=None): + self._session_id_value = None + self._session_id_present = False + self._offset_value = None + self._offset_present = False + if session_id is not None: + self.session_id = session_id + if offset is not None: + self.offset = offset + + @property + def session_id(self): """ - Check if the union tag is ``other``. + The upload session ID (returned by upload_session/start). - :rtype: bool + :rtype: str """ - return self._tag == 'other' + if self._session_id_present: + return self._session_id_value + else: + raise AttributeError("missing required field 'session_id'") - def get_from_lookup(self): - """ - Only call this if :meth:`is_from_lookup` is true. + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True - :rtype: LookupError - """ - if not self.is_from_lookup(): - raise AttributeError("tag 'from_lookup' not set") - return self._value + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False - def get_from_write(self): + @property + def offset(self): """ - Only call this if :meth:`is_from_write` is true. + The amount of data that has been uploaded so far. We use this to make + sure upload data isn't lost or duplicated in the event of a network + error. - :rtype: WriteError + :rtype: long """ - if not self.is_from_write(): - raise AttributeError("tag 'from_write' not set") - return self._value + if self._offset_present: + return self._offset_value + else: + raise AttributeError("missing required field 'offset'") - def get_to(self): - """ - Only call this if :meth:`is_to` is true. + @offset.setter + def offset(self, val): + val = self._offset_validator.validate(val) + self._offset_value = val + self._offset_present = True - :rtype: WriteError - """ - if not self.is_to(): - raise AttributeError("tag 'to' not set") - return self._value + @offset.deleter + def offset(self): + self._offset_value = None + self._offset_present = False def __repr__(self): - return 'RelocationError(%r, %r)' % (self._tag, self._value) + return 'UploadSessionCursor(session_id={!r}, offset={!r})'.format( + self._session_id_value, + self._offset_value, + ) -class ThumbnailSize(object): +class UploadSessionFinishArg(object): """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar w32h32: 32 by 32 px. - :ivar w64h64: 64 by 64 px. - :ivar w128h128: 128 by 128 px. - :ivar w640h480: 640 by 480 px. - :ivar w1024h768: 1024 by 768 + :ivar cursor: Contains the upload session ID and the offset. + :ivar commit: Contains the path and other optional modifiers for the commit. """ - __slots__ = ['_tag', '_value'] - - _catch_all = None - # Attribute is overwritten below the class definition - w32h32 = None - # Attribute is overwritten below the class definition - w64h64 = None - # Attribute is overwritten below the class definition - w128h128 = None - # Attribute is overwritten below the class definition - w640h480 = None - # Attribute is overwritten below the class definition - w1024h768 = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_commit_value', + '_commit_present', + ] - def is_w32h32(self): - """ - Check if the union tag is ``w32h32``. + _has_required_fields = True - :rtype: bool - """ - return self._tag == 'w32h32' + def __init__(self, + cursor=None, + commit=None): + self._cursor_value = None + self._cursor_present = False + self._commit_value = None + self._commit_present = False + if cursor is not None: + self.cursor = cursor + if commit is not None: + self.commit = commit - def is_w64h64(self): + @property + def cursor(self): """ - Check if the union tag is ``w64h64``. + Contains the upload session ID and the offset. - :rtype: bool + :rtype: UploadSessionCursor """ - return self._tag == 'w64h64' + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") - def is_w128h128(self): - """ - Check if the union tag is ``w128h128``. + @cursor.setter + def cursor(self, val): + self._cursor_validator.validate_type_only(val) + self._cursor_value = val + self._cursor_present = True - :rtype: bool - """ - return self._tag == 'w128h128' + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False - def is_w640h480(self): + @property + def commit(self): """ - Check if the union tag is ``w640h480``. + Contains the path and other optional modifiers for the commit. - :rtype: bool + :rtype: CommitInfo """ - return self._tag == 'w640h480' + if self._commit_present: + return self._commit_value + else: + raise AttributeError("missing required field 'commit'") - def is_w1024h768(self): - """ - Check if the union tag is ``w1024h768``. + @commit.setter + def commit(self, val): + self._commit_validator.validate_type_only(val) + self._commit_value = val + self._commit_present = True - :rtype: bool - """ - return self._tag == 'w1024h768' + @commit.deleter + def commit(self): + self._commit_value = None + self._commit_present = False def __repr__(self): - return 'ThumbnailSize(%r, %r)' % (self._tag, self._value) + return 'UploadSessionFinishArg(cursor={!r}, commit={!r})'.format( + self._cursor_value, + self._commit_value, + ) -class ThumbnailFormat(object): +class UploadSessionFinishError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar UploadSessionLookupError lookup_failed: The session arguments are + incorrect; the value explains the reason. + :ivar WriteError path: Unable to save the uploaded contents to a file. + :ivar other: An unspecified error. """ __slots__ = ['_tag', '_value'] - _catch_all = None - # Attribute is overwritten below the class definition - jpeg = None + _catch_all = 'other' # Attribute is overwritten below the class definition - png = None + other = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -4328,163 +4753,104 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_jpeg(self): - """ - Check if the union tag is ``jpeg``. - - :rtype: bool - """ - return self._tag == 'jpeg' - - def is_png(self): - """ - Check if the union tag is ``png``. - - :rtype: bool + @classmethod + def lookup_failed(cls, val): """ - return self._tag == 'png' - - def __repr__(self): - return 'ThumbnailFormat(%r, %r)' % (self._tag, self._value) - -class ThumbnailArg(object): - """ - :ivar path: The path to the image file you want to thumbnail. - :ivar format: The format for the thumbnail image, jpeg (default) or png. For - images that are photos, jpeg should be preferred, while png is better - for screenshots and digital arts. - :ivar size: The size for the thumbnail image. - """ - - __slots__ = [ - '_path_value', - '_path_present', - '_format_value', - '_format_present', - '_size_value', - '_size_present', - ] - - _has_required_fields = True - - def __init__(self, - path=None, - format=None, - size=None): - self._path_value = None - self._path_present = False - self._format_value = None - self._format_present = False - self._size_value = None - self._size_present = False - if path is not None: - self.path = path - if format is not None: - self.format = format - if size is not None: - self.size = size + Create an instance of this class set to the ``lookup_failed`` tag with + value ``val``. - @property - def path(self): + :param UploadSessionLookupError val: + :rtype: UploadSessionFinishError """ - The path to the image file you want to thumbnail. + return cls('lookup_failed', val) - :rtype: str + @classmethod + def path(cls, val): """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") + Create an instance of this class set to the ``path`` tag with value + ``val``. - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True + :param WriteError val: + :rtype: UploadSessionFinishError + """ + return cls('path', val) - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + def is_lookup_failed(self): + """ + Check if the union tag is ``lookup_failed``. - @property - def format(self): + :rtype: bool """ - The format for the thumbnail image, jpeg (default) or png. For images - that are photos, jpeg should be preferred, while png is better for - screenshots and digital arts. + return self._tag == 'lookup_failed' - :rtype: ThumbnailFormat + def is_path(self): """ - if self._format_present: - return self._format_value - else: - return ThumbnailFormat.jpeg + Check if the union tag is ``path``. - @format.setter - def format(self, val): - self._format_validator.validate_type_only(val) - self._format_value = val - self._format_present = True + :rtype: bool + """ + return self._tag == 'path' - @format.deleter - def format(self): - self._format_value = None - self._format_present = False + def is_other(self): + """ + Check if the union tag is ``other``. - @property - def size(self): + :rtype: bool """ - The size for the thumbnail image. + return self._tag == 'other' - :rtype: ThumbnailSize + def get_lookup_failed(self): """ - if self._size_present: - return self._size_value - else: - return ThumbnailSize.w64h64 + The session arguments are incorrect; the value explains the reason. - @size.setter - def size(self, val): - self._size_validator.validate_type_only(val) - self._size_value = val - self._size_present = True + Only call this if :meth:`is_lookup_failed` is true. - @size.deleter - def size(self): - self._size_value = None - self._size_present = False + :rtype: UploadSessionLookupError + """ + if not self.is_lookup_failed(): + raise AttributeError("tag 'lookup_failed' not set") + return self._value + + def get_path(self): + """ + Unable to save the uploaded contents to a file. + + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value def __repr__(self): - return 'ThumbnailArg(path={!r}, format={!r}, size={!r})'.format( - self._path_value, - self._format_value, - self._size_value, - ) + return 'UploadSessionFinishError(%r, %r)' % (self._tag, self._value) -class ThumbnailError(object): +class UploadSessionLookupError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar LookupError path: An error occurs when downloading metadata for the - image. - :ivar unsupported_extension: The file extension doesn't allow conversion to - a thumbnail. - :ivar unsupported_image: The image cannot be converted to a thumbnail. - :ivar conversion_error: An error occurs during thumbnail conversion. + :ivar not_found: The upload session id was not found. + :ivar UploadSessionOffsetError incorrect_offset: The specified offset was + incorrect. See the value for the correct offset. (This error may occur + when a previous request was received and processed successfully but the + client did not receive the response, e.g. due to a network error.) + :ivar closed: You are attempting to append data to an upload session that + has alread been closed (i.e. committed). + :ivar other: An unspecified error. """ __slots__ = ['_tag', '_value'] - _catch_all = None + _catch_all = 'other' # Attribute is overwritten below the class definition - unsupported_extension = None + not_found = None # Attribute is overwritten below the class definition - unsupported_image = None + closed = None # Attribute is overwritten below the class definition - conversion_error = None + other = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -4499,331 +4865,325 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def path(cls, val): + def incorrect_offset(cls, val): """ - Create an instance of this class set to the ``path`` tag with value - ``val``. + Create an instance of this class set to the ``incorrect_offset`` tag + with value ``val``. - :param LookupError val: - :rtype: ThumbnailError + :param UploadSessionOffsetError val: + :rtype: UploadSessionLookupError """ - return cls('path', val) + return cls('incorrect_offset', val) - def is_path(self): + def is_not_found(self): """ - Check if the union tag is ``path``. + Check if the union tag is ``not_found``. :rtype: bool """ - return self._tag == 'path' + return self._tag == 'not_found' - def is_unsupported_extension(self): + def is_incorrect_offset(self): """ - Check if the union tag is ``unsupported_extension``. + Check if the union tag is ``incorrect_offset``. :rtype: bool """ - return self._tag == 'unsupported_extension' + return self._tag == 'incorrect_offset' - def is_unsupported_image(self): + def is_closed(self): """ - Check if the union tag is ``unsupported_image``. + Check if the union tag is ``closed``. :rtype: bool """ - return self._tag == 'unsupported_image' + return self._tag == 'closed' - def is_conversion_error(self): + def is_other(self): """ - Check if the union tag is ``conversion_error``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'conversion_error' + return self._tag == 'other' - def get_path(self): + def get_incorrect_offset(self): """ - An error occurs when downloading metadata for the image. + The specified offset was incorrect. See the value for the correct + offset. (This error may occur when a previous request was received and + processed successfully but the client did not receive the response, e.g. + due to a network error.) - Only call this if :meth:`is_path` is true. + Only call this if :meth:`is_incorrect_offset` is true. - :rtype: LookupError + :rtype: UploadSessionOffsetError """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") + if not self.is_incorrect_offset(): + raise AttributeError("tag 'incorrect_offset' not set") return self._value def __repr__(self): - return 'ThumbnailError(%r, %r)' % (self._tag, self._value) + return 'UploadSessionLookupError(%r, %r)' % (self._tag, self._value) -class PreviewArg(object): +class UploadSessionOffsetError(object): """ - :ivar path: The path of the file to preview. - :ivar rev: Deprecated. Please specify revision in :field:'path' instead + :ivar correct_offset: The offset up to which data has been collected. """ __slots__ = [ - '_path_value', - '_path_present', - '_rev_value', - '_rev_present', + '_correct_offset_value', + '_correct_offset_present', ] _has_required_fields = True def __init__(self, - path=None, - rev=None): - self._path_value = None - self._path_present = False - self._rev_value = None - self._rev_present = False - if path is not None: - self.path = path - if rev is not None: - self.rev = rev + correct_offset=None): + self._correct_offset_value = None + self._correct_offset_present = False + if correct_offset is not None: + self.correct_offset = correct_offset @property - def path(self): + def correct_offset(self): """ - The path of the file to preview. + The offset up to which data has been collected. - :rtype: str + :rtype: long """ - if self._path_present: - return self._path_value + if self._correct_offset_present: + return self._correct_offset_value else: - raise AttributeError("missing required field 'path'") + raise AttributeError("missing required field 'correct_offset'") - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True + @correct_offset.setter + def correct_offset(self, val): + val = self._correct_offset_validator.validate(val) + self._correct_offset_value = val + self._correct_offset_present = True - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + @correct_offset.deleter + def correct_offset(self): + self._correct_offset_value = None + self._correct_offset_present = False + + def __repr__(self): + return 'UploadSessionOffsetError(correct_offset={!r})'.format( + self._correct_offset_value, + ) + +class UploadSessionStartResult(object): + """ + :ivar session_id: A unique identifier for the upload session. Pass this to + upload_session/append and upload_session/finish. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None): + self._session_id_value = None + self._session_id_present = False + if session_id is not None: + self.session_id = session_id @property - def rev(self): + def session_id(self): """ - Deprecated. Please specify revision in :field:'path' instead + A unique identifier for the upload session. Pass this to + upload_session/append and upload_session/finish. :rtype: str """ - if self._rev_present: - return self._rev_value + if self._session_id_present: + return self._session_id_value else: - return None + raise AttributeError("missing required field 'session_id'") - @rev.setter - def rev(self, val): - if val is None: - del self.rev - return - val = self._rev_validator.validate(val) - self._rev_value = val - self._rev_present = True + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True - @rev.deleter - def rev(self): - self._rev_value = None - self._rev_present = False + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False def __repr__(self): - return 'PreviewArg(path={!r}, rev={!r})'.format( - self._path_value, - self._rev_value, + return 'UploadSessionStartResult(session_id={!r})'.format( + self._session_id_value, ) -class PreviewError(object): +class UploadWriteFailed(object): """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar LookupError path: An error occurs when downloading metadata for the - file. - :ivar in_progress: This preview generation is still in progress and the file - is not ready for preview yet. - :ivar unsupported_extension: The file extension is not supported preview - generation. - :ivar unsupported_content: The file content is not supported for preview - generation. + :ivar reason: The reason why the file couldn't be saved. + :ivar upload_session_id: The upload session ID; this may be used to retry + the commit. """ - __slots__ = ['_tag', '_value'] - - _catch_all = None - # Attribute is overwritten below the class definition - in_progress = None - # Attribute is overwritten below the class definition - unsupported_extension = None - # Attribute is overwritten below the class definition - unsupported_content = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def path(cls, val): - """ - Create an instance of this class set to the ``path`` tag with value - ``val``. - - :param LookupError val: - :rtype: PreviewError - """ - return cls('path', val) - - def is_path(self): - """ - Check if the union tag is ``path``. + __slots__ = [ + '_reason_value', + '_reason_present', + '_upload_session_id_value', + '_upload_session_id_present', + ] - :rtype: bool - """ - return self._tag == 'path' + _has_required_fields = True - def is_in_progress(self): - """ - Check if the union tag is ``in_progress``. + def __init__(self, + reason=None, + upload_session_id=None): + self._reason_value = None + self._reason_present = False + self._upload_session_id_value = None + self._upload_session_id_present = False + if reason is not None: + self.reason = reason + if upload_session_id is not None: + self.upload_session_id = upload_session_id - :rtype: bool + @property + def reason(self): """ - return self._tag == 'in_progress' + The reason why the file couldn't be saved. - def is_unsupported_extension(self): + :rtype: WriteError """ - Check if the union tag is ``unsupported_extension``. + if self._reason_present: + return self._reason_value + else: + raise AttributeError("missing required field 'reason'") - :rtype: bool - """ - return self._tag == 'unsupported_extension' + @reason.setter + def reason(self, val): + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True - def is_unsupported_content(self): - """ - Check if the union tag is ``unsupported_content``. + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False - :rtype: bool + @property + def upload_session_id(self): """ - return self._tag == 'unsupported_content' + The upload session ID; this may be used to retry the commit. - def get_path(self): + :rtype: str """ - An error occurs when downloading metadata for the file. + if self._upload_session_id_present: + return self._upload_session_id_value + else: + raise AttributeError("missing required field 'upload_session_id'") - Only call this if :meth:`is_path` is true. + @upload_session_id.setter + def upload_session_id(self, val): + val = self._upload_session_id_validator.validate(val) + self._upload_session_id_value = val + self._upload_session_id_present = True - :rtype: LookupError - """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value + @upload_session_id.deleter + def upload_session_id(self): + self._upload_session_id_value = None + self._upload_session_id_present = False def __repr__(self): - return 'PreviewError(%r, %r)' % (self._tag, self._value) + return 'UploadWriteFailed(reason={!r}, upload_session_id={!r})'.format( + self._reason_value, + self._upload_session_id_value, + ) -class ListRevisionsArg(object): +class VideoMetadata(MediaMetadata): """ - :ivar path: The path to the file you want to see the revisions of. - :ivar limit: The maximum number of revision entries returned. + Metadata for a video. + + :ivar duration: The duration of the video in milliseconds. """ __slots__ = [ - '_path_value', - '_path_present', - '_limit_value', - '_limit_present', + '_duration_value', + '_duration_present', ] - _has_required_fields = True + _has_required_fields = False def __init__(self, - path=None, - limit=None): - self._path_value = None - self._path_present = False - self._limit_value = None - self._limit_present = False - if path is not None: - self.path = path - if limit is not None: - self.limit = limit - - @property - def path(self): - """ - The path to the file you want to see the revisions of. - - :rtype: str - """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") - - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True - - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + dimensions=None, + location=None, + time_taken=None, + duration=None): + super(VideoMetadata, self).__init__(dimensions, + location, + time_taken) + self._duration_value = None + self._duration_present = False + if duration is not None: + self.duration = duration @property - def limit(self): + def duration(self): """ - The maximum number of revision entries returned. + The duration of the video in milliseconds. :rtype: long """ - if self._limit_present: - return self._limit_value + if self._duration_present: + return self._duration_value else: - return 10 + return None - @limit.setter - def limit(self, val): - val = self._limit_validator.validate(val) - self._limit_value = val - self._limit_present = True + @duration.setter + def duration(self, val): + if val is None: + del self.duration + return + val = self._duration_validator.validate(val) + self._duration_value = val + self._duration_present = True - @limit.deleter - def limit(self): - self._limit_value = None - self._limit_present = False + @duration.deleter + def duration(self): + self._duration_value = None + self._duration_present = False def __repr__(self): - return 'ListRevisionsArg(path={!r}, limit={!r})'.format( - self._path_value, - self._limit_value, + return 'VideoMetadata(dimensions={!r}, location={!r}, time_taken={!r}, duration={!r})'.format( + self._dimensions_value, + self._location_value, + self._time_taken_value, + self._duration_value, ) -class ListRevisionsError(object): +class WriteConflictError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar file: There's a file in the way. + :ivar folder: There's a folder in the way. + :ivar file_ancestor: There's a file at an ancestor path, so we couldn't + create the required parent folders. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + file = None + # Attribute is overwritten below the class definition + folder = None + # Attribute is overwritten below the class definition + file_ancestor = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -4838,226 +5198,211 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def path(cls, val): + def is_file(self): """ - Create an instance of this class set to the ``path`` tag with value - ``val``. + Check if the union tag is ``file``. - :param LookupError val: - :rtype: ListRevisionsError + :rtype: bool """ - return cls('path', val) + return self._tag == 'file' - def is_path(self): + def is_folder(self): """ - Check if the union tag is ``path``. + Check if the union tag is ``folder``. :rtype: bool """ - return self._tag == 'path' + return self._tag == 'folder' - def is_other(self): + def is_file_ancestor(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``file_ancestor``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'file_ancestor' - def get_path(self): + def is_other(self): """ - Only call this if :meth:`is_path` is true. + Check if the union tag is ``other``. - :rtype: LookupError + :rtype: bool """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value + return self._tag == 'other' def __repr__(self): - return 'ListRevisionsError(%r, %r)' % (self._tag, self._value) + return 'WriteConflictError(%r, %r)' % (self._tag, self._value) -class ListRevisionsResult(object): +class WriteError(object): """ - :ivar is_deleted: If the file is deleted. - :ivar entries: The revisions for the file. Only non-delete revisions will - show up here. + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar WriteConflictError conflict: Couldn't write to the target path because + there was something in the way. + :ivar no_write_permission: The user doesn't have permissions to write to the + target location. + :ivar insufficient_space: The user doesn't have enough available space + (bytes) to write more data. + :ivar disallowed_name: Dropbox will not save the file or folder because of + its name. """ - __slots__ = [ - '_is_deleted_value', - '_is_deleted_present', - '_entries_value', - '_entries_present', - ] + __slots__ = ['_tag', '_value'] - _has_required_fields = True + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_write_permission = None + # Attribute is overwritten below the class definition + insufficient_space = None + # Attribute is overwritten below the class definition + disallowed_name = None + # Attribute is overwritten below the class definition + other = None - def __init__(self, - is_deleted=None, - entries=None): - self._is_deleted_value = None - self._is_deleted_present = False - self._entries_value = None - self._entries_present = False - if is_deleted is not None: - self.is_deleted = is_deleted - if entries is not None: - self.entries = entries + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value - @property - def is_deleted(self): + @classmethod + def malformed_path(cls, val): """ - If the file is deleted. + Create an instance of this class set to the ``malformed_path`` tag with + value ``val``. - :rtype: bool + :param str val: + :rtype: WriteError """ - if self._is_deleted_present: - return self._is_deleted_value - else: - raise AttributeError("missing required field 'is_deleted'") - - @is_deleted.setter - def is_deleted(self, val): - val = self._is_deleted_validator.validate(val) - self._is_deleted_value = val - self._is_deleted_present = True + return cls('malformed_path', val) - @is_deleted.deleter - def is_deleted(self): - self._is_deleted_value = None - self._is_deleted_present = False + @classmethod + def conflict(cls, val): + """ + Create an instance of this class set to the ``conflict`` tag with value + ``val``. - @property - def entries(self): + :param WriteConflictError val: + :rtype: WriteError """ - The revisions for the file. Only non-delete revisions will show up here. + return cls('conflict', val) - :rtype: list of [FileMetadata] + def is_malformed_path(self): """ - if self._entries_present: - return self._entries_value - else: - raise AttributeError("missing required field 'entries'") + Check if the union tag is ``malformed_path``. - @entries.setter - def entries(self, val): - val = self._entries_validator.validate(val) - self._entries_value = val - self._entries_present = True + :rtype: bool + """ + return self._tag == 'malformed_path' - @entries.deleter - def entries(self): - self._entries_value = None - self._entries_present = False + def is_conflict(self): + """ + Check if the union tag is ``conflict``. - def __repr__(self): - return 'ListRevisionsResult(is_deleted={!r}, entries={!r})'.format( - self._is_deleted_value, - self._entries_value, - ) + :rtype: bool + """ + return self._tag == 'conflict' -class RestoreArg(object): - """ - :ivar path: The path to the file you want to restore. - :ivar rev: The revision to restore for the file. - """ + def is_no_write_permission(self): + """ + Check if the union tag is ``no_write_permission``. - __slots__ = [ - '_path_value', - '_path_present', - '_rev_value', - '_rev_present', - ] + :rtype: bool + """ + return self._tag == 'no_write_permission' - _has_required_fields = True + def is_insufficient_space(self): + """ + Check if the union tag is ``insufficient_space``. - def __init__(self, - path=None, - rev=None): - self._path_value = None - self._path_present = False - self._rev_value = None - self._rev_present = False - if path is not None: - self.path = path - if rev is not None: - self.rev = rev + :rtype: bool + """ + return self._tag == 'insufficient_space' - @property - def path(self): + def is_disallowed_name(self): """ - The path to the file you want to restore. + Check if the union tag is ``disallowed_name``. - :rtype: str + :rtype: bool """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") + return self._tag == 'disallowed_name' - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True + def is_other(self): + """ + Check if the union tag is ``other``. - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + :rtype: bool + """ + return self._tag == 'other' - @property - def rev(self): + def get_malformed_path(self): """ - The revision to restore for the file. + Only call this if :meth:`is_malformed_path` is true. :rtype: str """ - if self._rev_present: - return self._rev_value - else: - raise AttributeError("missing required field 'rev'") + if not self.is_malformed_path(): + raise AttributeError("tag 'malformed_path' not set") + return self._value - @rev.setter - def rev(self, val): - val = self._rev_validator.validate(val) - self._rev_value = val - self._rev_present = True + def get_conflict(self): + """ + Couldn't write to the target path because there was something in the + way. - @rev.deleter - def rev(self): - self._rev_value = None - self._rev_present = False + Only call this if :meth:`is_conflict` is true. + + :rtype: WriteConflictError + """ + if not self.is_conflict(): + raise AttributeError("tag 'conflict' not set") + return self._value def __repr__(self): - return 'RestoreArg(path={!r}, rev={!r})'.format( - self._path_value, - self._rev_value, - ) + return 'WriteError(%r, %r)' % (self._tag, self._value) -class RestoreError(object): +class WriteMode(object): """ + Your intent when writing a file to some path. This is used to determine what + constitutes a conflict and what the autorename strategy is. In some + situations, the conflict behavior is identical: (a) If the target path + doesn't contain anything, the file is always written; no conflict. (b) If + the target path contains a folder, it's always a conflict. (c) If the target + path contains a file with identical contents, nothing gets written; no + conflict. The conflict checking differs in the case where there's a file at + the target path with contents different from the contents you're trying to + write. + This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar LookupError path_lookup: An error occurs when downloading metadata for - the file. - :ivar WriteError path_write: An error occurs when trying to restore the file - to that path. - :ivar invalid_revision: The revision is invalid. It may point to a different - file. + :ivar add: Never overwrite the existing file. The autorename strategy is to + append a number to the file name. For example, "document.txt" might + become "document (2).txt". + :ivar overwrite: Always overwrite the existing file. The autorename strategy + is the same as it is for ``add``. + :ivar str update: Overwrite if the given "rev" matches the existing file's + "rev". The autorename strategy is to append the string "conflicted copy" + to the file name. For example, "document.txt" might become "document + (conflicted copy).txt" or "document (Panda's conflicted copy).txt". """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' + _catch_all = None # Attribute is overwritten below the class definition - invalid_revision = None + add = None # Attribute is overwritten below the class definition - other = None + overwrite = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -5072,85 +5417,101 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def path_lookup(cls, val): - """ - Create an instance of this class set to the ``path_lookup`` tag with - value ``val``. - - :param LookupError val: - :rtype: RestoreError - """ - return cls('path_lookup', val) - - @classmethod - def path_write(cls, val): + def update(cls, val): """ - Create an instance of this class set to the ``path_write`` tag with - value ``val``. + Create an instance of this class set to the ``update`` tag with value + ``val``. - :param WriteError val: - :rtype: RestoreError + :param str val: + :rtype: WriteMode """ - return cls('path_write', val) + return cls('update', val) - def is_path_lookup(self): + def is_add(self): """ - Check if the union tag is ``path_lookup``. + Check if the union tag is ``add``. :rtype: bool """ - return self._tag == 'path_lookup' + return self._tag == 'add' - def is_path_write(self): + def is_overwrite(self): """ - Check if the union tag is ``path_write``. + Check if the union tag is ``overwrite``. :rtype: bool """ - return self._tag == 'path_write' + return self._tag == 'overwrite' - def is_invalid_revision(self): + def is_update(self): """ - Check if the union tag is ``invalid_revision``. + Check if the union tag is ``update``. :rtype: bool """ - return self._tag == 'invalid_revision' + return self._tag == 'update' - def is_other(self): + def get_update(self): """ - Check if the union tag is ``other``. + Overwrite if the given "rev" matches the existing file's "rev". The + autorename strategy is to append the string "conflicted copy" to the + file name. For example, "document.txt" might become "document + (conflicted copy).txt" or "document (Panda's conflicted copy).txt". - :rtype: bool - """ - return self._tag == 'other' + Only call this if :meth:`is_update` is true. - def get_path_lookup(self): + :rtype: str """ - An error occurs when downloading metadata for the file. + if not self.is_update(): + raise AttributeError("tag 'update' not set") + return self._value - Only call this if :meth:`is_path_lookup` is true. + def __repr__(self): + return 'WriteMode(%r, %r)' % (self._tag, self._value) - :rtype: LookupError - """ - if not self.is_path_lookup(): - raise AttributeError("tag 'path_lookup' not set") - return self._value +CommitInfo._path_validator = bv.String(pattern=u'/.*') +CommitInfo._mode_validator = bv.Union(WriteMode) +CommitInfo._autorename_validator = bv.Boolean() +CommitInfo._client_modified_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +CommitInfo._mute_validator = bv.Boolean() +CommitInfo._all_field_names_ = set([ + 'path', + 'mode', + 'autorename', + 'client_modified', + 'mute', +]) +CommitInfo._all_fields_ = [ + ('path', CommitInfo._path_validator), + ('mode', CommitInfo._mode_validator), + ('autorename', CommitInfo._autorename_validator), + ('client_modified', CommitInfo._client_modified_validator), + ('mute', CommitInfo._mute_validator), +] - def get_path_write(self): - """ - An error occurs when trying to restore the file to that path. +CreateFolderArg._path_validator = bv.String(pattern=u'/.*') +CreateFolderArg._all_field_names_ = set(['path']) +CreateFolderArg._all_fields_ = [('path', CreateFolderArg._path_validator)] - Only call this if :meth:`is_path_write` is true. +CreateFolderError._path_validator = bv.Union(WriteError) +CreateFolderError._tagmap = { + 'path': CreateFolderError._path_validator, +} - :rtype: WriteError - """ - if not self.is_path_write(): - raise AttributeError("tag 'path_write' not set") - return self._value +DeleteArg._path_validator = bv.String(pattern=u'/.*') +DeleteArg._all_field_names_ = set(['path']) +DeleteArg._all_fields_ = [('path', DeleteArg._path_validator)] - def __repr__(self): - return 'RestoreError(%r, %r)' % (self._tag, self._value) +DeleteError._path_lookup_validator = bv.Union(LookupError) +DeleteError._path_write_validator = bv.Union(WriteError) +DeleteError._other_validator = bv.Void() +DeleteError._tagmap = { + 'path_lookup': DeleteError._path_lookup_validator, + 'path_write': DeleteError._path_write_validator, + 'other': DeleteError._other_validator, +} + +DeleteError.other = DeleteError('other') Metadata._name_validator = bv.String() Metadata._path_lower_validator = bv.String() @@ -5180,6 +5541,11 @@ def __repr__(self): } Metadata._is_catch_all_ = False +DeletedMetadata._field_names_ = set([]) +DeletedMetadata._all_field_names_ = Metadata._all_field_names_.union(DeletedMetadata._field_names_) +DeletedMetadata._fields_ = [] +DeletedMetadata._all_fields_ = Metadata._all_fields_ + DeletedMetadata._fields_ + Dimensions._height_validator = bv.UInt64() Dimensions._width_validator = bv.UInt64() Dimensions._all_field_names_ = set([ @@ -5191,62 +5557,25 @@ def __repr__(self): ('width', Dimensions._width_validator), ] -GpsCoordinates._latitude_validator = bv.Float64() -GpsCoordinates._longitude_validator = bv.Float64() -GpsCoordinates._all_field_names_ = set([ - 'latitude', - 'longitude', -]) -GpsCoordinates._all_fields_ = [ - ('latitude', GpsCoordinates._latitude_validator), - ('longitude', GpsCoordinates._longitude_validator), -] - -MediaMetadata._dimensions_validator = bv.Nullable(bv.Struct(Dimensions)) -MediaMetadata._location_validator = bv.Nullable(bv.Struct(GpsCoordinates)) -MediaMetadata._time_taken_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) -MediaMetadata._field_names_ = set([ - 'dimensions', - 'location', - 'time_taken', +DownloadArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') +DownloadArg._rev_validator = bv.Nullable(bv.String(min_length=9, pattern=u'[0-9a-f]+')) +DownloadArg._all_field_names_ = set([ + 'path', + 'rev', ]) -MediaMetadata._all_field_names_ = MediaMetadata._field_names_ -MediaMetadata._fields_ = [ - ('dimensions', MediaMetadata._dimensions_validator), - ('location', MediaMetadata._location_validator), - ('time_taken', MediaMetadata._time_taken_validator), +DownloadArg._all_fields_ = [ + ('path', DownloadArg._path_validator), + ('rev', DownloadArg._rev_validator), ] -MediaMetadata._all_fields_ = MediaMetadata._fields_ - -MediaMetadata._tag_to_subtype_ = { - (u'photo',): bv.Struct(PhotoMetadata), - (u'video',): bv.Struct(VideoMetadata), -} -MediaMetadata._pytype_to_tag_and_subtype_ = { - PhotoMetadata: ((u'photo',), bv.Struct(PhotoMetadata)), - VideoMetadata: ((u'video',), bv.Struct(VideoMetadata)), -} -MediaMetadata._is_catch_all_ = False - -PhotoMetadata._field_names_ = set([]) -PhotoMetadata._all_field_names_ = MediaMetadata._all_field_names_.union(PhotoMetadata._field_names_) -PhotoMetadata._fields_ = [] -PhotoMetadata._all_fields_ = MediaMetadata._all_fields_ + PhotoMetadata._fields_ - -VideoMetadata._duration_validator = bv.Nullable(bv.UInt64()) -VideoMetadata._field_names_ = set(['duration']) -VideoMetadata._all_field_names_ = MediaMetadata._all_field_names_.union(VideoMetadata._field_names_) -VideoMetadata._fields_ = [('duration', VideoMetadata._duration_validator)] -VideoMetadata._all_fields_ = MediaMetadata._all_fields_ + VideoMetadata._fields_ -MediaInfo._pending_validator = bv.Void() -MediaInfo._metadata_validator = bv.StructTree(MediaMetadata) -MediaInfo._tagmap = { - 'pending': MediaInfo._pending_validator, - 'metadata': MediaInfo._metadata_validator, +DownloadError._path_validator = bv.Union(LookupError) +DownloadError._other_validator = bv.Void() +DownloadError._tagmap = { + 'path': DownloadError._path_validator, + 'other': DownloadError._other_validator, } -MediaInfo.pending = MediaInfo('pending') +DownloadError.other = DownloadError('other') FileMetadata._id_validator = bv.Nullable(bv.String(min_length=1)) FileMetadata._client_modified_validator = bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ') @@ -5254,6 +5583,7 @@ def __repr__(self): FileMetadata._rev_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') FileMetadata._size_validator = bv.UInt64() FileMetadata._media_info_validator = bv.Nullable(bv.Union(MediaInfo)) +FileMetadata._sharing_info_validator = bv.Nullable(bv.Struct(FileSharingInfo)) FileMetadata._field_names_ = set([ 'id', 'client_modified', @@ -5261,6 +5591,7 @@ def __repr__(self): 'rev', 'size', 'media_info', + 'sharing_info', ]) FileMetadata._all_field_names_ = Metadata._all_field_names_.union(FileMetadata._field_names_) FileMetadata._fields_ = [ @@ -5270,31 +5601,51 @@ def __repr__(self): ('rev', FileMetadata._rev_validator), ('size', FileMetadata._size_validator), ('media_info', FileMetadata._media_info_validator), + ('sharing_info', FileMetadata._sharing_info_validator), +] +FileMetadata._all_fields_ = Metadata._all_fields_ + FileMetadata._fields_ + +SharingInfo._read_only_validator = bv.Boolean() +SharingInfo._all_field_names_ = set(['read_only']) +SharingInfo._all_fields_ = [('read_only', SharingInfo._read_only_validator)] + +FileSharingInfo._parent_shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +FileSharingInfo._modified_by_validator = bv.Nullable(bv.String(min_length=40, max_length=40)) +FileSharingInfo._all_field_names_ = SharingInfo._all_field_names_.union(set([ + 'parent_shared_folder_id', + 'modified_by', +])) +FileSharingInfo._all_fields_ = SharingInfo._all_fields_ + [ + ('parent_shared_folder_id', FileSharingInfo._parent_shared_folder_id_validator), + ('modified_by', FileSharingInfo._modified_by_validator), ] -FileMetadata._all_fields_ = Metadata._all_fields_ + FileMetadata._fields_ FolderMetadata._id_validator = bv.Nullable(bv.String(min_length=1)) FolderMetadata._shared_folder_id_validator = bv.Nullable(bv.String(pattern=u'[-_0-9a-zA-Z:]+')) +FolderMetadata._sharing_info_validator = bv.Nullable(bv.Struct(FolderSharingInfo)) FolderMetadata._field_names_ = set([ 'id', 'shared_folder_id', + 'sharing_info', ]) FolderMetadata._all_field_names_ = Metadata._all_field_names_.union(FolderMetadata._field_names_) FolderMetadata._fields_ = [ ('id', FolderMetadata._id_validator), ('shared_folder_id', FolderMetadata._shared_folder_id_validator), + ('sharing_info', FolderMetadata._sharing_info_validator), ] FolderMetadata._all_fields_ = Metadata._all_fields_ + FolderMetadata._fields_ -DeletedMetadata._field_names_ = set([]) -DeletedMetadata._all_field_names_ = Metadata._all_field_names_.union(DeletedMetadata._field_names_) -DeletedMetadata._fields_ = [] -DeletedMetadata._all_fields_ = Metadata._all_fields_ + DeletedMetadata._fields_ - -GetMetadataError._path_validator = bv.Union(LookupError) -GetMetadataError._tagmap = { - 'path': GetMetadataError._path_validator, -} +FolderSharingInfo._parent_shared_folder_id_validator = bv.Nullable(bv.String(pattern=u'[-_0-9a-zA-Z:]+')) +FolderSharingInfo._shared_folder_id_validator = bv.Nullable(bv.String(pattern=u'[-_0-9a-zA-Z:]+')) +FolderSharingInfo._all_field_names_ = SharingInfo._all_field_names_.union(set([ + 'parent_shared_folder_id', + 'shared_folder_id', +])) +FolderSharingInfo._all_fields_ = SharingInfo._all_fields_ + [ + ('parent_shared_folder_id', FolderSharingInfo._parent_shared_folder_id_validator), + ('shared_folder_id', FolderSharingInfo._shared_folder_id_validator), +] GetMetadataArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') GetMetadataArg._include_media_info_validator = bv.Boolean() @@ -5307,38 +5658,22 @@ def __repr__(self): ('include_media_info', GetMetadataArg._include_media_info_validator), ] -ListFolderLongpollArg._cursor_validator = bv.String() -ListFolderLongpollArg._timeout_validator = bv.UInt64(min_value=30, max_value=480) -ListFolderLongpollArg._all_field_names_ = set([ - 'cursor', - 'timeout', -]) -ListFolderLongpollArg._all_fields_ = [ - ('cursor', ListFolderLongpollArg._cursor_validator), - ('timeout', ListFolderLongpollArg._timeout_validator), -] +GetMetadataError._path_validator = bv.Union(LookupError) +GetMetadataError._tagmap = { + 'path': GetMetadataError._path_validator, +} -ListFolderLongpollResult._changes_validator = bv.Boolean() -ListFolderLongpollResult._backoff_validator = bv.Nullable(bv.UInt64()) -ListFolderLongpollResult._all_field_names_ = set([ - 'changes', - 'backoff', +GpsCoordinates._latitude_validator = bv.Float64() +GpsCoordinates._longitude_validator = bv.Float64() +GpsCoordinates._all_field_names_ = set([ + 'latitude', + 'longitude', ]) -ListFolderLongpollResult._all_fields_ = [ - ('changes', ListFolderLongpollResult._changes_validator), - ('backoff', ListFolderLongpollResult._backoff_validator), +GpsCoordinates._all_fields_ = [ + ('latitude', GpsCoordinates._latitude_validator), + ('longitude', GpsCoordinates._longitude_validator), ] -ListFolderLongpollError._reset_validator = bv.Void() -ListFolderLongpollError._other_validator = bv.Void() -ListFolderLongpollError._tagmap = { - 'reset': ListFolderLongpollError._reset_validator, - 'other': ListFolderLongpollError._other_validator, -} - -ListFolderLongpollError.reset = ListFolderLongpollError('reset') -ListFolderLongpollError.other = ListFolderLongpollError('other') - ListFolderArg._path_validator = bv.String(pattern=u'(/.*)?') ListFolderArg._recursive_validator = bv.Boolean() ListFolderArg._include_media_info_validator = bv.Boolean() @@ -5356,30 +5691,7 @@ def __repr__(self): ('include_deleted', ListFolderArg._include_deleted_validator), ] -ListFolderResult._entries_validator = bv.List(bv.StructTree(Metadata)) -ListFolderResult._cursor_validator = bv.String() -ListFolderResult._has_more_validator = bv.Boolean() -ListFolderResult._all_field_names_ = set([ - 'entries', - 'cursor', - 'has_more', -]) -ListFolderResult._all_fields_ = [ - ('entries', ListFolderResult._entries_validator), - ('cursor', ListFolderResult._cursor_validator), - ('has_more', ListFolderResult._has_more_validator), -] - -ListFolderError._path_validator = bv.Union(LookupError) -ListFolderError._other_validator = bv.Void() -ListFolderError._tagmap = { - 'path': ListFolderError._path_validator, - 'other': ListFolderError._other_validator, -} - -ListFolderError.other = ListFolderError('other') - -ListFolderContinueArg._cursor_validator = bv.String() +ListFolderContinueArg._cursor_validator = bv.String(min_length=1) ListFolderContinueArg._all_field_names_ = set(['cursor']) ListFolderContinueArg._all_fields_ = [('cursor', ListFolderContinueArg._cursor_validator)] @@ -5395,217 +5707,95 @@ def __repr__(self): ListFolderContinueError.reset = ListFolderContinueError('reset') ListFolderContinueError.other = ListFolderContinueError('other') -ListFolderGetLatestCursorResult._cursor_validator = bv.String() -ListFolderGetLatestCursorResult._all_field_names_ = set(['cursor']) -ListFolderGetLatestCursorResult._all_fields_ = [('cursor', ListFolderGetLatestCursorResult._cursor_validator)] - -DownloadError._path_validator = bv.Union(LookupError) -DownloadError._other_validator = bv.Void() -DownloadError._tagmap = { - 'path': DownloadError._path_validator, - 'other': DownloadError._other_validator, -} - -DownloadError.other = DownloadError('other') - -DownloadArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') -DownloadArg._rev_validator = bv.Nullable(bv.String(min_length=9, pattern=u'[0-9a-f]+')) -DownloadArg._all_field_names_ = set([ - 'path', - 'rev', -]) -DownloadArg._all_fields_ = [ - ('path', DownloadArg._path_validator), - ('rev', DownloadArg._rev_validator), -] - -UploadWriteFailed._reason_validator = bv.Union(WriteError) -UploadWriteFailed._upload_session_id_validator = bv.String() -UploadWriteFailed._all_field_names_ = set([ - 'reason', - 'upload_session_id', -]) -UploadWriteFailed._all_fields_ = [ - ('reason', UploadWriteFailed._reason_validator), - ('upload_session_id', UploadWriteFailed._upload_session_id_validator), -] - -UploadError._path_validator = bv.Struct(UploadWriteFailed) -UploadError._other_validator = bv.Void() -UploadError._tagmap = { - 'path': UploadError._path_validator, - 'other': UploadError._other_validator, -} - -UploadError.other = UploadError('other') - -UploadSessionOffsetError._correct_offset_validator = bv.UInt64() -UploadSessionOffsetError._all_field_names_ = set(['correct_offset']) -UploadSessionOffsetError._all_fields_ = [('correct_offset', UploadSessionOffsetError._correct_offset_validator)] - -UploadSessionLookupError._not_found_validator = bv.Void() -UploadSessionLookupError._incorrect_offset_validator = bv.Struct(UploadSessionOffsetError) -UploadSessionLookupError._closed_validator = bv.Void() -UploadSessionLookupError._other_validator = bv.Void() -UploadSessionLookupError._tagmap = { - 'not_found': UploadSessionLookupError._not_found_validator, - 'incorrect_offset': UploadSessionLookupError._incorrect_offset_validator, - 'closed': UploadSessionLookupError._closed_validator, - 'other': UploadSessionLookupError._other_validator, -} - -UploadSessionLookupError.not_found = UploadSessionLookupError('not_found') -UploadSessionLookupError.closed = UploadSessionLookupError('closed') -UploadSessionLookupError.other = UploadSessionLookupError('other') - -UploadSessionFinishError._lookup_failed_validator = bv.Union(UploadSessionLookupError) -UploadSessionFinishError._path_validator = bv.Union(WriteError) -UploadSessionFinishError._other_validator = bv.Void() -UploadSessionFinishError._tagmap = { - 'lookup_failed': UploadSessionFinishError._lookup_failed_validator, - 'path': UploadSessionFinishError._path_validator, - 'other': UploadSessionFinishError._other_validator, -} - -UploadSessionFinishError.other = UploadSessionFinishError('other') - -UploadSessionStartResult._session_id_validator = bv.String() -UploadSessionStartResult._all_field_names_ = set(['session_id']) -UploadSessionStartResult._all_fields_ = [('session_id', UploadSessionStartResult._session_id_validator)] - -UploadSessionCursor._session_id_validator = bv.String() -UploadSessionCursor._offset_validator = bv.UInt64() -UploadSessionCursor._all_field_names_ = set([ - 'session_id', - 'offset', -]) -UploadSessionCursor._all_fields_ = [ - ('session_id', UploadSessionCursor._session_id_validator), - ('offset', UploadSessionCursor._offset_validator), -] - -WriteMode._add_validator = bv.Void() -WriteMode._overwrite_validator = bv.Void() -WriteMode._update_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') -WriteMode._tagmap = { - 'add': WriteMode._add_validator, - 'overwrite': WriteMode._overwrite_validator, - 'update': WriteMode._update_validator, +ListFolderError._path_validator = bv.Union(LookupError) +ListFolderError._other_validator = bv.Void() +ListFolderError._tagmap = { + 'path': ListFolderError._path_validator, + 'other': ListFolderError._other_validator, } -WriteMode.add = WriteMode('add') -WriteMode.overwrite = WriteMode('overwrite') +ListFolderError.other = ListFolderError('other') -CommitInfo._path_validator = bv.String(pattern=u'/.*') -CommitInfo._mode_validator = bv.Union(WriteMode) -CommitInfo._autorename_validator = bv.Boolean() -CommitInfo._client_modified_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) -CommitInfo._mute_validator = bv.Boolean() -CommitInfo._all_field_names_ = set([ - 'path', - 'mode', - 'autorename', - 'client_modified', - 'mute', -]) -CommitInfo._all_fields_ = [ - ('path', CommitInfo._path_validator), - ('mode', CommitInfo._mode_validator), - ('autorename', CommitInfo._autorename_validator), - ('client_modified', CommitInfo._client_modified_validator), - ('mute', CommitInfo._mute_validator), -] +ListFolderGetLatestCursorResult._cursor_validator = bv.String(min_length=1) +ListFolderGetLatestCursorResult._all_field_names_ = set(['cursor']) +ListFolderGetLatestCursorResult._all_fields_ = [('cursor', ListFolderGetLatestCursorResult._cursor_validator)] -UploadSessionFinishArg._cursor_validator = bv.Struct(UploadSessionCursor) -UploadSessionFinishArg._commit_validator = bv.Struct(CommitInfo) -UploadSessionFinishArg._all_field_names_ = set([ +ListFolderLongpollArg._cursor_validator = bv.String(min_length=1) +ListFolderLongpollArg._timeout_validator = bv.UInt64(min_value=30, max_value=480) +ListFolderLongpollArg._all_field_names_ = set([ 'cursor', - 'commit', -]) -UploadSessionFinishArg._all_fields_ = [ - ('cursor', UploadSessionFinishArg._cursor_validator), - ('commit', UploadSessionFinishArg._commit_validator), -] - -SearchMode._filename_validator = bv.Void() -SearchMode._filename_and_content_validator = bv.Void() -SearchMode._deleted_filename_validator = bv.Void() -SearchMode._tagmap = { - 'filename': SearchMode._filename_validator, - 'filename_and_content': SearchMode._filename_and_content_validator, - 'deleted_filename': SearchMode._deleted_filename_validator, -} - -SearchMode.filename = SearchMode('filename') -SearchMode.filename_and_content = SearchMode('filename_and_content') -SearchMode.deleted_filename = SearchMode('deleted_filename') - -SearchArg._path_validator = bv.String(pattern=u'(/.*)?') -SearchArg._query_validator = bv.String() -SearchArg._start_validator = bv.UInt64() -SearchArg._max_results_validator = bv.UInt64(min_value=1, max_value=1000) -SearchArg._mode_validator = bv.Union(SearchMode) -SearchArg._all_field_names_ = set([ - 'path', - 'query', - 'start', - 'max_results', - 'mode', + 'timeout', ]) -SearchArg._all_fields_ = [ - ('path', SearchArg._path_validator), - ('query', SearchArg._query_validator), - ('start', SearchArg._start_validator), - ('max_results', SearchArg._max_results_validator), - ('mode', SearchArg._mode_validator), +ListFolderLongpollArg._all_fields_ = [ + ('cursor', ListFolderLongpollArg._cursor_validator), + ('timeout', ListFolderLongpollArg._timeout_validator), ] -SearchMatchType._filename_validator = bv.Void() -SearchMatchType._content_validator = bv.Void() -SearchMatchType._both_validator = bv.Void() -SearchMatchType._tagmap = { - 'filename': SearchMatchType._filename_validator, - 'content': SearchMatchType._content_validator, - 'both': SearchMatchType._both_validator, +ListFolderLongpollError._reset_validator = bv.Void() +ListFolderLongpollError._other_validator = bv.Void() +ListFolderLongpollError._tagmap = { + 'reset': ListFolderLongpollError._reset_validator, + 'other': ListFolderLongpollError._other_validator, } -SearchMatchType.filename = SearchMatchType('filename') -SearchMatchType.content = SearchMatchType('content') -SearchMatchType.both = SearchMatchType('both') +ListFolderLongpollError.reset = ListFolderLongpollError('reset') +ListFolderLongpollError.other = ListFolderLongpollError('other') -SearchMatch._match_type_validator = bv.Union(SearchMatchType) -SearchMatch._metadata_validator = bv.StructTree(Metadata) -SearchMatch._all_field_names_ = set([ - 'match_type', - 'metadata', +ListFolderLongpollResult._changes_validator = bv.Boolean() +ListFolderLongpollResult._backoff_validator = bv.Nullable(bv.UInt64()) +ListFolderLongpollResult._all_field_names_ = set([ + 'changes', + 'backoff', ]) -SearchMatch._all_fields_ = [ - ('match_type', SearchMatch._match_type_validator), - ('metadata', SearchMatch._metadata_validator), +ListFolderLongpollResult._all_fields_ = [ + ('changes', ListFolderLongpollResult._changes_validator), + ('backoff', ListFolderLongpollResult._backoff_validator), ] -SearchResult._matches_validator = bv.List(bv.Struct(SearchMatch)) -SearchResult._more_validator = bv.Boolean() -SearchResult._start_validator = bv.UInt64() -SearchResult._all_field_names_ = set([ - 'matches', - 'more', - 'start', +ListFolderResult._entries_validator = bv.List(bv.StructTree(Metadata)) +ListFolderResult._cursor_validator = bv.String(min_length=1) +ListFolderResult._has_more_validator = bv.Boolean() +ListFolderResult._all_field_names_ = set([ + 'entries', + 'cursor', + 'has_more', ]) -SearchResult._all_fields_ = [ - ('matches', SearchResult._matches_validator), - ('more', SearchResult._more_validator), - ('start', SearchResult._start_validator), +ListFolderResult._all_fields_ = [ + ('entries', ListFolderResult._entries_validator), + ('cursor', ListFolderResult._cursor_validator), + ('has_more', ListFolderResult._has_more_validator), ] -SearchError._path_validator = bv.Union(LookupError) -SearchError._other_validator = bv.Void() -SearchError._tagmap = { - 'path': SearchError._path_validator, - 'other': SearchError._other_validator, +ListRevisionsArg._path_validator = bv.String(pattern=u'/.*') +ListRevisionsArg._limit_validator = bv.UInt64(min_value=1, max_value=100) +ListRevisionsArg._all_field_names_ = set([ + 'path', + 'limit', +]) +ListRevisionsArg._all_fields_ = [ + ('path', ListRevisionsArg._path_validator), + ('limit', ListRevisionsArg._limit_validator), +] + +ListRevisionsError._path_validator = bv.Union(LookupError) +ListRevisionsError._other_validator = bv.Void() +ListRevisionsError._tagmap = { + 'path': ListRevisionsError._path_validator, + 'other': ListRevisionsError._other_validator, } -SearchError.other = SearchError('other') +ListRevisionsError.other = ListRevisionsError('other') + +ListRevisionsResult._is_deleted_validator = bv.Boolean() +ListRevisionsResult._entries_validator = bv.List(bv.Struct(FileMetadata)) +ListRevisionsResult._all_field_names_ = set([ + 'is_deleted', + 'entries', +]) +ListRevisionsResult._all_fields_ = [ + ('is_deleted', ListRevisionsResult._is_deleted_validator), + ('entries', ListRevisionsResult._entries_validator), +] LookupError._malformed_path_validator = bv.Nullable(bv.String()) LookupError._not_found_validator = bv.Void() @@ -5628,65 +5818,71 @@ def __repr__(self): LookupError.restricted_content = LookupError('restricted_content') LookupError.other = LookupError('other') -WriteError._malformed_path_validator = bv.Nullable(bv.String()) -WriteError._conflict_validator = bv.Union(WriteConflictError) -WriteError._no_write_permission_validator = bv.Void() -WriteError._insufficient_space_validator = bv.Void() -WriteError._disallowed_name_validator = bv.Void() -WriteError._other_validator = bv.Void() -WriteError._tagmap = { - 'malformed_path': WriteError._malformed_path_validator, - 'conflict': WriteError._conflict_validator, - 'no_write_permission': WriteError._no_write_permission_validator, - 'insufficient_space': WriteError._insufficient_space_validator, - 'disallowed_name': WriteError._disallowed_name_validator, - 'other': WriteError._other_validator, -} - -WriteError.no_write_permission = WriteError('no_write_permission') -WriteError.insufficient_space = WriteError('insufficient_space') -WriteError.disallowed_name = WriteError('disallowed_name') -WriteError.other = WriteError('other') - -WriteConflictError._file_validator = bv.Void() -WriteConflictError._folder_validator = bv.Void() -WriteConflictError._file_ancestor_validator = bv.Void() -WriteConflictError._other_validator = bv.Void() -WriteConflictError._tagmap = { - 'file': WriteConflictError._file_validator, - 'folder': WriteConflictError._folder_validator, - 'file_ancestor': WriteConflictError._file_ancestor_validator, - 'other': WriteConflictError._other_validator, +MediaInfo._pending_validator = bv.Void() +MediaInfo._metadata_validator = bv.StructTree(MediaMetadata) +MediaInfo._tagmap = { + 'pending': MediaInfo._pending_validator, + 'metadata': MediaInfo._metadata_validator, } -WriteConflictError.file = WriteConflictError('file') -WriteConflictError.folder = WriteConflictError('folder') -WriteConflictError.file_ancestor = WriteConflictError('file_ancestor') -WriteConflictError.other = WriteConflictError('other') +MediaInfo.pending = MediaInfo('pending') -CreateFolderArg._path_validator = bv.String(pattern=u'/.*') -CreateFolderArg._all_field_names_ = set(['path']) -CreateFolderArg._all_fields_ = [('path', CreateFolderArg._path_validator)] +MediaMetadata._dimensions_validator = bv.Nullable(bv.Struct(Dimensions)) +MediaMetadata._location_validator = bv.Nullable(bv.Struct(GpsCoordinates)) +MediaMetadata._time_taken_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +MediaMetadata._field_names_ = set([ + 'dimensions', + 'location', + 'time_taken', +]) +MediaMetadata._all_field_names_ = MediaMetadata._field_names_ +MediaMetadata._fields_ = [ + ('dimensions', MediaMetadata._dimensions_validator), + ('location', MediaMetadata._location_validator), + ('time_taken', MediaMetadata._time_taken_validator), +] +MediaMetadata._all_fields_ = MediaMetadata._fields_ -CreateFolderError._path_validator = bv.Union(WriteError) -CreateFolderError._tagmap = { - 'path': CreateFolderError._path_validator, +MediaMetadata._tag_to_subtype_ = { + (u'photo',): bv.Struct(PhotoMetadata), + (u'video',): bv.Struct(VideoMetadata), +} +MediaMetadata._pytype_to_tag_and_subtype_ = { + PhotoMetadata: ((u'photo',), bv.Struct(PhotoMetadata)), + VideoMetadata: ((u'video',), bv.Struct(VideoMetadata)), } +MediaMetadata._is_catch_all_ = False -DeleteArg._path_validator = bv.String(pattern=u'/.*') -DeleteArg._all_field_names_ = set(['path']) -DeleteArg._all_fields_ = [('path', DeleteArg._path_validator)] +PhotoMetadata._field_names_ = set([]) +PhotoMetadata._all_field_names_ = MediaMetadata._all_field_names_.union(PhotoMetadata._field_names_) +PhotoMetadata._fields_ = [] +PhotoMetadata._all_fields_ = MediaMetadata._all_fields_ + PhotoMetadata._fields_ -DeleteError._path_lookup_validator = bv.Union(LookupError) -DeleteError._path_write_validator = bv.Union(WriteError) -DeleteError._other_validator = bv.Void() -DeleteError._tagmap = { - 'path_lookup': DeleteError._path_lookup_validator, - 'path_write': DeleteError._path_write_validator, - 'other': DeleteError._other_validator, +PreviewArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') +PreviewArg._rev_validator = bv.Nullable(bv.String(min_length=9, pattern=u'[0-9a-f]+')) +PreviewArg._all_field_names_ = set([ + 'path', + 'rev', +]) +PreviewArg._all_fields_ = [ + ('path', PreviewArg._path_validator), + ('rev', PreviewArg._rev_validator), +] + +PreviewError._path_validator = bv.Union(LookupError) +PreviewError._in_progress_validator = bv.Void() +PreviewError._unsupported_extension_validator = bv.Void() +PreviewError._unsupported_content_validator = bv.Void() +PreviewError._tagmap = { + 'path': PreviewError._path_validator, + 'in_progress': PreviewError._in_progress_validator, + 'unsupported_extension': PreviewError._unsupported_extension_validator, + 'unsupported_content': PreviewError._unsupported_content_validator, } -DeleteError.other = DeleteError('other') +PreviewError.in_progress = PreviewError('in_progress') +PreviewError.unsupported_extension = PreviewError('unsupported_extension') +PreviewError.unsupported_content = PreviewError('unsupported_content') RelocationArg._from_path_validator = bv.String(pattern=u'/.*') RelocationArg._to_path_validator = bv.String(pattern=u'/.*') @@ -5704,6 +5900,7 @@ def __repr__(self): RelocationError._to_validator = bv.Union(WriteError) RelocationError._cant_copy_shared_folder_validator = bv.Void() RelocationError._cant_nest_shared_folder_validator = bv.Void() +RelocationError._cant_move_folder_into_itself_validator = bv.Void() RelocationError._too_many_files_validator = bv.Void() RelocationError._other_validator = bv.Void() RelocationError._tagmap = { @@ -5712,43 +5909,121 @@ def __repr__(self): 'to': RelocationError._to_validator, 'cant_copy_shared_folder': RelocationError._cant_copy_shared_folder_validator, 'cant_nest_shared_folder': RelocationError._cant_nest_shared_folder_validator, + 'cant_move_folder_into_itself': RelocationError._cant_move_folder_into_itself_validator, 'too_many_files': RelocationError._too_many_files_validator, 'other': RelocationError._other_validator, } RelocationError.cant_copy_shared_folder = RelocationError('cant_copy_shared_folder') RelocationError.cant_nest_shared_folder = RelocationError('cant_nest_shared_folder') +RelocationError.cant_move_folder_into_itself = RelocationError('cant_move_folder_into_itself') RelocationError.too_many_files = RelocationError('too_many_files') RelocationError.other = RelocationError('other') -ThumbnailSize._w32h32_validator = bv.Void() -ThumbnailSize._w64h64_validator = bv.Void() -ThumbnailSize._w128h128_validator = bv.Void() -ThumbnailSize._w640h480_validator = bv.Void() -ThumbnailSize._w1024h768_validator = bv.Void() -ThumbnailSize._tagmap = { - 'w32h32': ThumbnailSize._w32h32_validator, - 'w64h64': ThumbnailSize._w64h64_validator, - 'w128h128': ThumbnailSize._w128h128_validator, - 'w640h480': ThumbnailSize._w640h480_validator, - 'w1024h768': ThumbnailSize._w1024h768_validator, +RestoreArg._path_validator = bv.String(pattern=u'/.*') +RestoreArg._rev_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') +RestoreArg._all_field_names_ = set([ + 'path', + 'rev', +]) +RestoreArg._all_fields_ = [ + ('path', RestoreArg._path_validator), + ('rev', RestoreArg._rev_validator), +] + +RestoreError._path_lookup_validator = bv.Union(LookupError) +RestoreError._path_write_validator = bv.Union(WriteError) +RestoreError._invalid_revision_validator = bv.Void() +RestoreError._other_validator = bv.Void() +RestoreError._tagmap = { + 'path_lookup': RestoreError._path_lookup_validator, + 'path_write': RestoreError._path_write_validator, + 'invalid_revision': RestoreError._invalid_revision_validator, + 'other': RestoreError._other_validator, +} + +RestoreError.invalid_revision = RestoreError('invalid_revision') +RestoreError.other = RestoreError('other') + +SearchArg._path_validator = bv.String(pattern=u'(/.*)?') +SearchArg._query_validator = bv.String() +SearchArg._start_validator = bv.UInt64() +SearchArg._max_results_validator = bv.UInt64(min_value=1, max_value=1000) +SearchArg._mode_validator = bv.Union(SearchMode) +SearchArg._all_field_names_ = set([ + 'path', + 'query', + 'start', + 'max_results', + 'mode', +]) +SearchArg._all_fields_ = [ + ('path', SearchArg._path_validator), + ('query', SearchArg._query_validator), + ('start', SearchArg._start_validator), + ('max_results', SearchArg._max_results_validator), + ('mode', SearchArg._mode_validator), +] + +SearchError._path_validator = bv.Union(LookupError) +SearchError._other_validator = bv.Void() +SearchError._tagmap = { + 'path': SearchError._path_validator, + 'other': SearchError._other_validator, +} + +SearchError.other = SearchError('other') + +SearchMatch._match_type_validator = bv.Union(SearchMatchType) +SearchMatch._metadata_validator = bv.StructTree(Metadata) +SearchMatch._all_field_names_ = set([ + 'match_type', + 'metadata', +]) +SearchMatch._all_fields_ = [ + ('match_type', SearchMatch._match_type_validator), + ('metadata', SearchMatch._metadata_validator), +] + +SearchMatchType._filename_validator = bv.Void() +SearchMatchType._content_validator = bv.Void() +SearchMatchType._both_validator = bv.Void() +SearchMatchType._tagmap = { + 'filename': SearchMatchType._filename_validator, + 'content': SearchMatchType._content_validator, + 'both': SearchMatchType._both_validator, } -ThumbnailSize.w32h32 = ThumbnailSize('w32h32') -ThumbnailSize.w64h64 = ThumbnailSize('w64h64') -ThumbnailSize.w128h128 = ThumbnailSize('w128h128') -ThumbnailSize.w640h480 = ThumbnailSize('w640h480') -ThumbnailSize.w1024h768 = ThumbnailSize('w1024h768') +SearchMatchType.filename = SearchMatchType('filename') +SearchMatchType.content = SearchMatchType('content') +SearchMatchType.both = SearchMatchType('both') -ThumbnailFormat._jpeg_validator = bv.Void() -ThumbnailFormat._png_validator = bv.Void() -ThumbnailFormat._tagmap = { - 'jpeg': ThumbnailFormat._jpeg_validator, - 'png': ThumbnailFormat._png_validator, +SearchMode._filename_validator = bv.Void() +SearchMode._filename_and_content_validator = bv.Void() +SearchMode._deleted_filename_validator = bv.Void() +SearchMode._tagmap = { + 'filename': SearchMode._filename_validator, + 'filename_and_content': SearchMode._filename_and_content_validator, + 'deleted_filename': SearchMode._deleted_filename_validator, } -ThumbnailFormat.jpeg = ThumbnailFormat('jpeg') -ThumbnailFormat.png = ThumbnailFormat('png') +SearchMode.filename = SearchMode('filename') +SearchMode.filename_and_content = SearchMode('filename_and_content') +SearchMode.deleted_filename = SearchMode('deleted_filename') + +SearchResult._matches_validator = bv.List(bv.Struct(SearchMatch)) +SearchResult._more_validator = bv.Boolean() +SearchResult._start_validator = bv.UInt64() +SearchResult._all_field_names_ = set([ + 'matches', + 'more', + 'start', +]) +SearchResult._all_fields_ = [ + ('matches', SearchResult._matches_validator), + ('more', SearchResult._more_validator), + ('start', SearchResult._start_validator), +] ThumbnailArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') ThumbnailArg._format_validator = bv.Union(ThumbnailFormat) @@ -5779,85 +6054,162 @@ def __repr__(self): ThumbnailError.unsupported_image = ThumbnailError('unsupported_image') ThumbnailError.conversion_error = ThumbnailError('conversion_error') -PreviewArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') -PreviewArg._rev_validator = bv.Nullable(bv.String(min_length=9, pattern=u'[0-9a-f]+')) -PreviewArg._all_field_names_ = set([ - 'path', - 'rev', -]) -PreviewArg._all_fields_ = [ - ('path', PreviewArg._path_validator), - ('rev', PreviewArg._rev_validator), -] +ThumbnailFormat._jpeg_validator = bv.Void() +ThumbnailFormat._png_validator = bv.Void() +ThumbnailFormat._tagmap = { + 'jpeg': ThumbnailFormat._jpeg_validator, + 'png': ThumbnailFormat._png_validator, +} -PreviewError._path_validator = bv.Union(LookupError) -PreviewError._in_progress_validator = bv.Void() -PreviewError._unsupported_extension_validator = bv.Void() -PreviewError._unsupported_content_validator = bv.Void() -PreviewError._tagmap = { - 'path': PreviewError._path_validator, - 'in_progress': PreviewError._in_progress_validator, - 'unsupported_extension': PreviewError._unsupported_extension_validator, - 'unsupported_content': PreviewError._unsupported_content_validator, +ThumbnailFormat.jpeg = ThumbnailFormat('jpeg') +ThumbnailFormat.png = ThumbnailFormat('png') + +ThumbnailSize._w32h32_validator = bv.Void() +ThumbnailSize._w64h64_validator = bv.Void() +ThumbnailSize._w128h128_validator = bv.Void() +ThumbnailSize._w640h480_validator = bv.Void() +ThumbnailSize._w1024h768_validator = bv.Void() +ThumbnailSize._tagmap = { + 'w32h32': ThumbnailSize._w32h32_validator, + 'w64h64': ThumbnailSize._w64h64_validator, + 'w128h128': ThumbnailSize._w128h128_validator, + 'w640h480': ThumbnailSize._w640h480_validator, + 'w1024h768': ThumbnailSize._w1024h768_validator, } -PreviewError.in_progress = PreviewError('in_progress') -PreviewError.unsupported_extension = PreviewError('unsupported_extension') -PreviewError.unsupported_content = PreviewError('unsupported_content') +ThumbnailSize.w32h32 = ThumbnailSize('w32h32') +ThumbnailSize.w64h64 = ThumbnailSize('w64h64') +ThumbnailSize.w128h128 = ThumbnailSize('w128h128') +ThumbnailSize.w640h480 = ThumbnailSize('w640h480') +ThumbnailSize.w1024h768 = ThumbnailSize('w1024h768') -ListRevisionsArg._path_validator = bv.String(pattern=u'/.*') -ListRevisionsArg._limit_validator = bv.UInt64(min_value=1, max_value=100) -ListRevisionsArg._all_field_names_ = set([ - 'path', - 'limit', +UploadError._path_validator = bv.Struct(UploadWriteFailed) +UploadError._other_validator = bv.Void() +UploadError._tagmap = { + 'path': UploadError._path_validator, + 'other': UploadError._other_validator, +} + +UploadError.other = UploadError('other') + +UploadSessionCursor._session_id_validator = bv.String() +UploadSessionCursor._offset_validator = bv.UInt64() +UploadSessionCursor._all_field_names_ = set([ + 'session_id', + 'offset', ]) -ListRevisionsArg._all_fields_ = [ - ('path', ListRevisionsArg._path_validator), - ('limit', ListRevisionsArg._limit_validator), +UploadSessionCursor._all_fields_ = [ + ('session_id', UploadSessionCursor._session_id_validator), + ('offset', UploadSessionCursor._offset_validator), ] -ListRevisionsError._path_validator = bv.Union(LookupError) -ListRevisionsError._other_validator = bv.Void() -ListRevisionsError._tagmap = { - 'path': ListRevisionsError._path_validator, - 'other': ListRevisionsError._other_validator, +UploadSessionFinishArg._cursor_validator = bv.Struct(UploadSessionCursor) +UploadSessionFinishArg._commit_validator = bv.Struct(CommitInfo) +UploadSessionFinishArg._all_field_names_ = set([ + 'cursor', + 'commit', +]) +UploadSessionFinishArg._all_fields_ = [ + ('cursor', UploadSessionFinishArg._cursor_validator), + ('commit', UploadSessionFinishArg._commit_validator), +] + +UploadSessionFinishError._lookup_failed_validator = bv.Union(UploadSessionLookupError) +UploadSessionFinishError._path_validator = bv.Union(WriteError) +UploadSessionFinishError._other_validator = bv.Void() +UploadSessionFinishError._tagmap = { + 'lookup_failed': UploadSessionFinishError._lookup_failed_validator, + 'path': UploadSessionFinishError._path_validator, + 'other': UploadSessionFinishError._other_validator, } -ListRevisionsError.other = ListRevisionsError('other') +UploadSessionFinishError.other = UploadSessionFinishError('other') -ListRevisionsResult._is_deleted_validator = bv.Boolean() -ListRevisionsResult._entries_validator = bv.List(bv.Struct(FileMetadata)) -ListRevisionsResult._all_field_names_ = set([ - 'is_deleted', - 'entries', -]) -ListRevisionsResult._all_fields_ = [ - ('is_deleted', ListRevisionsResult._is_deleted_validator), - ('entries', ListRevisionsResult._entries_validator), -] +UploadSessionLookupError._not_found_validator = bv.Void() +UploadSessionLookupError._incorrect_offset_validator = bv.Struct(UploadSessionOffsetError) +UploadSessionLookupError._closed_validator = bv.Void() +UploadSessionLookupError._other_validator = bv.Void() +UploadSessionLookupError._tagmap = { + 'not_found': UploadSessionLookupError._not_found_validator, + 'incorrect_offset': UploadSessionLookupError._incorrect_offset_validator, + 'closed': UploadSessionLookupError._closed_validator, + 'other': UploadSessionLookupError._other_validator, +} -RestoreArg._path_validator = bv.String(pattern=u'/.*') -RestoreArg._rev_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') -RestoreArg._all_field_names_ = set([ - 'path', - 'rev', +UploadSessionLookupError.not_found = UploadSessionLookupError('not_found') +UploadSessionLookupError.closed = UploadSessionLookupError('closed') +UploadSessionLookupError.other = UploadSessionLookupError('other') + +UploadSessionOffsetError._correct_offset_validator = bv.UInt64() +UploadSessionOffsetError._all_field_names_ = set(['correct_offset']) +UploadSessionOffsetError._all_fields_ = [('correct_offset', UploadSessionOffsetError._correct_offset_validator)] + +UploadSessionStartResult._session_id_validator = bv.String() +UploadSessionStartResult._all_field_names_ = set(['session_id']) +UploadSessionStartResult._all_fields_ = [('session_id', UploadSessionStartResult._session_id_validator)] + +UploadWriteFailed._reason_validator = bv.Union(WriteError) +UploadWriteFailed._upload_session_id_validator = bv.String() +UploadWriteFailed._all_field_names_ = set([ + 'reason', + 'upload_session_id', ]) -RestoreArg._all_fields_ = [ - ('path', RestoreArg._path_validator), - ('rev', RestoreArg._rev_validator), +UploadWriteFailed._all_fields_ = [ + ('reason', UploadWriteFailed._reason_validator), + ('upload_session_id', UploadWriteFailed._upload_session_id_validator), ] -RestoreError._path_lookup_validator = bv.Union(LookupError) -RestoreError._path_write_validator = bv.Union(WriteError) -RestoreError._invalid_revision_validator = bv.Void() -RestoreError._other_validator = bv.Void() -RestoreError._tagmap = { - 'path_lookup': RestoreError._path_lookup_validator, - 'path_write': RestoreError._path_write_validator, - 'invalid_revision': RestoreError._invalid_revision_validator, - 'other': RestoreError._other_validator, +VideoMetadata._duration_validator = bv.Nullable(bv.UInt64()) +VideoMetadata._field_names_ = set(['duration']) +VideoMetadata._all_field_names_ = MediaMetadata._all_field_names_.union(VideoMetadata._field_names_) +VideoMetadata._fields_ = [('duration', VideoMetadata._duration_validator)] +VideoMetadata._all_fields_ = MediaMetadata._all_fields_ + VideoMetadata._fields_ + +WriteConflictError._file_validator = bv.Void() +WriteConflictError._folder_validator = bv.Void() +WriteConflictError._file_ancestor_validator = bv.Void() +WriteConflictError._other_validator = bv.Void() +WriteConflictError._tagmap = { + 'file': WriteConflictError._file_validator, + 'folder': WriteConflictError._folder_validator, + 'file_ancestor': WriteConflictError._file_ancestor_validator, + 'other': WriteConflictError._other_validator, } -RestoreError.invalid_revision = RestoreError('invalid_revision') -RestoreError.other = RestoreError('other') +WriteConflictError.file = WriteConflictError('file') +WriteConflictError.folder = WriteConflictError('folder') +WriteConflictError.file_ancestor = WriteConflictError('file_ancestor') +WriteConflictError.other = WriteConflictError('other') + +WriteError._malformed_path_validator = bv.Nullable(bv.String()) +WriteError._conflict_validator = bv.Union(WriteConflictError) +WriteError._no_write_permission_validator = bv.Void() +WriteError._insufficient_space_validator = bv.Void() +WriteError._disallowed_name_validator = bv.Void() +WriteError._other_validator = bv.Void() +WriteError._tagmap = { + 'malformed_path': WriteError._malformed_path_validator, + 'conflict': WriteError._conflict_validator, + 'no_write_permission': WriteError._no_write_permission_validator, + 'insufficient_space': WriteError._insufficient_space_validator, + 'disallowed_name': WriteError._disallowed_name_validator, + 'other': WriteError._other_validator, +} + +WriteError.no_write_permission = WriteError('no_write_permission') +WriteError.insufficient_space = WriteError('insufficient_space') +WriteError.disallowed_name = WriteError('disallowed_name') +WriteError.other = WriteError('other') + +WriteMode._add_validator = bv.Void() +WriteMode._overwrite_validator = bv.Void() +WriteMode._update_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') +WriteMode._tagmap = { + 'add': WriteMode._add_validator, + 'overwrite': WriteMode._overwrite_validator, + 'update': WriteMode._update_validator, +} + +WriteMode.add = WriteMode('add') +WriteMode.overwrite = WriteMode('overwrite') diff --git a/dropbox/rest.py b/dropbox/rest.py index ad9fb6e9..55f5a5dd 100644 --- a/dropbox/rest.py +++ b/dropbox/rest.py @@ -31,7 +31,7 @@ else: url_encode = urllib.urlencode -SDK_VERSION = "4.0.1" +SDK_VERSION = "5.0" TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt') diff --git a/dropbox/session.py b/dropbox/session.py index ac32f918..f42e5bbe 100644 --- a/dropbox/session.py +++ b/dropbox/session.py @@ -38,7 +38,6 @@ def pinned_session(pool_maxsize=8): import random import six -import sys import time import urllib diff --git a/dropbox/sharing.py b/dropbox/sharing.py index 9c43a2e7..fa8ac89a 100644 --- a/dropbox/sharing.py +++ b/dropbox/sharing.py @@ -1,7 +1,6 @@ # Auto-generated by BabelAPI, do not modify. """ -This namespace contains endpoints and data types for creating and managing shared links. -Additionally, this namespace contains endpoints for creating and managing shared folders. +This namespace contains endpoints and data types for creating and managing shared links and shared folders. """ try: @@ -16,48 +15,38 @@ async, files, team, + users, ) except (SystemError, ValueError): import async import files import team + import users -class Visibility(object): +class AccessLevel(object): """ - Who can access a shared link. The most open visibility is ``public``. The - default depends on many aspects, such as team and user preferences and - shared folder settings. + Defines the access levels for collaborators. This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar public: Anyone who has received the link can access it. No login - required. - :ivar team_only: Only members of the same team can access the link. Login is - required. - :ivar password: A link-specific password is required to access the link. - Login is not required. - :ivar team_and_password: Only members of the same team who have the - link-specific password can access the link. - :ivar shared_folder_only: Only members of the shared folder containing the - linked file can access the link. Login is required. - :ivar other: An unknown restriction is in place. + :ivar owner: The collaborator is the owner of the shared folder. Owners can + view and edit the shared folder as well as set the folder's policies + using update_folder_policy. + :ivar editor: The collaborator can both view and edit the shared folder. + :ivar viewer: The collaborator can only view the shared folder. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - public = None - # Attribute is overwritten below the class definition - team_only = None - # Attribute is overwritten below the class definition - password = None + owner = None # Attribute is overwritten below the class definition - team_and_password = None + editor = None # Attribute is overwritten below the class definition - shared_folder_only = None + viewer = None # Attribute is overwritten below the class definition other = None @@ -73,45 +62,92 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_public(self): + def is_owner(self): """ - Check if the union tag is ``public``. + Check if the union tag is ``owner``. :rtype: bool """ - return self._tag == 'public' + return self._tag == 'owner' - def is_team_only(self): + def is_editor(self): """ - Check if the union tag is ``team_only``. + Check if the union tag is ``editor``. :rtype: bool """ - return self._tag == 'team_only' + return self._tag == 'editor' - def is_password(self): + def is_viewer(self): """ - Check if the union tag is ``password``. + Check if the union tag is ``viewer``. :rtype: bool """ - return self._tag == 'password' + return self._tag == 'viewer' - def is_team_and_password(self): + def is_other(self): """ - Check if the union tag is ``team_and_password``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'team_and_password' + return self._tag == 'other' - def is_shared_folder_only(self): + def __repr__(self): + return 'AccessLevel(%r, %r)' % (self._tag, self._value) + +class AclUpdatePolicy(object): + """ + Policy governing who can change a shared folder's access control list (ACL). + In other words, who can add, remove, or change the privileges of members. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar owner: Only the owner can update the ACL. + :ivar editors: Any editor can update the ACL. This may be further restricted + to editors on the same team. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + owner = None + # Attribute is overwritten below the class definition + editors = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_owner(self): """ - Check if the union tag is ``shared_folder_only``. + Check if the union tag is ``owner``. :rtype: bool """ - return self._tag == 'shared_folder_only' + return self._tag == 'owner' + + def is_editors(self): + """ + Check if the union tag is ``editors``. + + :rtype: bool + """ + return self._tag == 'editors' def is_other(self): """ @@ -122,316 +158,197 @@ def is_other(self): return self._tag == 'other' def __repr__(self): - return 'Visibility(%r, %r)' % (self._tag, self._value) + return 'AclUpdatePolicy(%r, %r)' % (self._tag, self._value) -class LinkMetadata(object): +class AddFolderMemberArg(object): """ - Metadata for a shared link. This can be either a :class:`PathLinkMetadata` - or :class:`CollectionLinkMetadata`. - - :ivar url: URL of the shared link. - :ivar visibility: Who can access the link. - :ivar expires: Expiration time, if set. By default the link won't expire. + :ivar shared_folder_id: The ID for the shared folder. + :ivar members: The intended list of members to add. Added members will + receive invites to join the shared folder. + :ivar quiet: Whether added members should be notified via email and device + notifications of their invite. + :ivar custom_message: Optional message to display to added members in their + invitation. """ __slots__ = [ - '_url_value', - '_url_present', - '_visibility_value', - '_visibility_present', - '_expires_value', - '_expires_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + '_members_value', + '_members_present', + '_quiet_value', + '_quiet_present', + '_custom_message_value', + '_custom_message_present', ] _has_required_fields = True def __init__(self, - url=None, - visibility=None, - expires=None): - self._url_value = None - self._url_present = False - self._visibility_value = None - self._visibility_present = False - self._expires_value = None - self._expires_present = False - if url is not None: - self.url = url - if visibility is not None: - self.visibility = visibility - if expires is not None: - self.expires = expires + shared_folder_id=None, + members=None, + quiet=None, + custom_message=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._members_value = None + self._members_present = False + self._quiet_value = None + self._quiet_present = False + self._custom_message_value = None + self._custom_message_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if members is not None: + self.members = members + if quiet is not None: + self.quiet = quiet + if custom_message is not None: + self.custom_message = custom_message @property - def url(self): + def shared_folder_id(self): """ - URL of the shared link. + The ID for the shared folder. :rtype: str """ - if self._url_present: - return self._url_value + if self._shared_folder_id_present: + return self._shared_folder_id_value else: - raise AttributeError("missing required field 'url'") + raise AttributeError("missing required field 'shared_folder_id'") - @url.setter - def url(self, val): - val = self._url_validator.validate(val) - self._url_value = val - self._url_present = True + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True - @url.deleter - def url(self): - self._url_value = None - self._url_present = False + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False @property - def visibility(self): + def members(self): """ - Who can access the link. + The intended list of members to add. Added members will receive invites + to join the shared folder. - :rtype: Visibility + :rtype: list of [AddMember] """ - if self._visibility_present: - return self._visibility_value + if self._members_present: + return self._members_value else: - raise AttributeError("missing required field 'visibility'") + raise AttributeError("missing required field 'members'") - @visibility.setter - def visibility(self, val): - self._visibility_validator.validate_type_only(val) - self._visibility_value = val - self._visibility_present = True + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True - @visibility.deleter - def visibility(self): - self._visibility_value = None - self._visibility_present = False + @members.deleter + def members(self): + self._members_value = None + self._members_present = False @property - def expires(self): + def quiet(self): """ - Expiration time, if set. By default the link won't expire. + Whether added members should be notified via email and device + notifications of their invite. - :rtype: datetime.datetime + :rtype: bool """ - if self._expires_present: - return self._expires_value + if self._quiet_present: + return self._quiet_value else: - return None - - @expires.setter - def expires(self, val): - if val is None: - del self.expires - return - val = self._expires_validator.validate(val) - self._expires_value = val - self._expires_present = True + return False - @expires.deleter - def expires(self): - self._expires_value = None - self._expires_present = False - - def __repr__(self): - return 'LinkMetadata(url={!r}, visibility={!r}, expires={!r})'.format( - self._url_value, - self._visibility_value, - self._expires_value, - ) - -class PathLinkMetadata(LinkMetadata): - """ - Metadata for a path-based shared link. - - :ivar path: Path in user's Dropbox. - """ - - __slots__ = [ - '_path_value', - '_path_present', - ] - - _has_required_fields = True - - def __init__(self, - url=None, - visibility=None, - path=None, - expires=None): - super(PathLinkMetadata, self).__init__(url, - visibility, - expires) - self._path_value = None - self._path_present = False - if path is not None: - self.path = path - - @property - def path(self): - """ - Path in user's Dropbox. - - :rtype: str - """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") - - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True - - @path.deleter - def path(self): - self._path_value = None - self._path_present = False - - def __repr__(self): - return 'PathLinkMetadata(url={!r}, visibility={!r}, path={!r}, expires={!r})'.format( - self._url_value, - self._visibility_value, - self._path_value, - self._expires_value, - ) - -class CollectionLinkMetadata(LinkMetadata): - """ - Metadata for a collection-based shared link. - """ - - __slots__ = [ - ] - - _has_required_fields = True - - def __init__(self, - url=None, - visibility=None, - expires=None): - super(CollectionLinkMetadata, self).__init__(url, - visibility, - expires) - - def __repr__(self): - return 'CollectionLinkMetadata(url={!r}, visibility={!r}, expires={!r})'.format( - self._url_value, - self._visibility_value, - self._expires_value, - ) - -class GetSharedLinksArg(object): - """ - :ivar path: See get_shared_links description. - """ - - __slots__ = [ - '_path_value', - '_path_present', - ] - - _has_required_fields = False + @quiet.setter + def quiet(self, val): + val = self._quiet_validator.validate(val) + self._quiet_value = val + self._quiet_present = True - def __init__(self, - path=None): - self._path_value = None - self._path_present = False - if path is not None: - self.path = path + @quiet.deleter + def quiet(self): + self._quiet_value = None + self._quiet_present = False @property - def path(self): + def custom_message(self): """ - See get_shared_links description. + Optional message to display to added members in their invitation. :rtype: str """ - if self._path_present: - return self._path_value + if self._custom_message_present: + return self._custom_message_value else: return None - @path.setter - def path(self, val): + @custom_message.setter + def custom_message(self, val): if val is None: - del self.path + del self.custom_message return - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True - - @path.deleter - def path(self): - self._path_value = None - self._path_present = False - - def __repr__(self): - return 'GetSharedLinksArg(path={!r})'.format( - self._path_value, - ) - -class GetSharedLinksResult(object): - """ - :ivar links: Shared links applicable to the path argument. - """ - - __slots__ = [ - '_links_value', - '_links_present', - ] - - _has_required_fields = True - - def __init__(self, - links=None): - self._links_value = None - self._links_present = False - if links is not None: - self.links = links - - @property - def links(self): - """ - Shared links applicable to the path argument. - - :rtype: list of [LinkMetadata] - """ - if self._links_present: - return self._links_value - else: - raise AttributeError("missing required field 'links'") - - @links.setter - def links(self, val): - val = self._links_validator.validate(val) - self._links_value = val - self._links_present = True + val = self._custom_message_validator.validate(val) + self._custom_message_value = val + self._custom_message_present = True - @links.deleter - def links(self): - self._links_value = None - self._links_present = False + @custom_message.deleter + def custom_message(self): + self._custom_message_value = None + self._custom_message_present = False def __repr__(self): - return 'GetSharedLinksResult(links={!r})'.format( - self._links_value, + return 'AddFolderMemberArg(shared_folder_id={!r}, members={!r}, quiet={!r}, custom_message={!r})'.format( + self._shared_folder_id_value, + self._members_value, + self._quiet_value, + self._custom_message_value, ) -class GetSharedLinksError(object): +class AddFolderMemberError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar SharedFolderAccessError access_error: Unable to access shared folder. + :ivar email_unverified: The current account's e-mail address is unverified. + :ivar AddMemberSelectorError bad_member: ``AddFolderMemberArg.members`` + contains a bad invitation recipient. + :ivar no_permission: The current account does not have permission to perform + this action. + :ivar cant_share_outside_team: Your team policy does not allow sharing + outside of the team. + :ivar long too_many_members: The value is the member limit that was reached. + :ivar long too_many_pending_invites: The value is the pending invite limit + that was reached. + :ivar rate_limit: The user has reached the rate limit for invitations. + :ivar insufficient_plan: The current user's account doesn't support this + action. An example of this is when adding a read-only member. This + action can only be performed by users that have upgraded to a Pro or + Business plan. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + cant_share_outside_team = None + # Attribute is overwritten below the class definition + rate_limit = None + # Attribute is overwritten below the class definition + insufficient_plan = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -447,259 +364,120 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def path(cls, val): + def access_error(cls, val): """ - Create an instance of this class set to the ``path`` tag with value - ``val``. + Create an instance of this class set to the ``access_error`` tag with + value ``val``. - :param str val: - :rtype: GetSharedLinksError + :param SharedFolderAccessError val: + :rtype: AddFolderMemberError """ - return cls('path', val) + return cls('access_error', val) - def is_path(self): + @classmethod + def bad_member(cls, val): """ - Check if the union tag is ``path``. + Create an instance of this class set to the ``bad_member`` tag with + value ``val``. - :rtype: bool + :param AddMemberSelectorError val: + :rtype: AddFolderMemberError """ - return self._tag == 'path' + return cls('bad_member', val) - def is_other(self): + @classmethod + def too_many_members(cls, val): """ - Check if the union tag is ``other``. + Create an instance of this class set to the ``too_many_members`` tag + with value ``val``. - :rtype: bool + :param long val: + :rtype: AddFolderMemberError """ - return self._tag == 'other' + return cls('too_many_members', val) - def get_path(self): + @classmethod + def too_many_pending_invites(cls, val): """ - Only call this if :meth:`is_path` is true. + Create an instance of this class set to the ``too_many_pending_invites`` + tag with value ``val``. - :rtype: str + :param long val: + :rtype: AddFolderMemberError """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") - return self._value - - def __repr__(self): - return 'GetSharedLinksError(%r, %r)' % (self._tag, self._value) - -class PendingUploadMode(object): - """ - Flag to indicate pending upload default (for linking to not-yet-existing - paths). - - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar file: Assume pending uploads are files. - :ivar folder: Assume pending uploads are folders. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = None - # Attribute is overwritten below the class definition - file = None - # Attribute is overwritten below the class definition - folder = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + return cls('too_many_pending_invites', val) - def is_file(self): + def is_access_error(self): """ - Check if the union tag is ``file``. + Check if the union tag is ``access_error``. :rtype: bool """ - return self._tag == 'file' + return self._tag == 'access_error' - def is_folder(self): + def is_email_unverified(self): """ - Check if the union tag is ``folder``. + Check if the union tag is ``email_unverified``. :rtype: bool """ - return self._tag == 'folder' - - def __repr__(self): - return 'PendingUploadMode(%r, %r)' % (self._tag, self._value) - -class CreateSharedLinkArg(object): - """ - :ivar path: The path to share. - :ivar short_url: Whether to return a shortened URL. - :ivar pending_upload: If it's okay to share a path that does not yet exist, - set this to either ``PendingUploadMode.file`` or - ``PendingUploadMode.folder`` to indicate whether to assume it's a file - or folder. - """ - - __slots__ = [ - '_path_value', - '_path_present', - '_short_url_value', - '_short_url_present', - '_pending_upload_value', - '_pending_upload_present', - ] - - _has_required_fields = True - - def __init__(self, - path=None, - short_url=None, - pending_upload=None): - self._path_value = None - self._path_present = False - self._short_url_value = None - self._short_url_present = False - self._pending_upload_value = None - self._pending_upload_present = False - if path is not None: - self.path = path - if short_url is not None: - self.short_url = short_url - if pending_upload is not None: - self.pending_upload = pending_upload + return self._tag == 'email_unverified' - @property - def path(self): + def is_bad_member(self): """ - The path to share. + Check if the union tag is ``bad_member``. - :rtype: str + :rtype: bool """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") - - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True - - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + return self._tag == 'bad_member' - @property - def short_url(self): + def is_no_permission(self): """ - Whether to return a shortened URL. + Check if the union tag is ``no_permission``. :rtype: bool """ - if self._short_url_present: - return self._short_url_value - else: - return False - - @short_url.setter - def short_url(self, val): - val = self._short_url_validator.validate(val) - self._short_url_value = val - self._short_url_present = True - - @short_url.deleter - def short_url(self): - self._short_url_value = None - self._short_url_present = False + return self._tag == 'no_permission' - @property - def pending_upload(self): + def is_cant_share_outside_team(self): """ - If it's okay to share a path that does not yet exist, set this to either - ``PendingUploadMode.file`` or ``PendingUploadMode.folder`` to indicate - whether to assume it's a file or folder. + Check if the union tag is ``cant_share_outside_team``. - :rtype: PendingUploadMode + :rtype: bool """ - if self._pending_upload_present: - return self._pending_upload_value - else: - return None - - @pending_upload.setter - def pending_upload(self, val): - if val is None: - del self.pending_upload - return - self._pending_upload_validator.validate_type_only(val) - self._pending_upload_value = val - self._pending_upload_present = True - - @pending_upload.deleter - def pending_upload(self): - self._pending_upload_value = None - self._pending_upload_present = False - - def __repr__(self): - return 'CreateSharedLinkArg(path={!r}, short_url={!r}, pending_upload={!r})'.format( - self._path_value, - self._short_url_value, - self._pending_upload_value, - ) + return self._tag == 'cant_share_outside_team' -class CreateSharedLinkError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - """ + def is_too_many_members(self): + """ + Check if the union tag is ``too_many_members``. - __slots__ = ['_tag', '_value'] + :rtype: bool + """ + return self._tag == 'too_many_members' - _catch_all = 'other' - # Attribute is overwritten below the class definition - other = None + def is_too_many_pending_invites(self): + """ + Check if the union tag is ``too_many_pending_invites``. - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + :rtype: bool + """ + return self._tag == 'too_many_pending_invites' - @classmethod - def path(cls, val): + def is_rate_limit(self): """ - Create an instance of this class set to the ``path`` tag with value - ``val``. + Check if the union tag is ``rate_limit``. - :param files.LookupError val: - :rtype: CreateSharedLinkError + :rtype: bool """ - return cls('path', val) + return self._tag == 'rate_limit' - def is_path(self): + def is_insufficient_plan(self): """ - Check if the union tag is ``path``. + Check if the union tag is ``insufficient_plan``. :rtype: bool """ - return self._tag == 'path' + return self._tag == 'insufficient_plan' def is_other(self): """ @@ -709,87 +487,166 @@ def is_other(self): """ return self._tag == 'other' - def get_path(self): + def get_access_error(self): """ - Only call this if :meth:`is_path` is true. + Unable to access shared folder. - :rtype: files.LookupError + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError """ - if not self.is_path(): - raise AttributeError("tag 'path' not set") + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") return self._value - def __repr__(self): - return 'CreateSharedLinkError(%r, %r)' % (self._tag, self._value) - -class RevokeSharedLinkArg(object): + def get_bad_member(self): + """ + ``AddFolderMemberArg.members`` contains a bad invitation recipient. + + Only call this if :meth:`is_bad_member` is true. + + :rtype: AddMemberSelectorError + """ + if not self.is_bad_member(): + raise AttributeError("tag 'bad_member' not set") + return self._value + + def get_too_many_members(self): + """ + The value is the member limit that was reached. + + Only call this if :meth:`is_too_many_members` is true. + + :rtype: long + """ + if not self.is_too_many_members(): + raise AttributeError("tag 'too_many_members' not set") + return self._value + + def get_too_many_pending_invites(self): + """ + The value is the pending invite limit that was reached. + + Only call this if :meth:`is_too_many_pending_invites` is true. + + :rtype: long + """ + if not self.is_too_many_pending_invites(): + raise AttributeError("tag 'too_many_pending_invites' not set") + return self._value + + def __repr__(self): + return 'AddFolderMemberError(%r, %r)' % (self._tag, self._value) + +class AddMember(object): """ - :ivar url: URL of the shared link. + The member and type of access the member should have when added to a shared + folder. + + :ivar member: The member to add to the shared folder. + :ivar access_level: The access level to grant ``member`` to the shared + folder. ``AccessLevel.owner`` is disallowed. """ __slots__ = [ - '_url_value', - '_url_present', + '_member_value', + '_member_present', + '_access_level_value', + '_access_level_present', ] _has_required_fields = True def __init__(self, - url=None): - self._url_value = None - self._url_present = False - if url is not None: - self.url = url + member=None, + access_level=None): + self._member_value = None + self._member_present = False + self._access_level_value = None + self._access_level_present = False + if member is not None: + self.member = member + if access_level is not None: + self.access_level = access_level @property - def url(self): + def member(self): """ - URL of the shared link. + The member to add to the shared folder. - :rtype: str + :rtype: MemberSelector """ - if self._url_present: - return self._url_value + if self._member_present: + return self._member_value else: - raise AttributeError("missing required field 'url'") + raise AttributeError("missing required field 'member'") - @url.setter - def url(self, val): - val = self._url_validator.validate(val) - self._url_value = val - self._url_present = True + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True - @url.deleter - def url(self): - self._url_value = None - self._url_present = False + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def access_level(self): + """ + The access level to grant ``member`` to the shared folder. + ``AccessLevel.owner`` is disallowed. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + return AccessLevel.viewer + + @access_level.setter + def access_level(self, val): + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False def __repr__(self): - return 'RevokeSharedLinkArg(url={!r})'.format( - self._url_value, + return 'AddMember(member={!r}, access_level={!r})'.format( + self._member_value, + self._access_level_value, ) -class RevokeSharedLinkError(object): +class AddMemberSelectorError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar shared_link_malformed: Shared link is malformed. - :ivar shared_link_not_found: Shared link not found. - :ivar shared_link_access_denied: Shared link access denied. - :ivar other: An unspecified error. + :ivar str invalid_dropbox_id: The value is the ID that could not be + identified. + :ivar str invalid_email: The value is the e-email address that is malformed. + :ivar str unverified_dropbox_id: The value is the ID of the Dropbox user + with an unverified e-mail address. Invite unverified users by e-mail + address instead of by their Dropbox ID. + :ivar group_deleted: At least one of the specified groups in + ``AddFolderMemberArg.members`` is deleted. + :ivar group_not_on_team: Sharing to a group that is not on the current + account's team. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - shared_link_malformed = None - # Attribute is overwritten below the class definition - shared_link_not_found = None + group_deleted = None # Attribute is overwritten below the class definition - shared_link_access_denied = None + group_not_on_team = None # Attribute is overwritten below the class definition other = None @@ -805,103 +662,78 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_shared_link_malformed(self): + @classmethod + def invalid_dropbox_id(cls, val): """ - Check if the union tag is ``shared_link_malformed``. + Create an instance of this class set to the ``invalid_dropbox_id`` tag + with value ``val``. - :rtype: bool + :param str val: + :rtype: AddMemberSelectorError """ - return self._tag == 'shared_link_malformed' + return cls('invalid_dropbox_id', val) - def is_shared_link_not_found(self): + @classmethod + def invalid_email(cls, val): """ - Check if the union tag is ``shared_link_not_found``. + Create an instance of this class set to the ``invalid_email`` tag with + value ``val``. - :rtype: bool + :param str val: + :rtype: AddMemberSelectorError """ - return self._tag == 'shared_link_not_found' + return cls('invalid_email', val) - def is_shared_link_access_denied(self): + @classmethod + def unverified_dropbox_id(cls, val): """ - Check if the union tag is ``shared_link_access_denied``. + Create an instance of this class set to the ``unverified_dropbox_id`` + tag with value ``val``. - :rtype: bool + :param str val: + :rtype: AddMemberSelectorError """ - return self._tag == 'shared_link_access_denied' + return cls('unverified_dropbox_id', val) - def is_other(self): + def is_invalid_dropbox_id(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``invalid_dropbox_id``. :rtype: bool """ - return self._tag == 'other' - - def __repr__(self): - return 'RevokeSharedLinkError(%r, %r)' % (self._tag, self._value) - -class AccessLevel(object): - """ - Defines the access levels for collaborators. - - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar owner: The collaborator is the owner of the shared folder. Owners can - view and edit the shared folder as well as set the folder's policies - using update_folder_policy. - :ivar editor: The collaborator can both view and edit the shared folder. - :ivar viewer: The collaborator can only view the shared folder. - """ - - __slots__ = ['_tag', '_value'] + return self._tag == 'invalid_dropbox_id' - _catch_all = 'other' - # Attribute is overwritten below the class definition - owner = None - # Attribute is overwritten below the class definition - editor = None - # Attribute is overwritten below the class definition - viewer = None - # Attribute is overwritten below the class definition - other = None + def is_invalid_email(self): + """ + Check if the union tag is ``invalid_email``. - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + :rtype: bool + """ + return self._tag == 'invalid_email' - def is_owner(self): + def is_unverified_dropbox_id(self): """ - Check if the union tag is ``owner``. + Check if the union tag is ``unverified_dropbox_id``. :rtype: bool """ - return self._tag == 'owner' + return self._tag == 'unverified_dropbox_id' - def is_editor(self): + def is_group_deleted(self): """ - Check if the union tag is ``editor``. + Check if the union tag is ``group_deleted``. :rtype: bool """ - return self._tag == 'editor' + return self._tag == 'group_deleted' - def is_viewer(self): + def is_group_not_on_team(self): """ - Check if the union tag is ``viewer``. + Check if the union tag is ``group_not_on_team``. :rtype: bool """ - return self._tag == 'viewer' + return self._tag == 'group_not_on_team' def is_other(self): """ @@ -911,212 +743,319 @@ def is_other(self): """ return self._tag == 'other' - def __repr__(self): - return 'AccessLevel(%r, %r)' % (self._tag, self._value) + def get_invalid_dropbox_id(self): + """ + The value is the ID that could not be identified. -class FolderPolicy(object): - """ - A set of policies governing membership and privileges for a shared folder. + Only call this if :meth:`is_invalid_dropbox_id` is true. - :ivar member_policy: Who can be a member of this shared folder. Only set if - the user is a member of a team. - :ivar acl_update_policy: Who can add and remove members from this shared - folder. - :ivar shared_link_policy: Who links can be shared with. + :rtype: str + """ + if not self.is_invalid_dropbox_id(): + raise AttributeError("tag 'invalid_dropbox_id' not set") + return self._value + + def get_invalid_email(self): + """ + The value is the e-email address that is malformed. + + Only call this if :meth:`is_invalid_email` is true. + + :rtype: str + """ + if not self.is_invalid_email(): + raise AttributeError("tag 'invalid_email' not set") + return self._value + + def get_unverified_dropbox_id(self): + """ + The value is the ID of the Dropbox user with an unverified e-mail + address. Invite unverified users by e-mail address instead of by their + Dropbox ID. + + Only call this if :meth:`is_unverified_dropbox_id` is true. + + :rtype: str + """ + if not self.is_unverified_dropbox_id(): + raise AttributeError("tag 'unverified_dropbox_id' not set") + return self._value + + def __repr__(self): + return 'AddMemberSelectorError(%r, %r)' % (self._tag, self._value) + +class LinkMetadata(object): + """ + Metadata for a shared link. This can be either a :class:`PathLinkMetadata` + or :class:`CollectionLinkMetadata`. + + :ivar url: URL of the shared link. + :ivar visibility: Who can access the link. + :ivar expires: Expiration time, if set. By default the link won't expire. """ __slots__ = [ - '_member_policy_value', - '_member_policy_present', - '_acl_update_policy_value', - '_acl_update_policy_present', - '_shared_link_policy_value', - '_shared_link_policy_present', + '_url_value', + '_url_present', + '_visibility_value', + '_visibility_present', + '_expires_value', + '_expires_present', ] _has_required_fields = True def __init__(self, - acl_update_policy=None, - shared_link_policy=None, - member_policy=None): - self._member_policy_value = None - self._member_policy_present = False - self._acl_update_policy_value = None - self._acl_update_policy_present = False - self._shared_link_policy_value = None - self._shared_link_policy_present = False - if member_policy is not None: - self.member_policy = member_policy - if acl_update_policy is not None: - self.acl_update_policy = acl_update_policy - if shared_link_policy is not None: - self.shared_link_policy = shared_link_policy + url=None, + visibility=None, + expires=None): + self._url_value = None + self._url_present = False + self._visibility_value = None + self._visibility_present = False + self._expires_value = None + self._expires_present = False + if url is not None: + self.url = url + if visibility is not None: + self.visibility = visibility + if expires is not None: + self.expires = expires @property - def member_policy(self): + def url(self): """ - Who can be a member of this shared folder. Only set if the user is a - member of a team. + URL of the shared link. - :rtype: MemberPolicy + :rtype: str """ - if self._member_policy_present: - return self._member_policy_value + if self._url_present: + return self._url_value else: - return None + raise AttributeError("missing required field 'url'") - @member_policy.setter - def member_policy(self, val): - if val is None: - del self.member_policy - return - self._member_policy_validator.validate_type_only(val) - self._member_policy_value = val - self._member_policy_present = True + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True - @member_policy.deleter - def member_policy(self): - self._member_policy_value = None - self._member_policy_present = False + @url.deleter + def url(self): + self._url_value = None + self._url_present = False @property - def acl_update_policy(self): + def visibility(self): """ - Who can add and remove members from this shared folder. + Who can access the link. - :rtype: AclUpdatePolicy + :rtype: Visibility """ - if self._acl_update_policy_present: - return self._acl_update_policy_value + if self._visibility_present: + return self._visibility_value else: - raise AttributeError("missing required field 'acl_update_policy'") + raise AttributeError("missing required field 'visibility'") - @acl_update_policy.setter - def acl_update_policy(self, val): - self._acl_update_policy_validator.validate_type_only(val) - self._acl_update_policy_value = val - self._acl_update_policy_present = True + @visibility.setter + def visibility(self, val): + self._visibility_validator.validate_type_only(val) + self._visibility_value = val + self._visibility_present = True - @acl_update_policy.deleter - def acl_update_policy(self): - self._acl_update_policy_value = None - self._acl_update_policy_present = False + @visibility.deleter + def visibility(self): + self._visibility_value = None + self._visibility_present = False @property - def shared_link_policy(self): + def expires(self): """ - Who links can be shared with. + Expiration time, if set. By default the link won't expire. - :rtype: SharedLinkPolicy + :rtype: datetime.datetime """ - if self._shared_link_policy_present: - return self._shared_link_policy_value + if self._expires_present: + return self._expires_value else: - raise AttributeError("missing required field 'shared_link_policy'") + return None - @shared_link_policy.setter - def shared_link_policy(self, val): - self._shared_link_policy_validator.validate_type_only(val) - self._shared_link_policy_value = val - self._shared_link_policy_present = True + @expires.setter + def expires(self, val): + if val is None: + del self.expires + return + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True - @shared_link_policy.deleter - def shared_link_policy(self): - self._shared_link_policy_value = None - self._shared_link_policy_present = False + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False def __repr__(self): - return 'FolderPolicy(acl_update_policy={!r}, shared_link_policy={!r}, member_policy={!r})'.format( - self._acl_update_policy_value, - self._shared_link_policy_value, - self._member_policy_value, + return 'LinkMetadata(url={!r}, visibility={!r}, expires={!r})'.format( + self._url_value, + self._visibility_value, + self._expires_value, ) -class MemberPolicy(object): +class CollectionLinkMetadata(LinkMetadata): """ - Policy governing who can be a member of a shared folder. Only applicable to - folders owned by a user on a team. - - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar team: Only a teammate can become a member. - :ivar anyone: Anyone can become a member. + Metadata for a collection-based shared link. """ - __slots__ = ['_tag', '_value'] - - _catch_all = 'other' - # Attribute is overwritten below the class definition - team = None - # Attribute is overwritten below the class definition - anyone = None - # Attribute is overwritten below the class definition - other = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + __slots__ = [ + ] - def is_team(self): - """ - Check if the union tag is ``team``. + _has_required_fields = True - :rtype: bool - """ - return self._tag == 'team' + def __init__(self, + url=None, + visibility=None, + expires=None): + super(CollectionLinkMetadata, self).__init__(url, + visibility, + expires) - def is_anyone(self): - """ - Check if the union tag is ``anyone``. + def __repr__(self): + return 'CollectionLinkMetadata(url={!r}, visibility={!r}, expires={!r})'.format( + self._url_value, + self._visibility_value, + self._expires_value, + ) - :rtype: bool +class CreateSharedLinkArg(object): + """ + :ivar path: The path to share. + :ivar short_url: Whether to return a shortened URL. + :ivar pending_upload: If it's okay to share a path that does not yet exist, + set this to either ``PendingUploadMode.file`` or + ``PendingUploadMode.folder`` to indicate whether to assume it's a file + or folder. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_short_url_value', + '_short_url_present', + '_pending_upload_value', + '_pending_upload_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + short_url=None, + pending_upload=None): + self._path_value = None + self._path_present = False + self._short_url_value = None + self._short_url_present = False + self._pending_upload_value = None + self._pending_upload_present = False + if path is not None: + self.path = path + if short_url is not None: + self.short_url = short_url + if pending_upload is not None: + self.pending_upload = pending_upload + + @property + def path(self): """ - return self._tag == 'anyone' + The path to share. - def is_other(self): + :rtype: str """ - Check if the union tag is ``other``. + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def short_url(self): + """ + Whether to return a shortened URL. :rtype: bool """ - return self._tag == 'other' + if self._short_url_present: + return self._short_url_value + else: + return False + + @short_url.setter + def short_url(self, val): + val = self._short_url_validator.validate(val) + self._short_url_value = val + self._short_url_present = True + + @short_url.deleter + def short_url(self): + self._short_url_value = None + self._short_url_present = False + + @property + def pending_upload(self): + """ + If it's okay to share a path that does not yet exist, set this to either + ``PendingUploadMode.file`` or ``PendingUploadMode.folder`` to indicate + whether to assume it's a file or folder. + + :rtype: PendingUploadMode + """ + if self._pending_upload_present: + return self._pending_upload_value + else: + return None + + @pending_upload.setter + def pending_upload(self, val): + if val is None: + del self.pending_upload + return + self._pending_upload_validator.validate_type_only(val) + self._pending_upload_value = val + self._pending_upload_present = True + + @pending_upload.deleter + def pending_upload(self): + self._pending_upload_value = None + self._pending_upload_present = False def __repr__(self): - return 'MemberPolicy(%r, %r)' % (self._tag, self._value) + return 'CreateSharedLinkArg(path={!r}, short_url={!r}, pending_upload={!r})'.format( + self._path_value, + self._short_url_value, + self._pending_upload_value, + ) -class AclUpdatePolicy(object): +class CreateSharedLinkError(object): """ - Policy governing who can change a shared folder's access control list (ACL). - In other words, who can add, remove, or change the privileges of members. - This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - - :ivar owner: Only the owner can update the ACL. - :ivar editors: Any editor can update the ACL. This may be further restricted - to editors on the same team. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - owner = None - # Attribute is overwritten below the class definition - editors = None - # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -1131,21 +1070,24 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_owner(self): + @classmethod + def path(cls, val): """ - Check if the union tag is ``owner``. + Create an instance of this class set to the ``path`` tag with value + ``val``. - :rtype: bool + :param files.LookupError val: + :rtype: CreateSharedLinkError """ - return self._tag == 'owner' + return cls('path', val) - def is_editors(self): + def is_path(self): """ - Check if the union tag is ``editors``. + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'editors' + return self._tag == 'path' def is_other(self): """ @@ -1155,31 +1097,123 @@ def is_other(self): """ return self._tag == 'other' + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: files.LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + def __repr__(self): - return 'AclUpdatePolicy(%r, %r)' % (self._tag, self._value) + return 'CreateSharedLinkError(%r, %r)' % (self._tag, self._value) -class SharedLinkPolicy(object): +class CreateSharedLinkWithSettingsArg(object): """ - Policy governing who can view shared links. + :ivar path: The path to be shared by the shared link + :ivar settings: The requested settings for the newly created shared link + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_settings_value', + '_settings_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + settings=None): + self._path_value = None + self._path_present = False + self._settings_value = None + self._settings_present = False + if path is not None: + self.path = path + if settings is not None: + self.settings = settings + + @property + def path(self): + """ + The path to be shared by the shared link + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def settings(self): + """ + The requested settings for the newly created shared link + + :rtype: SharedLinkSettings + """ + if self._settings_present: + return self._settings_value + else: + return None + + @settings.setter + def settings(self, val): + if val is None: + del self.settings + return + self._settings_validator.validate_type_only(val) + self._settings_value = val + self._settings_present = True + + @settings.deleter + def settings(self): + self._settings_value = None + self._settings_present = False + + def __repr__(self): + return 'CreateSharedLinkWithSettingsArg(path={!r}, settings={!r})'.format( + self._path_value, + self._settings_value, + ) +class CreateSharedLinkWithSettingsError(object): + """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar anyone: Links can be shared with anyone. - :ivar members: Links can only be shared among members of the shared folder. - :ivar other: An unknown shared link policy. + :ivar email_not_verified: User's email should be verified + :ivar shared_link_already_exists: The shared link already exists + :ivar SharedLinkSettingsError settings_error: There is an error with the + given settings + :ivar access_denied: Access to the requested path is forbidden """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' + _catch_all = None # Attribute is overwritten below the class definition - anyone = None + email_not_verified = None # Attribute is overwritten below the class definition - members = None + shared_link_already_exists = None # Attribute is overwritten below the class definition - other = None + access_denied = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -1193,268 +1227,600 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_anyone(self): + @classmethod + def path(cls, val): """ - Check if the union tag is ``anyone``. + Create an instance of this class set to the ``path`` tag with value + ``val``. - :rtype: bool + :param files.LookupError val: + :rtype: CreateSharedLinkWithSettingsError """ - return self._tag == 'anyone' + return cls('path', val) - def is_members(self): + @classmethod + def settings_error(cls, val): """ - Check if the union tag is ``members``. + Create an instance of this class set to the ``settings_error`` tag with + value ``val``. + + :param SharedLinkSettingsError val: + :rtype: CreateSharedLinkWithSettingsError + """ + return cls('settings_error', val) + + def is_path(self): + """ + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'members' + return self._tag == 'path' - def is_other(self): + def is_email_not_verified(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``email_not_verified``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'email_not_verified' - def __repr__(self): - return 'SharedLinkPolicy(%r, %r)' % (self._tag, self._value) + def is_shared_link_already_exists(self): + """ + Check if the union tag is ``shared_link_already_exists``. -class MembershipInfo(object): - """ - The information about a member of the shared folder. + :rtype: bool + """ + return self._tag == 'shared_link_already_exists' - :ivar access_type: The access type for this member. - """ + def is_settings_error(self): + """ + Check if the union tag is ``settings_error``. - __slots__ = [ - '_access_type_value', - '_access_type_present', - ] + :rtype: bool + """ + return self._tag == 'settings_error' - _has_required_fields = True + def is_access_denied(self): + """ + Check if the union tag is ``access_denied``. - def __init__(self, - access_type=None): - self._access_type_value = None - self._access_type_present = False - if access_type is not None: - self.access_type = access_type + :rtype: bool + """ + return self._tag == 'access_denied' - @property - def access_type(self): + def get_path(self): """ - The access type for this member. + Only call this if :meth:`is_path` is true. - :rtype: AccessLevel + :rtype: files.LookupError """ - if self._access_type_present: - return self._access_type_value - else: - raise AttributeError("missing required field 'access_type'") + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value - @access_type.setter - def access_type(self, val): - self._access_type_validator.validate_type_only(val) - self._access_type_value = val - self._access_type_present = True + def get_settings_error(self): + """ + There is an error with the given settings - @access_type.deleter - def access_type(self): - self._access_type_value = None - self._access_type_present = False + Only call this if :meth:`is_settings_error` is true. + + :rtype: SharedLinkSettingsError + """ + if not self.is_settings_error(): + raise AttributeError("tag 'settings_error' not set") + return self._value def __repr__(self): - return 'MembershipInfo(access_type={!r})'.format( - self._access_type_value, - ) + return 'CreateSharedLinkWithSettingsError(%r, %r)' % (self._tag, self._value) -class UserInfo(object): +class SharedLinkMetadata(object): """ - Basic information about a user. Use users.get_account and - users.get_account_batch` to obtain more detailed information. + The metadata of a shared link - :ivar account_id: The account ID of the user. - :ivar same_team: If the user is in the same team as current user. - :ivar team_member_id: The team member ID of the shared folder member. Only - present if ``same_team`` is true. + :ivar url: URL of the shared link. + :ivar id: A unique identifier for the linked file. + :ivar name: The linked file name (including extension). This never contains + a slash. + :ivar expires: Expiration time, if set. By default the link won't expire. + :ivar path_lower: The lowercased full path in the user's Dropbox. This + always starts with a slash. This field will only be present only if the + linked file is in the authenticated user's dropbox. + :ivar link_permissions: The link's access permissions. + :ivar team_member_info: The team membership information of the link's owner. + This field will only be present if the link's owner is a team member. + :ivar content_owner_team_info: The team information of the content's owner. + This field will only be present if the content's owner is a team member + and the content's owner team is different from the link's owner team. """ __slots__ = [ - '_account_id_value', - '_account_id_present', - '_same_team_value', - '_same_team_present', - '_team_member_id_value', - '_team_member_id_present', + '_url_value', + '_url_present', + '_id_value', + '_id_present', + '_name_value', + '_name_present', + '_expires_value', + '_expires_present', + '_path_lower_value', + '_path_lower_present', + '_link_permissions_value', + '_link_permissions_present', + '_team_member_info_value', + '_team_member_info_present', + '_content_owner_team_info_value', + '_content_owner_team_info_present', ] _has_required_fields = True def __init__(self, - account_id=None, - same_team=None, - team_member_id=None): - self._account_id_value = None - self._account_id_present = False - self._same_team_value = None - self._same_team_present = False - self._team_member_id_value = None - self._team_member_id_present = False - if account_id is not None: - self.account_id = account_id - if same_team is not None: - self.same_team = same_team - if team_member_id is not None: - self.team_member_id = team_member_id + url=None, + name=None, + link_permissions=None, + id=None, + expires=None, + path_lower=None, + team_member_info=None, + content_owner_team_info=None): + self._url_value = None + self._url_present = False + self._id_value = None + self._id_present = False + self._name_value = None + self._name_present = False + self._expires_value = None + self._expires_present = False + self._path_lower_value = None + self._path_lower_present = False + self._link_permissions_value = None + self._link_permissions_present = False + self._team_member_info_value = None + self._team_member_info_present = False + self._content_owner_team_info_value = None + self._content_owner_team_info_present = False + if url is not None: + self.url = url + if id is not None: + self.id = id + if name is not None: + self.name = name + if expires is not None: + self.expires = expires + if path_lower is not None: + self.path_lower = path_lower + if link_permissions is not None: + self.link_permissions = link_permissions + if team_member_info is not None: + self.team_member_info = team_member_info + if content_owner_team_info is not None: + self.content_owner_team_info = content_owner_team_info @property - def account_id(self): + def url(self): """ - The account ID of the user. + URL of the shared link. :rtype: str """ - if self._account_id_present: - return self._account_id_value + if self._url_present: + return self._url_value else: - raise AttributeError("missing required field 'account_id'") + raise AttributeError("missing required field 'url'") - @account_id.setter - def account_id(self, val): - val = self._account_id_validator.validate(val) - self._account_id_value = val - self._account_id_present = True + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True - @account_id.deleter - def account_id(self): - self._account_id_value = None - self._account_id_present = False + @url.deleter + def url(self): + self._url_value = None + self._url_present = False @property - def same_team(self): + def id(self): """ - If the user is in the same team as current user. + A unique identifier for the linked file. - :rtype: bool + :rtype: str """ - if self._same_team_present: - return self._same_team_value + if self._id_present: + return self._id_value else: - raise AttributeError("missing required field 'same_team'") + return None - @same_team.setter - def same_team(self, val): - val = self._same_team_validator.validate(val) - self._same_team_value = val - self._same_team_present = True + @id.setter + def id(self, val): + if val is None: + del self.id + return + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True - @same_team.deleter - def same_team(self): - self._same_team_value = None - self._same_team_present = False + @id.deleter + def id(self): + self._id_value = None + self._id_present = False @property - def team_member_id(self): + def name(self): """ - The team member ID of the shared folder member. Only present if - ``same_team`` is true. + The linked file name (including extension). This never contains a slash. :rtype: str """ - if self._team_member_id_present: - return self._team_member_id_value + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def expires(self): + """ + Expiration time, if set. By default the link won't expire. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value else: return None - @team_member_id.setter - def team_member_id(self, val): + @expires.setter + def expires(self, val): if val is None: - del self.team_member_id + del self.expires return - val = self._team_member_id_validator.validate(val) - self._team_member_id_value = val - self._team_member_id_present = True + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True - @team_member_id.deleter - def team_member_id(self): - self._team_member_id_value = None - self._team_member_id_present = False + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False - def __repr__(self): - return 'UserInfo(account_id={!r}, same_team={!r}, team_member_id={!r})'.format( - self._account_id_value, - self._same_team_value, - self._team_member_id_value, - ) + @property + def path_lower(self): + """ + The lowercased full path in the user's Dropbox. This always starts with + a slash. This field will only be present only if the linked file is in + the authenticated user's dropbox. -class UserMembershipInfo(MembershipInfo): - """ - The information about a user member of the shared folder. + :rtype: str + """ + if self._path_lower_present: + return self._path_lower_value + else: + return None - :ivar user: The account information for the membership user. - """ + @path_lower.setter + def path_lower(self, val): + if val is None: + del self.path_lower + return + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True - __slots__ = [ - '_user_value', - '_user_present', - ] + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False - _has_required_fields = True + @property + def link_permissions(self): + """ + The link's access permissions. - def __init__(self, - access_type=None, - user=None): - super(UserMembershipInfo, self).__init__(access_type) - self._user_value = None - self._user_present = False - if user is not None: - self.user = user + :rtype: LinkPermissions + """ + if self._link_permissions_present: + return self._link_permissions_value + else: + raise AttributeError("missing required field 'link_permissions'") + + @link_permissions.setter + def link_permissions(self, val): + self._link_permissions_validator.validate_type_only(val) + self._link_permissions_value = val + self._link_permissions_present = True + + @link_permissions.deleter + def link_permissions(self): + self._link_permissions_value = None + self._link_permissions_present = False @property - def user(self): + def team_member_info(self): """ - The account information for the membership user. + The team membership information of the link's owner. This field will + only be present if the link's owner is a team member. - :rtype: UserInfo + :rtype: TeamMemberInfo """ - if self._user_present: - return self._user_value + if self._team_member_info_present: + return self._team_member_info_value else: - raise AttributeError("missing required field 'user'") + return None - @user.setter - def user(self, val): - self._user_validator.validate_type_only(val) - self._user_value = val - self._user_present = True + @team_member_info.setter + def team_member_info(self, val): + if val is None: + del self.team_member_info + return + self._team_member_info_validator.validate_type_only(val) + self._team_member_info_value = val + self._team_member_info_present = True - @user.deleter - def user(self): - self._user_value = None - self._user_present = False + @team_member_info.deleter + def team_member_info(self): + self._team_member_info_value = None + self._team_member_info_present = False + + @property + def content_owner_team_info(self): + """ + The team information of the content's owner. This field will only be + present if the content's owner is a team member and the content's owner + team is different from the link's owner team. + + :rtype: users.Team + """ + if self._content_owner_team_info_present: + return self._content_owner_team_info_value + else: + return None + + @content_owner_team_info.setter + def content_owner_team_info(self, val): + if val is None: + del self.content_owner_team_info + return + self._content_owner_team_info_validator.validate_type_only(val) + self._content_owner_team_info_value = val + self._content_owner_team_info_present = True + + @content_owner_team_info.deleter + def content_owner_team_info(self): + self._content_owner_team_info_value = None + self._content_owner_team_info_present = False def __repr__(self): - return 'UserMembershipInfo(access_type={!r}, user={!r})'.format( - self._access_type_value, - self._user_value, + return 'SharedLinkMetadata(url={!r}, name={!r}, link_permissions={!r}, id={!r}, expires={!r}, path_lower={!r}, team_member_info={!r}, content_owner_team_info={!r})'.format( + self._url_value, + self._name_value, + self._link_permissions_value, + self._id_value, + self._expires_value, + self._path_lower_value, + self._team_member_info_value, + self._content_owner_team_info_value, ) -class InviteeInfo(object): +class FileLinkMetadata(SharedLinkMetadata): """ - The information about a user invited to become a member a shared folder. + The metadata of a file shared link + + :ivar client_modified: The modification time set by the desktop client when + the file was added to Dropbox. Since this time is not verified (the + Dropbox server stores whatever the desktop client sends up), this should + only be used for display purposes (such as sorting) and not, for + example, to determine if a file has changed or not. + :ivar server_modified: The last time the file was modified on Dropbox. + :ivar rev: A unique identifier for the current revision of a file. This + field is the same rev as elsewhere in the API and can be used to detect + changes and avoid conflicts. + :ivar size: The file size in bytes. + """ + + __slots__ = [ + '_client_modified_value', + '_client_modified_present', + '_server_modified_value', + '_server_modified_present', + '_rev_value', + '_rev_present', + '_size_value', + '_size_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + name=None, + link_permissions=None, + client_modified=None, + server_modified=None, + rev=None, + size=None, + id=None, + expires=None, + path_lower=None, + team_member_info=None, + content_owner_team_info=None): + super(FileLinkMetadata, self).__init__(url, + name, + link_permissions, + id, + expires, + path_lower, + team_member_info, + content_owner_team_info) + self._client_modified_value = None + self._client_modified_present = False + self._server_modified_value = None + self._server_modified_present = False + self._rev_value = None + self._rev_present = False + self._size_value = None + self._size_present = False + if client_modified is not None: + self.client_modified = client_modified + if server_modified is not None: + self.server_modified = server_modified + if rev is not None: + self.rev = rev + if size is not None: + self.size = size + + @property + def client_modified(self): + """ + The modification time set by the desktop client when the file was added + to Dropbox. Since this time is not verified (the Dropbox server stores + whatever the desktop client sends up), this should only be used for + display purposes (such as sorting) and not, for example, to determine if + a file has changed or not. + + :rtype: datetime.datetime + """ + if self._client_modified_present: + return self._client_modified_value + else: + raise AttributeError("missing required field 'client_modified'") + + @client_modified.setter + def client_modified(self, val): + val = self._client_modified_validator.validate(val) + self._client_modified_value = val + self._client_modified_present = True + + @client_modified.deleter + def client_modified(self): + self._client_modified_value = None + self._client_modified_present = False + + @property + def server_modified(self): + """ + The last time the file was modified on Dropbox. + + :rtype: datetime.datetime + """ + if self._server_modified_present: + return self._server_modified_value + else: + raise AttributeError("missing required field 'server_modified'") + + @server_modified.setter + def server_modified(self, val): + val = self._server_modified_validator.validate(val) + self._server_modified_value = val + self._server_modified_present = True + + @server_modified.deleter + def server_modified(self): + self._server_modified_value = None + self._server_modified_present = False + + @property + def rev(self): + """ + A unique identifier for the current revision of a file. This field is + the same rev as elsewhere in the API and can be used to detect changes + and avoid conflicts. + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + raise AttributeError("missing required field 'rev'") + + @rev.setter + def rev(self, val): + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + @property + def size(self): + """ + The file size in bytes. + + :rtype: long + """ + if self._size_present: + return self._size_value + else: + raise AttributeError("missing required field 'size'") + + @size.setter + def size(self, val): + val = self._size_validator.validate(val) + self._size_value = val + self._size_present = True + + @size.deleter + def size(self): + self._size_value = None + self._size_present = False + + def __repr__(self): + return 'FileLinkMetadata(url={!r}, name={!r}, link_permissions={!r}, client_modified={!r}, server_modified={!r}, rev={!r}, size={!r}, id={!r}, expires={!r}, path_lower={!r}, team_member_info={!r}, content_owner_team_info={!r})'.format( + self._url_value, + self._name_value, + self._link_permissions_value, + self._client_modified_value, + self._server_modified_value, + self._rev_value, + self._size_value, + self._id_value, + self._expires_value, + self._path_lower_value, + self._team_member_info_value, + self._content_owner_team_info_value, + ) + +class FolderAction(object): + """ + Actions that may be taken on shared folders. This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar str email: E-mail address of invited user. + :ivar change_options: Change folder options, such as who can be invited to + join the folder. + :ivar edit_contents: Change or edit contents of the folder. + :ivar unmount: Unmount the folder. + :ivar unshare: Stop sharing this folder. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + change_options = None + # Attribute is overwritten below the class definition + edit_contents = None + # Attribute is overwritten below the class definition + unmount = None + # Attribute is overwritten below the class definition + unshare = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -1469,331 +1835,357 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def email(cls, val): + def is_change_options(self): """ - Create an instance of this class set to the ``email`` tag with value - ``val``. + Check if the union tag is ``change_options``. - :param str val: - :rtype: InviteeInfo + :rtype: bool """ - return cls('email', val) + return self._tag == 'change_options' - def is_email(self): + def is_edit_contents(self): """ - Check if the union tag is ``email``. + Check if the union tag is ``edit_contents``. :rtype: bool """ - return self._tag == 'email' + return self._tag == 'edit_contents' - def is_other(self): + def is_unmount(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``unmount``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'unmount' - def get_email(self): + def is_unshare(self): """ - E-mail address of invited user. + Check if the union tag is ``unshare``. - Only call this if :meth:`is_email` is true. + :rtype: bool + """ + return self._tag == 'unshare' - :rtype: str + def is_other(self): """ - if not self.is_email(): - raise AttributeError("tag 'email' not set") - return self._value + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' def __repr__(self): - return 'InviteeInfo(%r, %r)' % (self._tag, self._value) + return 'FolderAction(%r, %r)' % (self._tag, self._value) -class InviteeMembershipInfo(MembershipInfo): +class FolderLinkMetadata(SharedLinkMetadata): """ - The information about a user invited to become a member of a shared folder. - - :ivar invitee: The information for the invited user. + The metadata of a folder shared link """ __slots__ = [ - '_invitee_value', - '_invitee_present', ] _has_required_fields = True def __init__(self, - access_type=None, - invitee=None): - super(InviteeMembershipInfo, self).__init__(access_type) - self._invitee_value = None - self._invitee_present = False - if invitee is not None: - self.invitee = invitee - - @property - def invitee(self): - """ - The information for the invited user. - - :rtype: InviteeInfo - """ - if self._invitee_present: - return self._invitee_value - else: - raise AttributeError("missing required field 'invitee'") - - @invitee.setter - def invitee(self, val): - self._invitee_validator.validate_type_only(val) - self._invitee_value = val - self._invitee_present = True - - @invitee.deleter - def invitee(self): - self._invitee_value = None - self._invitee_present = False + url=None, + name=None, + link_permissions=None, + id=None, + expires=None, + path_lower=None, + team_member_info=None, + content_owner_team_info=None): + super(FolderLinkMetadata, self).__init__(url, + name, + link_permissions, + id, + expires, + path_lower, + team_member_info, + content_owner_team_info) def __repr__(self): - return 'InviteeMembershipInfo(access_type={!r}, invitee={!r})'.format( - self._access_type_value, - self._invitee_value, + return 'FolderLinkMetadata(url={!r}, name={!r}, link_permissions={!r}, id={!r}, expires={!r}, path_lower={!r}, team_member_info={!r}, content_owner_team_info={!r})'.format( + self._url_value, + self._name_value, + self._link_permissions_value, + self._id_value, + self._expires_value, + self._path_lower_value, + self._team_member_info_value, + self._content_owner_team_info_value, ) -class GroupInfo(team.GroupSummary): +class FolderPermission(object): """ - The information about a group. Groups is a way to manage a list of users - who need same access permission to the shared folder. + Whether the user is allowed to take the action on the shared folder. - :ivar same_team: If the group is owned by the current user's team. + :ivar action: The action that the user may wish to take on the folder. + :ivar allow: True if the user is allowed to take the action. + :ivar reason: The reason why the user is denied the permission. Not present + if the action is allowed """ __slots__ = [ - '_same_team_value', - '_same_team_present', + '_action_value', + '_action_present', + '_allow_value', + '_allow_present', + '_reason_value', + '_reason_present', ] _has_required_fields = True def __init__(self, - group_name=None, - group_id=None, - member_count=None, - same_team=None, - group_external_id=None): - super(GroupInfo, self).__init__(group_name, - group_id, - member_count, - group_external_id) - self._same_team_value = None - self._same_team_present = False - if same_team is not None: - self.same_team = same_team + action=None, + allow=None, + reason=None): + self._action_value = None + self._action_present = False + self._allow_value = None + self._allow_present = False + self._reason_value = None + self._reason_present = False + if action is not None: + self.action = action + if allow is not None: + self.allow = allow + if reason is not None: + self.reason = reason @property - def same_team(self): + def action(self): """ - If the group is owned by the current user's team. + The action that the user may wish to take on the folder. - :rtype: bool + :rtype: FolderAction """ - if self._same_team_present: - return self._same_team_value + if self._action_present: + return self._action_value else: - raise AttributeError("missing required field 'same_team'") - - @same_team.setter - def same_team(self, val): - val = self._same_team_validator.validate(val) - self._same_team_value = val - self._same_team_present = True - - @same_team.deleter - def same_team(self): - self._same_team_value = None - self._same_team_present = False + raise AttributeError("missing required field 'action'") - def __repr__(self): - return 'GroupInfo(group_name={!r}, group_id={!r}, member_count={!r}, same_team={!r}, group_external_id={!r})'.format( - self._group_name_value, - self._group_id_value, - self._member_count_value, - self._same_team_value, - self._group_external_id_value, - ) + @action.setter + def action(self, val): + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True -class GroupMembershipInfo(MembershipInfo): - """ - The information about a group member of the shared folder. + @action.deleter + def action(self): + self._action_value = None + self._action_present = False - :ivar group: The information about the membership group. - """ + @property + def allow(self): + """ + True if the user is allowed to take the action. - __slots__ = [ - '_group_value', - '_group_present', - ] + :rtype: bool + """ + if self._allow_present: + return self._allow_value + else: + raise AttributeError("missing required field 'allow'") - _has_required_fields = True + @allow.setter + def allow(self, val): + val = self._allow_validator.validate(val) + self._allow_value = val + self._allow_present = True - def __init__(self, - access_type=None, - group=None): - super(GroupMembershipInfo, self).__init__(access_type) - self._group_value = None - self._group_present = False - if group is not None: - self.group = group + @allow.deleter + def allow(self): + self._allow_value = None + self._allow_present = False @property - def group(self): + def reason(self): """ - The information about the membership group. + The reason why the user is denied the permission. Not present if the + action is allowed - :rtype: GroupInfo + :rtype: PermissionDeniedReason """ - if self._group_present: - return self._group_value + if self._reason_present: + return self._reason_value else: - raise AttributeError("missing required field 'group'") + return None - @group.setter - def group(self, val): - self._group_validator.validate_type_only(val) - self._group_value = val - self._group_present = True + @reason.setter + def reason(self, val): + if val is None: + del self.reason + return + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True - @group.deleter - def group(self): - self._group_value = None - self._group_present = False + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False def __repr__(self): - return 'GroupMembershipInfo(access_type={!r}, group={!r})'.format( - self._access_type_value, - self._group_value, + return 'FolderPermission(action={!r}, allow={!r}, reason={!r})'.format( + self._action_value, + self._allow_value, + self._reason_value, ) -class SharedFolderMetadata(object): +class FolderPolicy(object): """ - The metadata which includes basic information about the shared folder. + A set of policies governing membership and privileges for a shared folder. - :ivar path_lower: The lower-cased full path of this shared folder. Absent - for unmounted folders. - :ivar name: The name of the this shared folder. - :ivar shared_folder_id: The ID of the shared folder. - :ivar access_type: The current user's access level for this shared folder. - :ivar is_team_folder: Whether this folder is a `team folder - `_. - :ivar policy: Policies governing this shared folder. + :ivar member_policy: Who can be a member of this shared folder. Only set if + the user is a member of a team. + :ivar acl_update_policy: Who can add and remove members from this shared + folder. + :ivar shared_link_policy: Who links can be shared with. """ __slots__ = [ - '_path_lower_value', - '_path_lower_present', - '_name_value', - '_name_present', - '_shared_folder_id_value', - '_shared_folder_id_present', - '_access_type_value', - '_access_type_present', - '_is_team_folder_value', - '_is_team_folder_present', - '_policy_value', - '_policy_present', + '_member_policy_value', + '_member_policy_present', + '_acl_update_policy_value', + '_acl_update_policy_present', + '_shared_link_policy_value', + '_shared_link_policy_present', ] _has_required_fields = True def __init__(self, - name=None, - shared_folder_id=None, - access_type=None, - is_team_folder=None, - policy=None, - path_lower=None): - self._path_lower_value = None - self._path_lower_present = False - self._name_value = None - self._name_present = False - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._access_type_value = None - self._access_type_present = False - self._is_team_folder_value = None - self._is_team_folder_present = False - self._policy_value = None - self._policy_present = False - if path_lower is not None: - self.path_lower = path_lower - if name is not None: - self.name = name - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if access_type is not None: - self.access_type = access_type - if is_team_folder is not None: - self.is_team_folder = is_team_folder - if policy is not None: - self.policy = policy + acl_update_policy=None, + shared_link_policy=None, + member_policy=None): + self._member_policy_value = None + self._member_policy_present = False + self._acl_update_policy_value = None + self._acl_update_policy_present = False + self._shared_link_policy_value = None + self._shared_link_policy_present = False + if member_policy is not None: + self.member_policy = member_policy + if acl_update_policy is not None: + self.acl_update_policy = acl_update_policy + if shared_link_policy is not None: + self.shared_link_policy = shared_link_policy @property - def path_lower(self): + def member_policy(self): """ - The lower-cased full path of this shared folder. Absent for unmounted - folders. + Who can be a member of this shared folder. Only set if the user is a + member of a team. - :rtype: str + :rtype: MemberPolicy """ - if self._path_lower_present: - return self._path_lower_value + if self._member_policy_present: + return self._member_policy_value else: return None - @path_lower.setter - def path_lower(self, val): + @member_policy.setter + def member_policy(self, val): if val is None: - del self.path_lower + del self.member_policy return - val = self._path_lower_validator.validate(val) - self._path_lower_value = val - self._path_lower_present = True + self._member_policy_validator.validate_type_only(val) + self._member_policy_value = val + self._member_policy_present = True - @path_lower.deleter - def path_lower(self): - self._path_lower_value = None - self._path_lower_present = False + @member_policy.deleter + def member_policy(self): + self._member_policy_value = None + self._member_policy_present = False @property - def name(self): + def acl_update_policy(self): """ - The name of the this shared folder. + Who can add and remove members from this shared folder. - :rtype: str + :rtype: AclUpdatePolicy """ - if self._name_present: - return self._name_value + if self._acl_update_policy_present: + return self._acl_update_policy_value else: - raise AttributeError("missing required field 'name'") + raise AttributeError("missing required field 'acl_update_policy'") - @name.setter - def name(self, val): - val = self._name_validator.validate(val) - self._name_value = val - self._name_present = True + @acl_update_policy.setter + def acl_update_policy(self, val): + self._acl_update_policy_validator.validate_type_only(val) + self._acl_update_policy_value = val + self._acl_update_policy_present = True - @name.deleter - def name(self): - self._name_value = None - self._name_present = False + @acl_update_policy.deleter + def acl_update_policy(self): + self._acl_update_policy_value = None + self._acl_update_policy_present = False + + @property + def shared_link_policy(self): + """ + Who links can be shared with. + + :rtype: SharedLinkPolicy + """ + if self._shared_link_policy_present: + return self._shared_link_policy_value + else: + raise AttributeError("missing required field 'shared_link_policy'") + + @shared_link_policy.setter + def shared_link_policy(self, val): + self._shared_link_policy_validator.validate_type_only(val) + self._shared_link_policy_value = val + self._shared_link_policy_present = True + + @shared_link_policy.deleter + def shared_link_policy(self): + self._shared_link_policy_value = None + self._shared_link_policy_present = False + + def __repr__(self): + return 'FolderPolicy(acl_update_policy={!r}, shared_link_policy={!r}, member_policy={!r})'.format( + self._acl_update_policy_value, + self._shared_link_policy_value, + self._member_policy_value, + ) + +class GetMetadataArgs(object): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar actions: Folder actions to query. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + actions=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._actions_value = None + self._actions_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if actions is not None: + self.actions = actions @property def shared_folder_id(self): """ - The ID of the shared folder. + The ID for the shared folder. :rtype: str """ @@ -1814,119 +2206,56 @@ def shared_folder_id(self): self._shared_folder_id_present = False @property - def access_type(self): - """ - The current user's access level for this shared folder. - - :rtype: AccessLevel - """ - if self._access_type_present: - return self._access_type_value - else: - raise AttributeError("missing required field 'access_type'") - - @access_type.setter - def access_type(self, val): - self._access_type_validator.validate_type_only(val) - self._access_type_value = val - self._access_type_present = True - - @access_type.deleter - def access_type(self): - self._access_type_value = None - self._access_type_present = False - - @property - def is_team_folder(self): - """ - Whether this folder is a `team folder - `_. - - :rtype: bool - """ - if self._is_team_folder_present: - return self._is_team_folder_value - else: - raise AttributeError("missing required field 'is_team_folder'") - - @is_team_folder.setter - def is_team_folder(self, val): - val = self._is_team_folder_validator.validate(val) - self._is_team_folder_value = val - self._is_team_folder_present = True - - @is_team_folder.deleter - def is_team_folder(self): - self._is_team_folder_value = None - self._is_team_folder_present = False - - @property - def policy(self): + def actions(self): """ - Policies governing this shared folder. + Folder actions to query. - :rtype: FolderPolicy + :rtype: list of [FolderAction] """ - if self._policy_present: - return self._policy_value + if self._actions_present: + return self._actions_value else: - raise AttributeError("missing required field 'policy'") + return None - @policy.setter - def policy(self, val): - self._policy_validator.validate_type_only(val) - self._policy_value = val - self._policy_present = True + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True - @policy.deleter - def policy(self): - self._policy_value = None - self._policy_present = False + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False def __repr__(self): - return 'SharedFolderMetadata(name={!r}, shared_folder_id={!r}, access_type={!r}, is_team_folder={!r}, policy={!r}, path_lower={!r})'.format( - self._name_value, + return 'GetMetadataArgs(shared_folder_id={!r}, actions={!r})'.format( self._shared_folder_id_value, - self._access_type_value, - self._is_team_folder_value, - self._policy_value, - self._path_lower_value, + self._actions_value, ) -class SharedFolderAccessError(object): +class SharedLinkError(object): """ - There is an error accessing the shared folder. - This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar invalid_id: This shared folder ID is invalid. - :ivar not_a_member: The user is not a member of the shared folder thus - cannot access it. - :ivar no_permission: The current user does not have sufficient privileges to - perform the desired action. - :ivar email_unverified: The current account's e-mail address is unverified. - :ivar team_folder: The current user cannot perform this action on a team - shared folder. - :ivar unmounted: The shared folder is unmounted. + :ivar shared_link_not_found: The shared link wasn't found + :ivar shared_link_access_denied: The caller is not allowed to access this + shared link + :ivar other: An unspecified error """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - invalid_id = None - # Attribute is overwritten below the class definition - not_a_member = None - # Attribute is overwritten below the class definition - no_permission = None - # Attribute is overwritten below the class definition - email_unverified = None - # Attribute is overwritten below the class definition - team_folder = None + shared_link_not_found = None # Attribute is overwritten below the class definition - unmounted = None + shared_link_access_denied = None # Attribute is overwritten below the class definition other = None @@ -1942,219 +2271,254 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_invalid_id(self): + def is_shared_link_not_found(self): """ - Check if the union tag is ``invalid_id``. + Check if the union tag is ``shared_link_not_found``. :rtype: bool """ - return self._tag == 'invalid_id' + return self._tag == 'shared_link_not_found' - def is_not_a_member(self): + def is_shared_link_access_denied(self): """ - Check if the union tag is ``not_a_member``. + Check if the union tag is ``shared_link_access_denied``. :rtype: bool """ - return self._tag == 'not_a_member' + return self._tag == 'shared_link_access_denied' - def is_no_permission(self): + def is_other(self): """ - Check if the union tag is ``no_permission``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'no_permission' + return self._tag == 'other' - def is_email_unverified(self): - """ - Check if the union tag is ``email_unverified``. + def __repr__(self): + return 'SharedLinkError(%r, %r)' % (self._tag, self._value) - :rtype: bool - """ - return self._tag == 'email_unverified' +class GetSharedLinkFileError(SharedLinkError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. - def is_team_folder(self): - """ - Check if the union tag is ``team_folder``. + :ivar shared_link_is_directory: Directories cannot be retrieved by this + endpoint. + """ - :rtype: bool - """ - return self._tag == 'team_folder' + __slots__ = ['_tag', '_value'] - def is_unmounted(self): - """ - Check if the union tag is ``unmounted``. + # Attribute is overwritten below the class definition + shared_link_is_directory = None - :rtype: bool - """ - return self._tag == 'unmounted' + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value - def is_other(self): + def is_shared_link_is_directory(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``shared_link_is_directory``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'shared_link_is_directory' def __repr__(self): - return 'SharedFolderAccessError(%r, %r)' % (self._tag, self._value) + return 'GetSharedLinkFileError(%r, %r)' % (self._tag, self._value) -class ListFoldersResult(object): +class GetSharedLinkMetadataArg(object): """ - Result for list_folders. Unmounted shared folders can be identified by the - absence of ``SharedFolderMetadata.path_lower``. - - :ivar entries: List of all shared folders the authenticated user has access - to. - :ivar cursor: Present if there are additional shared folders that have not - been returned yet. Pass the cursor into list_folders/continue to list - additional folders. + :ivar url: URL of the shared link. + :ivar path: If the shared link is to a folder, this parameter can be used to + retrieve the metadata for a specific file or sub-folder in this folder. + A relative path should be used. + :ivar link_password: If the shared link has a password, this parameter can + be used. """ __slots__ = [ - '_entries_value', - '_entries_present', - '_cursor_value', - '_cursor_present', + '_url_value', + '_url_present', + '_path_value', + '_path_present', + '_link_password_value', + '_link_password_present', ] _has_required_fields = True def __init__(self, - entries=None, - cursor=None): - self._entries_value = None - self._entries_present = False - self._cursor_value = None - self._cursor_present = False - if entries is not None: - self.entries = entries - if cursor is not None: - self.cursor = cursor + url=None, + path=None, + link_password=None): + self._url_value = None + self._url_present = False + self._path_value = None + self._path_present = False + self._link_password_value = None + self._link_password_present = False + if url is not None: + self.url = url + if path is not None: + self.path = path + if link_password is not None: + self.link_password = link_password @property - def entries(self): + def url(self): """ - List of all shared folders the authenticated user has access to. + URL of the shared link. - :rtype: list of [SharedFolderMetadata] + :rtype: str """ - if self._entries_present: - return self._entries_value + if self._url_present: + return self._url_value else: - raise AttributeError("missing required field 'entries'") + raise AttributeError("missing required field 'url'") - @entries.setter - def entries(self, val): - val = self._entries_validator.validate(val) - self._entries_value = val - self._entries_present = True + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True - @entries.deleter - def entries(self): - self._entries_value = None - self._entries_present = False + @url.deleter + def url(self): + self._url_value = None + self._url_present = False @property - def cursor(self): + def path(self): """ - Present if there are additional shared folders that have not been - returned yet. Pass the cursor into list_folders/continue to list - additional folders. + If the shared link is to a folder, this parameter can be used to + retrieve the metadata for a specific file or sub-folder in this folder. + A relative path should be used. :rtype: str """ - if self._cursor_present: - return self._cursor_value + if self._path_present: + return self._path_value else: return None - @cursor.setter - def cursor(self, val): + @path.setter + def path(self, val): if val is None: - del self.cursor + del self.path return - val = self._cursor_validator.validate(val) - self._cursor_value = val - self._cursor_present = True + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def link_password(self): + """ + If the shared link has a password, this parameter can be used. + + :rtype: str + """ + if self._link_password_present: + return self._link_password_value + else: + return None + + @link_password.setter + def link_password(self, val): + if val is None: + del self.link_password + return + val = self._link_password_validator.validate(val) + self._link_password_value = val + self._link_password_present = True + + @link_password.deleter + def link_password(self): + self._link_password_value = None + self._link_password_present = False def __repr__(self): - return 'ListFoldersResult(entries={!r}, cursor={!r})'.format( - self._entries_value, - self._cursor_value, + return 'GetSharedLinkMetadataArg(url={!r}, path={!r}, link_password={!r})'.format( + self._url_value, + self._path_value, + self._link_password_value, ) -class ListFoldersContinueArg(object): +class GetSharedLinksArg(object): """ - :ivar cursor: The cursor returned by your last call to list_folders or - list_folders/continue. + :ivar path: See get_shared_links description. """ __slots__ = [ - '_cursor_value', - '_cursor_present', + '_path_value', + '_path_present', ] - _has_required_fields = True + _has_required_fields = False def __init__(self, - cursor=None): - self._cursor_value = None - self._cursor_present = False - if cursor is not None: - self.cursor = cursor + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path @property - def cursor(self): + def path(self): """ - The cursor returned by your last call to list_folders or - list_folders/continue. + See get_shared_links description. :rtype: str """ - if self._cursor_present: - return self._cursor_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'cursor'") + return None - @cursor.setter - def cursor(self, val): - val = self._cursor_validator.validate(val) - self._cursor_value = val - self._cursor_present = True + @path.setter + def path(self, val): + if val is None: + del self.path + return + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False def __repr__(self): - return 'ListFoldersContinueArg(cursor={!r})'.format( - self._cursor_value, + return 'GetSharedLinksArg(path={!r})'.format( + self._path_value, ) -class ListFoldersContinueError(object): +class GetSharedLinksError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - - :ivar invalid_cursor: ``ListFoldersContinueArg.cursor`` is invalid. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - invalid_cursor = None - # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -2169,13 +2533,24 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_invalid_cursor(self): + @classmethod + def path(cls, val): """ - Check if the union tag is ``invalid_cursor``. + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param str val: + :rtype: GetSharedLinksError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'invalid_cursor' + return self._tag == 'path' def is_other(self): """ @@ -2185,323 +2560,406 @@ def is_other(self): """ return self._tag == 'other' + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: str + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + def __repr__(self): - return 'ListFoldersContinueError(%r, %r)' % (self._tag, self._value) + return 'GetSharedLinksError(%r, %r)' % (self._tag, self._value) -class GetMetadataArgs(object): +class GetSharedLinksResult(object): """ - :ivar shared_folder_id: The ID for the shared folder. + :ivar links: Shared links applicable to the path argument. """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', + '_links_value', + '_links_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id + links=None): + self._links_value = None + self._links_present = False + if links is not None: + self.links = links @property - def shared_folder_id(self): + def links(self): """ - The ID for the shared folder. + Shared links applicable to the path argument. - :rtype: str + :rtype: list of [LinkMetadata] """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._links_present: + return self._links_value else: - raise AttributeError("missing required field 'shared_folder_id'") + raise AttributeError("missing required field 'links'") - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @links.setter + def links(self, val): + val = self._links_validator.validate(val) + self._links_value = val + self._links_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + @links.deleter + def links(self): + self._links_value = None + self._links_present = False def __repr__(self): - return 'GetMetadataArgs(shared_folder_id={!r})'.format( - self._shared_folder_id_value, + return 'GetSharedLinksResult(links={!r})'.format( + self._links_value, ) -class ListFolderMembersArgs(object): +class GroupInfo(team.GroupSummary): """ - :ivar shared_folder_id: The ID for the shared folder. + The information about a group. Groups is a way to manage a list of users + who need same access permission to the shared folder. + + :ivar same_team: If the group is owned by the current user's team. """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', + '_same_team_value', + '_same_team_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id + group_name=None, + group_id=None, + member_count=None, + same_team=None, + group_external_id=None): + super(GroupInfo, self).__init__(group_name, + group_id, + member_count, + group_external_id) + self._same_team_value = None + self._same_team_present = False + if same_team is not None: + self.same_team = same_team @property - def shared_folder_id(self): + def same_team(self): """ - The ID for the shared folder. + If the group is owned by the current user's team. - :rtype: str + :rtype: bool """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._same_team_present: + return self._same_team_value else: - raise AttributeError("missing required field 'shared_folder_id'") + raise AttributeError("missing required field 'same_team'") - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @same_team.setter + def same_team(self, val): + val = self._same_team_validator.validate(val) + self._same_team_value = val + self._same_team_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + @same_team.deleter + def same_team(self): + self._same_team_value = None + self._same_team_present = False def __repr__(self): - return 'ListFolderMembersArgs(shared_folder_id={!r})'.format( - self._shared_folder_id_value, + return 'GroupInfo(group_name={!r}, group_id={!r}, member_count={!r}, same_team={!r}, group_external_id={!r})'.format( + self._group_name_value, + self._group_id_value, + self._member_count_value, + self._same_team_value, + self._group_external_id_value, ) -class SharedFolderMembers(object): +class MembershipInfo(object): """ - Shared folder user and group membership. + The information about a member of the shared folder. - :ivar users: The list of user members of the shared folder. - :ivar groups: The list of group members of the shared folder. - :ivar invitees: The list of invited members of the shared folder. This list - will not include invitees that have already accepted or declined to join - the shared folder. - :ivar cursor: Present if there are additional shared folder members that - have not been returned yet. Pass the cursor into - list_folder_members/continue to list additional members. + :ivar access_type: The access type for this member. + :ivar permissions: The permissions that requesting user has on this member. + The set of permissions corresponds to the MemberActions in the request. """ __slots__ = [ - '_users_value', - '_users_present', - '_groups_value', - '_groups_present', - '_invitees_value', - '_invitees_present', - '_cursor_value', - '_cursor_present', + '_access_type_value', + '_access_type_present', + '_permissions_value', + '_permissions_present', ] _has_required_fields = True def __init__(self, - users=None, - groups=None, - invitees=None, - cursor=None): - self._users_value = None - self._users_present = False - self._groups_value = None - self._groups_present = False - self._invitees_value = None - self._invitees_present = False - self._cursor_value = None - self._cursor_present = False - if users is not None: - self.users = users - if groups is not None: - self.groups = groups - if invitees is not None: - self.invitees = invitees - if cursor is not None: - self.cursor = cursor + access_type=None, + permissions=None): + self._access_type_value = None + self._access_type_present = False + self._permissions_value = None + self._permissions_present = False + if access_type is not None: + self.access_type = access_type + if permissions is not None: + self.permissions = permissions @property - def users(self): + def access_type(self): """ - The list of user members of the shared folder. + The access type for this member. - :rtype: list of [UserMembershipInfo] + :rtype: AccessLevel """ - if self._users_present: - return self._users_value + if self._access_type_present: + return self._access_type_value else: - raise AttributeError("missing required field 'users'") + raise AttributeError("missing required field 'access_type'") - @users.setter - def users(self, val): - val = self._users_validator.validate(val) - self._users_value = val - self._users_present = True + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True - @users.deleter - def users(self): - self._users_value = None - self._users_present = False + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False @property - def groups(self): + def permissions(self): """ - The list of group members of the shared folder. + The permissions that requesting user has on this member. The set of + permissions corresponds to the MemberActions in the request. - :rtype: list of [GroupMembershipInfo] + :rtype: list of [MemberPermission] """ - if self._groups_present: - return self._groups_value + if self._permissions_present: + return self._permissions_value else: - raise AttributeError("missing required field 'groups'") + return None - @groups.setter - def groups(self, val): - val = self._groups_validator.validate(val) - self._groups_value = val - self._groups_present = True + @permissions.setter + def permissions(self, val): + if val is None: + del self.permissions + return + val = self._permissions_validator.validate(val) + self._permissions_value = val + self._permissions_present = True - @groups.deleter - def groups(self): - self._groups_value = None - self._groups_present = False + @permissions.deleter + def permissions(self): + self._permissions_value = None + self._permissions_present = False - @property - def invitees(self): - """ - The list of invited members of the shared folder. This list will not - include invitees that have already accepted or declined to join the - shared folder. + def __repr__(self): + return 'MembershipInfo(access_type={!r}, permissions={!r})'.format( + self._access_type_value, + self._permissions_value, + ) - :rtype: list of [InviteeMembershipInfo] - """ - if self._invitees_present: - return self._invitees_value - else: - raise AttributeError("missing required field 'invitees'") +class GroupMembershipInfo(MembershipInfo): + """ + The information about a group member of the shared folder. - @invitees.setter - def invitees(self, val): - val = self._invitees_validator.validate(val) - self._invitees_value = val - self._invitees_present = True + :ivar group: The information about the membership group. + """ - @invitees.deleter - def invitees(self): - self._invitees_value = None - self._invitees_present = False + __slots__ = [ + '_group_value', + '_group_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + group=None, + permissions=None): + super(GroupMembershipInfo, self).__init__(access_type, + permissions) + self._group_value = None + self._group_present = False + if group is not None: + self.group = group @property - def cursor(self): + def group(self): """ - Present if there are additional shared folder members that have not been - returned yet. Pass the cursor into list_folder_members/continue to list - additional members. + The information about the membership group. - :rtype: str + :rtype: GroupInfo """ - if self._cursor_present: - return self._cursor_value + if self._group_present: + return self._group_value else: - return None + raise AttributeError("missing required field 'group'") - @cursor.setter - def cursor(self, val): - if val is None: - del self.cursor - return - val = self._cursor_validator.validate(val) - self._cursor_value = val - self._cursor_present = True + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False + @group.deleter + def group(self): + self._group_value = None + self._group_present = False def __repr__(self): - return 'SharedFolderMembers(users={!r}, groups={!r}, invitees={!r}, cursor={!r})'.format( - self._users_value, - self._groups_value, - self._invitees_value, - self._cursor_value, + return 'GroupMembershipInfo(access_type={!r}, group={!r}, permissions={!r})'.format( + self._access_type_value, + self._group_value, + self._permissions_value, ) -class ListFolderMembersContinueArg(object): +class InviteeInfo(object): """ - :ivar cursor: The cursor returned by your last call to list_folder_members - or list_folder_members/continue. + The information about a user invited to become a member a shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str email: E-mail address of invited user. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def email(cls, val): + """ + Create an instance of this class set to the ``email`` tag with value + ``val``. + + :param str val: + :rtype: InviteeInfo + """ + return cls('email', val) + + def is_email(self): + """ + Check if the union tag is ``email``. + + :rtype: bool + """ + return self._tag == 'email' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_email(self): + """ + E-mail address of invited user. + + Only call this if :meth:`is_email` is true. + + :rtype: str + """ + if not self.is_email(): + raise AttributeError("tag 'email' not set") + return self._value + + def __repr__(self): + return 'InviteeInfo(%r, %r)' % (self._tag, self._value) + +class InviteeMembershipInfo(MembershipInfo): + """ + The information about a user invited to become a member of a shared folder. + + :ivar invitee: The information for the invited user. """ __slots__ = [ - '_cursor_value', - '_cursor_present', + '_invitee_value', + '_invitee_present', ] _has_required_fields = True def __init__(self, - cursor=None): - self._cursor_value = None - self._cursor_present = False - if cursor is not None: - self.cursor = cursor + access_type=None, + invitee=None, + permissions=None): + super(InviteeMembershipInfo, self).__init__(access_type, + permissions) + self._invitee_value = None + self._invitee_present = False + if invitee is not None: + self.invitee = invitee @property - def cursor(self): + def invitee(self): """ - The cursor returned by your last call to list_folder_members or - list_folder_members/continue. + The information for the invited user. - :rtype: str + :rtype: InviteeInfo """ - if self._cursor_present: - return self._cursor_value + if self._invitee_present: + return self._invitee_value else: - raise AttributeError("missing required field 'cursor'") + raise AttributeError("missing required field 'invitee'") - @cursor.setter - def cursor(self, val): - val = self._cursor_validator.validate(val) - self._cursor_value = val - self._cursor_present = True + @invitee.setter + def invitee(self, val): + self._invitee_validator.validate_type_only(val) + self._invitee_value = val + self._invitee_present = True - @cursor.deleter - def cursor(self): - self._cursor_value = None - self._cursor_present = False + @invitee.deleter + def invitee(self): + self._invitee_value = None + self._invitee_present = False def __repr__(self): - return 'ListFolderMembersContinueArg(cursor={!r})'.format( - self._cursor_value, + return 'InviteeMembershipInfo(access_type={!r}, invitee={!r}, permissions={!r})'.format( + self._access_type_value, + self._invitee_value, + self._permissions_value, ) -class ListFolderMembersContinueError(object): +class JobError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - - :ivar invalid_cursor: ``ListFolderMembersContinueArg.cursor`` is invalid. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - invalid_cursor = None - # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -2523,10 +2981,21 @@ def access_error(cls, val): value ``val``. :param SharedFolderAccessError val: - :rtype: ListFolderMembersContinueError + :rtype: JobError """ return cls('access_error', val) + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param SharedFolderMemberError val: + :rtype: JobError + """ + return cls('member_error', val) + def is_access_error(self): """ Check if the union tag is ``access_error``. @@ -2535,13 +3004,13 @@ def is_access_error(self): """ return self._tag == 'access_error' - def is_invalid_cursor(self): + def is_member_error(self): """ - Check if the union tag is ``invalid_cursor``. + Check if the union tag is ``member_error``. :rtype: bool """ - return self._tag == 'invalid_cursor' + return self._tag == 'member_error' def is_other(self): """ @@ -2561,316 +3030,403 @@ def get_access_error(self): raise AttributeError("tag 'access_error' not set") return self._value + def get_member_error(self): + """ + Only call this if :meth:`is_member_error` is true. + + :rtype: SharedFolderMemberError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value + def __repr__(self): - return 'ListFolderMembersContinueError(%r, %r)' % (self._tag, self._value) + return 'JobError(%r, %r)' % (self._tag, self._value) -class ShareFolderArg(object): +class JobStatus(async.PollResultBase): """ - :ivar path: The path to the folder to share. If it does not exist, then a - new one is created. - :ivar member_policy: Who can be a member of this shared folder. - :ivar acl_update_policy: Who can add and remove members of this shared - folder. - :ivar shared_link_policy: The policy to apply to shared links created for - content inside this shared folder. - :ivar force_async: Whether to force the share to happen asynchronously. + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar complete: The asynchronous job has finished. + :ivar JobError failed: The asynchronous job returned an error. """ - __slots__ = [ - '_path_value', - '_path_present', - '_member_policy_value', - '_member_policy_present', - '_acl_update_policy_value', - '_acl_update_policy_present', - '_shared_link_policy_value', - '_shared_link_policy_present', - '_force_async_value', - '_force_async_present', - ] + __slots__ = ['_tag', '_value'] - _has_required_fields = True + # Attribute is overwritten below the class definition + complete = None - def __init__(self, - path=None, - member_policy=None, - acl_update_policy=None, - shared_link_policy=None, - force_async=None): - self._path_value = None - self._path_present = False - self._member_policy_value = None - self._member_policy_present = False - self._acl_update_policy_value = None - self._acl_update_policy_present = False - self._shared_link_policy_value = None - self._shared_link_policy_present = False - self._force_async_value = None - self._force_async_present = False - if path is not None: - self.path = path - if member_policy is not None: - self.member_policy = member_policy - if acl_update_policy is not None: - self.acl_update_policy = acl_update_policy - if shared_link_policy is not None: - self.shared_link_policy = shared_link_policy - if force_async is not None: - self.force_async = force_async + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value - @property - def path(self): + @classmethod + def failed(cls, val): """ - The path to the folder to share. If it does not exist, then a new one is - created. + Create an instance of this class set to the ``failed`` tag with value + ``val``. - :rtype: str + :param JobError val: + :rtype: JobStatus """ - if self._path_present: - return self._path_value - else: - raise AttributeError("missing required field 'path'") + return cls('failed', val) - @path.setter - def path(self, val): - val = self._path_validator.validate(val) - self._path_value = val - self._path_present = True + def is_complete(self): + """ + Check if the union tag is ``complete``. - @path.deleter - def path(self): - self._path_value = None - self._path_present = False + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_failed(self): + """ + The asynchronous job returned an error. + + Only call this if :meth:`is_failed` is true. + + :rtype: JobError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def __repr__(self): + return 'JobStatus(%r, %r)' % (self._tag, self._value) + +class LinkPermissions(object): + """ + :ivar resolved_visibility: The current visibility of the link after + considering the shared links policies of the the team (in case the + link's owner is part of a team) and the shared folder (in case the + linked file is part of a shared folder). This field is shown only if the + caller has access to this info (the link's owner always has access to + this data). + :ivar requested_visibility: The shared link's requested visibility. This can + be overridden by the team and shared folder policies. The final + visibility, after considering these policies, can be found in + ``resolved_visibility``. This is shown only if the caller is the link's + owner. + :ivar can_revoke: Whether the caller can revoke the shared link + :ivar revoke_failure_reason: The failure reason for revoking the link. This + field will only be present if the ``can_revoke`` is ``False``. + """ + + __slots__ = [ + '_resolved_visibility_value', + '_resolved_visibility_present', + '_requested_visibility_value', + '_requested_visibility_present', + '_can_revoke_value', + '_can_revoke_present', + '_revoke_failure_reason_value', + '_revoke_failure_reason_present', + ] + + _has_required_fields = True + + def __init__(self, + can_revoke=None, + resolved_visibility=None, + requested_visibility=None, + revoke_failure_reason=None): + self._resolved_visibility_value = None + self._resolved_visibility_present = False + self._requested_visibility_value = None + self._requested_visibility_present = False + self._can_revoke_value = None + self._can_revoke_present = False + self._revoke_failure_reason_value = None + self._revoke_failure_reason_present = False + if resolved_visibility is not None: + self.resolved_visibility = resolved_visibility + if requested_visibility is not None: + self.requested_visibility = requested_visibility + if can_revoke is not None: + self.can_revoke = can_revoke + if revoke_failure_reason is not None: + self.revoke_failure_reason = revoke_failure_reason @property - def member_policy(self): + def resolved_visibility(self): """ - Who can be a member of this shared folder. + The current visibility of the link after considering the shared links + policies of the the team (in case the link's owner is part of a team) + and the shared folder (in case the linked file is part of a shared + folder). This field is shown only if the caller has access to this info + (the link's owner always has access to this data). - :rtype: MemberPolicy + :rtype: ResolvedVisibility """ - if self._member_policy_present: - return self._member_policy_value + if self._resolved_visibility_present: + return self._resolved_visibility_value else: - return MemberPolicy.anyone + return None - @member_policy.setter - def member_policy(self, val): - self._member_policy_validator.validate_type_only(val) - self._member_policy_value = val - self._member_policy_present = True + @resolved_visibility.setter + def resolved_visibility(self, val): + if val is None: + del self.resolved_visibility + return + self._resolved_visibility_validator.validate_type_only(val) + self._resolved_visibility_value = val + self._resolved_visibility_present = True - @member_policy.deleter - def member_policy(self): - self._member_policy_value = None - self._member_policy_present = False + @resolved_visibility.deleter + def resolved_visibility(self): + self._resolved_visibility_value = None + self._resolved_visibility_present = False @property - def acl_update_policy(self): + def requested_visibility(self): """ - Who can add and remove members of this shared folder. + The shared link's requested visibility. This can be overridden by the + team and shared folder policies. The final visibility, after considering + these policies, can be found in ``resolved_visibility``. This is shown + only if the caller is the link's owner. - :rtype: AclUpdatePolicy + :rtype: RequestedVisibility """ - if self._acl_update_policy_present: - return self._acl_update_policy_value + if self._requested_visibility_present: + return self._requested_visibility_value else: - return AclUpdatePolicy.owner + return None - @acl_update_policy.setter - def acl_update_policy(self, val): - self._acl_update_policy_validator.validate_type_only(val) - self._acl_update_policy_value = val - self._acl_update_policy_present = True + @requested_visibility.setter + def requested_visibility(self, val): + if val is None: + del self.requested_visibility + return + self._requested_visibility_validator.validate_type_only(val) + self._requested_visibility_value = val + self._requested_visibility_present = True - @acl_update_policy.deleter - def acl_update_policy(self): - self._acl_update_policy_value = None - self._acl_update_policy_present = False + @requested_visibility.deleter + def requested_visibility(self): + self._requested_visibility_value = None + self._requested_visibility_present = False @property - def shared_link_policy(self): + def can_revoke(self): """ - The policy to apply to shared links created for content inside this - shared folder. + Whether the caller can revoke the shared link - :rtype: SharedLinkPolicy + :rtype: bool """ - if self._shared_link_policy_present: - return self._shared_link_policy_value + if self._can_revoke_present: + return self._can_revoke_value else: - return SharedLinkPolicy.anyone + raise AttributeError("missing required field 'can_revoke'") - @shared_link_policy.setter - def shared_link_policy(self, val): - self._shared_link_policy_validator.validate_type_only(val) - self._shared_link_policy_value = val - self._shared_link_policy_present = True + @can_revoke.setter + def can_revoke(self, val): + val = self._can_revoke_validator.validate(val) + self._can_revoke_value = val + self._can_revoke_present = True - @shared_link_policy.deleter - def shared_link_policy(self): - self._shared_link_policy_value = None - self._shared_link_policy_present = False + @can_revoke.deleter + def can_revoke(self): + self._can_revoke_value = None + self._can_revoke_present = False @property - def force_async(self): + def revoke_failure_reason(self): """ - Whether to force the share to happen asynchronously. + The failure reason for revoking the link. This field will only be + present if the ``can_revoke`` is ``False``. - :rtype: bool + :rtype: SharedLinkAccessFailureReason """ - if self._force_async_present: - return self._force_async_value + if self._revoke_failure_reason_present: + return self._revoke_failure_reason_value else: - return False + return None - @force_async.setter - def force_async(self, val): - val = self._force_async_validator.validate(val) - self._force_async_value = val - self._force_async_present = True + @revoke_failure_reason.setter + def revoke_failure_reason(self, val): + if val is None: + del self.revoke_failure_reason + return + self._revoke_failure_reason_validator.validate_type_only(val) + self._revoke_failure_reason_value = val + self._revoke_failure_reason_present = True - @force_async.deleter - def force_async(self): - self._force_async_value = None - self._force_async_present = False + @revoke_failure_reason.deleter + def revoke_failure_reason(self): + self._revoke_failure_reason_value = None + self._revoke_failure_reason_present = False def __repr__(self): - return 'ShareFolderArg(path={!r}, member_policy={!r}, acl_update_policy={!r}, shared_link_policy={!r}, force_async={!r})'.format( - self._path_value, - self._member_policy_value, - self._acl_update_policy_value, - self._shared_link_policy_value, - self._force_async_value, + return 'LinkPermissions(can_revoke={!r}, resolved_visibility={!r}, requested_visibility={!r}, revoke_failure_reason={!r})'.format( + self._can_revoke_value, + self._resolved_visibility_value, + self._requested_visibility_value, + self._revoke_failure_reason_value, ) -class ShareFolderError(object): +class ListFolderMembersArgs(object): """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar email_unverified: The current account's e-mail address is unverified. - :ivar SharePathError bad_path: ``ShareFolderArg.path`` is invalid. - :ivar team_policy_disallows_member_policy: Team policy is more restrictive - than ``ShareFolderArg.member_policy``. + :ivar shared_folder_id: The ID for the shared folder. + :ivar actions: Member actions to query. """ - __slots__ = ['_tag', '_value'] - - _catch_all = 'other' - # Attribute is overwritten below the class definition - email_unverified = None - # Attribute is overwritten below the class definition - team_policy_disallows_member_policy = None - # Attribute is overwritten below the class definition - other = None + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_actions_value', + '_actions_present', + ] - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + _has_required_fields = True - @classmethod - def bad_path(cls, val): - """ - Create an instance of this class set to the ``bad_path`` tag with value - ``val``. + def __init__(self, + shared_folder_id=None, + actions=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._actions_value = None + self._actions_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if actions is not None: + self.actions = actions - :param SharePathError val: - :rtype: ShareFolderError + @property + def shared_folder_id(self): """ - return cls('bad_path', val) + The ID for the shared folder. - def is_email_unverified(self): + :rtype: str """ - Check if the union tag is ``email_unverified``. + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") - :rtype: bool - """ - return self._tag == 'email_unverified' + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True - def is_bad_path(self): - """ - Check if the union tag is ``bad_path``. + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False - :rtype: bool + @property + def actions(self): """ - return self._tag == 'bad_path' + Member actions to query. - def is_team_policy_disallows_member_policy(self): + :rtype: list of [MemberAction] """ - Check if the union tag is ``team_policy_disallows_member_policy``. + if self._actions_present: + return self._actions_value + else: + return None - :rtype: bool - """ - return self._tag == 'team_policy_disallows_member_policy' + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True - def is_other(self): - """ - Check if the union tag is ``other``. + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False - :rtype: bool + def __repr__(self): + return 'ListFolderMembersArgs(shared_folder_id={!r}, actions={!r})'.format( + self._shared_folder_id_value, + self._actions_value, + ) + +class ListFolderMembersContinueArg(object): + """ + :ivar cursor: The cursor returned by your last call to list_folder_members + or list_folder_members/continue. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): """ - return self._tag == 'other' + The cursor returned by your last call to list_folder_members or + list_folder_members/continue. - def get_bad_path(self): + :rtype: str """ - ``ShareFolderArg.path`` is invalid. + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") - Only call this if :meth:`is_bad_path` is true. + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True - :rtype: SharePathError - """ - if not self.is_bad_path(): - raise AttributeError("tag 'bad_path' not set") - return self._value + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False def __repr__(self): - return 'ShareFolderError(%r, %r)' % (self._tag, self._value) + return 'ListFolderMembersContinueArg(cursor={!r})'.format( + self._cursor_value, + ) -class SharePathError(object): +class ListFolderMembersContinueError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar is_file: A file is at the specified path. - :ivar inside_shared_folder: We do not support sharing a folder inside a - shared folder. - :ivar contains_shared_folder: We do not support shared folders that contain - shared folders. - :ivar is_app_folder: We do not support sharing an app folder. - :ivar inside_app_folder: We do not support sharing a folder inside an app - folder. - :ivar already_shared: Folder is already shared. - :ivar invalid_path: Path is not valid. + :ivar invalid_cursor: ``ListFolderMembersContinueArg.cursor`` is invalid. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - is_file = None - # Attribute is overwritten below the class definition - inside_shared_folder = None - # Attribute is overwritten below the class definition - contains_shared_folder = None - # Attribute is overwritten below the class definition - is_app_folder = None - # Attribute is overwritten below the class definition - inside_app_folder = None - # Attribute is overwritten below the class definition - already_shared = None - # Attribute is overwritten below the class definition - invalid_path = None + invalid_cursor = None # Attribute is overwritten below the class definition other = None @@ -2886,85 +3442,120 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - def is_is_file(self): + @classmethod + def access_error(cls, val): """ - Check if the union tag is ``is_file``. + Create an instance of this class set to the ``access_error`` tag with + value ``val``. - :rtype: bool + :param SharedFolderAccessError val: + :rtype: ListFolderMembersContinueError """ - return self._tag == 'is_file' + return cls('access_error', val) - def is_inside_shared_folder(self): + def is_access_error(self): """ - Check if the union tag is ``inside_shared_folder``. + Check if the union tag is ``access_error``. :rtype: bool """ - return self._tag == 'inside_shared_folder' + return self._tag == 'access_error' - def is_contains_shared_folder(self): + def is_invalid_cursor(self): """ - Check if the union tag is ``contains_shared_folder``. + Check if the union tag is ``invalid_cursor``. :rtype: bool """ - return self._tag == 'contains_shared_folder' + return self._tag == 'invalid_cursor' - def is_is_app_folder(self): + def is_other(self): """ - Check if the union tag is ``is_app_folder``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'is_app_folder' + return self._tag == 'other' - def is_inside_app_folder(self): + def get_access_error(self): """ - Check if the union tag is ``inside_app_folder``. + Only call this if :meth:`is_access_error` is true. - :rtype: bool + :rtype: SharedFolderAccessError """ - return self._tag == 'inside_app_folder' + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value - def is_already_shared(self): - """ - Check if the union tag is ``already_shared``. + def __repr__(self): + return 'ListFolderMembersContinueError(%r, %r)' % (self._tag, self._value) - :rtype: bool - """ - return self._tag == 'already_shared' +class ListFoldersContinueArg(object): + """ + :ivar cursor: The cursor returned by your last call to list_folders or + list_folders/continue. + """ - def is_invalid_path(self): - """ - Check if the union tag is ``invalid_path``. + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] - :rtype: bool - """ - return self._tag == 'invalid_path' + _has_required_fields = True - def is_other(self): + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): """ - Check if the union tag is ``other``. + The cursor returned by your last call to list_folders or + list_folders/continue. - :rtype: bool + :rtype: str """ - return self._tag == 'other' + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False def __repr__(self): - return 'SharePathError(%r, %r)' % (self._tag, self._value) + return 'ListFoldersContinueArg(cursor={!r})'.format( + self._cursor_value, + ) -class ShareFolderJobStatus(async.PollResultBase): +class ListFoldersContinueError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar SharedFolderMetadata complete: The share job has finished. The value - is the metadata for the folder. + :ivar invalid_cursor: ``ListFoldersContinueArg.cursor`` is invalid. """ __slots__ = ['_tag', '_value'] + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag validator = self._tagmap[tag] @@ -2977,136 +3568,217 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def complete(cls, val): - """ - Create an instance of this class set to the ``complete`` tag with value - ``val``. - - :param SharedFolderMetadata val: - :rtype: ShareFolderJobStatus - """ - return cls('complete', val) - - @classmethod - def failed(cls, val): - """ - Create an instance of this class set to the ``failed`` tag with value - ``val``. - - :param ShareFolderError val: - :rtype: ShareFolderJobStatus - """ - return cls('failed', val) - - def is_complete(self): + def is_invalid_cursor(self): """ - Check if the union tag is ``complete``. + Check if the union tag is ``invalid_cursor``. :rtype: bool """ - return self._tag == 'complete' + return self._tag == 'invalid_cursor' - def is_failed(self): + def is_other(self): """ - Check if the union tag is ``failed``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'failed' - - def get_complete(self): - """ - The share job has finished. The value is the metadata for the folder. + return self._tag == 'other' - Only call this if :meth:`is_complete` is true. + def __repr__(self): + return 'ListFoldersContinueError(%r, %r)' % (self._tag, self._value) - :rtype: SharedFolderMetadata - """ - if not self.is_complete(): - raise AttributeError("tag 'complete' not set") - return self._value +class ListFoldersResult(object): + """ + Result for list_folders. Unmounted shared folders can be identified by the + absence of ``SharedFolderMetadata.path_lower``. - def get_failed(self): + :ivar entries: List of all shared folders the authenticated user has access + to. + :ivar cursor: Present if there are additional shared folders that have not + been returned yet. Pass the cursor into list_folders/continue to list + additional folders. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + cursor=None): + self._entries_value = None + self._entries_present = False + self._cursor_value = None + self._cursor_present = False + if entries is not None: + self.entries = entries + if cursor is not None: + self.cursor = cursor + + @property + def entries(self): """ - Only call this if :meth:`is_failed` is true. + List of all shared folders the authenticated user has access to. - :rtype: ShareFolderError + :rtype: list of [SharedFolderMetadata] """ - if not self.is_failed(): - raise AttributeError("tag 'failed' not set") - return self._value + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + @property + def cursor(self): + """ + Present if there are additional shared folders that have not been + returned yet. Pass the cursor into list_folders/continue to list + additional folders. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False def __repr__(self): - return 'ShareFolderJobStatus(%r, %r)' % (self._tag, self._value) + return 'ListFoldersResult(entries={!r}, cursor={!r})'.format( + self._entries_value, + self._cursor_value, + ) -class ShareFolderLaunch(async.LaunchResultBase): +class ListSharedLinksArg(object): """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. + :ivar path: See list_shared_links description. + :ivar cursor: The cursor returned by your last call to list_shared_links. """ - __slots__ = ['_tag', '_value'] + __slots__ = [ + '_path_value', + '_path_present', + '_cursor_value', + '_cursor_present', + ] - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + _has_required_fields = False - @classmethod - def complete(cls, val): - """ - Create an instance of this class set to the ``complete`` tag with value - ``val``. + def __init__(self, + path=None, + cursor=None): + self._path_value = None + self._path_present = False + self._cursor_value = None + self._cursor_present = False + if path is not None: + self.path = path + if cursor is not None: + self.cursor = cursor - :param SharedFolderMetadata val: - :rtype: ShareFolderLaunch + @property + def path(self): """ - return cls('complete', val) + See list_shared_links description. - def is_complete(self): + :rtype: str """ - Check if the union tag is ``complete``. + if self._path_present: + return self._path_value + else: + return None - :rtype: bool - """ - return self._tag == 'complete' + @path.setter + def path(self, val): + if val is None: + del self.path + return + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - def get_complete(self): + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def cursor(self): """ - Only call this if :meth:`is_complete` is true. + The cursor returned by your last call to list_shared_links. - :rtype: SharedFolderMetadata + :rtype: str """ - if not self.is_complete(): - raise AttributeError("tag 'complete' not set") - return self._value + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False def __repr__(self): - return 'ShareFolderLaunch(%r, %r)' % (self._tag, self._value) + return 'ListSharedLinksArg(path={!r}, cursor={!r})'.format( + self._path_value, + self._cursor_value, + ) -class JobStatus(async.PollResultBase): +class ListSharedLinksError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar complete: The asynchronous job has finished. - :ivar JobError failed: The asynchronous job returned an error. + :ivar reset: Indicates that the cursor has been invalidated. Call + list_shared_links to obtain a new cursor. """ __slots__ = ['_tag', '_value'] + _catch_all = 'other' # Attribute is overwritten below the class definition - complete = None + reset = None + # Attribute is overwritten below the class definition + other = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -3121,118 +3793,193 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def failed(cls, val): + def path(cls, val): """ - Create an instance of this class set to the ``failed`` tag with value + Create an instance of this class set to the ``path`` tag with value ``val``. - :param JobError val: - :rtype: JobStatus + :param files.LookupError val: + :rtype: ListSharedLinksError """ - return cls('failed', val) + return cls('path', val) - def is_complete(self): + def is_path(self): """ - Check if the union tag is ``complete``. + Check if the union tag is ``path``. :rtype: bool """ - return self._tag == 'complete' + return self._tag == 'path' - def is_failed(self): + def is_reset(self): """ - Check if the union tag is ``failed``. + Check if the union tag is ``reset``. :rtype: bool """ - return self._tag == 'failed' + return self._tag == 'reset' - def get_failed(self): + def is_other(self): """ - The asynchronous job returned an error. + Check if the union tag is ``other``. - Only call this if :meth:`is_failed` is true. + :rtype: bool + """ + return self._tag == 'other' - :rtype: JobError + def get_path(self): """ - if not self.is_failed(): - raise AttributeError("tag 'failed' not set") + Only call this if :meth:`is_path` is true. + + :rtype: files.LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") return self._value def __repr__(self): - return 'JobStatus(%r, %r)' % (self._tag, self._value) + return 'ListSharedLinksError(%r, %r)' % (self._tag, self._value) -class SharedFolderMemberError(object): +class ListSharedLinksResult(object): """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar invalid_dropbox_id: The target dropbox_id is invalid. - :ivar not_a_member: The target dropbox_id is not a member of the shared - folder. + :ivar links: Shared links applicable to the path argument. + :ivar has_more: Is true if there are additional shared links that have not + been returned yet. Pass the cursor into list_shared_links to retrieve + them. + :ivar cursor: Pass the cursor into list_shared_links to obtain the + additional links. Cursor is returned only if no path is given or the + path is empty. """ - __slots__ = ['_tag', '_value'] + __slots__ = [ + '_links_value', + '_links_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] - _catch_all = 'other' - # Attribute is overwritten below the class definition - invalid_dropbox_id = None - # Attribute is overwritten below the class definition - not_a_member = None - # Attribute is overwritten below the class definition - other = None + _has_required_fields = True - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value + def __init__(self, + links=None, + has_more=None, + cursor=None): + self._links_value = None + self._links_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if links is not None: + self.links = links + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor - def is_invalid_dropbox_id(self): + @property + def links(self): """ - Check if the union tag is ``invalid_dropbox_id``. + Shared links applicable to the path argument. - :rtype: bool + :rtype: list of [SharedLinkMetadata] """ - return self._tag == 'invalid_dropbox_id' + if self._links_present: + return self._links_value + else: + raise AttributeError("missing required field 'links'") - def is_not_a_member(self): + @links.setter + def links(self, val): + val = self._links_validator.validate(val) + self._links_value = val + self._links_present = True + + @links.deleter + def links(self): + self._links_value = None + self._links_present = False + + @property + def has_more(self): """ - Check if the union tag is ``not_a_member``. + Is true if there are additional shared links that have not been returned + yet. Pass the cursor into list_shared_links to retrieve them. :rtype: bool """ - return self._tag == 'not_a_member' + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") - def is_other(self): + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): """ - Check if the union tag is ``other``. + Pass the cursor into list_shared_links to obtain the additional links. + Cursor is returned only if no path is given or the path is empty. - :rtype: bool + :rtype: str """ - return self._tag == 'other' + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False def __repr__(self): - return 'SharedFolderMemberError(%r, %r)' % (self._tag, self._value) + return 'ListSharedLinksResult(links={!r}, has_more={!r}, cursor={!r})'.format( + self._links_value, + self._has_more_value, + self._cursor_value, + ) -class JobError(object): +class MemberAction(object): """ + Actions that may be taken on members of a shared folder. + This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar make_owner: Make the member an owner of the folder. + :ivar remove: Remove the member from the folder. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + make_owner = None + # Attribute is overwritten below the class definition + remove = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -3247,43 +3994,21 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def access_error(cls, val): - """ - Create an instance of this class set to the ``access_error`` tag with - value ``val``. - - :param SharedFolderAccessError val: - :rtype: JobError - """ - return cls('access_error', val) - - @classmethod - def member_error(cls, val): - """ - Create an instance of this class set to the ``member_error`` tag with - value ``val``. - - :param SharedFolderMemberError val: - :rtype: JobError - """ - return cls('member_error', val) - - def is_access_error(self): + def is_make_owner(self): """ - Check if the union tag is ``access_error``. + Check if the union tag is ``make_owner``. :rtype: bool """ - return self._tag == 'access_error' + return self._tag == 'make_owner' - def is_member_error(self): + def is_remove(self): """ - Check if the union tag is ``member_error``. + Check if the union tag is ``remove``. :rtype: bool """ - return self._tag == 'member_error' + return self._tag == 'remove' def is_other(self): """ @@ -3293,124 +4018,148 @@ def is_other(self): """ return self._tag == 'other' - def get_access_error(self): - """ - Only call this if :meth:`is_access_error` is true. - - :rtype: SharedFolderAccessError - """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") - return self._value - - def get_member_error(self): - """ - Only call this if :meth:`is_member_error` is true. - - :rtype: SharedFolderMemberError - """ - if not self.is_member_error(): - raise AttributeError("tag 'member_error' not set") - return self._value - def __repr__(self): - return 'JobError(%r, %r)' % (self._tag, self._value) + return 'MemberAction(%r, %r)' % (self._tag, self._value) -class UnshareFolderArg(object): +class MemberPermission(object): """ - :ivar shared_folder_id: The ID for the shared folder. - :ivar leave_a_copy: If true, members of this shared folder will get a copy - of this folder after it's unshared. Otherwise, it will be removed from - their Dropbox. The current user, who is an owner, will always retain - their copy. + Whether the user is allowed to take the action on the associated member. + + :ivar action: The action that the user may wish to take on the member. + :ivar allow: True if the user is allowed to take the action. + :ivar reason: The reason why the user is denied the permission. Not present + if the action is allowed """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - '_leave_a_copy_value', - '_leave_a_copy_present', + '_action_value', + '_action_present', + '_allow_value', + '_allow_present', + '_reason_value', + '_reason_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None, - leave_a_copy=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._leave_a_copy_value = None - self._leave_a_copy_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if leave_a_copy is not None: - self.leave_a_copy = leave_a_copy + action=None, + allow=None, + reason=None): + self._action_value = None + self._action_present = False + self._allow_value = None + self._allow_present = False + self._reason_value = None + self._reason_present = False + if action is not None: + self.action = action + if allow is not None: + self.allow = allow + if reason is not None: + self.reason = reason @property - def shared_folder_id(self): + def action(self): """ - The ID for the shared folder. + The action that the user may wish to take on the member. - :rtype: str + :rtype: MemberAction """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._action_present: + return self._action_value else: - raise AttributeError("missing required field 'shared_folder_id'") + raise AttributeError("missing required field 'action'") - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @action.setter + def action(self, val): + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + @action.deleter + def action(self): + self._action_value = None + self._action_present = False @property - def leave_a_copy(self): + def allow(self): """ - If true, members of this shared folder will get a copy of this folder - after it's unshared. Otherwise, it will be removed from their Dropbox. - The current user, who is an owner, will always retain their copy. + True if the user is allowed to take the action. :rtype: bool """ - if self._leave_a_copy_present: - return self._leave_a_copy_value + if self._allow_present: + return self._allow_value else: - raise AttributeError("missing required field 'leave_a_copy'") + raise AttributeError("missing required field 'allow'") - @leave_a_copy.setter - def leave_a_copy(self, val): - val = self._leave_a_copy_validator.validate(val) - self._leave_a_copy_value = val - self._leave_a_copy_present = True + @allow.setter + def allow(self, val): + val = self._allow_validator.validate(val) + self._allow_value = val + self._allow_present = True - @leave_a_copy.deleter - def leave_a_copy(self): - self._leave_a_copy_value = None - self._leave_a_copy_present = False + @allow.deleter + def allow(self): + self._allow_value = None + self._allow_present = False + + @property + def reason(self): + """ + The reason why the user is denied the permission. Not present if the + action is allowed + + :rtype: PermissionDeniedReason + """ + if self._reason_present: + return self._reason_value + else: + return None + + @reason.setter + def reason(self, val): + if val is None: + del self.reason + return + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False def __repr__(self): - return 'UnshareFolderArg(shared_folder_id={!r}, leave_a_copy={!r})'.format( - self._shared_folder_id_value, - self._leave_a_copy_value, + return 'MemberPermission(action={!r}, allow={!r}, reason={!r})'.format( + self._action_value, + self._allow_value, + self._reason_value, ) -class UnshareFolderError(object): +class MemberPolicy(object): """ + Policy governing who can be a member of a shared folder. Only applicable to + folders owned by a user on a team. + This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar team: Only a teammate can become a member. + :ivar anyone: Anyone can become a member. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + anyone = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -3425,24 +4174,21 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def access_error(cls, val): + def is_team(self): """ - Create an instance of this class set to the ``access_error`` tag with - value ``val``. + Check if the union tag is ``team``. - :param SharedFolderAccessError val: - :rtype: UnshareFolderError + :rtype: bool """ - return cls('access_error', val) + return self._tag == 'team' - def is_access_error(self): + def is_anyone(self): """ - Check if the union tag is ``access_error``. + Check if the union tag is ``anyone``. :rtype: bool """ - return self._tag == 'access_error' + return self._tag == 'anyone' def is_other(self): """ @@ -3452,129 +4198,25 @@ def is_other(self): """ return self._tag == 'other' - def get_access_error(self): - """ - Only call this if :meth:`is_access_error` is true. - - :rtype: SharedFolderAccessError - """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") - return self._value - def __repr__(self): - return 'UnshareFolderError(%r, %r)' % (self._tag, self._value) + return 'MemberPolicy(%r, %r)' % (self._tag, self._value) -class TransferFolderArg(object): +class MemberSelector(object): """ - :ivar shared_folder_id: The ID for the shared folder. - :ivar to_dropbox_id: A account or team member ID to transfer ownership to. - """ - - __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - '_to_dropbox_id_value', - '_to_dropbox_id_present', - ] - - _has_required_fields = True - - def __init__(self, - shared_folder_id=None, - to_dropbox_id=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._to_dropbox_id_value = None - self._to_dropbox_id_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if to_dropbox_id is not None: - self.to_dropbox_id = to_dropbox_id - - @property - def shared_folder_id(self): - """ - The ID for the shared folder. - - :rtype: str - """ - if self._shared_folder_id_present: - return self._shared_folder_id_value - else: - raise AttributeError("missing required field 'shared_folder_id'") - - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True - - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - - @property - def to_dropbox_id(self): - """ - A account or team member ID to transfer ownership to. - - :rtype: str - """ - if self._to_dropbox_id_present: - return self._to_dropbox_id_value - else: - raise AttributeError("missing required field 'to_dropbox_id'") - - @to_dropbox_id.setter - def to_dropbox_id(self, val): - val = self._to_dropbox_id_validator.validate(val) - self._to_dropbox_id_value = val - self._to_dropbox_id_present = True - - @to_dropbox_id.deleter - def to_dropbox_id(self): - self._to_dropbox_id_value = None - self._to_dropbox_id_present = False - - def __repr__(self): - return 'TransferFolderArg(shared_folder_id={!r}, to_dropbox_id={!r})'.format( - self._shared_folder_id_value, - self._to_dropbox_id_value, - ) - -class TransferFolderError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar no_permission: The current account does not have permission to perform - this action. - :ivar invalid_dropbox_id: ``TransferFolderArg.to_dropbox_id`` is invalid. - :ivar new_owner_not_a_member: The new designated owner is not currently a - member of the shared folder. - :ivar new_owner_unmounted: The new desginated owner does not have the shared - folder mounted. - :ivar new_owner_email_unverified: The new designated owner's e-mail address - is unverified. + Includes different ways to identify a member of a shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str dropbox_id: Dropbox account, team member, or group ID of member. + :ivar str email: E-mail address of member. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - no_permission = None - # Attribute is overwritten below the class definition - invalid_dropbox_id = None - # Attribute is overwritten below the class definition - new_owner_not_a_member = None - # Attribute is overwritten below the class definition - new_owner_unmounted = None - # Attribute is overwritten below the class definition - new_owner_email_unverified = None - # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -3590,259 +4232,296 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def access_error(cls, val): + def dropbox_id(cls, val): """ - Create an instance of this class set to the ``access_error`` tag with + Create an instance of this class set to the ``dropbox_id`` tag with value ``val``. - :param SharedFolderAccessError val: - :rtype: TransferFolderError - """ - return cls('access_error', val) - - def is_access_error(self): - """ - Check if the union tag is ``access_error``. - - :rtype: bool + :param str val: + :rtype: MemberSelector """ - return self._tag == 'access_error' + return cls('dropbox_id', val) - def is_no_permission(self): + @classmethod + def email(cls, val): """ - Check if the union tag is ``no_permission``. + Create an instance of this class set to the ``email`` tag with value + ``val``. - :rtype: bool + :param str val: + :rtype: MemberSelector """ - return self._tag == 'no_permission' + return cls('email', val) - def is_invalid_dropbox_id(self): + def is_dropbox_id(self): """ - Check if the union tag is ``invalid_dropbox_id``. + Check if the union tag is ``dropbox_id``. :rtype: bool """ - return self._tag == 'invalid_dropbox_id' + return self._tag == 'dropbox_id' - def is_new_owner_not_a_member(self): + def is_email(self): """ - Check if the union tag is ``new_owner_not_a_member``. + Check if the union tag is ``email``. :rtype: bool """ - return self._tag == 'new_owner_not_a_member' + return self._tag == 'email' - def is_new_owner_unmounted(self): + def is_other(self): """ - Check if the union tag is ``new_owner_unmounted``. + Check if the union tag is ``other``. :rtype: bool """ - return self._tag == 'new_owner_unmounted' + return self._tag == 'other' - def is_new_owner_email_unverified(self): + def get_dropbox_id(self): """ - Check if the union tag is ``new_owner_email_unverified``. + Dropbox account, team member, or group ID of member. - :rtype: bool - """ - return self._tag == 'new_owner_email_unverified' + Only call this if :meth:`is_dropbox_id` is true. - def is_other(self): + :rtype: str """ - Check if the union tag is ``other``. + if not self.is_dropbox_id(): + raise AttributeError("tag 'dropbox_id' not set") + return self._value - :rtype: bool + def get_email(self): """ - return self._tag == 'other' + E-mail address of member. - def get_access_error(self): - """ - Only call this if :meth:`is_access_error` is true. + Only call this if :meth:`is_email` is true. - :rtype: SharedFolderAccessError + :rtype: str """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") + if not self.is_email(): + raise AttributeError("tag 'email' not set") return self._value def __repr__(self): - return 'TransferFolderError(%r, %r)' % (self._tag, self._value) + return 'MemberSelector(%r, %r)' % (self._tag, self._value) -class UpdateFolderPolicyArg(object): +class ModifySharedLinkSettingsArgs(object): """ - If any of the policy's are unset, then they retain their current setting. - - :ivar shared_folder_id: The ID for the shared folder. - :ivar member_policy: Who can be a member of this shared folder. Only set - this if the current user is on a team. - :ivar acl_update_policy: Who can add and remove members of this shared - folder. - :ivar shared_link_policy: The policy to apply to shared links created for - content inside this shared folder. + :ivar url: URL of the shared link to change its settings + :ivar settings: Set of settings for the shared link. """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - '_member_policy_value', - '_member_policy_present', - '_acl_update_policy_value', - '_acl_update_policy_present', - '_shared_link_policy_value', - '_shared_link_policy_present', + '_url_value', + '_url_present', + '_settings_value', + '_settings_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None, - member_policy=None, - acl_update_policy=None, - shared_link_policy=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._member_policy_value = None - self._member_policy_present = False - self._acl_update_policy_value = None - self._acl_update_policy_present = False - self._shared_link_policy_value = None - self._shared_link_policy_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if member_policy is not None: - self.member_policy = member_policy - if acl_update_policy is not None: - self.acl_update_policy = acl_update_policy - if shared_link_policy is not None: - self.shared_link_policy = shared_link_policy + url=None, + settings=None): + self._url_value = None + self._url_present = False + self._settings_value = None + self._settings_present = False + if url is not None: + self.url = url + if settings is not None: + self.settings = settings @property - def shared_folder_id(self): + def url(self): """ - The ID for the shared folder. + URL of the shared link to change its settings :rtype: str """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._url_present: + return self._url_value else: - raise AttributeError("missing required field 'shared_folder_id'") + raise AttributeError("missing required field 'url'") - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + @url.deleter + def url(self): + self._url_value = None + self._url_present = False @property - def member_policy(self): + def settings(self): """ - Who can be a member of this shared folder. Only set this if the current - user is on a team. + Set of settings for the shared link. - :rtype: MemberPolicy + :rtype: SharedLinkSettings """ - if self._member_policy_present: - return self._member_policy_value + if self._settings_present: + return self._settings_value else: - return None + raise AttributeError("missing required field 'settings'") - @member_policy.setter - def member_policy(self, val): - if val is None: - del self.member_policy - return - self._member_policy_validator.validate_type_only(val) - self._member_policy_value = val - self._member_policy_present = True + @settings.setter + def settings(self, val): + self._settings_validator.validate_type_only(val) + self._settings_value = val + self._settings_present = True - @member_policy.deleter - def member_policy(self): - self._member_policy_value = None - self._member_policy_present = False + @settings.deleter + def settings(self): + self._settings_value = None + self._settings_present = False - @property - def acl_update_policy(self): + def __repr__(self): + return 'ModifySharedLinkSettingsArgs(url={!r}, settings={!r})'.format( + self._url_value, + self._settings_value, + ) + +class ModifySharedLinkSettingsError(SharedLinkError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharedLinkSettingsError settings_error: There is an error with the + given settings + :ivar email_not_verified: The caller's email should be verified + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + email_not_verified = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def settings_error(cls, val): """ - Who can add and remove members of this shared folder. + Create an instance of this class set to the ``settings_error`` tag with + value ``val``. - :rtype: AclUpdatePolicy + :param SharedLinkSettingsError val: + :rtype: ModifySharedLinkSettingsError """ - if self._acl_update_policy_present: - return self._acl_update_policy_value - else: - return None + return cls('settings_error', val) - @acl_update_policy.setter - def acl_update_policy(self, val): - if val is None: - del self.acl_update_policy - return - self._acl_update_policy_validator.validate_type_only(val) - self._acl_update_policy_value = val - self._acl_update_policy_present = True + def is_settings_error(self): + """ + Check if the union tag is ``settings_error``. - @acl_update_policy.deleter - def acl_update_policy(self): - self._acl_update_policy_value = None - self._acl_update_policy_present = False + :rtype: bool + """ + return self._tag == 'settings_error' + + def is_email_not_verified(self): + """ + Check if the union tag is ``email_not_verified``. + + :rtype: bool + """ + return self._tag == 'email_not_verified' + + def get_settings_error(self): + """ + There is an error with the given settings + + Only call this if :meth:`is_settings_error` is true. + + :rtype: SharedLinkSettingsError + """ + if not self.is_settings_error(): + raise AttributeError("tag 'settings_error' not set") + return self._value + + def __repr__(self): + return 'ModifySharedLinkSettingsError(%r, %r)' % (self._tag, self._value) + +class MountFolderArg(object): + """ + :ivar shared_folder_id: The ID of the shared folder to mount. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id @property - def shared_link_policy(self): + def shared_folder_id(self): """ - The policy to apply to shared links created for content inside this - shared folder. + The ID of the shared folder to mount. - :rtype: SharedLinkPolicy + :rtype: str """ - if self._shared_link_policy_present: - return self._shared_link_policy_value + if self._shared_folder_id_present: + return self._shared_folder_id_value else: - return None + raise AttributeError("missing required field 'shared_folder_id'") - @shared_link_policy.setter - def shared_link_policy(self, val): - if val is None: - del self.shared_link_policy - return - self._shared_link_policy_validator.validate_type_only(val) - self._shared_link_policy_value = val - self._shared_link_policy_present = True + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True - @shared_link_policy.deleter - def shared_link_policy(self): - self._shared_link_policy_value = None - self._shared_link_policy_present = False + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False def __repr__(self): - return 'UpdateFolderPolicyArg(shared_folder_id={!r}, member_policy={!r}, acl_update_policy={!r}, shared_link_policy={!r})'.format( + return 'MountFolderArg(shared_folder_id={!r})'.format( self._shared_folder_id_value, - self._member_policy_value, - self._acl_update_policy_value, - self._shared_link_policy_value, ) -class UpdateFolderPolicyError(object): +class MountFolderError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar not_on_team: ``UpdateFolderPolicyArg.member_policy`` was set even - though user is not on a team. + :ivar inside_shared_folder: Mounting would cause a shared folder to be + inside another, which is disallowed. + :ivar insufficient_quota: The current user does not have enough space to + mount the shared folder. + :ivar already_mounted: The shared folder is already mounted. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - not_on_team = None + inside_shared_folder = None + # Attribute is overwritten below the class definition + insufficient_quota = None + # Attribute is overwritten below the class definition + already_mounted = None # Attribute is overwritten below the class definition other = None @@ -3865,7 +4544,7 @@ def access_error(cls, val): value ``val``. :param SharedFolderAccessError val: - :rtype: UpdateFolderPolicyError + :rtype: MountFolderError """ return cls('access_error', val) @@ -3877,13 +4556,29 @@ def is_access_error(self): """ return self._tag == 'access_error' - def is_not_on_team(self): + def is_inside_shared_folder(self): """ - Check if the union tag is ``not_on_team``. + Check if the union tag is ``inside_shared_folder``. :rtype: bool """ - return self._tag == 'not_on_team' + return self._tag == 'inside_shared_folder' + + def is_insufficient_quota(self): + """ + Check if the union tag is ``insufficient_quota``. + + :rtype: bool + """ + return self._tag == 'insufficient_quota' + + def is_already_mounted(self): + """ + Check if the union tag is ``already_mounted``. + + :rtype: bool + """ + return self._tag == 'already_mounted' def is_other(self): """ @@ -3904,259 +4599,153 @@ def get_access_error(self): return self._value def __repr__(self): - return 'UpdateFolderPolicyError(%r, %r)' % (self._tag, self._value) + return 'MountFolderError(%r, %r)' % (self._tag, self._value) -class AddFolderMemberArg(object): +class PathLinkMetadata(LinkMetadata): """ - :ivar shared_folder_id: The ID for the shared folder. - :ivar members: The intended list of members to add. Added members will - receive invites to join the shared folder. - :ivar quiet: Whether added members should be notified via email and device - notifications of their invite. - :ivar custom_message: Optional message to display to added members in their - invitation. + Metadata for a path-based shared link. + + :ivar path: Path in user's Dropbox. """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - '_members_value', - '_members_present', - '_quiet_value', - '_quiet_present', - '_custom_message_value', - '_custom_message_present', + '_path_value', + '_path_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None, - members=None, - quiet=None, - custom_message=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._members_value = None - self._members_present = False - self._quiet_value = None - self._quiet_present = False - self._custom_message_value = None - self._custom_message_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if members is not None: - self.members = members - if quiet is not None: - self.quiet = quiet - if custom_message is not None: - self.custom_message = custom_message + url=None, + visibility=None, + path=None, + expires=None): + super(PathLinkMetadata, self).__init__(url, + visibility, + expires) + self._path_value = None + self._path_present = False + if path is not None: + self.path = path @property - def shared_folder_id(self): + def path(self): """ - The ID for the shared folder. + Path in user's Dropbox. :rtype: str """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'shared_folder_id'") + raise AttributeError("missing required field 'path'") - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - - @property - def members(self): - """ - The intended list of members to add. Added members will receive invites - to join the shared folder. - - :rtype: list of [AddMember] - """ - if self._members_present: - return self._members_value - else: - raise AttributeError("missing required field 'members'") - - @members.setter - def members(self, val): - val = self._members_validator.validate(val) - self._members_value = val - self._members_present = True - - @members.deleter - def members(self): - self._members_value = None - self._members_present = False - - @property - def quiet(self): - """ - Whether added members should be notified via email and device - notifications of their invite. - - :rtype: bool - """ - if self._quiet_present: - return self._quiet_value - else: - return False - - @quiet.setter - def quiet(self, val): - val = self._quiet_validator.validate(val) - self._quiet_value = val - self._quiet_present = True - - @quiet.deleter - def quiet(self): - self._quiet_value = None - self._quiet_present = False - - @property - def custom_message(self): - """ - Optional message to display to added members in their invitation. - - :rtype: str - """ - if self._custom_message_present: - return self._custom_message_value - else: - return None - - @custom_message.setter - def custom_message(self, val): - if val is None: - del self.custom_message - return - val = self._custom_message_validator.validate(val) - self._custom_message_value = val - self._custom_message_present = True - - @custom_message.deleter - def custom_message(self): - self._custom_message_value = None - self._custom_message_present = False + @path.deleter + def path(self): + self._path_value = None + self._path_present = False def __repr__(self): - return 'AddFolderMemberArg(shared_folder_id={!r}, members={!r}, quiet={!r}, custom_message={!r})'.format( - self._shared_folder_id_value, - self._members_value, - self._quiet_value, - self._custom_message_value, + return 'PathLinkMetadata(url={!r}, visibility={!r}, path={!r}, expires={!r})'.format( + self._url_value, + self._visibility_value, + self._path_value, + self._expires_value, ) -class AddMember(object): +class PendingUploadMode(object): """ - The member and type of access the member should have when added to a shared - folder. + Flag to indicate pending upload default (for linking to not-yet-existing + paths). - :ivar member: The member to add to the shared folder. - :ivar access_level: The access level to grant ``member`` to the shared - folder. ``AccessLevel.owner`` is disallowed. + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar file: Assume pending uploads are files. + :ivar folder: Assume pending uploads are folders. """ - __slots__ = [ - '_member_value', - '_member_present', - '_access_level_value', - '_access_level_present', - ] + __slots__ = ['_tag', '_value'] - _has_required_fields = True + _catch_all = None + # Attribute is overwritten below the class definition + file = None + # Attribute is overwritten below the class definition + folder = None - def __init__(self, - member=None, - access_level=None): - self._member_value = None - self._member_present = False - self._access_level_value = None - self._access_level_present = False - if member is not None: - self.member = member - if access_level is not None: - self.access_level = access_level + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value - @property - def member(self): + def is_file(self): """ - The member to add to the shared folder. + Check if the union tag is ``file``. - :rtype: MemberSelector + :rtype: bool """ - if self._member_present: - return self._member_value - else: - raise AttributeError("missing required field 'member'") - - @member.setter - def member(self, val): - self._member_validator.validate_type_only(val) - self._member_value = val - self._member_present = True - - @member.deleter - def member(self): - self._member_value = None - self._member_present = False + return self._tag == 'file' - @property - def access_level(self): + def is_folder(self): """ - The access level to grant ``member`` to the shared folder. - ``AccessLevel.owner`` is disallowed. + Check if the union tag is ``folder``. - :rtype: AccessLevel + :rtype: bool """ - if self._access_level_present: - return self._access_level_value - else: - return AccessLevel.viewer - - @access_level.setter - def access_level(self, val): - self._access_level_validator.validate_type_only(val) - self._access_level_value = val - self._access_level_present = True - - @access_level.deleter - def access_level(self): - self._access_level_value = None - self._access_level_present = False + return self._tag == 'folder' def __repr__(self): - return 'AddMember(member={!r}, access_level={!r})'.format( - self._member_value, - self._access_level_value, - ) + return 'PendingUploadMode(%r, %r)' % (self._tag, self._value) -class MemberSelector(object): +class PermissionDeniedReason(object): """ - Includes different ways to identify a member of a shared folder. + Possible reasons the user is denied a permission. This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar str dropbox_id: Dropbox account, team member, or group ID of member. - :ivar str email: E-mail address of member. + :ivar user_not_same_team_as_owner: User is not on the same team as the + folder owner. + :ivar user_not_allowed_by_owner: User is prohibited by the owner from taking + the action. + :ivar target_is_indirect_member: Target is indirectly a member of the + folder, for example by being part of a group. + :ivar target_is_owner: Target is the owner of the folder. + :ivar target_is_self: Target is the user itself. + :ivar target_not_active: Target is not an active member of the team. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + user_not_same_team_as_owner = None + # Attribute is overwritten below the class definition + user_not_allowed_by_owner = None + # Attribute is overwritten below the class definition + target_is_indirect_member = None + # Attribute is overwritten below the class definition + target_is_owner = None + # Attribute is overwritten below the class definition + target_is_self = None + # Attribute is overwritten below the class definition + target_not_active = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -4171,116 +4760,136 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def dropbox_id(cls, val): + def is_user_not_same_team_as_owner(self): """ - Create an instance of this class set to the ``dropbox_id`` tag with - value ``val``. + Check if the union tag is ``user_not_same_team_as_owner``. - :param str val: - :rtype: MemberSelector + :rtype: bool """ - return cls('dropbox_id', val) + return self._tag == 'user_not_same_team_as_owner' - @classmethod - def email(cls, val): + def is_user_not_allowed_by_owner(self): """ - Create an instance of this class set to the ``email`` tag with value - ``val``. + Check if the union tag is ``user_not_allowed_by_owner``. - :param str val: - :rtype: MemberSelector + :rtype: bool """ - return cls('email', val) + return self._tag == 'user_not_allowed_by_owner' - def is_dropbox_id(self): + def is_target_is_indirect_member(self): """ - Check if the union tag is ``dropbox_id``. + Check if the union tag is ``target_is_indirect_member``. :rtype: bool """ - return self._tag == 'dropbox_id' + return self._tag == 'target_is_indirect_member' - def is_email(self): + def is_target_is_owner(self): """ - Check if the union tag is ``email``. + Check if the union tag is ``target_is_owner``. :rtype: bool """ - return self._tag == 'email' + return self._tag == 'target_is_owner' - def is_other(self): + def is_target_is_self(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``target_is_self``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'target_is_self' - def get_dropbox_id(self): + def is_target_not_active(self): """ - Dropbox account, team member, or group ID of member. - - Only call this if :meth:`is_dropbox_id` is true. + Check if the union tag is ``target_not_active``. - :rtype: str + :rtype: bool """ - if not self.is_dropbox_id(): - raise AttributeError("tag 'dropbox_id' not set") - return self._value + return self._tag == 'target_not_active' - def get_email(self): + def is_other(self): """ - E-mail address of member. - - Only call this if :meth:`is_email` is true. + Check if the union tag is ``other``. - :rtype: str + :rtype: bool """ - if not self.is_email(): - raise AttributeError("tag 'email' not set") - return self._value + return self._tag == 'other' def __repr__(self): - return 'MemberSelector(%r, %r)' % (self._tag, self._value) + return 'PermissionDeniedReason(%r, %r)' % (self._tag, self._value) -class AddFolderMemberError(object): +class RelinquishFolderMembershipArg(object): + """ + :ivar shared_folder_id: The ID for the shared folder. """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - :ivar SharedFolderAccessError access_error: Unable to access shared folder. - :ivar email_unverified: The current account's e-mail address is unverified. - :ivar AddMemberSelectorError bad_member: ``AddFolderMemberArg.members`` - contains a bad invitation recipient. - :ivar no_permission: The current account does not have permission to perform - this action. - :ivar cant_share_outside_team: Your team policy does not allow sharing - outside of the team. - :ivar long too_many_members: The value is the member limit that was reached. - :ivar long too_many_pending_invites: The value is the pending invite limit - that was reached. - :ivar rate_limit: The user has reached the rate limit for invitations. - :ivar insufficient_plan: The current user's account doesn't support this - action. An example of this is when adding a read-only member. This - action can only be performed by users that have upgraded to a Pro or - Business plan. + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + def __repr__(self): + return 'RelinquishFolderMembershipArg(shared_folder_id={!r})'.format( + self._shared_folder_id_value, + ) + +class RelinquishFolderMembershipError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar folder_owner: The current user is the owner of the shared folder. + Owners cannot relinquish membership to their own folders. Try unsharing + or transfering ownership first. + :ivar mounted: The shared folder is currently mounted. Unmount the shared + folder before relinquishing membership. + :ivar group_access: The current user has access to the shared folder via a + group. You can't relinquish membership to folders shared via groups. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - email_unverified = None - # Attribute is overwritten below the class definition - no_permission = None - # Attribute is overwritten below the class definition - cant_share_outside_team = None + folder_owner = None # Attribute is overwritten below the class definition - rate_limit = None + mounted = None # Attribute is overwritten below the class definition - insufficient_plan = None + group_access = None # Attribute is overwritten below the class definition other = None @@ -4303,43 +4912,10 @@ def access_error(cls, val): value ``val``. :param SharedFolderAccessError val: - :rtype: AddFolderMemberError + :rtype: RelinquishFolderMembershipError """ return cls('access_error', val) - @classmethod - def bad_member(cls, val): - """ - Create an instance of this class set to the ``bad_member`` tag with - value ``val``. - - :param AddMemberSelectorError val: - :rtype: AddFolderMemberError - """ - return cls('bad_member', val) - - @classmethod - def too_many_members(cls, val): - """ - Create an instance of this class set to the ``too_many_members`` tag - with value ``val``. - - :param long val: - :rtype: AddFolderMemberError - """ - return cls('too_many_members', val) - - @classmethod - def too_many_pending_invites(cls, val): - """ - Create an instance of this class set to the ``too_many_pending_invites`` - tag with value ``val``. - - :param long val: - :rtype: AddFolderMemberError - """ - return cls('too_many_pending_invites', val) - def is_access_error(self): """ Check if the union tag is ``access_error``. @@ -4348,69 +4924,29 @@ def is_access_error(self): """ return self._tag == 'access_error' - def is_email_unverified(self): - """ - Check if the union tag is ``email_unverified``. - - :rtype: bool - """ - return self._tag == 'email_unverified' - - def is_bad_member(self): - """ - Check if the union tag is ``bad_member``. - - :rtype: bool - """ - return self._tag == 'bad_member' - - def is_no_permission(self): - """ - Check if the union tag is ``no_permission``. - - :rtype: bool - """ - return self._tag == 'no_permission' - - def is_cant_share_outside_team(self): - """ - Check if the union tag is ``cant_share_outside_team``. - - :rtype: bool - """ - return self._tag == 'cant_share_outside_team' - - def is_too_many_members(self): - """ - Check if the union tag is ``too_many_members``. - - :rtype: bool - """ - return self._tag == 'too_many_members' - - def is_too_many_pending_invites(self): + def is_folder_owner(self): """ - Check if the union tag is ``too_many_pending_invites``. + Check if the union tag is ``folder_owner``. :rtype: bool """ - return self._tag == 'too_many_pending_invites' + return self._tag == 'folder_owner' - def is_rate_limit(self): + def is_mounted(self): """ - Check if the union tag is ``rate_limit``. + Check if the union tag is ``mounted``. :rtype: bool """ - return self._tag == 'rate_limit' + return self._tag == 'mounted' - def is_insufficient_plan(self): + def is_group_access(self): """ - Check if the union tag is ``insufficient_plan``. + Check if the union tag is ``group_access``. :rtype: bool """ - return self._tag == 'insufficient_plan' + return self._tag == 'group_access' def is_other(self): """ @@ -4422,8 +4958,6 @@ def is_other(self): def get_access_error(self): """ - Unable to access shared folder. - Only call this if :meth:`is_access_error` is true. :rtype: SharedFolderAccessError @@ -4432,272 +4966,74 @@ def get_access_error(self): raise AttributeError("tag 'access_error' not set") return self._value - def get_bad_member(self): - """ - ``AddFolderMemberArg.members`` contains a bad invitation recipient. + def __repr__(self): + return 'RelinquishFolderMembershipError(%r, %r)' % (self._tag, self._value) - Only call this if :meth:`is_bad_member` is true. +class RemoveFolderMemberArg(object): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar member: The member to remove from the folder. + :ivar leave_a_copy: If true, the removed user will keep their copy of the + folder after it's unshared, assuming it was mounted. Otherwise, it will + be removed from their Dropbox. Also, this must be set to false when + kicking a group. + """ - :rtype: AddMemberSelectorError - """ - if not self.is_bad_member(): - raise AttributeError("tag 'bad_member' not set") - return self._value + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_member_value', + '_member_present', + '_leave_a_copy_value', + '_leave_a_copy_present', + ] - def get_too_many_members(self): - """ - The value is the member limit that was reached. + _has_required_fields = True - Only call this if :meth:`is_too_many_members` is true. + def __init__(self, + shared_folder_id=None, + member=None, + leave_a_copy=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._member_value = None + self._member_present = False + self._leave_a_copy_value = None + self._leave_a_copy_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if member is not None: + self.member = member + if leave_a_copy is not None: + self.leave_a_copy = leave_a_copy - :rtype: long + @property + def shared_folder_id(self): """ - if not self.is_too_many_members(): - raise AttributeError("tag 'too_many_members' not set") - return self._value + The ID for the shared folder. - def get_too_many_pending_invites(self): + :rtype: str """ - The value is the pending invite limit that was reached. + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") - Only call this if :meth:`is_too_many_pending_invites` is true. + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True - :rtype: long - """ - if not self.is_too_many_pending_invites(): - raise AttributeError("tag 'too_many_pending_invites' not set") - return self._value + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False - def __repr__(self): - return 'AddFolderMemberError(%r, %r)' % (self._tag, self._value) - -class AddMemberSelectorError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar str invalid_dropbox_id: The value is the ID that could not be - identified. - :ivar str invalid_email: The value is the e-email address that is malformed. - :ivar str unverified_dropbox_id: The value is the ID of the Dropbox user - with an unverified e-mail address. Invite unverified users by e-mail - address instead of by their Dropbox ID. - :ivar group_deleted: At least one of the specified groups in - ``AddFolderMemberArg.members`` is deleted. - :ivar group_not_on_team: Sharing to a group that is not on the current - account's team. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = 'other' - # Attribute is overwritten below the class definition - group_deleted = None - # Attribute is overwritten below the class definition - group_not_on_team = None - # Attribute is overwritten below the class definition - other = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def invalid_dropbox_id(cls, val): - """ - Create an instance of this class set to the ``invalid_dropbox_id`` tag - with value ``val``. - - :param str val: - :rtype: AddMemberSelectorError - """ - return cls('invalid_dropbox_id', val) - - @classmethod - def invalid_email(cls, val): - """ - Create an instance of this class set to the ``invalid_email`` tag with - value ``val``. - - :param str val: - :rtype: AddMemberSelectorError - """ - return cls('invalid_email', val) - - @classmethod - def unverified_dropbox_id(cls, val): - """ - Create an instance of this class set to the ``unverified_dropbox_id`` - tag with value ``val``. - - :param str val: - :rtype: AddMemberSelectorError - """ - return cls('unverified_dropbox_id', val) - - def is_invalid_dropbox_id(self): - """ - Check if the union tag is ``invalid_dropbox_id``. - - :rtype: bool - """ - return self._tag == 'invalid_dropbox_id' - - def is_invalid_email(self): - """ - Check if the union tag is ``invalid_email``. - - :rtype: bool - """ - return self._tag == 'invalid_email' - - def is_unverified_dropbox_id(self): - """ - Check if the union tag is ``unverified_dropbox_id``. - - :rtype: bool - """ - return self._tag == 'unverified_dropbox_id' - - def is_group_deleted(self): - """ - Check if the union tag is ``group_deleted``. - - :rtype: bool - """ - return self._tag == 'group_deleted' - - def is_group_not_on_team(self): - """ - Check if the union tag is ``group_not_on_team``. - - :rtype: bool - """ - return self._tag == 'group_not_on_team' - - def is_other(self): - """ - Check if the union tag is ``other``. - - :rtype: bool - """ - return self._tag == 'other' - - def get_invalid_dropbox_id(self): - """ - The value is the ID that could not be identified. - - Only call this if :meth:`is_invalid_dropbox_id` is true. - - :rtype: str - """ - if not self.is_invalid_dropbox_id(): - raise AttributeError("tag 'invalid_dropbox_id' not set") - return self._value - - def get_invalid_email(self): - """ - The value is the e-email address that is malformed. - - Only call this if :meth:`is_invalid_email` is true. - - :rtype: str - """ - if not self.is_invalid_email(): - raise AttributeError("tag 'invalid_email' not set") - return self._value - - def get_unverified_dropbox_id(self): - """ - The value is the ID of the Dropbox user with an unverified e-mail - address. Invite unverified users by e-mail address instead of by their - Dropbox ID. - - Only call this if :meth:`is_unverified_dropbox_id` is true. - - :rtype: str - """ - if not self.is_unverified_dropbox_id(): - raise AttributeError("tag 'unverified_dropbox_id' not set") - return self._value - - def __repr__(self): - return 'AddMemberSelectorError(%r, %r)' % (self._tag, self._value) - -class RemoveFolderMemberArg(object): - """ - :ivar shared_folder_id: The ID for the shared folder. - :ivar member: The member to remove from the folder. - :ivar leave_a_copy: If true, the removed user will keep their copy of the - folder after it's unshared, assuming it was mounted. Otherwise, it will - be removed from their Dropbox. Also, this must be set to false when - kicking a group. - """ - - __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - '_member_value', - '_member_present', - '_leave_a_copy_value', - '_leave_a_copy_present', - ] - - _has_required_fields = True - - def __init__(self, - shared_folder_id=None, - member=None, - leave_a_copy=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._member_value = None - self._member_present = False - self._leave_a_copy_value = None - self._leave_a_copy_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if member is not None: - self.member = member - if leave_a_copy is not None: - self.leave_a_copy = leave_a_copy - - @property - def shared_folder_id(self): - """ - The ID for the shared folder. - - :rtype: str - """ - if self._shared_folder_id_present: - return self._shared_folder_id_value - else: - raise AttributeError("missing required field 'shared_folder_id'") - - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True - - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - - @property - def member(self): - """ - The member to remove from the folder. + @property + def member(self): + """ + The member to remove from the folder. :rtype: MemberSelector """ @@ -4754,12 +5090,22 @@ class RemoveFolderMemberError(object): This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. + + :ivar folder_owner: The target user is the owner of the shared folder. You + can't remove this user until ownership has been transferred to another + member. + :ivar group_access: The target user has access to the shared folder via a + group. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition + folder_owner = None + # Attribute is overwritten below the class definition + group_access = None + # Attribute is overwritten below the class definition other = None def __init__(self, tag, value=None): @@ -4785,6 +5131,17 @@ def access_error(cls, val): """ return cls('access_error', val) + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param SharedFolderMemberError val: + :rtype: RemoveFolderMemberError + """ + return cls('member_error', val) + def is_access_error(self): """ Check if the union tag is ``access_error``. @@ -4793,161 +5150,90 @@ def is_access_error(self): """ return self._tag == 'access_error' - def is_other(self): + def is_member_error(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``member_error``. :rtype: bool """ - return self._tag == 'other' + return self._tag == 'member_error' - def get_access_error(self): + def is_folder_owner(self): """ - Only call this if :meth:`is_access_error` is true. + Check if the union tag is ``folder_owner``. - :rtype: SharedFolderAccessError + :rtype: bool """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") - return self._value - - def __repr__(self): - return 'RemoveFolderMemberError(%r, %r)' % (self._tag, self._value) - -class UpdateFolderMemberArg(object): - """ - :ivar shared_folder_id: The ID for the shared folder. - :ivar member: The member of the shared folder to update. Only the - ``MemberSelector.dropbox_id`` may be set at this time. - :ivar access_level: The new access level for ``member``. - ``AccessLevel.owner`` is disallowed. - """ - - __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - '_member_value', - '_member_present', - '_access_level_value', - '_access_level_present', - ] - - _has_required_fields = True - - def __init__(self, - shared_folder_id=None, - member=None, - access_level=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - self._member_value = None - self._member_present = False - self._access_level_value = None - self._access_level_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id - if member is not None: - self.member = member - if access_level is not None: - self.access_level = access_level + return self._tag == 'folder_owner' - @property - def shared_folder_id(self): + def is_group_access(self): """ - The ID for the shared folder. + Check if the union tag is ``group_access``. - :rtype: str + :rtype: bool """ - if self._shared_folder_id_present: - return self._shared_folder_id_value - else: - raise AttributeError("missing required field 'shared_folder_id'") - - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True - - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + return self._tag == 'group_access' - @property - def member(self): + def is_other(self): """ - The member of the shared folder to update. Only the - ``MemberSelector.dropbox_id`` may be set at this time. + Check if the union tag is ``other``. - :rtype: MemberSelector + :rtype: bool """ - if self._member_present: - return self._member_value - else: - raise AttributeError("missing required field 'member'") - - @member.setter - def member(self, val): - self._member_validator.validate_type_only(val) - self._member_value = val - self._member_present = True - - @member.deleter - def member(self): - self._member_value = None - self._member_present = False + return self._tag == 'other' - @property - def access_level(self): + def get_access_error(self): """ - The new access level for ``member``. ``AccessLevel.owner`` is - disallowed. + Only call this if :meth:`is_access_error` is true. - :rtype: AccessLevel + :rtype: SharedFolderAccessError """ - if self._access_level_present: - return self._access_level_value - else: - raise AttributeError("missing required field 'access_level'") + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value - @access_level.setter - def access_level(self, val): - self._access_level_validator.validate_type_only(val) - self._access_level_value = val - self._access_level_present = True + def get_member_error(self): + """ + Only call this if :meth:`is_member_error` is true. - @access_level.deleter - def access_level(self): - self._access_level_value = None - self._access_level_present = False + :rtype: SharedFolderMemberError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value def __repr__(self): - return 'UpdateFolderMemberArg(shared_folder_id={!r}, member={!r}, access_level={!r})'.format( - self._shared_folder_id_value, - self._member_value, - self._access_level_value, - ) + return 'RemoveFolderMemberError(%r, %r)' % (self._tag, self._value) -class UpdateFolderMemberError(object): +class RequestedVisibility(object): """ + The access permission that can be requested by the caller for the shared + link. Note that the final resolved visibility of the shared link takes into + account other aspects, such as team and shared folder settings. Check the + :class:`ResolvedVisibility` for more info on the possible resolved + visibility values of shared links. + This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar insufficient_plan: The current user's account doesn't support this - action. An example of this is when downgrading a member from editor to - viewer. This action can only be performed by users that have upgraded to - a Pro or Business plan. + :ivar public: Anyone who has received the link can access it. No login + required. + :ivar team_only: Only members of the same team can access the link. Login is + required. + :ivar password: A link-specific password is required to access the link. + Login is not required. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' + _catch_all = None # Attribute is overwritten below the class definition - insufficient_plan = None + public = None # Attribute is overwritten below the class definition - other = None + team_only = None + # Attribute is overwritten below the class definition + password = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -4961,51 +5247,88 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def access_error(cls, val): + def is_public(self): """ - Create an instance of this class set to the ``access_error`` tag with - value ``val``. + Check if the union tag is ``public``. - :param SharedFolderAccessError val: - :rtype: UpdateFolderMemberError + :rtype: bool """ - return cls('access_error', val) + return self._tag == 'public' - @classmethod - def member_error(cls, val): + def is_team_only(self): """ - Create an instance of this class set to the ``member_error`` tag with - value ``val``. + Check if the union tag is ``team_only``. - :param SharedFolderMemberError val: - :rtype: UpdateFolderMemberError + :rtype: bool """ - return cls('member_error', val) + return self._tag == 'team_only' - def is_access_error(self): + def is_password(self): """ - Check if the union tag is ``access_error``. + Check if the union tag is ``password``. :rtype: bool """ - return self._tag == 'access_error' + return self._tag == 'password' - def is_member_error(self): + def __repr__(self): + return 'RequestedVisibility(%r, %r)' % (self._tag, self._value) + +class ResolvedVisibility(RequestedVisibility): + """ + The actual access permissions values of shared links after taking into + account user preferences and the team and shared folder settings. Check the + :class:`RequestedVisibility` for more info on the possible visibility values + that can be set by the shared link's owner. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team_and_password: Only members of the same team who have the + link-specific password can access the link. Login is required. + :ivar shared_folder_only: Only members of the shared folder containing the + linked file can access the link. Login is required. + :ivar other: An unknown restriction is in place. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team_and_password = None + # Attribute is overwritten below the class definition + shared_folder_only = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_team_and_password(self): """ - Check if the union tag is ``member_error``. + Check if the union tag is ``team_and_password``. :rtype: bool """ - return self._tag == 'member_error' + return self._tag == 'team_and_password' - def is_insufficient_plan(self): + def is_shared_folder_only(self): """ - Check if the union tag is ``insufficient_plan``. + Check if the union tag is ``shared_folder_only``. :rtype: bool """ - return self._tag == 'insufficient_plan' + return self._tag == 'shared_folder_only' def is_other(self): """ @@ -5015,100 +5338,69 @@ def is_other(self): """ return self._tag == 'other' - def get_access_error(self): - """ - Only call this if :meth:`is_access_error` is true. - - :rtype: SharedFolderAccessError - """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") - return self._value - - def get_member_error(self): - """ - Only call this if :meth:`is_member_error` is true. - - :rtype: SharedFolderMemberError - """ - if not self.is_member_error(): - raise AttributeError("tag 'member_error' not set") - return self._value - def __repr__(self): - return 'UpdateFolderMemberError(%r, %r)' % (self._tag, self._value) + return 'ResolvedVisibility(%r, %r)' % (self._tag, self._value) -class MountFolderArg(object): +class RevokeSharedLinkArg(object): """ - :ivar shared_folder_id: The ID of the shared folder to mount. + :ivar url: URL of the shared link. """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', + '_url_value', + '_url_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id + url=None): + self._url_value = None + self._url_present = False + if url is not None: + self.url = url @property - def shared_folder_id(self): + def url(self): """ - The ID of the shared folder to mount. + URL of the shared link. :rtype: str """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._url_present: + return self._url_value else: - raise AttributeError("missing required field 'shared_folder_id'") + raise AttributeError("missing required field 'url'") - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + @url.deleter + def url(self): + self._url_value = None + self._url_present = False def __repr__(self): - return 'MountFolderArg(shared_folder_id={!r})'.format( - self._shared_folder_id_value, + return 'RevokeSharedLinkArg(url={!r})'.format( + self._url_value, ) -class MountFolderError(object): +class RevokeSharedLinkError(SharedLinkError): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar inside_shared_folder: Mounting would cause a shared folder to be - inside another, which is disallowed. - :ivar insufficient_quota: The current user does not have enough space to - mount the shared folder. - :ivar already_mounted: The shared folder is already mounted. + :ivar shared_link_malformed: Shared link is malformed. """ __slots__ = ['_tag', '_value'] - _catch_all = 'other' - # Attribute is overwritten below the class definition - inside_shared_folder = None # Attribute is overwritten below the class definition - insufficient_quota = None - # Attribute is overwritten below the class definition - already_mounted = None - # Attribute is overwritten below the class definition - other = None + shared_link_malformed = None def __init__(self, tag, value=None): assert tag in self._tagmap, 'Invalid tag %r.' % tag @@ -5122,253 +5414,224 @@ def __init__(self, tag, value=None): self._tag = tag self._value = value - @classmethod - def access_error(cls, val): - """ - Create an instance of this class set to the ``access_error`` tag with - value ``val``. - - :param SharedFolderAccessError val: - :rtype: MountFolderError - """ - return cls('access_error', val) - - def is_access_error(self): - """ - Check if the union tag is ``access_error``. - - :rtype: bool - """ - return self._tag == 'access_error' - - def is_inside_shared_folder(self): - """ - Check if the union tag is ``inside_shared_folder``. - - :rtype: bool - """ - return self._tag == 'inside_shared_folder' - - def is_insufficient_quota(self): - """ - Check if the union tag is ``insufficient_quota``. - - :rtype: bool - """ - return self._tag == 'insufficient_quota' - - def is_already_mounted(self): - """ - Check if the union tag is ``already_mounted``. - - :rtype: bool - """ - return self._tag == 'already_mounted' - - def is_other(self): + def is_shared_link_malformed(self): """ - Check if the union tag is ``other``. + Check if the union tag is ``shared_link_malformed``. :rtype: bool """ - return self._tag == 'other' - - def get_access_error(self): - """ - Only call this if :meth:`is_access_error` is true. - - :rtype: SharedFolderAccessError - """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") - return self._value + return self._tag == 'shared_link_malformed' def __repr__(self): - return 'MountFolderError(%r, %r)' % (self._tag, self._value) + return 'RevokeSharedLinkError(%r, %r)' % (self._tag, self._value) -class UnmountFolderArg(object): +class ShareFolderArg(object): """ - :ivar shared_folder_id: The ID for the shared folder. + :ivar path: The path to the folder to share. If it does not exist, then a + new one is created. + :ivar member_policy: Who can be a member of this shared folder. + :ivar acl_update_policy: Who can add and remove members of this shared + folder. + :ivar shared_link_policy: The policy to apply to shared links created for + content inside this shared folder. + :ivar force_async: Whether to force the share to happen asynchronously. """ __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', + '_path_value', + '_path_present', + '_member_policy_value', + '_member_policy_present', + '_acl_update_policy_value', + '_acl_update_policy_present', + '_shared_link_policy_value', + '_shared_link_policy_present', + '_force_async_value', + '_force_async_present', ] _has_required_fields = True def __init__(self, - shared_folder_id=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id + path=None, + member_policy=None, + acl_update_policy=None, + shared_link_policy=None, + force_async=None): + self._path_value = None + self._path_present = False + self._member_policy_value = None + self._member_policy_present = False + self._acl_update_policy_value = None + self._acl_update_policy_present = False + self._shared_link_policy_value = None + self._shared_link_policy_present = False + self._force_async_value = None + self._force_async_present = False + if path is not None: + self.path = path + if member_policy is not None: + self.member_policy = member_policy + if acl_update_policy is not None: + self.acl_update_policy = acl_update_policy + if shared_link_policy is not None: + self.shared_link_policy = shared_link_policy + if force_async is not None: + self.force_async = force_async @property - def shared_folder_id(self): + def path(self): """ - The ID for the shared folder. + The path to the folder to share. If it does not exist, then a new one is + created. :rtype: str """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._path_present: + return self._path_value else: - raise AttributeError("missing required field 'shared_folder_id'") - - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True - - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - - def __repr__(self): - return 'UnmountFolderArg(shared_folder_id={!r})'.format( - self._shared_folder_id_value, - ) + raise AttributeError("missing required field 'path'") -class UnmountFolderError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - """ + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True - __slots__ = ['_tag', '_value'] + @path.deleter + def path(self): + self._path_value = None + self._path_present = False - _catch_all = 'other' - # Attribute is overwritten below the class definition - other = None + @property + def member_policy(self): + """ + Who can be a member of this shared folder. - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) + :rtype: MemberPolicy + """ + if self._member_policy_present: + return self._member_policy_value else: - validator.validate(value) - self._tag = tag - self._value = value + return MemberPolicy.anyone - @classmethod - def access_error(cls, val): - """ - Create an instance of this class set to the ``access_error`` tag with - value ``val``. + @member_policy.setter + def member_policy(self, val): + self._member_policy_validator.validate_type_only(val) + self._member_policy_value = val + self._member_policy_present = True - :param SharedFolderAccessError val: - :rtype: UnmountFolderError - """ - return cls('access_error', val) + @member_policy.deleter + def member_policy(self): + self._member_policy_value = None + self._member_policy_present = False - def is_access_error(self): + @property + def acl_update_policy(self): """ - Check if the union tag is ``access_error``. + Who can add and remove members of this shared folder. - :rtype: bool + :rtype: AclUpdatePolicy """ - return self._tag == 'access_error' + if self._acl_update_policy_present: + return self._acl_update_policy_value + else: + return AclUpdatePolicy.owner - def is_other(self): - """ - Check if the union tag is ``other``. + @acl_update_policy.setter + def acl_update_policy(self, val): + self._acl_update_policy_validator.validate_type_only(val) + self._acl_update_policy_value = val + self._acl_update_policy_present = True - :rtype: bool - """ - return self._tag == 'other' + @acl_update_policy.deleter + def acl_update_policy(self): + self._acl_update_policy_value = None + self._acl_update_policy_present = False - def get_access_error(self): + @property + def shared_link_policy(self): """ - Only call this if :meth:`is_access_error` is true. + The policy to apply to shared links created for content inside this + shared folder. - :rtype: SharedFolderAccessError + :rtype: SharedLinkPolicy """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") - return self._value - - def __repr__(self): - return 'UnmountFolderError(%r, %r)' % (self._tag, self._value) - -class RelinquishFolderMembershipArg(object): - """ - :ivar shared_folder_id: The ID for the shared folder. - """ - - __slots__ = [ - '_shared_folder_id_value', - '_shared_folder_id_present', - ] + if self._shared_link_policy_present: + return self._shared_link_policy_value + else: + return SharedLinkPolicy.anyone - _has_required_fields = True + @shared_link_policy.setter + def shared_link_policy(self, val): + self._shared_link_policy_validator.validate_type_only(val) + self._shared_link_policy_value = val + self._shared_link_policy_present = True - def __init__(self, - shared_folder_id=None): - self._shared_folder_id_value = None - self._shared_folder_id_present = False - if shared_folder_id is not None: - self.shared_folder_id = shared_folder_id + @shared_link_policy.deleter + def shared_link_policy(self): + self._shared_link_policy_value = None + self._shared_link_policy_present = False @property - def shared_folder_id(self): + def force_async(self): """ - The ID for the shared folder. + Whether to force the share to happen asynchronously. - :rtype: str + :rtype: bool """ - if self._shared_folder_id_present: - return self._shared_folder_id_value + if self._force_async_present: + return self._force_async_value else: - raise AttributeError("missing required field 'shared_folder_id'") + return False - @shared_folder_id.setter - def shared_folder_id(self, val): - val = self._shared_folder_id_validator.validate(val) - self._shared_folder_id_value = val - self._shared_folder_id_present = True + @force_async.setter + def force_async(self, val): + val = self._force_async_validator.validate(val) + self._force_async_value = val + self._force_async_present = True - @shared_folder_id.deleter - def shared_folder_id(self): - self._shared_folder_id_value = None - self._shared_folder_id_present = False + @force_async.deleter + def force_async(self): + self._force_async_value = None + self._force_async_present = False def __repr__(self): - return 'RelinquishFolderMembershipArg(shared_folder_id={!r})'.format( - self._shared_folder_id_value, + return 'ShareFolderArg(path={!r}, member_policy={!r}, acl_update_policy={!r}, shared_link_policy={!r}, force_async={!r})'.format( + self._path_value, + self._member_policy_value, + self._acl_update_policy_value, + self._shared_link_policy_value, + self._force_async_value, ) -class RelinquishFolderMembershipError(object): +class ShareFolderError(object): """ This class acts as a tagged union. Only one of the ``is_*`` methods will return true. To get the associated value of a tag (if one exists), use the corresponding ``get_*`` method. - :ivar folder_owner: The current user is the owner of the shared folder. - Owners cannot relinquish membership to their own folders. Try unsharing - or transfering ownership first. - :ivar mounted: The shared folder is currently mounted. Unmount the shared - folder before relinquishing membership. - :ivar group_access: The current user has access to the shared folder via a - group. You can't relinquish membership to folders shared via groups. + :ivar email_unverified: The current account's e-mail address is unverified. + :ivar SharePathError bad_path: ``ShareFolderArg.path`` is invalid. + :ivar team_policy_disallows_member_policy: Team policy is more restrictive + than ``ShareFolderArg.member_policy``. + :ivar disallowed_shared_link_policy: The current account is not allowed to + select the specified ``ShareFolderArg.shared_link_policy``. + :ivar no_permission: The current account does not have permission to perform + this action. """ __slots__ = ['_tag', '_value'] _catch_all = 'other' # Attribute is overwritten below the class definition - folder_owner = None + email_unverified = None # Attribute is overwritten below the class definition - mounted = None + team_policy_disallows_member_policy = None # Attribute is overwritten below the class definition - group_access = None + disallowed_shared_link_policy = None + # Attribute is overwritten below the class definition + no_permission = None # Attribute is overwritten below the class definition other = None @@ -5385,47 +5648,55 @@ def __init__(self, tag, value=None): self._value = value @classmethod - def access_error(cls, val): + def bad_path(cls, val): """ - Create an instance of this class set to the ``access_error`` tag with - value ``val``. + Create an instance of this class set to the ``bad_path`` tag with value + ``val``. - :param SharedFolderAccessError val: - :rtype: RelinquishFolderMembershipError + :param SharePathError val: + :rtype: ShareFolderError """ - return cls('access_error', val) + return cls('bad_path', val) - def is_access_error(self): + def is_email_unverified(self): """ - Check if the union tag is ``access_error``. + Check if the union tag is ``email_unverified``. :rtype: bool """ - return self._tag == 'access_error' + return self._tag == 'email_unverified' - def is_folder_owner(self): + def is_bad_path(self): """ - Check if the union tag is ``folder_owner``. + Check if the union tag is ``bad_path``. :rtype: bool """ - return self._tag == 'folder_owner' + return self._tag == 'bad_path' - def is_mounted(self): + def is_team_policy_disallows_member_policy(self): """ - Check if the union tag is ``mounted``. + Check if the union tag is ``team_policy_disallows_member_policy``. :rtype: bool """ - return self._tag == 'mounted' + return self._tag == 'team_policy_disallows_member_policy' - def is_group_access(self): + def is_disallowed_shared_link_policy(self): """ - Check if the union tag is ``group_access``. + Check if the union tag is ``disallowed_shared_link_policy``. :rtype: bool """ - return self._tag == 'group_access' + return self._tag == 'disallowed_shared_link_policy' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' def is_other(self): """ @@ -5435,176 +5706,3082 @@ def is_other(self): """ return self._tag == 'other' - def get_access_error(self): + def get_bad_path(self): """ - Only call this if :meth:`is_access_error` is true. + ``ShareFolderArg.path`` is invalid. - :rtype: SharedFolderAccessError + Only call this if :meth:`is_bad_path` is true. + + :rtype: SharePathError """ - if not self.is_access_error(): - raise AttributeError("tag 'access_error' not set") + if not self.is_bad_path(): + raise AttributeError("tag 'bad_path' not set") return self._value def __repr__(self): - return 'RelinquishFolderMembershipError(%r, %r)' % (self._tag, self._value) + return 'ShareFolderError(%r, %r)' % (self._tag, self._value) -Visibility._public_validator = bv.Void() -Visibility._team_only_validator = bv.Void() -Visibility._password_validator = bv.Void() -Visibility._team_and_password_validator = bv.Void() -Visibility._shared_folder_only_validator = bv.Void() -Visibility._other_validator = bv.Void() -Visibility._tagmap = { - 'public': Visibility._public_validator, - 'team_only': Visibility._team_only_validator, - 'password': Visibility._password_validator, - 'team_and_password': Visibility._team_and_password_validator, - 'shared_folder_only': Visibility._shared_folder_only_validator, - 'other': Visibility._other_validator, -} +class ShareFolderJobStatus(async.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. -Visibility.public = Visibility('public') -Visibility.team_only = Visibility('team_only') -Visibility.password = Visibility('password') -Visibility.team_and_password = Visibility('team_and_password') -Visibility.shared_folder_only = Visibility('shared_folder_only') -Visibility.other = Visibility('other') + :ivar SharedFolderMetadata complete: The share job has finished. The value + is the metadata for the folder. + """ -LinkMetadata._url_validator = bv.String() -LinkMetadata._visibility_validator = bv.Union(Visibility) -LinkMetadata._expires_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) -LinkMetadata._field_names_ = set([ - 'url', - 'visibility', - 'expires', -]) -LinkMetadata._all_field_names_ = LinkMetadata._field_names_ -LinkMetadata._fields_ = [ - ('url', LinkMetadata._url_validator), - ('visibility', LinkMetadata._visibility_validator), - ('expires', LinkMetadata._expires_validator), -] -LinkMetadata._all_fields_ = LinkMetadata._fields_ + __slots__ = ['_tag', '_value'] -LinkMetadata._tag_to_subtype_ = { - (u'path',): bv.Struct(PathLinkMetadata), - (u'collection',): bv.Struct(CollectionLinkMetadata), -} -LinkMetadata._pytype_to_tag_and_subtype_ = { - PathLinkMetadata: ((u'path',), bv.Struct(PathLinkMetadata)), - CollectionLinkMetadata: ((u'collection',), bv.Struct(CollectionLinkMetadata)), -} -LinkMetadata._is_catch_all_ = True + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value -PathLinkMetadata._path_validator = bv.String() -PathLinkMetadata._field_names_ = set(['path']) -PathLinkMetadata._all_field_names_ = LinkMetadata._all_field_names_.union(PathLinkMetadata._field_names_) -PathLinkMetadata._fields_ = [('path', PathLinkMetadata._path_validator)] -PathLinkMetadata._all_fields_ = LinkMetadata._all_fields_ + PathLinkMetadata._fields_ + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. -CollectionLinkMetadata._field_names_ = set([]) + :param SharedFolderMetadata val: + :rtype: ShareFolderJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param ShareFolderError val: + :rtype: ShareFolderJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + The share job has finished. The value is the metadata for the folder. + + Only call this if :meth:`is_complete` is true. + + :rtype: SharedFolderMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + Only call this if :meth:`is_failed` is true. + + :rtype: ShareFolderError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def __repr__(self): + return 'ShareFolderJobStatus(%r, %r)' % (self._tag, self._value) + +class ShareFolderLaunch(async.LaunchResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param SharedFolderMetadata val: + :rtype: ShareFolderLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: SharedFolderMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def __repr__(self): + return 'ShareFolderLaunch(%r, %r)' % (self._tag, self._value) + +class SharePathError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar is_file: A file is at the specified path. + :ivar inside_shared_folder: We do not support sharing a folder inside a + shared folder. + :ivar contains_shared_folder: We do not support shared folders that contain + shared folders. + :ivar is_app_folder: We do not support sharing an app folder. + :ivar inside_app_folder: We do not support sharing a folder inside an app + folder. + :ivar already_shared: Folder is already shared. + :ivar invalid_path: Path is not valid. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + is_file = None + # Attribute is overwritten below the class definition + inside_shared_folder = None + # Attribute is overwritten below the class definition + contains_shared_folder = None + # Attribute is overwritten below the class definition + is_app_folder = None + # Attribute is overwritten below the class definition + inside_app_folder = None + # Attribute is overwritten below the class definition + already_shared = None + # Attribute is overwritten below the class definition + invalid_path = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_is_file(self): + """ + Check if the union tag is ``is_file``. + + :rtype: bool + """ + return self._tag == 'is_file' + + def is_inside_shared_folder(self): + """ + Check if the union tag is ``inside_shared_folder``. + + :rtype: bool + """ + return self._tag == 'inside_shared_folder' + + def is_contains_shared_folder(self): + """ + Check if the union tag is ``contains_shared_folder``. + + :rtype: bool + """ + return self._tag == 'contains_shared_folder' + + def is_is_app_folder(self): + """ + Check if the union tag is ``is_app_folder``. + + :rtype: bool + """ + return self._tag == 'is_app_folder' + + def is_inside_app_folder(self): + """ + Check if the union tag is ``inside_app_folder``. + + :rtype: bool + """ + return self._tag == 'inside_app_folder' + + def is_already_shared(self): + """ + Check if the union tag is ``already_shared``. + + :rtype: bool + """ + return self._tag == 'already_shared' + + def is_invalid_path(self): + """ + Check if the union tag is ``invalid_path``. + + :rtype: bool + """ + return self._tag == 'invalid_path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharePathError(%r, %r)' % (self._tag, self._value) + +class SharedFolderAccessError(object): + """ + There is an error accessing the shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_id: This shared folder ID is invalid. + :ivar not_a_member: The user is not a member of the shared folder thus + cannot access it. + :ivar no_permission: The current user does not have sufficient privileges to + perform the desired action. + :ivar email_unverified: The current account's e-mail address is unverified. + :ivar team_folder: The current user cannot perform this action on a team + shared folder. + :ivar unmounted: The shared folder is unmounted. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_id = None + # Attribute is overwritten below the class definition + not_a_member = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + unmounted = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_invalid_id(self): + """ + Check if the union tag is ``invalid_id``. + + :rtype: bool + """ + return self._tag == 'invalid_id' + + def is_not_a_member(self): + """ + Check if the union tag is ``not_a_member``. + + :rtype: bool + """ + return self._tag == 'not_a_member' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_email_unverified(self): + """ + Check if the union tag is ``email_unverified``. + + :rtype: bool + """ + return self._tag == 'email_unverified' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_unmounted(self): + """ + Check if the union tag is ``unmounted``. + + :rtype: bool + """ + return self._tag == 'unmounted' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharedFolderAccessError(%r, %r)' % (self._tag, self._value) + +class SharedFolderMemberError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_dropbox_id: The target dropbox_id is invalid. + :ivar not_a_member: The target dropbox_id is not a member of the shared + folder. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_dropbox_id = None + # Attribute is overwritten below the class definition + not_a_member = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_invalid_dropbox_id(self): + """ + Check if the union tag is ``invalid_dropbox_id``. + + :rtype: bool + """ + return self._tag == 'invalid_dropbox_id' + + def is_not_a_member(self): + """ + Check if the union tag is ``not_a_member``. + + :rtype: bool + """ + return self._tag == 'not_a_member' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharedFolderMemberError(%r, %r)' % (self._tag, self._value) + +class SharedFolderMembers(object): + """ + Shared folder user and group membership. + + :ivar users: The list of user members of the shared folder. + :ivar groups: The list of group members of the shared folder. + :ivar invitees: The list of invited members of the shared folder. This list + will not include invitees that have already accepted or declined to join + the shared folder. + :ivar cursor: Present if there are additional shared folder members that + have not been returned yet. Pass the cursor into + list_folder_members/continue to list additional members. + """ + + __slots__ = [ + '_users_value', + '_users_present', + '_groups_value', + '_groups_present', + '_invitees_value', + '_invitees_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + users=None, + groups=None, + invitees=None, + cursor=None): + self._users_value = None + self._users_present = False + self._groups_value = None + self._groups_present = False + self._invitees_value = None + self._invitees_present = False + self._cursor_value = None + self._cursor_present = False + if users is not None: + self.users = users + if groups is not None: + self.groups = groups + if invitees is not None: + self.invitees = invitees + if cursor is not None: + self.cursor = cursor + + @property + def users(self): + """ + The list of user members of the shared folder. + + :rtype: list of [UserMembershipInfo] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + @property + def groups(self): + """ + The list of group members of the shared folder. + + :rtype: list of [GroupMembershipInfo] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + @property + def invitees(self): + """ + The list of invited members of the shared folder. This list will not + include invitees that have already accepted or declined to join the + shared folder. + + :rtype: list of [InviteeMembershipInfo] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + @property + def cursor(self): + """ + Present if there are additional shared folder members that have not been + returned yet. Pass the cursor into list_folder_members/continue to list + additional members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'SharedFolderMembers(users={!r}, groups={!r}, invitees={!r}, cursor={!r})'.format( + self._users_value, + self._groups_value, + self._invitees_value, + self._cursor_value, + ) + +class SharedFolderMetadata(object): + """ + The metadata which includes basic information about the shared folder. + + :ivar path_lower: The lower-cased full path of this shared folder. Absent + for unmounted folders. + :ivar name: The name of the this shared folder. + :ivar shared_folder_id: The ID of the shared folder. + :ivar access_type: The current user's access level for this shared folder. + :ivar is_team_folder: Whether this folder is a `team folder + `_. + :ivar policy: Policies governing this shared folder. + :ivar permissions: Actions the current user may perform on the folder and + its contents. The set of permissions corresponds to the MemberActions in + the request. + """ + + __slots__ = [ + '_path_lower_value', + '_path_lower_present', + '_name_value', + '_name_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + '_access_type_value', + '_access_type_present', + '_is_team_folder_value', + '_is_team_folder_present', + '_policy_value', + '_policy_present', + '_permissions_value', + '_permissions_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + shared_folder_id=None, + access_type=None, + is_team_folder=None, + policy=None, + path_lower=None, + permissions=None): + self._path_lower_value = None + self._path_lower_present = False + self._name_value = None + self._name_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._access_type_value = None + self._access_type_present = False + self._is_team_folder_value = None + self._is_team_folder_present = False + self._policy_value = None + self._policy_present = False + self._permissions_value = None + self._permissions_present = False + if path_lower is not None: + self.path_lower = path_lower + if name is not None: + self.name = name + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if access_type is not None: + self.access_type = access_type + if is_team_folder is not None: + self.is_team_folder = is_team_folder + if policy is not None: + self.policy = policy + if permissions is not None: + self.permissions = permissions + + @property + def path_lower(self): + """ + The lower-cased full path of this shared folder. Absent for unmounted + folders. + + :rtype: str + """ + if self._path_lower_present: + return self._path_lower_value + else: + return None + + @path_lower.setter + def path_lower(self, val): + if val is None: + del self.path_lower + return + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True + + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False + + @property + def name(self): + """ + The name of the this shared folder. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def shared_folder_id(self): + """ + The ID of the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def access_type(self): + """ + The current user's access level for this shared folder. + + :rtype: AccessLevel + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + @property + def is_team_folder(self): + """ + Whether this folder is a `team folder + `_. + + :rtype: bool + """ + if self._is_team_folder_present: + return self._is_team_folder_value + else: + raise AttributeError("missing required field 'is_team_folder'") + + @is_team_folder.setter + def is_team_folder(self, val): + val = self._is_team_folder_validator.validate(val) + self._is_team_folder_value = val + self._is_team_folder_present = True + + @is_team_folder.deleter + def is_team_folder(self): + self._is_team_folder_value = None + self._is_team_folder_present = False + + @property + def policy(self): + """ + Policies governing this shared folder. + + :rtype: FolderPolicy + """ + if self._policy_present: + return self._policy_value + else: + raise AttributeError("missing required field 'policy'") + + @policy.setter + def policy(self, val): + self._policy_validator.validate_type_only(val) + self._policy_value = val + self._policy_present = True + + @policy.deleter + def policy(self): + self._policy_value = None + self._policy_present = False + + @property + def permissions(self): + """ + Actions the current user may perform on the folder and its contents. The + set of permissions corresponds to the MemberActions in the request. + + :rtype: list of [FolderPermission] + """ + if self._permissions_present: + return self._permissions_value + else: + return None + + @permissions.setter + def permissions(self, val): + if val is None: + del self.permissions + return + val = self._permissions_validator.validate(val) + self._permissions_value = val + self._permissions_present = True + + @permissions.deleter + def permissions(self): + self._permissions_value = None + self._permissions_present = False + + def __repr__(self): + return 'SharedFolderMetadata(name={!r}, shared_folder_id={!r}, access_type={!r}, is_team_folder={!r}, policy={!r}, path_lower={!r}, permissions={!r})'.format( + self._name_value, + self._shared_folder_id_value, + self._access_type_value, + self._is_team_folder_value, + self._policy_value, + self._path_lower_value, + self._permissions_value, + ) + +class SharedLinkAccessFailureReason(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar login_required: User is not logged in. + :ivar email_verify_required: User's email is not verified. + :ivar password_required: The link is password protected. + :ivar team_only: Access is allowed for team members only. + :ivar owner_only: Access is allowed for the shared link's owner only. + :ivar other: An unknown accessibility failure. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + login_required = None + # Attribute is overwritten below the class definition + email_verify_required = None + # Attribute is overwritten below the class definition + password_required = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + owner_only = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_login_required(self): + """ + Check if the union tag is ``login_required``. + + :rtype: bool + """ + return self._tag == 'login_required' + + def is_email_verify_required(self): + """ + Check if the union tag is ``email_verify_required``. + + :rtype: bool + """ + return self._tag == 'email_verify_required' + + def is_password_required(self): + """ + Check if the union tag is ``password_required``. + + :rtype: bool + """ + return self._tag == 'password_required' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_owner_only(self): + """ + Check if the union tag is ``owner_only``. + + :rtype: bool + """ + return self._tag == 'owner_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharedLinkAccessFailureReason(%r, %r)' % (self._tag, self._value) + +class SharedLinkPolicy(object): + """ + Policy governing who can view shared links. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar anyone: Links can be shared with anyone. + :ivar members: Links can only be shared among members of the shared folder. + :ivar other: An unknown shared link policy. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + anyone = None + # Attribute is overwritten below the class definition + members = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_anyone(self): + """ + Check if the union tag is ``anyone``. + + :rtype: bool + """ + return self._tag == 'anyone' + + def is_members(self): + """ + Check if the union tag is ``members``. + + :rtype: bool + """ + return self._tag == 'members' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharedLinkPolicy(%r, %r)' % (self._tag, self._value) + +class SharedLinkSettings(object): + """ + :ivar requested_visibility: The requested access for this shared link. + :ivar link_password: If ``requested_visibility`` is + ``RequestedVisibility.password`` this is needed to specify the password + to access the link. + :ivar expires: Expiration time of the shared link. By default the link won't + expire. + """ + + __slots__ = [ + '_requested_visibility_value', + '_requested_visibility_present', + '_link_password_value', + '_link_password_present', + '_expires_value', + '_expires_present', + ] + + _has_required_fields = False + + def __init__(self, + requested_visibility=None, + link_password=None, + expires=None): + self._requested_visibility_value = None + self._requested_visibility_present = False + self._link_password_value = None + self._link_password_present = False + self._expires_value = None + self._expires_present = False + if requested_visibility is not None: + self.requested_visibility = requested_visibility + if link_password is not None: + self.link_password = link_password + if expires is not None: + self.expires = expires + + @property + def requested_visibility(self): + """ + The requested access for this shared link. + + :rtype: RequestedVisibility + """ + if self._requested_visibility_present: + return self._requested_visibility_value + else: + return None + + @requested_visibility.setter + def requested_visibility(self, val): + if val is None: + del self.requested_visibility + return + self._requested_visibility_validator.validate_type_only(val) + self._requested_visibility_value = val + self._requested_visibility_present = True + + @requested_visibility.deleter + def requested_visibility(self): + self._requested_visibility_value = None + self._requested_visibility_present = False + + @property + def link_password(self): + """ + If ``requested_visibility`` is ``RequestedVisibility.password`` this is + needed to specify the password to access the link. + + :rtype: str + """ + if self._link_password_present: + return self._link_password_value + else: + return None + + @link_password.setter + def link_password(self, val): + if val is None: + del self.link_password + return + val = self._link_password_validator.validate(val) + self._link_password_value = val + self._link_password_present = True + + @link_password.deleter + def link_password(self): + self._link_password_value = None + self._link_password_present = False + + @property + def expires(self): + """ + Expiration time of the shared link. By default the link won't expire. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value + else: + return None + + @expires.setter + def expires(self, val): + if val is None: + del self.expires + return + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True + + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False + + def __repr__(self): + return 'SharedLinkSettings(requested_visibility={!r}, link_password={!r}, expires={!r})'.format( + self._requested_visibility_value, + self._link_password_value, + self._expires_value, + ) + +class SharedLinkSettingsError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_settings: The given settings are invalid (for example, all + attributes of the :class:`SharedLinkSettings` are empty, the requested + visibility is ``RequestedVisibility.password`` but the + ``SharedLinkSettings.link_password`` is missing, + ``SharedLinkSettings.expires`` is set to the past, etc.) + :ivar not_authorized: User is not allowed to modify the settings of this + link. Note that basic users can only set ``RequestedVisibility.public`` + as the ``SharedLinkSettings.requested_visibility`` and cannot set + ``SharedLinkSettings.expires`` + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + invalid_settings = None + # Attribute is overwritten below the class definition + not_authorized = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_invalid_settings(self): + """ + Check if the union tag is ``invalid_settings``. + + :rtype: bool + """ + return self._tag == 'invalid_settings' + + def is_not_authorized(self): + """ + Check if the union tag is ``not_authorized``. + + :rtype: bool + """ + return self._tag == 'not_authorized' + + def __repr__(self): + return 'SharedLinkSettingsError(%r, %r)' % (self._tag, self._value) + +class TeamMemberInfo(object): + """ + Information about a team member. + + :ivar team_info: Information about the member's team + :ivar display_name: The display name of the user. + :ivar member_id: ID of user as a member of a team. This field will only be + present if the member is in the same team as current user. + """ + + __slots__ = [ + '_team_info_value', + '_team_info_present', + '_display_name_value', + '_display_name_present', + '_member_id_value', + '_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + team_info=None, + display_name=None, + member_id=None): + self._team_info_value = None + self._team_info_present = False + self._display_name_value = None + self._display_name_present = False + self._member_id_value = None + self._member_id_present = False + if team_info is not None: + self.team_info = team_info + if display_name is not None: + self.display_name = display_name + if member_id is not None: + self.member_id = member_id + + @property + def team_info(self): + """ + Information about the member's team + + :rtype: users.Team + """ + if self._team_info_present: + return self._team_info_value + else: + raise AttributeError("missing required field 'team_info'") + + @team_info.setter + def team_info(self, val): + self._team_info_validator.validate_type_only(val) + self._team_info_value = val + self._team_info_present = True + + @team_info.deleter + def team_info(self): + self._team_info_value = None + self._team_info_present = False + + @property + def display_name(self): + """ + The display name of the user. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + raise AttributeError("missing required field 'display_name'") + + @display_name.setter + def display_name(self, val): + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def member_id(self): + """ + ID of user as a member of a team. This field will only be present if the + member is in the same team as current user. + + :rtype: str + """ + if self._member_id_present: + return self._member_id_value + else: + return None + + @member_id.setter + def member_id(self, val): + if val is None: + del self.member_id + return + val = self._member_id_validator.validate(val) + self._member_id_value = val + self._member_id_present = True + + @member_id.deleter + def member_id(self): + self._member_id_value = None + self._member_id_present = False + + def __repr__(self): + return 'TeamMemberInfo(team_info={!r}, display_name={!r}, member_id={!r})'.format( + self._team_info_value, + self._display_name_value, + self._member_id_value, + ) + +class TransferFolderArg(object): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar to_dropbox_id: A account or team member ID to transfer ownership to. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_to_dropbox_id_value', + '_to_dropbox_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + to_dropbox_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._to_dropbox_id_value = None + self._to_dropbox_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if to_dropbox_id is not None: + self.to_dropbox_id = to_dropbox_id + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def to_dropbox_id(self): + """ + A account or team member ID to transfer ownership to. + + :rtype: str + """ + if self._to_dropbox_id_present: + return self._to_dropbox_id_value + else: + raise AttributeError("missing required field 'to_dropbox_id'") + + @to_dropbox_id.setter + def to_dropbox_id(self, val): + val = self._to_dropbox_id_validator.validate(val) + self._to_dropbox_id_value = val + self._to_dropbox_id_present = True + + @to_dropbox_id.deleter + def to_dropbox_id(self): + self._to_dropbox_id_value = None + self._to_dropbox_id_present = False + + def __repr__(self): + return 'TransferFolderArg(shared_folder_id={!r}, to_dropbox_id={!r})'.format( + self._shared_folder_id_value, + self._to_dropbox_id_value, + ) + +class TransferFolderError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_permission: The current account does not have permission to perform + this action. + :ivar invalid_dropbox_id: ``TransferFolderArg.to_dropbox_id`` is invalid. + :ivar new_owner_not_a_member: The new designated owner is not currently a + member of the shared folder. + :ivar new_owner_unmounted: The new desginated owner does not have the shared + folder mounted. + :ivar new_owner_email_unverified: The new designated owner's e-mail address + is unverified. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + invalid_dropbox_id = None + # Attribute is overwritten below the class definition + new_owner_not_a_member = None + # Attribute is overwritten below the class definition + new_owner_unmounted = None + # Attribute is overwritten below the class definition + new_owner_email_unverified = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: TransferFolderError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_invalid_dropbox_id(self): + """ + Check if the union tag is ``invalid_dropbox_id``. + + :rtype: bool + """ + return self._tag == 'invalid_dropbox_id' + + def is_new_owner_not_a_member(self): + """ + Check if the union tag is ``new_owner_not_a_member``. + + :rtype: bool + """ + return self._tag == 'new_owner_not_a_member' + + def is_new_owner_unmounted(self): + """ + Check if the union tag is ``new_owner_unmounted``. + + :rtype: bool + """ + return self._tag == 'new_owner_unmounted' + + def is_new_owner_email_unverified(self): + """ + Check if the union tag is ``new_owner_email_unverified``. + + :rtype: bool + """ + return self._tag == 'new_owner_email_unverified' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def __repr__(self): + return 'TransferFolderError(%r, %r)' % (self._tag, self._value) + +class UnmountFolderArg(object): + """ + :ivar shared_folder_id: The ID for the shared folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + def __repr__(self): + return 'UnmountFolderArg(shared_folder_id={!r})'.format( + self._shared_folder_id_value, + ) + +class UnmountFolderError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UnmountFolderError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def __repr__(self): + return 'UnmountFolderError(%r, %r)' % (self._tag, self._value) + +class UnshareFolderArg(object): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar leave_a_copy: If true, members of this shared folder will get a copy + of this folder after it's unshared. Otherwise, it will be removed from + their Dropbox. The current user, who is an owner, will always retain + their copy. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_leave_a_copy_value', + '_leave_a_copy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + leave_a_copy=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._leave_a_copy_value = None + self._leave_a_copy_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if leave_a_copy is not None: + self.leave_a_copy = leave_a_copy + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def leave_a_copy(self): + """ + If true, members of this shared folder will get a copy of this folder + after it's unshared. Otherwise, it will be removed from their Dropbox. + The current user, who is an owner, will always retain their copy. + + :rtype: bool + """ + if self._leave_a_copy_present: + return self._leave_a_copy_value + else: + raise AttributeError("missing required field 'leave_a_copy'") + + @leave_a_copy.setter + def leave_a_copy(self, val): + val = self._leave_a_copy_validator.validate(val) + self._leave_a_copy_value = val + self._leave_a_copy_present = True + + @leave_a_copy.deleter + def leave_a_copy(self): + self._leave_a_copy_value = None + self._leave_a_copy_present = False + + def __repr__(self): + return 'UnshareFolderArg(shared_folder_id={!r}, leave_a_copy={!r})'.format( + self._shared_folder_id_value, + self._leave_a_copy_value, + ) + +class UnshareFolderError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UnshareFolderError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def __repr__(self): + return 'UnshareFolderError(%r, %r)' % (self._tag, self._value) + +class UpdateFolderMemberArg(object): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar member: The member of the shared folder to update. Only the + ``MemberSelector.dropbox_id`` may be set at this time. + :ivar access_level: The new access level for ``member``. + ``AccessLevel.owner`` is disallowed. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_member_value', + '_member_present', + '_access_level_value', + '_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + member=None, + access_level=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._member_value = None + self._member_present = False + self._access_level_value = None + self._access_level_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if member is not None: + self.member = member + if access_level is not None: + self.access_level = access_level + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def member(self): + """ + The member of the shared folder to update. Only the + ``MemberSelector.dropbox_id`` may be set at this time. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def access_level(self): + """ + The new access level for ``member``. ``AccessLevel.owner`` is + disallowed. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + raise AttributeError("missing required field 'access_level'") + + @access_level.setter + def access_level(self, val): + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + def __repr__(self): + return 'UpdateFolderMemberArg(shared_folder_id={!r}, member={!r}, access_level={!r})'.format( + self._shared_folder_id_value, + self._member_value, + self._access_level_value, + ) + +class UpdateFolderMemberError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar insufficient_plan: The current user's account doesn't support this + action. An example of this is when downgrading a member from editor to + viewer. This action can only be performed by users that have upgraded to + a Pro or Business plan. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + insufficient_plan = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UpdateFolderMemberError + """ + return cls('access_error', val) + + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param SharedFolderMemberError val: + :rtype: UpdateFolderMemberError + """ + return cls('member_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_member_error(self): + """ + Check if the union tag is ``member_error``. + + :rtype: bool + """ + return self._tag == 'member_error' + + def is_insufficient_plan(self): + """ + Check if the union tag is ``insufficient_plan``. + + :rtype: bool + """ + return self._tag == 'insufficient_plan' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_member_error(self): + """ + Only call this if :meth:`is_member_error` is true. + + :rtype: SharedFolderMemberError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value + + def __repr__(self): + return 'UpdateFolderMemberError(%r, %r)' % (self._tag, self._value) + +class UpdateFolderPolicyArg(object): + """ + If any of the policy's are unset, then they retain their current setting. + + :ivar shared_folder_id: The ID for the shared folder. + :ivar member_policy: Who can be a member of this shared folder. Only set + this if the current user is on a team. + :ivar acl_update_policy: Who can add and remove members of this shared + folder. + :ivar shared_link_policy: The policy to apply to shared links created for + content inside this shared folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_member_policy_value', + '_member_policy_present', + '_acl_update_policy_value', + '_acl_update_policy_present', + '_shared_link_policy_value', + '_shared_link_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + member_policy=None, + acl_update_policy=None, + shared_link_policy=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._member_policy_value = None + self._member_policy_present = False + self._acl_update_policy_value = None + self._acl_update_policy_present = False + self._shared_link_policy_value = None + self._shared_link_policy_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if member_policy is not None: + self.member_policy = member_policy + if acl_update_policy is not None: + self.acl_update_policy = acl_update_policy + if shared_link_policy is not None: + self.shared_link_policy = shared_link_policy + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def member_policy(self): + """ + Who can be a member of this shared folder. Only set this if the current + user is on a team. + + :rtype: MemberPolicy + """ + if self._member_policy_present: + return self._member_policy_value + else: + return None + + @member_policy.setter + def member_policy(self, val): + if val is None: + del self.member_policy + return + self._member_policy_validator.validate_type_only(val) + self._member_policy_value = val + self._member_policy_present = True + + @member_policy.deleter + def member_policy(self): + self._member_policy_value = None + self._member_policy_present = False + + @property + def acl_update_policy(self): + """ + Who can add and remove members of this shared folder. + + :rtype: AclUpdatePolicy + """ + if self._acl_update_policy_present: + return self._acl_update_policy_value + else: + return None + + @acl_update_policy.setter + def acl_update_policy(self, val): + if val is None: + del self.acl_update_policy + return + self._acl_update_policy_validator.validate_type_only(val) + self._acl_update_policy_value = val + self._acl_update_policy_present = True + + @acl_update_policy.deleter + def acl_update_policy(self): + self._acl_update_policy_value = None + self._acl_update_policy_present = False + + @property + def shared_link_policy(self): + """ + The policy to apply to shared links created for content inside this + shared folder. + + :rtype: SharedLinkPolicy + """ + if self._shared_link_policy_present: + return self._shared_link_policy_value + else: + return None + + @shared_link_policy.setter + def shared_link_policy(self, val): + if val is None: + del self.shared_link_policy + return + self._shared_link_policy_validator.validate_type_only(val) + self._shared_link_policy_value = val + self._shared_link_policy_present = True + + @shared_link_policy.deleter + def shared_link_policy(self): + self._shared_link_policy_value = None + self._shared_link_policy_present = False + + def __repr__(self): + return 'UpdateFolderPolicyArg(shared_folder_id={!r}, member_policy={!r}, acl_update_policy={!r}, shared_link_policy={!r})'.format( + self._shared_folder_id_value, + self._member_policy_value, + self._acl_update_policy_value, + self._shared_link_policy_value, + ) + +class UpdateFolderPolicyError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar not_on_team: ``UpdateFolderPolicyArg.member_policy`` was set even + though user is not on a team. + :ivar team_policy_disallows_member_policy: Team policy is more restrictive + than ``ShareFolderArg.member_policy``. + :ivar disallowed_shared_link_policy: The current account is not allowed to + select the specified ``ShareFolderArg.shared_link_policy``. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + not_on_team = None + # Attribute is overwritten below the class definition + team_policy_disallows_member_policy = None + # Attribute is overwritten below the class definition + disallowed_shared_link_policy = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UpdateFolderPolicyError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_not_on_team(self): + """ + Check if the union tag is ``not_on_team``. + + :rtype: bool + """ + return self._tag == 'not_on_team' + + def is_team_policy_disallows_member_policy(self): + """ + Check if the union tag is ``team_policy_disallows_member_policy``. + + :rtype: bool + """ + return self._tag == 'team_policy_disallows_member_policy' + + def is_disallowed_shared_link_policy(self): + """ + Check if the union tag is ``disallowed_shared_link_policy``. + + :rtype: bool + """ + return self._tag == 'disallowed_shared_link_policy' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def __repr__(self): + return 'UpdateFolderPolicyError(%r, %r)' % (self._tag, self._value) + +class UserInfo(object): + """ + Basic information about a user. Use users.get_account and + users.get_account_batch` to obtain more detailed information. + + :ivar account_id: The account ID of the user. + :ivar same_team: If the user is in the same team as current user. + :ivar team_member_id: The team member ID of the shared folder member. Only + present if ``same_team`` is true. + """ + + __slots__ = [ + '_account_id_value', + '_account_id_present', + '_same_team_value', + '_same_team_present', + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + account_id=None, + same_team=None, + team_member_id=None): + self._account_id_value = None + self._account_id_present = False + self._same_team_value = None + self._same_team_present = False + self._team_member_id_value = None + self._team_member_id_present = False + if account_id is not None: + self.account_id = account_id + if same_team is not None: + self.same_team = same_team + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def account_id(self): + """ + The account ID of the user. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + raise AttributeError("missing required field 'account_id'") + + @account_id.setter + def account_id(self, val): + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + @property + def same_team(self): + """ + If the user is in the same team as current user. + + :rtype: bool + """ + if self._same_team_present: + return self._same_team_value + else: + raise AttributeError("missing required field 'same_team'") + + @same_team.setter + def same_team(self, val): + val = self._same_team_validator.validate(val) + self._same_team_value = val + self._same_team_present = True + + @same_team.deleter + def same_team(self): + self._same_team_value = None + self._same_team_present = False + + @property + def team_member_id(self): + """ + The team member ID of the shared folder member. Only present if + ``same_team`` is true. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + return None + + @team_member_id.setter + def team_member_id(self, val): + if val is None: + del self.team_member_id + return + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def __repr__(self): + return 'UserInfo(account_id={!r}, same_team={!r}, team_member_id={!r})'.format( + self._account_id_value, + self._same_team_value, + self._team_member_id_value, + ) + +class UserMembershipInfo(MembershipInfo): + """ + The information about a user member of the shared folder. + + :ivar user: The account information for the membership user. + """ + + __slots__ = [ + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + user=None, + permissions=None): + super(UserMembershipInfo, self).__init__(access_type, + permissions) + self._user_value = None + self._user_present = False + if user is not None: + self.user = user + + @property + def user(self): + """ + The account information for the membership user. + + :rtype: UserInfo + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def __repr__(self): + return 'UserMembershipInfo(access_type={!r}, user={!r}, permissions={!r})'.format( + self._access_type_value, + self._user_value, + self._permissions_value, + ) + +class Visibility(object): + """ + Who can access a shared link. The most open visibility is ``public``. The + default depends on many aspects, such as team and user preferences and + shared folder settings. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar public: Anyone who has received the link can access it. No login + required. + :ivar team_only: Only members of the same team can access the link. Login is + required. + :ivar password: A link-specific password is required to access the link. + Login is not required. + :ivar team_and_password: Only members of the same team who have the + link-specific password can access the link. + :ivar shared_folder_only: Only members of the shared folder containing the + linked file can access the link. Login is required. + :ivar other: An unknown restriction is in place. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + public = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + password = None + # Attribute is overwritten below the class definition + team_and_password = None + # Attribute is overwritten below the class definition + shared_folder_only = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_public(self): + """ + Check if the union tag is ``public``. + + :rtype: bool + """ + return self._tag == 'public' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_password(self): + """ + Check if the union tag is ``password``. + + :rtype: bool + """ + return self._tag == 'password' + + def is_team_and_password(self): + """ + Check if the union tag is ``team_and_password``. + + :rtype: bool + """ + return self._tag == 'team_and_password' + + def is_shared_folder_only(self): + """ + Check if the union tag is ``shared_folder_only``. + + :rtype: bool + """ + return self._tag == 'shared_folder_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'Visibility(%r, %r)' % (self._tag, self._value) + +AccessLevel._owner_validator = bv.Void() +AccessLevel._editor_validator = bv.Void() +AccessLevel._viewer_validator = bv.Void() +AccessLevel._other_validator = bv.Void() +AccessLevel._tagmap = { + 'owner': AccessLevel._owner_validator, + 'editor': AccessLevel._editor_validator, + 'viewer': AccessLevel._viewer_validator, + 'other': AccessLevel._other_validator, +} + +AccessLevel.owner = AccessLevel('owner') +AccessLevel.editor = AccessLevel('editor') +AccessLevel.viewer = AccessLevel('viewer') +AccessLevel.other = AccessLevel('other') + +AclUpdatePolicy._owner_validator = bv.Void() +AclUpdatePolicy._editors_validator = bv.Void() +AclUpdatePolicy._other_validator = bv.Void() +AclUpdatePolicy._tagmap = { + 'owner': AclUpdatePolicy._owner_validator, + 'editors': AclUpdatePolicy._editors_validator, + 'other': AclUpdatePolicy._other_validator, +} + +AclUpdatePolicy.owner = AclUpdatePolicy('owner') +AclUpdatePolicy.editors = AclUpdatePolicy('editors') +AclUpdatePolicy.other = AclUpdatePolicy('other') + +AddFolderMemberArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +AddFolderMemberArg._members_validator = bv.List(bv.Struct(AddMember)) +AddFolderMemberArg._quiet_validator = bv.Boolean() +AddFolderMemberArg._custom_message_validator = bv.Nullable(bv.String(min_length=1)) +AddFolderMemberArg._all_field_names_ = set([ + 'shared_folder_id', + 'members', + 'quiet', + 'custom_message', +]) +AddFolderMemberArg._all_fields_ = [ + ('shared_folder_id', AddFolderMemberArg._shared_folder_id_validator), + ('members', AddFolderMemberArg._members_validator), + ('quiet', AddFolderMemberArg._quiet_validator), + ('custom_message', AddFolderMemberArg._custom_message_validator), +] + +AddFolderMemberError._access_error_validator = bv.Union(SharedFolderAccessError) +AddFolderMemberError._email_unverified_validator = bv.Void() +AddFolderMemberError._bad_member_validator = bv.Union(AddMemberSelectorError) +AddFolderMemberError._no_permission_validator = bv.Void() +AddFolderMemberError._cant_share_outside_team_validator = bv.Void() +AddFolderMemberError._too_many_members_validator = bv.UInt64() +AddFolderMemberError._too_many_pending_invites_validator = bv.UInt64() +AddFolderMemberError._rate_limit_validator = bv.Void() +AddFolderMemberError._insufficient_plan_validator = bv.Void() +AddFolderMemberError._other_validator = bv.Void() +AddFolderMemberError._tagmap = { + 'access_error': AddFolderMemberError._access_error_validator, + 'email_unverified': AddFolderMemberError._email_unverified_validator, + 'bad_member': AddFolderMemberError._bad_member_validator, + 'no_permission': AddFolderMemberError._no_permission_validator, + 'cant_share_outside_team': AddFolderMemberError._cant_share_outside_team_validator, + 'too_many_members': AddFolderMemberError._too_many_members_validator, + 'too_many_pending_invites': AddFolderMemberError._too_many_pending_invites_validator, + 'rate_limit': AddFolderMemberError._rate_limit_validator, + 'insufficient_plan': AddFolderMemberError._insufficient_plan_validator, + 'other': AddFolderMemberError._other_validator, +} + +AddFolderMemberError.email_unverified = AddFolderMemberError('email_unverified') +AddFolderMemberError.no_permission = AddFolderMemberError('no_permission') +AddFolderMemberError.cant_share_outside_team = AddFolderMemberError('cant_share_outside_team') +AddFolderMemberError.rate_limit = AddFolderMemberError('rate_limit') +AddFolderMemberError.insufficient_plan = AddFolderMemberError('insufficient_plan') +AddFolderMemberError.other = AddFolderMemberError('other') + +AddMember._member_validator = bv.Union(MemberSelector) +AddMember._access_level_validator = bv.Union(AccessLevel) +AddMember._all_field_names_ = set([ + 'member', + 'access_level', +]) +AddMember._all_fields_ = [ + ('member', AddMember._member_validator), + ('access_level', AddMember._access_level_validator), +] + +AddMemberSelectorError._invalid_dropbox_id_validator = bv.String(min_length=1) +AddMemberSelectorError._invalid_email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +AddMemberSelectorError._unverified_dropbox_id_validator = bv.String(min_length=1) +AddMemberSelectorError._group_deleted_validator = bv.Void() +AddMemberSelectorError._group_not_on_team_validator = bv.Void() +AddMemberSelectorError._other_validator = bv.Void() +AddMemberSelectorError._tagmap = { + 'invalid_dropbox_id': AddMemberSelectorError._invalid_dropbox_id_validator, + 'invalid_email': AddMemberSelectorError._invalid_email_validator, + 'unverified_dropbox_id': AddMemberSelectorError._unverified_dropbox_id_validator, + 'group_deleted': AddMemberSelectorError._group_deleted_validator, + 'group_not_on_team': AddMemberSelectorError._group_not_on_team_validator, + 'other': AddMemberSelectorError._other_validator, +} + +AddMemberSelectorError.group_deleted = AddMemberSelectorError('group_deleted') +AddMemberSelectorError.group_not_on_team = AddMemberSelectorError('group_not_on_team') +AddMemberSelectorError.other = AddMemberSelectorError('other') + +LinkMetadata._url_validator = bv.String() +LinkMetadata._visibility_validator = bv.Union(Visibility) +LinkMetadata._expires_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +LinkMetadata._field_names_ = set([ + 'url', + 'visibility', + 'expires', +]) +LinkMetadata._all_field_names_ = LinkMetadata._field_names_ +LinkMetadata._fields_ = [ + ('url', LinkMetadata._url_validator), + ('visibility', LinkMetadata._visibility_validator), + ('expires', LinkMetadata._expires_validator), +] +LinkMetadata._all_fields_ = LinkMetadata._fields_ + +LinkMetadata._tag_to_subtype_ = { + (u'path',): bv.Struct(PathLinkMetadata), + (u'collection',): bv.Struct(CollectionLinkMetadata), +} +LinkMetadata._pytype_to_tag_and_subtype_ = { + PathLinkMetadata: ((u'path',), bv.Struct(PathLinkMetadata)), + CollectionLinkMetadata: ((u'collection',), bv.Struct(CollectionLinkMetadata)), +} +LinkMetadata._is_catch_all_ = True + +CollectionLinkMetadata._field_names_ = set([]) CollectionLinkMetadata._all_field_names_ = LinkMetadata._all_field_names_.union(CollectionLinkMetadata._field_names_) CollectionLinkMetadata._fields_ = [] CollectionLinkMetadata._all_fields_ = LinkMetadata._all_fields_ + CollectionLinkMetadata._fields_ -GetSharedLinksArg._path_validator = bv.Nullable(bv.String()) -GetSharedLinksArg._all_field_names_ = set(['path']) -GetSharedLinksArg._all_fields_ = [('path', GetSharedLinksArg._path_validator)] +CreateSharedLinkArg._path_validator = bv.String() +CreateSharedLinkArg._short_url_validator = bv.Boolean() +CreateSharedLinkArg._pending_upload_validator = bv.Nullable(bv.Union(PendingUploadMode)) +CreateSharedLinkArg._all_field_names_ = set([ + 'path', + 'short_url', + 'pending_upload', +]) +CreateSharedLinkArg._all_fields_ = [ + ('path', CreateSharedLinkArg._path_validator), + ('short_url', CreateSharedLinkArg._short_url_validator), + ('pending_upload', CreateSharedLinkArg._pending_upload_validator), +] + +CreateSharedLinkError._path_validator = bv.Union(files.LookupError) +CreateSharedLinkError._other_validator = bv.Void() +CreateSharedLinkError._tagmap = { + 'path': CreateSharedLinkError._path_validator, + 'other': CreateSharedLinkError._other_validator, +} + +CreateSharedLinkError.other = CreateSharedLinkError('other') + +CreateSharedLinkWithSettingsArg._path_validator = bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})') +CreateSharedLinkWithSettingsArg._settings_validator = bv.Nullable(bv.Struct(SharedLinkSettings)) +CreateSharedLinkWithSettingsArg._all_field_names_ = set([ + 'path', + 'settings', +]) +CreateSharedLinkWithSettingsArg._all_fields_ = [ + ('path', CreateSharedLinkWithSettingsArg._path_validator), + ('settings', CreateSharedLinkWithSettingsArg._settings_validator), +] + +CreateSharedLinkWithSettingsError._path_validator = bv.Union(files.LookupError) +CreateSharedLinkWithSettingsError._email_not_verified_validator = bv.Void() +CreateSharedLinkWithSettingsError._shared_link_already_exists_validator = bv.Void() +CreateSharedLinkWithSettingsError._settings_error_validator = bv.Union(SharedLinkSettingsError) +CreateSharedLinkWithSettingsError._access_denied_validator = bv.Void() +CreateSharedLinkWithSettingsError._tagmap = { + 'path': CreateSharedLinkWithSettingsError._path_validator, + 'email_not_verified': CreateSharedLinkWithSettingsError._email_not_verified_validator, + 'shared_link_already_exists': CreateSharedLinkWithSettingsError._shared_link_already_exists_validator, + 'settings_error': CreateSharedLinkWithSettingsError._settings_error_validator, + 'access_denied': CreateSharedLinkWithSettingsError._access_denied_validator, +} + +CreateSharedLinkWithSettingsError.email_not_verified = CreateSharedLinkWithSettingsError('email_not_verified') +CreateSharedLinkWithSettingsError.shared_link_already_exists = CreateSharedLinkWithSettingsError('shared_link_already_exists') +CreateSharedLinkWithSettingsError.access_denied = CreateSharedLinkWithSettingsError('access_denied') + +SharedLinkMetadata._url_validator = bv.String() +SharedLinkMetadata._id_validator = bv.Nullable(bv.String(min_length=1)) +SharedLinkMetadata._name_validator = bv.String() +SharedLinkMetadata._expires_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +SharedLinkMetadata._path_lower_validator = bv.Nullable(bv.String()) +SharedLinkMetadata._link_permissions_validator = bv.Struct(LinkPermissions) +SharedLinkMetadata._team_member_info_validator = bv.Nullable(bv.Struct(TeamMemberInfo)) +SharedLinkMetadata._content_owner_team_info_validator = bv.Nullable(bv.Struct(users.Team)) +SharedLinkMetadata._field_names_ = set([ + 'url', + 'id', + 'name', + 'expires', + 'path_lower', + 'link_permissions', + 'team_member_info', + 'content_owner_team_info', +]) +SharedLinkMetadata._all_field_names_ = SharedLinkMetadata._field_names_ +SharedLinkMetadata._fields_ = [ + ('url', SharedLinkMetadata._url_validator), + ('id', SharedLinkMetadata._id_validator), + ('name', SharedLinkMetadata._name_validator), + ('expires', SharedLinkMetadata._expires_validator), + ('path_lower', SharedLinkMetadata._path_lower_validator), + ('link_permissions', SharedLinkMetadata._link_permissions_validator), + ('team_member_info', SharedLinkMetadata._team_member_info_validator), + ('content_owner_team_info', SharedLinkMetadata._content_owner_team_info_validator), +] +SharedLinkMetadata._all_fields_ = SharedLinkMetadata._fields_ + +SharedLinkMetadata._tag_to_subtype_ = { + (u'file',): bv.Struct(FileLinkMetadata), + (u'folder',): bv.Struct(FolderLinkMetadata), +} +SharedLinkMetadata._pytype_to_tag_and_subtype_ = { + FileLinkMetadata: ((u'file',), bv.Struct(FileLinkMetadata)), + FolderLinkMetadata: ((u'folder',), bv.Struct(FolderLinkMetadata)), +} +SharedLinkMetadata._is_catch_all_ = True + +FileLinkMetadata._client_modified_validator = bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ') +FileLinkMetadata._server_modified_validator = bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ') +FileLinkMetadata._rev_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') +FileLinkMetadata._size_validator = bv.UInt64() +FileLinkMetadata._field_names_ = set([ + 'client_modified', + 'server_modified', + 'rev', + 'size', +]) +FileLinkMetadata._all_field_names_ = SharedLinkMetadata._all_field_names_.union(FileLinkMetadata._field_names_) +FileLinkMetadata._fields_ = [ + ('client_modified', FileLinkMetadata._client_modified_validator), + ('server_modified', FileLinkMetadata._server_modified_validator), + ('rev', FileLinkMetadata._rev_validator), + ('size', FileLinkMetadata._size_validator), +] +FileLinkMetadata._all_fields_ = SharedLinkMetadata._all_fields_ + FileLinkMetadata._fields_ + +FolderAction._change_options_validator = bv.Void() +FolderAction._edit_contents_validator = bv.Void() +FolderAction._unmount_validator = bv.Void() +FolderAction._unshare_validator = bv.Void() +FolderAction._other_validator = bv.Void() +FolderAction._tagmap = { + 'change_options': FolderAction._change_options_validator, + 'edit_contents': FolderAction._edit_contents_validator, + 'unmount': FolderAction._unmount_validator, + 'unshare': FolderAction._unshare_validator, + 'other': FolderAction._other_validator, +} + +FolderAction.change_options = FolderAction('change_options') +FolderAction.edit_contents = FolderAction('edit_contents') +FolderAction.unmount = FolderAction('unmount') +FolderAction.unshare = FolderAction('unshare') +FolderAction.other = FolderAction('other') + +FolderLinkMetadata._field_names_ = set([]) +FolderLinkMetadata._all_field_names_ = SharedLinkMetadata._all_field_names_.union(FolderLinkMetadata._field_names_) +FolderLinkMetadata._fields_ = [] +FolderLinkMetadata._all_fields_ = SharedLinkMetadata._all_fields_ + FolderLinkMetadata._fields_ + +FolderPermission._action_validator = bv.Union(FolderAction) +FolderPermission._allow_validator = bv.Boolean() +FolderPermission._reason_validator = bv.Nullable(bv.Union(PermissionDeniedReason)) +FolderPermission._all_field_names_ = set([ + 'action', + 'allow', + 'reason', +]) +FolderPermission._all_fields_ = [ + ('action', FolderPermission._action_validator), + ('allow', FolderPermission._allow_validator), + ('reason', FolderPermission._reason_validator), +] + +FolderPolicy._member_policy_validator = bv.Nullable(bv.Union(MemberPolicy)) +FolderPolicy._acl_update_policy_validator = bv.Union(AclUpdatePolicy) +FolderPolicy._shared_link_policy_validator = bv.Union(SharedLinkPolicy) +FolderPolicy._all_field_names_ = set([ + 'member_policy', + 'acl_update_policy', + 'shared_link_policy', +]) +FolderPolicy._all_fields_ = [ + ('member_policy', FolderPolicy._member_policy_validator), + ('acl_update_policy', FolderPolicy._acl_update_policy_validator), + ('shared_link_policy', FolderPolicy._shared_link_policy_validator), +] + +GetMetadataArgs._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +GetMetadataArgs._actions_validator = bv.Nullable(bv.List(bv.Union(FolderAction))) +GetMetadataArgs._all_field_names_ = set([ + 'shared_folder_id', + 'actions', +]) +GetMetadataArgs._all_fields_ = [ + ('shared_folder_id', GetMetadataArgs._shared_folder_id_validator), + ('actions', GetMetadataArgs._actions_validator), +] + +SharedLinkError._shared_link_not_found_validator = bv.Void() +SharedLinkError._shared_link_access_denied_validator = bv.Void() +SharedLinkError._other_validator = bv.Void() +SharedLinkError._tagmap = { + 'shared_link_not_found': SharedLinkError._shared_link_not_found_validator, + 'shared_link_access_denied': SharedLinkError._shared_link_access_denied_validator, + 'other': SharedLinkError._other_validator, +} + +SharedLinkError.shared_link_not_found = SharedLinkError('shared_link_not_found') +SharedLinkError.shared_link_access_denied = SharedLinkError('shared_link_access_denied') +SharedLinkError.other = SharedLinkError('other') + +GetSharedLinkFileError._shared_link_is_directory_validator = bv.Void() +GetSharedLinkFileError._tagmap = { + 'shared_link_is_directory': GetSharedLinkFileError._shared_link_is_directory_validator, +} +GetSharedLinkFileError._tagmap.update(SharedLinkError._tagmap) + +GetSharedLinkFileError.shared_link_is_directory = GetSharedLinkFileError('shared_link_is_directory') + +GetSharedLinkMetadataArg._url_validator = bv.String() +GetSharedLinkMetadataArg._path_validator = bv.Nullable(bv.String(pattern=u'/.*')) +GetSharedLinkMetadataArg._link_password_validator = bv.Nullable(bv.String()) +GetSharedLinkMetadataArg._all_field_names_ = set([ + 'url', + 'path', + 'link_password', +]) +GetSharedLinkMetadataArg._all_fields_ = [ + ('url', GetSharedLinkMetadataArg._url_validator), + ('path', GetSharedLinkMetadataArg._path_validator), + ('link_password', GetSharedLinkMetadataArg._link_password_validator), +] + +GetSharedLinksArg._path_validator = bv.Nullable(bv.String()) +GetSharedLinksArg._all_field_names_ = set(['path']) +GetSharedLinksArg._all_fields_ = [('path', GetSharedLinksArg._path_validator)] + +GetSharedLinksError._path_validator = bv.Nullable(bv.String()) +GetSharedLinksError._other_validator = bv.Void() +GetSharedLinksError._tagmap = { + 'path': GetSharedLinksError._path_validator, + 'other': GetSharedLinksError._other_validator, +} + +GetSharedLinksError.other = GetSharedLinksError('other') + +GetSharedLinksResult._links_validator = bv.List(bv.StructTree(LinkMetadata)) +GetSharedLinksResult._all_field_names_ = set(['links']) +GetSharedLinksResult._all_fields_ = [('links', GetSharedLinksResult._links_validator)] + +GroupInfo._same_team_validator = bv.Boolean() +GroupInfo._all_field_names_ = team.GroupSummary._all_field_names_.union(set(['same_team'])) +GroupInfo._all_fields_ = team.GroupSummary._all_fields_ + [('same_team', GroupInfo._same_team_validator)] + +MembershipInfo._access_type_validator = bv.Union(AccessLevel) +MembershipInfo._permissions_validator = bv.Nullable(bv.List(bv.Struct(MemberPermission))) +MembershipInfo._all_field_names_ = set([ + 'access_type', + 'permissions', +]) +MembershipInfo._all_fields_ = [ + ('access_type', MembershipInfo._access_type_validator), + ('permissions', MembershipInfo._permissions_validator), +] + +GroupMembershipInfo._group_validator = bv.Struct(GroupInfo) +GroupMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['group'])) +GroupMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('group', GroupMembershipInfo._group_validator)] + +InviteeInfo._email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +InviteeInfo._other_validator = bv.Void() +InviteeInfo._tagmap = { + 'email': InviteeInfo._email_validator, + 'other': InviteeInfo._other_validator, +} + +InviteeInfo.other = InviteeInfo('other') + +InviteeMembershipInfo._invitee_validator = bv.Union(InviteeInfo) +InviteeMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['invitee'])) +InviteeMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('invitee', InviteeMembershipInfo._invitee_validator)] + +JobError._access_error_validator = bv.Union(SharedFolderAccessError) +JobError._member_error_validator = bv.Union(SharedFolderMemberError) +JobError._other_validator = bv.Void() +JobError._tagmap = { + 'access_error': JobError._access_error_validator, + 'member_error': JobError._member_error_validator, + 'other': JobError._other_validator, +} + +JobError.other = JobError('other') + +JobStatus._complete_validator = bv.Void() +JobStatus._failed_validator = bv.Union(JobError) +JobStatus._tagmap = { + 'complete': JobStatus._complete_validator, + 'failed': JobStatus._failed_validator, +} +JobStatus._tagmap.update(async.PollResultBase._tagmap) + +JobStatus.complete = JobStatus('complete') + +LinkPermissions._resolved_visibility_validator = bv.Nullable(bv.Union(ResolvedVisibility)) +LinkPermissions._requested_visibility_validator = bv.Nullable(bv.Union(RequestedVisibility)) +LinkPermissions._can_revoke_validator = bv.Boolean() +LinkPermissions._revoke_failure_reason_validator = bv.Nullable(bv.Union(SharedLinkAccessFailureReason)) +LinkPermissions._all_field_names_ = set([ + 'resolved_visibility', + 'requested_visibility', + 'can_revoke', + 'revoke_failure_reason', +]) +LinkPermissions._all_fields_ = [ + ('resolved_visibility', LinkPermissions._resolved_visibility_validator), + ('requested_visibility', LinkPermissions._requested_visibility_validator), + ('can_revoke', LinkPermissions._can_revoke_validator), + ('revoke_failure_reason', LinkPermissions._revoke_failure_reason_validator), +] + +ListFolderMembersArgs._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +ListFolderMembersArgs._actions_validator = bv.Nullable(bv.List(bv.Union(MemberAction))) +ListFolderMembersArgs._all_field_names_ = set([ + 'shared_folder_id', + 'actions', +]) +ListFolderMembersArgs._all_fields_ = [ + ('shared_folder_id', ListFolderMembersArgs._shared_folder_id_validator), + ('actions', ListFolderMembersArgs._actions_validator), +] + +ListFolderMembersContinueArg._cursor_validator = bv.String() +ListFolderMembersContinueArg._all_field_names_ = set(['cursor']) +ListFolderMembersContinueArg._all_fields_ = [('cursor', ListFolderMembersContinueArg._cursor_validator)] + +ListFolderMembersContinueError._access_error_validator = bv.Union(SharedFolderAccessError) +ListFolderMembersContinueError._invalid_cursor_validator = bv.Void() +ListFolderMembersContinueError._other_validator = bv.Void() +ListFolderMembersContinueError._tagmap = { + 'access_error': ListFolderMembersContinueError._access_error_validator, + 'invalid_cursor': ListFolderMembersContinueError._invalid_cursor_validator, + 'other': ListFolderMembersContinueError._other_validator, +} + +ListFolderMembersContinueError.invalid_cursor = ListFolderMembersContinueError('invalid_cursor') +ListFolderMembersContinueError.other = ListFolderMembersContinueError('other') -GetSharedLinksResult._links_validator = bv.List(bv.StructTree(LinkMetadata)) -GetSharedLinksResult._all_field_names_ = set(['links']) -GetSharedLinksResult._all_fields_ = [('links', GetSharedLinksResult._links_validator)] +ListFoldersContinueArg._cursor_validator = bv.String() +ListFoldersContinueArg._all_field_names_ = set(['cursor']) +ListFoldersContinueArg._all_fields_ = [('cursor', ListFoldersContinueArg._cursor_validator)] -GetSharedLinksError._path_validator = bv.Nullable(bv.String()) -GetSharedLinksError._other_validator = bv.Void() -GetSharedLinksError._tagmap = { - 'path': GetSharedLinksError._path_validator, - 'other': GetSharedLinksError._other_validator, +ListFoldersContinueError._invalid_cursor_validator = bv.Void() +ListFoldersContinueError._other_validator = bv.Void() +ListFoldersContinueError._tagmap = { + 'invalid_cursor': ListFoldersContinueError._invalid_cursor_validator, + 'other': ListFoldersContinueError._other_validator, } -GetSharedLinksError.other = GetSharedLinksError('other') - -PendingUploadMode._file_validator = bv.Void() -PendingUploadMode._folder_validator = bv.Void() -PendingUploadMode._tagmap = { - 'file': PendingUploadMode._file_validator, - 'folder': PendingUploadMode._folder_validator, -} +ListFoldersContinueError.invalid_cursor = ListFoldersContinueError('invalid_cursor') +ListFoldersContinueError.other = ListFoldersContinueError('other') -PendingUploadMode.file = PendingUploadMode('file') -PendingUploadMode.folder = PendingUploadMode('folder') +ListFoldersResult._entries_validator = bv.List(bv.Struct(SharedFolderMetadata)) +ListFoldersResult._cursor_validator = bv.Nullable(bv.String()) +ListFoldersResult._all_field_names_ = set([ + 'entries', + 'cursor', +]) +ListFoldersResult._all_fields_ = [ + ('entries', ListFoldersResult._entries_validator), + ('cursor', ListFoldersResult._cursor_validator), +] -CreateSharedLinkArg._path_validator = bv.String() -CreateSharedLinkArg._short_url_validator = bv.Boolean() -CreateSharedLinkArg._pending_upload_validator = bv.Nullable(bv.Union(PendingUploadMode)) -CreateSharedLinkArg._all_field_names_ = set([ +ListSharedLinksArg._path_validator = bv.Nullable(bv.String(pattern=u'((/|id:).*)|(rev:[0-9a-f]{9,})')) +ListSharedLinksArg._cursor_validator = bv.Nullable(bv.String()) +ListSharedLinksArg._all_field_names_ = set([ 'path', - 'short_url', - 'pending_upload', + 'cursor', ]) -CreateSharedLinkArg._all_fields_ = [ - ('path', CreateSharedLinkArg._path_validator), - ('short_url', CreateSharedLinkArg._short_url_validator), - ('pending_upload', CreateSharedLinkArg._pending_upload_validator), +ListSharedLinksArg._all_fields_ = [ + ('path', ListSharedLinksArg._path_validator), + ('cursor', ListSharedLinksArg._cursor_validator), ] -CreateSharedLinkError._path_validator = bv.Union(files.LookupError) -CreateSharedLinkError._other_validator = bv.Void() -CreateSharedLinkError._tagmap = { - 'path': CreateSharedLinkError._path_validator, - 'other': CreateSharedLinkError._other_validator, +ListSharedLinksError._path_validator = bv.Union(files.LookupError) +ListSharedLinksError._reset_validator = bv.Void() +ListSharedLinksError._other_validator = bv.Void() +ListSharedLinksError._tagmap = { + 'path': ListSharedLinksError._path_validator, + 'reset': ListSharedLinksError._reset_validator, + 'other': ListSharedLinksError._other_validator, } -CreateSharedLinkError.other = CreateSharedLinkError('other') - -RevokeSharedLinkArg._url_validator = bv.String() -RevokeSharedLinkArg._all_field_names_ = set(['url']) -RevokeSharedLinkArg._all_fields_ = [('url', RevokeSharedLinkArg._url_validator)] - -RevokeSharedLinkError._shared_link_malformed_validator = bv.Void() -RevokeSharedLinkError._shared_link_not_found_validator = bv.Void() -RevokeSharedLinkError._shared_link_access_denied_validator = bv.Void() -RevokeSharedLinkError._other_validator = bv.Void() -RevokeSharedLinkError._tagmap = { - 'shared_link_malformed': RevokeSharedLinkError._shared_link_malformed_validator, - 'shared_link_not_found': RevokeSharedLinkError._shared_link_not_found_validator, - 'shared_link_access_denied': RevokeSharedLinkError._shared_link_access_denied_validator, - 'other': RevokeSharedLinkError._other_validator, -} +ListSharedLinksError.reset = ListSharedLinksError('reset') +ListSharedLinksError.other = ListSharedLinksError('other') -RevokeSharedLinkError.shared_link_malformed = RevokeSharedLinkError('shared_link_malformed') -RevokeSharedLinkError.shared_link_not_found = RevokeSharedLinkError('shared_link_not_found') -RevokeSharedLinkError.shared_link_access_denied = RevokeSharedLinkError('shared_link_access_denied') -RevokeSharedLinkError.other = RevokeSharedLinkError('other') +ListSharedLinksResult._links_validator = bv.List(bv.StructTree(SharedLinkMetadata)) +ListSharedLinksResult._has_more_validator = bv.Boolean() +ListSharedLinksResult._cursor_validator = bv.Nullable(bv.String()) +ListSharedLinksResult._all_field_names_ = set([ + 'links', + 'has_more', + 'cursor', +]) +ListSharedLinksResult._all_fields_ = [ + ('links', ListSharedLinksResult._links_validator), + ('has_more', ListSharedLinksResult._has_more_validator), + ('cursor', ListSharedLinksResult._cursor_validator), +] -AccessLevel._owner_validator = bv.Void() -AccessLevel._editor_validator = bv.Void() -AccessLevel._viewer_validator = bv.Void() -AccessLevel._other_validator = bv.Void() -AccessLevel._tagmap = { - 'owner': AccessLevel._owner_validator, - 'editor': AccessLevel._editor_validator, - 'viewer': AccessLevel._viewer_validator, - 'other': AccessLevel._other_validator, +MemberAction._make_owner_validator = bv.Void() +MemberAction._remove_validator = bv.Void() +MemberAction._other_validator = bv.Void() +MemberAction._tagmap = { + 'make_owner': MemberAction._make_owner_validator, + 'remove': MemberAction._remove_validator, + 'other': MemberAction._other_validator, } -AccessLevel.owner = AccessLevel('owner') -AccessLevel.editor = AccessLevel('editor') -AccessLevel.viewer = AccessLevel('viewer') -AccessLevel.other = AccessLevel('other') - -FolderPolicy._member_policy_validator = bv.Nullable(bv.Union(MemberPolicy)) -FolderPolicy._acl_update_policy_validator = bv.Union(AclUpdatePolicy) -FolderPolicy._shared_link_policy_validator = bv.Union(SharedLinkPolicy) -FolderPolicy._all_field_names_ = set([ - 'member_policy', - 'acl_update_policy', - 'shared_link_policy', +MemberAction.make_owner = MemberAction('make_owner') +MemberAction.remove = MemberAction('remove') +MemberAction.other = MemberAction('other') + +MemberPermission._action_validator = bv.Union(MemberAction) +MemberPermission._allow_validator = bv.Boolean() +MemberPermission._reason_validator = bv.Nullable(bv.Union(PermissionDeniedReason)) +MemberPermission._all_field_names_ = set([ + 'action', + 'allow', + 'reason', ]) -FolderPolicy._all_fields_ = [ - ('member_policy', FolderPolicy._member_policy_validator), - ('acl_update_policy', FolderPolicy._acl_update_policy_validator), - ('shared_link_policy', FolderPolicy._shared_link_policy_validator), +MemberPermission._all_fields_ = [ + ('action', MemberPermission._action_validator), + ('allow', MemberPermission._allow_validator), + ('reason', MemberPermission._reason_validator), ] MemberPolicy._team_validator = bv.Void() @@ -5620,188 +8797,192 @@ def __repr__(self): MemberPolicy.anyone = MemberPolicy('anyone') MemberPolicy.other = MemberPolicy('other') -AclUpdatePolicy._owner_validator = bv.Void() -AclUpdatePolicy._editors_validator = bv.Void() -AclUpdatePolicy._other_validator = bv.Void() -AclUpdatePolicy._tagmap = { - 'owner': AclUpdatePolicy._owner_validator, - 'editors': AclUpdatePolicy._editors_validator, - 'other': AclUpdatePolicy._other_validator, +MemberSelector._dropbox_id_validator = bv.String(min_length=1) +MemberSelector._email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberSelector._other_validator = bv.Void() +MemberSelector._tagmap = { + 'dropbox_id': MemberSelector._dropbox_id_validator, + 'email': MemberSelector._email_validator, + 'other': MemberSelector._other_validator, } -AclUpdatePolicy.owner = AclUpdatePolicy('owner') -AclUpdatePolicy.editors = AclUpdatePolicy('editors') -AclUpdatePolicy.other = AclUpdatePolicy('other') +MemberSelector.other = MemberSelector('other') -SharedLinkPolicy._anyone_validator = bv.Void() -SharedLinkPolicy._members_validator = bv.Void() -SharedLinkPolicy._other_validator = bv.Void() -SharedLinkPolicy._tagmap = { - 'anyone': SharedLinkPolicy._anyone_validator, - 'members': SharedLinkPolicy._members_validator, - 'other': SharedLinkPolicy._other_validator, +ModifySharedLinkSettingsArgs._url_validator = bv.String() +ModifySharedLinkSettingsArgs._settings_validator = bv.Struct(SharedLinkSettings) +ModifySharedLinkSettingsArgs._all_field_names_ = set([ + 'url', + 'settings', +]) +ModifySharedLinkSettingsArgs._all_fields_ = [ + ('url', ModifySharedLinkSettingsArgs._url_validator), + ('settings', ModifySharedLinkSettingsArgs._settings_validator), +] + +ModifySharedLinkSettingsError._settings_error_validator = bv.Union(SharedLinkSettingsError) +ModifySharedLinkSettingsError._email_not_verified_validator = bv.Void() +ModifySharedLinkSettingsError._tagmap = { + 'settings_error': ModifySharedLinkSettingsError._settings_error_validator, + 'email_not_verified': ModifySharedLinkSettingsError._email_not_verified_validator, } +ModifySharedLinkSettingsError._tagmap.update(SharedLinkError._tagmap) -SharedLinkPolicy.anyone = SharedLinkPolicy('anyone') -SharedLinkPolicy.members = SharedLinkPolicy('members') -SharedLinkPolicy.other = SharedLinkPolicy('other') +ModifySharedLinkSettingsError.email_not_verified = ModifySharedLinkSettingsError('email_not_verified') -MembershipInfo._access_type_validator = bv.Union(AccessLevel) -MembershipInfo._all_field_names_ = set(['access_type']) -MembershipInfo._all_fields_ = [('access_type', MembershipInfo._access_type_validator)] +MountFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +MountFolderArg._all_field_names_ = set(['shared_folder_id']) +MountFolderArg._all_fields_ = [('shared_folder_id', MountFolderArg._shared_folder_id_validator)] -UserInfo._account_id_validator = bv.String(min_length=40, max_length=40) -UserInfo._same_team_validator = bv.Boolean() -UserInfo._team_member_id_validator = bv.Nullable(bv.String()) -UserInfo._all_field_names_ = set([ - 'account_id', - 'same_team', - 'team_member_id', -]) -UserInfo._all_fields_ = [ - ('account_id', UserInfo._account_id_validator), - ('same_team', UserInfo._same_team_validator), - ('team_member_id', UserInfo._team_member_id_validator), -] +MountFolderError._access_error_validator = bv.Union(SharedFolderAccessError) +MountFolderError._inside_shared_folder_validator = bv.Void() +MountFolderError._insufficient_quota_validator = bv.Void() +MountFolderError._already_mounted_validator = bv.Void() +MountFolderError._other_validator = bv.Void() +MountFolderError._tagmap = { + 'access_error': MountFolderError._access_error_validator, + 'inside_shared_folder': MountFolderError._inside_shared_folder_validator, + 'insufficient_quota': MountFolderError._insufficient_quota_validator, + 'already_mounted': MountFolderError._already_mounted_validator, + 'other': MountFolderError._other_validator, +} -UserMembershipInfo._user_validator = bv.Struct(UserInfo) -UserMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['user'])) -UserMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('user', UserMembershipInfo._user_validator)] +MountFolderError.inside_shared_folder = MountFolderError('inside_shared_folder') +MountFolderError.insufficient_quota = MountFolderError('insufficient_quota') +MountFolderError.already_mounted = MountFolderError('already_mounted') +MountFolderError.other = MountFolderError('other') -InviteeInfo._email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") -InviteeInfo._other_validator = bv.Void() -InviteeInfo._tagmap = { - 'email': InviteeInfo._email_validator, - 'other': InviteeInfo._other_validator, -} +PathLinkMetadata._path_validator = bv.String() +PathLinkMetadata._field_names_ = set(['path']) +PathLinkMetadata._all_field_names_ = LinkMetadata._all_field_names_.union(PathLinkMetadata._field_names_) +PathLinkMetadata._fields_ = [('path', PathLinkMetadata._path_validator)] +PathLinkMetadata._all_fields_ = LinkMetadata._all_fields_ + PathLinkMetadata._fields_ -InviteeInfo.other = InviteeInfo('other') +PendingUploadMode._file_validator = bv.Void() +PendingUploadMode._folder_validator = bv.Void() +PendingUploadMode._tagmap = { + 'file': PendingUploadMode._file_validator, + 'folder': PendingUploadMode._folder_validator, +} -InviteeMembershipInfo._invitee_validator = bv.Union(InviteeInfo) -InviteeMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['invitee'])) -InviteeMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('invitee', InviteeMembershipInfo._invitee_validator)] +PendingUploadMode.file = PendingUploadMode('file') +PendingUploadMode.folder = PendingUploadMode('folder') -GroupInfo._same_team_validator = bv.Boolean() -GroupInfo._all_field_names_ = team.GroupSummary._all_field_names_.union(set(['same_team'])) -GroupInfo._all_fields_ = team.GroupSummary._all_fields_ + [('same_team', GroupInfo._same_team_validator)] +PermissionDeniedReason._user_not_same_team_as_owner_validator = bv.Void() +PermissionDeniedReason._user_not_allowed_by_owner_validator = bv.Void() +PermissionDeniedReason._target_is_indirect_member_validator = bv.Void() +PermissionDeniedReason._target_is_owner_validator = bv.Void() +PermissionDeniedReason._target_is_self_validator = bv.Void() +PermissionDeniedReason._target_not_active_validator = bv.Void() +PermissionDeniedReason._other_validator = bv.Void() +PermissionDeniedReason._tagmap = { + 'user_not_same_team_as_owner': PermissionDeniedReason._user_not_same_team_as_owner_validator, + 'user_not_allowed_by_owner': PermissionDeniedReason._user_not_allowed_by_owner_validator, + 'target_is_indirect_member': PermissionDeniedReason._target_is_indirect_member_validator, + 'target_is_owner': PermissionDeniedReason._target_is_owner_validator, + 'target_is_self': PermissionDeniedReason._target_is_self_validator, + 'target_not_active': PermissionDeniedReason._target_not_active_validator, + 'other': PermissionDeniedReason._other_validator, +} -GroupMembershipInfo._group_validator = bv.Struct(GroupInfo) -GroupMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['group'])) -GroupMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('group', GroupMembershipInfo._group_validator)] +PermissionDeniedReason.user_not_same_team_as_owner = PermissionDeniedReason('user_not_same_team_as_owner') +PermissionDeniedReason.user_not_allowed_by_owner = PermissionDeniedReason('user_not_allowed_by_owner') +PermissionDeniedReason.target_is_indirect_member = PermissionDeniedReason('target_is_indirect_member') +PermissionDeniedReason.target_is_owner = PermissionDeniedReason('target_is_owner') +PermissionDeniedReason.target_is_self = PermissionDeniedReason('target_is_self') +PermissionDeniedReason.target_not_active = PermissionDeniedReason('target_not_active') +PermissionDeniedReason.other = PermissionDeniedReason('other') -SharedFolderMetadata._path_lower_validator = bv.Nullable(bv.String()) -SharedFolderMetadata._name_validator = bv.String() -SharedFolderMetadata._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -SharedFolderMetadata._access_type_validator = bv.Union(AccessLevel) -SharedFolderMetadata._is_team_folder_validator = bv.Boolean() -SharedFolderMetadata._policy_validator = bv.Struct(FolderPolicy) -SharedFolderMetadata._all_field_names_ = set([ - 'path_lower', - 'name', - 'shared_folder_id', - 'access_type', - 'is_team_folder', - 'policy', -]) -SharedFolderMetadata._all_fields_ = [ - ('path_lower', SharedFolderMetadata._path_lower_validator), - ('name', SharedFolderMetadata._name_validator), - ('shared_folder_id', SharedFolderMetadata._shared_folder_id_validator), - ('access_type', SharedFolderMetadata._access_type_validator), - ('is_team_folder', SharedFolderMetadata._is_team_folder_validator), - ('policy', SharedFolderMetadata._policy_validator), -] +RelinquishFolderMembershipArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +RelinquishFolderMembershipArg._all_field_names_ = set(['shared_folder_id']) +RelinquishFolderMembershipArg._all_fields_ = [('shared_folder_id', RelinquishFolderMembershipArg._shared_folder_id_validator)] -SharedFolderAccessError._invalid_id_validator = bv.Void() -SharedFolderAccessError._not_a_member_validator = bv.Void() -SharedFolderAccessError._no_permission_validator = bv.Void() -SharedFolderAccessError._email_unverified_validator = bv.Void() -SharedFolderAccessError._team_folder_validator = bv.Void() -SharedFolderAccessError._unmounted_validator = bv.Void() -SharedFolderAccessError._other_validator = bv.Void() -SharedFolderAccessError._tagmap = { - 'invalid_id': SharedFolderAccessError._invalid_id_validator, - 'not_a_member': SharedFolderAccessError._not_a_member_validator, - 'no_permission': SharedFolderAccessError._no_permission_validator, - 'email_unverified': SharedFolderAccessError._email_unverified_validator, - 'team_folder': SharedFolderAccessError._team_folder_validator, - 'unmounted': SharedFolderAccessError._unmounted_validator, - 'other': SharedFolderAccessError._other_validator, +RelinquishFolderMembershipError._access_error_validator = bv.Union(SharedFolderAccessError) +RelinquishFolderMembershipError._folder_owner_validator = bv.Void() +RelinquishFolderMembershipError._mounted_validator = bv.Void() +RelinquishFolderMembershipError._group_access_validator = bv.Void() +RelinquishFolderMembershipError._other_validator = bv.Void() +RelinquishFolderMembershipError._tagmap = { + 'access_error': RelinquishFolderMembershipError._access_error_validator, + 'folder_owner': RelinquishFolderMembershipError._folder_owner_validator, + 'mounted': RelinquishFolderMembershipError._mounted_validator, + 'group_access': RelinquishFolderMembershipError._group_access_validator, + 'other': RelinquishFolderMembershipError._other_validator, } -SharedFolderAccessError.invalid_id = SharedFolderAccessError('invalid_id') -SharedFolderAccessError.not_a_member = SharedFolderAccessError('not_a_member') -SharedFolderAccessError.no_permission = SharedFolderAccessError('no_permission') -SharedFolderAccessError.email_unverified = SharedFolderAccessError('email_unverified') -SharedFolderAccessError.team_folder = SharedFolderAccessError('team_folder') -SharedFolderAccessError.unmounted = SharedFolderAccessError('unmounted') -SharedFolderAccessError.other = SharedFolderAccessError('other') +RelinquishFolderMembershipError.folder_owner = RelinquishFolderMembershipError('folder_owner') +RelinquishFolderMembershipError.mounted = RelinquishFolderMembershipError('mounted') +RelinquishFolderMembershipError.group_access = RelinquishFolderMembershipError('group_access') +RelinquishFolderMembershipError.other = RelinquishFolderMembershipError('other') -ListFoldersResult._entries_validator = bv.List(bv.Struct(SharedFolderMetadata)) -ListFoldersResult._cursor_validator = bv.Nullable(bv.String()) -ListFoldersResult._all_field_names_ = set([ - 'entries', - 'cursor', +RemoveFolderMemberArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +RemoveFolderMemberArg._member_validator = bv.Union(MemberSelector) +RemoveFolderMemberArg._leave_a_copy_validator = bv.Boolean() +RemoveFolderMemberArg._all_field_names_ = set([ + 'shared_folder_id', + 'member', + 'leave_a_copy', ]) -ListFoldersResult._all_fields_ = [ - ('entries', ListFoldersResult._entries_validator), - ('cursor', ListFoldersResult._cursor_validator), +RemoveFolderMemberArg._all_fields_ = [ + ('shared_folder_id', RemoveFolderMemberArg._shared_folder_id_validator), + ('member', RemoveFolderMemberArg._member_validator), + ('leave_a_copy', RemoveFolderMemberArg._leave_a_copy_validator), ] -ListFoldersContinueArg._cursor_validator = bv.String() -ListFoldersContinueArg._all_field_names_ = set(['cursor']) -ListFoldersContinueArg._all_fields_ = [('cursor', ListFoldersContinueArg._cursor_validator)] - -ListFoldersContinueError._invalid_cursor_validator = bv.Void() -ListFoldersContinueError._other_validator = bv.Void() -ListFoldersContinueError._tagmap = { - 'invalid_cursor': ListFoldersContinueError._invalid_cursor_validator, - 'other': ListFoldersContinueError._other_validator, +RemoveFolderMemberError._access_error_validator = bv.Union(SharedFolderAccessError) +RemoveFolderMemberError._member_error_validator = bv.Union(SharedFolderMemberError) +RemoveFolderMemberError._folder_owner_validator = bv.Void() +RemoveFolderMemberError._group_access_validator = bv.Void() +RemoveFolderMemberError._other_validator = bv.Void() +RemoveFolderMemberError._tagmap = { + 'access_error': RemoveFolderMemberError._access_error_validator, + 'member_error': RemoveFolderMemberError._member_error_validator, + 'folder_owner': RemoveFolderMemberError._folder_owner_validator, + 'group_access': RemoveFolderMemberError._group_access_validator, + 'other': RemoveFolderMemberError._other_validator, } -ListFoldersContinueError.invalid_cursor = ListFoldersContinueError('invalid_cursor') -ListFoldersContinueError.other = ListFoldersContinueError('other') +RemoveFolderMemberError.folder_owner = RemoveFolderMemberError('folder_owner') +RemoveFolderMemberError.group_access = RemoveFolderMemberError('group_access') +RemoveFolderMemberError.other = RemoveFolderMemberError('other') -GetMetadataArgs._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -GetMetadataArgs._all_field_names_ = set(['shared_folder_id']) -GetMetadataArgs._all_fields_ = [('shared_folder_id', GetMetadataArgs._shared_folder_id_validator)] +RequestedVisibility._public_validator = bv.Void() +RequestedVisibility._team_only_validator = bv.Void() +RequestedVisibility._password_validator = bv.Void() +RequestedVisibility._tagmap = { + 'public': RequestedVisibility._public_validator, + 'team_only': RequestedVisibility._team_only_validator, + 'password': RequestedVisibility._password_validator, +} -ListFolderMembersArgs._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -ListFolderMembersArgs._all_field_names_ = set(['shared_folder_id']) -ListFolderMembersArgs._all_fields_ = [('shared_folder_id', ListFolderMembersArgs._shared_folder_id_validator)] +RequestedVisibility.public = RequestedVisibility('public') +RequestedVisibility.team_only = RequestedVisibility('team_only') +RequestedVisibility.password = RequestedVisibility('password') + +ResolvedVisibility._team_and_password_validator = bv.Void() +ResolvedVisibility._shared_folder_only_validator = bv.Void() +ResolvedVisibility._other_validator = bv.Void() +ResolvedVisibility._tagmap = { + 'team_and_password': ResolvedVisibility._team_and_password_validator, + 'shared_folder_only': ResolvedVisibility._shared_folder_only_validator, + 'other': ResolvedVisibility._other_validator, +} +ResolvedVisibility._tagmap.update(RequestedVisibility._tagmap) -SharedFolderMembers._users_validator = bv.List(bv.Struct(UserMembershipInfo)) -SharedFolderMembers._groups_validator = bv.List(bv.Struct(GroupMembershipInfo)) -SharedFolderMembers._invitees_validator = bv.List(bv.Struct(InviteeMembershipInfo)) -SharedFolderMembers._cursor_validator = bv.Nullable(bv.String()) -SharedFolderMembers._all_field_names_ = set([ - 'users', - 'groups', - 'invitees', - 'cursor', -]) -SharedFolderMembers._all_fields_ = [ - ('users', SharedFolderMembers._users_validator), - ('groups', SharedFolderMembers._groups_validator), - ('invitees', SharedFolderMembers._invitees_validator), - ('cursor', SharedFolderMembers._cursor_validator), -] +ResolvedVisibility.team_and_password = ResolvedVisibility('team_and_password') +ResolvedVisibility.shared_folder_only = ResolvedVisibility('shared_folder_only') +ResolvedVisibility.other = ResolvedVisibility('other') -ListFolderMembersContinueArg._cursor_validator = bv.String() -ListFolderMembersContinueArg._all_field_names_ = set(['cursor']) -ListFolderMembersContinueArg._all_fields_ = [('cursor', ListFolderMembersContinueArg._cursor_validator)] +RevokeSharedLinkArg._url_validator = bv.String() +RevokeSharedLinkArg._all_field_names_ = set(['url']) +RevokeSharedLinkArg._all_fields_ = [('url', RevokeSharedLinkArg._url_validator)] -ListFolderMembersContinueError._access_error_validator = bv.Union(SharedFolderAccessError) -ListFolderMembersContinueError._invalid_cursor_validator = bv.Void() -ListFolderMembersContinueError._other_validator = bv.Void() -ListFolderMembersContinueError._tagmap = { - 'access_error': ListFolderMembersContinueError._access_error_validator, - 'invalid_cursor': ListFolderMembersContinueError._invalid_cursor_validator, - 'other': ListFolderMembersContinueError._other_validator, +RevokeSharedLinkError._shared_link_malformed_validator = bv.Void() +RevokeSharedLinkError._tagmap = { + 'shared_link_malformed': RevokeSharedLinkError._shared_link_malformed_validator, } +RevokeSharedLinkError._tagmap.update(SharedLinkError._tagmap) -ListFolderMembersContinueError.invalid_cursor = ListFolderMembersContinueError('invalid_cursor') -ListFolderMembersContinueError.other = ListFolderMembersContinueError('other') +RevokeSharedLinkError.shared_link_malformed = RevokeSharedLinkError('shared_link_malformed') ShareFolderArg._path_validator = bv.String(pattern=u'/.*') ShareFolderArg._member_policy_validator = bv.Union(MemberPolicy) @@ -5826,18 +9007,38 @@ def __repr__(self): ShareFolderError._email_unverified_validator = bv.Void() ShareFolderError._bad_path_validator = bv.Union(SharePathError) ShareFolderError._team_policy_disallows_member_policy_validator = bv.Void() +ShareFolderError._disallowed_shared_link_policy_validator = bv.Void() +ShareFolderError._no_permission_validator = bv.Void() ShareFolderError._other_validator = bv.Void() ShareFolderError._tagmap = { 'email_unverified': ShareFolderError._email_unverified_validator, 'bad_path': ShareFolderError._bad_path_validator, 'team_policy_disallows_member_policy': ShareFolderError._team_policy_disallows_member_policy_validator, + 'disallowed_shared_link_policy': ShareFolderError._disallowed_shared_link_policy_validator, + 'no_permission': ShareFolderError._no_permission_validator, 'other': ShareFolderError._other_validator, } ShareFolderError.email_unverified = ShareFolderError('email_unverified') ShareFolderError.team_policy_disallows_member_policy = ShareFolderError('team_policy_disallows_member_policy') +ShareFolderError.disallowed_shared_link_policy = ShareFolderError('disallowed_shared_link_policy') +ShareFolderError.no_permission = ShareFolderError('no_permission') ShareFolderError.other = ShareFolderError('other') +ShareFolderJobStatus._complete_validator = bv.Struct(SharedFolderMetadata) +ShareFolderJobStatus._failed_validator = bv.Union(ShareFolderError) +ShareFolderJobStatus._tagmap = { + 'complete': ShareFolderJobStatus._complete_validator, + 'failed': ShareFolderJobStatus._failed_validator, +} +ShareFolderJobStatus._tagmap.update(async.PollResultBase._tagmap) + +ShareFolderLaunch._complete_validator = bv.Struct(SharedFolderMetadata) +ShareFolderLaunch._tagmap = { + 'complete': ShareFolderLaunch._complete_validator, +} +ShareFolderLaunch._tagmap.update(async.LaunchResultBase._tagmap) + SharePathError._is_file_validator = bv.Void() SharePathError._inside_shared_folder_validator = bv.Void() SharePathError._contains_shared_folder_validator = bv.Void() @@ -5866,29 +9067,30 @@ def __repr__(self): SharePathError.invalid_path = SharePathError('invalid_path') SharePathError.other = SharePathError('other') -ShareFolderJobStatus._complete_validator = bv.Struct(SharedFolderMetadata) -ShareFolderJobStatus._failed_validator = bv.Union(ShareFolderError) -ShareFolderJobStatus._tagmap = { - 'complete': ShareFolderJobStatus._complete_validator, - 'failed': ShareFolderJobStatus._failed_validator, -} -ShareFolderJobStatus._tagmap.update(async.PollResultBase._tagmap) - -ShareFolderLaunch._complete_validator = bv.Struct(SharedFolderMetadata) -ShareFolderLaunch._tagmap = { - 'complete': ShareFolderLaunch._complete_validator, -} -ShareFolderLaunch._tagmap.update(async.LaunchResultBase._tagmap) - -JobStatus._complete_validator = bv.Void() -JobStatus._failed_validator = bv.Union(JobError) -JobStatus._tagmap = { - 'complete': JobStatus._complete_validator, - 'failed': JobStatus._failed_validator, +SharedFolderAccessError._invalid_id_validator = bv.Void() +SharedFolderAccessError._not_a_member_validator = bv.Void() +SharedFolderAccessError._no_permission_validator = bv.Void() +SharedFolderAccessError._email_unverified_validator = bv.Void() +SharedFolderAccessError._team_folder_validator = bv.Void() +SharedFolderAccessError._unmounted_validator = bv.Void() +SharedFolderAccessError._other_validator = bv.Void() +SharedFolderAccessError._tagmap = { + 'invalid_id': SharedFolderAccessError._invalid_id_validator, + 'not_a_member': SharedFolderAccessError._not_a_member_validator, + 'no_permission': SharedFolderAccessError._no_permission_validator, + 'email_unverified': SharedFolderAccessError._email_unverified_validator, + 'team_folder': SharedFolderAccessError._team_folder_validator, + 'unmounted': SharedFolderAccessError._unmounted_validator, + 'other': SharedFolderAccessError._other_validator, } -JobStatus._tagmap.update(async.PollResultBase._tagmap) -JobStatus.complete = JobStatus('complete') +SharedFolderAccessError.invalid_id = SharedFolderAccessError('invalid_id') +SharedFolderAccessError.not_a_member = SharedFolderAccessError('not_a_member') +SharedFolderAccessError.no_permission = SharedFolderAccessError('no_permission') +SharedFolderAccessError.email_unverified = SharedFolderAccessError('email_unverified') +SharedFolderAccessError.team_folder = SharedFolderAccessError('team_folder') +SharedFolderAccessError.unmounted = SharedFolderAccessError('unmounted') +SharedFolderAccessError.other = SharedFolderAccessError('other') SharedFolderMemberError._invalid_dropbox_id_validator = bv.Void() SharedFolderMemberError._not_a_member_validator = bv.Void() @@ -5903,211 +9105,189 @@ def __repr__(self): SharedFolderMemberError.not_a_member = SharedFolderMemberError('not_a_member') SharedFolderMemberError.other = SharedFolderMemberError('other') -JobError._access_error_validator = bv.Union(SharedFolderAccessError) -JobError._member_error_validator = bv.Union(SharedFolderMemberError) -JobError._other_validator = bv.Void() -JobError._tagmap = { - 'access_error': JobError._access_error_validator, - 'member_error': JobError._member_error_validator, - 'other': JobError._other_validator, -} - -JobError.other = JobError('other') - -UnshareFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -UnshareFolderArg._leave_a_copy_validator = bv.Boolean() -UnshareFolderArg._all_field_names_ = set([ - 'shared_folder_id', - 'leave_a_copy', +SharedFolderMembers._users_validator = bv.List(bv.Struct(UserMembershipInfo)) +SharedFolderMembers._groups_validator = bv.List(bv.Struct(GroupMembershipInfo)) +SharedFolderMembers._invitees_validator = bv.List(bv.Struct(InviteeMembershipInfo)) +SharedFolderMembers._cursor_validator = bv.Nullable(bv.String()) +SharedFolderMembers._all_field_names_ = set([ + 'users', + 'groups', + 'invitees', + 'cursor', ]) -UnshareFolderArg._all_fields_ = [ - ('shared_folder_id', UnshareFolderArg._shared_folder_id_validator), - ('leave_a_copy', UnshareFolderArg._leave_a_copy_validator), +SharedFolderMembers._all_fields_ = [ + ('users', SharedFolderMembers._users_validator), + ('groups', SharedFolderMembers._groups_validator), + ('invitees', SharedFolderMembers._invitees_validator), + ('cursor', SharedFolderMembers._cursor_validator), ] -UnshareFolderError._access_error_validator = bv.Union(SharedFolderAccessError) -UnshareFolderError._other_validator = bv.Void() -UnshareFolderError._tagmap = { - 'access_error': UnshareFolderError._access_error_validator, - 'other': UnshareFolderError._other_validator, -} - -UnshareFolderError.other = UnshareFolderError('other') - -TransferFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -TransferFolderArg._to_dropbox_id_validator = bv.String(min_length=1) -TransferFolderArg._all_field_names_ = set([ +SharedFolderMetadata._path_lower_validator = bv.Nullable(bv.String()) +SharedFolderMetadata._name_validator = bv.String() +SharedFolderMetadata._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +SharedFolderMetadata._access_type_validator = bv.Union(AccessLevel) +SharedFolderMetadata._is_team_folder_validator = bv.Boolean() +SharedFolderMetadata._policy_validator = bv.Struct(FolderPolicy) +SharedFolderMetadata._permissions_validator = bv.Nullable(bv.List(bv.Struct(FolderPermission))) +SharedFolderMetadata._all_field_names_ = set([ + 'path_lower', + 'name', 'shared_folder_id', - 'to_dropbox_id', + 'access_type', + 'is_team_folder', + 'policy', + 'permissions', ]) -TransferFolderArg._all_fields_ = [ - ('shared_folder_id', TransferFolderArg._shared_folder_id_validator), - ('to_dropbox_id', TransferFolderArg._to_dropbox_id_validator), +SharedFolderMetadata._all_fields_ = [ + ('path_lower', SharedFolderMetadata._path_lower_validator), + ('name', SharedFolderMetadata._name_validator), + ('shared_folder_id', SharedFolderMetadata._shared_folder_id_validator), + ('access_type', SharedFolderMetadata._access_type_validator), + ('is_team_folder', SharedFolderMetadata._is_team_folder_validator), + ('policy', SharedFolderMetadata._policy_validator), + ('permissions', SharedFolderMetadata._permissions_validator), ] -TransferFolderError._access_error_validator = bv.Union(SharedFolderAccessError) -TransferFolderError._no_permission_validator = bv.Void() -TransferFolderError._invalid_dropbox_id_validator = bv.Void() -TransferFolderError._new_owner_not_a_member_validator = bv.Void() -TransferFolderError._new_owner_unmounted_validator = bv.Void() -TransferFolderError._new_owner_email_unverified_validator = bv.Void() -TransferFolderError._other_validator = bv.Void() -TransferFolderError._tagmap = { - 'access_error': TransferFolderError._access_error_validator, - 'no_permission': TransferFolderError._no_permission_validator, - 'invalid_dropbox_id': TransferFolderError._invalid_dropbox_id_validator, - 'new_owner_not_a_member': TransferFolderError._new_owner_not_a_member_validator, - 'new_owner_unmounted': TransferFolderError._new_owner_unmounted_validator, - 'new_owner_email_unverified': TransferFolderError._new_owner_email_unverified_validator, - 'other': TransferFolderError._other_validator, +SharedLinkAccessFailureReason._login_required_validator = bv.Void() +SharedLinkAccessFailureReason._email_verify_required_validator = bv.Void() +SharedLinkAccessFailureReason._password_required_validator = bv.Void() +SharedLinkAccessFailureReason._team_only_validator = bv.Void() +SharedLinkAccessFailureReason._owner_only_validator = bv.Void() +SharedLinkAccessFailureReason._other_validator = bv.Void() +SharedLinkAccessFailureReason._tagmap = { + 'login_required': SharedLinkAccessFailureReason._login_required_validator, + 'email_verify_required': SharedLinkAccessFailureReason._email_verify_required_validator, + 'password_required': SharedLinkAccessFailureReason._password_required_validator, + 'team_only': SharedLinkAccessFailureReason._team_only_validator, + 'owner_only': SharedLinkAccessFailureReason._owner_only_validator, + 'other': SharedLinkAccessFailureReason._other_validator, } -TransferFolderError.no_permission = TransferFolderError('no_permission') -TransferFolderError.invalid_dropbox_id = TransferFolderError('invalid_dropbox_id') -TransferFolderError.new_owner_not_a_member = TransferFolderError('new_owner_not_a_member') -TransferFolderError.new_owner_unmounted = TransferFolderError('new_owner_unmounted') -TransferFolderError.new_owner_email_unverified = TransferFolderError('new_owner_email_unverified') -TransferFolderError.other = TransferFolderError('other') +SharedLinkAccessFailureReason.login_required = SharedLinkAccessFailureReason('login_required') +SharedLinkAccessFailureReason.email_verify_required = SharedLinkAccessFailureReason('email_verify_required') +SharedLinkAccessFailureReason.password_required = SharedLinkAccessFailureReason('password_required') +SharedLinkAccessFailureReason.team_only = SharedLinkAccessFailureReason('team_only') +SharedLinkAccessFailureReason.owner_only = SharedLinkAccessFailureReason('owner_only') +SharedLinkAccessFailureReason.other = SharedLinkAccessFailureReason('other') -UpdateFolderPolicyArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -UpdateFolderPolicyArg._member_policy_validator = bv.Nullable(bv.Union(MemberPolicy)) -UpdateFolderPolicyArg._acl_update_policy_validator = bv.Nullable(bv.Union(AclUpdatePolicy)) -UpdateFolderPolicyArg._shared_link_policy_validator = bv.Nullable(bv.Union(SharedLinkPolicy)) -UpdateFolderPolicyArg._all_field_names_ = set([ - 'shared_folder_id', - 'member_policy', - 'acl_update_policy', - 'shared_link_policy', -]) -UpdateFolderPolicyArg._all_fields_ = [ - ('shared_folder_id', UpdateFolderPolicyArg._shared_folder_id_validator), - ('member_policy', UpdateFolderPolicyArg._member_policy_validator), - ('acl_update_policy', UpdateFolderPolicyArg._acl_update_policy_validator), - ('shared_link_policy', UpdateFolderPolicyArg._shared_link_policy_validator), -] +SharedLinkPolicy._anyone_validator = bv.Void() +SharedLinkPolicy._members_validator = bv.Void() +SharedLinkPolicy._other_validator = bv.Void() +SharedLinkPolicy._tagmap = { + 'anyone': SharedLinkPolicy._anyone_validator, + 'members': SharedLinkPolicy._members_validator, + 'other': SharedLinkPolicy._other_validator, +} -UpdateFolderPolicyError._access_error_validator = bv.Union(SharedFolderAccessError) -UpdateFolderPolicyError._not_on_team_validator = bv.Void() -UpdateFolderPolicyError._other_validator = bv.Void() -UpdateFolderPolicyError._tagmap = { - 'access_error': UpdateFolderPolicyError._access_error_validator, - 'not_on_team': UpdateFolderPolicyError._not_on_team_validator, - 'other': UpdateFolderPolicyError._other_validator, +SharedLinkPolicy.anyone = SharedLinkPolicy('anyone') +SharedLinkPolicy.members = SharedLinkPolicy('members') +SharedLinkPolicy.other = SharedLinkPolicy('other') + +SharedLinkSettings._requested_visibility_validator = bv.Nullable(bv.Union(RequestedVisibility)) +SharedLinkSettings._link_password_validator = bv.Nullable(bv.String()) +SharedLinkSettings._expires_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +SharedLinkSettings._all_field_names_ = set([ + 'requested_visibility', + 'link_password', + 'expires', +]) +SharedLinkSettings._all_fields_ = [ + ('requested_visibility', SharedLinkSettings._requested_visibility_validator), + ('link_password', SharedLinkSettings._link_password_validator), + ('expires', SharedLinkSettings._expires_validator), +] + +SharedLinkSettingsError._invalid_settings_validator = bv.Void() +SharedLinkSettingsError._not_authorized_validator = bv.Void() +SharedLinkSettingsError._tagmap = { + 'invalid_settings': SharedLinkSettingsError._invalid_settings_validator, + 'not_authorized': SharedLinkSettingsError._not_authorized_validator, } -UpdateFolderPolicyError.not_on_team = UpdateFolderPolicyError('not_on_team') -UpdateFolderPolicyError.other = UpdateFolderPolicyError('other') +SharedLinkSettingsError.invalid_settings = SharedLinkSettingsError('invalid_settings') +SharedLinkSettingsError.not_authorized = SharedLinkSettingsError('not_authorized') -AddFolderMemberArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -AddFolderMemberArg._members_validator = bv.List(bv.Struct(AddMember)) -AddFolderMemberArg._quiet_validator = bv.Boolean() -AddFolderMemberArg._custom_message_validator = bv.Nullable(bv.String(min_length=1)) -AddFolderMemberArg._all_field_names_ = set([ - 'shared_folder_id', - 'members', - 'quiet', - 'custom_message', +TeamMemberInfo._team_info_validator = bv.Struct(users.Team) +TeamMemberInfo._display_name_validator = bv.String() +TeamMemberInfo._member_id_validator = bv.Nullable(bv.String()) +TeamMemberInfo._all_field_names_ = set([ + 'team_info', + 'display_name', + 'member_id', ]) -AddFolderMemberArg._all_fields_ = [ - ('shared_folder_id', AddFolderMemberArg._shared_folder_id_validator), - ('members', AddFolderMemberArg._members_validator), - ('quiet', AddFolderMemberArg._quiet_validator), - ('custom_message', AddFolderMemberArg._custom_message_validator), +TeamMemberInfo._all_fields_ = [ + ('team_info', TeamMemberInfo._team_info_validator), + ('display_name', TeamMemberInfo._display_name_validator), + ('member_id', TeamMemberInfo._member_id_validator), ] -AddMember._member_validator = bv.Union(MemberSelector) -AddMember._access_level_validator = bv.Union(AccessLevel) -AddMember._all_field_names_ = set([ - 'member', - 'access_level', +TransferFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +TransferFolderArg._to_dropbox_id_validator = bv.String(min_length=1) +TransferFolderArg._all_field_names_ = set([ + 'shared_folder_id', + 'to_dropbox_id', ]) -AddMember._all_fields_ = [ - ('member', AddMember._member_validator), - ('access_level', AddMember._access_level_validator), +TransferFolderArg._all_fields_ = [ + ('shared_folder_id', TransferFolderArg._shared_folder_id_validator), + ('to_dropbox_id', TransferFolderArg._to_dropbox_id_validator), ] -MemberSelector._dropbox_id_validator = bv.String(min_length=1) -MemberSelector._email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") -MemberSelector._other_validator = bv.Void() -MemberSelector._tagmap = { - 'dropbox_id': MemberSelector._dropbox_id_validator, - 'email': MemberSelector._email_validator, - 'other': MemberSelector._other_validator, +TransferFolderError._access_error_validator = bv.Union(SharedFolderAccessError) +TransferFolderError._no_permission_validator = bv.Void() +TransferFolderError._invalid_dropbox_id_validator = bv.Void() +TransferFolderError._new_owner_not_a_member_validator = bv.Void() +TransferFolderError._new_owner_unmounted_validator = bv.Void() +TransferFolderError._new_owner_email_unverified_validator = bv.Void() +TransferFolderError._other_validator = bv.Void() +TransferFolderError._tagmap = { + 'access_error': TransferFolderError._access_error_validator, + 'no_permission': TransferFolderError._no_permission_validator, + 'invalid_dropbox_id': TransferFolderError._invalid_dropbox_id_validator, + 'new_owner_not_a_member': TransferFolderError._new_owner_not_a_member_validator, + 'new_owner_unmounted': TransferFolderError._new_owner_unmounted_validator, + 'new_owner_email_unverified': TransferFolderError._new_owner_email_unverified_validator, + 'other': TransferFolderError._other_validator, } -MemberSelector.other = MemberSelector('other') - -AddFolderMemberError._access_error_validator = bv.Union(SharedFolderAccessError) -AddFolderMemberError._email_unverified_validator = bv.Void() -AddFolderMemberError._bad_member_validator = bv.Union(AddMemberSelectorError) -AddFolderMemberError._no_permission_validator = bv.Void() -AddFolderMemberError._cant_share_outside_team_validator = bv.Void() -AddFolderMemberError._too_many_members_validator = bv.UInt64() -AddFolderMemberError._too_many_pending_invites_validator = bv.UInt64() -AddFolderMemberError._rate_limit_validator = bv.Void() -AddFolderMemberError._insufficient_plan_validator = bv.Void() -AddFolderMemberError._other_validator = bv.Void() -AddFolderMemberError._tagmap = { - 'access_error': AddFolderMemberError._access_error_validator, - 'email_unverified': AddFolderMemberError._email_unverified_validator, - 'bad_member': AddFolderMemberError._bad_member_validator, - 'no_permission': AddFolderMemberError._no_permission_validator, - 'cant_share_outside_team': AddFolderMemberError._cant_share_outside_team_validator, - 'too_many_members': AddFolderMemberError._too_many_members_validator, - 'too_many_pending_invites': AddFolderMemberError._too_many_pending_invites_validator, - 'rate_limit': AddFolderMemberError._rate_limit_validator, - 'insufficient_plan': AddFolderMemberError._insufficient_plan_validator, - 'other': AddFolderMemberError._other_validator, -} +TransferFolderError.no_permission = TransferFolderError('no_permission') +TransferFolderError.invalid_dropbox_id = TransferFolderError('invalid_dropbox_id') +TransferFolderError.new_owner_not_a_member = TransferFolderError('new_owner_not_a_member') +TransferFolderError.new_owner_unmounted = TransferFolderError('new_owner_unmounted') +TransferFolderError.new_owner_email_unverified = TransferFolderError('new_owner_email_unverified') +TransferFolderError.other = TransferFolderError('other') -AddFolderMemberError.email_unverified = AddFolderMemberError('email_unverified') -AddFolderMemberError.no_permission = AddFolderMemberError('no_permission') -AddFolderMemberError.cant_share_outside_team = AddFolderMemberError('cant_share_outside_team') -AddFolderMemberError.rate_limit = AddFolderMemberError('rate_limit') -AddFolderMemberError.insufficient_plan = AddFolderMemberError('insufficient_plan') -AddFolderMemberError.other = AddFolderMemberError('other') +UnmountFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +UnmountFolderArg._all_field_names_ = set(['shared_folder_id']) +UnmountFolderArg._all_fields_ = [('shared_folder_id', UnmountFolderArg._shared_folder_id_validator)] -AddMemberSelectorError._invalid_dropbox_id_validator = bv.String(min_length=1) -AddMemberSelectorError._invalid_email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") -AddMemberSelectorError._unverified_dropbox_id_validator = bv.String(min_length=1) -AddMemberSelectorError._group_deleted_validator = bv.Void() -AddMemberSelectorError._group_not_on_team_validator = bv.Void() -AddMemberSelectorError._other_validator = bv.Void() -AddMemberSelectorError._tagmap = { - 'invalid_dropbox_id': AddMemberSelectorError._invalid_dropbox_id_validator, - 'invalid_email': AddMemberSelectorError._invalid_email_validator, - 'unverified_dropbox_id': AddMemberSelectorError._unverified_dropbox_id_validator, - 'group_deleted': AddMemberSelectorError._group_deleted_validator, - 'group_not_on_team': AddMemberSelectorError._group_not_on_team_validator, - 'other': AddMemberSelectorError._other_validator, +UnmountFolderError._access_error_validator = bv.Union(SharedFolderAccessError) +UnmountFolderError._other_validator = bv.Void() +UnmountFolderError._tagmap = { + 'access_error': UnmountFolderError._access_error_validator, + 'other': UnmountFolderError._other_validator, } -AddMemberSelectorError.group_deleted = AddMemberSelectorError('group_deleted') -AddMemberSelectorError.group_not_on_team = AddMemberSelectorError('group_not_on_team') -AddMemberSelectorError.other = AddMemberSelectorError('other') +UnmountFolderError.other = UnmountFolderError('other') -RemoveFolderMemberArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -RemoveFolderMemberArg._member_validator = bv.Union(MemberSelector) -RemoveFolderMemberArg._leave_a_copy_validator = bv.Boolean() -RemoveFolderMemberArg._all_field_names_ = set([ +UnshareFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +UnshareFolderArg._leave_a_copy_validator = bv.Boolean() +UnshareFolderArg._all_field_names_ = set([ 'shared_folder_id', - 'member', 'leave_a_copy', ]) -RemoveFolderMemberArg._all_fields_ = [ - ('shared_folder_id', RemoveFolderMemberArg._shared_folder_id_validator), - ('member', RemoveFolderMemberArg._member_validator), - ('leave_a_copy', RemoveFolderMemberArg._leave_a_copy_validator), +UnshareFolderArg._all_fields_ = [ + ('shared_folder_id', UnshareFolderArg._shared_folder_id_validator), + ('leave_a_copy', UnshareFolderArg._leave_a_copy_validator), ] -RemoveFolderMemberError._access_error_validator = bv.Union(SharedFolderAccessError) -RemoveFolderMemberError._other_validator = bv.Void() -RemoveFolderMemberError._tagmap = { - 'access_error': RemoveFolderMemberError._access_error_validator, - 'other': RemoveFolderMemberError._other_validator, +UnshareFolderError._access_error_validator = bv.Union(SharedFolderAccessError) +UnshareFolderError._other_validator = bv.Void() +UnshareFolderError._tagmap = { + 'access_error': UnshareFolderError._access_error_validator, + 'other': UnshareFolderError._other_validator, } -RemoveFolderMemberError.other = RemoveFolderMemberError('other') +UnshareFolderError.other = UnshareFolderError('other') UpdateFolderMemberArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') UpdateFolderMemberArg._member_validator = bv.Union(MemberSelector) @@ -6137,60 +9317,78 @@ def __repr__(self): UpdateFolderMemberError.insufficient_plan = UpdateFolderMemberError('insufficient_plan') UpdateFolderMemberError.other = UpdateFolderMemberError('other') -MountFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -MountFolderArg._all_field_names_ = set(['shared_folder_id']) -MountFolderArg._all_fields_ = [('shared_folder_id', MountFolderArg._shared_folder_id_validator)] +UpdateFolderPolicyArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +UpdateFolderPolicyArg._member_policy_validator = bv.Nullable(bv.Union(MemberPolicy)) +UpdateFolderPolicyArg._acl_update_policy_validator = bv.Nullable(bv.Union(AclUpdatePolicy)) +UpdateFolderPolicyArg._shared_link_policy_validator = bv.Nullable(bv.Union(SharedLinkPolicy)) +UpdateFolderPolicyArg._all_field_names_ = set([ + 'shared_folder_id', + 'member_policy', + 'acl_update_policy', + 'shared_link_policy', +]) +UpdateFolderPolicyArg._all_fields_ = [ + ('shared_folder_id', UpdateFolderPolicyArg._shared_folder_id_validator), + ('member_policy', UpdateFolderPolicyArg._member_policy_validator), + ('acl_update_policy', UpdateFolderPolicyArg._acl_update_policy_validator), + ('shared_link_policy', UpdateFolderPolicyArg._shared_link_policy_validator), +] -MountFolderError._access_error_validator = bv.Union(SharedFolderAccessError) -MountFolderError._inside_shared_folder_validator = bv.Void() -MountFolderError._insufficient_quota_validator = bv.Void() -MountFolderError._already_mounted_validator = bv.Void() -MountFolderError._other_validator = bv.Void() -MountFolderError._tagmap = { - 'access_error': MountFolderError._access_error_validator, - 'inside_shared_folder': MountFolderError._inside_shared_folder_validator, - 'insufficient_quota': MountFolderError._insufficient_quota_validator, - 'already_mounted': MountFolderError._already_mounted_validator, - 'other': MountFolderError._other_validator, +UpdateFolderPolicyError._access_error_validator = bv.Union(SharedFolderAccessError) +UpdateFolderPolicyError._not_on_team_validator = bv.Void() +UpdateFolderPolicyError._team_policy_disallows_member_policy_validator = bv.Void() +UpdateFolderPolicyError._disallowed_shared_link_policy_validator = bv.Void() +UpdateFolderPolicyError._other_validator = bv.Void() +UpdateFolderPolicyError._tagmap = { + 'access_error': UpdateFolderPolicyError._access_error_validator, + 'not_on_team': UpdateFolderPolicyError._not_on_team_validator, + 'team_policy_disallows_member_policy': UpdateFolderPolicyError._team_policy_disallows_member_policy_validator, + 'disallowed_shared_link_policy': UpdateFolderPolicyError._disallowed_shared_link_policy_validator, + 'other': UpdateFolderPolicyError._other_validator, } -MountFolderError.inside_shared_folder = MountFolderError('inside_shared_folder') -MountFolderError.insufficient_quota = MountFolderError('insufficient_quota') -MountFolderError.already_mounted = MountFolderError('already_mounted') -MountFolderError.other = MountFolderError('other') - -UnmountFolderArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -UnmountFolderArg._all_field_names_ = set(['shared_folder_id']) -UnmountFolderArg._all_fields_ = [('shared_folder_id', UnmountFolderArg._shared_folder_id_validator)] - -UnmountFolderError._access_error_validator = bv.Union(SharedFolderAccessError) -UnmountFolderError._other_validator = bv.Void() -UnmountFolderError._tagmap = { - 'access_error': UnmountFolderError._access_error_validator, - 'other': UnmountFolderError._other_validator, -} +UpdateFolderPolicyError.not_on_team = UpdateFolderPolicyError('not_on_team') +UpdateFolderPolicyError.team_policy_disallows_member_policy = UpdateFolderPolicyError('team_policy_disallows_member_policy') +UpdateFolderPolicyError.disallowed_shared_link_policy = UpdateFolderPolicyError('disallowed_shared_link_policy') +UpdateFolderPolicyError.other = UpdateFolderPolicyError('other') -UnmountFolderError.other = UnmountFolderError('other') +UserInfo._account_id_validator = bv.String(min_length=40, max_length=40) +UserInfo._same_team_validator = bv.Boolean() +UserInfo._team_member_id_validator = bv.Nullable(bv.String()) +UserInfo._all_field_names_ = set([ + 'account_id', + 'same_team', + 'team_member_id', +]) +UserInfo._all_fields_ = [ + ('account_id', UserInfo._account_id_validator), + ('same_team', UserInfo._same_team_validator), + ('team_member_id', UserInfo._team_member_id_validator), +] -RelinquishFolderMembershipArg._shared_folder_id_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') -RelinquishFolderMembershipArg._all_field_names_ = set(['shared_folder_id']) -RelinquishFolderMembershipArg._all_fields_ = [('shared_folder_id', RelinquishFolderMembershipArg._shared_folder_id_validator)] +UserMembershipInfo._user_validator = bv.Struct(UserInfo) +UserMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['user'])) +UserMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('user', UserMembershipInfo._user_validator)] -RelinquishFolderMembershipError._access_error_validator = bv.Union(SharedFolderAccessError) -RelinquishFolderMembershipError._folder_owner_validator = bv.Void() -RelinquishFolderMembershipError._mounted_validator = bv.Void() -RelinquishFolderMembershipError._group_access_validator = bv.Void() -RelinquishFolderMembershipError._other_validator = bv.Void() -RelinquishFolderMembershipError._tagmap = { - 'access_error': RelinquishFolderMembershipError._access_error_validator, - 'folder_owner': RelinquishFolderMembershipError._folder_owner_validator, - 'mounted': RelinquishFolderMembershipError._mounted_validator, - 'group_access': RelinquishFolderMembershipError._group_access_validator, - 'other': RelinquishFolderMembershipError._other_validator, +Visibility._public_validator = bv.Void() +Visibility._team_only_validator = bv.Void() +Visibility._password_validator = bv.Void() +Visibility._team_and_password_validator = bv.Void() +Visibility._shared_folder_only_validator = bv.Void() +Visibility._other_validator = bv.Void() +Visibility._tagmap = { + 'public': Visibility._public_validator, + 'team_only': Visibility._team_only_validator, + 'password': Visibility._password_validator, + 'team_and_password': Visibility._team_and_password_validator, + 'shared_folder_only': Visibility._shared_folder_only_validator, + 'other': Visibility._other_validator, } -RelinquishFolderMembershipError.folder_owner = RelinquishFolderMembershipError('folder_owner') -RelinquishFolderMembershipError.mounted = RelinquishFolderMembershipError('mounted') -RelinquishFolderMembershipError.group_access = RelinquishFolderMembershipError('group_access') -RelinquishFolderMembershipError.other = RelinquishFolderMembershipError('other') +Visibility.public = Visibility('public') +Visibility.team_only = Visibility('team_only') +Visibility.password = Visibility('password') +Visibility.team_and_password = Visibility('team_and_password') +Visibility.shared_folder_only = Visibility('shared_folder_only') +Visibility.other = Visibility('other') diff --git a/dropbox/team.py b/dropbox/team.py index 9cccb44a..66d01967 100644 --- a/dropbox/team.py +++ b/dropbox/team.py @@ -6,164 +6,11991 @@ # This makes testing this file directly (outside of a package) easier. import babel_validators as bv -class GroupSummary(object): - """ - Information about a group. +try: + from . import ( + async, + users, + ) +except (SystemError, ValueError): + import async + import users - :ivar group_external_id: External ID of group. This is an arbitrary ID that - an admin can attach to a group. - :ivar member_count: The number of members in the group. +class DeviceSession(object): + """ + :ivar session_id: The session id + :ivar ip_address: The IP address of the last activity from this session + :ivar country: The country from which the last activity from this session + was made + :ivar created: The time this session was created + :ivar updated: The time of the last activity from this session """ __slots__ = [ - '_group_name_value', - '_group_name_present', - '_group_id_value', - '_group_id_present', - '_group_external_id_value', - '_group_external_id_present', - '_member_count_value', - '_member_count_present', + '_session_id_value', + '_session_id_present', + '_ip_address_value', + '_ip_address_present', + '_country_value', + '_country_present', + '_created_value', + '_created_present', + '_updated_value', + '_updated_present', ] _has_required_fields = True def __init__(self, - group_name=None, - group_id=None, - member_count=None, - group_external_id=None): - self._group_name_value = None - self._group_name_present = False - self._group_id_value = None - self._group_id_present = False - self._group_external_id_value = None - self._group_external_id_present = False - self._member_count_value = None - self._member_count_present = False - if group_name is not None: - self.group_name = group_name - if group_id is not None: - self.group_id = group_id - if group_external_id is not None: - self.group_external_id = group_external_id - if member_count is not None: - self.member_count = member_count + session_id=None, + ip_address=None, + country=None, + created=None, + updated=None): + self._session_id_value = None + self._session_id_present = False + self._ip_address_value = None + self._ip_address_present = False + self._country_value = None + self._country_present = False + self._created_value = None + self._created_present = False + self._updated_value = None + self._updated_present = False + if session_id is not None: + self.session_id = session_id + if ip_address is not None: + self.ip_address = ip_address + if country is not None: + self.country = country + if created is not None: + self.created = created + if updated is not None: + self.updated = updated @property - def group_name(self): + def session_id(self): """ + The session id + :rtype: str """ - if self._group_name_present: - return self._group_name_value + if self._session_id_present: + return self._session_id_value else: - raise AttributeError("missing required field 'group_name'") + raise AttributeError("missing required field 'session_id'") - @group_name.setter - def group_name(self, val): - val = self._group_name_validator.validate(val) - self._group_name_value = val - self._group_name_present = True + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True - @group_name.deleter - def group_name(self): - self._group_name_value = None - self._group_name_present = False + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False @property - def group_id(self): + def ip_address(self): """ + The IP address of the last activity from this session + :rtype: str """ - if self._group_id_present: - return self._group_id_value + if self._ip_address_present: + return self._ip_address_value else: - raise AttributeError("missing required field 'group_id'") + return None - @group_id.setter - def group_id(self, val): - val = self._group_id_validator.validate(val) - self._group_id_value = val - self._group_id_present = True + @ip_address.setter + def ip_address(self, val): + if val is None: + del self.ip_address + return + val = self._ip_address_validator.validate(val) + self._ip_address_value = val + self._ip_address_present = True - @group_id.deleter - def group_id(self): - self._group_id_value = None - self._group_id_present = False + @ip_address.deleter + def ip_address(self): + self._ip_address_value = None + self._ip_address_present = False @property - def group_external_id(self): + def country(self): """ - External ID of group. This is an arbitrary ID that an admin can attach - to a group. + The country from which the last activity from this session was made :rtype: str """ - if self._group_external_id_present: - return self._group_external_id_value + if self._country_present: + return self._country_value else: return None - @group_external_id.setter - def group_external_id(self, val): + @country.setter + def country(self, val): if val is None: - del self.group_external_id + del self.country return - val = self._group_external_id_validator.validate(val) - self._group_external_id_value = val - self._group_external_id_present = True + val = self._country_validator.validate(val) + self._country_value = val + self._country_present = True - @group_external_id.deleter - def group_external_id(self): - self._group_external_id_value = None - self._group_external_id_present = False + @country.deleter + def country(self): + self._country_value = None + self._country_present = False @property - def member_count(self): + def created(self): """ - The number of members in the group. + The time this session was created - :rtype: long + :rtype: datetime.datetime """ - if self._member_count_present: - return self._member_count_value + if self._created_present: + return self._created_value else: - raise AttributeError("missing required field 'member_count'") + return None - @member_count.setter - def member_count(self, val): - val = self._member_count_validator.validate(val) - self._member_count_value = val - self._member_count_present = True + @created.setter + def created(self, val): + if val is None: + del self.created + return + val = self._created_validator.validate(val) + self._created_value = val + self._created_present = True - @member_count.deleter - def member_count(self): - self._member_count_value = None - self._member_count_present = False + @created.deleter + def created(self): + self._created_value = None + self._created_present = False + + @property + def updated(self): + """ + The time of the last activity from this session + + :rtype: datetime.datetime + """ + if self._updated_present: + return self._updated_value + else: + return None + + @updated.setter + def updated(self, val): + if val is None: + del self.updated + return + val = self._updated_validator.validate(val) + self._updated_value = val + self._updated_present = True + + @updated.deleter + def updated(self): + self._updated_value = None + self._updated_present = False def __repr__(self): - return 'GroupSummary(group_name={!r}, group_id={!r}, member_count={!r}, group_external_id={!r})'.format( - self._group_name_value, - self._group_id_value, - self._member_count_value, - self._group_external_id_value, + return 'DeviceSession(session_id={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r})'.format( + self._session_id_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, ) -GroupSummary._group_name_validator = bv.String() -GroupSummary._group_id_validator = bv.String() -GroupSummary._group_external_id_validator = bv.Nullable(bv.String()) -GroupSummary._member_count_validator = bv.UInt32() -GroupSummary._all_field_names_ = set([ - 'group_name', - 'group_id', - 'group_external_id', - 'member_count', -]) -GroupSummary._all_fields_ = [ - ('group_name', GroupSummary._group_name_validator), - ('group_id', GroupSummary._group_id_validator), - ('group_external_id', GroupSummary._group_external_id_validator), - ('member_count', GroupSummary._member_count_validator), -] +class ActiveWebSession(DeviceSession): + """ + Information on active web sessions + + :ivar user_agent: Information on the hosting device + :ivar os: Information on the hosting operating system + :ivar browser: Information on the browser used for this web session + """ + + __slots__ = [ + '_user_agent_value', + '_user_agent_present', + '_os_value', + '_os_present', + '_browser_value', + '_browser_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + user_agent=None, + os=None, + browser=None, + ip_address=None, + country=None, + created=None, + updated=None): + super(ActiveWebSession, self).__init__(session_id, + ip_address, + country, + created, + updated) + self._user_agent_value = None + self._user_agent_present = False + self._os_value = None + self._os_present = False + self._browser_value = None + self._browser_present = False + if user_agent is not None: + self.user_agent = user_agent + if os is not None: + self.os = os + if browser is not None: + self.browser = browser + + @property + def user_agent(self): + """ + Information on the hosting device + + :rtype: str + """ + if self._user_agent_present: + return self._user_agent_value + else: + raise AttributeError("missing required field 'user_agent'") + + @user_agent.setter + def user_agent(self, val): + val = self._user_agent_validator.validate(val) + self._user_agent_value = val + self._user_agent_present = True + + @user_agent.deleter + def user_agent(self): + self._user_agent_value = None + self._user_agent_present = False + + @property + def os(self): + """ + Information on the hosting operating system + + :rtype: str + """ + if self._os_present: + return self._os_value + else: + raise AttributeError("missing required field 'os'") + + @os.setter + def os(self, val): + val = self._os_validator.validate(val) + self._os_value = val + self._os_present = True + + @os.deleter + def os(self): + self._os_value = None + self._os_present = False + + @property + def browser(self): + """ + Information on the browser used for this web session + + :rtype: str + """ + if self._browser_present: + return self._browser_value + else: + raise AttributeError("missing required field 'browser'") + + @browser.setter + def browser(self, val): + val = self._browser_validator.validate(val) + self._browser_value = val + self._browser_present = True + + @browser.deleter + def browser(self): + self._browser_value = None + self._browser_present = False + + def __repr__(self): + return 'ActiveWebSession(session_id={!r}, user_agent={!r}, os={!r}, browser={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r})'.format( + self._session_id_value, + self._user_agent_value, + self._os_value, + self._browser_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + ) + +class AdminTier(object): + """ + Describes which team-related admin permissions a user has. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team_admin: User is an administrator of the team - has all + permissions. + :ivar user_management_admin: User can do most user provisioning, + de-provisioning and management. + :ivar support_admin: User can do a limited set of common support tasks for + existing users. + :ivar member_only: User is not an admin of the team. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + team_admin = None + # Attribute is overwritten below the class definition + user_management_admin = None + # Attribute is overwritten below the class definition + support_admin = None + # Attribute is overwritten below the class definition + member_only = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_team_admin(self): + """ + Check if the union tag is ``team_admin``. + + :rtype: bool + """ + return self._tag == 'team_admin' + + def is_user_management_admin(self): + """ + Check if the union tag is ``user_management_admin``. + + :rtype: bool + """ + return self._tag == 'user_management_admin' + + def is_support_admin(self): + """ + Check if the union tag is ``support_admin``. + + :rtype: bool + """ + return self._tag == 'support_admin' + + def is_member_only(self): + """ + Check if the union tag is ``member_only``. + + :rtype: bool + """ + return self._tag == 'member_only' + + def __repr__(self): + return 'AdminTier(%r, %r)' % (self._tag, self._value) + +class ApiApp(object): + """ + Information on linked third party applications + + :ivar app_id: The application unique id + :ivar app_name: The application name + :ivar publisher: The application publisher name + :ivar publisher_url: The publisher's URL + :ivar linked: The time this application was linked + :ivar is_app_folder: Whether the linked application uses a dedicated folder + """ + + __slots__ = [ + '_app_id_value', + '_app_id_present', + '_app_name_value', + '_app_name_present', + '_publisher_value', + '_publisher_present', + '_publisher_url_value', + '_publisher_url_present', + '_linked_value', + '_linked_present', + '_is_app_folder_value', + '_is_app_folder_present', + ] + + _has_required_fields = True + + def __init__(self, + app_id=None, + app_name=None, + is_app_folder=None, + publisher=None, + publisher_url=None, + linked=None): + self._app_id_value = None + self._app_id_present = False + self._app_name_value = None + self._app_name_present = False + self._publisher_value = None + self._publisher_present = False + self._publisher_url_value = None + self._publisher_url_present = False + self._linked_value = None + self._linked_present = False + self._is_app_folder_value = None + self._is_app_folder_present = False + if app_id is not None: + self.app_id = app_id + if app_name is not None: + self.app_name = app_name + if publisher is not None: + self.publisher = publisher + if publisher_url is not None: + self.publisher_url = publisher_url + if linked is not None: + self.linked = linked + if is_app_folder is not None: + self.is_app_folder = is_app_folder + + @property + def app_id(self): + """ + The application unique id + + :rtype: str + """ + if self._app_id_present: + return self._app_id_value + else: + raise AttributeError("missing required field 'app_id'") + + @app_id.setter + def app_id(self, val): + val = self._app_id_validator.validate(val) + self._app_id_value = val + self._app_id_present = True + + @app_id.deleter + def app_id(self): + self._app_id_value = None + self._app_id_present = False + + @property + def app_name(self): + """ + The application name + + :rtype: str + """ + if self._app_name_present: + return self._app_name_value + else: + raise AttributeError("missing required field 'app_name'") + + @app_name.setter + def app_name(self, val): + val = self._app_name_validator.validate(val) + self._app_name_value = val + self._app_name_present = True + + @app_name.deleter + def app_name(self): + self._app_name_value = None + self._app_name_present = False + + @property + def publisher(self): + """ + The application publisher name + + :rtype: str + """ + if self._publisher_present: + return self._publisher_value + else: + return None + + @publisher.setter + def publisher(self, val): + if val is None: + del self.publisher + return + val = self._publisher_validator.validate(val) + self._publisher_value = val + self._publisher_present = True + + @publisher.deleter + def publisher(self): + self._publisher_value = None + self._publisher_present = False + + @property + def publisher_url(self): + """ + The publisher's URL + + :rtype: str + """ + if self._publisher_url_present: + return self._publisher_url_value + else: + return None + + @publisher_url.setter + def publisher_url(self, val): + if val is None: + del self.publisher_url + return + val = self._publisher_url_validator.validate(val) + self._publisher_url_value = val + self._publisher_url_present = True + + @publisher_url.deleter + def publisher_url(self): + self._publisher_url_value = None + self._publisher_url_present = False + + @property + def linked(self): + """ + The time this application was linked + + :rtype: datetime.datetime + """ + if self._linked_present: + return self._linked_value + else: + return None + + @linked.setter + def linked(self, val): + if val is None: + del self.linked + return + val = self._linked_validator.validate(val) + self._linked_value = val + self._linked_present = True + + @linked.deleter + def linked(self): + self._linked_value = None + self._linked_present = False + + @property + def is_app_folder(self): + """ + Whether the linked application uses a dedicated folder + + :rtype: bool + """ + if self._is_app_folder_present: + return self._is_app_folder_value + else: + raise AttributeError("missing required field 'is_app_folder'") + + @is_app_folder.setter + def is_app_folder(self, val): + val = self._is_app_folder_validator.validate(val) + self._is_app_folder_value = val + self._is_app_folder_present = True + + @is_app_folder.deleter + def is_app_folder(self): + self._is_app_folder_value = None + self._is_app_folder_present = False + + def __repr__(self): + return 'ApiApp(app_id={!r}, app_name={!r}, is_app_folder={!r}, publisher={!r}, publisher_url={!r}, linked={!r})'.format( + self._app_id_value, + self._app_name_value, + self._is_app_folder_value, + self._publisher_value, + self._publisher_url_value, + self._linked_value, + ) + +class BaseDfbReport(object): + """ + Base report structure. + + :ivar start_date: First date present in the results as 'YYYY-MM-DD' or None. + """ + + __slots__ = [ + '_start_date_value', + '_start_date_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None): + self._start_date_value = None + self._start_date_present = False + if start_date is not None: + self.start_date = start_date + + @property + def start_date(self): + """ + First date present in the results as 'YYYY-MM-DD' or None. + + :rtype: str + """ + if self._start_date_present: + return self._start_date_value + else: + raise AttributeError("missing required field 'start_date'") + + @start_date.setter + def start_date(self, val): + val = self._start_date_validator.validate(val) + self._start_date_value = val + self._start_date_present = True + + @start_date.deleter + def start_date(self): + self._start_date_value = None + self._start_date_present = False + + def __repr__(self): + return 'BaseDfbReport(start_date={!r})'.format( + self._start_date_value, + ) + +class DateRange(object): + """ + Input arguments that can be provided for most reports. + + :ivar start_date: Optional starting date (inclusive) + :ivar end_date: Optional ending date (exclusive) + """ + + __slots__ = [ + '_start_date_value', + '_start_date_present', + '_end_date_value', + '_end_date_present', + ] + + _has_required_fields = False + + def __init__(self, + start_date=None, + end_date=None): + self._start_date_value = None + self._start_date_present = False + self._end_date_value = None + self._end_date_present = False + if start_date is not None: + self.start_date = start_date + if end_date is not None: + self.end_date = end_date + + @property + def start_date(self): + """ + Optional starting date (inclusive) + + :rtype: datetime.datetime + """ + if self._start_date_present: + return self._start_date_value + else: + return None + + @start_date.setter + def start_date(self, val): + if val is None: + del self.start_date + return + val = self._start_date_validator.validate(val) + self._start_date_value = val + self._start_date_present = True + + @start_date.deleter + def start_date(self): + self._start_date_value = None + self._start_date_present = False + + @property + def end_date(self): + """ + Optional ending date (exclusive) + + :rtype: datetime.datetime + """ + if self._end_date_present: + return self._end_date_value + else: + return None + + @end_date.setter + def end_date(self, val): + if val is None: + del self.end_date + return + val = self._end_date_validator.validate(val) + self._end_date_value = val + self._end_date_present = True + + @end_date.deleter + def end_date(self): + self._end_date_value = None + self._end_date_present = False + + def __repr__(self): + return 'DateRange(start_date={!r}, end_date={!r})'.format( + self._start_date_value, + self._end_date_value, + ) + +class DateRangeError(object): + """ + Errors that can originate from problems in input arguments to reports. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'DateRangeError(%r, %r)' % (self._tag, self._value) + +class DesktopClientSession(DeviceSession): + """ + Information about linked Dropbox desktop client sessions + + :ivar host_name: Name of the hosting desktop + :ivar client_type: The Dropbox desktop client type + :ivar client_version: The Dropbox client version + :ivar platform: Information on the hosting platform + :ivar is_delete_on_unlink_supported: Whether it's possible to delete all of + the account files upon unlinking + """ + + __slots__ = [ + '_host_name_value', + '_host_name_present', + '_client_type_value', + '_client_type_present', + '_client_version_value', + '_client_version_present', + '_platform_value', + '_platform_present', + '_is_delete_on_unlink_supported_value', + '_is_delete_on_unlink_supported_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + host_name=None, + client_type=None, + client_version=None, + platform=None, + is_delete_on_unlink_supported=None, + ip_address=None, + country=None, + created=None, + updated=None): + super(DesktopClientSession, self).__init__(session_id, + ip_address, + country, + created, + updated) + self._host_name_value = None + self._host_name_present = False + self._client_type_value = None + self._client_type_present = False + self._client_version_value = None + self._client_version_present = False + self._platform_value = None + self._platform_present = False + self._is_delete_on_unlink_supported_value = None + self._is_delete_on_unlink_supported_present = False + if host_name is not None: + self.host_name = host_name + if client_type is not None: + self.client_type = client_type + if client_version is not None: + self.client_version = client_version + if platform is not None: + self.platform = platform + if is_delete_on_unlink_supported is not None: + self.is_delete_on_unlink_supported = is_delete_on_unlink_supported + + @property + def host_name(self): + """ + Name of the hosting desktop + + :rtype: str + """ + if self._host_name_present: + return self._host_name_value + else: + raise AttributeError("missing required field 'host_name'") + + @host_name.setter + def host_name(self, val): + val = self._host_name_validator.validate(val) + self._host_name_value = val + self._host_name_present = True + + @host_name.deleter + def host_name(self): + self._host_name_value = None + self._host_name_present = False + + @property + def client_type(self): + """ + The Dropbox desktop client type + + :rtype: DesktopPlatform + """ + if self._client_type_present: + return self._client_type_value + else: + raise AttributeError("missing required field 'client_type'") + + @client_type.setter + def client_type(self, val): + self._client_type_validator.validate_type_only(val) + self._client_type_value = val + self._client_type_present = True + + @client_type.deleter + def client_type(self): + self._client_type_value = None + self._client_type_present = False + + @property + def client_version(self): + """ + The Dropbox client version + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + raise AttributeError("missing required field 'client_version'") + + @client_version.setter + def client_version(self, val): + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def platform(self): + """ + Information on the hosting platform + + :rtype: str + """ + if self._platform_present: + return self._platform_value + else: + raise AttributeError("missing required field 'platform'") + + @platform.setter + def platform(self, val): + val = self._platform_validator.validate(val) + self._platform_value = val + self._platform_present = True + + @platform.deleter + def platform(self): + self._platform_value = None + self._platform_present = False + + @property + def is_delete_on_unlink_supported(self): + """ + Whether it's possible to delete all of the account files upon unlinking + + :rtype: bool + """ + if self._is_delete_on_unlink_supported_present: + return self._is_delete_on_unlink_supported_value + else: + raise AttributeError("missing required field 'is_delete_on_unlink_supported'") + + @is_delete_on_unlink_supported.setter + def is_delete_on_unlink_supported(self, val): + val = self._is_delete_on_unlink_supported_validator.validate(val) + self._is_delete_on_unlink_supported_value = val + self._is_delete_on_unlink_supported_present = True + + @is_delete_on_unlink_supported.deleter + def is_delete_on_unlink_supported(self): + self._is_delete_on_unlink_supported_value = None + self._is_delete_on_unlink_supported_present = False + + def __repr__(self): + return 'DesktopClientSession(session_id={!r}, host_name={!r}, client_type={!r}, client_version={!r}, platform={!r}, is_delete_on_unlink_supported={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r})'.format( + self._session_id_value, + self._host_name_value, + self._client_type_value, + self._client_version_value, + self._platform_value, + self._is_delete_on_unlink_supported_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + ) + +class DesktopPlatform(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar windows: Official Windows Dropbox desktop client + :ivar mac: Official Mac Dropbox desktop client + :ivar linux: Official Linux Dropbox desktop client + :ivar other: Official Dropbox desktop client for another platform + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + windows = None + # Attribute is overwritten below the class definition + mac = None + # Attribute is overwritten below the class definition + linux = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_windows(self): + """ + Check if the union tag is ``windows``. + + :rtype: bool + """ + return self._tag == 'windows' + + def is_mac(self): + """ + Check if the union tag is ``mac``. + + :rtype: bool + """ + return self._tag == 'mac' + + def is_linux(self): + """ + Check if the union tag is ``linux``. + + :rtype: bool + """ + return self._tag == 'linux' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'DesktopPlatform(%r, %r)' % (self._tag, self._value) + +class DeviceSessionArg(object): + """ + :ivar session_id: The session id + :ivar team_member_id: The unique id of the member owning the device + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + team_member_id=None): + self._session_id_value = None + self._session_id_present = False + self._team_member_id_value = None + self._team_member_id_present = False + if session_id is not None: + self.session_id = session_id + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def session_id(self): + """ + The session id + + :rtype: str + """ + if self._session_id_present: + return self._session_id_value + else: + raise AttributeError("missing required field 'session_id'") + + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True + + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False + + @property + def team_member_id(self): + """ + The unique id of the member owning the device + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def __repr__(self): + return 'DeviceSessionArg(session_id={!r}, team_member_id={!r})'.format( + self._session_id_value, + self._team_member_id_value, + ) + +class DevicesActive(object): + """ + Each of the items is an array of values, one value per day. The value is the + number of devices active within a time window, ending with that day. If + there is no data for a day, then the value will be None. + + :ivar windows: Array of number of linked windows (desktop) clients with + activity. + :ivar macos: Array of number of linked mac (desktop) clients with activity. + :ivar linux: Array of number of linked linus (desktop) clients with + activity. + :ivar ios: Array of number of linked ios devices with activity. + :ivar android: Array of number of linked android devices with activity. + :ivar other: Array of number of other linked devices (blackberry, windows + phone, etc) with activity. + :ivar total: Array of total number of linked clients with activity. + """ + + __slots__ = [ + '_windows_value', + '_windows_present', + '_macos_value', + '_macos_present', + '_linux_value', + '_linux_present', + '_ios_value', + '_ios_present', + '_android_value', + '_android_present', + '_other_value', + '_other_present', + '_total_value', + '_total_present', + ] + + _has_required_fields = True + + def __init__(self, + windows=None, + macos=None, + linux=None, + ios=None, + android=None, + other=None, + total=None): + self._windows_value = None + self._windows_present = False + self._macos_value = None + self._macos_present = False + self._linux_value = None + self._linux_present = False + self._ios_value = None + self._ios_present = False + self._android_value = None + self._android_present = False + self._other_value = None + self._other_present = False + self._total_value = None + self._total_present = False + if windows is not None: + self.windows = windows + if macos is not None: + self.macos = macos + if linux is not None: + self.linux = linux + if ios is not None: + self.ios = ios + if android is not None: + self.android = android + if other is not None: + self.other = other + if total is not None: + self.total = total + + @property + def windows(self): + """ + Array of number of linked windows (desktop) clients with activity. + + :rtype: list of [Optional[long]] + """ + if self._windows_present: + return self._windows_value + else: + raise AttributeError("missing required field 'windows'") + + @windows.setter + def windows(self, val): + val = self._windows_validator.validate(val) + self._windows_value = val + self._windows_present = True + + @windows.deleter + def windows(self): + self._windows_value = None + self._windows_present = False + + @property + def macos(self): + """ + Array of number of linked mac (desktop) clients with activity. + + :rtype: list of [Optional[long]] + """ + if self._macos_present: + return self._macos_value + else: + raise AttributeError("missing required field 'macos'") + + @macos.setter + def macos(self, val): + val = self._macos_validator.validate(val) + self._macos_value = val + self._macos_present = True + + @macos.deleter + def macos(self): + self._macos_value = None + self._macos_present = False + + @property + def linux(self): + """ + Array of number of linked linus (desktop) clients with activity. + + :rtype: list of [Optional[long]] + """ + if self._linux_present: + return self._linux_value + else: + raise AttributeError("missing required field 'linux'") + + @linux.setter + def linux(self, val): + val = self._linux_validator.validate(val) + self._linux_value = val + self._linux_present = True + + @linux.deleter + def linux(self): + self._linux_value = None + self._linux_present = False + + @property + def ios(self): + """ + Array of number of linked ios devices with activity. + + :rtype: list of [Optional[long]] + """ + if self._ios_present: + return self._ios_value + else: + raise AttributeError("missing required field 'ios'") + + @ios.setter + def ios(self, val): + val = self._ios_validator.validate(val) + self._ios_value = val + self._ios_present = True + + @ios.deleter + def ios(self): + self._ios_value = None + self._ios_present = False + + @property + def android(self): + """ + Array of number of linked android devices with activity. + + :rtype: list of [Optional[long]] + """ + if self._android_present: + return self._android_value + else: + raise AttributeError("missing required field 'android'") + + @android.setter + def android(self, val): + val = self._android_validator.validate(val) + self._android_value = val + self._android_present = True + + @android.deleter + def android(self): + self._android_value = None + self._android_present = False + + @property + def other(self): + """ + Array of number of other linked devices (blackberry, windows phone, etc) + with activity. + + :rtype: list of [Optional[long]] + """ + if self._other_present: + return self._other_value + else: + raise AttributeError("missing required field 'other'") + + @other.setter + def other(self, val): + val = self._other_validator.validate(val) + self._other_value = val + self._other_present = True + + @other.deleter + def other(self): + self._other_value = None + self._other_present = False + + @property + def total(self): + """ + Array of total number of linked clients with activity. + + :rtype: list of [Optional[long]] + """ + if self._total_present: + return self._total_value + else: + raise AttributeError("missing required field 'total'") + + @total.setter + def total(self, val): + val = self._total_validator.validate(val) + self._total_value = val + self._total_present = True + + @total.deleter + def total(self): + self._total_value = None + self._total_present = False + + def __repr__(self): + return 'DevicesActive(windows={!r}, macos={!r}, linux={!r}, ios={!r}, android={!r}, other={!r}, total={!r})'.format( + self._windows_value, + self._macos_value, + self._linux_value, + self._ios_value, + self._android_value, + self._other_value, + self._total_value, + ) + +class EmmState(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Emm token is disabled + :ivar optional: Emm token is optional + :ivar required: Emm token is required + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + optional = None + # Attribute is overwritten below the class definition + required = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_optional(self): + """ + Check if the union tag is ``optional``. + + :rtype: bool + """ + return self._tag == 'optional' + + def is_required(self): + """ + Check if the union tag is ``required``. + + :rtype: bool + """ + return self._tag == 'required' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'EmmState(%r, %r)' % (self._tag, self._value) + +class GetActivityReport(BaseDfbReport): + """ + Activity Report Result. Each of the items in the storage report is an array + of values, one value per day. If there is no data for a day, then the value + will be None. + + :ivar adds: Array of total number of adds by team members. + :ivar edits: Array of number of edits by team members. If the same user + edits the same file multiple times this is counted as a single edit. + :ivar deletes: Array of total number of deletes by team members. + :ivar active_users_28_day: Array of the number of users who have been active + in the last 28 days. + :ivar active_users_7_day: Array of the number of users who have been active + in the last week. + :ivar active_users_1_day: Array of the number of users who have been active + in the last day. + :ivar active_shared_folders_28_day: Array of the number of shared folders + with some activity in the last 28 days. + :ivar active_shared_folders_7_day: Array of the number of shared folders + with some activity in the last week. + :ivar active_shared_folders_1_day: Array of the number of shared folders + with some activity in the last day. + :ivar shared_links_created: Array of the number of shared links created. + :ivar shared_links_viewed_by_team: Array of the number of views by team + users to shared links created by the team. + :ivar shared_links_viewed_by_outside_user: Array of the number of views by + users outside of the team to shared links created by the team. + :ivar shared_links_viewed_by_not_logged_in: Array of the number of views by + non-logged-in users to shared links created by the team. + :ivar shared_links_viewed_total: Array of the total number of views to + shared links created by the team. + """ + + __slots__ = [ + '_adds_value', + '_adds_present', + '_edits_value', + '_edits_present', + '_deletes_value', + '_deletes_present', + '_active_users_28_day_value', + '_active_users_28_day_present', + '_active_users_7_day_value', + '_active_users_7_day_present', + '_active_users_1_day_value', + '_active_users_1_day_present', + '_active_shared_folders_28_day_value', + '_active_shared_folders_28_day_present', + '_active_shared_folders_7_day_value', + '_active_shared_folders_7_day_present', + '_active_shared_folders_1_day_value', + '_active_shared_folders_1_day_present', + '_shared_links_created_value', + '_shared_links_created_present', + '_shared_links_viewed_by_team_value', + '_shared_links_viewed_by_team_present', + '_shared_links_viewed_by_outside_user_value', + '_shared_links_viewed_by_outside_user_present', + '_shared_links_viewed_by_not_logged_in_value', + '_shared_links_viewed_by_not_logged_in_present', + '_shared_links_viewed_total_value', + '_shared_links_viewed_total_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + adds=None, + edits=None, + deletes=None, + active_users_28_day=None, + active_users_7_day=None, + active_users_1_day=None, + active_shared_folders_28_day=None, + active_shared_folders_7_day=None, + active_shared_folders_1_day=None, + shared_links_created=None, + shared_links_viewed_by_team=None, + shared_links_viewed_by_outside_user=None, + shared_links_viewed_by_not_logged_in=None, + shared_links_viewed_total=None): + super(GetActivityReport, self).__init__(start_date) + self._adds_value = None + self._adds_present = False + self._edits_value = None + self._edits_present = False + self._deletes_value = None + self._deletes_present = False + self._active_users_28_day_value = None + self._active_users_28_day_present = False + self._active_users_7_day_value = None + self._active_users_7_day_present = False + self._active_users_1_day_value = None + self._active_users_1_day_present = False + self._active_shared_folders_28_day_value = None + self._active_shared_folders_28_day_present = False + self._active_shared_folders_7_day_value = None + self._active_shared_folders_7_day_present = False + self._active_shared_folders_1_day_value = None + self._active_shared_folders_1_day_present = False + self._shared_links_created_value = None + self._shared_links_created_present = False + self._shared_links_viewed_by_team_value = None + self._shared_links_viewed_by_team_present = False + self._shared_links_viewed_by_outside_user_value = None + self._shared_links_viewed_by_outside_user_present = False + self._shared_links_viewed_by_not_logged_in_value = None + self._shared_links_viewed_by_not_logged_in_present = False + self._shared_links_viewed_total_value = None + self._shared_links_viewed_total_present = False + if adds is not None: + self.adds = adds + if edits is not None: + self.edits = edits + if deletes is not None: + self.deletes = deletes + if active_users_28_day is not None: + self.active_users_28_day = active_users_28_day + if active_users_7_day is not None: + self.active_users_7_day = active_users_7_day + if active_users_1_day is not None: + self.active_users_1_day = active_users_1_day + if active_shared_folders_28_day is not None: + self.active_shared_folders_28_day = active_shared_folders_28_day + if active_shared_folders_7_day is not None: + self.active_shared_folders_7_day = active_shared_folders_7_day + if active_shared_folders_1_day is not None: + self.active_shared_folders_1_day = active_shared_folders_1_day + if shared_links_created is not None: + self.shared_links_created = shared_links_created + if shared_links_viewed_by_team is not None: + self.shared_links_viewed_by_team = shared_links_viewed_by_team + if shared_links_viewed_by_outside_user is not None: + self.shared_links_viewed_by_outside_user = shared_links_viewed_by_outside_user + if shared_links_viewed_by_not_logged_in is not None: + self.shared_links_viewed_by_not_logged_in = shared_links_viewed_by_not_logged_in + if shared_links_viewed_total is not None: + self.shared_links_viewed_total = shared_links_viewed_total + + @property + def adds(self): + """ + Array of total number of adds by team members. + + :rtype: list of [Optional[long]] + """ + if self._adds_present: + return self._adds_value + else: + raise AttributeError("missing required field 'adds'") + + @adds.setter + def adds(self, val): + val = self._adds_validator.validate(val) + self._adds_value = val + self._adds_present = True + + @adds.deleter + def adds(self): + self._adds_value = None + self._adds_present = False + + @property + def edits(self): + """ + Array of number of edits by team members. If the same user edits the + same file multiple times this is counted as a single edit. + + :rtype: list of [Optional[long]] + """ + if self._edits_present: + return self._edits_value + else: + raise AttributeError("missing required field 'edits'") + + @edits.setter + def edits(self, val): + val = self._edits_validator.validate(val) + self._edits_value = val + self._edits_present = True + + @edits.deleter + def edits(self): + self._edits_value = None + self._edits_present = False + + @property + def deletes(self): + """ + Array of total number of deletes by team members. + + :rtype: list of [Optional[long]] + """ + if self._deletes_present: + return self._deletes_value + else: + raise AttributeError("missing required field 'deletes'") + + @deletes.setter + def deletes(self, val): + val = self._deletes_validator.validate(val) + self._deletes_value = val + self._deletes_present = True + + @deletes.deleter + def deletes(self): + self._deletes_value = None + self._deletes_present = False + + @property + def active_users_28_day(self): + """ + Array of the number of users who have been active in the last 28 days. + + :rtype: list of [Optional[long]] + """ + if self._active_users_28_day_present: + return self._active_users_28_day_value + else: + raise AttributeError("missing required field 'active_users_28_day'") + + @active_users_28_day.setter + def active_users_28_day(self, val): + val = self._active_users_28_day_validator.validate(val) + self._active_users_28_day_value = val + self._active_users_28_day_present = True + + @active_users_28_day.deleter + def active_users_28_day(self): + self._active_users_28_day_value = None + self._active_users_28_day_present = False + + @property + def active_users_7_day(self): + """ + Array of the number of users who have been active in the last week. + + :rtype: list of [Optional[long]] + """ + if self._active_users_7_day_present: + return self._active_users_7_day_value + else: + raise AttributeError("missing required field 'active_users_7_day'") + + @active_users_7_day.setter + def active_users_7_day(self, val): + val = self._active_users_7_day_validator.validate(val) + self._active_users_7_day_value = val + self._active_users_7_day_present = True + + @active_users_7_day.deleter + def active_users_7_day(self): + self._active_users_7_day_value = None + self._active_users_7_day_present = False + + @property + def active_users_1_day(self): + """ + Array of the number of users who have been active in the last day. + + :rtype: list of [Optional[long]] + """ + if self._active_users_1_day_present: + return self._active_users_1_day_value + else: + raise AttributeError("missing required field 'active_users_1_day'") + + @active_users_1_day.setter + def active_users_1_day(self, val): + val = self._active_users_1_day_validator.validate(val) + self._active_users_1_day_value = val + self._active_users_1_day_present = True + + @active_users_1_day.deleter + def active_users_1_day(self): + self._active_users_1_day_value = None + self._active_users_1_day_present = False + + @property + def active_shared_folders_28_day(self): + """ + Array of the number of shared folders with some activity in the last 28 + days. + + :rtype: list of [Optional[long]] + """ + if self._active_shared_folders_28_day_present: + return self._active_shared_folders_28_day_value + else: + raise AttributeError("missing required field 'active_shared_folders_28_day'") + + @active_shared_folders_28_day.setter + def active_shared_folders_28_day(self, val): + val = self._active_shared_folders_28_day_validator.validate(val) + self._active_shared_folders_28_day_value = val + self._active_shared_folders_28_day_present = True + + @active_shared_folders_28_day.deleter + def active_shared_folders_28_day(self): + self._active_shared_folders_28_day_value = None + self._active_shared_folders_28_day_present = False + + @property + def active_shared_folders_7_day(self): + """ + Array of the number of shared folders with some activity in the last + week. + + :rtype: list of [Optional[long]] + """ + if self._active_shared_folders_7_day_present: + return self._active_shared_folders_7_day_value + else: + raise AttributeError("missing required field 'active_shared_folders_7_day'") + + @active_shared_folders_7_day.setter + def active_shared_folders_7_day(self, val): + val = self._active_shared_folders_7_day_validator.validate(val) + self._active_shared_folders_7_day_value = val + self._active_shared_folders_7_day_present = True + + @active_shared_folders_7_day.deleter + def active_shared_folders_7_day(self): + self._active_shared_folders_7_day_value = None + self._active_shared_folders_7_day_present = False + + @property + def active_shared_folders_1_day(self): + """ + Array of the number of shared folders with some activity in the last + day. + + :rtype: list of [Optional[long]] + """ + if self._active_shared_folders_1_day_present: + return self._active_shared_folders_1_day_value + else: + raise AttributeError("missing required field 'active_shared_folders_1_day'") + + @active_shared_folders_1_day.setter + def active_shared_folders_1_day(self, val): + val = self._active_shared_folders_1_day_validator.validate(val) + self._active_shared_folders_1_day_value = val + self._active_shared_folders_1_day_present = True + + @active_shared_folders_1_day.deleter + def active_shared_folders_1_day(self): + self._active_shared_folders_1_day_value = None + self._active_shared_folders_1_day_present = False + + @property + def shared_links_created(self): + """ + Array of the number of shared links created. + + :rtype: list of [Optional[long]] + """ + if self._shared_links_created_present: + return self._shared_links_created_value + else: + raise AttributeError("missing required field 'shared_links_created'") + + @shared_links_created.setter + def shared_links_created(self, val): + val = self._shared_links_created_validator.validate(val) + self._shared_links_created_value = val + self._shared_links_created_present = True + + @shared_links_created.deleter + def shared_links_created(self): + self._shared_links_created_value = None + self._shared_links_created_present = False + + @property + def shared_links_viewed_by_team(self): + """ + Array of the number of views by team users to shared links created by + the team. + + :rtype: list of [Optional[long]] + """ + if self._shared_links_viewed_by_team_present: + return self._shared_links_viewed_by_team_value + else: + raise AttributeError("missing required field 'shared_links_viewed_by_team'") + + @shared_links_viewed_by_team.setter + def shared_links_viewed_by_team(self, val): + val = self._shared_links_viewed_by_team_validator.validate(val) + self._shared_links_viewed_by_team_value = val + self._shared_links_viewed_by_team_present = True + + @shared_links_viewed_by_team.deleter + def shared_links_viewed_by_team(self): + self._shared_links_viewed_by_team_value = None + self._shared_links_viewed_by_team_present = False + + @property + def shared_links_viewed_by_outside_user(self): + """ + Array of the number of views by users outside of the team to shared + links created by the team. + + :rtype: list of [Optional[long]] + """ + if self._shared_links_viewed_by_outside_user_present: + return self._shared_links_viewed_by_outside_user_value + else: + raise AttributeError("missing required field 'shared_links_viewed_by_outside_user'") + + @shared_links_viewed_by_outside_user.setter + def shared_links_viewed_by_outside_user(self, val): + val = self._shared_links_viewed_by_outside_user_validator.validate(val) + self._shared_links_viewed_by_outside_user_value = val + self._shared_links_viewed_by_outside_user_present = True + + @shared_links_viewed_by_outside_user.deleter + def shared_links_viewed_by_outside_user(self): + self._shared_links_viewed_by_outside_user_value = None + self._shared_links_viewed_by_outside_user_present = False + + @property + def shared_links_viewed_by_not_logged_in(self): + """ + Array of the number of views by non-logged-in users to shared links + created by the team. + + :rtype: list of [Optional[long]] + """ + if self._shared_links_viewed_by_not_logged_in_present: + return self._shared_links_viewed_by_not_logged_in_value + else: + raise AttributeError("missing required field 'shared_links_viewed_by_not_logged_in'") + + @shared_links_viewed_by_not_logged_in.setter + def shared_links_viewed_by_not_logged_in(self, val): + val = self._shared_links_viewed_by_not_logged_in_validator.validate(val) + self._shared_links_viewed_by_not_logged_in_value = val + self._shared_links_viewed_by_not_logged_in_present = True + + @shared_links_viewed_by_not_logged_in.deleter + def shared_links_viewed_by_not_logged_in(self): + self._shared_links_viewed_by_not_logged_in_value = None + self._shared_links_viewed_by_not_logged_in_present = False + + @property + def shared_links_viewed_total(self): + """ + Array of the total number of views to shared links created by the team. + + :rtype: list of [Optional[long]] + """ + if self._shared_links_viewed_total_present: + return self._shared_links_viewed_total_value + else: + raise AttributeError("missing required field 'shared_links_viewed_total'") + + @shared_links_viewed_total.setter + def shared_links_viewed_total(self, val): + val = self._shared_links_viewed_total_validator.validate(val) + self._shared_links_viewed_total_value = val + self._shared_links_viewed_total_present = True + + @shared_links_viewed_total.deleter + def shared_links_viewed_total(self): + self._shared_links_viewed_total_value = None + self._shared_links_viewed_total_present = False + + def __repr__(self): + return 'GetActivityReport(start_date={!r}, adds={!r}, edits={!r}, deletes={!r}, active_users_28_day={!r}, active_users_7_day={!r}, active_users_1_day={!r}, active_shared_folders_28_day={!r}, active_shared_folders_7_day={!r}, active_shared_folders_1_day={!r}, shared_links_created={!r}, shared_links_viewed_by_team={!r}, shared_links_viewed_by_outside_user={!r}, shared_links_viewed_by_not_logged_in={!r}, shared_links_viewed_total={!r})'.format( + self._start_date_value, + self._adds_value, + self._edits_value, + self._deletes_value, + self._active_users_28_day_value, + self._active_users_7_day_value, + self._active_users_1_day_value, + self._active_shared_folders_28_day_value, + self._active_shared_folders_7_day_value, + self._active_shared_folders_1_day_value, + self._shared_links_created_value, + self._shared_links_viewed_by_team_value, + self._shared_links_viewed_by_outside_user_value, + self._shared_links_viewed_by_not_logged_in_value, + self._shared_links_viewed_total_value, + ) + +class GetDevicesReport(BaseDfbReport): + """ + Devices Report Result. Contains subsections for different time ranges of + activity. Each of the items in each subsection of the storage report is an + array of values, one value per day. If there is no data for a day, then the + value will be None. + + :ivar active_1_day: Report of the number of devices active in the last day. + :ivar active_7_day: Report of the number of devices active in the last 7 + days. + :ivar active_28_day: Report of the number of devices active in the last 28 + days. + """ + + __slots__ = [ + '_active_1_day_value', + '_active_1_day_present', + '_active_7_day_value', + '_active_7_day_present', + '_active_28_day_value', + '_active_28_day_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + active_1_day=None, + active_7_day=None, + active_28_day=None): + super(GetDevicesReport, self).__init__(start_date) + self._active_1_day_value = None + self._active_1_day_present = False + self._active_7_day_value = None + self._active_7_day_present = False + self._active_28_day_value = None + self._active_28_day_present = False + if active_1_day is not None: + self.active_1_day = active_1_day + if active_7_day is not None: + self.active_7_day = active_7_day + if active_28_day is not None: + self.active_28_day = active_28_day + + @property + def active_1_day(self): + """ + Report of the number of devices active in the last day. + + :rtype: DevicesActive + """ + if self._active_1_day_present: + return self._active_1_day_value + else: + raise AttributeError("missing required field 'active_1_day'") + + @active_1_day.setter + def active_1_day(self, val): + self._active_1_day_validator.validate_type_only(val) + self._active_1_day_value = val + self._active_1_day_present = True + + @active_1_day.deleter + def active_1_day(self): + self._active_1_day_value = None + self._active_1_day_present = False + + @property + def active_7_day(self): + """ + Report of the number of devices active in the last 7 days. + + :rtype: DevicesActive + """ + if self._active_7_day_present: + return self._active_7_day_value + else: + raise AttributeError("missing required field 'active_7_day'") + + @active_7_day.setter + def active_7_day(self, val): + self._active_7_day_validator.validate_type_only(val) + self._active_7_day_value = val + self._active_7_day_present = True + + @active_7_day.deleter + def active_7_day(self): + self._active_7_day_value = None + self._active_7_day_present = False + + @property + def active_28_day(self): + """ + Report of the number of devices active in the last 28 days. + + :rtype: DevicesActive + """ + if self._active_28_day_present: + return self._active_28_day_value + else: + raise AttributeError("missing required field 'active_28_day'") + + @active_28_day.setter + def active_28_day(self, val): + self._active_28_day_validator.validate_type_only(val) + self._active_28_day_value = val + self._active_28_day_present = True + + @active_28_day.deleter + def active_28_day(self): + self._active_28_day_value = None + self._active_28_day_present = False + + def __repr__(self): + return 'GetDevicesReport(start_date={!r}, active_1_day={!r}, active_7_day={!r}, active_28_day={!r})'.format( + self._start_date_value, + self._active_1_day_value, + self._active_7_day_value, + self._active_28_day_value, + ) + +class GetMembershipReport(BaseDfbReport): + """ + Membership Report Result. Each of the items in the storage report is an + array of values, one value per day. If there is no data for a day, then the + value will be None. + + :ivar team_size: Team size, for each day. + :ivar pending_invites: The number of pending invites to the team, for each + day. + :ivar members_joined: The number of members that joined the team, for each + day. + :ivar suspended_members: The number of members that joined the team, for + each day. + :ivar licenses: The total number of licenses the team has, for each day. + """ + + __slots__ = [ + '_team_size_value', + '_team_size_present', + '_pending_invites_value', + '_pending_invites_present', + '_members_joined_value', + '_members_joined_present', + '_suspended_members_value', + '_suspended_members_present', + '_licenses_value', + '_licenses_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + team_size=None, + pending_invites=None, + members_joined=None, + suspended_members=None, + licenses=None): + super(GetMembershipReport, self).__init__(start_date) + self._team_size_value = None + self._team_size_present = False + self._pending_invites_value = None + self._pending_invites_present = False + self._members_joined_value = None + self._members_joined_present = False + self._suspended_members_value = None + self._suspended_members_present = False + self._licenses_value = None + self._licenses_present = False + if team_size is not None: + self.team_size = team_size + if pending_invites is not None: + self.pending_invites = pending_invites + if members_joined is not None: + self.members_joined = members_joined + if suspended_members is not None: + self.suspended_members = suspended_members + if licenses is not None: + self.licenses = licenses + + @property + def team_size(self): + """ + Team size, for each day. + + :rtype: list of [Optional[long]] + """ + if self._team_size_present: + return self._team_size_value + else: + raise AttributeError("missing required field 'team_size'") + + @team_size.setter + def team_size(self, val): + val = self._team_size_validator.validate(val) + self._team_size_value = val + self._team_size_present = True + + @team_size.deleter + def team_size(self): + self._team_size_value = None + self._team_size_present = False + + @property + def pending_invites(self): + """ + The number of pending invites to the team, for each day. + + :rtype: list of [Optional[long]] + """ + if self._pending_invites_present: + return self._pending_invites_value + else: + raise AttributeError("missing required field 'pending_invites'") + + @pending_invites.setter + def pending_invites(self, val): + val = self._pending_invites_validator.validate(val) + self._pending_invites_value = val + self._pending_invites_present = True + + @pending_invites.deleter + def pending_invites(self): + self._pending_invites_value = None + self._pending_invites_present = False + + @property + def members_joined(self): + """ + The number of members that joined the team, for each day. + + :rtype: list of [Optional[long]] + """ + if self._members_joined_present: + return self._members_joined_value + else: + raise AttributeError("missing required field 'members_joined'") + + @members_joined.setter + def members_joined(self, val): + val = self._members_joined_validator.validate(val) + self._members_joined_value = val + self._members_joined_present = True + + @members_joined.deleter + def members_joined(self): + self._members_joined_value = None + self._members_joined_present = False + + @property + def suspended_members(self): + """ + The number of members that joined the team, for each day. + + :rtype: list of [Optional[long]] + """ + if self._suspended_members_present: + return self._suspended_members_value + else: + raise AttributeError("missing required field 'suspended_members'") + + @suspended_members.setter + def suspended_members(self, val): + val = self._suspended_members_validator.validate(val) + self._suspended_members_value = val + self._suspended_members_present = True + + @suspended_members.deleter + def suspended_members(self): + self._suspended_members_value = None + self._suspended_members_present = False + + @property + def licenses(self): + """ + The total number of licenses the team has, for each day. + + :rtype: list of [Optional[long]] + """ + if self._licenses_present: + return self._licenses_value + else: + raise AttributeError("missing required field 'licenses'") + + @licenses.setter + def licenses(self, val): + val = self._licenses_validator.validate(val) + self._licenses_value = val + self._licenses_present = True + + @licenses.deleter + def licenses(self): + self._licenses_value = None + self._licenses_present = False + + def __repr__(self): + return 'GetMembershipReport(start_date={!r}, team_size={!r}, pending_invites={!r}, members_joined={!r}, suspended_members={!r}, licenses={!r})'.format( + self._start_date_value, + self._team_size_value, + self._pending_invites_value, + self._members_joined_value, + self._suspended_members_value, + self._licenses_value, + ) + +class GetStorageReport(BaseDfbReport): + """ + Storage Report Result. Each of the items in the storage report is an array + of values, one value per day. If there is no data for a day, then the value + will be None. + + :ivar total_usage: Sum of the shared, unshared, and datastore usages, for + each day. + :ivar shared_usage: Array of the combined size (bytes) of team members' + shared folders, for each day. + :ivar unshared_usage: Array of the combined size (bytes) of team members' + root namespaces, for each day. + :ivar shared_folders: Array of the number of shared folders owned by team + members, for each day. + :ivar member_storage_map: Array of storage summaries of team members' + account sizes. Each storage summary is an array of key, value pairs, + where each pair describes a storage bucket. The key indicates the upper + bound of the bucket and the value is the number of users in that bucket. + There is one such summary per day. If there is no data for a day, the + storage summary will be empty. + """ + + __slots__ = [ + '_total_usage_value', + '_total_usage_present', + '_shared_usage_value', + '_shared_usage_present', + '_unshared_usage_value', + '_unshared_usage_present', + '_shared_folders_value', + '_shared_folders_present', + '_member_storage_map_value', + '_member_storage_map_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + total_usage=None, + shared_usage=None, + unshared_usage=None, + shared_folders=None, + member_storage_map=None): + super(GetStorageReport, self).__init__(start_date) + self._total_usage_value = None + self._total_usage_present = False + self._shared_usage_value = None + self._shared_usage_present = False + self._unshared_usage_value = None + self._unshared_usage_present = False + self._shared_folders_value = None + self._shared_folders_present = False + self._member_storage_map_value = None + self._member_storage_map_present = False + if total_usage is not None: + self.total_usage = total_usage + if shared_usage is not None: + self.shared_usage = shared_usage + if unshared_usage is not None: + self.unshared_usage = unshared_usage + if shared_folders is not None: + self.shared_folders = shared_folders + if member_storage_map is not None: + self.member_storage_map = member_storage_map + + @property + def total_usage(self): + """ + Sum of the shared, unshared, and datastore usages, for each day. + + :rtype: list of [Optional[long]] + """ + if self._total_usage_present: + return self._total_usage_value + else: + raise AttributeError("missing required field 'total_usage'") + + @total_usage.setter + def total_usage(self, val): + val = self._total_usage_validator.validate(val) + self._total_usage_value = val + self._total_usage_present = True + + @total_usage.deleter + def total_usage(self): + self._total_usage_value = None + self._total_usage_present = False + + @property + def shared_usage(self): + """ + Array of the combined size (bytes) of team members' shared folders, for + each day. + + :rtype: list of [Optional[long]] + """ + if self._shared_usage_present: + return self._shared_usage_value + else: + raise AttributeError("missing required field 'shared_usage'") + + @shared_usage.setter + def shared_usage(self, val): + val = self._shared_usage_validator.validate(val) + self._shared_usage_value = val + self._shared_usage_present = True + + @shared_usage.deleter + def shared_usage(self): + self._shared_usage_value = None + self._shared_usage_present = False + + @property + def unshared_usage(self): + """ + Array of the combined size (bytes) of team members' root namespaces, for + each day. + + :rtype: list of [Optional[long]] + """ + if self._unshared_usage_present: + return self._unshared_usage_value + else: + raise AttributeError("missing required field 'unshared_usage'") + + @unshared_usage.setter + def unshared_usage(self, val): + val = self._unshared_usage_validator.validate(val) + self._unshared_usage_value = val + self._unshared_usage_present = True + + @unshared_usage.deleter + def unshared_usage(self): + self._unshared_usage_value = None + self._unshared_usage_present = False + + @property + def shared_folders(self): + """ + Array of the number of shared folders owned by team members, for each + day. + + :rtype: list of [Optional[long]] + """ + if self._shared_folders_present: + return self._shared_folders_value + else: + raise AttributeError("missing required field 'shared_folders'") + + @shared_folders.setter + def shared_folders(self, val): + val = self._shared_folders_validator.validate(val) + self._shared_folders_value = val + self._shared_folders_present = True + + @shared_folders.deleter + def shared_folders(self): + self._shared_folders_value = None + self._shared_folders_present = False + + @property + def member_storage_map(self): + """ + Array of storage summaries of team members' account sizes. Each storage + summary is an array of key, value pairs, where each pair describes a + storage bucket. The key indicates the upper bound of the bucket and the + value is the number of users in that bucket. There is one such summary + per day. If there is no data for a day, the storage summary will be + empty. + + :rtype: list of [list of [StorageBucket]] + """ + if self._member_storage_map_present: + return self._member_storage_map_value + else: + raise AttributeError("missing required field 'member_storage_map'") + + @member_storage_map.setter + def member_storage_map(self, val): + val = self._member_storage_map_validator.validate(val) + self._member_storage_map_value = val + self._member_storage_map_present = True + + @member_storage_map.deleter + def member_storage_map(self): + self._member_storage_map_value = None + self._member_storage_map_present = False + + def __repr__(self): + return 'GetStorageReport(start_date={!r}, total_usage={!r}, shared_usage={!r}, unshared_usage={!r}, shared_folders={!r}, member_storage_map={!r})'.format( + self._start_date_value, + self._total_usage_value, + self._shared_usage_value, + self._unshared_usage_value, + self._shared_folders_value, + self._member_storage_map_value, + ) + +class GroupAccessType(object): + """ + Role of a user in group. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member: User is a member of the group, but has no special permissions. + :ivar owner: A group owner can rename the group, and add/remove members. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + member = None + # Attribute is overwritten below the class definition + owner = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_member(self): + """ + Check if the union tag is ``member``. + + :rtype: bool + """ + return self._tag == 'member' + + def is_owner(self): + """ + Check if the union tag is ``owner``. + + :rtype: bool + """ + return self._tag == 'owner' + + def __repr__(self): + return 'GroupAccessType(%r, %r)' % (self._tag, self._value) + +class GroupCreateArg(object): + """ + :ivar group_name: Group name. + :ivar group_external_id: Optional argument. The creator of a team can + associate an arbitrary external ID to the group. + """ + + __slots__ = [ + '_group_name_value', + '_group_name_present', + '_group_external_id_value', + '_group_external_id_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_external_id=None): + self._group_name_value = None + self._group_name_present = False + self._group_external_id_value = None + self._group_external_id_present = False + if group_name is not None: + self.group_name = group_name + if group_external_id is not None: + self.group_external_id = group_external_id + + @property + def group_name(self): + """ + Group name. + + :rtype: str + """ + if self._group_name_present: + return self._group_name_value + else: + raise AttributeError("missing required field 'group_name'") + + @group_name.setter + def group_name(self, val): + val = self._group_name_validator.validate(val) + self._group_name_value = val + self._group_name_present = True + + @group_name.deleter + def group_name(self): + self._group_name_value = None + self._group_name_present = False + + @property + def group_external_id(self): + """ + Optional argument. The creator of a team can associate an arbitrary + external ID to the group. + + :rtype: str + """ + if self._group_external_id_present: + return self._group_external_id_value + else: + return None + + @group_external_id.setter + def group_external_id(self, val): + if val is None: + del self.group_external_id + return + val = self._group_external_id_validator.validate(val) + self._group_external_id_value = val + self._group_external_id_present = True + + @group_external_id.deleter + def group_external_id(self): + self._group_external_id_value = None + self._group_external_id_present = False + + def __repr__(self): + return 'GroupCreateArg(group_name={!r}, group_external_id={!r})'.format( + self._group_name_value, + self._group_external_id_value, + ) + +class GroupCreateError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_name_already_used: There is already an existing group with the + requested name. + :ivar group_name_invalid: Group name is empty or has invalid characters. + :ivar external_id_already_in_use: The new external ID is already being used + by another group. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_name_already_used = None + # Attribute is overwritten below the class definition + group_name_invalid = None + # Attribute is overwritten below the class definition + external_id_already_in_use = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_group_name_already_used(self): + """ + Check if the union tag is ``group_name_already_used``. + + :rtype: bool + """ + return self._tag == 'group_name_already_used' + + def is_group_name_invalid(self): + """ + Check if the union tag is ``group_name_invalid``. + + :rtype: bool + """ + return self._tag == 'group_name_invalid' + + def is_external_id_already_in_use(self): + """ + Check if the union tag is ``external_id_already_in_use``. + + :rtype: bool + """ + return self._tag == 'external_id_already_in_use' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'GroupCreateError(%r, %r)' % (self._tag, self._value) + +class GroupSelectorError(object): + """ + Error that can be raised when :class:`GroupSelector`is used. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_not_found: No matching group found. No groups match the + specified group ID. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_not_found = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_group_not_found(self): + """ + Check if the union tag is ``group_not_found``. + + :rtype: bool + """ + return self._tag == 'group_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'GroupSelectorError(%r, %r)' % (self._tag, self._value) + +class GroupDeleteError(GroupSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_already_deleted: This group has already been deleted. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + group_already_deleted = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_group_already_deleted(self): + """ + Check if the union tag is ``group_already_deleted``. + + :rtype: bool + """ + return self._tag == 'group_already_deleted' + + def __repr__(self): + return 'GroupDeleteError(%r, %r)' % (self._tag, self._value) + +class GroupSummary(object): + """ + Information about a group. + + :ivar group_external_id: External ID of group. This is an arbitrary ID that + an admin can attach to a group. + :ivar member_count: The number of members in the group. + """ + + __slots__ = [ + '_group_name_value', + '_group_name_present', + '_group_id_value', + '_group_id_present', + '_group_external_id_value', + '_group_external_id_present', + '_member_count_value', + '_member_count_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_id=None, + member_count=None, + group_external_id=None): + self._group_name_value = None + self._group_name_present = False + self._group_id_value = None + self._group_id_present = False + self._group_external_id_value = None + self._group_external_id_present = False + self._member_count_value = None + self._member_count_present = False + if group_name is not None: + self.group_name = group_name + if group_id is not None: + self.group_id = group_id + if group_external_id is not None: + self.group_external_id = group_external_id + if member_count is not None: + self.member_count = member_count + + @property + def group_name(self): + """ + :rtype: str + """ + if self._group_name_present: + return self._group_name_value + else: + raise AttributeError("missing required field 'group_name'") + + @group_name.setter + def group_name(self, val): + val = self._group_name_validator.validate(val) + self._group_name_value = val + self._group_name_present = True + + @group_name.deleter + def group_name(self): + self._group_name_value = None + self._group_name_present = False + + @property + def group_id(self): + """ + :rtype: str + """ + if self._group_id_present: + return self._group_id_value + else: + raise AttributeError("missing required field 'group_id'") + + @group_id.setter + def group_id(self, val): + val = self._group_id_validator.validate(val) + self._group_id_value = val + self._group_id_present = True + + @group_id.deleter + def group_id(self): + self._group_id_value = None + self._group_id_present = False + + @property + def group_external_id(self): + """ + External ID of group. This is an arbitrary ID that an admin can attach + to a group. + + :rtype: str + """ + if self._group_external_id_present: + return self._group_external_id_value + else: + return None + + @group_external_id.setter + def group_external_id(self, val): + if val is None: + del self.group_external_id + return + val = self._group_external_id_validator.validate(val) + self._group_external_id_value = val + self._group_external_id_present = True + + @group_external_id.deleter + def group_external_id(self): + self._group_external_id_value = None + self._group_external_id_present = False + + @property + def member_count(self): + """ + The number of members in the group. + + :rtype: long + """ + if self._member_count_present: + return self._member_count_value + else: + raise AttributeError("missing required field 'member_count'") + + @member_count.setter + def member_count(self, val): + val = self._member_count_validator.validate(val) + self._member_count_value = val + self._member_count_present = True + + @member_count.deleter + def member_count(self): + self._member_count_value = None + self._member_count_present = False + + def __repr__(self): + return 'GroupSummary(group_name={!r}, group_id={!r}, member_count={!r}, group_external_id={!r})'.format( + self._group_name_value, + self._group_id_value, + self._member_count_value, + self._group_external_id_value, + ) + +class GroupFullInfo(GroupSummary): + """ + Full description of a group. + + :ivar members: List of group members. + :ivar created: The group creation time as a UTC timestamp in milliseconds + since the Unix epoch. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_created_value', + '_created_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_id=None, + member_count=None, + members=None, + created=None, + group_external_id=None): + super(GroupFullInfo, self).__init__(group_name, + group_id, + member_count, + group_external_id) + self._members_value = None + self._members_present = False + self._created_value = None + self._created_present = False + if members is not None: + self.members = members + if created is not None: + self.created = created + + @property + def members(self): + """ + List of group members. + + :rtype: list of [GroupMemberInfo] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def created(self): + """ + The group creation time as a UTC timestamp in milliseconds since the + Unix epoch. + + :rtype: long + """ + if self._created_present: + return self._created_value + else: + raise AttributeError("missing required field 'created'") + + @created.setter + def created(self, val): + val = self._created_validator.validate(val) + self._created_value = val + self._created_present = True + + @created.deleter + def created(self): + self._created_value = None + self._created_present = False + + def __repr__(self): + return 'GroupFullInfo(group_name={!r}, group_id={!r}, member_count={!r}, members={!r}, created={!r}, group_external_id={!r})'.format( + self._group_name_value, + self._group_id_value, + self._member_count_value, + self._members_value, + self._created_value, + self._group_external_id_value, + ) + +class GroupMemberInfo(object): + """ + Profile of group member, and role in group. + + :ivar profile: Profile of group member. + :ivar access_type: The role that the user has in the group. + """ + + __slots__ = [ + '_profile_value', + '_profile_present', + '_access_type_value', + '_access_type_present', + ] + + _has_required_fields = True + + def __init__(self, + profile=None, + access_type=None): + self._profile_value = None + self._profile_present = False + self._access_type_value = None + self._access_type_present = False + if profile is not None: + self.profile = profile + if access_type is not None: + self.access_type = access_type + + @property + def profile(self): + """ + Profile of group member. + + :rtype: MemberProfile + """ + if self._profile_present: + return self._profile_value + else: + raise AttributeError("missing required field 'profile'") + + @profile.setter + def profile(self, val): + self._profile_validator.validate_type_only(val) + self._profile_value = val + self._profile_present = True + + @profile.deleter + def profile(self): + self._profile_value = None + self._profile_present = False + + @property + def access_type(self): + """ + The role that the user has in the group. + + :rtype: GroupAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + def __repr__(self): + return 'GroupMemberInfo(profile={!r}, access_type={!r})'.format( + self._profile_value, + self._access_type_value, + ) + +class GroupMemberSelector(object): + """ + Argument for selecting a group and a single user. + + :ivar group: Specify a group. + :ivar user: Identity of a user that is a member of ``group``. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + user=None): + self._group_value = None + self._group_present = False + self._user_value = None + self._user_present = False + if group is not None: + self.group = group + if user is not None: + self.user = user + + @property + def group(self): + """ + Specify a group. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def user(self): + """ + Identity of a user that is a member of ``group``. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def __repr__(self): + return 'GroupMemberSelector(group={!r}, user={!r})'.format( + self._group_value, + self._user_value, + ) + +class GroupMemberSelectorError(GroupSelectorError): + """ + Error that can be raised when :class:`GroupMemberSelector` is used, and the + user is required to be a member of the specified group. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_in_group: The specified user is not a member of this group. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + member_not_in_group = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_member_not_in_group(self): + """ + Check if the union tag is ``member_not_in_group``. + + :rtype: bool + """ + return self._tag == 'member_not_in_group' + + def __repr__(self): + return 'GroupMemberSelectorError(%r, %r)' % (self._tag, self._value) + +class GroupMembersAddArg(object): + """ + :ivar group: Group to which users will be added. + :ivar members: List of users to be added to the group. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_members_value', + '_members_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + members=None): + self._group_value = None + self._group_present = False + self._members_value = None + self._members_present = False + if group is not None: + self.group = group + if members is not None: + self.members = members + + @property + def group(self): + """ + Group to which users will be added. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def members(self): + """ + List of users to be added to the group. + + :rtype: list of [MemberAccess] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + def __repr__(self): + return 'GroupMembersAddArg(group={!r}, members={!r})'.format( + self._group_value, + self._members_value, + ) + +class GroupMembersAddError(GroupSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar duplicate_user: You cannot add duplicate users. One or more of the + members you are trying to add is already a member of the group. + :ivar group_not_in_team: Group is not in this team. You cannot add members + to a group that is outside of your team. + :ivar list of [str] members_not_in_team: These members are not part of your + team. Currently, you cannot add members to a group if they are not part + of your team, though this may change in a subsequent version. To add new + members to your Dropbox Business team, use the :route:`members/add` + endpoint. + :ivar list of [str] users_not_found: These users were not found in Dropbox. + :ivar user_must_be_active_to_be_owner: A suspended user cannot be added to a + group as owner. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + duplicate_user = None + # Attribute is overwritten below the class definition + group_not_in_team = None + # Attribute is overwritten below the class definition + user_must_be_active_to_be_owner = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def members_not_in_team(cls, val): + """ + Create an instance of this class set to the ``members_not_in_team`` tag + with value ``val``. + + :param list of [str] val: + :rtype: GroupMembersAddError + """ + return cls('members_not_in_team', val) + + @classmethod + def users_not_found(cls, val): + """ + Create an instance of this class set to the ``users_not_found`` tag with + value ``val``. + + :param list of [str] val: + :rtype: GroupMembersAddError + """ + return cls('users_not_found', val) + + def is_duplicate_user(self): + """ + Check if the union tag is ``duplicate_user``. + + :rtype: bool + """ + return self._tag == 'duplicate_user' + + def is_group_not_in_team(self): + """ + Check if the union tag is ``group_not_in_team``. + + :rtype: bool + """ + return self._tag == 'group_not_in_team' + + def is_members_not_in_team(self): + """ + Check if the union tag is ``members_not_in_team``. + + :rtype: bool + """ + return self._tag == 'members_not_in_team' + + def is_users_not_found(self): + """ + Check if the union tag is ``users_not_found``. + + :rtype: bool + """ + return self._tag == 'users_not_found' + + def is_user_must_be_active_to_be_owner(self): + """ + Check if the union tag is ``user_must_be_active_to_be_owner``. + + :rtype: bool + """ + return self._tag == 'user_must_be_active_to_be_owner' + + def get_members_not_in_team(self): + """ + These members are not part of your team. Currently, you cannot add + members to a group if they are not part of your team, though this may + change in a subsequent version. To add new members to your Dropbox + Business team, use the members/add endpoint. + + Only call this if :meth:`is_members_not_in_team` is true. + + :rtype: list of [str] + """ + if not self.is_members_not_in_team(): + raise AttributeError("tag 'members_not_in_team' not set") + return self._value + + def get_users_not_found(self): + """ + These users were not found in Dropbox. + + Only call this if :meth:`is_users_not_found` is true. + + :rtype: list of [str] + """ + if not self.is_users_not_found(): + raise AttributeError("tag 'users_not_found' not set") + return self._value + + def __repr__(self): + return 'GroupMembersAddError(%r, %r)' % (self._tag, self._value) + +class GroupMembersChangeResult(object): + """ + Result returned by groups/members/add and groups/members/remove. + + :ivar group_info: Lists the group members after the member change operation + has been performed. + :ivar async_job_id: An ID that can be used to obtain the status of + granting/revoking group-owned resources. + """ + + __slots__ = [ + '_group_info_value', + '_group_info_present', + '_async_job_id_value', + '_async_job_id_present', + ] + + _has_required_fields = True + + def __init__(self, + group_info=None, + async_job_id=None): + self._group_info_value = None + self._group_info_present = False + self._async_job_id_value = None + self._async_job_id_present = False + if group_info is not None: + self.group_info = group_info + if async_job_id is not None: + self.async_job_id = async_job_id + + @property + def group_info(self): + """ + Lists the group members after the member change operation has been + performed. + + :rtype: GroupFullInfo + """ + if self._group_info_present: + return self._group_info_value + else: + raise AttributeError("missing required field 'group_info'") + + @group_info.setter + def group_info(self, val): + self._group_info_validator.validate_type_only(val) + self._group_info_value = val + self._group_info_present = True + + @group_info.deleter + def group_info(self): + self._group_info_value = None + self._group_info_present = False + + @property + def async_job_id(self): + """ + An ID that can be used to obtain the status of granting/revoking + group-owned resources. + + :rtype: str + """ + if self._async_job_id_present: + return self._async_job_id_value + else: + raise AttributeError("missing required field 'async_job_id'") + + @async_job_id.setter + def async_job_id(self, val): + val = self._async_job_id_validator.validate(val) + self._async_job_id_value = val + self._async_job_id_present = True + + @async_job_id.deleter + def async_job_id(self): + self._async_job_id_value = None + self._async_job_id_present = False + + def __repr__(self): + return 'GroupMembersChangeResult(group_info={!r}, async_job_id={!r})'.format( + self._group_info_value, + self._async_job_id_value, + ) + +class GroupMembersRemoveArg(object): + + __slots__ = [ + '_group_value', + '_group_present', + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + users=None): + self._group_value = None + self._group_present = False + self._users_value = None + self._users_present = False + if group is not None: + self.group = group + if users is not None: + self.users = users + + @property + def group(self): + """ + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def users(self): + """ + :rtype: list of [UserSelectorArg] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def __repr__(self): + return 'GroupMembersRemoveArg(group={!r}, users={!r})'.format( + self._group_value, + self._users_value, + ) + +class GroupMembersSelectorError(GroupSelectorError): + """ + Error that can be raised when :class:`GroupMembersSelector` is used, and the + users are required to be members of the specified group. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_in_group: At least one of the specified users is not a + member of the group. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + member_not_in_group = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_member_not_in_group(self): + """ + Check if the union tag is ``member_not_in_group``. + + :rtype: bool + """ + return self._tag == 'member_not_in_group' + + def __repr__(self): + return 'GroupMembersSelectorError(%r, %r)' % (self._tag, self._value) + +class GroupMembersRemoveError(GroupMembersSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_not_in_team: Group is not in this team. You cannot remove + members from a group that is outside of your team. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + group_not_in_team = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_group_not_in_team(self): + """ + Check if the union tag is ``group_not_in_team``. + + :rtype: bool + """ + return self._tag == 'group_not_in_team' + + def __repr__(self): + return 'GroupMembersRemoveError(%r, %r)' % (self._tag, self._value) + +class GroupMembersSelector(object): + """ + Argument for selecting a group and a list of users. + + :ivar group: Specify a group. + :ivar users: A list of users that are members of ``group``. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + users=None): + self._group_value = None + self._group_present = False + self._users_value = None + self._users_present = False + if group is not None: + self.group = group + if users is not None: + self.users = users + + @property + def group(self): + """ + Specify a group. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def users(self): + """ + A list of users that are members of ``group``. + + :rtype: UsersSelectorArg + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + self._users_validator.validate_type_only(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def __repr__(self): + return 'GroupMembersSelector(group={!r}, users={!r})'.format( + self._group_value, + self._users_value, + ) + +class GroupMembersSetAccessTypeArg(GroupMemberSelector): + """ + :ivar access_type: New group access type the user will have. + """ + + __slots__ = [ + '_access_type_value', + '_access_type_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + user=None, + access_type=None): + super(GroupMembersSetAccessTypeArg, self).__init__(group, + user) + self._access_type_value = None + self._access_type_present = False + if access_type is not None: + self.access_type = access_type + + @property + def access_type(self): + """ + New group access type the user will have. + + :rtype: GroupAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + def __repr__(self): + return 'GroupMembersSetAccessTypeArg(group={!r}, user={!r}, access_type={!r})'.format( + self._group_value, + self._user_value, + self._access_type_value, + ) + +class GroupSelector(object): + """ + Argument for selecting a single group, either by group_id or by external + group ID. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str group_id: Group ID. + :ivar str group_external_id: External ID of the group. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def group_id(cls, val): + """ + Create an instance of this class set to the ``group_id`` tag with value + ``val``. + + :param str val: + :rtype: GroupSelector + """ + return cls('group_id', val) + + @classmethod + def group_external_id(cls, val): + """ + Create an instance of this class set to the ``group_external_id`` tag + with value ``val``. + + :param str val: + :rtype: GroupSelector + """ + return cls('group_external_id', val) + + def is_group_id(self): + """ + Check if the union tag is ``group_id``. + + :rtype: bool + """ + return self._tag == 'group_id' + + def is_group_external_id(self): + """ + Check if the union tag is ``group_external_id``. + + :rtype: bool + """ + return self._tag == 'group_external_id' + + def get_group_id(self): + """ + Group ID. + + Only call this if :meth:`is_group_id` is true. + + :rtype: str + """ + if not self.is_group_id(): + raise AttributeError("tag 'group_id' not set") + return self._value + + def get_group_external_id(self): + """ + External ID of the group. + + Only call this if :meth:`is_group_external_id` is true. + + :rtype: str + """ + if not self.is_group_external_id(): + raise AttributeError("tag 'group_external_id' not set") + return self._value + + def __repr__(self): + return 'GroupSelector(%r, %r)' % (self._tag, self._value) + +class GroupUpdateArgs(object): + """ + :ivar group: Specify a group. + :ivar new_group_name: Optional argument. Set group name to this if provided. + :ivar new_group_external_id: Optional argument. New group external ID. If + the argument is None, the group's external_id won't be updated. If the + argument is empty string, the group's external id will be cleared. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_new_group_name_value', + '_new_group_name_present', + '_new_group_external_id_value', + '_new_group_external_id_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + new_group_name=None, + new_group_external_id=None): + self._group_value = None + self._group_present = False + self._new_group_name_value = None + self._new_group_name_present = False + self._new_group_external_id_value = None + self._new_group_external_id_present = False + if group is not None: + self.group = group + if new_group_name is not None: + self.new_group_name = new_group_name + if new_group_external_id is not None: + self.new_group_external_id = new_group_external_id + + @property + def group(self): + """ + Specify a group. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def new_group_name(self): + """ + Optional argument. Set group name to this if provided. + + :rtype: str + """ + if self._new_group_name_present: + return self._new_group_name_value + else: + return None + + @new_group_name.setter + def new_group_name(self, val): + if val is None: + del self.new_group_name + return + val = self._new_group_name_validator.validate(val) + self._new_group_name_value = val + self._new_group_name_present = True + + @new_group_name.deleter + def new_group_name(self): + self._new_group_name_value = None + self._new_group_name_present = False + + @property + def new_group_external_id(self): + """ + Optional argument. New group external ID. If the argument is None, the + group's external_id won't be updated. If the argument is empty string, + the group's external id will be cleared. + + :rtype: str + """ + if self._new_group_external_id_present: + return self._new_group_external_id_value + else: + return None + + @new_group_external_id.setter + def new_group_external_id(self, val): + if val is None: + del self.new_group_external_id + return + val = self._new_group_external_id_validator.validate(val) + self._new_group_external_id_value = val + self._new_group_external_id_present = True + + @new_group_external_id.deleter + def new_group_external_id(self): + self._new_group_external_id_value = None + self._new_group_external_id_present = False + + def __repr__(self): + return 'GroupUpdateArgs(group={!r}, new_group_name={!r}, new_group_external_id={!r})'.format( + self._group_value, + self._new_group_name_value, + self._new_group_external_id_value, + ) + +class GroupUpdateError(GroupSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar external_id_already_in_use: The new external ID is already being used + by another group. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + external_id_already_in_use = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_external_id_already_in_use(self): + """ + Check if the union tag is ``external_id_already_in_use``. + + :rtype: bool + """ + return self._tag == 'external_id_already_in_use' + + def __repr__(self): + return 'GroupUpdateError(%r, %r)' % (self._tag, self._value) + +class GroupsGetInfoError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_not_on_team: The group is not on your team. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_not_on_team = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_group_not_on_team(self): + """ + Check if the union tag is ``group_not_on_team``. + + :rtype: bool + """ + return self._tag == 'group_not_on_team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'GroupsGetInfoError(%r, %r)' % (self._tag, self._value) + +class GroupsGetInfoItem(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str id_not_found: An ID that was provided as a parameter to + :route:`groups/get_info`, and did not match a corresponding group. The + ID can be a group ID, or an external ID, depending on how the method was + called. + :ivar GroupFullInfo group_info: Info about a group. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def id_not_found(cls, val): + """ + Create an instance of this class set to the ``id_not_found`` tag with + value ``val``. + + :param str val: + :rtype: GroupsGetInfoItem + """ + return cls('id_not_found', val) + + @classmethod + def group_info(cls, val): + """ + Create an instance of this class set to the ``group_info`` tag with + value ``val``. + + :param GroupFullInfo val: + :rtype: GroupsGetInfoItem + """ + return cls('group_info', val) + + def is_id_not_found(self): + """ + Check if the union tag is ``id_not_found``. + + :rtype: bool + """ + return self._tag == 'id_not_found' + + def is_group_info(self): + """ + Check if the union tag is ``group_info``. + + :rtype: bool + """ + return self._tag == 'group_info' + + def get_id_not_found(self): + """ + An ID that was provided as a parameter to groups/get_info, and did not + match a corresponding group. The ID can be a group ID, or an external + ID, depending on how the method was called. + + Only call this if :meth:`is_id_not_found` is true. + + :rtype: str + """ + if not self.is_id_not_found(): + raise AttributeError("tag 'id_not_found' not set") + return self._value + + def get_group_info(self): + """ + Info about a group. + + Only call this if :meth:`is_group_info` is true. + + :rtype: GroupFullInfo + """ + if not self.is_group_info(): + raise AttributeError("tag 'group_info' not set") + return self._value + + def __repr__(self): + return 'GroupsGetInfoItem(%r, %r)' % (self._tag, self._value) + +class GroupsListArg(object): + """ + :ivar limit: Number of results to return per call. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None): + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + Number of results to return per call. + + :rtype: long + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def __repr__(self): + return 'GroupsListArg(limit={!r})'.format( + self._limit_value, + ) + +class GroupsListContinueArg(object): + """ + :ivar cursor: Indicates from what point to get the next set of groups. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of groups. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'GroupsListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +class GroupsListContinueError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'GroupsListContinueError(%r, %r)' % (self._tag, self._value) + +class GroupsListResult(object): + """ + :ivar cursor: Pass the cursor into members/list/continue to obtain the + additional members. + :ivar has_more: Is true if there are additional team members that have not + been returned yet. An additional call to members/list/continue can + retrieve them. + """ + + __slots__ = [ + '_groups_value', + '_groups_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + groups=None, + cursor=None, + has_more=None): + self._groups_value = None + self._groups_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if groups is not None: + self.groups = groups + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def groups(self): + """ + :rtype: list of [GroupSummary] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + @property + def cursor(self): + """ + Pass the cursor into members/list/continue to obtain the additional + members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional team members that have not been returned + yet. An additional call to members/list/continue can retrieve them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def __repr__(self): + return 'GroupsListResult(groups={!r}, cursor={!r}, has_more={!r})'.format( + self._groups_value, + self._cursor_value, + self._has_more_value, + ) + +class GroupsPollError(async.PollError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar access_denied: You are not allowed to poll this job. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + access_denied = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_access_denied(self): + """ + Check if the union tag is ``access_denied``. + + :rtype: bool + """ + return self._tag == 'access_denied' + + def __repr__(self): + return 'GroupsPollError(%r, %r)' % (self._tag, self._value) + +class GroupsSelector(object): + """ + Argument for selecting a list of groups, either by group_ids, or external + group IDs. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [str] group_ids: List of group IDs. + :ivar list of [str] group_external_ids: List of external IDs of groups. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def group_ids(cls, val): + """ + Create an instance of this class set to the ``group_ids`` tag with value + ``val``. + + :param list of [str] val: + :rtype: GroupsSelector + """ + return cls('group_ids', val) + + @classmethod + def group_external_ids(cls, val): + """ + Create an instance of this class set to the ``group_external_ids`` tag + with value ``val``. + + :param list of [str] val: + :rtype: GroupsSelector + """ + return cls('group_external_ids', val) + + def is_group_ids(self): + """ + Check if the union tag is ``group_ids``. + + :rtype: bool + """ + return self._tag == 'group_ids' + + def is_group_external_ids(self): + """ + Check if the union tag is ``group_external_ids``. + + :rtype: bool + """ + return self._tag == 'group_external_ids' + + def get_group_ids(self): + """ + List of group IDs. + + Only call this if :meth:`is_group_ids` is true. + + :rtype: list of [str] + """ + if not self.is_group_ids(): + raise AttributeError("tag 'group_ids' not set") + return self._value + + def get_group_external_ids(self): + """ + List of external IDs of groups. + + Only call this if :meth:`is_group_external_ids` is true. + + :rtype: list of [str] + """ + if not self.is_group_external_ids(): + raise AttributeError("tag 'group_external_ids' not set") + return self._value + + def __repr__(self): + return 'GroupsSelector(%r, %r)' % (self._tag, self._value) + +class ListMemberAppsArg(object): + """ + :ivar team_member_id: The team member id + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None): + self._team_member_id_value = None + self._team_member_id_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def team_member_id(self): + """ + The team member id + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def __repr__(self): + return 'ListMemberAppsArg(team_member_id={!r})'.format( + self._team_member_id_value, + ) + +class ListMemberAppsError(object): + """ + Error returned by linked_apps/list_member_linked_apps. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_found: Member not found. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'ListMemberAppsError(%r, %r)' % (self._tag, self._value) + +class ListMemberAppsResult(object): + """ + :ivar linked_api_apps: List of third party applications linked by this team + member + """ + + __slots__ = [ + '_linked_api_apps_value', + '_linked_api_apps_present', + ] + + _has_required_fields = True + + def __init__(self, + linked_api_apps=None): + self._linked_api_apps_value = None + self._linked_api_apps_present = False + if linked_api_apps is not None: + self.linked_api_apps = linked_api_apps + + @property + def linked_api_apps(self): + """ + List of third party applications linked by this team member + + :rtype: list of [ApiApp] + """ + if self._linked_api_apps_present: + return self._linked_api_apps_value + else: + raise AttributeError("missing required field 'linked_api_apps'") + + @linked_api_apps.setter + def linked_api_apps(self, val): + val = self._linked_api_apps_validator.validate(val) + self._linked_api_apps_value = val + self._linked_api_apps_present = True + + @linked_api_apps.deleter + def linked_api_apps(self): + self._linked_api_apps_value = None + self._linked_api_apps_present = False + + def __repr__(self): + return 'ListMemberAppsResult(linked_api_apps={!r})'.format( + self._linked_api_apps_value, + ) + +class ListMemberDevicesArg(object): + """ + :ivar team_member_id: The team's member id + :ivar include_web_sessions: Whether to list web sessions of the team's + member + :ivar include_desktop_clients: Whether to list linked desktop devices of the + team's member + :ivar include_mobile_clients: Whether to list linked mobile devices of the + team's member + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_include_web_sessions_value', + '_include_web_sessions_present', + '_include_desktop_clients_value', + '_include_desktop_clients_present', + '_include_mobile_clients_value', + '_include_mobile_clients_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + include_web_sessions=None, + include_desktop_clients=None, + include_mobile_clients=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._include_web_sessions_value = None + self._include_web_sessions_present = False + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if include_web_sessions is not None: + self.include_web_sessions = include_web_sessions + if include_desktop_clients is not None: + self.include_desktop_clients = include_desktop_clients + if include_mobile_clients is not None: + self.include_mobile_clients = include_mobile_clients + + @property + def team_member_id(self): + """ + The team's member id + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def include_web_sessions(self): + """ + Whether to list web sessions of the team's member + + :rtype: bool + """ + if self._include_web_sessions_present: + return self._include_web_sessions_value + else: + return True + + @include_web_sessions.setter + def include_web_sessions(self, val): + val = self._include_web_sessions_validator.validate(val) + self._include_web_sessions_value = val + self._include_web_sessions_present = True + + @include_web_sessions.deleter + def include_web_sessions(self): + self._include_web_sessions_value = None + self._include_web_sessions_present = False + + @property + def include_desktop_clients(self): + """ + Whether to list linked desktop devices of the team's member + + :rtype: bool + """ + if self._include_desktop_clients_present: + return self._include_desktop_clients_value + else: + return True + + @include_desktop_clients.setter + def include_desktop_clients(self, val): + val = self._include_desktop_clients_validator.validate(val) + self._include_desktop_clients_value = val + self._include_desktop_clients_present = True + + @include_desktop_clients.deleter + def include_desktop_clients(self): + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + + @property + def include_mobile_clients(self): + """ + Whether to list linked mobile devices of the team's member + + :rtype: bool + """ + if self._include_mobile_clients_present: + return self._include_mobile_clients_value + else: + return True + + @include_mobile_clients.setter + def include_mobile_clients(self, val): + val = self._include_mobile_clients_validator.validate(val) + self._include_mobile_clients_value = val + self._include_mobile_clients_present = True + + @include_mobile_clients.deleter + def include_mobile_clients(self): + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + + def __repr__(self): + return 'ListMemberDevicesArg(team_member_id={!r}, include_web_sessions={!r}, include_desktop_clients={!r}, include_mobile_clients={!r})'.format( + self._team_member_id_value, + self._include_web_sessions_value, + self._include_desktop_clients_value, + self._include_mobile_clients_value, + ) + +class ListMemberDevicesError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_found: Member not found. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'ListMemberDevicesError(%r, %r)' % (self._tag, self._value) + +class ListMemberDevicesResult(object): + """ + :ivar active_web_sessions: List of web sessions made by this team member + :ivar desktop_client_sessions: List of desktop clients used by this team + member + :ivar mobile_client_sessions: List of mobile client used by this team member + """ + + __slots__ = [ + '_active_web_sessions_value', + '_active_web_sessions_present', + '_desktop_client_sessions_value', + '_desktop_client_sessions_present', + '_mobile_client_sessions_value', + '_mobile_client_sessions_present', + ] + + _has_required_fields = False + + def __init__(self, + active_web_sessions=None, + desktop_client_sessions=None, + mobile_client_sessions=None): + self._active_web_sessions_value = None + self._active_web_sessions_present = False + self._desktop_client_sessions_value = None + self._desktop_client_sessions_present = False + self._mobile_client_sessions_value = None + self._mobile_client_sessions_present = False + if active_web_sessions is not None: + self.active_web_sessions = active_web_sessions + if desktop_client_sessions is not None: + self.desktop_client_sessions = desktop_client_sessions + if mobile_client_sessions is not None: + self.mobile_client_sessions = mobile_client_sessions + + @property + def active_web_sessions(self): + """ + List of web sessions made by this team member + + :rtype: list of [ActiveWebSession] + """ + if self._active_web_sessions_present: + return self._active_web_sessions_value + else: + return None + + @active_web_sessions.setter + def active_web_sessions(self, val): + if val is None: + del self.active_web_sessions + return + val = self._active_web_sessions_validator.validate(val) + self._active_web_sessions_value = val + self._active_web_sessions_present = True + + @active_web_sessions.deleter + def active_web_sessions(self): + self._active_web_sessions_value = None + self._active_web_sessions_present = False + + @property + def desktop_client_sessions(self): + """ + List of desktop clients used by this team member + + :rtype: list of [DesktopClientSession] + """ + if self._desktop_client_sessions_present: + return self._desktop_client_sessions_value + else: + return None + + @desktop_client_sessions.setter + def desktop_client_sessions(self, val): + if val is None: + del self.desktop_client_sessions + return + val = self._desktop_client_sessions_validator.validate(val) + self._desktop_client_sessions_value = val + self._desktop_client_sessions_present = True + + @desktop_client_sessions.deleter + def desktop_client_sessions(self): + self._desktop_client_sessions_value = None + self._desktop_client_sessions_present = False + + @property + def mobile_client_sessions(self): + """ + List of mobile client used by this team member + + :rtype: list of [MobileClientSession] + """ + if self._mobile_client_sessions_present: + return self._mobile_client_sessions_value + else: + return None + + @mobile_client_sessions.setter + def mobile_client_sessions(self, val): + if val is None: + del self.mobile_client_sessions + return + val = self._mobile_client_sessions_validator.validate(val) + self._mobile_client_sessions_value = val + self._mobile_client_sessions_present = True + + @mobile_client_sessions.deleter + def mobile_client_sessions(self): + self._mobile_client_sessions_value = None + self._mobile_client_sessions_present = False + + def __repr__(self): + return 'ListMemberDevicesResult(active_web_sessions={!r}, desktop_client_sessions={!r}, mobile_client_sessions={!r})'.format( + self._active_web_sessions_value, + self._desktop_client_sessions_value, + self._mobile_client_sessions_value, + ) + +class ListTeamAppsArg(object): + """ + Arguments for linked_apps/list_team_linked_apps. + + :ivar cursor: At the first call to the linked_apps/list_team_linked_apps the + cursor shouldn't be passed. Then, if the result of the call includes a + cursor, the following requests should include the received cursors in + order to receive the next sub list of the team applications + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = False + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + At the first call to the linked_apps/list_team_linked_apps the cursor + shouldn't be passed. Then, if the result of the call includes a cursor, + the following requests should include the received cursors in order to + receive the next sub list of the team applications + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'ListTeamAppsArg(cursor={!r})'.format( + self._cursor_value, + ) + +class ListTeamAppsError(object): + """ + Error returned by linked_apps/list_team_linked_apps + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + linked_apps/list_team_linked_apps again with an empty cursor to obtain a + new cursor. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'ListTeamAppsError(%r, %r)' % (self._tag, self._value) + +class ListTeamAppsResult(object): + """ + Information returned by linked_apps/list_team_linked_apps. + + :ivar apps: The linked applications of each member of the team + :ivar has_more: If true, then there are more apps available. Pass the cursor + to linked_apps/list_team_linked_apps to retrieve the rest. + :ivar cursor: Pass the cursor into linked_apps/list_team_linked_apps to + receive the next sub list of team's applications. + """ + + __slots__ = [ + '_apps_value', + '_apps_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + apps=None, + has_more=None, + cursor=None): + self._apps_value = None + self._apps_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if apps is not None: + self.apps = apps + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def apps(self): + """ + The linked applications of each member of the team + + :rtype: list of [MemberLinkedApps] + """ + if self._apps_present: + return self._apps_value + else: + raise AttributeError("missing required field 'apps'") + + @apps.setter + def apps(self, val): + val = self._apps_validator.validate(val) + self._apps_value = val + self._apps_present = True + + @apps.deleter + def apps(self): + self._apps_value = None + self._apps_present = False + + @property + def has_more(self): + """ + If true, then there are more apps available. Pass the cursor to + linked_apps/list_team_linked_apps to retrieve the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into linked_apps/list_team_linked_apps to receive the + next sub list of team's applications. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'ListTeamAppsResult(apps={!r}, has_more={!r}, cursor={!r})'.format( + self._apps_value, + self._has_more_value, + self._cursor_value, + ) + +class ListTeamDevicesArg(object): + """ + :ivar cursor: At the first call to the devices/list_team_devices the cursor + shouldn't be passed. Then, if the result of the call includes a cursor, + the following requests should include the received cursors in order to + receive the next sub list of team devices + :ivar include_web_sessions: Whether to list web sessions of the team members + :ivar include_desktop_clients: Whether to list desktop clients of the team + members + :ivar include_mobile_clients: Whether to list mobile clients of the team + members + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_include_web_sessions_value', + '_include_web_sessions_present', + '_include_desktop_clients_value', + '_include_desktop_clients_present', + '_include_mobile_clients_value', + '_include_mobile_clients_present', + ] + + _has_required_fields = False + + def __init__(self, + cursor=None, + include_web_sessions=None, + include_desktop_clients=None, + include_mobile_clients=None): + self._cursor_value = None + self._cursor_present = False + self._include_web_sessions_value = None + self._include_web_sessions_present = False + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + if cursor is not None: + self.cursor = cursor + if include_web_sessions is not None: + self.include_web_sessions = include_web_sessions + if include_desktop_clients is not None: + self.include_desktop_clients = include_desktop_clients + if include_mobile_clients is not None: + self.include_mobile_clients = include_mobile_clients + + @property + def cursor(self): + """ + At the first call to the devices/list_team_devices the cursor shouldn't + be passed. Then, if the result of the call includes a cursor, the + following requests should include the received cursors in order to + receive the next sub list of team devices + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def include_web_sessions(self): + """ + Whether to list web sessions of the team members + + :rtype: bool + """ + if self._include_web_sessions_present: + return self._include_web_sessions_value + else: + return True + + @include_web_sessions.setter + def include_web_sessions(self, val): + val = self._include_web_sessions_validator.validate(val) + self._include_web_sessions_value = val + self._include_web_sessions_present = True + + @include_web_sessions.deleter + def include_web_sessions(self): + self._include_web_sessions_value = None + self._include_web_sessions_present = False + + @property + def include_desktop_clients(self): + """ + Whether to list desktop clients of the team members + + :rtype: bool + """ + if self._include_desktop_clients_present: + return self._include_desktop_clients_value + else: + return True + + @include_desktop_clients.setter + def include_desktop_clients(self, val): + val = self._include_desktop_clients_validator.validate(val) + self._include_desktop_clients_value = val + self._include_desktop_clients_present = True + + @include_desktop_clients.deleter + def include_desktop_clients(self): + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + + @property + def include_mobile_clients(self): + """ + Whether to list mobile clients of the team members + + :rtype: bool + """ + if self._include_mobile_clients_present: + return self._include_mobile_clients_value + else: + return True + + @include_mobile_clients.setter + def include_mobile_clients(self, val): + val = self._include_mobile_clients_validator.validate(val) + self._include_mobile_clients_value = val + self._include_mobile_clients_present = True + + @include_mobile_clients.deleter + def include_mobile_clients(self): + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + + def __repr__(self): + return 'ListTeamDevicesArg(cursor={!r}, include_web_sessions={!r}, include_desktop_clients={!r}, include_mobile_clients={!r})'.format( + self._cursor_value, + self._include_web_sessions_value, + self._include_desktop_clients_value, + self._include_mobile_clients_value, + ) + +class ListTeamDevicesError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + devices/list_team_devices again with an empty cursor to obtain a new + cursor. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'ListTeamDevicesError(%r, %r)' % (self._tag, self._value) + +class ListTeamDevicesResult(object): + """ + :ivar devices: The devices of each member of the team + :ivar has_more: If true, then there are more devices available. Pass the + cursor to devices/list_team_devices to retrieve the rest. + :ivar cursor: Pass the cursor into devices/list_team_devices to receive the + next sub list of team's devices. + """ + + __slots__ = [ + '_devices_value', + '_devices_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + devices=None, + has_more=None, + cursor=None): + self._devices_value = None + self._devices_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if devices is not None: + self.devices = devices + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def devices(self): + """ + The devices of each member of the team + + :rtype: list of [MemberDevices] + """ + if self._devices_present: + return self._devices_value + else: + raise AttributeError("missing required field 'devices'") + + @devices.setter + def devices(self, val): + val = self._devices_validator.validate(val) + self._devices_value = val + self._devices_present = True + + @devices.deleter + def devices(self): + self._devices_value = None + self._devices_present = False + + @property + def has_more(self): + """ + If true, then there are more devices available. Pass the cursor to + devices/list_team_devices to retrieve the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into devices/list_team_devices to receive the next sub + list of team's devices. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'ListTeamDevicesResult(devices={!r}, has_more={!r}, cursor={!r})'.format( + self._devices_value, + self._has_more_value, + self._cursor_value, + ) + +class MemberAccess(object): + """ + Specify access type a member should have when joined to a group. + + :ivar user: Identity of a user. + :ivar access_type: Access type. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_access_type_value', + '_access_type_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + access_type=None): + self._user_value = None + self._user_present = False + self._access_type_value = None + self._access_type_present = False + if user is not None: + self.user = user + if access_type is not None: + self.access_type = access_type + + @property + def user(self): + """ + Identity of a user. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def access_type(self): + """ + Access type. + + :rtype: GroupAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + def __repr__(self): + return 'MemberAccess(user={!r}, access_type={!r})'.format( + self._user_value, + self._access_type_value, + ) + +class MemberAddArg(object): + """ + :ivar member_given_name: Member's first name. + :ivar member_surname: Member's last name. + :ivar member_external_id: External ID for member. + :ivar send_welcome_email: Whether to send a welcome email to the member. If + send_welcome_email is false, no email invitation will be sent to the + user. This may be useful for apps using single sign-on (SSO) flows for + onboarding that want to handle announcements themselves. + """ + + __slots__ = [ + '_member_email_value', + '_member_email_present', + '_member_given_name_value', + '_member_given_name_present', + '_member_surname_value', + '_member_surname_present', + '_member_external_id_value', + '_member_external_id_present', + '_send_welcome_email_value', + '_send_welcome_email_present', + '_role_value', + '_role_present', + ] + + _has_required_fields = True + + def __init__(self, + member_email=None, + member_given_name=None, + member_surname=None, + member_external_id=None, + send_welcome_email=None, + role=None): + self._member_email_value = None + self._member_email_present = False + self._member_given_name_value = None + self._member_given_name_present = False + self._member_surname_value = None + self._member_surname_present = False + self._member_external_id_value = None + self._member_external_id_present = False + self._send_welcome_email_value = None + self._send_welcome_email_present = False + self._role_value = None + self._role_present = False + if member_email is not None: + self.member_email = member_email + if member_given_name is not None: + self.member_given_name = member_given_name + if member_surname is not None: + self.member_surname = member_surname + if member_external_id is not None: + self.member_external_id = member_external_id + if send_welcome_email is not None: + self.send_welcome_email = send_welcome_email + if role is not None: + self.role = role + + @property + def member_email(self): + """ + :rtype: str + """ + if self._member_email_present: + return self._member_email_value + else: + raise AttributeError("missing required field 'member_email'") + + @member_email.setter + def member_email(self, val): + val = self._member_email_validator.validate(val) + self._member_email_value = val + self._member_email_present = True + + @member_email.deleter + def member_email(self): + self._member_email_value = None + self._member_email_present = False + + @property + def member_given_name(self): + """ + Member's first name. + + :rtype: str + """ + if self._member_given_name_present: + return self._member_given_name_value + else: + raise AttributeError("missing required field 'member_given_name'") + + @member_given_name.setter + def member_given_name(self, val): + val = self._member_given_name_validator.validate(val) + self._member_given_name_value = val + self._member_given_name_present = True + + @member_given_name.deleter + def member_given_name(self): + self._member_given_name_value = None + self._member_given_name_present = False + + @property + def member_surname(self): + """ + Member's last name. + + :rtype: str + """ + if self._member_surname_present: + return self._member_surname_value + else: + raise AttributeError("missing required field 'member_surname'") + + @member_surname.setter + def member_surname(self, val): + val = self._member_surname_validator.validate(val) + self._member_surname_value = val + self._member_surname_present = True + + @member_surname.deleter + def member_surname(self): + self._member_surname_value = None + self._member_surname_present = False + + @property + def member_external_id(self): + """ + External ID for member. + + :rtype: str + """ + if self._member_external_id_present: + return self._member_external_id_value + else: + return None + + @member_external_id.setter + def member_external_id(self, val): + if val is None: + del self.member_external_id + return + val = self._member_external_id_validator.validate(val) + self._member_external_id_value = val + self._member_external_id_present = True + + @member_external_id.deleter + def member_external_id(self): + self._member_external_id_value = None + self._member_external_id_present = False + + @property + def send_welcome_email(self): + """ + Whether to send a welcome email to the member. If send_welcome_email is + false, no email invitation will be sent to the user. This may be useful + for apps using single sign-on (SSO) flows for onboarding that want to + handle announcements themselves. + + :rtype: bool + """ + if self._send_welcome_email_present: + return self._send_welcome_email_value + else: + return True + + @send_welcome_email.setter + def send_welcome_email(self, val): + val = self._send_welcome_email_validator.validate(val) + self._send_welcome_email_value = val + self._send_welcome_email_present = True + + @send_welcome_email.deleter + def send_welcome_email(self): + self._send_welcome_email_value = None + self._send_welcome_email_present = False + + @property + def role(self): + """ + :rtype: AdminTier + """ + if self._role_present: + return self._role_value + else: + return AdminTier.member_only + + @role.setter + def role(self, val): + self._role_validator.validate_type_only(val) + self._role_value = val + self._role_present = True + + @role.deleter + def role(self): + self._role_value = None + self._role_present = False + + def __repr__(self): + return 'MemberAddArg(member_email={!r}, member_given_name={!r}, member_surname={!r}, member_external_id={!r}, send_welcome_email={!r}, role={!r})'.format( + self._member_email_value, + self._member_given_name_value, + self._member_surname_value, + self._member_external_id_value, + self._send_welcome_email_value, + self._role_value, + ) + +class MemberAddResult(object): + """ + Describes the result of attempting to add a single user to the team. + 'success' is the only value indicating that a user was indeed added to the + team - the other values explain the type of failure that occurred, and + include the email of the user for which the operation has failed. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar TeamMemberInfo success: Describes a user that was successfully added + to the team. + :ivar str team_license_limit: Team is already full. The organization has no + available licenses. + :ivar str free_team_member_limit_reached: Team is already full. The free + team member limit has been reached. + :ivar str user_already_on_team: User is already on this team. The provided + email address is associated with a user who is already a member of or + invited to the team. + :ivar str user_on_another_team: User is already on another team. The + provided email address is associated with a user that is already a + member or invited to another team. + :ivar str user_already_paired: User is already paired. + :ivar str user_migration_failed: User migration has failed. + :ivar str duplicate_external_member_id: A user with the given external + member ID already exists on the team. + :ivar str user_creation_failed: User creation has failed. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param TeamMemberInfo val: + :rtype: MemberAddResult + """ + return cls('success', val) + + @classmethod + def team_license_limit(cls, val): + """ + Create an instance of this class set to the ``team_license_limit`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('team_license_limit', val) + + @classmethod + def free_team_member_limit_reached(cls, val): + """ + Create an instance of this class set to the + ``free_team_member_limit_reached`` tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('free_team_member_limit_reached', val) + + @classmethod + def user_already_on_team(cls, val): + """ + Create an instance of this class set to the ``user_already_on_team`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_already_on_team', val) + + @classmethod + def user_on_another_team(cls, val): + """ + Create an instance of this class set to the ``user_on_another_team`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_on_another_team', val) + + @classmethod + def user_already_paired(cls, val): + """ + Create an instance of this class set to the ``user_already_paired`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_already_paired', val) + + @classmethod + def user_migration_failed(cls, val): + """ + Create an instance of this class set to the ``user_migration_failed`` + tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_migration_failed', val) + + @classmethod + def duplicate_external_member_id(cls, val): + """ + Create an instance of this class set to the + ``duplicate_external_member_id`` tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('duplicate_external_member_id', val) + + @classmethod + def user_creation_failed(cls, val): + """ + Create an instance of this class set to the ``user_creation_failed`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_creation_failed', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_team_license_limit(self): + """ + Check if the union tag is ``team_license_limit``. + + :rtype: bool + """ + return self._tag == 'team_license_limit' + + def is_free_team_member_limit_reached(self): + """ + Check if the union tag is ``free_team_member_limit_reached``. + + :rtype: bool + """ + return self._tag == 'free_team_member_limit_reached' + + def is_user_already_on_team(self): + """ + Check if the union tag is ``user_already_on_team``. + + :rtype: bool + """ + return self._tag == 'user_already_on_team' + + def is_user_on_another_team(self): + """ + Check if the union tag is ``user_on_another_team``. + + :rtype: bool + """ + return self._tag == 'user_on_another_team' + + def is_user_already_paired(self): + """ + Check if the union tag is ``user_already_paired``. + + :rtype: bool + """ + return self._tag == 'user_already_paired' + + def is_user_migration_failed(self): + """ + Check if the union tag is ``user_migration_failed``. + + :rtype: bool + """ + return self._tag == 'user_migration_failed' + + def is_duplicate_external_member_id(self): + """ + Check if the union tag is ``duplicate_external_member_id``. + + :rtype: bool + """ + return self._tag == 'duplicate_external_member_id' + + def is_user_creation_failed(self): + """ + Check if the union tag is ``user_creation_failed``. + + :rtype: bool + """ + return self._tag == 'user_creation_failed' + + def get_success(self): + """ + Describes a user that was successfully added to the team. + + Only call this if :meth:`is_success` is true. + + :rtype: TeamMemberInfo + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_team_license_limit(self): + """ + Team is already full. The organization has no available licenses. + + Only call this if :meth:`is_team_license_limit` is true. + + :rtype: str + """ + if not self.is_team_license_limit(): + raise AttributeError("tag 'team_license_limit' not set") + return self._value + + def get_free_team_member_limit_reached(self): + """ + Team is already full. The free team member limit has been reached. + + Only call this if :meth:`is_free_team_member_limit_reached` is true. + + :rtype: str + """ + if not self.is_free_team_member_limit_reached(): + raise AttributeError("tag 'free_team_member_limit_reached' not set") + return self._value + + def get_user_already_on_team(self): + """ + User is already on this team. The provided email address is associated + with a user who is already a member of or invited to the team. + + Only call this if :meth:`is_user_already_on_team` is true. + + :rtype: str + """ + if not self.is_user_already_on_team(): + raise AttributeError("tag 'user_already_on_team' not set") + return self._value + + def get_user_on_another_team(self): + """ + User is already on another team. The provided email address is + associated with a user that is already a member or invited to another + team. + + Only call this if :meth:`is_user_on_another_team` is true. + + :rtype: str + """ + if not self.is_user_on_another_team(): + raise AttributeError("tag 'user_on_another_team' not set") + return self._value + + def get_user_already_paired(self): + """ + User is already paired. + + Only call this if :meth:`is_user_already_paired` is true. + + :rtype: str + """ + if not self.is_user_already_paired(): + raise AttributeError("tag 'user_already_paired' not set") + return self._value + + def get_user_migration_failed(self): + """ + User migration has failed. + + Only call this if :meth:`is_user_migration_failed` is true. + + :rtype: str + """ + if not self.is_user_migration_failed(): + raise AttributeError("tag 'user_migration_failed' not set") + return self._value + + def get_duplicate_external_member_id(self): + """ + A user with the given external member ID already exists on the team. + + Only call this if :meth:`is_duplicate_external_member_id` is true. + + :rtype: str + """ + if not self.is_duplicate_external_member_id(): + raise AttributeError("tag 'duplicate_external_member_id' not set") + return self._value + + def get_user_creation_failed(self): + """ + User creation has failed. + + Only call this if :meth:`is_user_creation_failed` is true. + + :rtype: str + """ + if not self.is_user_creation_failed(): + raise AttributeError("tag 'user_creation_failed' not set") + return self._value + + def __repr__(self): + return 'MemberAddResult(%r, %r)' % (self._tag, self._value) + +class MemberDevices(object): + """ + Information on devices of a team's member. + + :ivar team_member_id: The member unique Id + :ivar web_sessions: List of web sessions made by this team member + :ivar desktop_clients: List of desktop clients by this team member + :ivar mobile_clients: List of mobile clients by this team member + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_web_sessions_value', + '_web_sessions_present', + '_desktop_clients_value', + '_desktop_clients_present', + '_mobile_clients_value', + '_mobile_clients_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + web_sessions=None, + desktop_clients=None, + mobile_clients=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._web_sessions_value = None + self._web_sessions_present = False + self._desktop_clients_value = None + self._desktop_clients_present = False + self._mobile_clients_value = None + self._mobile_clients_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if web_sessions is not None: + self.web_sessions = web_sessions + if desktop_clients is not None: + self.desktop_clients = desktop_clients + if mobile_clients is not None: + self.mobile_clients = mobile_clients + + @property + def team_member_id(self): + """ + The member unique Id + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def web_sessions(self): + """ + List of web sessions made by this team member + + :rtype: list of [ActiveWebSession] + """ + if self._web_sessions_present: + return self._web_sessions_value + else: + return None + + @web_sessions.setter + def web_sessions(self, val): + if val is None: + del self.web_sessions + return + val = self._web_sessions_validator.validate(val) + self._web_sessions_value = val + self._web_sessions_present = True + + @web_sessions.deleter + def web_sessions(self): + self._web_sessions_value = None + self._web_sessions_present = False + + @property + def desktop_clients(self): + """ + List of desktop clients by this team member + + :rtype: list of [DesktopClientSession] + """ + if self._desktop_clients_present: + return self._desktop_clients_value + else: + return None + + @desktop_clients.setter + def desktop_clients(self, val): + if val is None: + del self.desktop_clients + return + val = self._desktop_clients_validator.validate(val) + self._desktop_clients_value = val + self._desktop_clients_present = True + + @desktop_clients.deleter + def desktop_clients(self): + self._desktop_clients_value = None + self._desktop_clients_present = False + + @property + def mobile_clients(self): + """ + List of mobile clients by this team member + + :rtype: list of [MobileClientSession] + """ + if self._mobile_clients_present: + return self._mobile_clients_value + else: + return None + + @mobile_clients.setter + def mobile_clients(self, val): + if val is None: + del self.mobile_clients + return + val = self._mobile_clients_validator.validate(val) + self._mobile_clients_value = val + self._mobile_clients_present = True + + @mobile_clients.deleter + def mobile_clients(self): + self._mobile_clients_value = None + self._mobile_clients_present = False + + def __repr__(self): + return 'MemberDevices(team_member_id={!r}, web_sessions={!r}, desktop_clients={!r}, mobile_clients={!r})'.format( + self._team_member_id_value, + self._web_sessions_value, + self._desktop_clients_value, + self._mobile_clients_value, + ) + +class MemberLinkedApps(object): + """ + Information on linked applications of a team member. + + :ivar team_member_id: The member unique Id + :ivar linked_api_apps: List of third party applications linked by this team + member + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_linked_api_apps_value', + '_linked_api_apps_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + linked_api_apps=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._linked_api_apps_value = None + self._linked_api_apps_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if linked_api_apps is not None: + self.linked_api_apps = linked_api_apps + + @property + def team_member_id(self): + """ + The member unique Id + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def linked_api_apps(self): + """ + List of third party applications linked by this team member + + :rtype: list of [ApiApp] + """ + if self._linked_api_apps_present: + return self._linked_api_apps_value + else: + raise AttributeError("missing required field 'linked_api_apps'") + + @linked_api_apps.setter + def linked_api_apps(self, val): + val = self._linked_api_apps_validator.validate(val) + self._linked_api_apps_value = val + self._linked_api_apps_present = True + + @linked_api_apps.deleter + def linked_api_apps(self): + self._linked_api_apps_value = None + self._linked_api_apps_present = False + + def __repr__(self): + return 'MemberLinkedApps(team_member_id={!r}, linked_api_apps={!r})'.format( + self._team_member_id_value, + self._linked_api_apps_value, + ) + +class MemberProfile(object): + """ + Basic member profile. + + :ivar team_member_id: ID of user as a member of a team. + :ivar external_id: External ID that a team can attach to the user. An + application using the API may find it easier to use their own IDs + instead of Dropbox IDs like account_id or team_member_id. + :ivar email: Email address of user. + :ivar email_verified: Is true if the user's email is verified to be owned by + the user. + :ivar status: The user's status as a member of a specific team. + :ivar name: Representations for a person's name. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_external_id_value', + '_external_id_present', + '_email_value', + '_email_present', + '_email_verified_value', + '_email_verified_present', + '_status_value', + '_status_present', + '_name_value', + '_name_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + email=None, + email_verified=None, + status=None, + name=None, + external_id=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._external_id_value = None + self._external_id_present = False + self._email_value = None + self._email_present = False + self._email_verified_value = None + self._email_verified_present = False + self._status_value = None + self._status_present = False + self._name_value = None + self._name_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if external_id is not None: + self.external_id = external_id + if email is not None: + self.email = email + if email_verified is not None: + self.email_verified = email_verified + if status is not None: + self.status = status + if name is not None: + self.name = name + + @property + def team_member_id(self): + """ + ID of user as a member of a team. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def external_id(self): + """ + External ID that a team can attach to the user. An application using the + API may find it easier to use their own IDs instead of Dropbox IDs like + account_id or team_member_id. + + :rtype: str + """ + if self._external_id_present: + return self._external_id_value + else: + return None + + @external_id.setter + def external_id(self, val): + if val is None: + del self.external_id + return + val = self._external_id_validator.validate(val) + self._external_id_value = val + self._external_id_present = True + + @external_id.deleter + def external_id(self): + self._external_id_value = None + self._external_id_present = False + + @property + def email(self): + """ + Email address of user. + + :rtype: str + """ + if self._email_present: + return self._email_value + else: + raise AttributeError("missing required field 'email'") + + @email.setter + def email(self, val): + val = self._email_validator.validate(val) + self._email_value = val + self._email_present = True + + @email.deleter + def email(self): + self._email_value = None + self._email_present = False + + @property + def email_verified(self): + """ + Is true if the user's email is verified to be owned by the user. + + :rtype: bool + """ + if self._email_verified_present: + return self._email_verified_value + else: + raise AttributeError("missing required field 'email_verified'") + + @email_verified.setter + def email_verified(self, val): + val = self._email_verified_validator.validate(val) + self._email_verified_value = val + self._email_verified_present = True + + @email_verified.deleter + def email_verified(self): + self._email_verified_value = None + self._email_verified_present = False + + @property + def status(self): + """ + The user's status as a member of a specific team. + + :rtype: TeamMemberStatus + """ + if self._status_present: + return self._status_value + else: + raise AttributeError("missing required field 'status'") + + @status.setter + def status(self, val): + self._status_validator.validate_type_only(val) + self._status_value = val + self._status_present = True + + @status.deleter + def status(self): + self._status_value = None + self._status_present = False + + @property + def name(self): + """ + Representations for a person's name. + + :rtype: users.Name + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + self._name_validator.validate_type_only(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + def __repr__(self): + return 'MemberProfile(team_member_id={!r}, email={!r}, email_verified={!r}, status={!r}, name={!r}, external_id={!r})'.format( + self._team_member_id_value, + self._email_value, + self._email_verified_value, + self._status_value, + self._name_value, + self._external_id_value, + ) + +class UserSelectorError(object): + """ + Error that can be returned whenever a struct derived from + :class:`UserSelectorArg` is used. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_found: No matching user found. The provided team_member_id, + email, or external_id does not exist on this team. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + user_not_found = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_user_not_found(self): + """ + Check if the union tag is ``user_not_found``. + + :rtype: bool + """ + return self._tag == 'user_not_found' + + def __repr__(self): + return 'UserSelectorError(%r, %r)' % (self._tag, self._value) + +class MemberSelectorError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_in_team: The user is not a member of the team. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + user_not_in_team = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def __repr__(self): + return 'MemberSelectorError(%r, %r)' % (self._tag, self._value) + +class MembersAddArg(object): + """ + :ivar new_members: Details of new members to be added to the team. + :ivar force_async: Whether to force the add to happen asynchronously. + """ + + __slots__ = [ + '_new_members_value', + '_new_members_present', + '_force_async_value', + '_force_async_present', + ] + + _has_required_fields = True + + def __init__(self, + new_members=None, + force_async=None): + self._new_members_value = None + self._new_members_present = False + self._force_async_value = None + self._force_async_present = False + if new_members is not None: + self.new_members = new_members + if force_async is not None: + self.force_async = force_async + + @property + def new_members(self): + """ + Details of new members to be added to the team. + + :rtype: list of [MemberAddArg] + """ + if self._new_members_present: + return self._new_members_value + else: + raise AttributeError("missing required field 'new_members'") + + @new_members.setter + def new_members(self, val): + val = self._new_members_validator.validate(val) + self._new_members_value = val + self._new_members_present = True + + @new_members.deleter + def new_members(self): + self._new_members_value = None + self._new_members_present = False + + @property + def force_async(self): + """ + Whether to force the add to happen asynchronously. + + :rtype: bool + """ + if self._force_async_present: + return self._force_async_value + else: + return False + + @force_async.setter + def force_async(self, val): + val = self._force_async_validator.validate(val) + self._force_async_value = val + self._force_async_present = True + + @force_async.deleter + def force_async(self): + self._force_async_value = None + self._force_async_present = False + + def __repr__(self): + return 'MembersAddArg(new_members={!r}, force_async={!r})'.format( + self._new_members_value, + self._force_async_value, + ) + +class MembersAddJobStatus(async.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [MemberAddResult] complete: The asynchronous job has finished. + For each member that was specified in the parameter + :type:`MembersAddArg` that was provided to :route:`members/add`, a + corresponding item is returned in this list. + :ivar str failed: The asynchronous job returned an error. The string + contains an error message. + """ + + __slots__ = ['_tag', '_value'] + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param list of [MemberAddResult] val: + :rtype: MembersAddJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param str val: + :rtype: MembersAddJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + The asynchronous job has finished. For each member that was specified in + the parameter :class:`MembersAddArg` that was provided to members/add, a + corresponding item is returned in this list. + + Only call this if :meth:`is_complete` is true. + + :rtype: list of [MemberAddResult] + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + The asynchronous job returned an error. The string contains an error + message. + + Only call this if :meth:`is_failed` is true. + + :rtype: str + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def __repr__(self): + return 'MembersAddJobStatus(%r, %r)' % (self._tag, self._value) + +class MembersAddLaunch(async.LaunchResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param list of [MemberAddResult] val: + :rtype: MembersAddLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: list of [MemberAddResult] + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def __repr__(self): + return 'MembersAddLaunch(%r, %r)' % (self._tag, self._value) + +class MembersDeactivateArg(object): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user to remove/suspend. + :ivar wipe_data: If provided, controls if the user's data will be deleted on + their linked devices. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_wipe_data_value', + '_wipe_data_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + wipe_data=None): + self._user_value = None + self._user_present = False + self._wipe_data_value = None + self._wipe_data_present = False + if user is not None: + self.user = user + if wipe_data is not None: + self.wipe_data = wipe_data + + @property + def user(self): + """ + Identity of user to remove/suspend. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def wipe_data(self): + """ + If provided, controls if the user's data will be deleted on their linked + devices. + + :rtype: bool + """ + if self._wipe_data_present: + return self._wipe_data_value + else: + return True + + @wipe_data.setter + def wipe_data(self, val): + val = self._wipe_data_validator.validate(val) + self._wipe_data_value = val + self._wipe_data_present = True + + @wipe_data.deleter + def wipe_data(self): + self._wipe_data_value = None + self._wipe_data_present = False + + def __repr__(self): + return 'MembersDeactivateArg(user={!r}, wipe_data={!r})'.format( + self._user_value, + self._wipe_data_value, + ) + +class MembersDeactivateError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_in_team: The user is not a member of the team. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + user_not_in_team = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersDeactivateError(%r, %r)' % (self._tag, self._value) + +class MembersGetInfoArgs(object): + """ + :ivar members: List of team members. + """ + + __slots__ = [ + '_members_value', + '_members_present', + ] + + _has_required_fields = True + + def __init__(self, + members=None): + self._members_value = None + self._members_present = False + if members is not None: + self.members = members + + @property + def members(self): + """ + List of team members. + + :rtype: list of [UserSelectorArg] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + def __repr__(self): + return 'MembersGetInfoArgs(members={!r})'.format( + self._members_value, + ) + +class MembersGetInfoError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersGetInfoError(%r, %r)' % (self._tag, self._value) + +class MembersGetInfoItem(object): + """ + Describes a result obtained for a single user whose id was specified in the + parameter of members/get_info. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str id_not_found: An ID that was provided as a parameter to + :route:`members/get_info`, and did not match a corresponding user. This + might be a team_member_id, an email, or an external ID, depending on how + the method was called. + :ivar TeamMemberInfo member_info: Info about a team member. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def id_not_found(cls, val): + """ + Create an instance of this class set to the ``id_not_found`` tag with + value ``val``. + + :param str val: + :rtype: MembersGetInfoItem + """ + return cls('id_not_found', val) + + @classmethod + def member_info(cls, val): + """ + Create an instance of this class set to the ``member_info`` tag with + value ``val``. + + :param TeamMemberInfo val: + :rtype: MembersGetInfoItem + """ + return cls('member_info', val) + + def is_id_not_found(self): + """ + Check if the union tag is ``id_not_found``. + + :rtype: bool + """ + return self._tag == 'id_not_found' + + def is_member_info(self): + """ + Check if the union tag is ``member_info``. + + :rtype: bool + """ + return self._tag == 'member_info' + + def get_id_not_found(self): + """ + An ID that was provided as a parameter to members/get_info, and did not + match a corresponding user. This might be a team_member_id, an email, or + an external ID, depending on how the method was called. + + Only call this if :meth:`is_id_not_found` is true. + + :rtype: str + """ + if not self.is_id_not_found(): + raise AttributeError("tag 'id_not_found' not set") + return self._value + + def get_member_info(self): + """ + Info about a team member. + + Only call this if :meth:`is_member_info` is true. + + :rtype: TeamMemberInfo + """ + if not self.is_member_info(): + raise AttributeError("tag 'member_info' not set") + return self._value + + def __repr__(self): + return 'MembersGetInfoItem(%r, %r)' % (self._tag, self._value) + +class MembersListArg(object): + """ + :ivar limit: Number of results to return per call. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None): + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + Number of results to return per call. + + :rtype: long + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def __repr__(self): + return 'MembersListArg(limit={!r})'.format( + self._limit_value, + ) + +class MembersListContinueArg(object): + """ + :ivar cursor: Indicates from what point to get the next set of members. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def __repr__(self): + return 'MembersListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +class MembersListContinueError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersListContinueError(%r, %r)' % (self._tag, self._value) + +class MembersListError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersListError(%r, %r)' % (self._tag, self._value) + +class MembersListResult(object): + """ + :ivar members: List of team members. + :ivar cursor: Pass the cursor into members/list/continue to obtain the + additional members. + :ivar has_more: Is true if there are additional team members that have not + been returned yet. An additional call to members/list/continue can + retrieve them. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + members=None, + cursor=None, + has_more=None): + self._members_value = None + self._members_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if members is not None: + self.members = members + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def members(self): + """ + List of team members. + + :rtype: list of [TeamMemberInfo] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def cursor(self): + """ + Pass the cursor into members/list/continue to obtain the additional + members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional team members that have not been returned + yet. An additional call to members/list/continue can retrieve them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def __repr__(self): + return 'MembersListResult(members={!r}, cursor={!r}, has_more={!r})'.format( + self._members_value, + self._cursor_value, + self._has_more_value, + ) + +class MembersRemoveArg(MembersDeactivateArg): + """ + :ivar transfer_dest_id: If provided, files from the deleted member account + will be transferred to this user. + :ivar transfer_admin_id: If provided, errors during the transfer process + will be sent via email to this user. If the transfer_dest_id argument + was provided, then this argument must be provided as well. + """ + + __slots__ = [ + '_transfer_dest_id_value', + '_transfer_dest_id_present', + '_transfer_admin_id_value', + '_transfer_admin_id_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + wipe_data=None, + transfer_dest_id=None, + transfer_admin_id=None): + super(MembersRemoveArg, self).__init__(user, + wipe_data) + self._transfer_dest_id_value = None + self._transfer_dest_id_present = False + self._transfer_admin_id_value = None + self._transfer_admin_id_present = False + if transfer_dest_id is not None: + self.transfer_dest_id = transfer_dest_id + if transfer_admin_id is not None: + self.transfer_admin_id = transfer_admin_id + + @property + def transfer_dest_id(self): + """ + If provided, files from the deleted member account will be transferred + to this user. + + :rtype: UserSelectorArg + """ + if self._transfer_dest_id_present: + return self._transfer_dest_id_value + else: + return None + + @transfer_dest_id.setter + def transfer_dest_id(self, val): + if val is None: + del self.transfer_dest_id + return + self._transfer_dest_id_validator.validate_type_only(val) + self._transfer_dest_id_value = val + self._transfer_dest_id_present = True + + @transfer_dest_id.deleter + def transfer_dest_id(self): + self._transfer_dest_id_value = None + self._transfer_dest_id_present = False + + @property + def transfer_admin_id(self): + """ + If provided, errors during the transfer process will be sent via email + to this user. If the transfer_dest_id argument was provided, then this + argument must be provided as well. + + :rtype: UserSelectorArg + """ + if self._transfer_admin_id_present: + return self._transfer_admin_id_value + else: + return None + + @transfer_admin_id.setter + def transfer_admin_id(self, val): + if val is None: + del self.transfer_admin_id + return + self._transfer_admin_id_validator.validate_type_only(val) + self._transfer_admin_id_value = val + self._transfer_admin_id_present = True + + @transfer_admin_id.deleter + def transfer_admin_id(self): + self._transfer_admin_id_value = None + self._transfer_admin_id_present = False + + def __repr__(self): + return 'MembersRemoveArg(user={!r}, wipe_data={!r}, transfer_dest_id={!r}, transfer_admin_id={!r})'.format( + self._user_value, + self._wipe_data_value, + self._transfer_dest_id_value, + self._transfer_admin_id_value, + ) + +class MembersRemoveError(MembersDeactivateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar remove_last_admin: The user is the last admin of the team, so it + cannot be removed from it. + :ivar removed_and_transfer_dest_should_differ: Expected removed user and + transfer_dest user to be different + :ivar removed_and_transfer_admin_should_differ: Expected removed user and + transfer_admin user to be different. + :ivar transfer_dest_user_not_found: No matching user found for the argument + transfer_dest_id. + :ivar transfer_dest_user_not_in_team: The provided transfer_dest_id does not + exist on this team. + :ivar transfer_admin_user_not_found: No matching user found for the argument + transfer_admin_id. + :ivar transfer_admin_user_not_in_team: The provided transfer_admin_id does + not exist on this team. + :ivar unspecified_transfer_admin_id: The transfer_admin_id argument must be + provided when file transfer is requested. + :ivar transfer_admin_is_not_admin: Specified transfer_admin user is not a + team admin. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + remove_last_admin = None + # Attribute is overwritten below the class definition + removed_and_transfer_dest_should_differ = None + # Attribute is overwritten below the class definition + removed_and_transfer_admin_should_differ = None + # Attribute is overwritten below the class definition + transfer_dest_user_not_found = None + # Attribute is overwritten below the class definition + transfer_dest_user_not_in_team = None + # Attribute is overwritten below the class definition + transfer_admin_user_not_found = None + # Attribute is overwritten below the class definition + transfer_admin_user_not_in_team = None + # Attribute is overwritten below the class definition + unspecified_transfer_admin_id = None + # Attribute is overwritten below the class definition + transfer_admin_is_not_admin = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_remove_last_admin(self): + """ + Check if the union tag is ``remove_last_admin``. + + :rtype: bool + """ + return self._tag == 'remove_last_admin' + + def is_removed_and_transfer_dest_should_differ(self): + """ + Check if the union tag is ``removed_and_transfer_dest_should_differ``. + + :rtype: bool + """ + return self._tag == 'removed_and_transfer_dest_should_differ' + + def is_removed_and_transfer_admin_should_differ(self): + """ + Check if the union tag is ``removed_and_transfer_admin_should_differ``. + + :rtype: bool + """ + return self._tag == 'removed_and_transfer_admin_should_differ' + + def is_transfer_dest_user_not_found(self): + """ + Check if the union tag is ``transfer_dest_user_not_found``. + + :rtype: bool + """ + return self._tag == 'transfer_dest_user_not_found' + + def is_transfer_dest_user_not_in_team(self): + """ + Check if the union tag is ``transfer_dest_user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'transfer_dest_user_not_in_team' + + def is_transfer_admin_user_not_found(self): + """ + Check if the union tag is ``transfer_admin_user_not_found``. + + :rtype: bool + """ + return self._tag == 'transfer_admin_user_not_found' + + def is_transfer_admin_user_not_in_team(self): + """ + Check if the union tag is ``transfer_admin_user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'transfer_admin_user_not_in_team' + + def is_unspecified_transfer_admin_id(self): + """ + Check if the union tag is ``unspecified_transfer_admin_id``. + + :rtype: bool + """ + return self._tag == 'unspecified_transfer_admin_id' + + def is_transfer_admin_is_not_admin(self): + """ + Check if the union tag is ``transfer_admin_is_not_admin``. + + :rtype: bool + """ + return self._tag == 'transfer_admin_is_not_admin' + + def __repr__(self): + return 'MembersRemoveError(%r, %r)' % (self._tag, self._value) + +class MembersSendWelcomeError(MemberSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersSendWelcomeError(%r, %r)' % (self._tag, self._value) + +class MembersSetPermissionsArg(object): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user whose role will be set. + :ivar new_role: The new role of the member. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_new_role_value', + '_new_role_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + new_role=None): + self._user_value = None + self._user_present = False + self._new_role_value = None + self._new_role_present = False + if user is not None: + self.user = user + if new_role is not None: + self.new_role = new_role + + @property + def user(self): + """ + Identity of user whose role will be set. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def new_role(self): + """ + The new role of the member. + + :rtype: AdminTier + """ + if self._new_role_present: + return self._new_role_value + else: + raise AttributeError("missing required field 'new_role'") + + @new_role.setter + def new_role(self, val): + self._new_role_validator.validate_type_only(val) + self._new_role_value = val + self._new_role_present = True + + @new_role.deleter + def new_role(self): + self._new_role_value = None + self._new_role_present = False + + def __repr__(self): + return 'MembersSetPermissionsArg(user={!r}, new_role={!r})'.format( + self._user_value, + self._new_role_value, + ) + +class MembersSetPermissionsError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar last_admin: Cannot remove the admin setting of the last admin. + :ivar user_not_in_team: The user is not a member of the team. + :ivar cannot_set_permissions: Cannot remove/grant permissions. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + last_admin = None + # Attribute is overwritten below the class definition + user_not_in_team = None + # Attribute is overwritten below the class definition + cannot_set_permissions = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_last_admin(self): + """ + Check if the union tag is ``last_admin``. + + :rtype: bool + """ + return self._tag == 'last_admin' + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def is_cannot_set_permissions(self): + """ + Check if the union tag is ``cannot_set_permissions``. + + :rtype: bool + """ + return self._tag == 'cannot_set_permissions' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersSetPermissionsError(%r, %r)' % (self._tag, self._value) + +class MembersSetPermissionsResult(object): + """ + :ivar team_member_id: The member ID of the user to which the change was + applied. + :ivar role: The role after the change. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_role_value', + '_role_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + role=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._role_value = None + self._role_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if role is not None: + self.role = role + + @property + def team_member_id(self): + """ + The member ID of the user to which the change was applied. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def role(self): + """ + The role after the change. + + :rtype: AdminTier + """ + if self._role_present: + return self._role_value + else: + raise AttributeError("missing required field 'role'") + + @role.setter + def role(self, val): + self._role_validator.validate_type_only(val) + self._role_value = val + self._role_present = True + + @role.deleter + def role(self): + self._role_value = None + self._role_present = False + + def __repr__(self): + return 'MembersSetPermissionsResult(team_member_id={!r}, role={!r})'.format( + self._team_member_id_value, + self._role_value, + ) + +class MembersSetProfileArg(object): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. At least one of new_email, new_external_id, + new_given_name, and/or new_surname must be provided. + + :ivar user: Identity of user whose profile will be set. + :ivar new_email: New email for member. + :ivar new_external_id: New external ID for member. + :ivar new_given_name: New given name for member. + :ivar new_surname: New surname for member. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_new_email_value', + '_new_email_present', + '_new_external_id_value', + '_new_external_id_present', + '_new_given_name_value', + '_new_given_name_present', + '_new_surname_value', + '_new_surname_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + new_email=None, + new_external_id=None, + new_given_name=None, + new_surname=None): + self._user_value = None + self._user_present = False + self._new_email_value = None + self._new_email_present = False + self._new_external_id_value = None + self._new_external_id_present = False + self._new_given_name_value = None + self._new_given_name_present = False + self._new_surname_value = None + self._new_surname_present = False + if user is not None: + self.user = user + if new_email is not None: + self.new_email = new_email + if new_external_id is not None: + self.new_external_id = new_external_id + if new_given_name is not None: + self.new_given_name = new_given_name + if new_surname is not None: + self.new_surname = new_surname + + @property + def user(self): + """ + Identity of user whose profile will be set. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def new_email(self): + """ + New email for member. + + :rtype: str + """ + if self._new_email_present: + return self._new_email_value + else: + return None + + @new_email.setter + def new_email(self, val): + if val is None: + del self.new_email + return + val = self._new_email_validator.validate(val) + self._new_email_value = val + self._new_email_present = True + + @new_email.deleter + def new_email(self): + self._new_email_value = None + self._new_email_present = False + + @property + def new_external_id(self): + """ + New external ID for member. + + :rtype: str + """ + if self._new_external_id_present: + return self._new_external_id_value + else: + return None + + @new_external_id.setter + def new_external_id(self, val): + if val is None: + del self.new_external_id + return + val = self._new_external_id_validator.validate(val) + self._new_external_id_value = val + self._new_external_id_present = True + + @new_external_id.deleter + def new_external_id(self): + self._new_external_id_value = None + self._new_external_id_present = False + + @property + def new_given_name(self): + """ + New given name for member. + + :rtype: str + """ + if self._new_given_name_present: + return self._new_given_name_value + else: + return None + + @new_given_name.setter + def new_given_name(self, val): + if val is None: + del self.new_given_name + return + val = self._new_given_name_validator.validate(val) + self._new_given_name_value = val + self._new_given_name_present = True + + @new_given_name.deleter + def new_given_name(self): + self._new_given_name_value = None + self._new_given_name_present = False + + @property + def new_surname(self): + """ + New surname for member. + + :rtype: str + """ + if self._new_surname_present: + return self._new_surname_value + else: + return None + + @new_surname.setter + def new_surname(self, val): + if val is None: + del self.new_surname + return + val = self._new_surname_validator.validate(val) + self._new_surname_value = val + self._new_surname_present = True + + @new_surname.deleter + def new_surname(self): + self._new_surname_value = None + self._new_surname_present = False + + def __repr__(self): + return 'MembersSetProfileArg(user={!r}, new_email={!r}, new_external_id={!r}, new_given_name={!r}, new_surname={!r})'.format( + self._user_value, + self._new_email_value, + self._new_external_id_value, + self._new_given_name_value, + self._new_surname_value, + ) + +class MembersSetProfileError(MemberSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar external_id_and_new_external_id_unsafe: It is unsafe to use both + external_id and new_external_id + :ivar no_new_data_specified: None of new_email, new_given_name, new_surname, + or new_external_id are specified + :ivar email_reserved_for_other_user: Email is already reserved for another + user. + :ivar external_id_used_by_other_user: The external ID is already in use by + another team member. + :ivar set_profile_disallowed: Setting profile disallowed + :ivar param_cannot_be_empty: New new_email, new_given_name or new_surname + value cannot be empty. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + external_id_and_new_external_id_unsafe = None + # Attribute is overwritten below the class definition + no_new_data_specified = None + # Attribute is overwritten below the class definition + email_reserved_for_other_user = None + # Attribute is overwritten below the class definition + external_id_used_by_other_user = None + # Attribute is overwritten below the class definition + set_profile_disallowed = None + # Attribute is overwritten below the class definition + param_cannot_be_empty = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_external_id_and_new_external_id_unsafe(self): + """ + Check if the union tag is ``external_id_and_new_external_id_unsafe``. + + :rtype: bool + """ + return self._tag == 'external_id_and_new_external_id_unsafe' + + def is_no_new_data_specified(self): + """ + Check if the union tag is ``no_new_data_specified``. + + :rtype: bool + """ + return self._tag == 'no_new_data_specified' + + def is_email_reserved_for_other_user(self): + """ + Check if the union tag is ``email_reserved_for_other_user``. + + :rtype: bool + """ + return self._tag == 'email_reserved_for_other_user' + + def is_external_id_used_by_other_user(self): + """ + Check if the union tag is ``external_id_used_by_other_user``. + + :rtype: bool + """ + return self._tag == 'external_id_used_by_other_user' + + def is_set_profile_disallowed(self): + """ + Check if the union tag is ``set_profile_disallowed``. + + :rtype: bool + """ + return self._tag == 'set_profile_disallowed' + + def is_param_cannot_be_empty(self): + """ + Check if the union tag is ``param_cannot_be_empty``. + + :rtype: bool + """ + return self._tag == 'param_cannot_be_empty' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MembersSetProfileError(%r, %r)' % (self._tag, self._value) + +class MembersSuspendError(MembersDeactivateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar suspend_inactive_user: The user is not active, so it cannot be + suspended. + :ivar suspend_last_admin: The user is the last admin of the team, so it + cannot be suspended. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + suspend_inactive_user = None + # Attribute is overwritten below the class definition + suspend_last_admin = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_suspend_inactive_user(self): + """ + Check if the union tag is ``suspend_inactive_user``. + + :rtype: bool + """ + return self._tag == 'suspend_inactive_user' + + def is_suspend_last_admin(self): + """ + Check if the union tag is ``suspend_last_admin``. + + :rtype: bool + """ + return self._tag == 'suspend_last_admin' + + def __repr__(self): + return 'MembersSuspendError(%r, %r)' % (self._tag, self._value) + +class MembersUnsuspendArg(object): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user to unsuspend. + """ + + __slots__ = [ + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None): + self._user_value = None + self._user_present = False + if user is not None: + self.user = user + + @property + def user(self): + """ + Identity of user to unsuspend. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def __repr__(self): + return 'MembersUnsuspendArg(user={!r})'.format( + self._user_value, + ) + +class MembersUnsuspendError(MembersDeactivateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unsuspend_non_suspended_member: The user is unsuspended, so it cannot + be unsuspended again. + """ + + __slots__ = ['_tag', '_value'] + + # Attribute is overwritten below the class definition + unsuspend_non_suspended_member = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_unsuspend_non_suspended_member(self): + """ + Check if the union tag is ``unsuspend_non_suspended_member``. + + :rtype: bool + """ + return self._tag == 'unsuspend_non_suspended_member' + + def __repr__(self): + return 'MembersUnsuspendError(%r, %r)' % (self._tag, self._value) + +class MobileClientPlatform(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar iphone: Official Dropbox iPhone client + :ivar ipad: Official Dropbox iPad client + :ivar android: Official Dropbox Android client + :ivar windows_phone: Official Dropbox Windows phone client + :ivar blackberry: Official Dropbox Blackberry client + :ivar other: Official Dropbox client for another platform + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + iphone = None + # Attribute is overwritten below the class definition + ipad = None + # Attribute is overwritten below the class definition + android = None + # Attribute is overwritten below the class definition + windows_phone = None + # Attribute is overwritten below the class definition + blackberry = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_iphone(self): + """ + Check if the union tag is ``iphone``. + + :rtype: bool + """ + return self._tag == 'iphone' + + def is_ipad(self): + """ + Check if the union tag is ``ipad``. + + :rtype: bool + """ + return self._tag == 'ipad' + + def is_android(self): + """ + Check if the union tag is ``android``. + + :rtype: bool + """ + return self._tag == 'android' + + def is_windows_phone(self): + """ + Check if the union tag is ``windows_phone``. + + :rtype: bool + """ + return self._tag == 'windows_phone' + + def is_blackberry(self): + """ + Check if the union tag is ``blackberry``. + + :rtype: bool + """ + return self._tag == 'blackberry' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'MobileClientPlatform(%r, %r)' % (self._tag, self._value) + +class MobileClientSession(DeviceSession): + """ + Information about linked Dropbox mobile client sessions + + :ivar device_name: The device name + :ivar client_type: The mobile application type + :ivar client_version: The dropbox client version + :ivar os_version: The hosting OS version + :ivar last_carrier: last carrier used by the device + """ + + __slots__ = [ + '_device_name_value', + '_device_name_present', + '_client_type_value', + '_client_type_present', + '_client_version_value', + '_client_version_present', + '_os_version_value', + '_os_version_present', + '_last_carrier_value', + '_last_carrier_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + device_name=None, + client_type=None, + ip_address=None, + country=None, + created=None, + updated=None, + client_version=None, + os_version=None, + last_carrier=None): + super(MobileClientSession, self).__init__(session_id, + ip_address, + country, + created, + updated) + self._device_name_value = None + self._device_name_present = False + self._client_type_value = None + self._client_type_present = False + self._client_version_value = None + self._client_version_present = False + self._os_version_value = None + self._os_version_present = False + self._last_carrier_value = None + self._last_carrier_present = False + if device_name is not None: + self.device_name = device_name + if client_type is not None: + self.client_type = client_type + if client_version is not None: + self.client_version = client_version + if os_version is not None: + self.os_version = os_version + if last_carrier is not None: + self.last_carrier = last_carrier + + @property + def device_name(self): + """ + The device name + + :rtype: str + """ + if self._device_name_present: + return self._device_name_value + else: + raise AttributeError("missing required field 'device_name'") + + @device_name.setter + def device_name(self, val): + val = self._device_name_validator.validate(val) + self._device_name_value = val + self._device_name_present = True + + @device_name.deleter + def device_name(self): + self._device_name_value = None + self._device_name_present = False + + @property + def client_type(self): + """ + The mobile application type + + :rtype: MobileClientPlatform + """ + if self._client_type_present: + return self._client_type_value + else: + raise AttributeError("missing required field 'client_type'") + + @client_type.setter + def client_type(self, val): + self._client_type_validator.validate_type_only(val) + self._client_type_value = val + self._client_type_present = True + + @client_type.deleter + def client_type(self): + self._client_type_value = None + self._client_type_present = False + + @property + def client_version(self): + """ + The dropbox client version + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + return None + + @client_version.setter + def client_version(self, val): + if val is None: + del self.client_version + return + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def os_version(self): + """ + The hosting OS version + + :rtype: str + """ + if self._os_version_present: + return self._os_version_value + else: + return None + + @os_version.setter + def os_version(self, val): + if val is None: + del self.os_version + return + val = self._os_version_validator.validate(val) + self._os_version_value = val + self._os_version_present = True + + @os_version.deleter + def os_version(self): + self._os_version_value = None + self._os_version_present = False + + @property + def last_carrier(self): + """ + last carrier used by the device + + :rtype: str + """ + if self._last_carrier_present: + return self._last_carrier_value + else: + return None + + @last_carrier.setter + def last_carrier(self, val): + if val is None: + del self.last_carrier + return + val = self._last_carrier_validator.validate(val) + self._last_carrier_value = val + self._last_carrier_present = True + + @last_carrier.deleter + def last_carrier(self): + self._last_carrier_value = None + self._last_carrier_present = False + + def __repr__(self): + return 'MobileClientSession(session_id={!r}, device_name={!r}, client_type={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r}, client_version={!r}, os_version={!r}, last_carrier={!r})'.format( + self._session_id_value, + self._device_name_value, + self._client_type_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + self._client_version_value, + self._os_version_value, + self._last_carrier_value, + ) + +class RevokeDesktopClientArg(DeviceSessionArg): + """ + :ivar delete_on_unlink: Whether to delete all files of the account (this is + possible only if supported by the desktop client and will be made the + next time the client access the account) + """ + + __slots__ = [ + '_delete_on_unlink_value', + '_delete_on_unlink_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + team_member_id=None, + delete_on_unlink=None): + super(RevokeDesktopClientArg, self).__init__(session_id, + team_member_id) + self._delete_on_unlink_value = None + self._delete_on_unlink_present = False + if delete_on_unlink is not None: + self.delete_on_unlink = delete_on_unlink + + @property + def delete_on_unlink(self): + """ + Whether to delete all files of the account (this is possible only if + supported by the desktop client and will be made the next time the + client access the account) + + :rtype: bool + """ + if self._delete_on_unlink_present: + return self._delete_on_unlink_value + else: + return False + + @delete_on_unlink.setter + def delete_on_unlink(self, val): + val = self._delete_on_unlink_validator.validate(val) + self._delete_on_unlink_value = val + self._delete_on_unlink_present = True + + @delete_on_unlink.deleter + def delete_on_unlink(self): + self._delete_on_unlink_value = None + self._delete_on_unlink_present = False + + def __repr__(self): + return 'RevokeDesktopClientArg(session_id={!r}, team_member_id={!r}, delete_on_unlink={!r})'.format( + self._session_id_value, + self._team_member_id_value, + self._delete_on_unlink_value, + ) + +class RevokeDeviceSessionArg(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar DeviceSessionArg web_session: End an active session + :ivar RevokeDesktopClientArg desktop_client: Unlink a linked desktop device + :ivar DeviceSessionArg mobile_client: Unlink a linked mobile device + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def web_session(cls, val): + """ + Create an instance of this class set to the ``web_session`` tag with + value ``val``. + + :param DeviceSessionArg val: + :rtype: RevokeDeviceSessionArg + """ + return cls('web_session', val) + + @classmethod + def desktop_client(cls, val): + """ + Create an instance of this class set to the ``desktop_client`` tag with + value ``val``. + + :param RevokeDesktopClientArg val: + :rtype: RevokeDeviceSessionArg + """ + return cls('desktop_client', val) + + @classmethod + def mobile_client(cls, val): + """ + Create an instance of this class set to the ``mobile_client`` tag with + value ``val``. + + :param DeviceSessionArg val: + :rtype: RevokeDeviceSessionArg + """ + return cls('mobile_client', val) + + def is_web_session(self): + """ + Check if the union tag is ``web_session``. + + :rtype: bool + """ + return self._tag == 'web_session' + + def is_desktop_client(self): + """ + Check if the union tag is ``desktop_client``. + + :rtype: bool + """ + return self._tag == 'desktop_client' + + def is_mobile_client(self): + """ + Check if the union tag is ``mobile_client``. + + :rtype: bool + """ + return self._tag == 'mobile_client' + + def get_web_session(self): + """ + End an active session + + Only call this if :meth:`is_web_session` is true. + + :rtype: DeviceSessionArg + """ + if not self.is_web_session(): + raise AttributeError("tag 'web_session' not set") + return self._value + + def get_desktop_client(self): + """ + Unlink a linked desktop device + + Only call this if :meth:`is_desktop_client` is true. + + :rtype: RevokeDesktopClientArg + """ + if not self.is_desktop_client(): + raise AttributeError("tag 'desktop_client' not set") + return self._value + + def get_mobile_client(self): + """ + Unlink a linked mobile device + + Only call this if :meth:`is_mobile_client` is true. + + :rtype: DeviceSessionArg + """ + if not self.is_mobile_client(): + raise AttributeError("tag 'mobile_client' not set") + return self._value + + def __repr__(self): + return 'RevokeDeviceSessionArg(%r, %r)' % (self._tag, self._value) + +class RevokeDeviceSessionBatchArg(object): + + __slots__ = [ + '_revoke_devices_value', + '_revoke_devices_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_devices=None): + self._revoke_devices_value = None + self._revoke_devices_present = False + if revoke_devices is not None: + self.revoke_devices = revoke_devices + + @property + def revoke_devices(self): + """ + :rtype: list of [RevokeDeviceSessionArg] + """ + if self._revoke_devices_present: + return self._revoke_devices_value + else: + raise AttributeError("missing required field 'revoke_devices'") + + @revoke_devices.setter + def revoke_devices(self, val): + val = self._revoke_devices_validator.validate(val) + self._revoke_devices_value = val + self._revoke_devices_present = True + + @revoke_devices.deleter + def revoke_devices(self): + self._revoke_devices_value = None + self._revoke_devices_present = False + + def __repr__(self): + return 'RevokeDeviceSessionBatchArg(revoke_devices={!r})'.format( + self._revoke_devices_value, + ) + +class RevokeDeviceSessionBatchError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unspecified: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'unspecified' + # Attribute is overwritten below the class definition + unspecified = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_unspecified(self): + """ + Check if the union tag is ``unspecified``. + + :rtype: bool + """ + return self._tag == 'unspecified' + + def __repr__(self): + return 'RevokeDeviceSessionBatchError(%r, %r)' % (self._tag, self._value) + +class RevokeDeviceSessionBatchResult(object): + + __slots__ = [ + '_revoke_devices_status_value', + '_revoke_devices_status_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_devices_status=None): + self._revoke_devices_status_value = None + self._revoke_devices_status_present = False + if revoke_devices_status is not None: + self.revoke_devices_status = revoke_devices_status + + @property + def revoke_devices_status(self): + """ + :rtype: list of [RevokeDeviceSessionStatus] + """ + if self._revoke_devices_status_present: + return self._revoke_devices_status_value + else: + raise AttributeError("missing required field 'revoke_devices_status'") + + @revoke_devices_status.setter + def revoke_devices_status(self, val): + val = self._revoke_devices_status_validator.validate(val) + self._revoke_devices_status_value = val + self._revoke_devices_status_present = True + + @revoke_devices_status.deleter + def revoke_devices_status(self): + self._revoke_devices_status_value = None + self._revoke_devices_status_present = False + + def __repr__(self): + return 'RevokeDeviceSessionBatchResult(revoke_devices_status={!r})'.format( + self._revoke_devices_status_value, + ) + +class RevokeDeviceSessionError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar device_session_not_found: Device session not found. + :ivar member_not_found: Member not found. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + device_session_not_found = None + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_device_session_not_found(self): + """ + Check if the union tag is ``device_session_not_found``. + + :rtype: bool + """ + return self._tag == 'device_session_not_found' + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'RevokeDeviceSessionError(%r, %r)' % (self._tag, self._value) + +class RevokeDeviceSessionStatus(object): + """ + :ivar success: Result of the revoking request + :ivar error_type: The error cause in case of a failure + """ + + __slots__ = [ + '_success_value', + '_success_present', + '_error_type_value', + '_error_type_present', + ] + + _has_required_fields = True + + def __init__(self, + success=None, + error_type=None): + self._success_value = None + self._success_present = False + self._error_type_value = None + self._error_type_present = False + if success is not None: + self.success = success + if error_type is not None: + self.error_type = error_type + + @property + def success(self): + """ + Result of the revoking request + + :rtype: bool + """ + if self._success_present: + return self._success_value + else: + raise AttributeError("missing required field 'success'") + + @success.setter + def success(self, val): + val = self._success_validator.validate(val) + self._success_value = val + self._success_present = True + + @success.deleter + def success(self): + self._success_value = None + self._success_present = False + + @property + def error_type(self): + """ + The error cause in case of a failure + + :rtype: RevokeDeviceSessionError + """ + if self._error_type_present: + return self._error_type_value + else: + return None + + @error_type.setter + def error_type(self, val): + if val is None: + del self.error_type + return + self._error_type_validator.validate_type_only(val) + self._error_type_value = val + self._error_type_present = True + + @error_type.deleter + def error_type(self): + self._error_type_value = None + self._error_type_present = False + + def __repr__(self): + return 'RevokeDeviceSessionStatus(success={!r}, error_type={!r})'.format( + self._success_value, + self._error_type_value, + ) + +class RevokeLinkedApiAppArg(object): + """ + :ivar app_id: The application's unique id + :ivar team_member_id: The unique id of the member owning the device + :ivar keep_app_folder: Whether to keep the application dedicated folder (in + case the application uses one) + """ + + __slots__ = [ + '_app_id_value', + '_app_id_present', + '_team_member_id_value', + '_team_member_id_present', + '_keep_app_folder_value', + '_keep_app_folder_present', + ] + + _has_required_fields = True + + def __init__(self, + app_id=None, + team_member_id=None, + keep_app_folder=None): + self._app_id_value = None + self._app_id_present = False + self._team_member_id_value = None + self._team_member_id_present = False + self._keep_app_folder_value = None + self._keep_app_folder_present = False + if app_id is not None: + self.app_id = app_id + if team_member_id is not None: + self.team_member_id = team_member_id + if keep_app_folder is not None: + self.keep_app_folder = keep_app_folder + + @property + def app_id(self): + """ + The application's unique id + + :rtype: str + """ + if self._app_id_present: + return self._app_id_value + else: + raise AttributeError("missing required field 'app_id'") + + @app_id.setter + def app_id(self, val): + val = self._app_id_validator.validate(val) + self._app_id_value = val + self._app_id_present = True + + @app_id.deleter + def app_id(self): + self._app_id_value = None + self._app_id_present = False + + @property + def team_member_id(self): + """ + The unique id of the member owning the device + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def keep_app_folder(self): + """ + Whether to keep the application dedicated folder (in case the + application uses one) + + :rtype: bool + """ + if self._keep_app_folder_present: + return self._keep_app_folder_value + else: + return True + + @keep_app_folder.setter + def keep_app_folder(self, val): + val = self._keep_app_folder_validator.validate(val) + self._keep_app_folder_value = val + self._keep_app_folder_present = True + + @keep_app_folder.deleter + def keep_app_folder(self): + self._keep_app_folder_value = None + self._keep_app_folder_present = False + + def __repr__(self): + return 'RevokeLinkedApiAppArg(app_id={!r}, team_member_id={!r}, keep_app_folder={!r})'.format( + self._app_id_value, + self._team_member_id_value, + self._keep_app_folder_value, + ) + +class RevokeLinkedApiAppBatchArg(object): + + __slots__ = [ + '_revoke_linked_app_value', + '_revoke_linked_app_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_linked_app=None): + self._revoke_linked_app_value = None + self._revoke_linked_app_present = False + if revoke_linked_app is not None: + self.revoke_linked_app = revoke_linked_app + + @property + def revoke_linked_app(self): + """ + :rtype: list of [RevokeLinkedApiAppArg] + """ + if self._revoke_linked_app_present: + return self._revoke_linked_app_value + else: + raise AttributeError("missing required field 'revoke_linked_app'") + + @revoke_linked_app.setter + def revoke_linked_app(self, val): + val = self._revoke_linked_app_validator.validate(val) + self._revoke_linked_app_value = val + self._revoke_linked_app_present = True + + @revoke_linked_app.deleter + def revoke_linked_app(self): + self._revoke_linked_app_value = None + self._revoke_linked_app_present = False + + def __repr__(self): + return 'RevokeLinkedApiAppBatchArg(revoke_linked_app={!r})'.format( + self._revoke_linked_app_value, + ) + +class RevokeLinkedAppBatchError(object): + """ + Error returned by linked_apps/revoke_linked_app_batch. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unspecified: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'unspecified' + # Attribute is overwritten below the class definition + unspecified = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_unspecified(self): + """ + Check if the union tag is ``unspecified``. + + :rtype: bool + """ + return self._tag == 'unspecified' + + def __repr__(self): + return 'RevokeLinkedAppBatchError(%r, %r)' % (self._tag, self._value) + +class RevokeLinkedAppBatchResult(object): + + __slots__ = [ + '_revoke_linked_app_status_value', + '_revoke_linked_app_status_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_linked_app_status=None): + self._revoke_linked_app_status_value = None + self._revoke_linked_app_status_present = False + if revoke_linked_app_status is not None: + self.revoke_linked_app_status = revoke_linked_app_status + + @property + def revoke_linked_app_status(self): + """ + :rtype: list of [RevokeLinkedAppStatus] + """ + if self._revoke_linked_app_status_present: + return self._revoke_linked_app_status_value + else: + raise AttributeError("missing required field 'revoke_linked_app_status'") + + @revoke_linked_app_status.setter + def revoke_linked_app_status(self, val): + val = self._revoke_linked_app_status_validator.validate(val) + self._revoke_linked_app_status_value = val + self._revoke_linked_app_status_present = True + + @revoke_linked_app_status.deleter + def revoke_linked_app_status(self): + self._revoke_linked_app_status_value = None + self._revoke_linked_app_status_present = False + + def __repr__(self): + return 'RevokeLinkedAppBatchResult(revoke_linked_app_status={!r})'.format( + self._revoke_linked_app_status_value, + ) + +class RevokeLinkedAppError(object): + """ + Error returned by linked_apps/revoke_linked_app. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar app_not_found: Application not found. + :ivar member_not_found: Member not found. + :ivar other: An unspecified error. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + app_not_found = None + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_app_not_found(self): + """ + Check if the union tag is ``app_not_found``. + + :rtype: bool + """ + return self._tag == 'app_not_found' + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'RevokeLinkedAppError(%r, %r)' % (self._tag, self._value) + +class RevokeLinkedAppStatus(object): + """ + :ivar success: Result of the revoking request + :ivar error_type: The error cause in case of a failure + """ + + __slots__ = [ + '_success_value', + '_success_present', + '_error_type_value', + '_error_type_present', + ] + + _has_required_fields = True + + def __init__(self, + success=None, + error_type=None): + self._success_value = None + self._success_present = False + self._error_type_value = None + self._error_type_present = False + if success is not None: + self.success = success + if error_type is not None: + self.error_type = error_type + + @property + def success(self): + """ + Result of the revoking request + + :rtype: bool + """ + if self._success_present: + return self._success_value + else: + raise AttributeError("missing required field 'success'") + + @success.setter + def success(self, val): + val = self._success_validator.validate(val) + self._success_value = val + self._success_present = True + + @success.deleter + def success(self): + self._success_value = None + self._success_present = False + + @property + def error_type(self): + """ + The error cause in case of a failure + + :rtype: RevokeLinkedAppError + """ + if self._error_type_present: + return self._error_type_value + else: + return None + + @error_type.setter + def error_type(self, val): + if val is None: + del self.error_type + return + self._error_type_validator.validate_type_only(val) + self._error_type_value = val + self._error_type_present = True + + @error_type.deleter + def error_type(self): + self._error_type_value = None + self._error_type_present = False + + def __repr__(self): + return 'RevokeLinkedAppStatus(success={!r}, error_type={!r})'.format( + self._success_value, + self._error_type_value, + ) + +class SharedFolderJoinPolicy(object): + """ + Policy governing which shared folders a team member can join. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar from_team_only: Team members can only join folders shared by + teammates. + :ivar from_anyone: Team members can join any shared folder, including those + shared by users outside the team. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + from_team_only = None + # Attribute is overwritten below the class definition + from_anyone = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_from_team_only(self): + """ + Check if the union tag is ``from_team_only``. + + :rtype: bool + """ + return self._tag == 'from_team_only' + + def is_from_anyone(self): + """ + Check if the union tag is ``from_anyone``. + + :rtype: bool + """ + return self._tag == 'from_anyone' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharedFolderJoinPolicy(%r, %r)' % (self._tag, self._value) + +class SharedFolderMemberPolicy(object): + """ + Policy governing who can be a member of a folder shared by a team member. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team: Only a teammate can be a member of a folder shared by a team + member. + :ivar anyone: Anyone can be a member of a folder shared by a team member. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + anyone = None + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_anyone(self): + """ + Check if the union tag is ``anyone``. + + :rtype: bool + """ + return self._tag == 'anyone' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def __repr__(self): + return 'SharedFolderMemberPolicy(%r, %r)' % (self._tag, self._value) + +class StorageBucket(object): + """ + Describes the number of users in a specific storage bucket. + + :ivar bucket: The name of the storage bucket. For example, '1G' is a bucket + of users with storage size up to 1 Giga. + :ivar users: The number of people whose storage is in the range of this + storage bucket. + """ + + __slots__ = [ + '_bucket_value', + '_bucket_present', + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + bucket=None, + users=None): + self._bucket_value = None + self._bucket_present = False + self._users_value = None + self._users_present = False + if bucket is not None: + self.bucket = bucket + if users is not None: + self.users = users + + @property + def bucket(self): + """ + The name of the storage bucket. For example, '1G' is a bucket of users + with storage size up to 1 Giga. + + :rtype: str + """ + if self._bucket_present: + return self._bucket_value + else: + raise AttributeError("missing required field 'bucket'") + + @bucket.setter + def bucket(self, val): + val = self._bucket_validator.validate(val) + self._bucket_value = val + self._bucket_present = True + + @bucket.deleter + def bucket(self): + self._bucket_value = None + self._bucket_present = False + + @property + def users(self): + """ + The number of people whose storage is in the range of this storage + bucket. + + :rtype: long + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def __repr__(self): + return 'StorageBucket(bucket={!r}, users={!r})'.format( + self._bucket_value, + self._users_value, + ) + +class TeamGetInfoResult(object): + """ + :ivar name: The name of the team. + :ivar team_id: The ID of the team. + :ivar num_licensed_users: The number of licenses available to the team. + :ivar num_provisioned_users: The number of accounts that have been invited + or are already active members of the team. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_team_id_value', + '_team_id_present', + '_num_licensed_users_value', + '_num_licensed_users_present', + '_num_provisioned_users_value', + '_num_provisioned_users_present', + '_policies_value', + '_policies_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + team_id=None, + num_licensed_users=None, + num_provisioned_users=None, + policies=None): + self._name_value = None + self._name_present = False + self._team_id_value = None + self._team_id_present = False + self._num_licensed_users_value = None + self._num_licensed_users_present = False + self._num_provisioned_users_value = None + self._num_provisioned_users_present = False + self._policies_value = None + self._policies_present = False + if name is not None: + self.name = name + if team_id is not None: + self.team_id = team_id + if num_licensed_users is not None: + self.num_licensed_users = num_licensed_users + if num_provisioned_users is not None: + self.num_provisioned_users = num_provisioned_users + if policies is not None: + self.policies = policies + + @property + def name(self): + """ + The name of the team. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def team_id(self): + """ + The ID of the team. + + :rtype: str + """ + if self._team_id_present: + return self._team_id_value + else: + raise AttributeError("missing required field 'team_id'") + + @team_id.setter + def team_id(self, val): + val = self._team_id_validator.validate(val) + self._team_id_value = val + self._team_id_present = True + + @team_id.deleter + def team_id(self): + self._team_id_value = None + self._team_id_present = False + + @property + def num_licensed_users(self): + """ + The number of licenses available to the team. + + :rtype: long + """ + if self._num_licensed_users_present: + return self._num_licensed_users_value + else: + raise AttributeError("missing required field 'num_licensed_users'") + + @num_licensed_users.setter + def num_licensed_users(self, val): + val = self._num_licensed_users_validator.validate(val) + self._num_licensed_users_value = val + self._num_licensed_users_present = True + + @num_licensed_users.deleter + def num_licensed_users(self): + self._num_licensed_users_value = None + self._num_licensed_users_present = False + + @property + def num_provisioned_users(self): + """ + The number of accounts that have been invited or are already active + members of the team. + + :rtype: long + """ + if self._num_provisioned_users_present: + return self._num_provisioned_users_value + else: + raise AttributeError("missing required field 'num_provisioned_users'") + + @num_provisioned_users.setter + def num_provisioned_users(self, val): + val = self._num_provisioned_users_validator.validate(val) + self._num_provisioned_users_value = val + self._num_provisioned_users_present = True + + @num_provisioned_users.deleter + def num_provisioned_users(self): + self._num_provisioned_users_value = None + self._num_provisioned_users_present = False + + @property + def policies(self): + """ + :rtype: TeamPolicies + """ + if self._policies_present: + return self._policies_value + else: + raise AttributeError("missing required field 'policies'") + + @policies.setter + def policies(self, val): + self._policies_validator.validate_type_only(val) + self._policies_value = val + self._policies_present = True + + @policies.deleter + def policies(self): + self._policies_value = None + self._policies_present = False + + def __repr__(self): + return 'TeamGetInfoResult(name={!r}, team_id={!r}, num_licensed_users={!r}, num_provisioned_users={!r}, policies={!r})'.format( + self._name_value, + self._team_id_value, + self._num_licensed_users_value, + self._num_provisioned_users_value, + self._policies_value, + ) + +class TeamMemberInfo(object): + """ + Information about a team member. + + :ivar profile: Profile of a user as a member of a team. + :ivar role: The user's role in the team. + """ + + __slots__ = [ + '_profile_value', + '_profile_present', + '_role_value', + '_role_present', + ] + + _has_required_fields = True + + def __init__(self, + profile=None, + role=None): + self._profile_value = None + self._profile_present = False + self._role_value = None + self._role_present = False + if profile is not None: + self.profile = profile + if role is not None: + self.role = role + + @property + def profile(self): + """ + Profile of a user as a member of a team. + + :rtype: TeamMemberProfile + """ + if self._profile_present: + return self._profile_value + else: + raise AttributeError("missing required field 'profile'") + + @profile.setter + def profile(self, val): + self._profile_validator.validate_type_only(val) + self._profile_value = val + self._profile_present = True + + @profile.deleter + def profile(self): + self._profile_value = None + self._profile_present = False + + @property + def role(self): + """ + The user's role in the team. + + :rtype: AdminTier + """ + if self._role_present: + return self._role_value + else: + raise AttributeError("missing required field 'role'") + + @role.setter + def role(self, val): + self._role_validator.validate_type_only(val) + self._role_value = val + self._role_present = True + + @role.deleter + def role(self): + self._role_value = None + self._role_present = False + + def __repr__(self): + return 'TeamMemberInfo(profile={!r}, role={!r})'.format( + self._profile_value, + self._role_value, + ) + +class TeamMemberProfile(MemberProfile): + """ + Profile of a user as a member of a team. + + :ivar groups: List of group IDs of groups that the user belongs to. + """ + + __slots__ = [ + '_groups_value', + '_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + email=None, + email_verified=None, + status=None, + name=None, + groups=None, + external_id=None): + super(TeamMemberProfile, self).__init__(team_member_id, + email, + email_verified, + status, + name, + external_id) + self._groups_value = None + self._groups_present = False + if groups is not None: + self.groups = groups + + @property + def groups(self): + """ + List of group IDs of groups that the user belongs to. + + :rtype: list of [str] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + def __repr__(self): + return 'TeamMemberProfile(team_member_id={!r}, email={!r}, email_verified={!r}, status={!r}, name={!r}, groups={!r}, external_id={!r})'.format( + self._team_member_id_value, + self._email_value, + self._email_verified_value, + self._status_value, + self._name_value, + self._groups_value, + self._external_id_value, + ) + +class TeamMemberStatus(object): + """ + The user's status as a member of a specific team. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar active: User has successfully joined the team. + :ivar invited: User has been invited to a team, but has not joined the team + yet. + :ivar suspended: User is no longer a member of the team, but the account can + be un-suspended, re-establishing the user as a team member. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + # Attribute is overwritten below the class definition + active = None + # Attribute is overwritten below the class definition + invited = None + # Attribute is overwritten below the class definition + suspended = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_active(self): + """ + Check if the union tag is ``active``. + + :rtype: bool + """ + return self._tag == 'active' + + def is_invited(self): + """ + Check if the union tag is ``invited``. + + :rtype: bool + """ + return self._tag == 'invited' + + def is_suspended(self): + """ + Check if the union tag is ``suspended``. + + :rtype: bool + """ + return self._tag == 'suspended' + + def __repr__(self): + return 'TeamMemberStatus(%r, %r)' % (self._tag, self._value) + +class TeamPolicies(object): + """ + Policies governing team members. + + :ivar sharing: Policies governing sharing. + :ivar emm_state: This describes the Enterprise Mobility Management (EMM) + state for this team. This information can be used to understand if an + organization is integrating with a third-party EMM vendor to further + manage and apply restrictions upon the team's Dropbox usage on mobile + devices. This is a new feature and in the future we'll be adding more + new fields and additional documentation. + """ + + __slots__ = [ + '_sharing_value', + '_sharing_present', + '_emm_state_value', + '_emm_state_present', + ] + + _has_required_fields = True + + def __init__(self, + sharing=None, + emm_state=None): + self._sharing_value = None + self._sharing_present = False + self._emm_state_value = None + self._emm_state_present = False + if sharing is not None: + self.sharing = sharing + if emm_state is not None: + self.emm_state = emm_state + + @property + def sharing(self): + """ + Policies governing sharing. + + :rtype: TeamSharingPolicies + """ + if self._sharing_present: + return self._sharing_value + else: + raise AttributeError("missing required field 'sharing'") + + @sharing.setter + def sharing(self, val): + self._sharing_validator.validate_type_only(val) + self._sharing_value = val + self._sharing_present = True + + @sharing.deleter + def sharing(self): + self._sharing_value = None + self._sharing_present = False + + @property + def emm_state(self): + """ + This describes the Enterprise Mobility Management (EMM) state for this + team. This information can be used to understand if an organization is + integrating with a third-party EMM vendor to further manage and apply + restrictions upon the team's Dropbox usage on mobile devices. This is a + new feature and in the future we'll be adding more new fields and + additional documentation. + + :rtype: EmmState + """ + if self._emm_state_present: + return self._emm_state_value + else: + raise AttributeError("missing required field 'emm_state'") + + @emm_state.setter + def emm_state(self, val): + self._emm_state_validator.validate_type_only(val) + self._emm_state_value = val + self._emm_state_present = True + + @emm_state.deleter + def emm_state(self): + self._emm_state_value = None + self._emm_state_present = False + + def __repr__(self): + return 'TeamPolicies(sharing={!r}, emm_state={!r})'.format( + self._sharing_value, + self._emm_state_value, + ) + +class TeamSharingPolicies(object): + """ + Policies governing sharing within and outside of the team. + + :ivar shared_folder_member_policy: Who can join folders shared by team + members. + :ivar shared_folder_join_policy: Which shared folders team members can join. + """ + + __slots__ = [ + '_shared_folder_member_policy_value', + '_shared_folder_member_policy_present', + '_shared_folder_join_policy_value', + '_shared_folder_join_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_member_policy=None, + shared_folder_join_policy=None): + self._shared_folder_member_policy_value = None + self._shared_folder_member_policy_present = False + self._shared_folder_join_policy_value = None + self._shared_folder_join_policy_present = False + if shared_folder_member_policy is not None: + self.shared_folder_member_policy = shared_folder_member_policy + if shared_folder_join_policy is not None: + self.shared_folder_join_policy = shared_folder_join_policy + + @property + def shared_folder_member_policy(self): + """ + Who can join folders shared by team members. + + :rtype: SharedFolderMemberPolicy + """ + if self._shared_folder_member_policy_present: + return self._shared_folder_member_policy_value + else: + raise AttributeError("missing required field 'shared_folder_member_policy'") + + @shared_folder_member_policy.setter + def shared_folder_member_policy(self, val): + self._shared_folder_member_policy_validator.validate_type_only(val) + self._shared_folder_member_policy_value = val + self._shared_folder_member_policy_present = True + + @shared_folder_member_policy.deleter + def shared_folder_member_policy(self): + self._shared_folder_member_policy_value = None + self._shared_folder_member_policy_present = False + + @property + def shared_folder_join_policy(self): + """ + Which shared folders team members can join. + + :rtype: SharedFolderJoinPolicy + """ + if self._shared_folder_join_policy_present: + return self._shared_folder_join_policy_value + else: + raise AttributeError("missing required field 'shared_folder_join_policy'") + + @shared_folder_join_policy.setter + def shared_folder_join_policy(self, val): + self._shared_folder_join_policy_validator.validate_type_only(val) + self._shared_folder_join_policy_value = val + self._shared_folder_join_policy_present = True + + @shared_folder_join_policy.deleter + def shared_folder_join_policy(self): + self._shared_folder_join_policy_value = None + self._shared_folder_join_policy_present = False + + def __repr__(self): + return 'TeamSharingPolicies(shared_folder_member_policy={!r}, shared_folder_join_policy={!r})'.format( + self._shared_folder_member_policy_value, + self._shared_folder_join_policy_value, + ) + +class UserSelectorArg(object): + """ + Argument for selecting a single user, either by team_member_id, external_id + or email. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def team_member_id(cls, val): + """ + Create an instance of this class set to the ``team_member_id`` tag with + value ``val``. + + :param str val: + :rtype: UserSelectorArg + """ + return cls('team_member_id', val) + + @classmethod + def external_id(cls, val): + """ + Create an instance of this class set to the ``external_id`` tag with + value ``val``. + + :param str val: + :rtype: UserSelectorArg + """ + return cls('external_id', val) + + @classmethod + def email(cls, val): + """ + Create an instance of this class set to the ``email`` tag with value + ``val``. + + :param str val: + :rtype: UserSelectorArg + """ + return cls('email', val) + + def is_team_member_id(self): + """ + Check if the union tag is ``team_member_id``. + + :rtype: bool + """ + return self._tag == 'team_member_id' + + def is_external_id(self): + """ + Check if the union tag is ``external_id``. + + :rtype: bool + """ + return self._tag == 'external_id' + + def is_email(self): + """ + Check if the union tag is ``email``. + + :rtype: bool + """ + return self._tag == 'email' + + def get_team_member_id(self): + """ + Only call this if :meth:`is_team_member_id` is true. + + :rtype: str + """ + if not self.is_team_member_id(): + raise AttributeError("tag 'team_member_id' not set") + return self._value + + def get_external_id(self): + """ + Only call this if :meth:`is_external_id` is true. + + :rtype: str + """ + if not self.is_external_id(): + raise AttributeError("tag 'external_id' not set") + return self._value + + def get_email(self): + """ + Only call this if :meth:`is_email` is true. + + :rtype: str + """ + if not self.is_email(): + raise AttributeError("tag 'email' not set") + return self._value + + def __repr__(self): + return 'UserSelectorArg(%r, %r)' % (self._tag, self._value) + +class UsersSelectorArg(object): + """ + Argument for selecting a list of users, either by team_member_ids, + external_ids or emails. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [str] team_member_ids: List of member IDs. + :ivar list of [str] external_ids: List of external user IDs. + :ivar list of [str] emails: List of email addresses. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def team_member_ids(cls, val): + """ + Create an instance of this class set to the ``team_member_ids`` tag with + value ``val``. + + :param list of [str] val: + :rtype: UsersSelectorArg + """ + return cls('team_member_ids', val) + + @classmethod + def external_ids(cls, val): + """ + Create an instance of this class set to the ``external_ids`` tag with + value ``val``. + + :param list of [str] val: + :rtype: UsersSelectorArg + """ + return cls('external_ids', val) + + @classmethod + def emails(cls, val): + """ + Create an instance of this class set to the ``emails`` tag with value + ``val``. + + :param list of [str] val: + :rtype: UsersSelectorArg + """ + return cls('emails', val) + + def is_team_member_ids(self): + """ + Check if the union tag is ``team_member_ids``. + + :rtype: bool + """ + return self._tag == 'team_member_ids' + + def is_external_ids(self): + """ + Check if the union tag is ``external_ids``. + + :rtype: bool + """ + return self._tag == 'external_ids' + + def is_emails(self): + """ + Check if the union tag is ``emails``. + + :rtype: bool + """ + return self._tag == 'emails' + + def get_team_member_ids(self): + """ + List of member IDs. + + Only call this if :meth:`is_team_member_ids` is true. + + :rtype: list of [str] + """ + if not self.is_team_member_ids(): + raise AttributeError("tag 'team_member_ids' not set") + return self._value + + def get_external_ids(self): + """ + List of external user IDs. + + Only call this if :meth:`is_external_ids` is true. + + :rtype: list of [str] + """ + if not self.is_external_ids(): + raise AttributeError("tag 'external_ids' not set") + return self._value + + def get_emails(self): + """ + List of email addresses. + + Only call this if :meth:`is_emails` is true. + + :rtype: list of [str] + """ + if not self.is_emails(): + raise AttributeError("tag 'emails' not set") + return self._value + + def __repr__(self): + return 'UsersSelectorArg(%r, %r)' % (self._tag, self._value) + +DeviceSession._session_id_validator = bv.String() +DeviceSession._ip_address_validator = bv.Nullable(bv.String()) +DeviceSession._country_validator = bv.Nullable(bv.String()) +DeviceSession._created_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +DeviceSession._updated_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +DeviceSession._all_field_names_ = set([ + 'session_id', + 'ip_address', + 'country', + 'created', + 'updated', +]) +DeviceSession._all_fields_ = [ + ('session_id', DeviceSession._session_id_validator), + ('ip_address', DeviceSession._ip_address_validator), + ('country', DeviceSession._country_validator), + ('created', DeviceSession._created_validator), + ('updated', DeviceSession._updated_validator), +] + +ActiveWebSession._user_agent_validator = bv.String() +ActiveWebSession._os_validator = bv.String() +ActiveWebSession._browser_validator = bv.String() +ActiveWebSession._all_field_names_ = DeviceSession._all_field_names_.union(set([ + 'user_agent', + 'os', + 'browser', +])) +ActiveWebSession._all_fields_ = DeviceSession._all_fields_ + [ + ('user_agent', ActiveWebSession._user_agent_validator), + ('os', ActiveWebSession._os_validator), + ('browser', ActiveWebSession._browser_validator), +] + +AdminTier._team_admin_validator = bv.Void() +AdminTier._user_management_admin_validator = bv.Void() +AdminTier._support_admin_validator = bv.Void() +AdminTier._member_only_validator = bv.Void() +AdminTier._tagmap = { + 'team_admin': AdminTier._team_admin_validator, + 'user_management_admin': AdminTier._user_management_admin_validator, + 'support_admin': AdminTier._support_admin_validator, + 'member_only': AdminTier._member_only_validator, +} + +AdminTier.team_admin = AdminTier('team_admin') +AdminTier.user_management_admin = AdminTier('user_management_admin') +AdminTier.support_admin = AdminTier('support_admin') +AdminTier.member_only = AdminTier('member_only') + +ApiApp._app_id_validator = bv.String() +ApiApp._app_name_validator = bv.String() +ApiApp._publisher_validator = bv.Nullable(bv.String()) +ApiApp._publisher_url_validator = bv.Nullable(bv.String()) +ApiApp._linked_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ')) +ApiApp._is_app_folder_validator = bv.Boolean() +ApiApp._all_field_names_ = set([ + 'app_id', + 'app_name', + 'publisher', + 'publisher_url', + 'linked', + 'is_app_folder', +]) +ApiApp._all_fields_ = [ + ('app_id', ApiApp._app_id_validator), + ('app_name', ApiApp._app_name_validator), + ('publisher', ApiApp._publisher_validator), + ('publisher_url', ApiApp._publisher_url_validator), + ('linked', ApiApp._linked_validator), + ('is_app_folder', ApiApp._is_app_folder_validator), +] + +BaseDfbReport._start_date_validator = bv.String() +BaseDfbReport._all_field_names_ = set(['start_date']) +BaseDfbReport._all_fields_ = [('start_date', BaseDfbReport._start_date_validator)] + +DateRange._start_date_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%d')) +DateRange._end_date_validator = bv.Nullable(bv.Timestamp(u'%Y-%m-%d')) +DateRange._all_field_names_ = set([ + 'start_date', + 'end_date', +]) +DateRange._all_fields_ = [ + ('start_date', DateRange._start_date_validator), + ('end_date', DateRange._end_date_validator), +] + +DateRangeError._other_validator = bv.Void() +DateRangeError._tagmap = { + 'other': DateRangeError._other_validator, +} + +DateRangeError.other = DateRangeError('other') + +DesktopClientSession._host_name_validator = bv.String() +DesktopClientSession._client_type_validator = bv.Union(DesktopPlatform) +DesktopClientSession._client_version_validator = bv.String() +DesktopClientSession._platform_validator = bv.String() +DesktopClientSession._is_delete_on_unlink_supported_validator = bv.Boolean() +DesktopClientSession._all_field_names_ = DeviceSession._all_field_names_.union(set([ + 'host_name', + 'client_type', + 'client_version', + 'platform', + 'is_delete_on_unlink_supported', +])) +DesktopClientSession._all_fields_ = DeviceSession._all_fields_ + [ + ('host_name', DesktopClientSession._host_name_validator), + ('client_type', DesktopClientSession._client_type_validator), + ('client_version', DesktopClientSession._client_version_validator), + ('platform', DesktopClientSession._platform_validator), + ('is_delete_on_unlink_supported', DesktopClientSession._is_delete_on_unlink_supported_validator), +] + +DesktopPlatform._windows_validator = bv.Void() +DesktopPlatform._mac_validator = bv.Void() +DesktopPlatform._linux_validator = bv.Void() +DesktopPlatform._other_validator = bv.Void() +DesktopPlatform._tagmap = { + 'windows': DesktopPlatform._windows_validator, + 'mac': DesktopPlatform._mac_validator, + 'linux': DesktopPlatform._linux_validator, + 'other': DesktopPlatform._other_validator, +} + +DesktopPlatform.windows = DesktopPlatform('windows') +DesktopPlatform.mac = DesktopPlatform('mac') +DesktopPlatform.linux = DesktopPlatform('linux') +DesktopPlatform.other = DesktopPlatform('other') + +DeviceSessionArg._session_id_validator = bv.String() +DeviceSessionArg._team_member_id_validator = bv.String() +DeviceSessionArg._all_field_names_ = set([ + 'session_id', + 'team_member_id', +]) +DeviceSessionArg._all_fields_ = [ + ('session_id', DeviceSessionArg._session_id_validator), + ('team_member_id', DeviceSessionArg._team_member_id_validator), +] + +DevicesActive._windows_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._macos_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._linux_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._ios_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._android_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._other_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._total_validator = bv.List(bv.Nullable(bv.UInt64())) +DevicesActive._all_field_names_ = set([ + 'windows', + 'macos', + 'linux', + 'ios', + 'android', + 'other', + 'total', +]) +DevicesActive._all_fields_ = [ + ('windows', DevicesActive._windows_validator), + ('macos', DevicesActive._macos_validator), + ('linux', DevicesActive._linux_validator), + ('ios', DevicesActive._ios_validator), + ('android', DevicesActive._android_validator), + ('other', DevicesActive._other_validator), + ('total', DevicesActive._total_validator), +] + +EmmState._disabled_validator = bv.Void() +EmmState._optional_validator = bv.Void() +EmmState._required_validator = bv.Void() +EmmState._other_validator = bv.Void() +EmmState._tagmap = { + 'disabled': EmmState._disabled_validator, + 'optional': EmmState._optional_validator, + 'required': EmmState._required_validator, + 'other': EmmState._other_validator, +} + +EmmState.disabled = EmmState('disabled') +EmmState.optional = EmmState('optional') +EmmState.required = EmmState('required') +EmmState.other = EmmState('other') + +GetActivityReport._adds_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._edits_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._deletes_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._active_users_28_day_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._active_users_7_day_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._active_users_1_day_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._active_shared_folders_28_day_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._active_shared_folders_7_day_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._active_shared_folders_1_day_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._shared_links_created_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._shared_links_viewed_by_team_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._shared_links_viewed_by_outside_user_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._shared_links_viewed_by_not_logged_in_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._shared_links_viewed_total_validator = bv.List(bv.Nullable(bv.UInt64())) +GetActivityReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'adds', + 'edits', + 'deletes', + 'active_users_28_day', + 'active_users_7_day', + 'active_users_1_day', + 'active_shared_folders_28_day', + 'active_shared_folders_7_day', + 'active_shared_folders_1_day', + 'shared_links_created', + 'shared_links_viewed_by_team', + 'shared_links_viewed_by_outside_user', + 'shared_links_viewed_by_not_logged_in', + 'shared_links_viewed_total', +])) +GetActivityReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('adds', GetActivityReport._adds_validator), + ('edits', GetActivityReport._edits_validator), + ('deletes', GetActivityReport._deletes_validator), + ('active_users_28_day', GetActivityReport._active_users_28_day_validator), + ('active_users_7_day', GetActivityReport._active_users_7_day_validator), + ('active_users_1_day', GetActivityReport._active_users_1_day_validator), + ('active_shared_folders_28_day', GetActivityReport._active_shared_folders_28_day_validator), + ('active_shared_folders_7_day', GetActivityReport._active_shared_folders_7_day_validator), + ('active_shared_folders_1_day', GetActivityReport._active_shared_folders_1_day_validator), + ('shared_links_created', GetActivityReport._shared_links_created_validator), + ('shared_links_viewed_by_team', GetActivityReport._shared_links_viewed_by_team_validator), + ('shared_links_viewed_by_outside_user', GetActivityReport._shared_links_viewed_by_outside_user_validator), + ('shared_links_viewed_by_not_logged_in', GetActivityReport._shared_links_viewed_by_not_logged_in_validator), + ('shared_links_viewed_total', GetActivityReport._shared_links_viewed_total_validator), +] + +GetDevicesReport._active_1_day_validator = bv.Struct(DevicesActive) +GetDevicesReport._active_7_day_validator = bv.Struct(DevicesActive) +GetDevicesReport._active_28_day_validator = bv.Struct(DevicesActive) +GetDevicesReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'active_1_day', + 'active_7_day', + 'active_28_day', +])) +GetDevicesReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('active_1_day', GetDevicesReport._active_1_day_validator), + ('active_7_day', GetDevicesReport._active_7_day_validator), + ('active_28_day', GetDevicesReport._active_28_day_validator), +] + +GetMembershipReport._team_size_validator = bv.List(bv.Nullable(bv.UInt64())) +GetMembershipReport._pending_invites_validator = bv.List(bv.Nullable(bv.UInt64())) +GetMembershipReport._members_joined_validator = bv.List(bv.Nullable(bv.UInt64())) +GetMembershipReport._suspended_members_validator = bv.List(bv.Nullable(bv.UInt64())) +GetMembershipReport._licenses_validator = bv.List(bv.Nullable(bv.UInt64())) +GetMembershipReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'team_size', + 'pending_invites', + 'members_joined', + 'suspended_members', + 'licenses', +])) +GetMembershipReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('team_size', GetMembershipReport._team_size_validator), + ('pending_invites', GetMembershipReport._pending_invites_validator), + ('members_joined', GetMembershipReport._members_joined_validator), + ('suspended_members', GetMembershipReport._suspended_members_validator), + ('licenses', GetMembershipReport._licenses_validator), +] + +GetStorageReport._total_usage_validator = bv.List(bv.Nullable(bv.UInt64())) +GetStorageReport._shared_usage_validator = bv.List(bv.Nullable(bv.UInt64())) +GetStorageReport._unshared_usage_validator = bv.List(bv.Nullable(bv.UInt64())) +GetStorageReport._shared_folders_validator = bv.List(bv.Nullable(bv.UInt64())) +GetStorageReport._member_storage_map_validator = bv.List(bv.List(bv.Struct(StorageBucket))) +GetStorageReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'total_usage', + 'shared_usage', + 'unshared_usage', + 'shared_folders', + 'member_storage_map', +])) +GetStorageReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('total_usage', GetStorageReport._total_usage_validator), + ('shared_usage', GetStorageReport._shared_usage_validator), + ('unshared_usage', GetStorageReport._unshared_usage_validator), + ('shared_folders', GetStorageReport._shared_folders_validator), + ('member_storage_map', GetStorageReport._member_storage_map_validator), +] + +GroupAccessType._member_validator = bv.Void() +GroupAccessType._owner_validator = bv.Void() +GroupAccessType._tagmap = { + 'member': GroupAccessType._member_validator, + 'owner': GroupAccessType._owner_validator, +} + +GroupAccessType.member = GroupAccessType('member') +GroupAccessType.owner = GroupAccessType('owner') + +GroupCreateArg._group_name_validator = bv.String() +GroupCreateArg._group_external_id_validator = bv.Nullable(bv.String()) +GroupCreateArg._all_field_names_ = set([ + 'group_name', + 'group_external_id', +]) +GroupCreateArg._all_fields_ = [ + ('group_name', GroupCreateArg._group_name_validator), + ('group_external_id', GroupCreateArg._group_external_id_validator), +] + +GroupCreateError._group_name_already_used_validator = bv.Void() +GroupCreateError._group_name_invalid_validator = bv.Void() +GroupCreateError._external_id_already_in_use_validator = bv.Void() +GroupCreateError._other_validator = bv.Void() +GroupCreateError._tagmap = { + 'group_name_already_used': GroupCreateError._group_name_already_used_validator, + 'group_name_invalid': GroupCreateError._group_name_invalid_validator, + 'external_id_already_in_use': GroupCreateError._external_id_already_in_use_validator, + 'other': GroupCreateError._other_validator, +} + +GroupCreateError.group_name_already_used = GroupCreateError('group_name_already_used') +GroupCreateError.group_name_invalid = GroupCreateError('group_name_invalid') +GroupCreateError.external_id_already_in_use = GroupCreateError('external_id_already_in_use') +GroupCreateError.other = GroupCreateError('other') + +GroupSelectorError._group_not_found_validator = bv.Void() +GroupSelectorError._other_validator = bv.Void() +GroupSelectorError._tagmap = { + 'group_not_found': GroupSelectorError._group_not_found_validator, + 'other': GroupSelectorError._other_validator, +} + +GroupSelectorError.group_not_found = GroupSelectorError('group_not_found') +GroupSelectorError.other = GroupSelectorError('other') + +GroupDeleteError._group_already_deleted_validator = bv.Void() +GroupDeleteError._tagmap = { + 'group_already_deleted': GroupDeleteError._group_already_deleted_validator, +} +GroupDeleteError._tagmap.update(GroupSelectorError._tagmap) + +GroupDeleteError.group_already_deleted = GroupDeleteError('group_already_deleted') + +GroupSummary._group_name_validator = bv.String() +GroupSummary._group_id_validator = bv.String() +GroupSummary._group_external_id_validator = bv.Nullable(bv.String()) +GroupSummary._member_count_validator = bv.UInt32() +GroupSummary._all_field_names_ = set([ + 'group_name', + 'group_id', + 'group_external_id', + 'member_count', +]) +GroupSummary._all_fields_ = [ + ('group_name', GroupSummary._group_name_validator), + ('group_id', GroupSummary._group_id_validator), + ('group_external_id', GroupSummary._group_external_id_validator), + ('member_count', GroupSummary._member_count_validator), +] + +GroupFullInfo._members_validator = bv.List(bv.Struct(GroupMemberInfo)) +GroupFullInfo._created_validator = bv.UInt64() +GroupFullInfo._all_field_names_ = GroupSummary._all_field_names_.union(set([ + 'members', + 'created', +])) +GroupFullInfo._all_fields_ = GroupSummary._all_fields_ + [ + ('members', GroupFullInfo._members_validator), + ('created', GroupFullInfo._created_validator), +] + +GroupMemberInfo._profile_validator = bv.Struct(MemberProfile) +GroupMemberInfo._access_type_validator = bv.Union(GroupAccessType) +GroupMemberInfo._all_field_names_ = set([ + 'profile', + 'access_type', +]) +GroupMemberInfo._all_fields_ = [ + ('profile', GroupMemberInfo._profile_validator), + ('access_type', GroupMemberInfo._access_type_validator), +] + +GroupMemberSelector._group_validator = bv.Union(GroupSelector) +GroupMemberSelector._user_validator = bv.Union(UserSelectorArg) +GroupMemberSelector._all_field_names_ = set([ + 'group', + 'user', +]) +GroupMemberSelector._all_fields_ = [ + ('group', GroupMemberSelector._group_validator), + ('user', GroupMemberSelector._user_validator), +] + +GroupMemberSelectorError._member_not_in_group_validator = bv.Void() +GroupMemberSelectorError._tagmap = { + 'member_not_in_group': GroupMemberSelectorError._member_not_in_group_validator, +} +GroupMemberSelectorError._tagmap.update(GroupSelectorError._tagmap) + +GroupMemberSelectorError.member_not_in_group = GroupMemberSelectorError('member_not_in_group') + +GroupMembersAddArg._group_validator = bv.Union(GroupSelector) +GroupMembersAddArg._members_validator = bv.List(bv.Struct(MemberAccess)) +GroupMembersAddArg._all_field_names_ = set([ + 'group', + 'members', +]) +GroupMembersAddArg._all_fields_ = [ + ('group', GroupMembersAddArg._group_validator), + ('members', GroupMembersAddArg._members_validator), +] + +GroupMembersAddError._duplicate_user_validator = bv.Void() +GroupMembersAddError._group_not_in_team_validator = bv.Void() +GroupMembersAddError._members_not_in_team_validator = bv.List(bv.String()) +GroupMembersAddError._users_not_found_validator = bv.List(bv.String()) +GroupMembersAddError._user_must_be_active_to_be_owner_validator = bv.Void() +GroupMembersAddError._tagmap = { + 'duplicate_user': GroupMembersAddError._duplicate_user_validator, + 'group_not_in_team': GroupMembersAddError._group_not_in_team_validator, + 'members_not_in_team': GroupMembersAddError._members_not_in_team_validator, + 'users_not_found': GroupMembersAddError._users_not_found_validator, + 'user_must_be_active_to_be_owner': GroupMembersAddError._user_must_be_active_to_be_owner_validator, +} +GroupMembersAddError._tagmap.update(GroupSelectorError._tagmap) + +GroupMembersAddError.duplicate_user = GroupMembersAddError('duplicate_user') +GroupMembersAddError.group_not_in_team = GroupMembersAddError('group_not_in_team') +GroupMembersAddError.user_must_be_active_to_be_owner = GroupMembersAddError('user_must_be_active_to_be_owner') + +GroupMembersChangeResult._group_info_validator = bv.Struct(GroupFullInfo) +GroupMembersChangeResult._async_job_id_validator = bv.String(min_length=1) +GroupMembersChangeResult._all_field_names_ = set([ + 'group_info', + 'async_job_id', +]) +GroupMembersChangeResult._all_fields_ = [ + ('group_info', GroupMembersChangeResult._group_info_validator), + ('async_job_id', GroupMembersChangeResult._async_job_id_validator), +] + +GroupMembersRemoveArg._group_validator = bv.Union(GroupSelector) +GroupMembersRemoveArg._users_validator = bv.List(bv.Union(UserSelectorArg)) +GroupMembersRemoveArg._all_field_names_ = set([ + 'group', + 'users', +]) +GroupMembersRemoveArg._all_fields_ = [ + ('group', GroupMembersRemoveArg._group_validator), + ('users', GroupMembersRemoveArg._users_validator), +] + +GroupMembersSelectorError._member_not_in_group_validator = bv.Void() +GroupMembersSelectorError._tagmap = { + 'member_not_in_group': GroupMembersSelectorError._member_not_in_group_validator, +} +GroupMembersSelectorError._tagmap.update(GroupSelectorError._tagmap) + +GroupMembersSelectorError.member_not_in_group = GroupMembersSelectorError('member_not_in_group') + +GroupMembersRemoveError._group_not_in_team_validator = bv.Void() +GroupMembersRemoveError._tagmap = { + 'group_not_in_team': GroupMembersRemoveError._group_not_in_team_validator, +} +GroupMembersRemoveError._tagmap.update(GroupMembersSelectorError._tagmap) + +GroupMembersRemoveError.group_not_in_team = GroupMembersRemoveError('group_not_in_team') + +GroupMembersSelector._group_validator = bv.Union(GroupSelector) +GroupMembersSelector._users_validator = bv.Union(UsersSelectorArg) +GroupMembersSelector._all_field_names_ = set([ + 'group', + 'users', +]) +GroupMembersSelector._all_fields_ = [ + ('group', GroupMembersSelector._group_validator), + ('users', GroupMembersSelector._users_validator), +] + +GroupMembersSetAccessTypeArg._access_type_validator = bv.Union(GroupAccessType) +GroupMembersSetAccessTypeArg._all_field_names_ = GroupMemberSelector._all_field_names_.union(set(['access_type'])) +GroupMembersSetAccessTypeArg._all_fields_ = GroupMemberSelector._all_fields_ + [('access_type', GroupMembersSetAccessTypeArg._access_type_validator)] + +GroupSelector._group_id_validator = bv.String() +GroupSelector._group_external_id_validator = bv.String() +GroupSelector._tagmap = { + 'group_id': GroupSelector._group_id_validator, + 'group_external_id': GroupSelector._group_external_id_validator, +} + +GroupUpdateArgs._group_validator = bv.Union(GroupSelector) +GroupUpdateArgs._new_group_name_validator = bv.Nullable(bv.String()) +GroupUpdateArgs._new_group_external_id_validator = bv.Nullable(bv.String()) +GroupUpdateArgs._all_field_names_ = set([ + 'group', + 'new_group_name', + 'new_group_external_id', +]) +GroupUpdateArgs._all_fields_ = [ + ('group', GroupUpdateArgs._group_validator), + ('new_group_name', GroupUpdateArgs._new_group_name_validator), + ('new_group_external_id', GroupUpdateArgs._new_group_external_id_validator), +] + +GroupUpdateError._external_id_already_in_use_validator = bv.Void() +GroupUpdateError._tagmap = { + 'external_id_already_in_use': GroupUpdateError._external_id_already_in_use_validator, +} +GroupUpdateError._tagmap.update(GroupSelectorError._tagmap) + +GroupUpdateError.external_id_already_in_use = GroupUpdateError('external_id_already_in_use') + +GroupsGetInfoError._group_not_on_team_validator = bv.Void() +GroupsGetInfoError._other_validator = bv.Void() +GroupsGetInfoError._tagmap = { + 'group_not_on_team': GroupsGetInfoError._group_not_on_team_validator, + 'other': GroupsGetInfoError._other_validator, +} + +GroupsGetInfoError.group_not_on_team = GroupsGetInfoError('group_not_on_team') +GroupsGetInfoError.other = GroupsGetInfoError('other') + +GroupsGetInfoItem._id_not_found_validator = bv.String() +GroupsGetInfoItem._group_info_validator = bv.Struct(GroupFullInfo) +GroupsGetInfoItem._tagmap = { + 'id_not_found': GroupsGetInfoItem._id_not_found_validator, + 'group_info': GroupsGetInfoItem._group_info_validator, +} + +GroupsListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +GroupsListArg._all_field_names_ = set(['limit']) +GroupsListArg._all_fields_ = [('limit', GroupsListArg._limit_validator)] + +GroupsListContinueArg._cursor_validator = bv.String() +GroupsListContinueArg._all_field_names_ = set(['cursor']) +GroupsListContinueArg._all_fields_ = [('cursor', GroupsListContinueArg._cursor_validator)] + +GroupsListContinueError._invalid_cursor_validator = bv.Void() +GroupsListContinueError._other_validator = bv.Void() +GroupsListContinueError._tagmap = { + 'invalid_cursor': GroupsListContinueError._invalid_cursor_validator, + 'other': GroupsListContinueError._other_validator, +} + +GroupsListContinueError.invalid_cursor = GroupsListContinueError('invalid_cursor') +GroupsListContinueError.other = GroupsListContinueError('other') + +GroupsListResult._groups_validator = bv.List(bv.Struct(GroupSummary)) +GroupsListResult._cursor_validator = bv.String() +GroupsListResult._has_more_validator = bv.Boolean() +GroupsListResult._all_field_names_ = set([ + 'groups', + 'cursor', + 'has_more', +]) +GroupsListResult._all_fields_ = [ + ('groups', GroupsListResult._groups_validator), + ('cursor', GroupsListResult._cursor_validator), + ('has_more', GroupsListResult._has_more_validator), +] + +GroupsPollError._access_denied_validator = bv.Void() +GroupsPollError._tagmap = { + 'access_denied': GroupsPollError._access_denied_validator, +} +GroupsPollError._tagmap.update(async.PollError._tagmap) + +GroupsPollError.access_denied = GroupsPollError('access_denied') + +GroupsSelector._group_ids_validator = bv.List(bv.String()) +GroupsSelector._group_external_ids_validator = bv.List(bv.String()) +GroupsSelector._tagmap = { + 'group_ids': GroupsSelector._group_ids_validator, + 'group_external_ids': GroupsSelector._group_external_ids_validator, +} + +ListMemberAppsArg._team_member_id_validator = bv.String() +ListMemberAppsArg._all_field_names_ = set(['team_member_id']) +ListMemberAppsArg._all_fields_ = [('team_member_id', ListMemberAppsArg._team_member_id_validator)] + +ListMemberAppsError._member_not_found_validator = bv.Void() +ListMemberAppsError._other_validator = bv.Void() +ListMemberAppsError._tagmap = { + 'member_not_found': ListMemberAppsError._member_not_found_validator, + 'other': ListMemberAppsError._other_validator, +} + +ListMemberAppsError.member_not_found = ListMemberAppsError('member_not_found') +ListMemberAppsError.other = ListMemberAppsError('other') + +ListMemberAppsResult._linked_api_apps_validator = bv.List(bv.Struct(ApiApp)) +ListMemberAppsResult._all_field_names_ = set(['linked_api_apps']) +ListMemberAppsResult._all_fields_ = [('linked_api_apps', ListMemberAppsResult._linked_api_apps_validator)] + +ListMemberDevicesArg._team_member_id_validator = bv.String() +ListMemberDevicesArg._include_web_sessions_validator = bv.Boolean() +ListMemberDevicesArg._include_desktop_clients_validator = bv.Boolean() +ListMemberDevicesArg._include_mobile_clients_validator = bv.Boolean() +ListMemberDevicesArg._all_field_names_ = set([ + 'team_member_id', + 'include_web_sessions', + 'include_desktop_clients', + 'include_mobile_clients', +]) +ListMemberDevicesArg._all_fields_ = [ + ('team_member_id', ListMemberDevicesArg._team_member_id_validator), + ('include_web_sessions', ListMemberDevicesArg._include_web_sessions_validator), + ('include_desktop_clients', ListMemberDevicesArg._include_desktop_clients_validator), + ('include_mobile_clients', ListMemberDevicesArg._include_mobile_clients_validator), +] + +ListMemberDevicesError._member_not_found_validator = bv.Void() +ListMemberDevicesError._other_validator = bv.Void() +ListMemberDevicesError._tagmap = { + 'member_not_found': ListMemberDevicesError._member_not_found_validator, + 'other': ListMemberDevicesError._other_validator, +} + +ListMemberDevicesError.member_not_found = ListMemberDevicesError('member_not_found') +ListMemberDevicesError.other = ListMemberDevicesError('other') + +ListMemberDevicesResult._active_web_sessions_validator = bv.Nullable(bv.List(bv.Struct(ActiveWebSession))) +ListMemberDevicesResult._desktop_client_sessions_validator = bv.Nullable(bv.List(bv.Struct(DesktopClientSession))) +ListMemberDevicesResult._mobile_client_sessions_validator = bv.Nullable(bv.List(bv.Struct(MobileClientSession))) +ListMemberDevicesResult._all_field_names_ = set([ + 'active_web_sessions', + 'desktop_client_sessions', + 'mobile_client_sessions', +]) +ListMemberDevicesResult._all_fields_ = [ + ('active_web_sessions', ListMemberDevicesResult._active_web_sessions_validator), + ('desktop_client_sessions', ListMemberDevicesResult._desktop_client_sessions_validator), + ('mobile_client_sessions', ListMemberDevicesResult._mobile_client_sessions_validator), +] + +ListTeamAppsArg._cursor_validator = bv.Nullable(bv.String()) +ListTeamAppsArg._all_field_names_ = set(['cursor']) +ListTeamAppsArg._all_fields_ = [('cursor', ListTeamAppsArg._cursor_validator)] + +ListTeamAppsError._reset_validator = bv.Void() +ListTeamAppsError._other_validator = bv.Void() +ListTeamAppsError._tagmap = { + 'reset': ListTeamAppsError._reset_validator, + 'other': ListTeamAppsError._other_validator, +} + +ListTeamAppsError.reset = ListTeamAppsError('reset') +ListTeamAppsError.other = ListTeamAppsError('other') + +ListTeamAppsResult._apps_validator = bv.List(bv.Struct(MemberLinkedApps)) +ListTeamAppsResult._has_more_validator = bv.Boolean() +ListTeamAppsResult._cursor_validator = bv.Nullable(bv.String()) +ListTeamAppsResult._all_field_names_ = set([ + 'apps', + 'has_more', + 'cursor', +]) +ListTeamAppsResult._all_fields_ = [ + ('apps', ListTeamAppsResult._apps_validator), + ('has_more', ListTeamAppsResult._has_more_validator), + ('cursor', ListTeamAppsResult._cursor_validator), +] + +ListTeamDevicesArg._cursor_validator = bv.Nullable(bv.String()) +ListTeamDevicesArg._include_web_sessions_validator = bv.Boolean() +ListTeamDevicesArg._include_desktop_clients_validator = bv.Boolean() +ListTeamDevicesArg._include_mobile_clients_validator = bv.Boolean() +ListTeamDevicesArg._all_field_names_ = set([ + 'cursor', + 'include_web_sessions', + 'include_desktop_clients', + 'include_mobile_clients', +]) +ListTeamDevicesArg._all_fields_ = [ + ('cursor', ListTeamDevicesArg._cursor_validator), + ('include_web_sessions', ListTeamDevicesArg._include_web_sessions_validator), + ('include_desktop_clients', ListTeamDevicesArg._include_desktop_clients_validator), + ('include_mobile_clients', ListTeamDevicesArg._include_mobile_clients_validator), +] + +ListTeamDevicesError._reset_validator = bv.Void() +ListTeamDevicesError._other_validator = bv.Void() +ListTeamDevicesError._tagmap = { + 'reset': ListTeamDevicesError._reset_validator, + 'other': ListTeamDevicesError._other_validator, +} + +ListTeamDevicesError.reset = ListTeamDevicesError('reset') +ListTeamDevicesError.other = ListTeamDevicesError('other') + +ListTeamDevicesResult._devices_validator = bv.List(bv.Struct(MemberDevices)) +ListTeamDevicesResult._has_more_validator = bv.Boolean() +ListTeamDevicesResult._cursor_validator = bv.Nullable(bv.String()) +ListTeamDevicesResult._all_field_names_ = set([ + 'devices', + 'has_more', + 'cursor', +]) +ListTeamDevicesResult._all_fields_ = [ + ('devices', ListTeamDevicesResult._devices_validator), + ('has_more', ListTeamDevicesResult._has_more_validator), + ('cursor', ListTeamDevicesResult._cursor_validator), +] + +MemberAccess._user_validator = bv.Union(UserSelectorArg) +MemberAccess._access_type_validator = bv.Union(GroupAccessType) +MemberAccess._all_field_names_ = set([ + 'user', + 'access_type', +]) +MemberAccess._all_fields_ = [ + ('user', MemberAccess._user_validator), + ('access_type', MemberAccess._access_type_validator), +] + +MemberAddArg._member_email_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddArg._member_given_name_validator = bv.String(min_length=1, pattern=u'[^/:?*<>"|]*') +MemberAddArg._member_surname_validator = bv.String(min_length=1, pattern=u'[^/:?*<>"|]*') +MemberAddArg._member_external_id_validator = bv.Nullable(bv.String(max_length=64)) +MemberAddArg._send_welcome_email_validator = bv.Boolean() +MemberAddArg._role_validator = bv.Union(AdminTier) +MemberAddArg._all_field_names_ = set([ + 'member_email', + 'member_given_name', + 'member_surname', + 'member_external_id', + 'send_welcome_email', + 'role', +]) +MemberAddArg._all_fields_ = [ + ('member_email', MemberAddArg._member_email_validator), + ('member_given_name', MemberAddArg._member_given_name_validator), + ('member_surname', MemberAddArg._member_surname_validator), + ('member_external_id', MemberAddArg._member_external_id_validator), + ('send_welcome_email', MemberAddArg._send_welcome_email_validator), + ('role', MemberAddArg._role_validator), +] + +MemberAddResult._success_validator = bv.Struct(TeamMemberInfo) +MemberAddResult._team_license_limit_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._free_team_member_limit_reached_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._user_already_on_team_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._user_on_another_team_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._user_already_paired_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._user_migration_failed_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._duplicate_external_member_id_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._user_creation_failed_validator = bv.String(pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*.[A-Za-z]{2,15}$") +MemberAddResult._tagmap = { + 'success': MemberAddResult._success_validator, + 'team_license_limit': MemberAddResult._team_license_limit_validator, + 'free_team_member_limit_reached': MemberAddResult._free_team_member_limit_reached_validator, + 'user_already_on_team': MemberAddResult._user_already_on_team_validator, + 'user_on_another_team': MemberAddResult._user_on_another_team_validator, + 'user_already_paired': MemberAddResult._user_already_paired_validator, + 'user_migration_failed': MemberAddResult._user_migration_failed_validator, + 'duplicate_external_member_id': MemberAddResult._duplicate_external_member_id_validator, + 'user_creation_failed': MemberAddResult._user_creation_failed_validator, +} + +MemberDevices._team_member_id_validator = bv.String() +MemberDevices._web_sessions_validator = bv.Nullable(bv.List(bv.Struct(ActiveWebSession))) +MemberDevices._desktop_clients_validator = bv.Nullable(bv.List(bv.Struct(DesktopClientSession))) +MemberDevices._mobile_clients_validator = bv.Nullable(bv.List(bv.Struct(MobileClientSession))) +MemberDevices._all_field_names_ = set([ + 'team_member_id', + 'web_sessions', + 'desktop_clients', + 'mobile_clients', +]) +MemberDevices._all_fields_ = [ + ('team_member_id', MemberDevices._team_member_id_validator), + ('web_sessions', MemberDevices._web_sessions_validator), + ('desktop_clients', MemberDevices._desktop_clients_validator), + ('mobile_clients', MemberDevices._mobile_clients_validator), +] + +MemberLinkedApps._team_member_id_validator = bv.String() +MemberLinkedApps._linked_api_apps_validator = bv.List(bv.Struct(ApiApp)) +MemberLinkedApps._all_field_names_ = set([ + 'team_member_id', + 'linked_api_apps', +]) +MemberLinkedApps._all_fields_ = [ + ('team_member_id', MemberLinkedApps._team_member_id_validator), + ('linked_api_apps', MemberLinkedApps._linked_api_apps_validator), +] + +MemberProfile._team_member_id_validator = bv.String() +MemberProfile._external_id_validator = bv.Nullable(bv.String()) +MemberProfile._email_validator = bv.String() +MemberProfile._email_verified_validator = bv.Boolean() +MemberProfile._status_validator = bv.Union(TeamMemberStatus) +MemberProfile._name_validator = bv.Struct(users.Name) +MemberProfile._all_field_names_ = set([ + 'team_member_id', + 'external_id', + 'email', + 'email_verified', + 'status', + 'name', +]) +MemberProfile._all_fields_ = [ + ('team_member_id', MemberProfile._team_member_id_validator), + ('external_id', MemberProfile._external_id_validator), + ('email', MemberProfile._email_validator), + ('email_verified', MemberProfile._email_verified_validator), + ('status', MemberProfile._status_validator), + ('name', MemberProfile._name_validator), +] + +UserSelectorError._user_not_found_validator = bv.Void() +UserSelectorError._tagmap = { + 'user_not_found': UserSelectorError._user_not_found_validator, +} + +UserSelectorError.user_not_found = UserSelectorError('user_not_found') + +MemberSelectorError._user_not_in_team_validator = bv.Void() +MemberSelectorError._tagmap = { + 'user_not_in_team': MemberSelectorError._user_not_in_team_validator, +} +MemberSelectorError._tagmap.update(UserSelectorError._tagmap) + +MemberSelectorError.user_not_in_team = MemberSelectorError('user_not_in_team') + +MembersAddArg._new_members_validator = bv.List(bv.Struct(MemberAddArg)) +MembersAddArg._force_async_validator = bv.Boolean() +MembersAddArg._all_field_names_ = set([ + 'new_members', + 'force_async', +]) +MembersAddArg._all_fields_ = [ + ('new_members', MembersAddArg._new_members_validator), + ('force_async', MembersAddArg._force_async_validator), +] + +MembersAddJobStatus._complete_validator = bv.List(bv.Union(MemberAddResult)) +MembersAddJobStatus._failed_validator = bv.String() +MembersAddJobStatus._tagmap = { + 'complete': MembersAddJobStatus._complete_validator, + 'failed': MembersAddJobStatus._failed_validator, +} +MembersAddJobStatus._tagmap.update(async.PollResultBase._tagmap) + +MembersAddLaunch._complete_validator = bv.List(bv.Union(MemberAddResult)) +MembersAddLaunch._tagmap = { + 'complete': MembersAddLaunch._complete_validator, +} +MembersAddLaunch._tagmap.update(async.LaunchResultBase._tagmap) + +MembersDeactivateArg._user_validator = bv.Union(UserSelectorArg) +MembersDeactivateArg._wipe_data_validator = bv.Boolean() +MembersDeactivateArg._all_field_names_ = set([ + 'user', + 'wipe_data', +]) +MembersDeactivateArg._all_fields_ = [ + ('user', MembersDeactivateArg._user_validator), + ('wipe_data', MembersDeactivateArg._wipe_data_validator), +] + +MembersDeactivateError._user_not_in_team_validator = bv.Void() +MembersDeactivateError._other_validator = bv.Void() +MembersDeactivateError._tagmap = { + 'user_not_in_team': MembersDeactivateError._user_not_in_team_validator, + 'other': MembersDeactivateError._other_validator, +} +MembersDeactivateError._tagmap.update(UserSelectorError._tagmap) + +MembersDeactivateError.user_not_in_team = MembersDeactivateError('user_not_in_team') +MembersDeactivateError.other = MembersDeactivateError('other') + +MembersGetInfoArgs._members_validator = bv.List(bv.Union(UserSelectorArg)) +MembersGetInfoArgs._all_field_names_ = set(['members']) +MembersGetInfoArgs._all_fields_ = [('members', MembersGetInfoArgs._members_validator)] + +MembersGetInfoError._other_validator = bv.Void() +MembersGetInfoError._tagmap = { + 'other': MembersGetInfoError._other_validator, +} + +MembersGetInfoError.other = MembersGetInfoError('other') + +MembersGetInfoItem._id_not_found_validator = bv.String() +MembersGetInfoItem._member_info_validator = bv.Struct(TeamMemberInfo) +MembersGetInfoItem._tagmap = { + 'id_not_found': MembersGetInfoItem._id_not_found_validator, + 'member_info': MembersGetInfoItem._member_info_validator, +} + +MembersListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +MembersListArg._all_field_names_ = set(['limit']) +MembersListArg._all_fields_ = [('limit', MembersListArg._limit_validator)] + +MembersListContinueArg._cursor_validator = bv.String() +MembersListContinueArg._all_field_names_ = set(['cursor']) +MembersListContinueArg._all_fields_ = [('cursor', MembersListContinueArg._cursor_validator)] + +MembersListContinueError._invalid_cursor_validator = bv.Void() +MembersListContinueError._other_validator = bv.Void() +MembersListContinueError._tagmap = { + 'invalid_cursor': MembersListContinueError._invalid_cursor_validator, + 'other': MembersListContinueError._other_validator, +} + +MembersListContinueError.invalid_cursor = MembersListContinueError('invalid_cursor') +MembersListContinueError.other = MembersListContinueError('other') + +MembersListError._other_validator = bv.Void() +MembersListError._tagmap = { + 'other': MembersListError._other_validator, +} + +MembersListError.other = MembersListError('other') + +MembersListResult._members_validator = bv.List(bv.Struct(TeamMemberInfo)) +MembersListResult._cursor_validator = bv.String() +MembersListResult._has_more_validator = bv.Boolean() +MembersListResult._all_field_names_ = set([ + 'members', + 'cursor', + 'has_more', +]) +MembersListResult._all_fields_ = [ + ('members', MembersListResult._members_validator), + ('cursor', MembersListResult._cursor_validator), + ('has_more', MembersListResult._has_more_validator), +] + +MembersRemoveArg._transfer_dest_id_validator = bv.Nullable(bv.Union(UserSelectorArg)) +MembersRemoveArg._transfer_admin_id_validator = bv.Nullable(bv.Union(UserSelectorArg)) +MembersRemoveArg._all_field_names_ = MembersDeactivateArg._all_field_names_.union(set([ + 'transfer_dest_id', + 'transfer_admin_id', +])) +MembersRemoveArg._all_fields_ = MembersDeactivateArg._all_fields_ + [ + ('transfer_dest_id', MembersRemoveArg._transfer_dest_id_validator), + ('transfer_admin_id', MembersRemoveArg._transfer_admin_id_validator), +] + +MembersRemoveError._remove_last_admin_validator = bv.Void() +MembersRemoveError._removed_and_transfer_dest_should_differ_validator = bv.Void() +MembersRemoveError._removed_and_transfer_admin_should_differ_validator = bv.Void() +MembersRemoveError._transfer_dest_user_not_found_validator = bv.Void() +MembersRemoveError._transfer_dest_user_not_in_team_validator = bv.Void() +MembersRemoveError._transfer_admin_user_not_found_validator = bv.Void() +MembersRemoveError._transfer_admin_user_not_in_team_validator = bv.Void() +MembersRemoveError._unspecified_transfer_admin_id_validator = bv.Void() +MembersRemoveError._transfer_admin_is_not_admin_validator = bv.Void() +MembersRemoveError._tagmap = { + 'remove_last_admin': MembersRemoveError._remove_last_admin_validator, + 'removed_and_transfer_dest_should_differ': MembersRemoveError._removed_and_transfer_dest_should_differ_validator, + 'removed_and_transfer_admin_should_differ': MembersRemoveError._removed_and_transfer_admin_should_differ_validator, + 'transfer_dest_user_not_found': MembersRemoveError._transfer_dest_user_not_found_validator, + 'transfer_dest_user_not_in_team': MembersRemoveError._transfer_dest_user_not_in_team_validator, + 'transfer_admin_user_not_found': MembersRemoveError._transfer_admin_user_not_found_validator, + 'transfer_admin_user_not_in_team': MembersRemoveError._transfer_admin_user_not_in_team_validator, + 'unspecified_transfer_admin_id': MembersRemoveError._unspecified_transfer_admin_id_validator, + 'transfer_admin_is_not_admin': MembersRemoveError._transfer_admin_is_not_admin_validator, +} +MembersRemoveError._tagmap.update(MembersDeactivateError._tagmap) + +MembersRemoveError.remove_last_admin = MembersRemoveError('remove_last_admin') +MembersRemoveError.removed_and_transfer_dest_should_differ = MembersRemoveError('removed_and_transfer_dest_should_differ') +MembersRemoveError.removed_and_transfer_admin_should_differ = MembersRemoveError('removed_and_transfer_admin_should_differ') +MembersRemoveError.transfer_dest_user_not_found = MembersRemoveError('transfer_dest_user_not_found') +MembersRemoveError.transfer_dest_user_not_in_team = MembersRemoveError('transfer_dest_user_not_in_team') +MembersRemoveError.transfer_admin_user_not_found = MembersRemoveError('transfer_admin_user_not_found') +MembersRemoveError.transfer_admin_user_not_in_team = MembersRemoveError('transfer_admin_user_not_in_team') +MembersRemoveError.unspecified_transfer_admin_id = MembersRemoveError('unspecified_transfer_admin_id') +MembersRemoveError.transfer_admin_is_not_admin = MembersRemoveError('transfer_admin_is_not_admin') + +MembersSendWelcomeError._other_validator = bv.Void() +MembersSendWelcomeError._tagmap = { + 'other': MembersSendWelcomeError._other_validator, +} +MembersSendWelcomeError._tagmap.update(MemberSelectorError._tagmap) + +MembersSendWelcomeError.other = MembersSendWelcomeError('other') + +MembersSetPermissionsArg._user_validator = bv.Union(UserSelectorArg) +MembersSetPermissionsArg._new_role_validator = bv.Union(AdminTier) +MembersSetPermissionsArg._all_field_names_ = set([ + 'user', + 'new_role', +]) +MembersSetPermissionsArg._all_fields_ = [ + ('user', MembersSetPermissionsArg._user_validator), + ('new_role', MembersSetPermissionsArg._new_role_validator), +] + +MembersSetPermissionsError._last_admin_validator = bv.Void() +MembersSetPermissionsError._user_not_in_team_validator = bv.Void() +MembersSetPermissionsError._cannot_set_permissions_validator = bv.Void() +MembersSetPermissionsError._other_validator = bv.Void() +MembersSetPermissionsError._tagmap = { + 'last_admin': MembersSetPermissionsError._last_admin_validator, + 'user_not_in_team': MembersSetPermissionsError._user_not_in_team_validator, + 'cannot_set_permissions': MembersSetPermissionsError._cannot_set_permissions_validator, + 'other': MembersSetPermissionsError._other_validator, +} +MembersSetPermissionsError._tagmap.update(UserSelectorError._tagmap) + +MembersSetPermissionsError.last_admin = MembersSetPermissionsError('last_admin') +MembersSetPermissionsError.user_not_in_team = MembersSetPermissionsError('user_not_in_team') +MembersSetPermissionsError.cannot_set_permissions = MembersSetPermissionsError('cannot_set_permissions') +MembersSetPermissionsError.other = MembersSetPermissionsError('other') + +MembersSetPermissionsResult._team_member_id_validator = bv.String() +MembersSetPermissionsResult._role_validator = bv.Union(AdminTier) +MembersSetPermissionsResult._all_field_names_ = set([ + 'team_member_id', + 'role', +]) +MembersSetPermissionsResult._all_fields_ = [ + ('team_member_id', MembersSetPermissionsResult._team_member_id_validator), + ('role', MembersSetPermissionsResult._role_validator), +] + +MembersSetProfileArg._user_validator = bv.Union(UserSelectorArg) +MembersSetProfileArg._new_email_validator = bv.Nullable(bv.String()) +MembersSetProfileArg._new_external_id_validator = bv.Nullable(bv.String()) +MembersSetProfileArg._new_given_name_validator = bv.Nullable(bv.String()) +MembersSetProfileArg._new_surname_validator = bv.Nullable(bv.String()) +MembersSetProfileArg._all_field_names_ = set([ + 'user', + 'new_email', + 'new_external_id', + 'new_given_name', + 'new_surname', +]) +MembersSetProfileArg._all_fields_ = [ + ('user', MembersSetProfileArg._user_validator), + ('new_email', MembersSetProfileArg._new_email_validator), + ('new_external_id', MembersSetProfileArg._new_external_id_validator), + ('new_given_name', MembersSetProfileArg._new_given_name_validator), + ('new_surname', MembersSetProfileArg._new_surname_validator), +] + +MembersSetProfileError._external_id_and_new_external_id_unsafe_validator = bv.Void() +MembersSetProfileError._no_new_data_specified_validator = bv.Void() +MembersSetProfileError._email_reserved_for_other_user_validator = bv.Void() +MembersSetProfileError._external_id_used_by_other_user_validator = bv.Void() +MembersSetProfileError._set_profile_disallowed_validator = bv.Void() +MembersSetProfileError._param_cannot_be_empty_validator = bv.Void() +MembersSetProfileError._other_validator = bv.Void() +MembersSetProfileError._tagmap = { + 'external_id_and_new_external_id_unsafe': MembersSetProfileError._external_id_and_new_external_id_unsafe_validator, + 'no_new_data_specified': MembersSetProfileError._no_new_data_specified_validator, + 'email_reserved_for_other_user': MembersSetProfileError._email_reserved_for_other_user_validator, + 'external_id_used_by_other_user': MembersSetProfileError._external_id_used_by_other_user_validator, + 'set_profile_disallowed': MembersSetProfileError._set_profile_disallowed_validator, + 'param_cannot_be_empty': MembersSetProfileError._param_cannot_be_empty_validator, + 'other': MembersSetProfileError._other_validator, +} +MembersSetProfileError._tagmap.update(MemberSelectorError._tagmap) + +MembersSetProfileError.external_id_and_new_external_id_unsafe = MembersSetProfileError('external_id_and_new_external_id_unsafe') +MembersSetProfileError.no_new_data_specified = MembersSetProfileError('no_new_data_specified') +MembersSetProfileError.email_reserved_for_other_user = MembersSetProfileError('email_reserved_for_other_user') +MembersSetProfileError.external_id_used_by_other_user = MembersSetProfileError('external_id_used_by_other_user') +MembersSetProfileError.set_profile_disallowed = MembersSetProfileError('set_profile_disallowed') +MembersSetProfileError.param_cannot_be_empty = MembersSetProfileError('param_cannot_be_empty') +MembersSetProfileError.other = MembersSetProfileError('other') + +MembersSuspendError._suspend_inactive_user_validator = bv.Void() +MembersSuspendError._suspend_last_admin_validator = bv.Void() +MembersSuspendError._tagmap = { + 'suspend_inactive_user': MembersSuspendError._suspend_inactive_user_validator, + 'suspend_last_admin': MembersSuspendError._suspend_last_admin_validator, +} +MembersSuspendError._tagmap.update(MembersDeactivateError._tagmap) + +MembersSuspendError.suspend_inactive_user = MembersSuspendError('suspend_inactive_user') +MembersSuspendError.suspend_last_admin = MembersSuspendError('suspend_last_admin') + +MembersUnsuspendArg._user_validator = bv.Union(UserSelectorArg) +MembersUnsuspendArg._all_field_names_ = set(['user']) +MembersUnsuspendArg._all_fields_ = [('user', MembersUnsuspendArg._user_validator)] + +MembersUnsuspendError._unsuspend_non_suspended_member_validator = bv.Void() +MembersUnsuspendError._tagmap = { + 'unsuspend_non_suspended_member': MembersUnsuspendError._unsuspend_non_suspended_member_validator, +} +MembersUnsuspendError._tagmap.update(MembersDeactivateError._tagmap) + +MembersUnsuspendError.unsuspend_non_suspended_member = MembersUnsuspendError('unsuspend_non_suspended_member') + +MobileClientPlatform._iphone_validator = bv.Void() +MobileClientPlatform._ipad_validator = bv.Void() +MobileClientPlatform._android_validator = bv.Void() +MobileClientPlatform._windows_phone_validator = bv.Void() +MobileClientPlatform._blackberry_validator = bv.Void() +MobileClientPlatform._other_validator = bv.Void() +MobileClientPlatform._tagmap = { + 'iphone': MobileClientPlatform._iphone_validator, + 'ipad': MobileClientPlatform._ipad_validator, + 'android': MobileClientPlatform._android_validator, + 'windows_phone': MobileClientPlatform._windows_phone_validator, + 'blackberry': MobileClientPlatform._blackberry_validator, + 'other': MobileClientPlatform._other_validator, +} + +MobileClientPlatform.iphone = MobileClientPlatform('iphone') +MobileClientPlatform.ipad = MobileClientPlatform('ipad') +MobileClientPlatform.android = MobileClientPlatform('android') +MobileClientPlatform.windows_phone = MobileClientPlatform('windows_phone') +MobileClientPlatform.blackberry = MobileClientPlatform('blackberry') +MobileClientPlatform.other = MobileClientPlatform('other') + +MobileClientSession._device_name_validator = bv.String() +MobileClientSession._client_type_validator = bv.Union(MobileClientPlatform) +MobileClientSession._client_version_validator = bv.Nullable(bv.String()) +MobileClientSession._os_version_validator = bv.Nullable(bv.String()) +MobileClientSession._last_carrier_validator = bv.Nullable(bv.String()) +MobileClientSession._all_field_names_ = DeviceSession._all_field_names_.union(set([ + 'device_name', + 'client_type', + 'client_version', + 'os_version', + 'last_carrier', +])) +MobileClientSession._all_fields_ = DeviceSession._all_fields_ + [ + ('device_name', MobileClientSession._device_name_validator), + ('client_type', MobileClientSession._client_type_validator), + ('client_version', MobileClientSession._client_version_validator), + ('os_version', MobileClientSession._os_version_validator), + ('last_carrier', MobileClientSession._last_carrier_validator), +] + +RevokeDesktopClientArg._delete_on_unlink_validator = bv.Boolean() +RevokeDesktopClientArg._all_field_names_ = DeviceSessionArg._all_field_names_.union(set(['delete_on_unlink'])) +RevokeDesktopClientArg._all_fields_ = DeviceSessionArg._all_fields_ + [('delete_on_unlink', RevokeDesktopClientArg._delete_on_unlink_validator)] + +RevokeDeviceSessionArg._web_session_validator = bv.Struct(DeviceSessionArg) +RevokeDeviceSessionArg._desktop_client_validator = bv.Struct(RevokeDesktopClientArg) +RevokeDeviceSessionArg._mobile_client_validator = bv.Struct(DeviceSessionArg) +RevokeDeviceSessionArg._tagmap = { + 'web_session': RevokeDeviceSessionArg._web_session_validator, + 'desktop_client': RevokeDeviceSessionArg._desktop_client_validator, + 'mobile_client': RevokeDeviceSessionArg._mobile_client_validator, +} + +RevokeDeviceSessionBatchArg._revoke_devices_validator = bv.List(bv.Union(RevokeDeviceSessionArg)) +RevokeDeviceSessionBatchArg._all_field_names_ = set(['revoke_devices']) +RevokeDeviceSessionBatchArg._all_fields_ = [('revoke_devices', RevokeDeviceSessionBatchArg._revoke_devices_validator)] + +RevokeDeviceSessionBatchError._unspecified_validator = bv.Void() +RevokeDeviceSessionBatchError._tagmap = { + 'unspecified': RevokeDeviceSessionBatchError._unspecified_validator, +} + +RevokeDeviceSessionBatchError.unspecified = RevokeDeviceSessionBatchError('unspecified') + +RevokeDeviceSessionBatchResult._revoke_devices_status_validator = bv.List(bv.Struct(RevokeDeviceSessionStatus)) +RevokeDeviceSessionBatchResult._all_field_names_ = set(['revoke_devices_status']) +RevokeDeviceSessionBatchResult._all_fields_ = [('revoke_devices_status', RevokeDeviceSessionBatchResult._revoke_devices_status_validator)] + +RevokeDeviceSessionError._device_session_not_found_validator = bv.Void() +RevokeDeviceSessionError._member_not_found_validator = bv.Void() +RevokeDeviceSessionError._other_validator = bv.Void() +RevokeDeviceSessionError._tagmap = { + 'device_session_not_found': RevokeDeviceSessionError._device_session_not_found_validator, + 'member_not_found': RevokeDeviceSessionError._member_not_found_validator, + 'other': RevokeDeviceSessionError._other_validator, +} + +RevokeDeviceSessionError.device_session_not_found = RevokeDeviceSessionError('device_session_not_found') +RevokeDeviceSessionError.member_not_found = RevokeDeviceSessionError('member_not_found') +RevokeDeviceSessionError.other = RevokeDeviceSessionError('other') + +RevokeDeviceSessionStatus._success_validator = bv.Boolean() +RevokeDeviceSessionStatus._error_type_validator = bv.Nullable(bv.Union(RevokeDeviceSessionError)) +RevokeDeviceSessionStatus._all_field_names_ = set([ + 'success', + 'error_type', +]) +RevokeDeviceSessionStatus._all_fields_ = [ + ('success', RevokeDeviceSessionStatus._success_validator), + ('error_type', RevokeDeviceSessionStatus._error_type_validator), +] + +RevokeLinkedApiAppArg._app_id_validator = bv.String() +RevokeLinkedApiAppArg._team_member_id_validator = bv.String() +RevokeLinkedApiAppArg._keep_app_folder_validator = bv.Boolean() +RevokeLinkedApiAppArg._all_field_names_ = set([ + 'app_id', + 'team_member_id', + 'keep_app_folder', +]) +RevokeLinkedApiAppArg._all_fields_ = [ + ('app_id', RevokeLinkedApiAppArg._app_id_validator), + ('team_member_id', RevokeLinkedApiAppArg._team_member_id_validator), + ('keep_app_folder', RevokeLinkedApiAppArg._keep_app_folder_validator), +] + +RevokeLinkedApiAppBatchArg._revoke_linked_app_validator = bv.List(bv.Struct(RevokeLinkedApiAppArg)) +RevokeLinkedApiAppBatchArg._all_field_names_ = set(['revoke_linked_app']) +RevokeLinkedApiAppBatchArg._all_fields_ = [('revoke_linked_app', RevokeLinkedApiAppBatchArg._revoke_linked_app_validator)] + +RevokeLinkedAppBatchError._unspecified_validator = bv.Void() +RevokeLinkedAppBatchError._tagmap = { + 'unspecified': RevokeLinkedAppBatchError._unspecified_validator, +} + +RevokeLinkedAppBatchError.unspecified = RevokeLinkedAppBatchError('unspecified') + +RevokeLinkedAppBatchResult._revoke_linked_app_status_validator = bv.List(bv.Struct(RevokeLinkedAppStatus)) +RevokeLinkedAppBatchResult._all_field_names_ = set(['revoke_linked_app_status']) +RevokeLinkedAppBatchResult._all_fields_ = [('revoke_linked_app_status', RevokeLinkedAppBatchResult._revoke_linked_app_status_validator)] + +RevokeLinkedAppError._app_not_found_validator = bv.Void() +RevokeLinkedAppError._member_not_found_validator = bv.Void() +RevokeLinkedAppError._other_validator = bv.Void() +RevokeLinkedAppError._tagmap = { + 'app_not_found': RevokeLinkedAppError._app_not_found_validator, + 'member_not_found': RevokeLinkedAppError._member_not_found_validator, + 'other': RevokeLinkedAppError._other_validator, +} + +RevokeLinkedAppError.app_not_found = RevokeLinkedAppError('app_not_found') +RevokeLinkedAppError.member_not_found = RevokeLinkedAppError('member_not_found') +RevokeLinkedAppError.other = RevokeLinkedAppError('other') + +RevokeLinkedAppStatus._success_validator = bv.Boolean() +RevokeLinkedAppStatus._error_type_validator = bv.Nullable(bv.Union(RevokeLinkedAppError)) +RevokeLinkedAppStatus._all_field_names_ = set([ + 'success', + 'error_type', +]) +RevokeLinkedAppStatus._all_fields_ = [ + ('success', RevokeLinkedAppStatus._success_validator), + ('error_type', RevokeLinkedAppStatus._error_type_validator), +] + +SharedFolderJoinPolicy._from_team_only_validator = bv.Void() +SharedFolderJoinPolicy._from_anyone_validator = bv.Void() +SharedFolderJoinPolicy._other_validator = bv.Void() +SharedFolderJoinPolicy._tagmap = { + 'from_team_only': SharedFolderJoinPolicy._from_team_only_validator, + 'from_anyone': SharedFolderJoinPolicy._from_anyone_validator, + 'other': SharedFolderJoinPolicy._other_validator, +} + +SharedFolderJoinPolicy.from_team_only = SharedFolderJoinPolicy('from_team_only') +SharedFolderJoinPolicy.from_anyone = SharedFolderJoinPolicy('from_anyone') +SharedFolderJoinPolicy.other = SharedFolderJoinPolicy('other') + +SharedFolderMemberPolicy._team_validator = bv.Void() +SharedFolderMemberPolicy._anyone_validator = bv.Void() +SharedFolderMemberPolicy._other_validator = bv.Void() +SharedFolderMemberPolicy._tagmap = { + 'team': SharedFolderMemberPolicy._team_validator, + 'anyone': SharedFolderMemberPolicy._anyone_validator, + 'other': SharedFolderMemberPolicy._other_validator, +} + +SharedFolderMemberPolicy.team = SharedFolderMemberPolicy('team') +SharedFolderMemberPolicy.anyone = SharedFolderMemberPolicy('anyone') +SharedFolderMemberPolicy.other = SharedFolderMemberPolicy('other') + +StorageBucket._bucket_validator = bv.String() +StorageBucket._users_validator = bv.UInt64() +StorageBucket._all_field_names_ = set([ + 'bucket', + 'users', +]) +StorageBucket._all_fields_ = [ + ('bucket', StorageBucket._bucket_validator), + ('users', StorageBucket._users_validator), +] + +TeamGetInfoResult._name_validator = bv.String() +TeamGetInfoResult._team_id_validator = bv.String() +TeamGetInfoResult._num_licensed_users_validator = bv.UInt32() +TeamGetInfoResult._num_provisioned_users_validator = bv.UInt32() +TeamGetInfoResult._policies_validator = bv.Struct(TeamPolicies) +TeamGetInfoResult._all_field_names_ = set([ + 'name', + 'team_id', + 'num_licensed_users', + 'num_provisioned_users', + 'policies', +]) +TeamGetInfoResult._all_fields_ = [ + ('name', TeamGetInfoResult._name_validator), + ('team_id', TeamGetInfoResult._team_id_validator), + ('num_licensed_users', TeamGetInfoResult._num_licensed_users_validator), + ('num_provisioned_users', TeamGetInfoResult._num_provisioned_users_validator), + ('policies', TeamGetInfoResult._policies_validator), +] + +TeamMemberInfo._profile_validator = bv.Struct(TeamMemberProfile) +TeamMemberInfo._role_validator = bv.Union(AdminTier) +TeamMemberInfo._all_field_names_ = set([ + 'profile', + 'role', +]) +TeamMemberInfo._all_fields_ = [ + ('profile', TeamMemberInfo._profile_validator), + ('role', TeamMemberInfo._role_validator), +] + +TeamMemberProfile._groups_validator = bv.List(bv.String()) +TeamMemberProfile._all_field_names_ = MemberProfile._all_field_names_.union(set(['groups'])) +TeamMemberProfile._all_fields_ = MemberProfile._all_fields_ + [('groups', TeamMemberProfile._groups_validator)] + +TeamMemberStatus._active_validator = bv.Void() +TeamMemberStatus._invited_validator = bv.Void() +TeamMemberStatus._suspended_validator = bv.Void() +TeamMemberStatus._tagmap = { + 'active': TeamMemberStatus._active_validator, + 'invited': TeamMemberStatus._invited_validator, + 'suspended': TeamMemberStatus._suspended_validator, +} + +TeamMemberStatus.active = TeamMemberStatus('active') +TeamMemberStatus.invited = TeamMemberStatus('invited') +TeamMemberStatus.suspended = TeamMemberStatus('suspended') + +TeamPolicies._sharing_validator = bv.Struct(TeamSharingPolicies) +TeamPolicies._emm_state_validator = bv.Union(EmmState) +TeamPolicies._all_field_names_ = set([ + 'sharing', + 'emm_state', +]) +TeamPolicies._all_fields_ = [ + ('sharing', TeamPolicies._sharing_validator), + ('emm_state', TeamPolicies._emm_state_validator), +] + +TeamSharingPolicies._shared_folder_member_policy_validator = bv.Union(SharedFolderMemberPolicy) +TeamSharingPolicies._shared_folder_join_policy_validator = bv.Union(SharedFolderJoinPolicy) +TeamSharingPolicies._all_field_names_ = set([ + 'shared_folder_member_policy', + 'shared_folder_join_policy', +]) +TeamSharingPolicies._all_fields_ = [ + ('shared_folder_member_policy', TeamSharingPolicies._shared_folder_member_policy_validator), + ('shared_folder_join_policy', TeamSharingPolicies._shared_folder_join_policy_validator), +] + +UserSelectorArg._team_member_id_validator = bv.String() +UserSelectorArg._external_id_validator = bv.String() +UserSelectorArg._email_validator = bv.String() +UserSelectorArg._tagmap = { + 'team_member_id': UserSelectorArg._team_member_id_validator, + 'external_id': UserSelectorArg._external_id_validator, + 'email': UserSelectorArg._email_validator, +} + +UsersSelectorArg._team_member_ids_validator = bv.List(bv.String()) +UsersSelectorArg._external_ids_validator = bv.List(bv.String()) +UsersSelectorArg._emails_validator = bv.List(bv.String()) +UsersSelectorArg._tagmap = { + 'team_member_ids': UsersSelectorArg._team_member_ids_validator, + 'external_ids': UsersSelectorArg._external_ids_validator, + 'emails': UsersSelectorArg._emails_validator, +} diff --git a/dropbox/users.py b/dropbox/users.py index 694ea845..426a92f1 100644 --- a/dropbox/users.py +++ b/dropbox/users.py @@ -10,29 +10,40 @@ # This makes testing this file directly (outside of a package) easier. import babel_validators as bv -class GetAccountArg(object): +class Account(object): """ - :ivar account_id: A user's account identifier. + The amount of detail revealed about an account depends on the user being + queried and the user making the query. + + :ivar account_id: The user's unique Dropbox ID. + :ivar name: Details of a user's name. """ __slots__ = [ '_account_id_value', '_account_id_present', + '_name_value', + '_name_present', ] _has_required_fields = True def __init__(self, - account_id=None): + account_id=None, + name=None): self._account_id_value = None self._account_id_present = False + self._name_value = None + self._name_present = False if account_id is not None: self.account_id = account_id + if name is not None: + self.name = name @property def account_id(self): """ - A user's account identifier. + The user's unique Dropbox ID. :rtype: str """ @@ -52,58 +63,34 @@ def account_id(self): self._account_id_value = None self._account_id_present = False - def __repr__(self): - return 'GetAccountArg(account_id={!r})'.format( - self._account_id_value, - ) - -class GetAccountError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar no_account: The specified ``GetAccountArg.account_id`` does not exist. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = 'unknown' - # Attribute is overwritten below the class definition - no_account = None - # Attribute is overwritten below the class definition - unknown = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - def is_no_account(self): + @property + def name(self): """ - Check if the union tag is ``no_account``. + Details of a user's name. - :rtype: bool + :rtype: Name """ - return self._tag == 'no_account' + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") - def is_unknown(self): - """ - Check if the union tag is ``unknown``. + @name.setter + def name(self, val): + self._name_validator.validate_type_only(val) + self._name_value = val + self._name_present = True - :rtype: bool - """ - return self._tag == 'unknown' + @name.deleter + def name(self): + self._name_value = None + self._name_present = False def __repr__(self): - return 'GetAccountError(%r, %r)' % (self._tag, self._value) + return 'Account(account_id={!r}, name={!r})'.format( + self._account_id_value, + self._name_value, + ) class AccountType(object): """ @@ -167,88 +154,6 @@ def is_business(self): def __repr__(self): return 'AccountType(%r, %r)' % (self._tag, self._value) -class Account(object): - """ - The amount of detail revealed about an account depends on the user being - queried and the user making the query. - - :ivar account_id: The user's unique Dropbox ID. - :ivar name: Details of a user's name. - """ - - __slots__ = [ - '_account_id_value', - '_account_id_present', - '_name_value', - '_name_present', - ] - - _has_required_fields = True - - def __init__(self, - account_id=None, - name=None): - self._account_id_value = None - self._account_id_present = False - self._name_value = None - self._name_present = False - if account_id is not None: - self.account_id = account_id - if name is not None: - self.name = name - - @property - def account_id(self): - """ - The user's unique Dropbox ID. - - :rtype: str - """ - if self._account_id_present: - return self._account_id_value - else: - raise AttributeError("missing required field 'account_id'") - - @account_id.setter - def account_id(self, val): - val = self._account_id_validator.validate(val) - self._account_id_value = val - self._account_id_present = True - - @account_id.deleter - def account_id(self): - self._account_id_value = None - self._account_id_present = False - - @property - def name(self): - """ - Details of a user's name. - - :rtype: Name - """ - if self._name_present: - return self._name_value - else: - raise AttributeError("missing required field 'name'") - - @name.setter - def name(self, val): - self._name_validator.validate_type_only(val) - self._name_value = val - self._name_present = True - - @name.deleter - def name(self): - self._name_value = None - self._name_present = False - - def __repr__(self): - return 'Account(account_id={!r}, name={!r})'.format( - self._account_id_value, - self._name_value, - ) - class BasicAccount(Account): """ Basic information about any account. @@ -310,7 +215,10 @@ class FullAccount(Account): """ Detailed information about the current user's account. - :ivar email: The user's e-mail address. + :ivar email: The user's e-mail address. Do not rely on this without checking + the ``email_verified`` field. Even then, it's possible that the user has + since lost access to their e-mail. + :ivar email_verified: Whether the user has verified their e-mail address. :ivar country: The user's two-letter country code, if available. Country codes are based on `ISO 3166-1 `_. @@ -329,6 +237,8 @@ class FullAccount(Account): __slots__ = [ '_email_value', '_email_present', + '_email_verified_value', + '_email_verified_present', '_country_value', '_country_present', '_locale_value', @@ -349,6 +259,7 @@ def __init__(self, account_id=None, name=None, email=None, + email_verified=None, locale=None, referral_link=None, is_paired=None, @@ -359,6 +270,8 @@ def __init__(self, name) self._email_value = None self._email_present = False + self._email_verified_value = None + self._email_verified_present = False self._country_value = None self._country_present = False self._locale_value = None @@ -373,6 +286,8 @@ def __init__(self, self._account_type_present = False if email is not None: self.email = email + if email_verified is not None: + self.email_verified = email_verified if country is not None: self.country = country if locale is not None: @@ -389,7 +304,9 @@ def __init__(self, @property def email(self): """ - The user's e-mail address. + The user's e-mail address. Do not rely on this without checking the + ``email_verified`` field. Even then, it's possible that the user has + since lost access to their e-mail. :rtype: str """ @@ -409,6 +326,29 @@ def email(self): self._email_value = None self._email_present = False + @property + def email_verified(self): + """ + Whether the user has verified their e-mail address. + + :rtype: bool + """ + if self._email_verified_present: + return self._email_verified_value + else: + raise AttributeError("missing required field 'email_verified'") + + @email_verified.setter + def email_verified(self, val): + val = self._email_verified_validator.validate(val) + self._email_verified_value = val + self._email_verified_present = True + + @email_verified.deleter + def email_verified(self): + self._email_verified_value = None + self._email_verified_present = False + @property def country(self): """ @@ -558,10 +498,11 @@ def account_type(self): self._account_type_present = False def __repr__(self): - return 'FullAccount(account_id={!r}, name={!r}, email={!r}, locale={!r}, referral_link={!r}, is_paired={!r}, account_type={!r}, country={!r}, team={!r})'.format( + return 'FullAccount(account_id={!r}, name={!r}, email={!r}, email_verified={!r}, locale={!r}, referral_link={!r}, is_paired={!r}, account_type={!r}, country={!r}, team={!r})'.format( self._account_id_value, self._name_value, self._email_value, + self._email_verified_value, self._locale_value, self._referral_link_value, self._is_paired_value, @@ -570,85 +511,266 @@ def __repr__(self): self._team_value, ) -class Team(object): +class GetAccountArg(object): """ - Information about a team. - - :ivar id: The team's unique ID. - :ivar name: The name of the team. + :ivar account_id: A user's account identifier. """ __slots__ = [ - '_id_value', - '_id_present', - '_name_value', - '_name_present', + '_account_id_value', + '_account_id_present', ] _has_required_fields = True def __init__(self, - id=None, - name=None): - self._id_value = None - self._id_present = False - self._name_value = None - self._name_present = False - if id is not None: - self.id = id - if name is not None: - self.name = name + account_id=None): + self._account_id_value = None + self._account_id_present = False + if account_id is not None: + self.account_id = account_id @property - def id(self): + def account_id(self): """ - The team's unique ID. + A user's account identifier. :rtype: str """ - if self._id_present: - return self._id_value + if self._account_id_present: + return self._account_id_value else: - raise AttributeError("missing required field 'id'") + raise AttributeError("missing required field 'account_id'") - @id.setter - def id(self, val): - val = self._id_validator.validate(val) - self._id_value = val - self._id_present = True + @account_id.setter + def account_id(self, val): + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True - @id.deleter - def id(self): - self._id_value = None - self._id_present = False + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False - @property - def name(self): - """ - The name of the team. + def __repr__(self): + return 'GetAccountArg(account_id={!r})'.format( + self._account_id_value, + ) - :rtype: str - """ - if self._name_present: - return self._name_value - else: - raise AttributeError("missing required field 'name'") +class GetAccountBatchArg(object): + """ + :ivar account_ids: List of user account identifiers. Should not contain any + duplicate account IDs. + """ - @name.setter - def name(self, val): - val = self._name_validator.validate(val) - self._name_value = val - self._name_present = True + __slots__ = [ + '_account_ids_value', + '_account_ids_present', + ] - @name.deleter - def name(self): - self._name_value = None - self._name_present = False + _has_required_fields = True + + def __init__(self, + account_ids=None): + self._account_ids_value = None + self._account_ids_present = False + if account_ids is not None: + self.account_ids = account_ids + + @property + def account_ids(self): + """ + List of user account identifiers. Should not contain any duplicate + account IDs. + + :rtype: list of [str] + """ + if self._account_ids_present: + return self._account_ids_value + else: + raise AttributeError("missing required field 'account_ids'") + + @account_ids.setter + def account_ids(self, val): + val = self._account_ids_validator.validate(val) + self._account_ids_value = val + self._account_ids_present = True + + @account_ids.deleter + def account_ids(self): + self._account_ids_value = None + self._account_ids_present = False def __repr__(self): - return 'Team(id={!r}, name={!r})'.format( - self._id_value, - self._name_value, + return 'GetAccountBatchArg(account_ids={!r})'.format( + self._account_ids_value, + ) + +class GetAccountBatchError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str no_account: The value is an account ID specified in + :field:`GetAccountBatchArg.account_ids` that does not exist. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + @classmethod + def no_account(cls, val): + """ + Create an instance of this class set to the ``no_account`` tag with + value ``val``. + + :param str val: + :rtype: GetAccountBatchError + """ + return cls('no_account', val) + + def is_no_account(self): + """ + Check if the union tag is ``no_account``. + + :rtype: bool + """ + return self._tag == 'no_account' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_no_account(self): + """ + The value is an account ID specified in + ``GetAccountBatchArg.account_ids`` that does not exist. + + Only call this if :meth:`is_no_account` is true. + + :rtype: str + """ + if not self.is_no_account(): + raise AttributeError("tag 'no_account' not set") + return self._value + + def __repr__(self): + return 'GetAccountBatchError(%r, %r)' % (self._tag, self._value) + +class GetAccountError(object): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_account: The specified ``GetAccountArg.account_id`` does not exist. + """ + + __slots__ = ['_tag', '_value'] + + _catch_all = 'unknown' + # Attribute is overwritten below the class definition + no_account = None + # Attribute is overwritten below the class definition + unknown = None + + def __init__(self, tag, value=None): + assert tag in self._tagmap, 'Invalid tag %r.' % tag + validator = self._tagmap[tag] + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def is_no_account(self): + """ + Check if the union tag is ``no_account``. + + :rtype: bool + """ + return self._tag == 'no_account' + + def is_unknown(self): + """ + Check if the union tag is ``unknown``. + + :rtype: bool + """ + return self._tag == 'unknown' + + def __repr__(self): + return 'GetAccountError(%r, %r)' % (self._tag, self._value) + +class IndividualSpaceAllocation(object): + """ + :ivar allocated: The total space allocated to the user's account (bytes). + """ + + __slots__ = [ + '_allocated_value', + '_allocated_present', + ] + + _has_required_fields = True + + def __init__(self, + allocated=None): + self._allocated_value = None + self._allocated_present = False + if allocated is not None: + self.allocated = allocated + + @property + def allocated(self): + """ + The total space allocated to the user's account (bytes). + + :rtype: long + """ + if self._allocated_present: + return self._allocated_value + else: + raise AttributeError("missing required field 'allocated'") + + @allocated.setter + def allocated(self, val): + val = self._allocated_validator.validate(val) + self._allocated_value = val + self._allocated_present = True + + @allocated.deleter + def allocated(self): + self._allocated_value = None + self._allocated_present = False + + def __repr__(self): + return 'IndividualSpaceAllocation(allocated={!r})'.format( + self._allocated_value, ) class Name(object): @@ -802,87 +924,6 @@ def __repr__(self): self._display_name_value, ) -class SpaceUsage(object): - """ - Information about a user's space usage and quota. - - :ivar used: The user's total space usage (bytes). - :ivar allocation: The user's space allocation. - """ - - __slots__ = [ - '_used_value', - '_used_present', - '_allocation_value', - '_allocation_present', - ] - - _has_required_fields = True - - def __init__(self, - used=None, - allocation=None): - self._used_value = None - self._used_present = False - self._allocation_value = None - self._allocation_present = False - if used is not None: - self.used = used - if allocation is not None: - self.allocation = allocation - - @property - def used(self): - """ - The user's total space usage (bytes). - - :rtype: long - """ - if self._used_present: - return self._used_value - else: - raise AttributeError("missing required field 'used'") - - @used.setter - def used(self, val): - val = self._used_validator.validate(val) - self._used_value = val - self._used_present = True - - @used.deleter - def used(self): - self._used_value = None - self._used_present = False - - @property - def allocation(self): - """ - The user's space allocation. - - :rtype: SpaceAllocation - """ - if self._allocation_present: - return self._allocation_value - else: - raise AttributeError("missing required field 'allocation'") - - @allocation.setter - def allocation(self, val): - self._allocation_validator.validate_type_only(val) - self._allocation_value = val - self._allocation_present = True - - @allocation.deleter - def allocation(self): - self._allocation_value = None - self._allocation_present = False - - def __repr__(self): - return 'SpaceUsage(used={!r}, allocation={!r})'.format( - self._used_value, - self._allocation_value, - ) - class SpaceAllocation(object): """ Space is allocated differently based on the type of account. @@ -988,51 +1029,166 @@ def get_team(self): def __repr__(self): return 'SpaceAllocation(%r, %r)' % (self._tag, self._value) -class IndividualSpaceAllocation(object): +class SpaceUsage(object): """ - :ivar allocated: The total space allocated to the user's account (bytes). + Information about a user's space usage and quota. + + :ivar used: The user's total space usage (bytes). + :ivar allocation: The user's space allocation. """ __slots__ = [ - '_allocated_value', - '_allocated_present', + '_used_value', + '_used_present', + '_allocation_value', + '_allocation_present', ] _has_required_fields = True def __init__(self, - allocated=None): - self._allocated_value = None - self._allocated_present = False - if allocated is not None: - self.allocated = allocated + used=None, + allocation=None): + self._used_value = None + self._used_present = False + self._allocation_value = None + self._allocation_present = False + if used is not None: + self.used = used + if allocation is not None: + self.allocation = allocation @property - def allocated(self): + def used(self): """ - The total space allocated to the user's account (bytes). + The user's total space usage (bytes). :rtype: long """ - if self._allocated_present: - return self._allocated_value + if self._used_present: + return self._used_value else: - raise AttributeError("missing required field 'allocated'") + raise AttributeError("missing required field 'used'") - @allocated.setter - def allocated(self, val): - val = self._allocated_validator.validate(val) - self._allocated_value = val - self._allocated_present = True + @used.setter + def used(self, val): + val = self._used_validator.validate(val) + self._used_value = val + self._used_present = True + + @used.deleter + def used(self): + self._used_value = None + self._used_present = False + + @property + def allocation(self): + """ + The user's space allocation. + + :rtype: SpaceAllocation + """ + if self._allocation_present: + return self._allocation_value + else: + raise AttributeError("missing required field 'allocation'") + + @allocation.setter + def allocation(self, val): + self._allocation_validator.validate_type_only(val) + self._allocation_value = val + self._allocation_present = True + + @allocation.deleter + def allocation(self): + self._allocation_value = None + self._allocation_present = False + + def __repr__(self): + return 'SpaceUsage(used={!r}, allocation={!r})'.format( + self._used_value, + self._allocation_value, + ) + +class Team(object): + """ + Information about a team. + + :ivar id: The team's unique ID. + :ivar name: The name of the team. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_name_value', + '_name_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + name=None): + self._id_value = None + self._id_present = False + self._name_value = None + self._name_present = False + if id is not None: + self.id = id + if name is not None: + self.name = name + + @property + def id(self): + """ + The team's unique ID. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def name(self): + """ + The name of the team. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True - @allocated.deleter - def allocated(self): - self._allocated_value = None - self._allocated_present = False + @name.deleter + def name(self): + self._name_value = None + self._name_present = False def __repr__(self): - return 'IndividualSpaceAllocation(allocated={!r})'.format( - self._allocated_value, + return 'Team(id={!r}, name={!r})'.format( + self._id_value, + self._name_value, ) class TeamSpaceAllocation(object): @@ -1114,139 +1270,16 @@ def __repr__(self): self._allocated_value, ) -class GetAccountBatchArg(object): - """ - :ivar account_ids: List of user account identifiers. Should not contain any - duplicate account IDs. - """ - - __slots__ = [ - '_account_ids_value', - '_account_ids_present', - ] - - _has_required_fields = True - - def __init__(self, - account_ids=None): - self._account_ids_value = None - self._account_ids_present = False - if account_ids is not None: - self.account_ids = account_ids - - @property - def account_ids(self): - """ - List of user account identifiers. Should not contain any duplicate - account IDs. - - :rtype: list of [str] - """ - if self._account_ids_present: - return self._account_ids_value - else: - raise AttributeError("missing required field 'account_ids'") - - @account_ids.setter - def account_ids(self, val): - val = self._account_ids_validator.validate(val) - self._account_ids_value = val - self._account_ids_present = True - - @account_ids.deleter - def account_ids(self): - self._account_ids_value = None - self._account_ids_present = False - - def __repr__(self): - return 'GetAccountBatchArg(account_ids={!r})'.format( - self._account_ids_value, - ) - -class GetAccountBatchError(object): - """ - This class acts as a tagged union. Only one of the ``is_*`` methods will - return true. To get the associated value of a tag (if one exists), use the - corresponding ``get_*`` method. - - :ivar str no_account: The value is an account ID specified in - :field:`GetAccountBatchArg.account_ids` that does not exist. - """ - - __slots__ = ['_tag', '_value'] - - _catch_all = 'other' - # Attribute is overwritten below the class definition - other = None - - def __init__(self, tag, value=None): - assert tag in self._tagmap, 'Invalid tag %r.' % tag - validator = self._tagmap[tag] - if isinstance(validator, bv.Void): - assert value is None, 'Void type union member must have None value.' - elif isinstance(validator, (bv.Struct, bv.Union)): - validator.validate_type_only(value) - else: - validator.validate(value) - self._tag = tag - self._value = value - - @classmethod - def no_account(cls, val): - """ - Create an instance of this class set to the ``no_account`` tag with - value ``val``. - - :param str val: - :rtype: GetAccountBatchError - """ - return cls('no_account', val) - - def is_no_account(self): - """ - Check if the union tag is ``no_account``. - - :rtype: bool - """ - return self._tag == 'no_account' - - def is_other(self): - """ - Check if the union tag is ``other``. - - :rtype: bool - """ - return self._tag == 'other' - - def get_no_account(self): - """ - The value is an account ID specified in - ``GetAccountBatchArg.account_ids`` that does not exist. - - Only call this if :meth:`is_no_account` is true. - - :rtype: str - """ - if not self.is_no_account(): - raise AttributeError("tag 'no_account' not set") - return self._value - - def __repr__(self): - return 'GetAccountBatchError(%r, %r)' % (self._tag, self._value) - -GetAccountArg._account_id_validator = bv.String(min_length=40, max_length=40) -GetAccountArg._all_field_names_ = set(['account_id']) -GetAccountArg._all_fields_ = [('account_id', GetAccountArg._account_id_validator)] - -GetAccountError._no_account_validator = bv.Void() -GetAccountError._unknown_validator = bv.Void() -GetAccountError._tagmap = { - 'no_account': GetAccountError._no_account_validator, - 'unknown': GetAccountError._unknown_validator, -} - -GetAccountError.no_account = GetAccountError('no_account') -GetAccountError.unknown = GetAccountError('unknown') +Account._account_id_validator = bv.String(min_length=40, max_length=40) +Account._name_validator = bv.Struct(Name) +Account._all_field_names_ = set([ + 'account_id', + 'name', +]) +Account._all_fields_ = [ + ('account_id', Account._account_id_validator), + ('name', Account._name_validator), +] AccountType._basic_validator = bv.Void() AccountType._pro_validator = bv.Void() @@ -1261,22 +1294,12 @@ def __repr__(self): AccountType.pro = AccountType('pro') AccountType.business = AccountType('business') -Account._account_id_validator = bv.String(min_length=40, max_length=40) -Account._name_validator = bv.Struct(Name) -Account._all_field_names_ = set([ - 'account_id', - 'name', -]) -Account._all_fields_ = [ - ('account_id', Account._account_id_validator), - ('name', Account._name_validator), -] - BasicAccount._is_teammate_validator = bv.Boolean() BasicAccount._all_field_names_ = Account._all_field_names_.union(set(['is_teammate'])) BasicAccount._all_fields_ = Account._all_fields_ + [('is_teammate', BasicAccount._is_teammate_validator)] FullAccount._email_validator = bv.String() +FullAccount._email_verified_validator = bv.Boolean() FullAccount._country_validator = bv.Nullable(bv.String(min_length=2, max_length=2)) FullAccount._locale_validator = bv.String(min_length=2) FullAccount._referral_link_validator = bv.String() @@ -1285,6 +1308,7 @@ def __repr__(self): FullAccount._account_type_validator = bv.Union(AccountType) FullAccount._all_field_names_ = Account._all_field_names_.union(set([ 'email', + 'email_verified', 'country', 'locale', 'referral_link', @@ -1294,6 +1318,7 @@ def __repr__(self): ])) FullAccount._all_fields_ = Account._all_fields_ + [ ('email', FullAccount._email_validator), + ('email_verified', FullAccount._email_verified_validator), ('country', FullAccount._country_validator), ('locale', FullAccount._locale_validator), ('referral_link', FullAccount._referral_link_validator), @@ -1302,16 +1327,36 @@ def __repr__(self): ('account_type', FullAccount._account_type_validator), ] -Team._id_validator = bv.String() -Team._name_validator = bv.String() -Team._all_field_names_ = set([ - 'id', - 'name', -]) -Team._all_fields_ = [ - ('id', Team._id_validator), - ('name', Team._name_validator), -] +GetAccountArg._account_id_validator = bv.String(min_length=40, max_length=40) +GetAccountArg._all_field_names_ = set(['account_id']) +GetAccountArg._all_fields_ = [('account_id', GetAccountArg._account_id_validator)] + +GetAccountBatchArg._account_ids_validator = bv.List(bv.String(min_length=40, max_length=40), min_items=1) +GetAccountBatchArg._all_field_names_ = set(['account_ids']) +GetAccountBatchArg._all_fields_ = [('account_ids', GetAccountBatchArg._account_ids_validator)] + +GetAccountBatchError._no_account_validator = bv.String(min_length=40, max_length=40) +GetAccountBatchError._other_validator = bv.Void() +GetAccountBatchError._tagmap = { + 'no_account': GetAccountBatchError._no_account_validator, + 'other': GetAccountBatchError._other_validator, +} + +GetAccountBatchError.other = GetAccountBatchError('other') + +GetAccountError._no_account_validator = bv.Void() +GetAccountError._unknown_validator = bv.Void() +GetAccountError._tagmap = { + 'no_account': GetAccountError._no_account_validator, + 'unknown': GetAccountError._unknown_validator, +} + +GetAccountError.no_account = GetAccountError('no_account') +GetAccountError.unknown = GetAccountError('unknown') + +IndividualSpaceAllocation._allocated_validator = bv.UInt64() +IndividualSpaceAllocation._all_field_names_ = set(['allocated']) +IndividualSpaceAllocation._all_fields_ = [('allocated', IndividualSpaceAllocation._allocated_validator)] Name._given_name_validator = bv.String() Name._surname_validator = bv.String() @@ -1330,17 +1375,6 @@ def __repr__(self): ('display_name', Name._display_name_validator), ] -SpaceUsage._used_validator = bv.UInt64() -SpaceUsage._allocation_validator = bv.Union(SpaceAllocation) -SpaceUsage._all_field_names_ = set([ - 'used', - 'allocation', -]) -SpaceUsage._all_fields_ = [ - ('used', SpaceUsage._used_validator), - ('allocation', SpaceUsage._allocation_validator), -] - SpaceAllocation._individual_validator = bv.Struct(IndividualSpaceAllocation) SpaceAllocation._team_validator = bv.Struct(TeamSpaceAllocation) SpaceAllocation._other_validator = bv.Void() @@ -1352,9 +1386,27 @@ def __repr__(self): SpaceAllocation.other = SpaceAllocation('other') -IndividualSpaceAllocation._allocated_validator = bv.UInt64() -IndividualSpaceAllocation._all_field_names_ = set(['allocated']) -IndividualSpaceAllocation._all_fields_ = [('allocated', IndividualSpaceAllocation._allocated_validator)] +SpaceUsage._used_validator = bv.UInt64() +SpaceUsage._allocation_validator = bv.Union(SpaceAllocation) +SpaceUsage._all_field_names_ = set([ + 'used', + 'allocation', +]) +SpaceUsage._all_fields_ = [ + ('used', SpaceUsage._used_validator), + ('allocation', SpaceUsage._allocation_validator), +] + +Team._id_validator = bv.String() +Team._name_validator = bv.String() +Team._all_field_names_ = set([ + 'id', + 'name', +]) +Team._all_fields_ = [ + ('id', Team._id_validator), + ('name', Team._name_validator), +] TeamSpaceAllocation._used_validator = bv.UInt64() TeamSpaceAllocation._allocated_validator = bv.UInt64() @@ -1367,16 +1419,3 @@ def __repr__(self): ('allocated', TeamSpaceAllocation._allocated_validator), ] -GetAccountBatchArg._account_ids_validator = bv.List(bv.String(min_length=40, max_length=40), min_items=1) -GetAccountBatchArg._all_field_names_ = set(['account_ids']) -GetAccountBatchArg._all_fields_ = [('account_ids', GetAccountBatchArg._account_ids_validator)] - -GetAccountBatchError._no_account_validator = bv.String(min_length=40, max_length=40) -GetAccountBatchError._other_validator = bv.Void() -GetAccountBatchError._tagmap = { - 'no_account': GetAccountBatchError._no_account_validator, - 'other': GetAccountBatchError._other_validator, -} - -GetAccountBatchError.other = GetAccountBatchError('other') - diff --git a/setup.py b/setup.py index 8e257c40..f5167a2a 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ dist = setup( name='dropbox', - version='4.0.1', + version='5.0', description='Official Dropbox API Client', author='Dropbox', author_email='dev-platform@dropbox.com', diff --git a/test/test_dropbox.py b/test/test_dropbox.py index 74ddbdb9..e2bc60fb 100644 --- a/test/test_dropbox.py +++ b/test/test_dropbox.py @@ -7,7 +7,10 @@ import sys import unittest -from dropbox import Dropbox +from dropbox import ( + Dropbox, + DropboxTeam, +) from dropbox.exceptions import ( ApiError, AuthError, @@ -24,6 +27,15 @@ file=sys.stderr) sys.exit(1) +# Get team token from environment variable. +# This team needs to have sufficient permission to get team information +# and assume user identities. +team_oauth2_token = os.environ.get('DROPBOX_TEAM_TOKEN') +if team_oauth2_token is None: + print('Set DROPBOX_TEAM_TOKEN environment variable to a valid token.', + file=sys.stderr) + sys.exit(1) + MALFORMED_TOKEN = 'asdf' INVALID_TOKEN = 'z' * 62 @@ -32,6 +44,7 @@ class TestDropbox(unittest.TestCase): def setUp(self): self.dbx = Dropbox(oauth2_token) + self.dbxt = DropboxTeam(team_oauth2_token) def test_bad_auth(self): # Test malformed token @@ -72,6 +85,13 @@ def test_upload_download(self): # Cleanup folder self.dbx.files_delete('/Test/%s' % timestamp) + def test_team(self): + self.dbxt.team_groups_list() + r = self.dbxt.team_members_list() + if r.members: + # Only test assuming a member if there is a member + self.dbxt.as_user(r.members[0].profile.team_member_id).files_list_folder('') + from io import BytesIO import os diff --git a/tox.ini b/tox.ini index f21488bb..d58fe9b2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] envlist = py27,py34 [testenv] -passenv = DROPBOX_TOKEN +passenv = DROPBOX_TOKEN DROPBOX_TEAM_TOKEN DROPBOX_DOMAIN DROPBOX_WEB_HOST deps = pytest commands = py.test {posargs}