ferrero-opentext/Python-Version/venv/lib/python3.12/site-packages/boxsdk/object/base_object.py

159 lines
5.6 KiB
Python

import json
from typing import TYPE_CHECKING, Any, Iterable, Optional, Union, List
from .base_endpoint import BaseEndpoint
from .base_api_json_object import BaseAPIJSONObject
from ..util.api_call_decorator import api_call
if TYPE_CHECKING:
from boxsdk.session.session import Session
class BaseObject(BaseEndpoint, BaseAPIJSONObject):
"""A Box API endpoint for interacting with a Box object."""
def __init__(self, session: 'Session', object_id: str, response_object: dict = None):
"""
:param session:
The Box session used to make requests.
:param object_id:
The Box ID for the object.
:param response_object:
A JSON object representing the object returned from a Box API request.
"""
super().__init__(session=session, response_object=response_object)
self._object_id = object_id
@property
def _description(self) -> str:
"""
Base class override. Return a description for the object.
"""
if 'name' in self._response_object:
return f'{self._object_id} ({self.name})' # pylint:disable=no-member
return self._object_id
def get_url(self, *args: Any) -> str:
"""
Base class override.
Return the given object's URL, appending any optional parts as specified by args.
"""
return super().get_url(f'{self._item_type}s', self._object_id, *args)
def get_type_url(self) -> str:
"""
Return the URL for type of the given resource.
"""
return super().get_url(f'{self._item_type}s')
@property
def object_id(self) -> str:
"""
Return the Box ID for the object.
"""
return self._object_id
@api_call
def get(self, *, fields: Iterable[str] = None, headers: dict = None, **_kwargs) -> Any:
"""
Get information about the object, specified by fields. If fields is None, return the default fields.
:param fields:
List of fields to request.
:param headers:
Additional headers to send with the request.
:return:
An object of the same type that has the requested information.
"""
url = self.get_url()
params = {'fields': ','.join(fields)} if fields else None
box_response = self._session.get(url, params=params, headers=headers)
return self.translator.translate(
session=self._session,
response_object=box_response.json(),
)
@api_call
def update_info(
self,
*,
data: Union[dict, List[dict]],
params: Optional[dict] = None,
headers: Optional[dict] = None,
**kwargs: Any
) -> Any:
"""Update information about this object.
Send a PUT to the object's base endpoint to modify the provided
attributes.
:param data:
The updated information about this object.
Must be JSON serializable.
Update the object attributes in data.keys(). The semantics of the
values depends on the type and attributes of the object being
updated. For details on particular semantics, refer to the Box
developer API documentation <https://developer.box.com/>.
:param params:
(optional) Query string parameters for the request.
:param headers:
(optional) Extra HTTP headers for the request.
:param kwargs:
Optional arguments that ``put`` takes.
:return:
The updated object.
Return a new object of the same type, without modifying the
original object passed as self.
Construct the new object with all the default attributes that are
returned from the endpoint.
"""
url = self.get_url()
box_response = self._session.put(url, data=json.dumps(data), params=params, headers=headers, **kwargs)
if 'expect_json_response' in kwargs and not kwargs['expect_json_response']:
return box_response.ok
return self.translator.translate(
session=self._session,
response_object=box_response.json(),
)
@api_call
def delete(self, *, params: Optional[dict] = None, headers: Optional[dict] = None, **_kwargs) -> bool:
""" Delete the object.
:param params:
Additional parameters to send with the request. Can be None
:param headers:
Any customer headers to send with the request. Can be None
:returns:
Whether or not the delete was successful.
:raises:
:class:`BoxAPIException` in case of unexpected errors.
"""
url = self.get_url()
box_response = self._session.delete(url, expect_json_response=False, params=params or {}, headers=headers)
return box_response.ok
def __eq__(self, other: Any) -> bool:
"""Equality as determined by object id and type"""
if isinstance(other, BaseObject):
# Two objects are considered the same if they have the same address in the API
return self.get_url() == other.get_url()
return NotImplemented
def __ne__(self, other: Any) -> bool:
"""Equality as determined by object id and type"""
return not self == other
def __hash__(self) -> int:
return hash((self._object_id, self._item_type))
def clone(self, session: 'Session' = None) -> 'BaseObject':
"""Base class override."""
return self.__class__(
session or self._session,
self._object_id,
self._response_object,
)