Skip to content

Commit 4cf68b5

Browse files
Update message models and Add pytest code
1 parent b5091e7 commit 4cf68b5

21 files changed

+881
-74
lines changed

examples/simple/send_kakao_alimtalk.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from solapi import SolapiMessageService
2-
from solapi.model import Message
2+
from solapi.model import RequestMessage
33
from solapi.model.kakao.kakao_option import KakaoOption
44

55
# API 키와 API Secret을 설정합니다
@@ -20,7 +20,7 @@
2020
)
2121

2222
# 단일 메시지를 생성합니다
23-
message = Message(
23+
message = RequestMessage(
2424
from_="발신번호", # 발신번호 (등록된 발신번호만 사용 가능)
2525
to="수신번호", # 수신번호
2626
kakao_options=kakao_option,

examples/simple/send_many.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from solapi import SolapiMessageService
2-
from solapi.model import Message, SendRequestConfig
2+
from solapi.model import RequestMessage, SendRequestConfig
33

44
# API 키와 API Secret을 설정합니다
55
message_service = SolapiMessageService(
@@ -8,9 +8,9 @@
88

99
# 여러 메시지를 생성합니다
1010
messages = [
11-
Message(from_="발신번호", to="수신번호1", text="첫 번째 메시지입니다."),
12-
Message(from_="발신번호", to="수신번호2", text="두 번째 메시지입니다."),
13-
Message(from_="발신번호", to="수신번호3", text="세 번째 메시지입니다."),
11+
RequestMessage(from_="발신번호", to="수신번호1", text="첫 번째 메시지입니다."),
12+
RequestMessage(from_="발신번호", to="수신번호2", text="두 번째 메시지입니다."),
13+
RequestMessage(from_="발신번호", to="수신번호3", text="세 번째 메시지입니다."),
1414
]
1515

1616
# SendRequestConfig를 사용하여 중복 수신번호 허용 설정

examples/simple/send_mms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from os.path import abspath
22

33
from solapi import SolapiMessageService
4-
from solapi.model import Message
4+
from solapi.model import RequestMessage
55
from solapi.model.request.storage import FileTypeEnum
66

77
# API 키와 API Secret을 설정합니다
@@ -23,7 +23,7 @@
2323
print(f"File ID: {file_response.file_id}")
2424

2525
# MMS 메시지를 생성하고 발송합니다
26-
message = Message(
26+
message = RequestMessage(
2727
from_="발신번호", # 발신번호 (등록된 발신번호만 사용 가능)
2828
to="수신번호", # 수신번호
2929
# subject="MMS 제목", # MMS 제목, 제목을 지정하지 않는다면 필요하지 않습니다.

examples/simple/send_sms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from solapi import SolapiMessageService
2-
from solapi.model import Message
2+
from solapi.model import RequestMessage
33

44
# API 키와 API Secret을 설정합니다
55
message_service = SolapiMessageService(
66
api_key="YOUR_API_KEY", api_secret="YOUR_API_SECRET"
77
)
88

99
# 단일 메시지를 생성합니다
10-
message = Message(
10+
message = RequestMessage(
1111
from_="발신번호", # 발신번호 (등록된 발신번호만 사용 가능)
1212
to="수신번호", # 수신번호
1313
text="안녕하세요! SOLAPI Python SDK를 사용한 SMS 발송 예제입니다.",

examples/simple/send_sms_with_reservation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
from datetime import datetime
22

33
from solapi import SolapiMessageService
4-
from solapi.model import Message, SendRequestConfig
4+
from solapi.model import RequestMessage, SendRequestConfig
55

66
# API 키와 API Secret을 설정합니다
77
message_service = SolapiMessageService(
88
api_key="YOUR_API_KEY", api_secret="YOUR_API_SECRET"
99
)
1010

1111
# 단일 메시지를 생성합니다
12-
message = Message(
12+
message = RequestMessage(
1313
from_="발신번호", # 발신번호 (등록된 발신번호만 사용 가능)
1414
to="수신번호", # 수신번호
1515
text="안녕하세요! SOLAPI Python SDK를 사용한 SMS 발송 예제입니다.",

solapi/model/kakao/kakao_option.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
from collections.abc import Mapping
12
from typing import Optional
23

3-
from pydantic import BaseModel, ConfigDict
4+
from pydantic import BaseModel, ConfigDict, field_validator
45
from pydantic.alias_generators import to_camel
56

67

7-
# TODO: Request, Response용 모델을 별도로 분리해야 함
88
class KakaoOption(BaseModel):
99
pf_id: Optional[str] = None
1010
template_id: Optional[str] = None
@@ -13,3 +13,10 @@ class KakaoOption(BaseModel):
1313
image_id: Optional[str] = None
1414

1515
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
16+
17+
@field_validator("variables", mode="before")
18+
@classmethod
19+
def stringify_values(cls, v: Mapping[str, object]):
20+
if isinstance(v, Mapping):
21+
# 모든 value를 str로 캐스팅
22+
return {k: str(val) for k, val in v.items()}

solapi/model/rcs/rcs_options.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime
22
from enum import Enum
3-
from typing import Optional
3+
from typing import Any, Optional
44

55
from pydantic import BaseModel, ConfigDict
66
from pydantic.alias_generators import to_camel
@@ -82,7 +82,8 @@ class RcsOption(BaseModel):
8282
mms_type: Optional[RcsMmsType] = None
8383
commercial_type: Optional[bool] = None
8484
disable_sms: Optional[bool] = False
85-
additional_body: Optional[list[RcsAdditionalBody]] = None
85+
additional_body: Optional[Any] = None
86+
# additional_body: Optional[list[RcsAdditionalBody]] = None
8687
buttons: Optional[list[RcsButton]] = None
8788

8889
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from typing import Optional
2+
3+
from pydantic import BaseModel, ConfigDict
4+
from pydantic.alias_generators import to_camel
5+
6+
from solapi.model.kakao.kakao_button import KakaoButton
7+
8+
9+
class KakaoOption(BaseModel):
10+
pf_id: str
11+
template_id: Optional[str] = None
12+
variables: Optional[dict[str, str]] = None
13+
disable_sms: bool = False
14+
image_id: Optional[str] = None
15+
buttons: Optional[list[KakaoButton]] = None
16+
17+
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)

solapi/model/request/message.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from typing import Any, Optional, Union
2+
3+
from pydantic import BaseModel, ConfigDict, Field
4+
from pydantic.alias_generators import to_camel
5+
6+
from solapi.model import KakaoOption
7+
from solapi.model.message_type import MessageType
8+
from solapi.model.rcs.rcs_options import RcsOption
9+
10+
11+
class FileIdsType(BaseModel):
12+
file_ids: Optional[list[str]] = None
13+
14+
15+
class Message(BaseModel):
16+
from_: Optional[str] = Field(
17+
default=None, serialization_alias="from", validation_alias="from"
18+
)
19+
to: Union[str, list[str]]
20+
text: Optional[str] = None
21+
image_id: Optional[str] = Field(
22+
default=None, serialization_alias="imageId", validation_alias="imageId"
23+
)
24+
country: str = "82"
25+
message_id: Optional[str] = Field(
26+
default=None, serialization_alias="messageId", validation_alias="messageId"
27+
)
28+
group_id: Optional[str] = Field(
29+
default=None, serialization_alias="groupId", validation_alias="groupId"
30+
)
31+
type: Optional[MessageType] = None
32+
auto_type_detect: Optional[bool] = Field(
33+
default=True,
34+
serialization_alias="autoTypeDetect",
35+
validation_alias="autoTypeDetect",
36+
)
37+
subject: Optional[str] = None
38+
replacements: Optional[list[dict[str, Any]]] = None
39+
custom_fields: Optional[dict[str, str]] = Field(
40+
default=None,
41+
serialization_alias="customFields",
42+
validation_alias="customFields",
43+
)
44+
kakao_options: Optional[KakaoOption] = Field(
45+
default=None,
46+
serialization_alias="kakaoOptions",
47+
validation_alias="kakaoOptions",
48+
)
49+
rcs_options: Optional[RcsOption] = Field(
50+
default=None, serialization_alias="rcsOptions", validation_alias="rcsOptions"
51+
)
52+
fax_options: Optional[FileIdsType] = Field(
53+
default=None, serialization_alias="faxOptions", validation_alias="faxOptions"
54+
)
55+
56+
model_config = ConfigDict(
57+
extra="ignore",
58+
populate_by_name=True,
59+
alias_generator=to_camel,
60+
)

solapi/model/request/send_message_request.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from pydantic import BaseModel, ConfigDict
66
from pydantic.alias_generators import to_camel
77

8-
from solapi.model.message import Message
98
from solapi.model.request import VERSION
9+
from solapi.model.request.message import Message
1010

1111

1212
class SendRequestConfig(BaseModel):

0 commit comments

Comments
 (0)