This commit is contained in:
2024-03-19 09:01:46 +03:00
parent aafa1050a7
commit 6ba041a839
23 changed files with 369 additions and 39 deletions

View File

@@ -3,6 +3,7 @@ from typing import Union, Annotated
from fastapi import Depends
from sqlalchemy import select, update
from sqlalchemy.orm import joinedload
from models import Client, ClientDetails, User
from services.auth import get_current_user
@@ -24,7 +25,7 @@ class ClientService(BaseService):
return details
async def get_all(self) -> ClientGetAllResponse:
clients_query = await self.session.scalars(select(Client))
clients_query = await self.session.scalars(select(Client).options(joinedload(Client.details)))
clients = clients_query.all()
result = []
for client in clients:
@@ -65,7 +66,8 @@ 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}%')))
.where(Client.name.ilike(f'%{request.name}%'))
.options(joinedload(Client.details)))
clients = []
for client in query.all():
clients.append(ClientSchema.model_validate(client))

View File

@@ -2,6 +2,7 @@ import datetime
from typing import Type, Union
from sqlalchemy import select
from sqlalchemy.orm import joinedload, selectinload
from models import User, Deal
from models.deal import *
@@ -16,7 +17,9 @@ class DealService(BaseService):
async def _get_deal_by_id(self, deal_id) -> Union[Deal, None]:
return await self.session.get(Deal, deal_id)
async def change_status(self, deal: Deal, status: DealStatus, user: User,
async def change_status(self, deal: Deal,
status: DealStatus,
user: User,
deadline: datetime.datetime = None) -> DealStatusHistory:
deadline = deadline
status_change = DealStatusHistory(
@@ -75,3 +78,24 @@ class DealService(BaseService):
await self.change_status(deal, DealStatus(request.new_status), user)
await self.session.commit()
return DealChangeStatusResponse(ok=True)
async def get_summary(self) -> DealSummaryResponse:
deals_query = await self.session.scalars(select(Deal)
.options(selectinload(Deal.status_history),
joinedload(Deal.client))
.where(Deal.is_deleted == False,
Deal.is_completed == False))
summaries = []
for deal in deals_query.all():
deal: Deal
last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
summaries.append(
DealSummary(
id=deal.id,
client_name=deal.client.name,
name=deal.name,
changed_at=last_status.changed_at,
status=last_status.to_status
)
)
return DealSummaryResponse(summaries=summaries)

56
services/service.py Normal file
View File

@@ -0,0 +1,56 @@
from sqlalchemy import select
from sqlalchemy.orm import joinedload
from models import Service, ServiceCategory
from services.base import BaseService
from schemas.services import ServiceGetAllResponse, ServiceSchema, ServiceGetAllCategoriesResponse, \
ServiceCategorySchema, ServiceCreateRequest, ServiceCreateResponse, ServiceCreateCategoryRequest, \
ServiceCreateCategoryResponse
class ServiceService(BaseService):
async def get_all(self) -> ServiceGetAllResponse:
query = await (self.session
.scalars(select(Service)
.options(joinedload(Service.category))
.order_by(Service.category_id, Service.id)))
services = []
for service in query.all():
services.append(ServiceSchema.model_validate(service))
return ServiceGetAllResponse(services=services)
async def create(self, request: ServiceCreateRequest) -> ServiceCreateResponse:
try:
raw_service = request.service
service_dict = raw_service.model_dump()
service_dict['category_id'] = raw_service.category.id
del service_dict['id']
del service_dict['category']
service = Service(**service_dict)
self.session.add(service)
await self.session.commit()
return ServiceCreateResponse(ok=True, message="Услуга успешно создана")
except Exception as e:
return ServiceCreateResponse(ok=False, message=f"Неудалось создать услугу, ошибка: {e}")
async def create_category(self, request: ServiceCreateCategoryRequest) -> ServiceCreateCategoryResponse:
try:
raw_category = request.category
category_dict = raw_category.model_dump()
del category_dict['id']
category = ServiceCategory(**category_dict)
self.session.add(category)
await self.session.commit()
return ServiceCreateCategoryResponse(ok=True, message="Категория успешно создана")
except Exception as e:
return ServiceCreateCategoryResponse(ok=False, message=f"Неудалось создать категорию, ошибка: {e}")
async def get_all_categories(self) -> ServiceGetAllCategoriesResponse:
query = await (self.session
.scalars(select(ServiceCategory)
.order_by(ServiceCategory.id)))
categories = []
for category in query.all():
categories.append(ServiceCategorySchema.model_validate(category))
return ServiceGetAllCategoriesResponse(categories=categories)