Source code for boxsdk.object.metadata
# coding: utf-8
from __future__ import unicode_literals, absolute_import
import json
from boxsdk.object.base_endpoint import BaseEndpoint
from ..util.api_call_decorator import api_call
[docs]class MetadataUpdate(object):
"""
Helper class for updating Box metadata.
See https://box-content.readme.io/reference#update-metadata for more details.
See http://jsonpatch.com/ for details about JSON patch.
"""
def __init__(self):
self._ops = []
@property
def ops(self):
"""
Get a list of json patch operations in this update.
:return:
The list of json patch operations in this update.
:rtype:
`list` of `dict`
"""
return self._ops
[docs] def add(self, path, value):
"""
Insert an add operation to this metadata update.
:param path:
JSON pointer specifying where to add the new value.
:type path:
`unicode`
:param value:
The value to add to the metadata document.
:type value:
`unicode`
"""
self._ops.append({'op': 'add', 'path': path, 'value': value})
[docs] def remove(self, path, old_value=None):
"""
Insert a remove operation to this metadata update.
:param path:
JSON pointer specifying where to remove the value from.
:type path:
`unicode`
:param old_value:
If specified, only remove the key/value pair if the current value is equal to oldValue.
:type old_value:
`unicode`
"""
if old_value is not None:
self._ops.append({'op': 'test', 'path': path, 'value': old_value})
self._ops.append({'op': 'remove', 'path': path})
[docs] def update(self, path, value, old_value=None):
"""
Insert an update operation to this metadata update.
:param path:
JSON pointer specifying where the value is in the metadata document that should be updated.
:type path:
`unicode`
:param value:
The updated value.
:type value:
`unicode`
:param old_value:
If specified, only update the key/value pair if the current value is equal to oldValue.
:type old_value:
`unicode`
"""
if old_value is not None:
self._ops.append({'op': 'test', 'path': path, 'value': old_value})
self._ops.append({'op': 'replace', 'path': path, 'value': value})
[docs] def test(self, path, value):
"""
Insert a test operation to this metadata update.
A test operation can invalidate the following operation if the value at the specified path does not match
the supplied value.
:param path:
JSON pointer specifying where the value is in the metadata document to test.
:type path:
`unicode`
:param value:
The value to match against.
:type value:
`unicode`
"""
self._ops.append({'op': 'test', 'path': path, 'value': value})
[docs]class Metadata(BaseEndpoint):
def __init__(self, session, box_object, scope, template):
"""
:param session:
The Box session used to make requests.
:type session:
:class:`BoxSession`
:param box_object:
The Box object this metadata instance will be associated with.
:type box_object:
:class:`BaseObject`
:param scope:
Scope of the metadata. Must be either 'global' or 'enterprise'.
:type scope:
`unicode`
:param template:
The name of the metadata template.
See https://box-content.readme.io/reference#metadata-object for more details.
:type template:
`unicode`
"""
super(Metadata, self).__init__(session)
self._object = box_object
self._scope = scope
self._template = template
[docs] def get_url(self, *args):
""" Base class override. """
# pylint:disable=arguments-differ
return self._object.get_url('metadata', self._scope, self._template)
[docs] @staticmethod
def start_update():
"""
Get a :class:`MetadataUpdate` for use with the :meth:`update` method.
:return:
A metadata update object that can be used to update this metadata object.
:rtype:
:class:`MetadataUpdate`
"""
return MetadataUpdate()
[docs] @api_call
def update(self, metadata_update):
"""
Update the key/value pairs associated with this metadata object.
See https://box-content.readme.io/reference#update-metadata for more details.
:param metadata_update:
A metadata update object containing the changes that should be made to the metadata.
:type metadata_update:
:class:`MetadataUpdate`
:return:
A dictionary containing the updated key/value pairs for this metadata object.
:rtype:
:class:`Metadata`
"""
return self._session.put(
self.get_url(),
data=json.dumps(metadata_update.ops),
headers={b'Content-Type': b'application/json-patch+json'},
).json()
[docs] @api_call
def get(self):
"""
Get the key/value pairs that make up this metadata instance.
:return:
A dictionary containing the key/value pairs for this metadata object.
:rtype:
:class:`Metadata`
"""
return self._session.get(self.get_url()).json()
[docs] @api_call
def delete(self):
"""
Delete the metadata object.
:returns:
Whether or not the delete was successful.
:rtype:
`bool`
"""
return self._session.delete(self.get_url()).ok
[docs] @api_call
def create(self, metadata):
"""
Create the metadata instance on Box. If the instance already exists, use :meth:`update` instead.
:param metadata:
The key/value pairs to be stored in this metadata instance on Box.
:type metadata:
`dict`
:return:
A dictionary containing the key/value pairs for this metadata object.
:rtype:
:class:`Metadata`
"""
return self._session.post(
self.get_url(),
data=json.dumps(metadata),
headers={b'Content-Type': b'application/json'},
).json()
[docs] def clone(self, session=None):
""" Base class override. """
return self.__class__(session or self._session, self._object, self._scope, self._template)