mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-11 04:19:25 +00:00
Add ProductTypeController
This commit is contained in:
@ -14,22 +14,31 @@
|
||||
#
|
||||
from django.conf import settings
|
||||
from django.db.models import F
|
||||
from django.shortcuts import get_object_or_404
|
||||
from ninja import Query
|
||||
from ninja_extra import ControllerBase, api_controller, paginate, route
|
||||
from ninja_extra.pagination import PageNumberPaginationExtra
|
||||
from ninja_extra.schemas import PaginatedResponseSchema
|
||||
|
||||
from core.api_permissions import CanAccessLookup, CanView, IsInGroup, IsRoot
|
||||
from counter.models import Counter, Product
|
||||
from counter.models import Counter, Product, ProductType
|
||||
from counter.schemas import (
|
||||
CounterFilterSchema,
|
||||
CounterSchema,
|
||||
ProductFilterSchema,
|
||||
ProductSchema,
|
||||
ProductTypeSchema,
|
||||
ReorderProductTypeSchema,
|
||||
SimpleProductSchema,
|
||||
SimplifiedCounterSchema,
|
||||
)
|
||||
|
||||
IsCounterAdmin = (
|
||||
IsRoot
|
||||
| IsInGroup(settings.SITH_GROUP_COUNTER_ADMIN_ID)
|
||||
| IsInGroup(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID)
|
||||
)
|
||||
|
||||
|
||||
@api_controller("/counter")
|
||||
class CounterController(ControllerBase):
|
||||
@ -80,11 +89,7 @@ class ProductController(ControllerBase):
|
||||
@route.get(
|
||||
"/search/detailed",
|
||||
response=PaginatedResponseSchema[ProductSchema],
|
||||
permissions=[
|
||||
IsRoot
|
||||
| IsInGroup(settings.SITH_GROUP_COUNTER_ADMIN_ID)
|
||||
| IsInGroup(settings.SITH_GROUP_ACCOUNTING_ADMIN_ID)
|
||||
],
|
||||
permissions=[IsCounterAdmin],
|
||||
url_name="search_products_detailed",
|
||||
)
|
||||
@paginate(PageNumberPaginationExtra, page_size=50)
|
||||
@ -100,3 +105,40 @@ class ProductController(ControllerBase):
|
||||
"name",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@api_controller("/product-type", permissions=[IsCounterAdmin])
|
||||
class ProductTypeController(ControllerBase):
|
||||
@route.get("", response=list[ProductTypeSchema], url_name="fetch-product-types")
|
||||
def fetch_all(self):
|
||||
return ProductType.objects.order_by("order")
|
||||
|
||||
@route.patch("/{type_id}/move")
|
||||
def reorder(self, type_id: int, other_id: Query[ReorderProductTypeSchema]):
|
||||
"""Change the order of a product type.
|
||||
|
||||
To use this route, give either the id of the product type
|
||||
this one should be above of,
|
||||
of the id of the product type this one should be below of.
|
||||
|
||||
Order affects the display order of the product types.
|
||||
|
||||
Examples:
|
||||
```
|
||||
GET /api/counter/product-type
|
||||
=> [<1: type A>, <2: type B>, <3: type C>]
|
||||
|
||||
PATCH /api/counter/product-type/3/move?below=1
|
||||
|
||||
GET /api/counter/product-type
|
||||
=> [<1: type A>, <3: type C>, <2: type B>]
|
||||
```
|
||||
"""
|
||||
product_type: ProductType = self.get_object_or_exception(
|
||||
ProductType, pk=type_id
|
||||
)
|
||||
other = get_object_or_404(ProductType, pk=other_id.above or other_id.below)
|
||||
if other_id.below is not None:
|
||||
product_type.below(other)
|
||||
else:
|
||||
product_type.above(other)
|
||||
|
Reference in New Issue
Block a user