Skip to content

Commit b0b6eac

Browse files
committed
Using bump-pydantic to upgrade to v2
Signed-off-by: Toomore Chiang <[email protected]>
1 parent e06dd32 commit b0b6eac

15 files changed

+276
-213
lines changed

api/apistructs/items.py

+24-22
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@
33
from datetime import date
44
from typing import Any
55

6-
from pydantic import BaseModel, EmailStr, Field, HttpUrl, validator
6+
from pydantic import field_validator, BaseModel, EmailStr, Field, HttpUrl
77

88

99
class ProjectItem(BaseModel):
1010
''' ProjectItem '''
1111
id: str = Field(description='`pid`, project id')
1212
name: str = Field(description='project name')
13-
desc: str | None = Field(description='desc')
14-
action_date: date | None = Field(description='action date')
15-
owners: list[str] | None = Field(description='list of owners')
16-
calendar: str | None = Field(description='calendar url')
17-
gitlab_project_id: str | None = Field(description='gitlab project id')
13+
desc: str | None = Field(None, description='desc')
14+
action_date: date | None = Field(None, description='action date')
15+
owners: list[str] | None = Field(None, description='list of owners')
16+
calendar: str | None = Field(None, description='calendar url')
17+
gitlab_project_id: str | None = Field(None, description='gitlab project id')
1818
mailling_leader: EmailStr | None = Field(
19-
description='mailing list of leader')
19+
None, description='mailing list of leader')
2020
mailling_staff: EmailStr | None = Field(
21-
description='mailing list of staff')
21+
None, description='mailing list of staff')
2222
mattermost_ch_id: str | None = Field(
23-
description='Mattermost main channel id')
24-
shared_drive: HttpUrl | None = Field(description='Google shared drive')
23+
None, description='Mattermost main channel id')
24+
shared_drive: HttpUrl | None = Field(None, description='Google shared drive')
2525
traffic_fee_doc: HttpUrl | None = Field(
26-
description='doc fields for traffic fee')
26+
None, description='doc fields for traffic fee')
2727
volunteer_certificate_hours: int | None = Field(
28-
description='hours for volunteer certificate')
28+
None, description='hours for volunteer certificate')
2929

30-
@validator('*', pre=True)
30+
@field_validator('*', mode="before")
31+
@classmethod
3132
def skip_empty_str(cls, value: Any) -> Any: # pylint:disable=no-self-argument
3233
''' skip empty string '''
3334
if isinstance(value, str):
@@ -44,13 +45,14 @@ class TeamItem(BaseModel):
4445
pid: str = Field(description='`pid`, project id')
4546
id: str = Field(description='`tid`, team id')
4647
name: str = Field(description='team name')
47-
chiefs: list[str] | None = Field(description="list of chiefs' uids")
48-
members: list[str] | None = Field(description="list of members' uids")
49-
desc: str | None = Field(description='desc')
50-
mailling: EmailStr | None = Field(description='mailing list for team')
51-
headcount: int | None = Field(description='the headcount of team')
48+
chiefs: list[str] | None = Field(None, description="list of chiefs' uids")
49+
members: list[str] | None = Field(None, description="list of members' uids")
50+
desc: str | None = Field(None, description='desc')
51+
mailling: EmailStr | None = Field(None, description='mailing list for team')
52+
headcount: int | None = Field(None, description='the headcount of team')
5253

53-
@validator('*', pre=True)
54+
@field_validator('*', mode="before")
55+
@classmethod
5456
def skip_empty_str(cls, value: Any) -> Any: # pylint:disable=no-self-argument
5557
''' skip empty string '''
5658
if isinstance(value, str):
@@ -72,6 +74,6 @@ class UserItem(BaseModel):
7274
id: str = Field(description='user id')
7375
badge_name: str = Field(description='badge name')
7476
avatar: HttpUrl = Field(description='url for avatar')
75-
intro: str | None = Field(description='introduction')
76-
chat: MattermostAccount | None = Field(description='Mattermost account')
77-
is_chief: bool | None = Field(description='is the chief in the team')
77+
intro: str | None = Field(None, description='introduction')
78+
chat: MattermostAccount | None = Field(None, description='Mattermost account')
79+
is_chief: bool | None = Field(None, description='is the chief in the team')

api/apistructs/projects.py

+16-14
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from datetime import date, datetime
33

