Update.
This commit is contained in:
parent
3f80a551d5
commit
aff8dfca08
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user