class RoomSchema(Schema): uuid = fields.UUID(dump_only=True) tenant_uuid = fields.UUID(dump_only=True) name = fields.String(allow_none=True) users = fields.Nested('RoomUserSchema', many=True, missing=[])
class ProfileSchema(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) display = fields.Nested(ResourceSchema) services = ServiceDictSchema(BaseSchema, required=True)
class ExportSchema(Schema): uuid = fields.UUID() tenant_uuid = fields.UUID() user_uuid = fields.UUID() requested_at = fields.DateTime() filename = fields.String() status = fields.String()
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 MessageSchema(Schema): uuid = fields.UUID(dump_only=True) content = fields.String(required=True) alias = fields.String(validate=validate.Length(max=256), allow_none=True) user_uuid = fields.UUID(dump_only=True) tenant_uuid = fields.UUID(dump_only=True) wazo_uuid = fields.UUID(dump_only=True) created_at = fields.DateTime(dump_only=True) room = fields.Nested('RoomSchema', dump_only=True, only=['uuid'])
class DisplaySchema(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) columns = fields.Nested( DisplayColumnSchema, many=True, required=True, validate=Length(min=1), )
class UserPresenceSchema(Schema): uuid = fields.UUID(dump_only=True) tenant_uuid = fields.UUID(dump_only=True) state = fields.String( required=True, validate=OneOf(['available', 'unavailable', 'invisible', 'away'])) status = fields.String(allow_none=True) last_activity = fields.DateTime(dump_only=True) line_state = fields.String(dump_only=True) mobile = fields.Boolean(dump_only=True) do_not_disturb = fields.Boolean(dump_only=True) connected = fields.Boolean(dump_only=True) lines = fields.Nested('LinePresenceSchema', many=True, dump_only=True) @post_dump def _set_line_state(self, user, **kwargs): line_states = [line['state'] for line in user['lines']] if 'ringing' in line_states: merged_state = 'ringing' elif 'progressing' in line_states: merged_state = 'progressing' elif 'holding' in line_states: merged_state = 'holding' elif 'talking' in line_states: merged_state = 'talking' elif 'available' in line_states: merged_state = 'available' else: merged_state = 'unavailable' user['line_state'] = merged_state return user @post_dump(pass_original=True) def _set_mobile(self, user, raw_user, **kwargs): for token in raw_user.refresh_tokens: if token.mobile is True: user['mobile'] = True return user for session in raw_user.sessions: if session.mobile is True: user['mobile'] = True return user user['mobile'] = False return user @post_dump(pass_original=True) def _set_connected(self, user, raw_user, **kwargs): user['connected'] = True if raw_user.sessions else False return user
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 SubscriptionLogSchema(Schema): uuid = fields.UUID(dump_only=True) status = fields.String() started_at = fields.DateTime() ended_at = fields.DateTime() attempts = fields.Integer() max_attempts = fields.Integer() event = fields.Dict() detail = fields.Dict()
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 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 _StatisticsPeriodSchema(Schema): from_ = fields.String(attribute='from', data_key='from') until = fields.String() tenant_uuid = fields.UUID(default=None) @pre_dump def convert_from_and_until_to_isoformat(self, data, **kwargs): if data.get('from'): data['from'] = data['from'].isoformat() if data.get('until'): data['until'] = data['until'].isoformat() return data
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 TenantSchema(BaseSchema): uuid = xfields.UUID(missing=None) parent_uuid = xfields.UUID(dump_only=True) name = xfields.String(validate=validate.Length(min=1, max=128), default=None, missing=None) contact_uuid = xfields.UUID(data_key='contact', missing=None, default=None) phone = xfields.String(validate=validate.Length(min=1, max=32), default=None, missing=None) address = xfields.Nested( TenantAddress, missing=empty_tenant_address, default=empty_tenant_address, allow_none=False, ) @post_dump def add_empty_address(self, data): data['address'] = data['address'] or empty_tenant_address return data
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 TenantSchema(BaseSchema): uuid = xfields.UUID(missing=None) parent_uuid = xfields.UUID(dump_only=True) name = xfields.String(validate=validate.Length(min=1, max=128), default=None, missing=None) contact_uuid = xfields.UUID(load_from='contact', dump_to='contact', missing=None, default=None) phone = xfields.String(validate=validate.Length(min=1, max=32), default=None, missing=None) address = xfields.Nested(TenantAddress, missing=dict, default=dict, allow_none=False) @post_dump def add_empty_address(self, data): data['address'] = data['address'] or TenantAddress().dump( data['address']).data 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 RetentionSchema(Schema): tenant_uuid = fields.UUID(dump_only=True) cdr_days = fields.Integer(validate=Range(min=0), missing=None) export_days = fields.Integer(validate=Range(min=0), missing=None) recording_days = fields.Integer(validate=Range(min=0), missing=None) default_cdr_days = fields.Integer(dump_only=True) default_export_days = fields.Integer(dump_only=True) default_recording_days = fields.Integer(dump_only=True) @validates_schema def validate_days(self, data, **kwargs): cdr_days = data.get('cdr_days') recording_days = data.get('recording_days') if cdr_days is None or recording_days is None: return if recording_days > cdr_days: raise ValidationError( '"recording_days" must be higher or equal than "cdr_days"', field_name='recording_days', )
class ProfileSchema(BaseSchema): uuid = fields.UUID(dump_only=True) tenant_uuid = fields.UUID(dump_only=True) name = fields.String() display = fields.Nested(DisplaySchema) services = ServiceDictSchema(BaseSchema, required=True)
class SourceSchema(BaseSchema): backend = fields.String() name = fields.String() tenant_uuid = fields.UUID(dump_only=True) uuid = fields.UUID(dump_only=True)
class ResourceSchema(BaseSchema): uuid = fields.UUID(required=True)
class RecordingSchema(Schema): uuid = fields.UUID() start_time = fields.DateTime() end_time = fields.DateTime() deleted = fields.Boolean() filename = fields.String()
class RecordingMediaExportSchema(Schema): uuid = fields.UUID()
class SetupSchema(Schema): engine_language = fields.String(required=True, validate=validate.OneOf(['en_US', 'fr_FR'])) engine_password = fields.String(required=True) engine_license = fields.Boolean(required=True, validate=validate.Equal(True)) engine_internal_address = fields.String() engine_instance_uuid = fields.UUID(missing=None) engine_rtp_icesupport = fields.Boolean(required=False, missing=False) engine_rtp_stunaddr = fields.String(validate=validate.Length(min=1, max=1024), missing=None) nestbox_host = fields.String() nestbox_port = fields.Integer( validate=validate.Range(min=0, max=65535, error='Not a valid TCP/IP port number.'), missing=443, ) nestbox_verify_certificate = fields.Boolean(missing=True) nestbox_service_id = fields.String() nestbox_service_key = fields.String() nestbox_instance_name = fields.String() nestbox_engine_host = fields.String() nestbox_engine_port = fields.Integer( validate=validate.Range(min=0, max=65535, error='Not a valid TCP/IP port number.'), missing=443, ) @validates_schema def nestbox_all_or_nothing(self, data): if not data.get('nestbox_host'): return if 'nestbox_service_id' not in data: raise ValidationError( 'Missing keys for Nestbox configuration: nestbox_service_id') if 'nestbox_service_key' not in data: raise ValidationError( 'Missing keys for Nestbox configuration: nestbox_service_key') if 'nestbox_instance_name' not in data: raise ValidationError( 'Missing keys for Nestbox configuration: nestbox_instance_name' ) if 'nestbox_engine_host' not in data: raise ValidationError( 'Missing keys for Nestbox configuration: nestbox_engine_host') if 'engine_internal_address' not in data: raise ValidationError( 'Missing keys for Nestbox configuration: engine_internal_address' ) @validates_schema def check_rtp_fields(self, data): if not data.get('engine_rtp_icesupport'): return required_field = 'engine_rtp_stunaddr' if not data.get(required_field): raise ValidationError( 'Missing keys for rtp configuration: {}'.format( required_field), field_name=required_field, )
class RoomUserSchema(Schema): uuid = fields.UUID() tenant_uuid = fields.UUID() wazo_uuid = fields.UUID()
class UserPostSchema(_BaseUserSchema): uuid = fields.UUID() password = fields.String(validate=validate.Length(min=1), allow_none=True) email_address = fields.Email(allow_none=True)