44
import arrow
5-
from pydantic import BaseModel, EmailStr, Field, HttpUrl, validator
5+
from pydantic import field_validator, BaseModel, EmailStr, Field, HttpUrl
66

77
from api.apistructs.items import ProjectItem, TeamItem
88
from structs.projects import ProjectTrafficLocationFeeItem
@@ -29,36 +29,38 @@ class ProjectCreateOutput(ProjectCreate):
2929
''' Project create output '''
3030
pid: str = Field(description='project id', alias='_id')
3131

32-
@validator('action_date', pre=True)
32+
@field_validator('action_date', mode="before")
33+
@classmethod
3334
def convert_action_date(cls, value: datetime) -> str: # pylint: disable=no-self-argument
3435
''' convert_action_date '''
3536
return arrow.get(value).format('YYYY/MM/DD')
3637

3738

3839
class ProjectItemUpdateInput(BaseModel):
3940
''' Update project item input '''
40-
name: str | None = Field(description='project name')
41-
desc: str | None = Field(description='desc')
42-
action_date: date | None = Field(description='action date')
43-
calendar: str | None = Field(description='calendar url')
44-
gitlab_project_id: str | None = Field(description='gitlab project id')
41+
name: str | None = Field(None, description='project name')
42+
desc: str | None = Field(None, description='desc')
43+
action_date: date | None = Field(None, description='action date')
44+
calendar: str | None = Field(None, description='calendar url')
45+
gitlab_project_id: str | None = Field(None, description='gitlab project id')
4546
mailling_leader: EmailStr | None = Field(
46-
description='mailing list of leader')
47+
None, description='mailing list of leader')
4748
mailling_staff: EmailStr | None = Field(
48-
description='mailing list of staff')
49+
None, description='mailing list of staff')
4950
mattermost_ch_id: str | None = Field(
50-
description='Mattermost main channel id')
51-
shared_drive: HttpUrl | None = Field(description='Google shared drive')
51+
None, description='Mattermost main channel id')
52+
shared_drive: HttpUrl | None = Field(None, description='Google shared drive')
5253
traffic_fee_doc: HttpUrl | None = Field(
53-
description='doc fields for traffic fee')
54+
None, description='doc fields for traffic fee')
5455
volunteer_certificate_hours: int | None = Field(
55-
description='hours for volunteer certificate')
56+
None, description='hours for volunteer certificate')
5657

5758

5859
class ProjectItemUpdateOutput(ProjectItemUpdateInput):
5960
''' Update project item output '''
6061

61-
@validator('action_date', pre=True)
62+
@field_validator('action_date', mode="before")
63+
@classmethod
6264
def convert_action_date(cls, value: str | int | float) -> date: # pylint:disable=no-self-argument
6365
''' convert action_date to date '''
6466
return arrow.get(value).date()

api/apistructs/sender.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import Any
44

55
import arrow
6-
from pydantic import BaseModel, Field, validator
6+
from pydantic import field_validator, BaseModel, Field
77

88

99
class SenderCampaignInput(BaseModel):
@@ -18,7 +18,8 @@ class Creater(BaseModel):
1818
uid: str = Field(description='user id')
1919
at: datetime = Field(description='created at in timestamp')
2020

21-
@validator('at', pre=True)
21+
@field_validator('at', mode="before")
22+
@classmethod
2223
def convert_to_datetime(cls, value: int | float | datetime) -> datetime: # pylint: disable=no-self-argument
2324
''' convert to datetime '''
2425
return arrow.get(value).naive
@@ -41,7 +42,8 @@ class Receiver(BaseModel):
4142
all_users: bool = Field(
4243
default=False, description='Send to all users in platform')
4344

44-
@validator('team_w_tags', pre=True)
45+
@field_validator('team_w_tags', mode="before")
46+
@classmethod
4547
def convert_to_list(cls, # pylint: disable=no-self-argument
4648
value: Any | list[dict[str, str | list[str]]]) -> list[
4749
dict[str, str | list[str]]]:

api/apistructs/tasks.py

+10-20
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
''' API Structs - Tasks '''
22
from datetime import datetime
33

4-
from pydantic import BaseModel, Field
4+
from pydantic import ConfigDict, BaseModel, Field
55

