feat: removed price categories

This commit is contained in:
2025-02-12 15:27:48 +04:00
parent 5b9e75dddf
commit a509a3a586
7 changed files with 3 additions and 220 deletions

View File

@@ -15,18 +15,11 @@ from .shipping_warehouse import ShippingWarehouse
if TYPE_CHECKING: if TYPE_CHECKING:
from . import ( from . import (
DealBillRequest, DealBillRequest,
ServicePriceCategory,
DealGroup, DealGroup,
User, User,
) )
class DealPriceCategory(BaseModel):
__tablename__ = 'deal_price_category'
deal_id: Mapped[int] = mapped_column(ForeignKey('deals.id'), primary_key=True, unique=True)
category_id: Mapped[int] = mapped_column(ForeignKey('service_price_category.id'), primary_key=True)
class Deal(BaseModel): class Deal(BaseModel):
__tablename__ = 'deals' __tablename__ = 'deals'
id = Column(Integer, autoincrement=True, primary_key=True, index=True) id = Column(Integer, autoincrement=True, primary_key=True, index=True)
@@ -85,9 +78,7 @@ class Deal(BaseModel):
comment = Column(String, nullable=False, server_default='', comment='Коментарий к заданию') comment = Column(String, nullable=False, server_default='', comment='Коментарий к заданию')
bill_request: Mapped[Optional['DealBillRequest']] = relationship(back_populates='deal', lazy='joined') bill_request: Mapped[Optional['DealBillRequest']] = relationship(back_populates='deal', lazy='joined')
category: Mapped[Optional["ServicePriceCategory"]] = relationship('ServicePriceCategory',
secondary=DealPriceCategory.__table__,
lazy='joined')
group: Mapped[Optional["DealGroup"]] = relationship( group: Mapped[Optional["DealGroup"]] = relationship(
'DealGroup', 'DealGroup',
secondary='deal_relations', secondary='deal_relations',

View File

@@ -9,7 +9,6 @@ services_kit_services = Table(
BaseModel.metadata, BaseModel.metadata,
Column('services_kit_id', ForeignKey('services_kits.id')), Column('services_kit_id', ForeignKey('services_kits.id')),
Column('service_id', ForeignKey('services.id')), Column('service_id', ForeignKey('services.id')),
) )
@@ -47,10 +46,6 @@ class Service(BaseModel):
lazy='selectin', lazy='selectin',
order_by="asc(ServicePriceRange.from_quantity)", order_by="asc(ServicePriceRange.from_quantity)",
cascade="all, delete-orphan") cascade="all, delete-orphan")
category_prices = relationship('ServiceCategoryPrice',
back_populates='service',
lazy='selectin',
cascade="all, delete-orphan")
rank: Mapped[str] = mapped_column( rank: Mapped[str] = mapped_column(
nullable=False, nullable=False,
server_default='', server_default='',
@@ -68,23 +63,6 @@ class ServicePriceRange(BaseModel):
price = Column(Double, nullable=False, comment='Цена') price = Column(Double, nullable=False, comment='Цена')
class ServiceCategoryPrice(BaseModel):
__tablename__ = 'service_category_prices'
service_id: Mapped[int] = mapped_column(ForeignKey('services.id'), primary_key=True)
category_id: Mapped[int] = mapped_column(ForeignKey('service_price_category.id'), primary_key=True)
price: Mapped[float] = mapped_column(Double, nullable=False, comment='Цена')
service: Mapped["Service"] = relationship('Service', lazy='joined', back_populates='category_prices')
category: Mapped["ServicePriceCategory"] = relationship('ServicePriceCategory', lazy='joined')
class ServicePriceCategory(BaseModel):
__tablename__ = 'service_price_category'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(nullable=False)
class ServiceCategory(BaseModel): class ServiceCategory(BaseModel):
__tablename__ = 'service_categories' __tablename__ = 'service_categories'
id = Column(Integer, autoincrement=True, primary_key=True, index=True) id = Column(Integer, autoincrement=True, primary_key=True, index=True)

View File

@@ -227,61 +227,6 @@ async def update_services_kit(
return await ServiceService(session).update_kit(request) return await ServiceService(session).update_kit(request)
# endregion
# region Price Categories
# crud price categories
@service_router.get(
'/price-categories/get-all',
response_model=GetAllPriceCategoriesResponse,
operation_id='get_all_price_categories',
dependencies=[Depends(guest_user)]
)
async def get_all_price_categories(
session: SessionDependency
):
return await ServiceService(session).get_all_price_categories()
@service_router.post(
'/price-categories/create',
response_model=CreatePriceCategoryResponse,
operation_id='create_price_category',
dependencies=[Depends(authorized_user)]
)
async def create_price_category(
session: SessionDependency,
request: CreatePriceCategoryRequest
):
return await ServiceService(session).create_price_category(request)
@service_router.post(
'/price-categories/update',
response_model=UpdatePriceCategoryResponse,
operation_id='update_price_category',
dependencies=[Depends(authorized_user)]
)
async def update_price_category(
session: SessionDependency,
request: UpdatePriceCategoryRequest
):
return await ServiceService(session).update_price_category(request)
@service_router.post(
'/price-categories/delete',
response_model=DeletePriceCategoryResponse,
operation_id='delete_price_category',
dependencies=[Depends(authorized_user)]
)
async def delete_price_category(
session: SessionDependency,
request: DeletePriceCategoryRequest
):
return await ServiceService(session).delete_price_category(request)
# endregion # endregion
# region Exports # region Exports

View File

@@ -10,7 +10,7 @@ from schemas.client import ClientSchema
from schemas.group import DealGroupSchema from schemas.group import DealGroupSchema
from schemas.marketplace import BaseMarketplaceSchema from schemas.marketplace import BaseMarketplaceSchema
from schemas.product import ProductSchema from schemas.product import ProductSchema
from schemas.service import ServiceSchema, ServicePriceCategorySchema from schemas.service import ServiceSchema
from schemas.shipping import PalletSchema, BoxSchema from schemas.shipping import PalletSchema, BoxSchema
from schemas.shipping_warehouse import ShippingWarehouseSchema, BaseShippingWarehouseSchema from schemas.shipping_warehouse import ShippingWarehouseSchema, BaseShippingWarehouseSchema
from schemas.status import StatusSchema, DealStatusHistorySchema from schemas.status import StatusSchema, DealStatusHistorySchema
@@ -91,7 +91,6 @@ class DealSchema(BaseSchema):
comment: str comment: str
shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None shipping_warehouse: Optional[Union[ShippingWarehouseSchema, str]] = None
bill_request: Optional[DealBillRequestSchema] = None bill_request: Optional[DealBillRequestSchema] = None
category: Optional[ServicePriceCategorySchema] = None
group: Optional[DealGroupSchema] = None group: Optional[DealGroupSchema] = None
manager: Optional[UserSchema] = None manager: Optional[UserSchema] = None
pallets: List[PalletSchema] = [] pallets: List[PalletSchema] = []
@@ -163,7 +162,6 @@ class DealQuickCreateRequest(BaseSchema):
acceptance_date: datetime.datetime acceptance_date: datetime.datetime
shipping_warehouse: constr(strip_whitespace=True) shipping_warehouse: constr(strip_whitespace=True)
base_marketplace: BaseMarketplaceSchema base_marketplace: BaseMarketplaceSchema
category: Optional[ServicePriceCategorySchema] = None
status_id: int status_id: int

View File

@@ -20,16 +20,6 @@ class ServiceCategorySchema(BaseSchema):
product_service_rank: str product_service_rank: str
class ServicePriceCategorySchema(BaseSchema):
id: int
name: str
class ServiceCategoryPriceSchema(BaseSchema):
category: ServicePriceCategorySchema
price: float
class ServiceSchema(BaseSchema): class ServiceSchema(BaseSchema):
id: int id: int
name: str name: str
@@ -37,7 +27,6 @@ class ServiceSchema(BaseSchema):
price: float price: float
service_type: int service_type: int
price_ranges: List[ServicePriceRangeSchema] price_ranges: List[ServicePriceRangeSchema]
category_prices: List[ServiceCategoryPriceSchema]
cost: Optional[int] cost: Optional[int]
rank: str rank: str
is_placeholder: Optional[bool] = False is_placeholder: Optional[bool] = False
@@ -65,10 +54,6 @@ class UpdateServiceKitSchema(BaseServiceKitSchema):
services_ids: List[int] services_ids: List[int]
# endregion
# region Category prices
# endregion # endregion
# endregion # endregion
@@ -170,22 +155,6 @@ class GetAllServicesKitsResponse(BaseSchema):
services_kits: List[GetServiceKitSchema] services_kits: List[GetServiceKitSchema]
class GetAllPriceCategoriesResponse(BaseSchema):
price_categories: List[ServicePriceCategorySchema]
class CreatePriceCategoryResponse(OkMessageSchema):
pass
class UpdatePriceCategoryResponse(OkMessageSchema):
pass
class DeletePriceCategoryResponse(OkMessageSchema):
pass
class ServiceReorderResponse(OkMessageSchema): class ServiceReorderResponse(OkMessageSchema):
pass pass

View File

@@ -118,15 +118,6 @@ class DealService(BaseService):
base_marketplace_key=request.base_marketplace.key base_marketplace_key=request.base_marketplace.key
) )
self.session.add(deal) self.session.add(deal)
await self.session.flush()
# add category if specified
if request.category:
deal_category = DealPriceCategory(
deal_id=deal.id,
category_id=request.category.id
)
self.session.add(deal_category)
await self.session.commit() await self.session.commit()
return DealQuickCreateResponse(deal_id=deal.id) return DealQuickCreateResponse(deal_id=deal.id)

View File

@@ -5,8 +5,7 @@ from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from enums.service import ServiceType from enums.service import ServiceType
from models import Service, ServiceCategory, ServicePriceRange, ServicesKit, services_kit_services, \ from models import Service, ServiceCategory, ServicePriceRange, ServicesKit, services_kit_services
ServiceCategoryPrice, ServicePriceCategory
from schemas.service import * from schemas.service import *
from services.base import BaseService from services.base import BaseService
from utils.list_utils import previous_current_next from utils.list_utils import previous_current_next
@@ -62,7 +61,6 @@ class ServiceService(BaseService):
price=0, price=0,
service_type=service_type, service_type=service_type,
price_ranges=[], price_ranges=[],
category_prices=[],
cost=0, cost=0,
rank='', rank='',
is_placeholder=True is_placeholder=True
@@ -88,7 +86,6 @@ class ServiceService(BaseService):
del service_dict['id'] del service_dict['id']
del service_dict['category'] del service_dict['category']
del service_dict['price_ranges'] del service_dict['price_ranges']
del service_dict['category_prices']
del service_dict['is_placeholder'] del service_dict['is_placeholder']
service_type = ServiceType(raw_service.service_type) service_type = ServiceType(raw_service.service_type)
category_id = raw_service.category.id category_id = raw_service.category.id
@@ -110,15 +107,6 @@ class ServiceService(BaseService):
del price_range_dict['id'] del price_range_dict['id']
price_range_obj = ServicePriceRange(**price_range_dict) price_range_obj = ServicePriceRange(**price_range_dict)
self.session.add(price_range_obj) self.session.add(price_range_obj)
category_prices = request.service.category_prices
for category_price in category_prices:
category_price_dict = category_price.model_dump()
category_price_dict['service_id'] = service.id
category_price_dict['category_id'] = category_price.category.id
del category_price_dict['category']
category_price_obj = ServiceCategoryPrice(**category_price_dict)
self.session.add(category_price_obj)
await self.session.commit() await self.session.commit()
return ServiceCreateResponse(ok=True, message="Услуга успешно создана") return ServiceCreateResponse(ok=True, message="Услуга успешно создана")
except Exception as e: except Exception as e:
@@ -136,7 +124,6 @@ class ServiceService(BaseService):
service_dict['category_id'] = raw_service.category.id service_dict['category_id'] = raw_service.category.id
del service_dict['category'] del service_dict['category']
del service_dict['price_ranges'] del service_dict['price_ranges']
del service_dict['category_prices']
del service_dict['is_placeholder'] del service_dict['is_placeholder']
if prev_category_id != new_category_id: if prev_category_id != new_category_id:
latest_rank = await self.get_latest_rank_in_category(new_category_id, ServiceType(raw_service.service_type)) latest_rank = await self.get_latest_rank_in_category(new_category_id, ServiceType(raw_service.service_type))
@@ -173,25 +160,6 @@ class ServiceService(BaseService):
price_range_obj = ServicePriceRange(**price_range_dict) price_range_obj = ServicePriceRange(**price_range_dict)
self.session.add(price_range_obj) self.session.add(price_range_obj)
# deleting previouse category prices
stmt = (
delete(
ServiceCategoryPrice
).where(
ServiceCategoryPrice.service_id == service.id
)
)
await self.session.execute(stmt)
await self.session.flush()
# inserting new category prices
for category_price in raw_service.category_prices:
category_price_dict = category_price.dict()
category_price_dict['service_id'] = raw_service.id
category_price_dict['category_id'] = category_price.category.id
del category_price_dict['category']
category_price_obj = ServiceCategoryPrice(**category_price_dict)
self.session.add(category_price_obj)
await self.session.commit() await self.session.commit()
return ServiceUpdateResponse(ok=True, message="Услуга успешно обновлена") return ServiceUpdateResponse(ok=True, message="Услуга успешно обновлена")
except Exception as e: except Exception as e:
@@ -345,63 +313,6 @@ class ServiceService(BaseService):
except Exception as e: except Exception as e:
return UpdateServicesKitResponse(ok=False, message=str(e)) return UpdateServicesKitResponse(ok=False, message=str(e))
async def get_all_price_categories(self) -> GetAllPriceCategoriesResponse:
query = await (self.session
.scalars(select(ServicePriceCategory)
.order_by(ServicePriceCategory.id)))
price_categories = []
for category in query.all():
price_categories.append(ServicePriceCategorySchema.model_validate(category))
return GetAllPriceCategoriesResponse(price_categories=price_categories)
async def create_price_category(self, request: CreatePriceCategoryRequest) -> ServiceCreateCategoryResponse:
try:
raw_category = request.name
category = ServicePriceCategory(name=raw_category)
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 update_price_category(self, request: UpdatePriceCategoryRequest) -> ServiceUpdateResponse:
try:
raw_category = request.name
category = await (self.session.get(ServicePriceCategory, request.id))
if not category:
return ServiceUpdateResponse(ok=False, message="Категория цен не найдена")
await self.session.execute(
update(ServicePriceCategory)
.where(ServicePriceCategory.id == request.id)
.values(name=raw_category)
)
await self.session.commit()
return ServiceUpdateResponse(ok=True, message="Категория цен успешно обновлена")
except Exception as e:
return ServiceUpdateResponse(ok=False, message=f"Неудалось обновить категорию цен, ошибка: {e}")
async def delete_price_category(self, request: DeletePriceCategoryRequest) -> ServiceDeleteResponse:
try:
category = await (
self.session
.scalar(
select(
ServicePriceCategory
)
.filter(
ServicePriceCategory.id == request.id
)
)
)
if not category:
return ServiceDeleteResponse(ok=False, message="Категория цен не найдена")
await self.session.delete(category)
await self.session.commit()
return ServiceDeleteResponse(ok=True, message="Категория цен успешно удалена")
except Exception as e:
return ServiceDeleteResponse(ok=False, message=f"Неудалось удалить категорию цен, ошибка: {e}")
async def reorder(self, request: ServiceReorderRequest) -> ServiceReorderResponse: async def reorder(self, request: ServiceReorderRequest) -> ServiceReorderResponse:
try: try:
draining_service = await (self.session.get(Service, request.draining_service_id)) draining_service = await (self.session.get(Service, request.draining_service_id))