# Copyright (c) 2015, The MITRE Corporation. All rights reserved.
# See LICENSE.txt for complete terms.
from mixbox import entities
from mixbox import fields
from mixbox import dates
import cybox.bindings.cybox_common as common_binding
DATE_PRECISION_VALUES = ("year", "month", "day")
TIME_PRECISION_VALUES = ("hour", "minute", "second")
DATETIME_PRECISION_VALUES = DATE_PRECISION_VALUES + TIME_PRECISION_VALUES
def _validate_precision(value, allowed):
if value is None:
return
elif value in allowed:
return
else:
error = "The precision must be one of {allowed}. Received '{value}'"
error = error.format(**locals())
raise ValueError(error)
[docs]def validate_date_precision(instance, value):
_validate_precision(value, DATE_PRECISION_VALUES)
[docs]def validate_datetime_precision(instance, value):
_validate_precision(value, DATETIME_PRECISION_VALUES)
[docs]def validate_time_precision(instance, value):
_validate_precision(value, TIME_PRECISION_VALUES)
[docs]class DateTimeWithPrecision(entities.Entity):
_binding = common_binding
_binding_class = common_binding.DateTimeWithPrecisionType
_namespace = 'http://cybox.mitre.org/common-2'
value = fields.DateTimeField("valueOf_", key_name="value")
precision = fields.TypedField("precision", preset_hook=validate_datetime_precision)
def __init__(self, value=None, precision='second'):
super(DateTimeWithPrecision, self).__init__()
self.value = value
self.precision = precision
[docs] def to_dict(self):
if self.precision == 'second':
return dates.serialize_datetime(self.value)
return super(DateTimeWithPrecision, self).to_dict()
[docs]class DateWithPrecision(entities.Entity):
_binding = common_binding
_binding_class = common_binding.DateWithPrecisionType
_namespace = 'http://cybox.mitre.org/common-2'
value = fields.DateField("valueOf_", key_name="value")
precision = fields.TypedField("precision", preset_hook=validate_date_precision)
def __init__(self, value=None, precision='day'):
super(DateWithPrecision, self).__init__()
self.value = value
self.precision = precision
[docs] def to_dict(self):
if self.precision == 'day':
return dates.serialize_date(self.value)
return super(DateWithPrecision, self).to_dict()