66
from api.apistructs.items import UserItem
77
from structs.tasks import TaskItem
@@ -23,11 +23,7 @@ class TaskCreateInput(BaseModel):
2323
endtime: datetime = Field(
2424
default_factory=datetime.now, description='task end')
2525
limit: int = Field(default=1, ge=1, description='expect required users')
26-
27-
class Config: # pylint: disable=too-few-public-methods
28-
''' Config '''
29-
anystr_strip_whitespace = True
30-
validate_assignment = True
26+
model_config = ConfigDict(str_strip_whitespace=True, validate_assignment=True)
3127

3228

3329
class TaskCreateOutput(TaskItem):
@@ -40,25 +36,19 @@ class TaskGetOutput(TaskItem):
4036

4137
class TaskUpdateInput(BaseModel):
4238
''' TaskUpdateInput '''
43-
title: str | None = Field(description='title')
44-
cate: str | None = Field(description='cate')
45-
desc: str | None = Field(description='desc')
46-
starttime: datetime | None = Field(description='task start')
47-
endtime: datetime | None = Field(description='task end')
48-
limit: int | None = Field(description='expect required users')
49-
50-
class Config: # pylint: disable=too-few-public-methods
51-
''' Config '''
52-
anystr_strip_whitespace = True
39+
title: str | None = Field(None, description='title')
40+
cate: str | None = Field(None, description='cate')
41+
desc: str | None = Field(None, description='desc')
42+
starttime: datetime | None = Field(None, description='task start')
43+
endtime: datetime | None = Field(None, description='task end')
44+
limit: int | None = Field(None, description='expect required users')
45+
model_config = ConfigDict(str_strip_whitespace=True)
5346

5447

5548
class TaskAttendeeInput(BaseModel):
5649
''' TaskAttendeeInput '''
5750
uids: list[str] = Field(description='uids')
58-
59-
class Config: # pylint: disable=too-few-public-methods
60-
''' Config '''
61-
anystr_strip_whitespace = True
51+
model_config = ConfigDict(str_strip_whitespace=True)
6252

6353

6454
class TaskGetAttendeeOutput(BaseModel):

api/apistructs/teams.py

+9-14
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
''' API Structs - Teams '''
22
from typing import Any
33

4-
from pydantic import BaseModel, EmailStr, Field, validator
4+
from pydantic import field_validator, ConfigDict, BaseModel, EmailStr, Field
55

66
from api.apistructs.items import UserItem
77

88

99
class TeamItemUpdateInput(BaseModel):
1010
''' Update Team item input '''
11-
name: str | None = Field(description='team name')
12-
desc: str | None = Field(description='desc')
13-
mailling: EmailStr | None = Field(description='mailing list for team')
14-
headcount: int | None = Field(description='the headcount of team')
11+
name: str | None = Field(None, description='team name')
12+
desc: str | None = Field(None, description='desc')
13+
mailling: EmailStr | None = Field(None, description='mailing list for team')
14+
headcount: int | None = Field(None, description='the headcount of team')
1515

16-
@validator('*', pre=True)
16+
@field_validator('*', mode="before")
17+
@classmethod
1718
def skip_empty_str(cls, value: Any) -> Any: # pylint:disable=no-self-argument
1819
''' skip empty string '''
1920
if isinstance(value, str):
@@ -37,10 +38,7 @@ class TeamCreateInput(BaseModel):
3738
''' Team create input '''
3839
id: str = Field(description='team id')
3940
name: str = Field(description='team name')
40-
41-
class Config: # pylint: disable=too-few-public-methods
42-
''' Config '''
43-
anystr_strip_whitespace = True
41+
model_config = ConfigDict(str_strip_whitespace=True)
4442

4543

4644
class TeamCreateOutput(TeamCreateInput):
@@ -50,10 +48,7 @@ class TeamCreateOutput(TeamCreateInput):
5048
class TeamUpdateMembers(BaseModel):
5149
''' TeamUpdateMembers '''
5250
uids: list[str] = Field(description='uids')
53-
54-
class Config: # pylint: disable=too-few-public-methods
55-
''' Config '''
56-
anystr_strip_whitespace = True
51+
model_config = ConfigDict(str_strip_whitespace=True)
5752

5853

5954
class TeamUpdateMembersOutput(BaseModel):

api/apistructs/users.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
''' API Structs - Users '''
22
from datetime import date
33

4-
from pydantic import BaseModel, Field, HttpUrl
4+
from pydantic import ConfigDict, BaseModel, Field, HttpUrl
55

