crappy
This commit is contained in:
3
main.py
3
main.py
@@ -5,7 +5,8 @@ import routers
|
||||
app = FastAPI()
|
||||
routers_list = [
|
||||
routers.auth_router,
|
||||
routers.deal_router
|
||||
routers.deal_router,
|
||||
routers.client_router
|
||||
]
|
||||
for router in routers_list:
|
||||
app.include_router(router)
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
from .auth import *
|
||||
from .deal import *
|
||||
from .client import *
|
||||
|
||||
11
models/client.py
Normal file
11
models/client.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from sqlalchemy import Column, Integer, String, DateTime
|
||||
|
||||
from models import BaseModel
|
||||
|
||||
|
||||
class Client(BaseModel):
|
||||
__tablename__ = 'clients'
|
||||
id = Column(Integer, autoincrement=True, primary_key=True, index=True)
|
||||
name = Column(String, nullable=False, unique=True, comment='Название клиента')
|
||||
address = Column(String)
|
||||
created_at = Column(DateTime, nullable=False, comment='Дата создания')
|
||||
@@ -8,12 +8,13 @@ from models.base import BaseModel
|
||||
|
||||
@unique
|
||||
class DealStatus(IntEnum):
|
||||
AWAITING_ACCEPTANCE = 0
|
||||
PACKAGING = 1
|
||||
AWAITING_SHIPMENT = 2
|
||||
AWAITING_PAYMENT = 3
|
||||
COMPLETED = 4
|
||||
CANCELLED = 5
|
||||
CREATED = 0
|
||||
AWAITING_ACCEPTANCE = 1
|
||||
PACKAGING = 2
|
||||
AWAITING_SHIPMENT = 3
|
||||
AWAITING_PAYMENT = 4
|
||||
COMPLETED = 5
|
||||
CANCELLED = 6
|
||||
|
||||
|
||||
class Deal(BaseModel):
|
||||
@@ -23,7 +24,10 @@ class Deal(BaseModel):
|
||||
created_at = Column(DateTime, nullable=False, comment='Дата создания')
|
||||
current_status = Column(Integer, nullable=False, comment='Текущий статус')
|
||||
|
||||
status_history = relationship('DealStatusHistory', back_populates='deal')
|
||||
client_id = Column(Integer, ForeignKey('clients.id'), nullable=False, comment='ID клиента')
|
||||
client = relationship('Client', backref='deals')
|
||||
|
||||
status_history = relationship('DealStatusHistory', back_populates='deal', cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class DealStatusHistory(BaseModel):
|
||||
@@ -39,3 +43,6 @@ class DealStatusHistory(BaseModel):
|
||||
changed_at = Column(DateTime, nullable=False, comment='Дата и время когда произошла смена статуса')
|
||||
from_status = Column(Integer, nullable=False, comment='Предыдущий статус')
|
||||
to_status = Column(Integer, nullable=False, comment='Новый статус')
|
||||
|
||||
next_status_deadline = Column(DateTime,
|
||||
comment='Дедлайн до которого сделку нужно перевести на следующий этап')
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .auth import auth_router
|
||||
from .deal import deal_router
|
||||
from .client import client_router
|
||||
|
||||
|
||||
21
routers/client.py
Normal file
21
routers/client.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from backend.session import get_session
|
||||
from schemas.client import ClientSearchRequest
|
||||
from services.client import ClientService
|
||||
|
||||
client_router = APIRouter(
|
||||
prefix="/client",
|
||||
tags=['client']
|
||||
)
|
||||
|
||||
|
||||
@client_router.get('/search', operation_id='search_clients')
|
||||
async def search_clients(
|
||||
name: str,
|
||||
session: Annotated[AsyncSession, Depends(get_session)]
|
||||
):
|
||||
return await ClientService(session).search_clients(ClientSearchRequest(name=name))
|
||||
@@ -18,9 +18,10 @@ deal_router = APIRouter(
|
||||
@deal_router.post('/create')
|
||||
async def create(
|
||||
request: DealCreateRequest,
|
||||
session: Annotated[AsyncSession, Depends(get_session)]
|
||||
session: Annotated[AsyncSession, Depends(get_session)],
|
||||
user: Annotated[User, Depends(get_current_user)]
|
||||
):
|
||||
return await DealService(session).create(request)
|
||||
return await DealService(session).create(request, user)
|
||||
|
||||
|
||||
@deal_router.post('/changeStatus', response_model=DealChangeStatusResponse)
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class CustomConfig:
|
||||
populate_by_name = True
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class CustomModel(BaseModel):
|
||||
pass
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
16
schemas/client.py
Normal file
16
schemas/client.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from typing import List
|
||||
|
||||
from schemas.base import CustomModel
|
||||
|
||||
|
||||
class ClientSchema(CustomModel):
|
||||
id: int
|
||||
name: str
|
||||
|
||||
|
||||
class ClientSearchRequest(CustomModel):
|
||||
name: str
|
||||
|
||||
|
||||
class ClientSearchResponse(CustomModel):
|
||||
clients: List[ClientSchema]
|
||||
@@ -1,4 +1,7 @@
|
||||
import datetime
|
||||
|
||||
from schemas.base import CustomModel
|
||||
from schemas.client import ClientSchema
|
||||
|
||||
|
||||
class DealChangeStatusRequest(CustomModel):
|
||||
@@ -16,3 +19,10 @@ class DealCreateRequest(CustomModel):
|
||||
|
||||
class DealCreateResponse(CustomModel):
|
||||
ok: bool
|
||||
|
||||
|
||||
class FastDeal(CustomModel):
|
||||
name: str
|
||||
client: ClientSchema
|
||||
comment: str
|
||||
acceptance_date: datetime.datetime
|
||||
|
||||
15
services/client.py
Normal file
15
services/client.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from sqlalchemy import select
|
||||
|
||||
from models import Client
|
||||
from services.base import BaseService
|
||||
from schemas.client import *
|
||||
|
||||
|
||||
class ClientService(BaseService):
|
||||
async def search_clients(self, request: ClientSearchRequest) -> ClientSearchResponse:
|
||||
query = await self.session.scalars(select(Client)
|
||||
.where(Client.name.ilike(f'%{request.name}%')))
|
||||
clients = []
|
||||
for client in query.all():
|
||||
clients.append(ClientSchema.model_validate(client))
|
||||
return ClientSearchResponse(clients=clients)
|
||||
@@ -13,13 +13,25 @@ class DealService(BaseService):
|
||||
async def _get_deal_by_id(self, deal_id) -> Deal:
|
||||
return await self.session.get(Deal, deal_id)
|
||||
|
||||
async def create(self, request: DealCreateRequest) -> DealCreateResponse:
|
||||
async def create(self, request: DealCreateRequest, user: User) -> DealCreateResponse:
|
||||
deal = Deal(
|
||||
name=request.name,
|
||||
created_at=datetime.datetime.now(),
|
||||
current_status=DealStatus.AWAITING_ACCEPTANCE
|
||||
current_status=DealStatus.CREATED
|
||||
)
|
||||
self.session.add(deal)
|
||||
await self.session.flush()
|
||||
|
||||
# Append status history
|
||||
status_change = DealStatusHistory(
|
||||
deal_id=request.deal_id,
|
||||
user_id=user.id,
|
||||
changed_at=datetime.datetime.now(),
|
||||
from_status=deal.current_status,
|
||||
to_status=DealStatus.CREATED.AWAITING_ACCEPTANCE
|
||||
)
|
||||
self.session.add(status_change)
|
||||
|
||||
await self.session.commit()
|
||||
return DealCreateResponse(ok=True)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user