Source code for swimlane.core.resources.app
from functools import total_ordering
import six
import pendulum
from swimlane.exceptions import UnknownField
from .base import APIResource
[docs]@total_ordering
class App(APIResource):
"""A single App record instance
Used lookup field definitions and retrieve/create child Record instances
Attributes:
name (str): App name
acronym (str): App acronym
description (str): App description
id (str): Full App ID
tracking_id (str): App tracking ID
records (RecordAdapter): :class:`~swimlane.core.adapters.record.RecordAdapter` configured for current App
reports (ReportAdapter): :class:`~swimlane.core.adapters.report.ReportAdapter` configured for current App
"""
_type = 'Core.Models.Application.Application, Core'
def __init__(self, swimlane, raw):
super(App, self).__init__(swimlane, raw)
self.acronym = self._raw['acronym']
self.name = self._raw['name']
self.description = self._raw.get('description', '')
self.id = self._raw['id']
self.tracking_id = self._raw.get('trackingFieldId')
self._fields_by_id = dict()
self._fields_by_name = dict()
self._defaults = dict()
for field in self._raw['fields']:
self._fields_by_id[field['id']] = field
self._fields_by_name[field['name']] = field
if 'fieldType' in field and field['fieldType'] == "valuesList":
selection_type = field['selectionType']
for value in field['values']:
if 'selected' in value and value['selected']:
if selection_type == 'single':
self._defaults[field['name']] = value['name']
break
else:
default = self._defaults.get(field['name'], list())
default.extend([value['name']])
self._defaults[field['name']] = default
if 'fieldType' in field and field['fieldType'] == "date":
default_value_type = field['defaultValueType']
if default_value_type == 'specific':
self._defaults[field['name']] = pendulum.parse(field['defaultValue'])
self._keys_to_field_names = {}
for name, field_def in six.iteritems(self._fields_by_name):
# Include original name to simplify name resolution
self._keys_to_field_names[name] = name
key = field_def.get('key')
if key:
self._keys_to_field_names[key] = name
# Avoid circular import
from swimlane.core.adapters import RecordAdapter, ReportAdapter, AppRevisionAdapter
self.records = RecordAdapter(self)
self.reports = ReportAdapter(self)
self.revisions = AppRevisionAdapter(self)
def __str__(self):
return '{self.name} ({self.acronym})'.format(self=self)
def __hash__(self):
return hash((self.id, self.name))
def __lt__(self, other):
if not isinstance(other, self.__class__):
raise TypeError('Comparisons not supported between instances of "{}" and "{}"'.format(
other.__class__.__name__,
self.__class__.__name__
))
return self.name < other.name
[docs] def get_cache_index_keys(self):
"""Return all fields available when retrieving apps"""
return {
'id': self.id,
'name': self.name,
'acroynm': self.acronym
}
[docs] def resolve_field_name(self, field_key):
"""Return the field name matching the given key or None. Searches field keys first, falls back to field names"""
return self._keys_to_field_names.get(field_key)
[docs] def get_field_definition_by_name(self, field_name):
"""Get JSON field definition for field matching provided name or key
.. versionchanged:: 4.1.0
Added support for field keys
Args:
field_name (str): Target field name or key to get definition for
Raises:
swimlane.exceptions.UnknownField: Raised when given a field name not found in App
Returns:
dict: Field metadata definition
"""
try:
return self._fields_by_name[self.resolve_field_name(field_name)]
except KeyError:
raise UnknownField(self, field_name, self._fields_by_name.keys())
[docs] def get_field_definition_by_id(self, field_id):
"""Get JSON field definition for field matching provided id
Args:
field_id (str): Target field ID to get definition for
Raises:
swimlane.exceptions.UnknownField: Raised when given a field ID not found in App
Returns:
dict: Field metadata definition
"""
try:
return self._fields_by_id[field_id]
except KeyError:
raise UnknownField(self, field_id, self._fields_by_id.keys())