2017-07-12 17:36:15 +02:00
|
|
|
|
|
|
|
class ObjectFactory(object):
|
|
|
|
|
2017-07-13 15:45:43 +02:00
|
|
|
def __init__(self, created_by_ref=None, created=None,
|
2017-07-17 20:56:13 +02:00
|
|
|
external_references=None, object_marking_refs=None,
|
|
|
|
list_append=True):
|
2017-07-13 17:03:31 +02:00
|
|
|
|
|
|
|
self._defaults = {}
|
|
|
|
if created_by_ref:
|
|
|
|
self._defaults['created_by_ref'] = created_by_ref
|
|
|
|
if created:
|
|
|
|
self._defaults['created'] = created
|
|
|
|
# If the user provides a default "created" time, we also want to use
|
|
|
|
# that as the modified time.
|
|
|
|
self._defaults['modified'] = created
|
|
|
|
if external_references:
|
|
|
|
self._defaults['external_references'] = external_references
|
|
|
|
if object_marking_refs:
|
|
|
|
self._defaults['object_marking_refs'] = object_marking_refs
|
2017-07-17 20:56:13 +02:00
|
|
|
self._list_append = list_append
|
|
|
|
self._list_properties = ['external_references', 'object_marking_refs']
|
2017-07-12 17:36:15 +02:00
|
|
|
|
2017-07-12 21:22:50 +02:00
|
|
|
def create(self, cls, **kwargs):
|
2017-07-13 17:03:31 +02:00
|
|
|
# Use self.defaults as the base, but update with any explicit args
|
|
|
|
# provided by the user.
|
|
|
|
properties = dict(**self._defaults)
|
|
|
|
if kwargs:
|
2017-07-17 20:56:13 +02:00
|
|
|
if self._list_append:
|
|
|
|
# Append provided items to list properties instead of replacing them
|
|
|
|
for list_prop in set(self._list_properties).intersection(kwargs.keys(), properties.keys()):
|
|
|
|
kwarg_prop = kwargs.pop(list_prop)
|
|
|
|
if kwarg_prop is None:
|
|
|
|
del properties[list_prop]
|
|
|
|
continue
|
|
|
|
if not isinstance(properties[list_prop], list):
|
|
|
|
properties[list_prop] = [properties[list_prop]]
|
|
|
|
properties[list_prop].append(kwarg_prop)
|
|
|
|
|
2017-07-13 17:03:31 +02:00
|
|
|
properties.update(**kwargs)
|
2017-07-12 17:36:15 +02:00
|
|
|
|
2017-07-13 17:03:31 +02:00
|
|
|
return cls(**properties)
|