feat: groups
This commit is contained in:
@ -2,3 +2,4 @@ from .board import BoardService as BoardService
|
||||
from .deal import DealService as DealService
|
||||
from .project import ProjectService as ProjectService
|
||||
from .status import StatusService as StatusService
|
||||
from .deal_group import DealGroupService as DealGroupService
|
||||
|
||||
48
services/deal_group.py
Normal file
48
services/deal_group.py
Normal file
@ -0,0 +1,48 @@
|
||||
from lexorank import lexorank
|
||||
|
||||
from models import DealGroup, Deal
|
||||
from repositories import DealGroupRepository, DealRepository
|
||||
from schemas.deal_group import *
|
||||
from services.mixins import *
|
||||
|
||||
|
||||
class DealGroupService(
|
||||
ServiceUpdateMixin[DealGroup, UpdateDealGroupRequest],
|
||||
ServiceDeleteMixin[DealGroup],
|
||||
):
|
||||
entity_updated_msg = "Группа сделок обновлена"
|
||||
|
||||
def __init__(self, session: AsyncSession):
|
||||
self.repository = DealGroupRepository(session)
|
||||
|
||||
async def sync_deals_with_main_deal(self, main_deal: Deal, other_deals: list[Deal]):
|
||||
deal_repo = DealRepository(self.repository.session)
|
||||
for deal in other_deals:
|
||||
if deal.status_id != main_deal.status_id:
|
||||
await deal_repo.update_status(deal, main_deal.status_id)
|
||||
|
||||
async def create(self, request: CreateDealGroupRequest) -> CreateDealGroupResponse:
|
||||
deal_repo = DealRepository(self.repository.session)
|
||||
main_deal: Deal = await deal_repo.get_by_id(request.main_deal_id)
|
||||
other_deals: list[Deal] = await deal_repo.get_by_ids(request.other_deal_ids)
|
||||
await self.sync_deals_with_main_deal(main_deal, other_deals)
|
||||
group_lexorank = main_deal.lexorank
|
||||
main_deal.lexorank = lexorank.middle(lexorank.Bucket.BUCEKT_0).__str__()
|
||||
group = await self.repository.create([main_deal, *other_deals], group_lexorank)
|
||||
return CreateDealGroupResponse(entity=DealGroupSchema.model_validate(group))
|
||||
|
||||
async def update_deals_in_group(
|
||||
self, group_id: int, request: UpdateDealsInGroupRequest
|
||||
) -> UpdateDealsInGroupResponse:
|
||||
deal_repo = DealRepository(self.repository.session)
|
||||
old_deals = await deal_repo.get_by_group_id(group_id)
|
||||
new_deals = await deal_repo.get_by_ids(request.deal_ids)
|
||||
|
||||
await self.sync_deals_with_main_deal(old_deals[0], new_deals)
|
||||
await self.repository.update_group_deals(group_id, old_deals, new_deals)
|
||||
|
||||
return UpdateDealsInGroupResponse(ok=True, message=self.entity_updated_msg)
|
||||
|
||||
async def delete(self, group_id: int) -> DeleteDealGroupResponse:
|
||||
await self.repository.delete(group_id)
|
||||
return DeleteDealGroupResponse(ok=True, message="Группа сделок удалена")
|
||||
Reference in New Issue
Block a user