From 9067f01930d2e0c379173f28fdbbae33775e4cc1 Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 20 Aug 2018 18:29:00 -0700 Subject: [PATCH 01/28] front porting storage policies --- boxsdk/client/client.py | 97 +++++++++++++++++++ boxsdk/object/storage_policy.py | 38 ++++++++ boxsdk/object/storage_policy_assignment.py | 13 +++ test/unit/client/test_client.py | 46 +++++++++ test/unit/object/conftest.py | 12 +++ test/unit/object/test_storage_policy.py | 45 +++++++++ .../object/test_storage_policy_assignment.py | 61 ++++++++++++ 7 files changed, 312 insertions(+) create mode 100644 boxsdk/object/storage_policy.py create mode 100644 boxsdk/object/storage_policy_assignment.py create mode 100644 test/unit/object/test_storage_policy.py create mode 100644 test/unit/object/test_storage_policy_assignment.py diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index c96ca3b75..0e64eef62 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -8,6 +8,8 @@ from ..object.cloneable import Cloneable from ..util.api_call_decorator import api_call from ..object.search import Search +from ..object.storage_policy import StoragePolicy +from ..object.storage_policy_assignment import StoragePolicyAssignment from ..object.events import Events from ..pagination.limit_offset_based_object_collection import LimitOffsetBasedObjectCollection from ..pagination.marker_based_object_collection import MarkerBasedObjectCollection @@ -401,6 +403,101 @@ def create_group(self, name): response_object=response, ) + def storage_policy(self, policy_id): + """ + Initialize a :class:`StoragePolicy` object, whose box id is policy_id. + :param policy_id: + The box ID of the :class:`StoragePolicy` object. + :type policy_id: + `unicode` + :return: + A :class:`StoragePolicy` object with the given entry ID. + :rtype: + :class:`StoragePolicy` + """ + return StoragePolicy(session=self._session, object_id=policy_id) + + def storage_policy_assignment(self, assignment_id): + """ + Initialize a :class:`StoragePolicyAssignment` object, whose box id is assignment_id. + :param assignment_id: + The box ID of the :class:`StoragePolicyAssignment` object. + :type assignment_id: + `unicode` + :return: + A :class:`StoragePolicyAssignment` object with the given entry ID. + :rtype: + :class:`StoragePolicyAssignment` + """ + return StoragePolicyAssignment(session=self._session, object_id=assignment_id) + + def storage_policies(self, limit=None, marker=None, fields=None): + """ + Get the entries in the storage policy using marker-based paging. + + :param limit: + The maximum number of entries to return per page. If not specified, then will use the server-side default. + :type limit: + `int` or None + :param marker: + The paging marker to start paging from. + :type marker: + `str` or None + :param fields: + List of fields to request. + :type fields: + `Iterable` of `unicode` + :returns: + An iterator of the entries in the storage policy + :rtype: + :class:`BoxObjectCollection` + """ + return MarkerBasedObjectCollection( + session=self._session, + url=self.get_url('storage_policies'), + limit=limit, + marker=marker, + fields=fields, + return_full_pages=False, + ) + + def storage_policy_assignments(self, resolved_for_type, resolved_for_id, marker=None, fields=None): + """ + Get the entries in the storage policy assignment using limit-offset paging. + :param resolved_for_type: + Set to either `user` or `enterprise` + :type limit: + `unicode` + :param resolved_for_id: + The id of the user or enterprise + :type limit: + `unicode` + :param marker: + The paging marker to start paging from. + :type marker: + `str` or None + :param fields: + List of fields to request. + :type fields: + `Iterable` of `unicode` + :returns: + An iterator of the entries in the storage policy assignment + :rtype: + :class:`BoxObjectCollection` + """ + additional_params = { + 'resolved_for_type': resolved_for_type, + 'resolved_for_id': resolved_for_id, + } + return MarkerBasedObjectCollection( + session=self._session, + url='{0}/storage_policy_assignments'.format(API.BASE_API_URL), + additional_params=additional_params, + limit=100, + marker=marker, + fields=fields, + ) + @api_call def get_recent_items(self, limit=None, marker=None, fields=None, **collection_kwargs): """ diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py new file mode 100644 index 000000000..d04f0c0b1 --- /dev/null +++ b/boxsdk/object/storage_policy.py @@ -0,0 +1,38 @@ +# coding:utf-8 +from __future__ import unicode_literals, absolute_import + +import json + +from .base_object import BaseObject +from boxsdk.util.translator import Translator + + +class StoragePolicy(BaseObject): + """Represents the storage policy""" + + _item_type = 'storage_policy' + + def get_url(self, *args): + """ + Get url for storage policies. + """ + return self._session.get_url('storage_policies', self._object_id, *args) + + def assign(self, item): + url = self._session.get_url('storage_policy_assignments') + body = { + 'storage_policy': { + 'type': 'storage_policy', + 'id': self.object_id, + }, + 'assigned_to': { + 'type': item.object_type, + 'id': item.object_id, + } + } + response = self._session.post(url, data=json.dumps(body)).json() + return Translator().translate(response['type'])( + self._session, + response['id'], + response, + ) diff --git a/boxsdk/object/storage_policy_assignment.py b/boxsdk/object/storage_policy_assignment.py new file mode 100644 index 000000000..cf9232a77 --- /dev/null +++ b/boxsdk/object/storage_policy_assignment.py @@ -0,0 +1,13 @@ +# coding:utf-8 +from __future__ import unicode_literals, absolute_import +from .base_object import BaseObject + + +class StoragePolicyAssignment(BaseObject): + """Represents the storage policy assignment""" + + _item_type = 'storage_policy_assignment' + + def get_url(self, *args): + return self._session.get_url('storage_policy_assignments', self._object_id, *args) + diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index 4997a7648..2c6a43c24 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -21,6 +21,8 @@ from boxsdk.object.folder import Folder from boxsdk.object.file import File from boxsdk.object.group import Group +from boxsdk.object.storage_policy import StoragePolicy +from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment from boxsdk.object.user import User from boxsdk.object.group_membership import GroupMembership from boxsdk.pagination.marker_based_object_collection import MarkerBasedObjectCollection @@ -387,6 +389,50 @@ def test_create_enterprise_user_returns_the_correct_user_object(mock_client, moc assert new_user.name == test_user_name +def test_get_storage_policies(mock_client, mock_box_session): + expected_url = mock_box_session.get_url('storage_policies') + mock_policy = { + 'type': 'storage_policy', + 'id': '12345', + 'name': 'Test Storage Policy' + } + mock_box_session.get.return_value.json.return_value = { + 'limit': 100, + 'entries': [mock_policy] + } + policies = mock_client.storage_policies() + policy = policies.next() + mock_box_session.get.assert_called_once_with(expected_url, params={}) + assert isinstance(policy, StoragePolicy) + assert policy.id == mock_policy['id'] + assert policy.name == mock_policy['name'] + + +def test_get_storage_policy_assignments(mock_client, mock_box_session): + resolved_for_type = 'user' + resolved_for_id = '1234' + expected_url = mock_box_session.get_url('storage_policy_assignments') + mock_assignment = { + 'type': 'storage_policy_assignment', + 'id': '12345', + } + mock_box_session.get.return_value.json.return_value = { + 'limit': 100, + 'entries': [mock_assignment] + } + expected_params = { + 'limit': 100, + 'resolved_for_type': resolved_for_type, + 'resolved_for_id': resolved_for_id, + } + assignments = mock_client.storage_policy_assignments(resolved_for_type, resolved_for_id) + assignment = assignments.next() + mock_box_session.get.assert_called_once_with(expected_url, params=expected_params) + assert isinstance(assignment, StoragePolicyAssignment) + assert assignment.id == mock_assignment['id'] + assert assignment.type == mock_assignment['type'] + + @pytest.fixture def check_downscope_token_request( mock_client, diff --git a/test/unit/object/conftest.py b/test/unit/object/conftest.py index 021e4d384..07376bd39 100644 --- a/test/unit/object/conftest.py +++ b/test/unit/object/conftest.py @@ -14,6 +14,8 @@ from boxsdk.object.group import Group from boxsdk.object.user import User from boxsdk.object.search import Search +from boxsdk.object.storage_policy import StoragePolicy +from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment # pylint:disable=redefined-outer-name @@ -96,6 +98,16 @@ def test_search(mock_box_session): return Search(mock_box_session) +@pytest.fixture() +def test_storage_policy(mock_box_session, mock_object_id): + return StoragePolicy(mock_box_session, mock_object_id) + + +@pytest.fixture() +def test_storage_policy_assignment(mock_box_session, mock_object_id): + return StoragePolicyAssignment(mock_box_session, mock_object_id) + + @pytest.fixture(scope='function') def mock_collab_response(make_mock_box_request, mock_collaboration_id): mock_box_response, _ = make_mock_box_request( diff --git a/test/unit/object/test_storage_policy.py b/test/unit/object/test_storage_policy.py new file mode 100644 index 000000000..55dfb4854 --- /dev/null +++ b/test/unit/object/test_storage_policy.py @@ -0,0 +1,45 @@ +# coding: utf-8 + +from __future__ import unicode_literals + +import json +from boxsdk.config import API +from boxsdk.object.storage_policy import StoragePolicy + + +def test_get(test_storage_policy, mock_box_session): + expected_url = '{0}/storage_policies/{1}'.format(API.BASE_API_URL, test_storage_policy.object_id) + mock_box_session.get.return_value.json.return_value = { + 'type': 'storage_policy', + 'id': test_storage_policy.object_id, + } + storage_policy = test_storage_policy.get() + mock_box_session.get.assert_called_once_with(expected_url, headers=None, params=None) + assert isinstance(storage_policy, StoragePolicy) + + +def test_assign(test_storage_policy, mock_user, mock_box_session): + expected_url = mock_box_session.get_url('storage_policy_assignments') + expected_data = { + 'storage_policy': { + 'type': 'storage_policy', + 'id': '42', + }, + 'assigned_to': { + 'type': 'user', + 'id': 'fake-user-100', + } + } + mock_assignment = { + 'type': 'storage_policy_assignment', + 'id': '1234', + 'storage_policy': { + 'type': 'storage_policy', + 'id': '1111', + } + } + mock_box_session.post.return_value.json.return_value = mock_assignment + assignment = test_storage_policy.assign(mock_user) + mock_box_session.post.assert_called_once_with(expected_url, data=json.dumps(expected_data)) + assert assignment.id == mock_assignment['id'] + assert assignment.storage_policy['id'] == mock_assignment['storage_policy']['id'] diff --git a/test/unit/object/test_storage_policy_assignment.py b/test/unit/object/test_storage_policy_assignment.py new file mode 100644 index 000000000..eb9e90a87 --- /dev/null +++ b/test/unit/object/test_storage_policy_assignment.py @@ -0,0 +1,61 @@ +# coding: utf-8 +from __future__ import unicode_literals, absolute_import + +import json +import pytest + +from mock import Mock +from boxsdk.config import API +from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment +from boxsdk.network.default_network import DefaultNetworkResponse + + + +@pytest.fixture(scope='module') +def delete_assignment_response(): + # pylint:disable=redefined-outer-name + mock_network_response = Mock(DefaultNetworkResponse) + mock_network_response.ok = True + return mock_network_response + + +def test_get(test_storage_policy_assignment, mock_box_session): + expected_url = '{0}/storage_policy_assignments/{1}'.format(API.BASE_API_URL, test_storage_policy_assignment.object_id) + mock_box_session.get.return_value.json.return_value = { + 'type': 'storage_policy_assignment', + 'id': test_storage_policy_assignment.object_id, + } + storage_policy_assignment = test_storage_policy_assignment.get() + mock_box_session.get.assert_called_once_with(expected_url, headers=None, params=None) + assert isinstance(storage_policy_assignment, StoragePolicyAssignment) + + +def test_update(test_storage_policy_assignment, mock_box_session): + new_policy_id = '1234' + expected_url = '{0}/storage_policy_assignments/{1}'.format(API.BASE_API_URL, test_storage_policy_assignment.object_id) + mock_box_session.get.return_value.json.return_value = { + 'type': 'storage_policy_assignment', + 'id': new_policy_id, + } + storage_policy_assignment = test_storage_policy_assignment.update_info({ + 'storage_policy': { + 'type': 'storage_policy', + 'id': new_policy_id, + } + }) + data = { + 'storage_policy': { + 'type': 'storage_policy', + 'id': new_policy_id, + } + } + mock_box_session.put.assert_called_once_with(expected_url, data=json.dumps(data), headers=None, params=None) + assert isinstance(storage_policy_assignment, StoragePolicyAssignment) + + +def test_delete(test_storage_policy_assignment, delete_assignment_response, mock_box_session): + mock_box_session.delete.return_value = delete_assignment_response + response = test_storage_policy_assignment.delete() + expected_url = test_storage_policy_assignment.get_url() + mock_box_session.delete.assert_called_once_with(expected_url, params={}, expect_json_response=False, headers=None) + assert response is True From b317656eb782aeaff88816a65b2b48f539eb8ee3 Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 24 Aug 2018 11:09:34 -0700 Subject: [PATCH 02/28] fixed tests for client and added object_type in base object --- boxsdk/client/client.py | 21 ++++++++++++++------- boxsdk/object/base_api_json_object.py | 9 +++++++++ test/unit/client/test_client.py | 1 - 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 0e64eef62..3f0ade230 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -406,7 +406,8 @@ def create_group(self, name): def storage_policy(self, policy_id): """ Initialize a :class:`StoragePolicy` object, whose box id is policy_id. - :param policy_id: + + :param policy_id: The box ID of the :class:`StoragePolicy` object. :type policy_id: `unicode` @@ -420,7 +421,8 @@ def storage_policy(self, policy_id): def storage_policy_assignment(self, assignment_id): """ Initialize a :class:`StoragePolicyAssignment` object, whose box id is assignment_id. - :param assignment_id: + + :param assignment_id: The box ID of the :class:`StoragePolicyAssignment` object. :type assignment_id: `unicode` @@ -452,6 +454,8 @@ def storage_policies(self, limit=None, marker=None, fields=None): :rtype: :class:`BoxObjectCollection` """ + if limit is not None: + limit = limit return MarkerBasedObjectCollection( session=self._session, url=self.get_url('storage_policies'), @@ -461,13 +465,14 @@ def storage_policies(self, limit=None, marker=None, fields=None): return_full_pages=False, ) - def storage_policy_assignments(self, resolved_for_type, resolved_for_id, marker=None, fields=None): + def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=None, marker=None, fields=None): """ Get the entries in the storage policy assignment using limit-offset paging. - :param resolved_for_type: + + :param resolved_for_type: Set to either `user` or `enterprise` :type limit: - `unicode` + `unicode` or None :param resolved_for_id: The id of the user or enterprise :type limit: @@ -485,15 +490,17 @@ def storage_policy_assignments(self, resolved_for_type, resolved_for_id, marker= :rtype: :class:`BoxObjectCollection` """ + if limit is not None: + limit = limit additional_params = { 'resolved_for_type': resolved_for_type, 'resolved_for_id': resolved_for_id, } return MarkerBasedObjectCollection( session=self._session, - url='{0}/storage_policy_assignments'.format(API.BASE_API_URL), + url=self.get_url('storage_policy_assignments'), additional_params=additional_params, - limit=100, + limit=limit, marker=marker, fields=fields, ) diff --git a/boxsdk/object/base_api_json_object.py b/boxsdk/object/base_api_json_object.py index 00b52dc76..eecbdd4a2 100644 --- a/boxsdk/object/base_api_json_object.py +++ b/boxsdk/object/base_api_json_object.py @@ -125,6 +125,15 @@ def _description(self): """Return a description of the object if one exists.""" return "" + @property + def object_type(self): + """Return the Box type for the object. + + :rtype: + `unicode` + """ + return self._item_type + @property def response_object(self): """ diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index 2c6a43c24..2d297b7cb 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -421,7 +421,6 @@ def test_get_storage_policy_assignments(mock_client, mock_box_session): 'entries': [mock_assignment] } expected_params = { - 'limit': 100, 'resolved_for_type': resolved_for_type, 'resolved_for_id': resolved_for_id, } From dcba51c4232346fd459d098d4ffb6a1ea89005b1 Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 24 Aug 2018 13:19:27 -0700 Subject: [PATCH 03/28] removed extraneous line in storage policy assignment --- boxsdk/object/storage_policy_assignment.py | 1 - 1 file changed, 1 deletion(-) diff --git a/boxsdk/object/storage_policy_assignment.py b/boxsdk/object/storage_policy_assignment.py index cf9232a77..6583b5130 100644 --- a/boxsdk/object/storage_policy_assignment.py +++ b/boxsdk/object/storage_policy_assignment.py @@ -10,4 +10,3 @@ class StoragePolicyAssignment(BaseObject): def get_url(self, *args): return self._session.get_url('storage_policy_assignments', self._object_id, *args) - From c196988c769665bc7774e216d42450856cc6ff1b Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 24 Aug 2018 13:36:00 -0700 Subject: [PATCH 04/28] removed extraneous lines from test_storage_policy_assignment --- test/unit/object/test_storage_policy.py | 1 - test/unit/object/test_storage_policy_assignment.py | 1 - 2 files changed, 2 deletions(-) diff --git a/test/unit/object/test_storage_policy.py b/test/unit/object/test_storage_policy.py index 55dfb4854..d72b7beea 100644 --- a/test/unit/object/test_storage_policy.py +++ b/test/unit/object/test_storage_policy.py @@ -1,5 +1,4 @@ # coding: utf-8 - from __future__ import unicode_literals import json diff --git a/test/unit/object/test_storage_policy_assignment.py b/test/unit/object/test_storage_policy_assignment.py index eb9e90a87..decca98ef 100644 --- a/test/unit/object/test_storage_policy_assignment.py +++ b/test/unit/object/test_storage_policy_assignment.py @@ -10,7 +10,6 @@ from boxsdk.network.default_network import DefaultNetworkResponse - @pytest.fixture(scope='module') def delete_assignment_response(): # pylint:disable=redefined-outer-name From 5654ae0945b1f67b76deb24fd6348a66acf039bb Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 24 Aug 2018 13:44:04 -0700 Subject: [PATCH 05/28] switched import order --- boxsdk/object/storage_policy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index d04f0c0b1..2d7b3c73f 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -3,8 +3,8 @@ import json -from .base_object import BaseObject from boxsdk.util.translator import Translator +from .base_object import BaseObject class StoragePolicy(BaseObject): From 51ddeff00de2d7cdfdb872e5b75b02439049a955 Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 27 Aug 2018 16:28:13 -0700 Subject: [PATCH 06/28] added docs for storage policy endpoint --- docs/storage_policy.md | 93 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 docs/storage_policy.md diff --git a/docs/storage_policy.md b/docs/storage_policy.md new file mode 100644 index 000000000..944b67161 --- /dev/null +++ b/docs/storage_policy.md @@ -0,0 +1,93 @@ +Storage Policy +============== + +Allows the enterprise admin to manage the Storage Policies for users in their +enterprise. Used for an enterprise to decide storage location for users based on +where they work/reside. + +* [Get Storage Policy](#get-storage-policy) +* [Get List of Storage Policies](#get-list-of-storage-policies) +* [Create New Assignment](#create-new-assignment) +* [Get Assignment](#get-assignment) +* [Get Assignment For Target](#get-assignment-for-target) +* [Update Existing Assignment](#update-existing-assignment) +* [Assign Storage Policy](#assign-storage-policy) +* [Delete Assignment](#delete-assignment) + +Get Storage Policy +------------------ + +Calling ['get('storage_policy_id')'][get-info] will return the storage policy object. + +```python +storage_policy_id = '1234' +storage_policy = client.storage_policy(storage_policy_id) +storage_policy_info = storage_policy.get() +``` + +Get List of Storage Policies +---------------------------- + +Calling ['storage_policies()'][get-all] will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling ['storage_policies(limit=number_of_entries, fields=fields_to_retrieve)'][get-all-with-params]. + +```python +storage_policies = client.storage_policies(limit=100) +``` + +Assign Storage Policy +--------------------- + +To create new storage policy assignment call ['assign(item)'][assign]. + +```python +storage_policy_id = '5678' +item = {'type': 'user', 'id': '1234'} +storage_policy = client.storage_policy(storage_policyid) +storage_policy_assignment = storage_policy.assign(item) +``` + +Update Existing Assignment +-------------------------- + +Updating a storage policy assignment is done by calling ['update_info(update_item)'][update-info]. + +```python +storage_policy_assignment_id = '1234' +new_storage_policy_id = '5678' +updated_item = {'type': 'storage_policy', 'id': new_storage_policy_id} +storage_policy_assignment = client.storage_policy_assignment(storage_policy_assignment) +updated_assignment_info = storage_policy_assignment.update_info(updated_item) +``` + +Get Assignment +-------------- + +Calling ['get()'][get-assignment-info] will return a storage policy assignment object containing information about the assignment. + +```python +assignment_id = '1234' +storage_policy_assignment = client.storage_policy_assignment(assignment_id) +assignment_info = storage_policy_assignment.get() +``` + +Get Assignment for Target +------------------------- + +Calling ['storage_policy_assignments(resolved_for_type, resolved_for_id)'][get-assignment-for-target] will return a storage policy assignment object + +```python +resolved_for_type = 'user' +resolved_for_id = '1234' +assignment_info = client.storage_policy_assignments(resolved_for_type, resolved_for_id) +``` + +Delete Assignment +----------------- + +Calling [`delete()`][delete] will remove the storage policy assignment from the user. + +```python +assignment_id = '1234' +policy_assignment = client.storage_policy_assignment(assignment_id) +policy_assignment.delete() +``` \ No newline at end of file From 2d80470c416f78dfe87ef8d302e5628efa277de0 Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 7 Sep 2018 14:02:54 -0700 Subject: [PATCH 07/28] fixed docs for storage policy and removed constructors usage --- boxsdk/client/client.py | 6 ++---- boxsdk/object/storage_policy.py | 3 +-- docs/storage_policy.md | 37 +++++++++++---------------------- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 3f0ade230..9dd953772 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -8,8 +8,6 @@ from ..object.cloneable import Cloneable from ..util.api_call_decorator import api_call from ..object.search import Search -from ..object.storage_policy import StoragePolicy -from ..object.storage_policy_assignment import StoragePolicyAssignment from ..object.events import Events from ..pagination.limit_offset_based_object_collection import LimitOffsetBasedObjectCollection from ..pagination.marker_based_object_collection import MarkerBasedObjectCollection @@ -416,7 +414,7 @@ def storage_policy(self, policy_id): :rtype: :class:`StoragePolicy` """ - return StoragePolicy(session=self._session, object_id=policy_id) + return self.translator.translate('storage_policy')(session=self._session, object_id=policy_id) def storage_policy_assignment(self, assignment_id): """ @@ -431,7 +429,7 @@ def storage_policy_assignment(self, assignment_id): :rtype: :class:`StoragePolicyAssignment` """ - return StoragePolicyAssignment(session=self._session, object_id=assignment_id) + return self.translator.translate('storage_policy_assignment')(session=self._session, object_id=assignment_id) def storage_policies(self, limit=None, marker=None, fields=None): """ diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index 2d7b3c73f..1356eed30 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -3,7 +3,6 @@ import json -from boxsdk.util.translator import Translator from .base_object import BaseObject @@ -31,7 +30,7 @@ def assign(self, item): } } response = self._session.post(url, data=json.dumps(body)).json() - return Translator().translate(response['type'])( + return self.translator().translate(response['type'])( self._session, response['id'], response, diff --git a/docs/storage_policy.md b/docs/storage_policy.md index 944b67161..4419d4847 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -5,30 +5,21 @@ Allows the enterprise admin to manage the Storage Policies for users in their enterprise. Used for an enterprise to decide storage location for users based on where they work/reside. -* [Get Storage Policy](#get-storage-policy) -* [Get List of Storage Policies](#get-list-of-storage-policies) -* [Create New Assignment](#create-new-assignment) -* [Get Assignment](#get-assignment) -* [Get Assignment For Target](#get-assignment-for-target) -* [Update Existing Assignment](#update-existing-assignment) -* [Assign Storage Policy](#assign-storage-policy) -* [Delete Assignment](#delete-assignment) Get Storage Policy ------------------ -Calling ['get('storage_policy_id')'][get-info] will return the storage policy object. +Calling 'storage_policy.get('storage_policy_id')' will return the storage policy object. ```python storage_policy_id = '1234' -storage_policy = client.storage_policy(storage_policy_id) -storage_policy_info = storage_policy.get() +storage_policy = client.storage_policy(storage_policy_id).get() ``` Get List of Storage Policies ---------------------------- -Calling ['storage_policies()'][get-all] will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling ['storage_policies(limit=number_of_entries, fields=fields_to_retrieve)'][get-all-with-params]. +Calling `client.storage_policies()` will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling `client.storage_policies(limit=number_of_entries, fields=fields_to_retrieve)`. ```python storage_policies = client.storage_policies(limit=100) @@ -37,43 +28,40 @@ storage_policies = client.storage_policies(limit=100) Assign Storage Policy --------------------- -To create new storage policy assignment call ['assign(item)'][assign]. +To create new storage policy assignment call `storage_policy.assign(item)`. ```python storage_policy_id = '5678' item = {'type': 'user', 'id': '1234'} -storage_policy = client.storage_policy(storage_policyid) -storage_policy_assignment = storage_policy.assign(item) +storage_policy_assignment = client.storage_policy(storage_policyid).assign(item) ``` Update Existing Assignment -------------------------- -Updating a storage policy assignment is done by calling ['update_info(update_item)'][update-info]. +Updating a storage policy assignment is done by calling `storage_policy.update_info(update_item)`. ```python storage_policy_assignment_id = '1234' new_storage_policy_id = '5678' updated_item = {'type': 'storage_policy', 'id': new_storage_policy_id} -storage_policy_assignment = client.storage_policy_assignment(storage_policy_assignment) -updated_assignment_info = storage_policy_assignment.update_info(updated_item) +updated_storage_policy_assignment = client.storage_policy_assignment(storage_policy_assignment).update_info(updated_item) ``` Get Assignment -------------- -Calling ['get()'][get-assignment-info] will return a storage policy assignment object containing information about the assignment. +Calling `storage_policy_assignment.get()` will return a storage policy assignment object containing information about the assignment. ```python assignment_id = '1234' -storage_policy_assignment = client.storage_policy_assignment(assignment_id) -assignment_info = storage_policy_assignment.get() +storage_policy_assignment = client.storage_policy_assignment(assignment_id).get() ``` Get Assignment for Target ------------------------- -Calling ['storage_policy_assignments(resolved_for_type, resolved_for_id)'][get-assignment-for-target] will return a storage policy assignment object +Calling `client.storage_policy_assignments(resolved_for_type, resolved_for_id)` will return a storage policy assignment object ```python resolved_for_type = 'user' @@ -84,10 +72,9 @@ assignment_info = client.storage_policy_assignments(resolved_for_type, resolved_ Delete Assignment ----------------- -Calling [`delete()`][delete] will remove the storage policy assignment from the user. +Calling `storage_policy_assignment.delete()` will remove the storage policy assignment from the user. ```python assignment_id = '1234' -policy_assignment = client.storage_policy_assignment(assignment_id) -policy_assignment.delete() +policy_assignment = client.storage_policy_assignment(assignment_id).delete() ``` \ No newline at end of file From e6a3e8b5e54ab0bfd24c72f807e72b58a1ab2039 Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 7 Sep 2018 16:32:24 -0700 Subject: [PATCH 08/28] fixed updates to storage policies --- boxsdk/client/client.py | 15 +++++---------- boxsdk/object/storage_policy.py | 14 +++++++++++--- docs/storage_policy.md | 14 ++++++++------ 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 9dd953772..c49189ec4 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -452,8 +452,6 @@ def storage_policies(self, limit=None, marker=None, fields=None): :rtype: :class:`BoxObjectCollection` """ - if limit is not None: - limit = limit return MarkerBasedObjectCollection( session=self._session, url=self.get_url('storage_policies'), @@ -488,19 +486,16 @@ def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=N :rtype: :class:`BoxObjectCollection` """ - if limit is not None: - limit = limit additional_params = { 'resolved_for_type': resolved_for_type, 'resolved_for_id': resolved_for_id, } - return MarkerBasedObjectCollection( + box_response = self._session.get(url, params=additional_params) + response = box_response.json() + return self.translator.translate('storage_policy_assignment')( session=self._session, - url=self.get_url('storage_policy_assignments'), - additional_params=additional_params, - limit=limit, - marker=marker, - fields=fields, + object_id=response['id'], + response_object=response['entries'][0], ) @api_call diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index 1356eed30..5e848f1bb 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -17,7 +17,15 @@ def get_url(self, *args): """ return self._session.get_url('storage_policies', self._object_id, *args) - def assign(self, item): + def assign(self, assignee): + """ + Assign a storage policy to a `user` or `enterprise` + + :param assignee: + The `user` or `enterprise` to assign the storage policy to + :type: + :class:User + """ url = self._session.get_url('storage_policy_assignments') body = { 'storage_policy': { @@ -25,8 +33,8 @@ def assign(self, item): 'id': self.object_id, }, 'assigned_to': { - 'type': item.object_type, - 'id': item.object_id, + 'type': assignee.object_type, + 'id': assignee.object_id, } } response = self._session.post(url, data=json.dumps(body)).json() diff --git a/docs/storage_policy.md b/docs/storage_policy.md index 4419d4847..afcf11b19 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -9,20 +9,22 @@ where they work/reside. Get Storage Policy ------------------ -Calling 'storage_policy.get('storage_policy_id')' will return the storage policy object. +Calling `storage_policy.get(storage_policy_id)` will return the storage policy object. ```python storage_policy_id = '1234' storage_policy = client.storage_policy(storage_policy_id).get() ``` -Get List of Storage Policies ----------------------------- +List Available Storage Policies +------------------------------- -Calling `client.storage_policies()` will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling `client.storage_policies(limit=number_of_entries, fields=fields_to_retrieve)`. +Calling `client.storage_policies()` will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling `client.storage_policies(limit=None, fields=None)`. ```python storage_policies = client.storage_policies(limit=100) +for storage_policy in storage_policies: + # Do something ``` Assign Storage Policy @@ -32,8 +34,8 @@ To create new storage policy assignment call `storage_policy.assign(item)`. ```python storage_policy_id = '5678' -item = {'type': 'user', 'id': '1234'} -storage_policy_assignment = client.storage_policy(storage_policyid).assign(item) +user = client.user('1234') +storage_policy_assignment = client.storage_policy(storage_policyid).assign(user) ``` Update Existing Assignment From 55505d8aac16799ae6dc583381865e62e840aa3c Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 10 Sep 2018 11:51:39 -0700 Subject: [PATCH 09/28] updated docs and moved assignment onto user --- boxsdk/client/client.py | 15 ++++++++++----- boxsdk/object/user.py | 34 +++++++++++++++++++++++++++++++++ test/unit/client/test_client.py | 3 +-- test/unit/object/test_user.py | 23 ++++++++++++++++++++++ 4 files changed, 68 insertions(+), 7 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index c49189ec4..561241a77 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -467,12 +467,16 @@ def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=N :param resolved_for_type: Set to either `user` or `enterprise` - :type limit: - `unicode` or None + :type resolved_for_type: + `unicode` :param resolved_for_id: - The id of the user or enterprise - :type limit: + The id of the `user` or `enterprise` + :type resolved_for_id: `unicode` + :param limit: + The number of entries to retrieve + :type limit: + `unicode` or None :param marker: The paging marker to start paging from. :type marker: @@ -486,6 +490,7 @@ def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=N :rtype: :class:`BoxObjectCollection` """ + url = self._session.get_url('storage_policy_assignments') additional_params = { 'resolved_for_type': resolved_for_type, 'resolved_for_id': resolved_for_id, @@ -494,7 +499,7 @@ def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=N response = box_response.json() return self.translator.translate('storage_policy_assignment')( session=self._session, - object_id=response['id'], + object_id=response['entries'][0]['id'], response_object=response['entries'][0], ) diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index 8746bf92f..a687bf29a 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -9,3 +9,37 @@ class User(BaseObject): """Represents a Box user.""" _item_type = 'user' + + def storage_policy_assignments(self, limit=None, marker=None, fields=None): + """ + Get the entries in the storage policy assignment using limit-offset paging. + + :param limit: + The number of entries to retrieve. + :type limit: + `unicode` or None + :param marker: + The paging marker to start paging from. + :type marker: + `str` or None + :param fields: + List of fields to request. + :type fields: + `Iterable` of `unicode` + :returns: + An iterator of the entries in the storage policy assignment + :rtype: + :class:`BoxObjectCollection` + """ + url = self._session.get_url('storage_policy_assignments') + additional_params = { + 'resolved_for_type': 'user', + 'resolved_for_id': self.object_id, + } + box_response = self._session.get(url, params=additional_params) + response = box_response.json() + return self.translator.translate('storage_policy_assignment')( + session=self._session, + object_id=response['entries'][0]['id'], + response_object=response['entries'][0], + ) diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index 2d297b7cb..724c45eab 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -424,8 +424,7 @@ def test_get_storage_policy_assignments(mock_client, mock_box_session): 'resolved_for_type': resolved_for_type, 'resolved_for_id': resolved_for_id, } - assignments = mock_client.storage_policy_assignments(resolved_for_type, resolved_for_id) - assignment = assignments.next() + assignment = mock_client.storage_policy_assignments(resolved_for_type, resolved_for_id) mock_box_session.get.assert_called_once_with(expected_url, params=expected_params) assert isinstance(assignment, StoragePolicyAssignment) assert assignment.id == mock_assignment['id'] diff --git a/test/unit/object/test_user.py b/test/unit/object/test_user.py index 6e0858f5b..3b21b8374 100644 --- a/test/unit/object/test_user.py +++ b/test/unit/object/test_user.py @@ -3,8 +3,31 @@ from __future__ import unicode_literals from boxsdk.config import API +from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment +from boxsdk.pagination.marker_based_object_collection import MarkerBasedObjectCollection def test_user_url(mock_user): # pylint:disable=redefined-outer-name, protected-access assert mock_user.get_url() == '{0}/{1}/{2}'.format(API.BASE_API_URL, 'users', mock_user.object_id) + + +def test_get_storage_policy_assignments(mock_user, mock_box_session): + expected_url = mock_box_session.get_url('storage_policy_assignments') + mock_assignment = { + 'type': 'storage_policy_assignment', + 'id': '12345', + } + mock_box_session.get.return_value.json.return_value = { + 'limit': 100, + 'entries': [mock_assignment] + } + expected_params = { + 'resolved_for_type': 'user', + 'resolved_for_id': mock_user.object_id, + } + assignment = mock_user.storage_policy_assignments() + mock_box_session.get.assert_called_once_with(expected_url, params=expected_params) + assert isinstance(assignment, StoragePolicyAssignment) + assert assignment.id == mock_assignment['id'] + assert assignment.type == mock_assignment['type'] From 52f6bc84b13731fdb48a4171948ed61e6d81c335 Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 10 Sep 2018 13:28:48 -0700 Subject: [PATCH 10/28] fixed assign on storage policy --- boxsdk/object/storage_policy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index 5e848f1bb..fe6726da9 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -38,7 +38,7 @@ def assign(self, assignee): } } response = self._session.post(url, data=json.dumps(body)).json() - return self.translator().translate(response['type'])( + return self.translator.translate(response['type'])( self._session, response['id'], response, From c9fd61b9c2b4715341548ce872326b30cc798125 Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 10 Sep 2018 14:53:55 -0700 Subject: [PATCH 11/28] removedu unused fields --- boxsdk/client/client.py | 10 +--------- boxsdk/object/user.py | 10 +--------- docs/storage_policy.md | 11 +++++------ 3 files changed, 7 insertions(+), 24 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 561241a77..8ee7a6156 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -431,18 +431,10 @@ def storage_policy_assignment(self, assignment_id): """ return self.translator.translate('storage_policy_assignment')(session=self._session, object_id=assignment_id) - def storage_policies(self, limit=None, marker=None, fields=None): + def storage_policies(self, fields=None): """ Get the entries in the storage policy using marker-based paging. - :param limit: - The maximum number of entries to return per page. If not specified, then will use the server-side default. - :type limit: - `int` or None - :param marker: - The paging marker to start paging from. - :type marker: - `str` or None :param fields: List of fields to request. :type fields: diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index a687bf29a..baf75db0a 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -10,18 +10,10 @@ class User(BaseObject): _item_type = 'user' - def storage_policy_assignments(self, limit=None, marker=None, fields=None): + def storage_policy_assignments(self, fields=None): """ Get the entries in the storage policy assignment using limit-offset paging. - :param limit: - The number of entries to retrieve. - :type limit: - `unicode` or None - :param marker: - The paging marker to start paging from. - :type marker: - `str` or None :param fields: List of fields to request. :type fields: diff --git a/docs/storage_policy.md b/docs/storage_policy.md index afcf11b19..5e7a79c3d 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -60,15 +60,14 @@ assignment_id = '1234' storage_policy_assignment = client.storage_policy_assignment(assignment_id).get() ``` -Get Assignment for Target +Get Assignment for User ------------------------- -Calling `client.storage_policy_assignments(resolved_for_type, resolved_for_id)` will return a storage policy assignment object +Calling `user.storage_policy_assignments(fields=None)` will return a storage policy assignment object ```python -resolved_for_type = 'user' -resolved_for_id = '1234' -assignment_info = client.storage_policy_assignments(resolved_for_type, resolved_for_id) +user_id = '1111' +assignment_info = client.user(user_id).storage_policy_assignments() ``` Delete Assignment @@ -79,4 +78,4 @@ Calling `storage_policy_assignment.delete()` will remove the storage policy assi ```python assignment_id = '1234' policy_assignment = client.storage_policy_assignment(assignment_id).delete() -``` \ No newline at end of file +``` From 5bfc33059b80fd7eb1e8b781e8a69e7e25c0a004 Mon Sep 17 00:00:00 2001 From: carycheng Date: Tue, 11 Sep 2018 11:47:32 -0700 Subject: [PATCH 12/28] added limit and marker --- boxsdk/client/client.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 8ee7a6156..e7b27e017 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -431,10 +431,18 @@ def storage_policy_assignment(self, assignment_id): """ return self.translator.translate('storage_policy_assignment')(session=self._session, object_id=assignment_id) - def storage_policies(self, fields=None): + def storage_policies(self, limit=None, marker=None, fields=None): """ Get the entries in the storage policy using marker-based paging. + :param limit: + The maximum number of items to return. + :type limit: + `int` or None + :param marker: + The paging marker to start returning items from when using marker-based paging. + :type marker: + `unicode` or None :param fields: List of fields to request. :type fields: From 409023d2aaa37c3ea30cfd027ba6ff3fc3c45bbd Mon Sep 17 00:00:00 2001 From: carycheng Date: Tue, 11 Sep 2018 12:08:47 -0700 Subject: [PATCH 13/28] removed unused fields --- boxsdk/client/client.py | 14 +------------- boxsdk/object/user.py | 6 +----- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index e7b27e017..bc68a0165 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -461,7 +461,7 @@ def storage_policies(self, limit=None, marker=None, fields=None): return_full_pages=False, ) - def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=None, marker=None, fields=None): + def storage_policy_assignments(self, resolved_for_type, resolved_for_id): """ Get the entries in the storage policy assignment using limit-offset paging. @@ -473,18 +473,6 @@ def storage_policy_assignments(self, resolved_for_type, resolved_for_id, limit=N The id of the `user` or `enterprise` :type resolved_for_id: `unicode` - :param limit: - The number of entries to retrieve - :type limit: - `unicode` or None - :param marker: - The paging marker to start paging from. - :type marker: - `str` or None - :param fields: - List of fields to request. - :type fields: - `Iterable` of `unicode` :returns: An iterator of the entries in the storage policy assignment :rtype: diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index baf75db0a..537b09599 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -10,14 +10,10 @@ class User(BaseObject): _item_type = 'user' - def storage_policy_assignments(self, fields=None): + def storage_policy_assignments(self): """ Get the entries in the storage policy assignment using limit-offset paging. - :param fields: - List of fields to request. - :type fields: - `Iterable` of `unicode` :returns: An iterator of the entries in the storage policy assignment :rtype: From 197baced158461840646825455d126092125b919 Mon Sep 17 00:00:00 2001 From: carycheng Date: Tue, 11 Sep 2018 12:22:41 -0700 Subject: [PATCH 14/28] removed unused import --- test/unit/object/test_user.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/object/test_user.py b/test/unit/object/test_user.py index 3b21b8374..1c2f03341 100644 --- a/test/unit/object/test_user.py +++ b/test/unit/object/test_user.py @@ -4,7 +4,6 @@ from boxsdk.config import API from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment -from boxsdk.pagination.marker_based_object_collection import MarkerBasedObjectCollection def test_user_url(mock_user): From b5af4faf76b2ef072af88571160e18a6224f2534 Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 14 Sep 2018 14:01:45 -0700 Subject: [PATCH 15/28] fixed from feedback --- boxsdk/object/__init__.py | 2 ++ boxsdk/object/storage_policy.py | 6 +++++- boxsdk/object/storage_policy_assignment.py | 3 --- boxsdk/object/user.py | 12 ++++++------ docs/storage_policy.md | 12 ++++++------ test/unit/object/test_user.py | 2 +- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/boxsdk/object/__init__.py b/boxsdk/object/__init__.py index 3d83fbe50..5f1140649 100644 --- a/boxsdk/object/__init__.py +++ b/boxsdk/object/__init__.py @@ -17,5 +17,7 @@ 'group_membership', 'recent_item', 'search', + 'storage_policy', + 'storage_policy_assignment', 'user', ])) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index fe6726da9..54bb4856a 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -24,7 +24,11 @@ def assign(self, assignee): :param assignee: The `user` or `enterprise` to assign the storage policy to :type: - :class:User + :class:`User` + :returns: + Information about the :class:`StoragePolicyAssignment` object + :rtype: + :class:`StoragePolicyAssignment` """ url = self._session.get_url('storage_policy_assignments') body = { diff --git a/boxsdk/object/storage_policy_assignment.py b/boxsdk/object/storage_policy_assignment.py index 6583b5130..01b14fafa 100644 --- a/boxsdk/object/storage_policy_assignment.py +++ b/boxsdk/object/storage_policy_assignment.py @@ -7,6 +7,3 @@ class StoragePolicyAssignment(BaseObject): """Represents the storage policy assignment""" _item_type = 'storage_policy_assignment' - - def get_url(self, *args): - return self._session.get_url('storage_policy_assignments', self._object_id, *args) diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index 537b09599..a8f5cdaa0 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -10,14 +10,14 @@ class User(BaseObject): _item_type = 'user' - def storage_policy_assignments(self): + def get_storage_policy_assignment(self): """ Get the entries in the storage policy assignment using limit-offset paging. :returns: - An iterator of the entries in the storage policy assignment + The :class:`StoragePolicyAssignment` object information :rtype: - :class:`BoxObjectCollection` + :class:`StoragePolicyAssignment` """ url = self._session.get_url('storage_policy_assignments') additional_params = { @@ -25,9 +25,9 @@ def storage_policy_assignments(self): 'resolved_for_id': self.object_id, } box_response = self._session.get(url, params=additional_params) - response = box_response.json() + response = box_response.json()['entries'][0] return self.translator.translate('storage_policy_assignment')( session=self._session, - object_id=response['entries'][0]['id'], - response_object=response['entries'][0], + object_id=response['id'], + response_object=response, ) diff --git a/docs/storage_policy.md b/docs/storage_policy.md index 5e7a79c3d..264300754 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -35,7 +35,7 @@ To create new storage policy assignment call `storage_policy.assign(item)`. ```python storage_policy_id = '5678' user = client.user('1234') -storage_policy_assignment = client.storage_policy(storage_policyid).assign(user) +storage_policy_assignment = client.storage_policy(storage_policy_id).assign(user) ``` Update Existing Assignment @@ -45,9 +45,9 @@ Updating a storage policy assignment is done by calling `storage_policy.update_i ```python storage_policy_assignment_id = '1234' -new_storage_policy_id = '5678' -updated_item = {'type': 'storage_policy', 'id': new_storage_policy_id} -updated_storage_policy_assignment = client.storage_policy_assignment(storage_policy_assignment).update_info(updated_item) +new__storage_policy_id = '5678' +new_storage_policy = client.storage_policy('5678') +updated_storage_policy_assignment = client.storage_policy_assignment(storage_policy_assignment).update_info(new_storage_policy) ``` Get Assignment @@ -63,11 +63,11 @@ storage_policy_assignment = client.storage_policy_assignment(assignment_id).get( Get Assignment for User ------------------------- -Calling `user.storage_policy_assignments(fields=None)` will return a storage policy assignment object +Calling `user.get_storage_policy_assignment(fields=None)` will return a storage policy assignment object ```python user_id = '1111' -assignment_info = client.user(user_id).storage_policy_assignments() +assignment_info = client.user(user_id).get_storage_policy_assignment() ``` Delete Assignment diff --git a/test/unit/object/test_user.py b/test/unit/object/test_user.py index 1c2f03341..411c464b7 100644 --- a/test/unit/object/test_user.py +++ b/test/unit/object/test_user.py @@ -25,7 +25,7 @@ def test_get_storage_policy_assignments(mock_user, mock_box_session): 'resolved_for_type': 'user', 'resolved_for_id': mock_user.object_id, } - assignment = mock_user.storage_policy_assignments() + assignment = mock_user.get_storage_policy_assignment() mock_box_session.get.assert_called_once_with(expected_url, params=expected_params) assert isinstance(assignment, StoragePolicyAssignment) assert assignment.id == mock_assignment['id'] From e19babf24d81965bcb5f1d6fc2e19ebc4c6385c0 Mon Sep 17 00:00:00 2001 From: carycheng Date: Sun, 16 Sep 2018 15:04:52 -0700 Subject: [PATCH 16/28] changes to storage policy --- boxsdk/client/client.py | 32 +------------------------------- docs/storage_policy.md | 10 ++++------ test/unit/client/test_client.py | 25 +------------------------ 3 files changed, 6 insertions(+), 61 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index bc68a0165..81155ea23 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -431,7 +431,7 @@ def storage_policy_assignment(self, assignment_id): """ return self.translator.translate('storage_policy_assignment')(session=self._session, object_id=assignment_id) - def storage_policies(self, limit=None, marker=None, fields=None): + def get_storage_policies(self, limit=None, marker=None, fields=None): """ Get the entries in the storage policy using marker-based paging. @@ -461,36 +461,6 @@ def storage_policies(self, limit=None, marker=None, fields=None): return_full_pages=False, ) - def storage_policy_assignments(self, resolved_for_type, resolved_for_id): - """ - Get the entries in the storage policy assignment using limit-offset paging. - - :param resolved_for_type: - Set to either `user` or `enterprise` - :type resolved_for_type: - `unicode` - :param resolved_for_id: - The id of the `user` or `enterprise` - :type resolved_for_id: - `unicode` - :returns: - An iterator of the entries in the storage policy assignment - :rtype: - :class:`BoxObjectCollection` - """ - url = self._session.get_url('storage_policy_assignments') - additional_params = { - 'resolved_for_type': resolved_for_type, - 'resolved_for_id': resolved_for_id, - } - box_response = self._session.get(url, params=additional_params) - response = box_response.json() - return self.translator.translate('storage_policy_assignment')( - session=self._session, - object_id=response['entries'][0]['id'], - response_object=response['entries'][0], - ) - @api_call def get_recent_items(self, limit=None, marker=None, fields=None, **collection_kwargs): """ diff --git a/docs/storage_policy.md b/docs/storage_policy.md index 264300754..b0e427a82 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -19,10 +19,10 @@ storage_policy = client.storage_policy(storage_policy_id).get() List Available Storage Policies ------------------------------- -Calling `client.storage_policies()` will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling `client.storage_policies(limit=None, fields=None)`. +Calling `client.get_storage_policies()` will return an iterable that will page through all of the storage policies. It is possible to specify maxiumum number of items per response and fields to retrieve by caling `client.get_storage_policies(limit=None, fields=None)`. ```python -storage_policies = client.storage_policies(limit=100) +storage_policies = client.get_storage_policies(limit=100) for storage_policy in storage_policies: # Do something ``` @@ -44,10 +44,8 @@ Update Existing Assignment Updating a storage policy assignment is done by calling `storage_policy.update_info(update_item)`. ```python -storage_policy_assignment_id = '1234' -new__storage_policy_id = '5678' -new_storage_policy = client.storage_policy('5678') -updated_storage_policy_assignment = client.storage_policy_assignment(storage_policy_assignment).update_info(new_storage_policy) +updated_storage_policy = {'storage_policy': {'type': 'storage_policy', 'id': '1234'}} +updated_assignment = client.storage_policy_assignment('ZW50ZXJwcmldfgeV82MDMwMDQ=').update_info(updated_storage_policy) ``` Get Assignment diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index 724c45eab..69b134b14 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -400,7 +400,7 @@ def test_get_storage_policies(mock_client, mock_box_session): 'limit': 100, 'entries': [mock_policy] } - policies = mock_client.storage_policies() + policies = mock_client.get_storage_policies() policy = policies.next() mock_box_session.get.assert_called_once_with(expected_url, params={}) assert isinstance(policy, StoragePolicy) @@ -408,29 +408,6 @@ def test_get_storage_policies(mock_client, mock_box_session): assert policy.name == mock_policy['name'] -def test_get_storage_policy_assignments(mock_client, mock_box_session): - resolved_for_type = 'user' - resolved_for_id = '1234' - expected_url = mock_box_session.get_url('storage_policy_assignments') - mock_assignment = { - 'type': 'storage_policy_assignment', - 'id': '12345', - } - mock_box_session.get.return_value.json.return_value = { - 'limit': 100, - 'entries': [mock_assignment] - } - expected_params = { - 'resolved_for_type': resolved_for_type, - 'resolved_for_id': resolved_for_id, - } - assignment = mock_client.storage_policy_assignments(resolved_for_type, resolved_for_id) - mock_box_session.get.assert_called_once_with(expected_url, params=expected_params) - assert isinstance(assignment, StoragePolicyAssignment) - assert assignment.id == mock_assignment['id'] - assert assignment.type == mock_assignment['type'] - - @pytest.fixture def check_downscope_token_request( mock_client, From 1c6d8af43049c7946efad85b7142783c911746fc Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 17 Sep 2018 10:59:58 -0700 Subject: [PATCH 17/28] fixed docs for storage policy --- boxsdk/object/storage_policy.py | 1 + docs/storage_policy.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index 54bb4856a..d717f910e 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -42,6 +42,7 @@ def assign(self, assignee): } } response = self._session.post(url, data=json.dumps(body)).json() + if response.status is return self.translator.translate(response['type'])( self._session, response['id'], diff --git a/docs/storage_policy.md b/docs/storage_policy.md index b0e427a82..697e84d75 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -61,7 +61,7 @@ storage_policy_assignment = client.storage_policy_assignment(assignment_id).get( Get Assignment for User ------------------------- -Calling `user.get_storage_policy_assignment(fields=None)` will return a storage policy assignment object +Calling `user.get_storage_policy_assignment(fields=None)` will return the storage policy assigned to the specified user. ```python user_id = '1111' From eff576bc2a7cfc6d78741aeefba596f245ec3cc6 Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 17 Sep 2018 11:17:01 -0700 Subject: [PATCH 18/28] removed unused lines --- boxsdk/object/storage_policy.py | 1 - 1 file changed, 1 deletion(-) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index d717f910e..54bb4856a 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -42,7 +42,6 @@ def assign(self, assignee): } } response = self._session.post(url, data=json.dumps(body)).json() - if response.status is return self.translator.translate(response['type'])( self._session, response['id'], From 072f68afdecfbdfc58c6103a1124c2e420dbf083 Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 17 Sep 2018 13:22:24 -0700 Subject: [PATCH 19/28] removed unused import --- test/unit/client/test_client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index 69b134b14..fba11d018 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -22,7 +22,6 @@ from boxsdk.object.file import File from boxsdk.object.group import Group from boxsdk.object.storage_policy import StoragePolicy -from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment from boxsdk.object.user import User from boxsdk.object.group_membership import GroupMembership from boxsdk.pagination.marker_based_object_collection import MarkerBasedObjectCollection From defb9f1d2ed5d61d62abed96779063926e054ecc Mon Sep 17 00:00:00 2001 From: carycheng Date: Mon, 17 Sep 2018 16:58:16 -0700 Subject: [PATCH 20/28] fixed from feedback --- docs/storage_policy.md | 2 +- test/unit/object/test_storage_policy.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/storage_policy.md b/docs/storage_policy.md index 697e84d75..10fda6b8f 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -75,5 +75,5 @@ Calling `storage_policy_assignment.delete()` will remove the storage policy assi ```python assignment_id = '1234' -policy_assignment = client.storage_policy_assignment(assignment_id).delete() +client.storage_policy_assignment(assignment_id).delete() ``` diff --git a/test/unit/object/test_storage_policy.py b/test/unit/object/test_storage_policy.py index d72b7beea..e3b616878 100644 --- a/test/unit/object/test_storage_policy.py +++ b/test/unit/object/test_storage_policy.py @@ -18,7 +18,7 @@ def test_get(test_storage_policy, mock_box_session): def test_assign(test_storage_policy, mock_user, mock_box_session): - expected_url = mock_box_session.get_url('storage_policy_assignments') + expected_url = '{0}/storage_policy_assignments'.format(API.BASE_API_URL) expected_data = { 'storage_policy': { 'type': 'storage_policy', From 146284a3fa69513c292899f52405c2e823522208 Mon Sep 17 00:00:00 2001 From: carycheng Date: Tue, 23 Oct 2018 17:39:52 -0700 Subject: [PATCH 21/28] updates to storage policies --- boxsdk/object/storage_policy.py | 46 ++++++++++++++++++++----- boxsdk/object/user.py | 1 + test/unit/object/test_storage_policy.py | 7 +++- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index 54bb4856a..da9cc9562 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -17,12 +17,40 @@ def get_url(self, *args): """ return self._session.get_url('storage_policies', self._object_id, *args) - def assign(self, assignee): + def assign(self, user): """ - Assign a storage policy to a `user` or `enterprise` + Assign a storage policy to a user - :param assignee: - The `user` or `enterprise` to assign the storage policy to + :param user: + The class:`User` to assign the storage policy to + :type user: + :class:`User` + :returns: + Information about the :class:`StoragePolicyAssignment` object. + :rtype: + :class:`StoragePolicyAssignment` + """ + assignment = user.get_storage_policy_assignment() + if assignment.id == self.object_id: + return assignment + + if assignment.assigned_to['type'] == 'enterprise': + return self.create_assignment(user) + + update_object = { + 'storage_policy': { + 'type': self.object_type, + 'id': self.object_id, + }, + } + return self.update_info(update_object) + + def create_assignment(self, user): + """ + Assign a storage policy to a :class:`User`. + + :param user: + The :class:'User` to assign the storage policy to. :type: :class:`User` :returns: @@ -37,13 +65,13 @@ def assign(self, assignee): 'id': self.object_id, }, 'assigned_to': { - 'type': assignee.object_type, - 'id': assignee.object_id, + 'type': user.object_type, + 'id': user.object_id, } } response = self._session.post(url, data=json.dumps(body)).json() return self.translator.translate(response['type'])( - self._session, - response['id'], - response, + session=self._session, + object_id=response['id'], + respons_object=response, ) diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index f997d51a5..d243fdde3 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -31,6 +31,7 @@ def get_storage_policy_assignment(self): session=self._session, object_id=response['id'], response_object=response, + ) def get_group_memberships(self, limit=None, offset=None, fields=None): """ diff --git a/test/unit/object/test_storage_policy.py b/test/unit/object/test_storage_policy.py index e3b616878..d2133d689 100644 --- a/test/unit/object/test_storage_policy.py +++ b/test/unit/object/test_storage_policy.py @@ -19,6 +19,11 @@ def test_get(test_storage_policy, mock_box_session): def test_assign(test_storage_policy, mock_user, mock_box_session): expected_url = '{0}/storage_policy_assignments'.format(API.BASE_API_URL) + + + +def test_create_assignment(test_storage_policy, mock_user, mock_box_session): + expected_url = '{0}/storage_policy_assignments'.format(API.BASE_API_URL) expected_data = { 'storage_policy': { 'type': 'storage_policy', @@ -38,7 +43,7 @@ def test_assign(test_storage_policy, mock_user, mock_box_session): } } mock_box_session.post.return_value.json.return_value = mock_assignment - assignment = test_storage_policy.assign(mock_user) + assignment = test_storage_policy.create_assignment(mock_user) mock_box_session.post.assert_called_once_with(expected_url, data=json.dumps(expected_data)) assert assignment.id == mock_assignment['id'] assert assignment.storage_policy['id'] == mock_assignment['storage_policy']['id'] From 23ba14a51cea0f55f9d3b782eeeeb49efb430075 Mon Sep 17 00:00:00 2001 From: carycheng Date: Wed, 24 Oct 2018 16:55:04 -0700 Subject: [PATCH 22/28] added tests for storage policy assign method --- boxsdk/client/client.py | 5 + boxsdk/object/storage_policy.py | 7 +- boxsdk/object/user.py | 6 +- docs/storage_policy.md | 26 +++-- test/unit/object/test_storage_policy.py | 140 ++++++++++++++++++++++-- 5 files changed, 164 insertions(+), 20 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 20a73c5de..bae9913b0 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -640,6 +640,11 @@ def get_storage_policies(self, limit=None, marker=None, fields=None): return MarkerBasedObjectCollection( session=self._session, url=self.get_url('storage_policies'), + limit=limit, + marker=marker, + fields=fields, + return_full_pages=False, + ) def retention_policy(self, retention_id): """ diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index da9cc9562..7e7be05b3 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -19,7 +19,8 @@ def get_url(self, *args): def assign(self, user): """ - Assign a storage policy to a user + Checks to see if a user is already assigned a storage policy or if the storage policy assigned + to user belongs to the enterprise. If neither, then update the user storage policy to the new one. :param user: The class:`User` to assign the storage policy to @@ -43,7 +44,7 @@ def assign(self, user): 'id': self.object_id, }, } - return self.update_info(update_object) + return assignment.update_info(update_object) def create_assignment(self, user): """ @@ -73,5 +74,5 @@ def create_assignment(self, user): return self.translator.translate(response['type'])( session=self._session, object_id=response['id'], - respons_object=response, + response_object=response, ) diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index d243fdde3..ee06fa558 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -13,16 +13,16 @@ class User(BaseObject): def get_storage_policy_assignment(self): """ - Get the entries in the storage policy assignment using limit-offset paging. + Get the storage policy assignment assigned to the user. :returns: The :class:`StoragePolicyAssignment` object information :rtype: :class:`StoragePolicyAssignment` """ - url = self._session.get_url('storage_policy_assignments') + url = self._session.get_url('storage_policy_assignments') additional_params = { - 'resolved_for_type': 'user', + 'resolved_for_type': self.object_type, 'resolved_for_id': self.object_id, } box_response = self._session.get(url, params=additional_params) diff --git a/docs/storage_policy.md b/docs/storage_policy.md index 10fda6b8f..788fc3161 100644 --- a/docs/storage_policy.md +++ b/docs/storage_policy.md @@ -9,7 +9,7 @@ where they work/reside. Get Storage Policy ------------------ -Calling `storage_policy.get(storage_policy_id)` will return the storage policy object. +Calling `storage_policy.get(fields=None)` will return the storage policy object. ```python storage_policy_id = '1234' @@ -27,15 +27,27 @@ for storage_policy in storage_policies: # Do something ``` -Assign Storage Policy ---------------------- +Create Storage Policy Assignment +-------------------------------- -To create new storage policy assignment call `storage_policy.assign(item)`. +To create new storage policy assignment call `storage_policy.create_assignment(user)`. ```python storage_policy_id = '5678' user = client.user('1234') -storage_policy_assignment = client.storage_policy(storage_policy_id).assign(user) +storage_policy_assignment = client.storage_policy(storage_policy_id).create_assignment(user) +``` + +Note: This method only works if the user does not already have an assignment. If the current state of the user is not known, use the `storage_policy.assign(user)` method instead. + +Assign a Storage Policy to a User +--------------------------------- + +To assign a storage policy to a user, call the `storage_policy.assign(user)` method with the user to assign the storage policy to. + +```python +user = client.user('1234') +storage_policy_assignment = client.storage_policy('12345').assign(user) ``` Update Existing Assignment @@ -51,7 +63,7 @@ updated_assignment = client.storage_policy_assignment('ZW50ZXJwcmldfgeV82MDMwMDQ Get Assignment -------------- -Calling `storage_policy_assignment.get()` will return a storage policy assignment object containing information about the assignment. +Calling `storage_policy_assignment.get(fields=None)` will return a storage policy assignment object containing information about the assignment. ```python assignment_id = '1234' @@ -61,7 +73,7 @@ storage_policy_assignment = client.storage_policy_assignment(assignment_id).get( Get Assignment for User ------------------------- -Calling `user.get_storage_policy_assignment(fields=None)` will return the storage policy assigned to the specified user. +Calling `user.get_storage_policy_assignment()` will return the storage policy assigned to the specified user. ```python user_id = '1111' diff --git a/test/unit/object/test_storage_policy.py b/test/unit/object/test_storage_policy.py index d2133d689..6d28846f5 100644 --- a/test/unit/object/test_storage_policy.py +++ b/test/unit/object/test_storage_policy.py @@ -4,12 +4,13 @@ import json from boxsdk.config import API from boxsdk.object.storage_policy import StoragePolicy +from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment def test_get(test_storage_policy, mock_box_session): expected_url = '{0}/storage_policies/{1}'.format(API.BASE_API_URL, test_storage_policy.object_id) mock_box_session.get.return_value.json.return_value = { - 'type': 'storage_policy', + 'type': test_storage_policy.object_type, 'id': test_storage_policy.object_id, } storage_policy = test_storage_policy.get() @@ -17,9 +18,134 @@ def test_get(test_storage_policy, mock_box_session): assert isinstance(storage_policy, StoragePolicy) -def test_assign(test_storage_policy, mock_user, mock_box_session): +def test_assign_with_same_assignment(test_storage_policy, test_storage_policy_assignment, mock_user, mock_box_session): expected_url = '{0}/storage_policy_assignments'.format(API.BASE_API_URL) - + additional_params = { + 'resolved_for_type': mock_user.object_type, + 'resolved_for_id': mock_user.object_id, + } + mock_box_session.get.return_value.json.return_value = { + 'next_marker': None, + 'limit': 1, + 'entries': [ + { + 'type': test_storage_policy_assignment.object_type, + 'id': test_storage_policy_assignment.object_id, + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': test_storage_policy.object_id, + }, + }, + ], + } + assignment = test_storage_policy.assign(mock_user) + mock_box_session.get.assert_called_once_with(expected_url, params=additional_params) + assert isinstance(assignment, StoragePolicyAssignment) + assert assignment.type == test_storage_policy_assignment.object_type + assert assignment.id == test_storage_policy_assignment.object_id + assert assignment.storage_policy['type'] == test_storage_policy.object_type + assert assignment.storage_policy['id'] == test_storage_policy.object_id + + +def test_assign_with_assigned_enterprise(test_storage_policy, test_storage_policy_assignment, mock_user, mock_box_session): + expected_url = '{0}/storage_policy_assignments'.format(API.BASE_API_URL) + additional_params = { + 'resolved_for_type': mock_user.object_type, + 'resolved_for_id': mock_user.object_id, + } + expected_data = { + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': test_storage_policy.object_id, + }, + 'assigned_to': { + 'type': mock_user.object_type, + 'id': mock_user.object_id, + }, + } + mock_box_session.get.return_value.json.return_value = { + 'next_marker': None, + 'limit': 1, + 'entries': [ + { + 'type': test_storage_policy_assignment.object_type, + 'id': '11111', + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': '22222', + }, + 'assigned_to': { + 'type': 'enterprise', + 'id': '12345', + }, + }, + ], + } + mock_box_session.post.return_value.json.return_value = { + 'type': test_storage_policy_assignment.object_type, + 'id': test_storage_policy_assignment.object_id, + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': test_storage_policy.object_id + } + } + assignment = test_storage_policy.assign(mock_user) + mock_box_session.get.assert_called_once_with(expected_url, params=additional_params) + mock_box_session.post.assert_called_once_with(expected_url, data=json.dumps(expected_data)) + assert isinstance(assignment, StoragePolicyAssignment) + assert assignment.type == test_storage_policy_assignment.object_type + assert assignment.id == test_storage_policy_assignment.object_id + assert assignment.storage_policy['type'] == test_storage_policy.object_type + assert assignment.storage_policy['id'] == test_storage_policy.object_id + + +def test_assign_with_update(test_storage_policy, test_storage_policy_assignment, mock_user, mock_box_session): + expected_url = '{0}/storage_policy_assignments'.format(API.BASE_API_URL) + expected_put_url = '{0}/storage_policy_assignments/{1}'.format(API.BASE_API_URL, '11111') + additional_params = { + 'resolved_for_type': mock_user.object_type, + 'resolved_for_id': mock_user.object_id, + } + expected_data = { + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': '42', + }, + } + mock_box_session.get.return_value.json.return_value = { + 'next_marker': None, + 'limit': 1, + 'entries': [ + { + 'type': test_storage_policy_assignment.object_type, + 'id': '11111', + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': '22222', + }, + 'assigned_to': { + 'type': 'user', + 'id': '12345', + }, + }, + ], + } + mock_box_session.put.return_value.json.return_value = { + 'type': test_storage_policy_assignment.object_type, + 'id': test_storage_policy_assignment.object_id, + 'storage_policy': { + 'type': test_storage_policy.object_type, + 'id': '42' + } + } + assignment = test_storage_policy.assign(mock_user) + mock_box_session.get.assert_called_once_with(expected_url, params=additional_params) + mock_box_session.put.assert_called_once_with(expected_put_url, data=json.dumps(expected_data), headers=None, params=None) + assert isinstance(assignment, StoragePolicyAssignment) + assert assignment.type == test_storage_policy_assignment.object_type + assert assignment.id == test_storage_policy_assignment.object_id + assert assignment.storage_policy['type'] == test_storage_policy.object_type + assert assignment.storage_policy['id'] == '42' def test_create_assignment(test_storage_policy, mock_user, mock_box_session): @@ -32,15 +158,15 @@ def test_create_assignment(test_storage_policy, mock_user, mock_box_session): 'assigned_to': { 'type': 'user', 'id': 'fake-user-100', - } + }, } mock_assignment = { 'type': 'storage_policy_assignment', 'id': '1234', 'storage_policy': { - 'type': 'storage_policy', - 'id': '1111', - } + 'type': test_storage_policy.object_type, + 'id': test_storage_policy.object_id, + }, } mock_box_session.post.return_value.json.return_value = mock_assignment assignment = test_storage_policy.create_assignment(mock_user) From e90bb38144befebd0369efa2e07072099753c1fc Mon Sep 17 00:00:00 2001 From: carycheng Date: Wed, 24 Oct 2018 16:59:10 -0700 Subject: [PATCH 23/28] replace hard coded type --- boxsdk/client/client.py | 2 +- boxsdk/object/user.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index bae9913b0..7a69c39ec 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -633,7 +633,7 @@ def get_storage_policies(self, limit=None, marker=None, fields=None): :type fields: `Iterable` of `unicode` :returns: - An iterator of the entries in the storage policy + Returns the storage policies available for the current enterprise. :rtype: :class:`BoxObjectCollection` """ diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index ee06fa558..57bc84ec2 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -20,14 +20,14 @@ def get_storage_policy_assignment(self): :rtype: :class:`StoragePolicyAssignment` """ - url = self._session.get_url('storage_policy_assignments') + url = self._session.get_url('storage_policy_assignments') additional_params = { 'resolved_for_type': self.object_type, 'resolved_for_id': self.object_id, } box_response = self._session.get(url, params=additional_params) response = box_response.json()['entries'][0] - return self.translator.translate('storage_policy_assignment')( + return self.translator.translate(response['type'])( session=self._session, object_id=response['id'], response_object=response, From 81cb159187a7f31551afc3b64f0e0afb8aee7850 Mon Sep 17 00:00:00 2001 From: carycheng Date: Wed, 24 Oct 2018 17:01:41 -0700 Subject: [PATCH 24/28] added asserts to test client for storage policies get --- test/unit/client/test_client.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index bacd98f18..efd444afb 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -621,6 +621,9 @@ def test_get_storage_policies(mock_client, mock_box_session): policy = policies.next() mock_box_session.get.assert_called_once_with(expected_url, params={}) assert isinstance(policy, StoragePolicy) + assert policy.type == 'storage_policy' + assert policy.id == '12345' + assert policy.name == 'Test Storage Policy' def test_create_webhook_returns_the_correct_policy_object( From 1ef7425fefef5233d3a67c27bc1b360601615e85 Mon Sep 17 00:00:00 2001 From: carycheng Date: Wed, 24 Oct 2018 20:55:06 -0700 Subject: [PATCH 25/28] converted translator to use new one --- boxsdk/object/storage_policy.py | 3 +-- boxsdk/object/user.py | 3 +-- test/unit/object/test_user.py | 17 +++++++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/boxsdk/object/storage_policy.py b/boxsdk/object/storage_policy.py index 7e7be05b3..ad62b0c31 100644 --- a/boxsdk/object/storage_policy.py +++ b/boxsdk/object/storage_policy.py @@ -71,8 +71,7 @@ def create_assignment(self, user): } } response = self._session.post(url, data=json.dumps(body)).json() - return self.translator.translate(response['type'])( + return self.translator.translate( session=self._session, - object_id=response['id'], response_object=response, ) diff --git a/boxsdk/object/user.py b/boxsdk/object/user.py index 57bc84ec2..bc52dea74 100644 --- a/boxsdk/object/user.py +++ b/boxsdk/object/user.py @@ -27,9 +27,8 @@ def get_storage_policy_assignment(self): } box_response = self._session.get(url, params=additional_params) response = box_response.json()['entries'][0] - return self.translator.translate(response['type'])( + return self.translator.translate( session=self._session, - object_id=response['id'], response_object=response, ) diff --git a/test/unit/object/test_user.py b/test/unit/object/test_user.py index bf6410f79..796c09616 100644 --- a/test/unit/object/test_user.py +++ b/test/unit/object/test_user.py @@ -14,18 +14,23 @@ def test_user_url(mock_user): assert mock_user.get_url() == '{0}/{1}/{2}'.format(API.BASE_API_URL, 'users', mock_user.object_id) -def test_get_storage_policy_assignments(mock_user, mock_box_session): +def test_get_storage_policy_assignments(test_storage_policy_assignment, mock_user, mock_box_session): expected_url = mock_box_session.get_url('storage_policy_assignments') mock_assignment = { - 'type': 'storage_policy_assignment', - 'id': '12345', + 'type': test_storage_policy_assignment.object_type, + 'id': test_storage_policy_assignment.object_id, + 'assigned_to': { + 'type': mock_user.object_type, + 'id': mock_user.object_id, + }, } mock_box_session.get.return_value.json.return_value = { - 'limit': 100, - 'entries': [mock_assignment] + 'next_marker': None, + 'limit': 1, + 'entries': [mock_assignment], } expected_params = { - 'resolved_for_type': 'user', + 'resolved_for_type': mock_user.object_type, 'resolved_for_id': mock_user.object_id, } assignment = mock_user.get_storage_policy_assignment() From afc6ee98599566f360f59c282d6294de98695559 Mon Sep 17 00:00:00 2001 From: carycheng Date: Wed, 24 Oct 2018 21:30:00 -0700 Subject: [PATCH 26/28] added test for storage policy and storage policy constructor returns correct translated objects --- test/unit/client/test_client.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index efd444afb..e7e070891 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -25,6 +25,7 @@ from boxsdk.object.file import File from boxsdk.object.group import Group from boxsdk.object.storage_policy import StoragePolicy +from boxsdk.object.storage_policy_assignment import StoragePolicyAssignment from boxsdk.object.user import User from boxsdk.object.trash import Trash from boxsdk.object.group_membership import GroupMembership @@ -341,7 +342,9 @@ def device_pins_response(device_pin_id_1, device_pin_id_2): (Group, 'group'), (GroupMembership, 'group_membership'), (Enterprise, 'enterprise'), - (Webhook, 'webhook') + (Webhook, 'webhook'), + (StoragePolicy, 'storage_policy'), + (StoragePolicyAssignment, 'storage_policy_assignment'), ]) def test_factory_returns_the_correct_object(mock_client, test_class, factory_method_name): """ Tests the various id-only factory methods in the Client class """ From d262b8c5de5027f8aa2c3d3ddd9bde8f724b42d5 Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 26 Oct 2018 14:08:47 -0700 Subject: [PATCH 27/28] added end of paging method --- boxsdk/client/client.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/boxsdk/client/client.py b/boxsdk/client/client.py index 2deb9c41c..b5d0a1b15 100644 --- a/boxsdk/client/client.py +++ b/boxsdk/client/client.py @@ -799,6 +799,9 @@ def get_storage_policies(self, limit=None, marker=None, fields=None): url=self.get_url('storage_policies'), limit=limit, marker=marker, + fields=fields, + return_full_pages=False, + ) def terms_of_service(self, tos_id): """ From c3d34cef0fc698adba1b2ba6aec8b9dd27a19c2d Mon Sep 17 00:00:00 2001 From: carycheng Date: Fri, 26 Oct 2018 14:16:33 -0700 Subject: [PATCH 28/28] added additional line spacing between tests in test_client --- test/unit/client/test_client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/client/test_client.py b/test/unit/client/test_client.py index 0701de28e..bec206e0e 100644 --- a/test/unit/client/test_client.py +++ b/test/unit/client/test_client.py @@ -655,6 +655,7 @@ def test_get_storage_policies(mock_client, mock_box_session): assert policy.id == '12345' assert policy.name == 'Test Storage Policy' + def test_create_terms_of_service(mock_client, mock_box_session): # pylint:disable=redefined-outer-name expected_url = "{0}/terms_of_services".format(API.BASE_API_URL)