66
from api.apistructs.items import ProjectItem, TeamItem
77
from module.skill import SkillEnum, StatusEnum, TeamsEnum, TobeVolunteerStruct
@@ -75,7 +75,7 @@ class UserMeDietaryHabitInput(BaseModel):
7575
''' UserMeDietaryHabitInput '''
7676
checked: list[str] = Field(
7777
description='lists value of `DietaryHabitItemsValue`',
78-
example=['0.001', '0.002'],
78+
examples=[['0.001', '0.002']],
7979
)
8080

8181

@@ -116,11 +116,7 @@ class UserMeToBeVolunteerInput(BaseModel):
116116
hours: int = Field(description='Hours in an week')
117117
status: StatusEnum = Field(description='status')
118118
desc: str = Field(default='', description='more description')
119-
120-
class Config: # pylint: disable=too-few-public-methods
121-
''' Config '''
122-
anystr_strip_whitespace: bool = True
123-
use_enum_values: bool = True
119+
model_config = ConfigDict()
124120

125121

126122
class UserMeToBeVolunteerOutput(BaseModel):

module/api_token.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import arrow
77
from passlib.context import CryptContext # type: ignore
8-
from pydantic import BaseModel, Field
8+
from pydantic import ConfigDict, BaseModel, Field
99

1010
from models.api_tokendb import APITokenDB
1111

@@ -22,10 +22,7 @@ class APITokenBase(BaseModel):
2222
create_at: datetime = Field(default_factory=datetime.now)
2323
alive: bool = Field(default=True)
2424
token_type: APITokenType
25-
26-
class Config: # pylint: disable=too-few-public-methods
27-
''' config '''
28-
use_enum_values = True
25+
model_config = ConfigDict(use_enum_values=True)
2926

3027

3128
class APITokenTemp(APITokenBase):

module/budget.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Any, Optional, Union
55

66
import arrow
7-
from pydantic import BaseModel, error_wrappers, validator
7+
from pydantic import field_validator, ConfigDict, BaseModel, error_wrappers
88
from pymongo.cursor import Cursor
99

1010
from models.budgetdb import BudgetDB
@@ -64,12 +64,10 @@ class BudgetImportItem(BaseModel):
6464
currency: Currency
6565
paydate: str
6666
estimate: str
67+
model_config = ConfigDict(use_enum_values=True)
6768

68-
class Config: # pylint: disable=too-few-public-methods
69-
''' Model config '''
70-
use_enum_values = True
71-
72-
@validator('total')
69+
@field_validator('total')
70+
@classmethod
7371
def verify_total(cls, value: str) -> Union[int, float]:
7472
''' verify total.
7573
@@ -85,7 +83,8 @@ def verify_total(cls, value: str) -> Union[int, float]:
8583

8684
return int(value)
8785

88-
@validator('paydate')
86+
@field_validator('paydate')
87+
@classmethod
8988
def verify_paydate(cls, value: str, **kwargs: Any) -> str:
9089
''' verify paydate
9190

module/skill.py

+4-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# pylint: disable=too-few-public-methods
33
from enum import Enum, IntEnum, unique
44

5-
from pydantic import BaseModel, Field
5+
from pydantic import ConfigDict, BaseModel, Field
66

77

88
@unique
@@ -121,13 +121,9 @@ class TobeVolunteerStruct(BaseModel):
121121
skill: list[SkillEnum] = Field(
122122
default_factory=list, description='list of skills')
123123
hours: int = Field(default=0, description='Hours in an week')
124-
status: StatusEnum | None = Field(description='status')
124+
status: StatusEnum | None = Field(None, description='status')
125125
desc: str = Field(default='', description='more description')
126-
127-
class Config:
128-
''' Config '''
129-
anystr_strip_whitespace: bool = True
130-
use_enum_values: bool = True
126+
model_config = ConfigDict()
131127

132128

133129
class RecruitQuery(BaseModel):
@@ -145,7 +141,4 @@ class RecruitQuery(BaseModel):
145141
default_factory=list, description='list of skills')
146142
status: list[StatusEnum] = Field(
147143
default_factory=list, description='list of status')
148-
149-
class Config:
150-
''' Config '''
151-
use_enum_values = True
144+
model_config = ConfigDict(use_enum_values=True)

0 commit comments

Comments
 (0)