Skip to content

Commit 989be78

Browse files
committed
create message models
1 parent f22d90b commit 989be78

File tree

6 files changed

+379
-0
lines changed

6 files changed

+379
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
python_sources()
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
from .message import BaseMessage
2+
from .messenger import (
3+
MessengerAudio,
4+
MessengerFile,
5+
MessengerImage,
6+
MessengerOptions,
7+
MessengerResource,
8+
MessengerText,
9+
MessengerVideo,
10+
)
11+
from .mms import MmsAudio, MmsImage, MmsResource, MmsVcard, MmsVideo
12+
from .sms import Sms, SmsOptions
13+
from .viber import (
14+
ViberAction,
15+
ViberFile,
16+
ViberFileOptions,
17+
ViberFileResource,
18+
ViberImage,
19+
ViberImageOptions,
20+
ViberImageResource,
21+
ViberText,
22+
ViberTextOptions,
23+
ViberVideo,
24+
ViberVideoOptions,
25+
ViberVideoResource,
26+
)
27+
from .whatsapp import (
28+
WhatsappAudio,
29+
WhatsappAudioResource,
30+
WhatsappContext,
31+
WhatsappCustom,
32+
WhatsappFile,
33+
WhatsappFileResource,
34+
WhatsappImage,
35+
WhatsappImageResource,
36+
WhatsappSticker,
37+
WhatsappStickerId,
38+
WhatsappStickerUrl,
39+
WhatsappTemplate,
40+
WhatsappTemplateResource,
41+
WhatsappTemplateSettings,
42+
WhatsappText,
43+
WhatsappVideo,
44+
WhatsappVideoResource,
45+
)
46+
47+
__all__ = [
48+
'BaseMessage',
49+
'MessengerAudio',
50+
'MessengerFile',
51+
'MessengerImage',
52+
'MessengerOptions',
53+
'MessengerResource',
54+
'MessengerText',
55+
'MessengerVideo',
56+
'MmsAudio',
57+
'MmsImage',
58+
'MmsResource',
59+
'MmsVcard',
60+
'MmsVideo',
61+
'Sms',
62+
'SmsOptions',
63+
'ViberAction',
64+
'ViberFile',
65+
'ViberFileOptions',
66+
'ViberFileResource',
67+
'ViberImage',
68+
'ViberImageOptions',
69+
'ViberImageResource',
70+
'ViberText',
71+
'ViberTextOptions',
72+
'ViberVideo',
73+
'ViberVideoOptions',
74+
'ViberVideoResource',
75+
'WhatsappAudio',
76+
'WhatsappAudioResource',
77+
'WhatsappContext',
78+
'WhatsappCustom',
79+
'WhatsappFile',
80+
'WhatsappFileResource',
81+
'WhatsappImage',
82+
'WhatsappImageResource',
83+
'WhatsappSticker',
84+
'WhatsappStickerId',
85+
'WhatsappStickerUrl',
86+
'WhatsappTemplate',
87+
'WhatsappTemplateResource',
88+
'WhatsappTemplateSettings',
89+
'WhatsappText',
90+
'WhatsappVideo',
91+
'WhatsappVideoResource',
92+
]
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from typing import Literal, Optional
2+
3+
from pydantic import BaseModel, Field, model_validator
4+
5+
from ..enums import ChannelType, MessageType
6+
from .message import BaseMessage
7+
8+
9+
class MessengerResource(BaseModel):
10+
url: str
11+
12+
13+
class MessengerOptions(BaseModel):
14+
category: Optional[Literal['response', 'update', 'message_tag']] = None
15+
tag: Optional[str] = None
16+
17+
@model_validator(mode='after')
18+
def check_tag_if_category_message_tag(self):
19+
if self.category == 'message_tag' and not self.tag:
20+
raise ValueError('"tag" is required when "category" == "message_tag"')
21+
return self
22+
23+
24+
class BaseMessenger(BaseMessage):
25+
to: str = Field(..., min_length=1, max_length=50)
26+
from_: str = Field(..., min_length=1, max_length=50, serialization_alias='from')
27+
messenger: Optional[MessengerOptions] = None
28+
channel: ChannelType = ChannelType.MESSENGER
29+
30+
31+
class MessengerText(BaseMessenger):
32+
text: str = Field(..., max_length=640)
33+
type: MessageType = MessageType.TEXT
34+
35+
36+
class MessengerImage(BaseMessenger):
37+
image: MessengerResource
38+
type: MessageType = MessageType.IMAGE
39+
40+
41+
class MessengerAudio(BaseMessenger):
42+
audio: MessengerResource
43+
type: MessageType = MessageType.AUDIO
44+
45+
46+
class MessengerVideo(BaseMessenger):
47+
video: MessengerResource
48+
type: MessageType = MessageType.VIDEO
49+
50+
51+
class MessengerFile(BaseMessenger):
52+
file: MessengerResource
53+
type: MessageType = MessageType.FILE
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from typing import Optional, Union
2+
3+
from pydantic import BaseModel, Field
4+
from vonage_utils.types.phone_number import PhoneNumber
5+
6+
from ..enums import ChannelType, MessageType
7+
from .message import BaseMessage
8+
9+
10+
class MmsResource(BaseModel):
11+
url: str
12+
caption: Optional[str] = Field(None, min_length=1, max_length=2000)
13+
14+
15+
class BaseMms(BaseMessage):
16+
to: PhoneNumber
17+
from_: Union[PhoneNumber, str] = Field(..., serialization_alias='from')
18+
ttl: Optional[int] = Field(None, ge=300, le=259200)
19+
channel: ChannelType = ChannelType.MMS
20+
21+
22+
class MmsImage(BaseMms):
23+
image: MmsResource
24+
message_type: MessageType = MessageType.IMAGE
25+
26+
27+
class MmsVcard(BaseMms):
28+
vcard: MmsResource
29+
message_type: MessageType = MessageType.VCARD
30+
31+
32+
class MmsAudio(BaseMms):
33+
audio: MmsResource
34+
message_type: MessageType = MessageType.AUDIO
35+
36+
37+
class MmsVideo(BaseMms):
38+
video: MmsResource
39+
message_type: MessageType = MessageType.VIDEO
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
from typing import Literal, Optional
2+
3+
from pydantic import BaseModel, Field, field_validator
4+
5+
from ..enums import ChannelType, MessageType
6+
from .message import BaseMessage
7+
8+
9+
class ViberAction(BaseModel):
10+
url: str
11+
text: str = Field(..., max_length=30)
12+
13+
14+
class ViberOptions(BaseModel):
15+
category: Literal['transaction', 'promotion'] = None
16+
ttl: Optional[int] = Field(None, ge=30, le=259200)
17+
type: Optional[Literal['string', 'template']] = None
18+
19+
20+
class BaseViber(BaseMessage):
21+
from_: str = Field(..., min_length=1, max_length=50, serialization_alias='from')
22+
viber_service: Optional[ViberOptions] = None
23+
channel: ChannelType = ChannelType.VIBER
24+
25+
26+
class ViberTextOptions(ViberOptions):
27+
action: Optional[ViberAction] = None
28+
29+
30+
class ViberText(BaseViber):
31+
text: str = Field(..., max_length=1000)
32+
viber_service: Optional[ViberTextOptions] = None
33+
message_type: MessageType = MessageType.TEXT
34+
35+
36+
class ViberImageResource(BaseModel):
37+
url: str
38+
caption: Optional[str] = None
39+
40+
41+
class ViberImageOptions(ViberOptions):
42+
action: Optional[ViberAction] = None
43+
44+
45+
class ViberImage(BaseViber):
46+
image: ViberImageResource
47+
viber_service: Optional[ViberImageOptions] = None
48+
message_type: MessageType = MessageType.IMAGE
49+
50+
51+
class ViberVideoResource(BaseModel):
52+
url: str
53+
thumb_url: str = Field(..., max_length=1000)
54+
caption: Optional[str] = Field(None, max_length=1000)
55+
56+
57+
class ViberVideoOptions(ViberOptions):
58+
duration: str
59+
file_size: str
60+
61+
@field_validator('duration')
62+
@classmethod
63+
def validate_duration(cls, value):
64+
value_int = int(value)
65+
if not 1 <= value_int <= 600:
66+
raise ValueError('"Duration" must be a number between 1 and 600.')
67+
return value
68+
69+
@field_validator('file_size')
70+
@classmethod
71+
def validate_file_size(cls, value):
72+
value_int = int(value)
73+
if not 1 <= value_int <= 200:
74+
raise ValueError('"File size" must be a number between 1 and 200.')
75+
return value
76+
77+
78+
class ViberVideo(BaseViber):
79+
video: ViberVideoResource
80+
viber_service: Optional[ViberVideoOptions] = None
81+
message_type: MessageType = MessageType.VIDEO
82+
83+
84+
class ViberFileResource(BaseModel):
85+
url: str
86+
name: Optional[str] = Field(None, max_length=25)
87+
88+
89+
class ViberFileOptions(ViberOptions):
90+
pass
91+
92+
93+
class ViberFile(BaseViber):
94+
file: ViberFileResource
95+
viber_service: Optional[ViberFileOptions] = None
96+
message_type: MessageType = MessageType.FILE
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
from typing import Literal, Optional, Union
2+
3+
from pydantic import BaseModel, ConfigDict, Field
4+
from vonage_utils.types.phone_number import PhoneNumber
5+
6+
from ..enums import ChannelType, MessageType
7+
from .message import BaseMessage
8+
9+
10+
class WhatsappContext(BaseModel):
11+
message_uuid: str
12+
13+
14+
class BaseWhatsapp(BaseMessage):
15+
from_: Union[PhoneNumber, str] = Field(..., serialization_alias='from')
16+
context: WhatsappContext
17+
channel: ChannelType = ChannelType.WHATSAPP
18+
19+
20+
class WhatsappText(BaseWhatsapp):
21+
text: str = Field(..., max_length=4096)
22+
type: MessageType = MessageType.TEXT
23+
24+
25+
class WhatsappImageResource(BaseModel):
26+
url: str
27+
caption: Optional[str] = Field(None, min_length=1, max_length=3000)
28+
29+
30+
class WhatsappImage(BaseWhatsapp):
31+
image: WhatsappImageResource
32+
type: MessageType = MessageType.IMAGE
33+
34+
35+
class WhatsappAudioResource(BaseModel):
36+
url: str = Field(..., min_length=10, max_length=2000)
37+
38+
39+
class WhatsappAudio(BaseWhatsapp):
40+
audio: WhatsappAudioResource
41+
type: MessageType = MessageType.AUDIO
42+
43+
44+
class WhatsappVideoResource(BaseModel):
45+
url: str
46+
caption: Optional[str] = None
47+
48+
49+
class WhatsappVideo(BaseWhatsapp):
50+
video: WhatsappVideoResource
51+
type: MessageType = MessageType.VIDEO
52+
53+
54+
class WhatsappFileResource(BaseModel):
55+
url: str
56+
caption: Optional[str] = None
57+
name: Optional[str] = None
58+
59+
60+
class WhatsappFile(BaseWhatsapp):
61+
file: WhatsappFileResource
62+
type: MessageType = MessageType.FILE
63+
64+
65+
class WhatsappTemplateResource(BaseModel):
66+
name: str
67+
parameters: Optional[list] = None
68+
69+
model_config = ConfigDict(extra='allow')
70+
71+
72+
class WhatsappTemplateSettings(BaseModel):
73+
locale: str = 'en_US'
74+
policy: Optional[Literal['deterministic']] = None
75+
76+
77+
class WhatsappTemplate(BaseWhatsapp):
78+
template: WhatsappTemplateResource
79+
whatsapp: WhatsappTemplateSettings
80+
type: MessageType = MessageType.TEMPLATE
81+
82+
83+
class WhatsappStickerUrl(BaseModel):
84+
url: str
85+
86+
87+
class WhatsappStickerId(BaseModel):
88+
id: str
89+
90+
91+
class WhatsappSticker(BaseWhatsapp):
92+
sticker: Union[WhatsappStickerUrl, WhatsappStickerId]
93+
type: MessageType = MessageType.STICKER
94+
95+
96+
class WhatsappCustom(BaseWhatsapp):
97+
custom: Optional[dict] = None
98+
type: MessageType = MessageType.CUSTOM

0 commit comments

Comments
 (0)