Source code for boxsdk.object.metadata_template

# coding: utf-8

from __future__ import unicode_literals, absolute_import

import json

from .base_object import BaseObject
from ..util.api_call_decorator import api_call
from ..util.text_enum import TextEnum


[docs]class MetadataTemplateUpdate(object): """Represents a set of update operations to a metadata template.""" def __init__(self): super(MetadataTemplateUpdate, self).__init__() self._ops = []
[docs] def json(self): return self._ops
[docs] def add_enum_option(self, field_key, option_key): """ Adds a new option to an enum field. :param field_key: The key of the template field to add the option to :type field_key: `unicode` :param option_key: The option to add :type option_key: `unicode` """ self.add_operation({ 'op': 'addEnumOption', 'fieldKey': field_key, 'data': { 'key': option_key, }, })
[docs] def add_field(self, field): """ Add a new field to the template. :param field: The new field to add :type field: :class:`MetadataField` """ self.add_operation({ 'op': 'addField', 'data': field.json(), })
[docs] def edit_template(self, data): """ Edit top-level template properties. :param data: The properties to modify :type data: `dict` """ self.add_operation({ 'op': 'editTemplate', 'data': data, })
[docs] def reorder_enum_options(self, field_key, option_keys): """ Reorders the options in an enum field, which affects their display in UI. :param field_key: The key of the enum field to reorder :type field_key: `unicode` :param option_keys: The option keys in the desired order :type option_keys: `list` of `unicode` """ self.add_operation({ 'op': 'reorderEnumOptions', 'fieldKey': field_key, 'enumOptionKeys': option_keys, })
[docs] def reorder_fields(self, field_keys): """ Reorders the fields in a metadata template, which affects their display in UI. :param field_keys: The field keys in the desired order :type field_keys: `list` of `unicode` """ self.add_operation({ 'op': 'reorderFields', 'fieldKeys': field_keys, })
[docs] def edit_field(self, field_key, field): """ Edits a field in the template. :param field_key: The key of the field to update :type field_key: `unicode` :param field: The updated field values :type field: :class:`MetadataField` """ self.add_operation({ 'op': 'editField', 'fieldKey': field_key, 'data': field.json(), })
[docs] def edit_enum_option_key(self, field_key, old_option_key, new_option_key): """ Change the key of an enum field option. :param field_key: The key of the template field in which the option appears :type field_key: `unicode` :param old_option_key: The old option key :type old_option_key: `unicode` :param new_option_key: The new option key :type new_option_key: `unicode` """ self.add_operation({ 'op': 'editEnumOption', 'fieldKey': field_key, 'enumOptionKey': old_option_key, 'data': { 'key': new_option_key, }, })
[docs] def remove_enum_option(self, field_key, option_key): """ Remove an option from an enum field. :param field_key: The key of the template field in which the option appears :type field_key: `unicode` :param option_key: The key of the enum option to remove :type option_key: `unicode` """ self.add_operation({ 'op': 'removeEnumOption', 'fieldKey': field_key, 'enumOptionKey': option_key, })
[docs] def remove_field(self, field_key): """ Remove a field from the metadata template. :param field_key: The key of the field to remove :type field_key: `unicode` """ self.add_operation({ 'op': 'removeField', 'fieldKey': field_key, })
[docs] def add_operation(self, operation): """ Adds an update operation. :param operation: The operation to add. :type operation: `dict` """ self._ops.append(operation)
[docs]class MetadataFieldType(TextEnum): STRING = 'string' DATE = 'date' ENUM = 'enum' MULTISELECT = 'multiSelect' FLOAT = 'float'
[docs]class MetadataField(object): """Represents a metadata field when creating or updating a metadata template.""" def __init__(self, field_type, display_name, key=None, options=None): """ :param field_type: The type of the metadata field :type field_type: :class:`MetadataFieldType` :param display_name: The human-readable name of the metadata field :type display_name: `unicode` :param key: The machine-readable key for the metadata field :type key: `unicode` or None :param options: For 'enum' or 'multiSelect' fields, the selectable options :type options: `Iterable` of `unicode` """ super(MetadataField, self).__init__() self.type = field_type self.name = display_name self.key = key self.options = options
[docs] def json(self): """ Returns the correct representation of the template field for the API. :rtype: `dict` """ values = {} if self.type is not None: values['type'] = self.type if self.name is not None: values['displayName'] = self.name if self.key is not None: values['key'] = self.key if self.type in ['enum', 'multiSelect']: values['options'] = [{'key': opt} for opt in self.options or ()] return values
[docs]class MetadataTemplate(BaseObject): """Represents a metadata template, which contains the the type information for associated metadata fields.""" _item_type = 'metadata_template' _untranslated_fields = ('fields',) _scope = None _template_key = None def __init__(self, session, object_id, response_object=None): """ :param session: The Box session used to make requests. :type session: :class:`BoxSession` :param object_id: The primary GUID key for the metadata template :type object_id: `unicode` or None :param response_object: A JSON object representing the object returned from a Box API request. This should contain 'scope' and 'templateKey' properties if the instance is being constructed without a primary GUID object_id. :type response_object: `dict` or None """ super(MetadataTemplate, self).__init__(session, object_id, response_object) if response_object: self._scope = response_object.get('scope', None) self._template_key = response_object.get('templateKey', None) elif not object_id: raise ValueError('Metadata template must be constructed with an ID or scope and templateKey') @property def scope(self): return self._scope @property def template_key(self): return self._template_key
[docs] def get_url(self, *args): """ Base class override, since metadata templates have a weird compound ID and non-standard URL format :rtype: `unicode` """ if self._scope and self._template_key: return self._session.get_url('metadata_templates', self._scope, self._template_key, 'schema', *args) return super(MetadataTemplate, self).get_url(*args)
[docs] @staticmethod def start_update(): """ Start an update operation on the template. :returns: An update object to collect the desired update operations. :rtype: :class:`MetadataTemplateUpdate` """ return MetadataTemplateUpdate()
[docs] @api_call def update_info(self, updates): # pylint: disable=arguments-differ """ Update a metadata template with a set of update operations. :param updates: The update operations to apply to the template :type updates: :class:`MetadataTemplateUpdate` :returns: The updated metadata template object :rtype: :class:`MetadataTemplate` """ url = self.get_url() response = self._session.put(url, data=json.dumps(updates.json())).json() return self.translator.translate( session=self._session, response_object=response, )