1- from typing import Dict , List , Optional
2-
3- from pydantic import BaseModel , Field , HttpUrl
1+ from dataclasses import field
2+ from typing import List , Optional
3+
4+ from pydantic import (
5+ BaseModel ,
6+ Field ,
7+ ValidationInfo ,
8+ field_validator ,
9+ model_validator ,
10+ root_validator ,
11+ )
412from typing_extensions import Annotated
513
6- PhoneNumber = Annotated [str , Field (pattern = '^[1-9]\d{6,14}$' )]
14+
15+ PhoneNumber = Annotated [str , Field (pattern = r'^[1-9]\d{6,14}$' )]
16+
17+
18+ class Link (BaseModel ):
19+ href : str
20+
21+
22+ class ResourceLink (BaseModel ):
23+ self : Link
724
825
926class PstnChannel (BaseModel ):
1027 number : int
1128
1229
1330class SipChannel (BaseModel ):
14- uri : str = Field (..., pattern = '^(sip|sips):\+?([\w|:.\-@;,=%&]+)' )
31+ uri : str = Field (..., pattern = r '^(sip|sips):\+?([\w|:.\-@;,=%&]+)' )
1532 username : str = None
1633 password : str = None
1734
@@ -21,9 +38,11 @@ class VbcChannel(BaseModel):
2138
2239
2340class WebsocketChannel (BaseModel ):
24- uri : str = Field (pattern = '^(ws|wss)://[a-zA-Z0-9~#%@&-_?\/.,:;)(][]*$' )
25- content_type : str = Field (pattern = "^audio/l16;rate=(8000|16000)$" )
26- headers : Optional [Dict [str , str ]] = None
41+ uri : str = Field (pattern = r'^(ws|wss):\/\/[a-zA-Z0-9~#%@&-_?\/.,:;)(\]\[]*$' )
42+ content_type : Optional [str ] = Field (
43+ None , alias = 'content-type' , pattern = '^audio/l16;rate=(8000|16000)$'
44+ )
45+ headers : Optional [dict ] = None
2746
2847
2948class SmsChannel (BaseModel ):
@@ -47,24 +66,34 @@ class MessengerChannel(BaseModel):
4766
4867
4968class Channels (BaseModel ):
50- pstn : Optional [List [PstnChannel ]] = None
51- sip : Optional [List [SipChannel ]] = None
52- vbc : Optional [List [VbcChannel ]] = None
53- websocket : Optional [List [WebsocketChannel ]] = None
5469 sms : Optional [List [SmsChannel ]] = None
5570 mms : Optional [List [MmsChannel ]] = None
5671 whatsapp : Optional [List [WhatsappChannel ]] = None
5772 viber : Optional [List [ViberChannel ]] = None
5873 messenger : Optional [List [MessengerChannel ]] = None
74+ pstn : Optional [List [PstnChannel ]] = None
75+ sip : Optional [List [SipChannel ]] = None
76+ websocket : Optional [List [WebsocketChannel ]] = None
77+ vbc : Optional [List [VbcChannel ]] = None
5978
6079
6180class Properties (BaseModel ):
62- custom_data : Optional [Dict [ str , str ]]
81+ custom_data : Optional [dict ] = None
6382
6483
6584class User (BaseModel ):
66- name : Optional [str ] = Field (None , example = "my_user_name" )
67- display_name : Optional [str ] = Field (None , example = "My User Name" )
68- image_url : Optional [HttpUrl ] = Field (None , example = "https://example.com/image.png" )
69- properties : Optional [Properties ]
70- channels : Optional [Channels ]
85+ name : Optional [str ] = None
86+ display_name : Optional [str ] = None
87+ image_url : Optional [str ] = None
88+ channels : Optional [Channels ] = None
89+ properties : Optional [Properties ] = None
90+ links : Optional [ResourceLink ] = Field (None , validation_alias = '_links' , exclude = True )
91+ link : Optional [str ] = None
92+ id : Optional [str ] = None
93+
94+ @model_validator (mode = 'after' )
95+ @classmethod
96+ def get_link (cls , data ):
97+ if data .links is not None :
98+ data .link = data .links .self .href
99+ return data
0 commit comments