Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions app/models/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from pydantic import BaseModel, ConfigDict, Field, field_validator

from app.utils.helpers import fix_datetime_timezone
from .validators import StringArrayValidator


Expand Down Expand Up @@ -46,6 +47,13 @@ class CoreResponse(CoreBase):

model_config = ConfigDict(from_attributes=True)

@field_validator("created_at", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class CoreResponseList(BaseModel):
count: int
Expand Down
29 changes: 29 additions & 0 deletions app/models/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from pydantic import BaseModel, field_validator

from app.utils.helpers import fix_datetime_timezone
from .validators import NumericValidatorMixin


Expand All @@ -18,6 +19,13 @@ class StatList(BaseModel):
start: dt
end: dt

@field_validator("start", "end", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class UserUsageStat(BaseModel):
total_traffic: int
Expand All @@ -27,6 +35,13 @@ class UserUsageStat(BaseModel):
def cast_to_int(cls, v):
return NumericValidatorMixin.cast_to_int(v)

@field_validator("period_start", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class UserUsageStatsList(StatList):
stats: dict[int, list[UserUsageStat]]
Expand All @@ -41,6 +56,13 @@ class NodeUsageStat(BaseModel):
def cast_to_int(cls, v):
return NumericValidatorMixin.cast_to_int(v)

@field_validator("period_start", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class NodeUsageStatsList(StatList):
stats: dict[int, list[NodeUsageStat]]
Expand Down Expand Up @@ -72,6 +94,13 @@ class NodeStats(BaseModel):
def cast_to_float(cls, v):
return NumericValidatorMixin.cast_to_float(v)

@field_validator("period_start", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class NodeStatsList(StatList):
stats: list[NodeStats]
14 changes: 14 additions & 0 deletions app/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,13 @@ class UserNotificationResponse(User):
def cast_to_int(cls, v):
return NumericValidatorMixin.cast_to_int(v)

@field_validator("created_at", "edit_at", "online_at", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class UserResponse(UserNotificationResponse):
admin: AdminBase | None = Field(default=None)
Expand Down Expand Up @@ -140,6 +147,13 @@ class UserSubscriptionUpdateSchema(BaseModel):

model_config = ConfigDict(from_attributes=True)

@field_validator("created_at", mode="before")
@classmethod
def validator_date(cls, v):
if not v:
return v
return fix_datetime_timezone(v)


class UserSubscriptionUpdateList(BaseModel):
updates: list[UserSubscriptionUpdateSchema] = Field(default_factory=list)
Expand Down
2 changes: 1 addition & 1 deletion app/utils/jwt.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ async def get_secret_key():


async def create_admin_token(username: str, is_sudo=False) -> str:
data = {"sub": username, "access": "sudo" if is_sudo else "admin", "iat": datetime.utcnow()}
data = {"sub": username, "access": "sudo" if is_sudo else "admin", "iat": datetime.now(timezone.utc)}
if JWT_ACCESS_TOKEN_EXPIRE_MINUTES > 0:
expire = datetime.now(timezone.utc) + timedelta(minutes=JWT_ACCESS_TOKEN_EXPIRE_MINUTES)
data["exp"] = expire
Expand Down
Loading