class BaseSourceSchema(BaseSchema): uuid = fields.UUID(dump_only=True) tenant_uuid = fields.UUID(dump_only=True) name = fields.String(validate=Length(min=1, max=512), required=True) first_matched_columns = fields.List( fields.String(validate=Length(min=1, max=128)), missing=[]) searched_columns = fields.List( fields.String(validate=Length(min=1, max=128)), missing=[]) format_columns = fields.Dict(validate=validate_string_dict, missing={})
class ListRequestSchema(Schema): recurse = fields.Boolean(missing=False) user_uuid = fields.List(fields.UUID(), missing=[], attribute='uuids') @pre_load def convert_user_uuid_to_list(self, data, **kwargs): result = data.to_dict() if data.get('user_uuid'): result['user_uuid'] = data['user_uuid'].split(',') return result
class MarketListResultSchema(Schema): homepage = fields.String() color = fields.String() display_name = fields.String() name = fields.String(validate=Regexp(_PLUGIN_NAME_REGEXP), required=True) namespace = fields.String(validate=Regexp(_PLUGIN_NAMESPACE_REGEXP), required=True) tags = fields.List(fields.String) author = fields.String() versions = fields.Nested(MarketVersionResultSchema, many=True, required=True, unknown=EXCLUDE) screenshots = fields.List(fields.String) icon = fields.String() description = fields.String() short_description = fields.String() license = fields.String() installed_version = fields.String(missing=None)
class CDRListingBase(Schema): from_ = fields.DateTime(data_key='from', attribute='start', missing=None) until = fields.DateTime(attribute='end', missing=None) search = fields.String(missing=None) call_direction = fields.String( validate=OneOf(['internal', 'inbound', 'outbound']), missing=None ) number = fields.String(validate=Regexp(NUMBER_REGEX), missing=None) tags = fields.List(fields.String(), missing=[]) user_uuid = fields.List(fields.String(), missing=[], attribute='user_uuids') from_id = fields.Integer(validate=Range(min=0), attribute='start_id', missing=None) recurse = fields.Boolean(missing=False) @pre_load def convert_tags_and_user_uuid_to_list(self, data, **kwargs): result = data.to_dict() if data.get('tags'): result['tags'] = data['tags'].split(',') if data.get('user_uuid'): result['user_uuid'] = data['user_uuid'].split(',') return result
class UserSubscriptionSchema(Schema): uuid = fields.UUID(dump_only=True) name = fields.String(validate=Length(max=128), required=True) service = fields.String(validate=Length(max=128), allow_none=False, required=True) events = fields.List(fields.String(validate=Length(max=128), allow_none=False), allow_none=False, required=True) config = ConfigField(allow_none=False, required=True) metadata_ = fields.Dict(load_from='metadata')
class CDRSchema(Schema): id = fields.Integer() tenant_uuid = fields.UUID() start = fields.DateTime(attribute='date') end = fields.DateTime(attribute='date_end') answered = fields.Boolean(attribute='marshmallow_answered') answer = fields.DateTime(attribute='date_answer') duration = fields.TimeDelta(default=None, attribute='marshmallow_duration') call_direction = fields.String(attribute='direction') destination_extension = fields.String(attribute='destination_exten') destination_internal_context = fields.String() destination_internal_extension = fields.String( attribute='destination_internal_exten' ) destination_line_id = fields.Integer() destination_name = fields.String() destination_user_uuid = fields.UUID() requested_name = fields.String() requested_context = fields.String() requested_extension = fields.String(attribute='requested_exten') requested_internal_context = fields.String() requested_internal_extension = fields.String(attribute='requested_internal_exten') source_extension = fields.String(attribute='source_exten') source_internal_context = fields.String() source_internal_name = fields.String() source_internal_extension = fields.String(attribute='source_internal_exten') source_line_id = fields.Integer() source_name = fields.String() source_user_uuid = fields.UUID() tags = fields.List(fields.String(), attribute='marshmallow_tags') recordings = fields.Nested('RecordingSchema', many=True, default=[]) @pre_dump def _compute_fields(self, data, **kwargs): data.marshmallow_answered = True if data.date_answer else False if data.date_answer and data.date_end: data.marshmallow_duration = data.date_end - data.date_answer return data @post_dump def fix_negative_duration(self, data, **kwargs): if data['duration'] is not None: data['duration'] = max(data['duration'], 0) return data @pre_dump def _populate_tags_field(self, data, **kwargs): data.marshmallow_tags = set() for participant in data.participants: data.marshmallow_tags.update(participant.tags) return data
class SubscriptionSchema(Schema): uuid = fields.UUID(dump_only=True) name = fields.String(validate=Length(max=128), required=True) service = fields.String(validate=Length(max=128), allow_none=False, required=True) events = fields.List(fields.String(validate=Length(max=128), allow_none=False), allow_none=False, required=True) events_user_uuid = fields.String(validate=Length(equal=36), missing=None) events_wazo_uuid = fields.String(validate=Length(equal=36), missing=None) config = ConfigField(allow_none=False, required=True) owner_user_uuid = fields.String(validate=Length(equal=36), missing=None) metadata = fields.Dict()
class UserSubscriptionSchema(Schema): class Meta: unknown = EXCLUDE uuid = fields.UUID(dump_only=True) name = fields.String(validate=Length(max=128), required=True) service = fields.String(validate=Length(max=128), allow_none=False, required=True) events = fields.List( fields.String(validate=Length(max=128), allow_none=False), allow_none=False, required=True, ) config = ConfigField(allow_none=False, required=True) metadata_ = fields.Dict(data_key='metadata')
class TenantFullSchema(BaseSchema): uuid = fields.UUID(missing=None) parent_uuid = fields.UUID(dump_only=True) name = fields.String( validate=validate.Length(min=1, max=128), default=None, missing=None ) slug = fields.String( validate=[validate.Length(min=1, max=10), validate.Regexp(r'^[a-zA-Z0-9_]+$')], missing=None, ) contact_uuid = fields.UUID(data_key='contact', missing=None, default=None) phone = fields.String( validate=validate.Length(min=1, max=32), default=None, missing=None ) domain_names = fields.List( fields.String( validate=validate.Regexp( r'^(?=.{1,253}\.?$)(?:(?!(-|_)|[^.]+_)[A-Za-z0-9-_]{1,}(?<!-)(?:\.|$)){2,63}$' ), ), missing=[], default=[], allow_none=False, ) address = fields.Nested( TenantAddress, missing=empty_tenant_address, default=empty_tenant_address, allow_none=False, ) @post_dump def add_empty_address(self, data, **kwargs): data['address'] = data['address'] or empty_tenant_address return data @post_load def ensure_domain_names_are_unique(self, data, **kwargs): data['domain_names'] = sorted(list(set(data['domain_names']))) return data
class PolicyFullSchema(BaseSchema): uuid = fields.String(dump_only=True) tenant_uuid = fields.String(dump_only=True, attribute='tenant_uuid_exposed') name = fields.String(validate=validate.Length(min=1, max=80), required=True) slug = fields.String( validate=[validate.Length(min=1, max=80), validate.Regexp(SLUG_REGEX)], missing=None, ) description = fields.String(allow_none=True, missing=None) acl = fields.List(fields.String(), missing=[], attribute='acl') read_only = fields.Boolean(dump_only=True) shared = fields.Boolean(missing=False) @post_dump(pass_original=True) def set_shared_exposed_only_for_dump(self, data, original, **kwargs): data['shared'] = original.shared_exposed return data
class QueueStatisticsQoSRequestSchema(_StatisticsListRequestSchema): interval = fields.String(validate=OneOf(['hour', 'day', 'month'])) qos_thresholds = fields.List(fields.Integer(validate=Range(min=0)), missing=[]) @pre_load def convert_qos_thresholds_to_list(self, data, **kwargs): result = data.copy() if not isinstance(result, dict): result = result.to_dict() if data.get('qos_thresholds'): result['qos_thresholds'] = list( set(data['qos_thresholds'].split(','))) return result @post_load def sort_qos_thresholds(self, data, **kwargs): result = data.copy() if data.get('qos_thresholds'): result['qos_thresholds'] = sorted(data['qos_thresholds']) return result
class SubscriptionSchema(Schema): class Meta: unknown = EXCLUDE uuid = fields.UUID(dump_only=True) name = fields.String(validate=Length(max=128), required=True) service = fields.String(validate=Length(max=128), allow_none=False, required=True) events = fields.List( fields.String(validate=Length(max=128), allow_none=False), allow_none=False, required=True, ) events_user_uuid = fields.String(validate=Length(equal=36), missing=None) events_wazo_uuid = fields.String(validate=Length(equal=36), missing=None) config = ConfigField(allow_none=False, required=True) owner_user_uuid = fields.String(validate=Length(equal=36), missing=None) owner_tenant_uuid = fields.UUID(dump_only=True) # TODO(sileht): We should also add an events_tenant_uuid to filter # event on tenant_uuid. Currently if I have the # "webhookd.subscriptions.create" I can receive event of all tenants... metadata_ = fields.Dict(data_key="metadata")
class Auth1SafeFields(BaseSchema): scope = fields.List(fields.String)
class MicrosoftSchema(schemas.BaseSchema): scope = fields.List(fields.String(validate=Length(min=1, max=512))) access_token = fields.String(dump_only=True) token_expiration = fields.Integer(dump_only=True)
class PolicySchema(BaseSchema): name = fields.String(validate=validate.Length(min=1, max=80), required=True) description = fields.String(allow_none=True, missing=None) acl_templates = fields.List(fields.String(), missing=[])
class TokenScopesRequestSchema(BaseSchema): scopes = fields.List(fields.String()) tenant_uuid = fields.String(missing=None)
class RecordingMediaDeleteRequestSchema(Schema): cdr_ids = fields.List(fields.Integer(), validate=Length(min=1), required=True)
class RecordingMediaExportBodySchema(Schema): cdr_ids = fields.List(fields.Integer(), missing=None)
class _StatisticsListRequestSchema(Schema): from_ = fields.DateTime(data_key='from', missing=None) until = fields.DateTime(missing=None) day_start_time = fields.String(attribute='start_time', validate=Regexp(HOUR_REGEX)) day_end_time = fields.String(attribute='end_time', validate=Regexp(HOUR_REGEX)) week_days = fields.List( fields.Integer(), missing=[1, 2, 3, 4, 5, 6, 7], validate=ContainsOnly([1, 2, 3, 4, 5, 6, 7]), ) timezone = fields.String(validate=OneOf(pytz.all_timezones), missing='UTC') def _normalize_datetime(self, dt, timezone): if not dt.tzinfo: return timezone.normalize(timezone.localize(dt)) else: utc_dt = pytz.utc.normalize(dt) return timezone.normalize(utc_dt) @pre_load def convert_week_days_to_list(self, data, **kwargs): result = data.copy() if not isinstance(data, dict): result = data.to_dict() if data.get('week_days'): result['week_days'] = list(set(data['week_days'].split(','))) return result @post_load def convert_time_to_hour(self, data, **kwargs): if data.get('start_time'): start_time = time.fromisoformat(data['start_time']) data['start_time'] = start_time.hour if data.get('end_time'): end_time = time.fromisoformat(data['end_time']) data['end_time'] = end_time.hour return data @post_load def default_timezone_on_datetime(self, data, **kwargs): timezone = pytz.timezone(data.get('timezone')) from_ = data.get('from_') until = data.get('until') if from_: data['from_'] = self._normalize_datetime(from_, timezone) if until: data['until'] = self._normalize_datetime(until, timezone) return data @validates_schema def validate_dates(self, data, **kwargs): from_ = data.get('from_', None) until = data.get('until', None) timezone = pytz.timezone(data.get('timezone')) if from_: from_ = self._normalize_datetime(from_, timezone) if until: until = self._normalize_datetime(until, timezone) if from_ and until and until <= from_: raise ValidationError({'until': 'Field must be greater than from'}) @validates_schema def validate_start_end_times(self, data, **kwargs): if data.get('start_time') and data.get('end_time'): if data['start_time'] >= data['end_time']: raise ValidationError({ 'day_start_time': 'Field must be lower than day_end_time' })
class QueueStatisticsQoSSchema(_StatisticsPeriodSchema): queue_id = fields.Integer(default=None) queue_name = fields.String(default=None) quality_of_service = fields.List(fields.Nested(_QoSSchema))