feat: projects and boards

This commit is contained in:
2025-02-07 20:08:14 +04:00
parent 2aa84837e4
commit 9ee3f87de9
25 changed files with 1312 additions and 387 deletions

61
schemas/board.py Normal file
View File

@@ -0,0 +1,61 @@
from schemas.base import BaseSchema, OkMessageSchema
from schemas.project import ProjectSchema
from schemas.status import StatusSchema
# region Entities
class BaseBoardSchema(BaseSchema):
name: str
project_id: int
class BoardSchema(BaseBoardSchema):
id: int
ordinal_number: int
deal_statuses: list[StatusSchema]
project: ProjectSchema
# endregion
# region Requests
class CreateBoardRequest(BaseSchema):
board: BaseBoardSchema
class UpdateBoardRequest(BaseSchema):
board: BoardSchema
class UpdateBoardOrderRequest(BaseSchema):
project_id: int
board_id: int
new_ordinal_number: int
# endregion
# region Responses
class GetBoardsResponse(BaseSchema):
boards: list[BoardSchema]
class CreateBoardResponse(OkMessageSchema):
pass
class UpdateBoardResponse(OkMessageSchema):
pass
class UpdateBoardOrderResponse(OkMessageSchema):
pass
class DeleteBoardResponse(OkMessageSchema):
pass
# endregion

View File

@@ -1,18 +1,19 @@
import datetime
from collections import defaultdict
from typing import List, Optional, Union, Dict, Tuple, TypedDict
from typing import List, Optional, Union
from pydantic import constr, field_validator
from pydantic import constr
from models import ServiceCategoryPrice, ServicePriceCategory, Deal, Product, DealProduct, DealStatusHistory
from schemas.base import BaseSchema, OkMessageSchema
from schemas.billing import DealBillRequestSchema,GroupBillRequestSchema
from schemas.billing import DealBillRequestSchema
from schemas.board import BoardSchema
from schemas.client import ClientSchema
from schemas.group import DealGroupSchema
from schemas.marketplace import BaseMarketplaceSchema
from schemas.product import ProductSchema
from schemas.service import ServiceSchema, ServicePriceCategorySchema
from schemas.shipping import PalletSchema, BoxSchema
from schemas.shipping_warehouse import ShippingWarehouseSchema, BaseShippingWarehouseSchema
from schemas.status import StatusSchema, DealStatusHistorySchema
from schemas.user import UserSchema
@@ -24,21 +25,13 @@ class FastDeal(BaseSchema):
acceptance_date: datetime.datetime
class DealGroupSchema(BaseSchema):
id: int
name: Optional[str] = None
lexorank: str
bill_request: Optional[GroupBillRequestSchema] = None
class DealSummary(BaseSchema):
id: int
name: str
client_name: str
changed_at: datetime.datetime
created_at: datetime.datetime
deadline: Optional[datetime.datetime] = None
status: int
status: StatusSchema
board: BoardSchema
total_price: int
rank: int
base_marketplace: Optional[BaseMarketplaceSchema] = None
@@ -75,15 +68,6 @@ class DealProductSchema(BaseSchema):
comment: str = ""
class DealStatusHistorySchema(BaseSchema):
user: UserSchema
changed_at: datetime.datetime
from_status: int
to_status: int
next_status_deadline: datetime.datetime | None
comment: str | None = None
class DealEmployeesSchema(BaseSchema):
user: UserSchema
created_at: datetime.datetime
@@ -94,7 +78,8 @@ class DealSchema(BaseSchema):
name: str
client_id: int
created_at: datetime.datetime
current_status: int
status: StatusSchema
board: BoardSchema
services: List[DealServiceSchema]
products: List[DealProductSchema]
status_history: List[DealStatusHistorySchema]
@@ -127,6 +112,8 @@ class DealGeneralInfoSchema(BaseSchema):
delivery_date: Optional[datetime.datetime] = None
receiving_slot_date: Optional[datetime.datetime] = None
manager: Optional[UserSchema] = None
board: BoardSchema
status: StatusSchema
class OptionalShippingWarehouseSchema(BaseShippingWarehouseSchema):
@@ -166,6 +153,7 @@ class DealChangeStatusRequest(BaseSchema):
class DealCreateRequest(BaseSchema):
name: str
status_id: int
class DealQuickCreateRequest(BaseSchema):
@@ -176,6 +164,7 @@ class DealQuickCreateRequest(BaseSchema):
shipping_warehouse: constr(strip_whitespace=True)
base_marketplace: BaseMarketplaceSchema
category: Optional[ServicePriceCategorySchema] = None
status_id: int
class DealSummaryRequest(BaseSchema):
@@ -243,7 +232,7 @@ class DealUpdateGeneralInfoRequest(BaseSchema):
class DealSummaryReorderRequest(BaseSchema):
deal_id: int
status: int
status_id: int
index: int
deadline: datetime.datetime | None = None
comment: str | None = None
@@ -300,32 +289,10 @@ class ManageEmployeeRequest(BaseSchema):
class CreateDealsFromExcelRequest(BaseSchema):
client_id: int
status_id: int
products: list[ProductFromExcelSchema]
class DealAddToGroupRequest(BaseSchema):
deal_id: int
group_id: int
class DealCreateGroupRequest(BaseSchema):
dragging_deal_id: int
hovered_deal_id: int
class DealRemoveFromGroupRequest(BaseSchema):
deal_id: int
class DealGroupUpdateRequest(BaseSchema):
data: DealGroupSchema
class DealGroupChangeStatusRequest(BaseSchema):
group_id: int
new_status: int
# endregion Requests
# region Responses
@@ -452,23 +419,4 @@ class CreateDealsFromExcelResponse(OkMessageSchema):
pass
class DealAddToGroupResponse(OkMessageSchema):
pass
class DealCreateGroupResponse(OkMessageSchema):
pass
class DealRemoveFromGroupResponse(OkMessageSchema):
pass
class DealGroupUpdateResponse(OkMessageSchema):
pass
class DealGroupChangeStatusResponse(OkMessageSchema):
pass
# endregion Responses

