1- from typing import Annotated
1+ from typing import Annotated , Optional
22from datetime import datetime
33
4- from pydantic import BaseModel , EmailStr , StringConstraints , Field , HttpUrl
4+ from pydantic import BaseModel , EmailStr , Field , HttpUrl , ConfigDict
55
66from app .core .models import UUIDModel , TimestampModel , PersistentDeletion
77
@@ -27,11 +27,16 @@ class UserBase(BaseModel):
2727
2828
2929class User (TimestampModel , UserBase , UUIDModel , PersistentDeletion ):
30- profile_image_url : Annotated [HttpUrl , Field (default = "profileimageurl.com" )]
30+ profile_image_url : Annotated [
31+ str ,
32+ Field (default = "https://profileimageurl.com" )
33+ ]
3134 hashed_password : str
35+ is_superuser : bool = False
3236
3337
3438class UserRead (BaseModel ):
39+ id : int
3540 name : Annotated [
3641 str ,
3742 Field (
@@ -44,10 +49,12 @@ class UserRead(BaseModel):
4449 min_length = 2 , max_length = 20 , pattern = r"^[a-z0-9]+$" , examples = ["userson" ]
4550 )
4651 ]
47- profile_image_url : Annotated [ HttpUrl | None , Field ()]
52+ profile_image_url : str
4853
4954
5055class UserCreate (UserBase ):
56+ model_config = ConfigDict (extra = 'forbid' )
57+
5158 password : Annotated [
5259 str ,
5360 Field (
@@ -57,32 +64,51 @@ class UserCreate(UserBase):
5764
5865
5966class UserUpdate (BaseModel ):
67+ model_config = ConfigDict (extra = 'forbid' )
68+
6069 name : Annotated [
61- str ,
70+ Optional [ str ] ,
6271 Field (
63- min_length = 2 , max_length = 30 , examples = ["User Userson" ], default = None
72+ min_length = 2 ,
73+ max_length = 30 ,
74+ examples = ["User Userberg" ],
75+ default = None
6476 )
6577 ]
6678 username : Annotated [
67- str ,
79+ Optional [ str ] ,
6880 Field (
69- min_length = 2 , max_length = 20 , pattern = r"^[a-z0-9]+$" , examples = ["userson" ], default = None
81+ min_length = 2 ,
82+ max_length = 20 ,
83+ pattern = r"^[a-z0-9]+$" ,
84+ examples = ["userberg" ],
85+ default = None
7086 )
7187 ]
7288 email : Annotated [
73- EmailStr ,
89+ Optional [ EmailStr ],
7490 Field (
75- examples = [
"[email protected] " ],
default = None 91+ 92+ default = None
93+ )
94+ ]
95+ profile_image_url : Annotated [
96+ Optional [str ],
97+ Field (
98+ pattern = r"^((http|https)://)[-a-zA-Z0-9@:%._\\+~#?&//=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%._\\+~#?&//=]*)$" ,
99+ examples = ["https://profileimageurl.com" ],
100+ default = None
76101 )
77102 ]
78- profile_image_url : Annotated [HttpUrl | None , Field (default = None )]
79103
80104
81105class UserUpdateInternal (UserUpdate ):
82106 updated_at : datetime
83107
84108
85109class UserDelete (BaseModel ):
110+ model_config = ConfigDict (extra = 'forbid' )
111+
86112 is_deleted : bool
87113 deleted_at : datetime
88114
0 commit comments