|
| 1 | +import logging |
| 2 | + |
| 3 | +from .. import RequestFactory, PermissionsItem |
| 4 | + |
| 5 | +from .endpoint import Endpoint, api |
| 6 | +from .exceptions import MissingRequiredFieldError |
| 7 | + |
| 8 | + |
| 9 | +logger = logging.getLogger(__name__) |
| 10 | + |
| 11 | + |
| 12 | +class _PermissionsEndpoint(Endpoint): |
| 13 | + ''' Adds permission model to another endpoint |
| 14 | +
|
| 15 | + Tableau permissions model is identical between objects but they are nested under |
| 16 | + the parent object endpoint (i.e. permissions for workbooks are under |
| 17 | + /workbooks/:id/permission). This class is meant to be instantated inside a |
| 18 | + parent endpoint which has these supported endpoints |
| 19 | + ''' |
| 20 | + def __init__(self, parent_srv, owner_baseurl): |
| 21 | + super(_PermissionsEndpoint, self).__init__(parent_srv) |
| 22 | + |
| 23 | + # owner_baseurl is the baseurl of the parent. The MUST be a lambda |
| 24 | + # since we don't know the full site URL until we sign in. If |
| 25 | + # populated without, we will get a sign-in error |
| 26 | + self.owner_baseurl = owner_baseurl |
| 27 | + |
| 28 | + def update(self, item, permission_item): |
| 29 | + url = '{0}/{1}/permissions'.format(self.owner_baseurl(), item.id) |
| 30 | + update_req = RequestFactory.Permission.add_req(item, permission_item) |
| 31 | + response = self.put_request(url, update_req) |
| 32 | + permissions = PermissionsItem.from_response(response.content, |
| 33 | + self.parent_srv.namespace) |
| 34 | + |
| 35 | + logger.info('Updated permissions for item {0}'.format(item.id)) |
| 36 | + |
| 37 | + return permissions |
| 38 | + |
| 39 | + def delete(self, item, capability_item): |
| 40 | + for capability_type, capability_mode in capability_item.map.items(): |
| 41 | + url = '{0}/{1}/permissions/{2}/{3}/{4}/{5}'.format( |
| 42 | + self.owner_baseurl(), item.id, |
| 43 | + capability_item.type + 's', |
| 44 | + capability_item.object_id, capability_type, |
| 45 | + capability_mode) |
| 46 | + |
| 47 | + logger.debug('Removing {0} permission for capabilty {1}'.format( |
| 48 | + capability_mode, capability_type)) |
| 49 | + |
| 50 | + self.delete_request(url) |
| 51 | + |
| 52 | + logger.info('Deleted permission for {0} {1} item {2}'.format( |
| 53 | + capability_item.type, |
| 54 | + capability_item.object_id, |
| 55 | + item.id)) |
| 56 | + |
| 57 | + def populate(self, item): |
| 58 | + if not item.id: |
| 59 | + error = "Server item is missing ID. Item must be retrieved from server first." |
| 60 | + raise MissingRequiredFieldError(error) |
| 61 | + |
| 62 | + def permission_fetcher(): |
| 63 | + return self._get_permissions(item) |
| 64 | + |
| 65 | + item._set_permissions(permission_fetcher) |
| 66 | + logger.info('Populated permissions for item (ID: {0})'.format(item.id)) |
| 67 | + |
| 68 | + def _get_permissions(self, item, req_options=None): |
| 69 | + url = "{0}/{1}/permissions".format(self.owner_baseurl(), item.id) |
| 70 | + server_response = self.get_request(url, req_options) |
| 71 | + permissions = PermissionsItem.from_response(server_response.content, |
| 72 | + self.parent_srv.namespace) |
| 73 | + return permissions |
0 commit comments