first commit
This commit is contained in:
1
app/schemas/__init__.py
Normal file
1
app/schemas/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
58
app/schemas/car.py
Normal file
58
app/schemas/car.py
Normal file
@@ -0,0 +1,58 @@
|
||||
from datetime import date, datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
|
||||
class CarBase(BaseModel):
|
||||
name: str
|
||||
make: str | None = None
|
||||
model: str | None = None
|
||||
year: int | None = None
|
||||
plate_number: str | None = None
|
||||
vin: str | None = None
|
||||
fuel_type: str | None = None
|
||||
purchase_date: date | None = None
|
||||
purchase_price: Decimal | None = None
|
||||
current_odometer: int | None = None
|
||||
|
||||
|
||||
class CarCreate(CarBase):
|
||||
owner_id: int
|
||||
|
||||
|
||||
class CarUpdate(BaseModel):
|
||||
name: str | None = None
|
||||
make: str | None = None
|
||||
model: str | None = None
|
||||
year: int | None = None
|
||||
plate_number: str | None = None
|
||||
vin: str | None = None
|
||||
fuel_type: str | None = None
|
||||
purchase_date: date | None = None
|
||||
purchase_price: Decimal | None = None
|
||||
current_odometer: int | None = None
|
||||
|
||||
|
||||
class CarRead(CarBase):
|
||||
id: int
|
||||
owner_id: int
|
||||
created_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class CarModelRead(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class CarMakeRead(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
country: str | None = None
|
||||
models: list[CarModelRead] = []
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
89
app/schemas/expense.py
Normal file
89
app/schemas/expense.py
Normal file
@@ -0,0 +1,89 @@
|
||||
from datetime import date, datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, model_validator
|
||||
|
||||
from app.models.expense import ServiceType
|
||||
|
||||
|
||||
class FuelEntryBase(BaseModel):
|
||||
entry_date: date
|
||||
odometer: int
|
||||
liters: Decimal
|
||||
price_per_liter: Decimal
|
||||
total_cost: Decimal | None = None
|
||||
station: str | None = None
|
||||
fuel_brand: str | None = None
|
||||
is_full_tank: bool = True
|
||||
notes: str | None = None
|
||||
|
||||
@model_validator(mode="after")
|
||||
def fill_total_cost(self) -> "FuelEntryBase":
|
||||
if self.total_cost is None:
|
||||
self.total_cost = self.liters * self.price_per_liter
|
||||
return self
|
||||
|
||||
|
||||
class FuelEntryCreate(FuelEntryBase):
|
||||
car_id: int
|
||||
|
||||
|
||||
class FuelEntryRead(FuelEntryBase):
|
||||
id: int
|
||||
car_id: int
|
||||
total_cost: Decimal
|
||||
created_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class ServiceEntryBase(BaseModel):
|
||||
entry_date: date
|
||||
odometer: int | None = None
|
||||
service_type: ServiceType
|
||||
title: str
|
||||
category: str | None = None
|
||||
vendor: str | None = None
|
||||
total_cost: Decimal
|
||||
next_due_date: date | None = None
|
||||
next_due_odometer: int | None = None
|
||||
notes: str | None = None
|
||||
|
||||
|
||||
class ServiceEntryCreate(ServiceEntryBase):
|
||||
car_id: int
|
||||
|
||||
|
||||
class ServiceEntryRead(ServiceEntryBase):
|
||||
id: int
|
||||
car_id: int
|
||||
created_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class OwnershipStats(BaseModel):
|
||||
car_id: int
|
||||
date_from: date
|
||||
date_to: date
|
||||
fuel_cost: Decimal
|
||||
service_cost: Decimal
|
||||
total_cost: Decimal
|
||||
liters: Decimal
|
||||
distance_km: int
|
||||
avg_consumption_l_per_100km: float | None
|
||||
cost_per_km: float | None
|
||||
fuel_entries_count: int
|
||||
service_entries_count: int
|
||||
|
||||
|
||||
class OdometerPrediction(BaseModel):
|
||||
car_id: int
|
||||
samples: int
|
||||
current_odometer: int | None
|
||||
predicted_today: int | None
|
||||
predicted_30_days: int | None
|
||||
avg_km_per_day: float | None
|
||||
avg_km_per_month: float | None
|
||||
confidence: float
|
||||
insight: str
|
||||
26
app/schemas/user.py
Normal file
26
app/schemas/user.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
|
||||
class UserUpsert(BaseModel):
|
||||
telegram_id: int
|
||||
username: str | None = None
|
||||
first_name: str | None = None
|
||||
last_name: str | None = None
|
||||
locale: str | None = None
|
||||
currency: str | None = None
|
||||
|
||||
|
||||
class UserPreferencesUpdate(BaseModel):
|
||||
locale: str | None = None
|
||||
currency: str | None = None
|
||||
|
||||
|
||||
class UserRead(UserUpsert):
|
||||
id: int
|
||||
locale: str
|
||||
currency: str
|
||||
created_at: datetime
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
Reference in New Issue
Block a user