66
schemas/group.py Normal file
View File

@@ -0,0 +1,66 @@
from typing import Optional
from schemas.base import BaseSchema, OkMessageSchema
from schemas.billing import GroupBillRequestSchema
# region Entities
class DealGroupSchema(BaseSchema):
id: int
name: Optional[str] = None
lexorank: str
bill_request: Optional[GroupBillRequestSchema] = None
# endregion
# region Requests
class DealGroupUpdateRequest(BaseSchema):
data: DealGroupSchema
class DealCreateGroupRequest(BaseSchema):
dragging_deal_id: int
hovered_deal_id: int
class DealGroupChangeStatusRequest(BaseSchema):
group_id: int
new_status: int
class DealAddToGroupRequest(BaseSchema):
deal_id: int
group_id: int
class DealRemoveFromGroupRequest(BaseSchema):
deal_id: int
# endregion
# region Responses
class DealCreateGroupResponse(OkMessageSchema):
pass
class DealGroupUpdateResponse(OkMessageSchema):
pass
class DealGroupChangeStatusResponse(OkMessageSchema):
pass
class DealAddToGroupResponse(OkMessageSchema):
pass
class DealRemoveFromGroupResponse(OkMessageSchema):
pass
# endregion

50
schemas/project.py Normal file
View File

@@ -0,0 +1,50 @@
from schemas.base import BaseSchema, OkMessageSchema
# region Entities
class BaseProjectSchema(BaseSchema):
name: str
class ProjectSchema(BaseProjectSchema):
id: int
class ProjectSchemaWithCount(ProjectSchema):
boards_count: int
# endregion
# region Requests
class CreateProjectRequest(BaseSchema):
project: BaseProjectSchema
class UpdateProjectRequest(BaseSchema):
project: ProjectSchema
# endregion
# region Responses
class GetProjectsResponse(BaseSchema):
projects: list[ProjectSchemaWithCount]
class CreateProjectResponse(OkMessageSchema):
pass
class UpdateProjectResponse(OkMessageSchema):
pass
class DeleteProjectResponse(OkMessageSchema):
pass
# endregion

View File

@@ -29,10 +29,13 @@ class CommonProfitFilters(BaseSchema):
date_range: Tuple[datetime.date, datetime.date]
client_id: int
base_marketplace_key: str
project_id: int
board_id: int
deal_status_id: int
manager_id: int
expense_tag_id: int
income_tag_id: int
is_completed_only: bool
class GetProfitChartDataRequest(CommonProfitFilters):

65
schemas/status.py Normal file
View File

@@ -0,0 +1,65 @@
from datetime import datetime
from schemas.base import BaseSchema, OkMessageSchema
from schemas.user import UserSchema
# region Entities
class BaseStatusSchema(BaseSchema):
name: str
board_id: int
class StatusSchema(BaseStatusSchema):
id: int
ordinal_number: int
is_deleted: bool = False
class DealStatusHistorySchema(BaseSchema):
user: UserSchema
changed_at: datetime
from_status: StatusSchema
to_status: StatusSchema
next_status_deadline: datetime | None
comment: str | None = None
# endregion
# region Requests
class CreateStatusRequest(BaseSchema):
status: BaseStatusSchema
class UpdateStatusRequest(BaseSchema):
status: StatusSchema
class UpdateStatusOrderRequest(BaseSchema):
board_id: int
status_id: int
new_ordinal_number: int
# endregion
# region Responses
class CreateStatusResponse(OkMessageSchema):
pass
class UpdateStatusResponse(OkMessageSchema):
pass
class UpdateStatusOrderResponse(OkMessageSchema):
pass
class DeleteStatusResponse(OkMessageSchema):
pass
# endregion