This commit is contained in:
retoor 2025-11-13 23:05:26 +01:00
parent 3f80a551d5
commit aff8dfca08
7 changed files with 16 additions and 18 deletions

View File

@ -1,4 +1,4 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta, timezone
from typing import Optional from typing import Optional
from fastapi import Depends, HTTPException, status from fastapi import Depends, HTTPException, status
@ -39,9 +39,9 @@ async def authenticate_user(username: str, password: str, two_factor_code: Optio
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None, two_factor_verified: bool = False): def create_access_token(data: dict, expires_delta: Optional[timedelta] = None, two_factor_verified: bool = False):
to_encode = data.copy() to_encode = data.copy()
if expires_delta: if expires_delta:
expire = datetime.utcnow() + expires_delta expire = datetime.now(timezone.utc) + expires_delta
else: else:
expire = datetime.utcnow() + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) expire = datetime.now(timezone.utc) + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire, "2fa_verified": two_factor_verified}) to_encode.update({"exp": expire, "2fa_verified": two_factor_verified})
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM)
return encoded_jwt return encoded_jwt

View File

@ -1,4 +1,4 @@
from datetime import datetime, date, timedelta from datetime import datetime, date, timedelta, timezone
from decimal import Decimal from decimal import Decimal
from typing import Optional from typing import Optional
from calendar import monthrange from calendar import monthrange
@ -182,6 +182,6 @@ The MyWebdav Team
@staticmethod @staticmethod
async def mark_invoice_paid(invoice: Invoice) -> Invoice: async def mark_invoice_paid(invoice: Invoice) -> Invoice:
invoice.status = "paid" invoice.status = "paid"
invoice.paid_at = datetime.utcnow() invoice.paid_at = datetime.now(timezone.utc)
await invoice.save() await invoice.save()
return invoice return invoice

View File

@ -69,7 +69,7 @@ class Invoice(models.Model):
user = fields.ForeignKeyField("models.User", related_name="invoices") user = fields.ForeignKeyField("models.User", related_name="invoices")
invoice_number = fields.CharField(max_length=50, unique=True) invoice_number = fields.CharField(max_length=50, unique=True)
stripe_invoice_id = fields.CharField(max_length=255, unique=True, null=True) stripe_invoice_id = fields.CharField(max_length=255, unique=True, null=True)
period_start = fields.DateField(index=True) period_start = fields.DateField(db_index=True)
period_end = fields.DateField() period_end = fields.DateField()
subtotal = fields.DecimalField(max_digits=10, decimal_places=4) subtotal = fields.DecimalField(max_digits=10, decimal_places=4)
tax = fields.DecimalField(max_digits=10, decimal_places=4, default=0) tax = fields.DecimalField(max_digits=10, decimal_places=4, default=0)

View File

@ -1,5 +1,5 @@
import uuid import uuid
from datetime import datetime, date from datetime import datetime, date, timezone
from decimal import Decimal from decimal import Decimal
from typing import Optional from typing import Optional
from tortoise.transactions import in_transaction from tortoise.transactions import in_transaction
@ -15,7 +15,7 @@ class UsageTracker:
resource_id: int = None, resource_id: int = None,
metadata: dict = None metadata: dict = None
): ):
idempotency_key = f"storage_{user.id}_{datetime.utcnow().timestamp()}_{uuid.uuid4().hex[:8]}" idempotency_key = f"storage_{user.id}_{datetime.now(timezone.utc).timestamp()}_{uuid.uuid4().hex[:8]}"
await UsageRecord.create( await UsageRecord.create(
user=user, user=user,
@ -37,7 +37,7 @@ class UsageTracker:
metadata: dict = None metadata: dict = None
): ):
record_type = f"bandwidth_{direction}" record_type = f"bandwidth_{direction}"
idempotency_key = f"{record_type}_{user.id}_{datetime.utcnow().timestamp()}_{uuid.uuid4().hex[:8]}" idempotency_key = f"{record_type}_{user.id}_{datetime.now(timezone.utc).timestamp()}_{uuid.uuid4().hex[:8]}"
await UsageRecord.create( await UsageRecord.create(
user=user, user=user,

View File

@ -86,7 +86,7 @@ async def http_exception_handler(request: Request, exc: HTTPException):
logger.error(f"HTTPException: {exc.status_code} - {exc.detail} for URL: {request.url}") logger.error(f"HTTPException: {exc.status_code} - {exc.detail} for URL: {request.url}")
return JSONResponse( return JSONResponse(
status_code=exc.status_code, status_code=exc.status_code,
content=ErrorResponse(code=exc.status_code, message=exc.detail).dict(), content=ErrorResponse(code=exc.status_code, message=exc.detail).model_dump(),
) )

View File

@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from pydantic import BaseModel, EmailStr from pydantic import BaseModel, EmailStr, ConfigDict
from typing import Optional, List from typing import Optional, List
from tortoise.contrib.pydantic import pydantic_model_creator from tortoise.contrib.pydantic import pydantic_model_creator
@ -58,8 +58,7 @@ class TeamOut(BaseModel):
owner_id: int owner_id: int
created_at: datetime created_at: datetime
class Config: model_config = ConfigDict(from_attributes=True)
from_attributes = True
class ActivityOut(BaseModel): class ActivityOut(BaseModel):
id: int id: int
@ -70,8 +69,7 @@ class ActivityOut(BaseModel):
ip_address: Optional[str] = None ip_address: Optional[str] = None
timestamp: datetime timestamp: datetime
class Config: model_config = ConfigDict(from_attributes=True)
from_attributes = True
class FileRequestCreate(BaseModel): class FileRequestCreate(BaseModel):
title: str title: str
@ -90,8 +88,7 @@ class FileRequestOut(BaseModel):
expires_at: Optional[datetime] = None expires_at: Optional[datetime] = None
is_active: bool is_active: bool
class Config: model_config = ConfigDict(from_attributes=True)
from_attributes = True
from mywebdav.models import Folder, File, Share, FileVersion from mywebdav.models import Folder, File, Share, FileVersion

View File

@ -1,4 +1,5 @@
import pytest import pytest
import pytest_asyncio
import asyncio import asyncio
from tortoise import Tortoise from tortoise import Tortoise
@ -22,7 +23,7 @@ def event_loop():
yield loop yield loop
loop.close() loop.close()
@pytest.fixture(scope="session", autouse=True) @pytest_asyncio.fixture(scope="session", autouse=True)
async def cleanup_db(): async def cleanup_db():
yield yield
await Tortoise.close_connections() await Tortoise.close_connections()