schon/engine/core/docs/drf/viewsets.py
Egor fureunoir Gorbunov ff99177139 feat(viewsets): add endpoint to retrieve products by identifier
introduce `exact_list` action in `viewsets.py` to retrieve products by `uuid`, `slug`, or `sku` identifiers. Includes input validation and ratelimiting. Adds corresponding schema documentation and a GraphQL mutation for similar functionality.
2026-03-01 22:22:59 +03:00

1368 lines
42 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.utils.translation import gettext_lazy as _
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiParameter, extend_schema
from rest_framework import status
from engine.core.docs.drf import BASE_ERRORS
from engine.core.serializers import (
AddOrderProductSerializer,
AddressSerializer,
AddWishlistProductSerializer,
AttributeDetailSerializer,
AttributeGroupDetailSerializer,
AttributeGroupSimpleSerializer,
AttributeSimpleSerializer,
AttributeValueDetailSerializer,
AttributeValueSimpleSerializer,
BrandDetailSerializer,
BrandSimpleSerializer,
BulkAddOrderProductsSerializer,
BulkAddWishlistProductSerializer,
BulkRemoveOrderProductsSerializer,
BulkRemoveWishlistProductSerializer,
BuyOrderSerializer,
BuyUnregisteredOrderSerializer,
CategoryDetailSerializer,
CategorySimpleSerializer,
FeedbackDetailSerializer,
FeedbackSimpleSerializer,
OrderDetailSerializer,
OrderProductDetailSerializer,
OrderProductSimpleSerializer,
OrderSimpleSerializer,
ProductDetailSerializer,
ProductImageDetailSerializer,
ProductImageSimpleSerializer,
ProductSimpleSerializer,
ProductTagDetailSerializer,
ProductTagSimpleSerializer,
PromoCodeDetailSerializer,
PromoCodeSimpleSerializer,
PromotionDetailSerializer,
PromotionSimpleSerializer,
RemoveOrderProductSerializer,
RemoveWishlistProductSerializer,
StockDetailSerializer,
StockSimpleSerializer,
VendorDetailSerializer,
VendorSimpleSerializer,
WishlistDetailSerializer,
WishlistSimpleSerializer,
)
from engine.core.serializers.seo import SeoSnapshotSerializer
from engine.core.serializers.utility import (
AddressCreateSerializer,
AddressSuggestionSerializer,
DoFeedbackSerializer,
)
from engine.payments.serializers import TransactionProcessSerializer
ATTRIBUTE_GROUP_SCHEMA = {
"list": extend_schema(
tags=[
"attributeGroups",
],
summary=_("list all attribute groups (simple view)"),
responses={
status.HTTP_200_OK: AttributeGroupSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"attributeGroups",
],
summary=_("retrieve a single attribute group (detailed view)"),
responses={status.HTTP_200_OK: AttributeGroupDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"attributeGroups",
],
summary=_("create an attribute group"),
responses={
status.HTTP_201_CREATED: AttributeGroupDetailSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"attributeGroups",
],
summary=_("delete an attribute group"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"attributeGroups",
],
summary=_("rewrite an existing attribute group saving non-editables"),
responses={status.HTTP_200_OK: AttributeGroupDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"attributeGroups",
],
summary=_(
"rewrite some fields of an existing attribute group saving non-editables"
),
responses={status.HTTP_200_OK: AttributeGroupDetailSerializer(), **BASE_ERRORS},
),
}
ATTRIBUTE_SCHEMA = {
"list": extend_schema(
tags=[
"attributes",
],
summary=_("list all attributes (simple view)"),
responses={
status.HTTP_200_OK: AttributeSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"attributes",
],
summary=_("retrieve a single attribute (detailed view)"),
responses={status.HTTP_200_OK: AttributeDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"attributes",
],
summary=_("create an attribute"),
responses={status.HTTP_201_CREATED: AttributeDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"attributes",
],
summary=_("delete an attribute"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"attributes",
],
summary=_("rewrite an existing attribute saving non-editables"),
responses={status.HTTP_200_OK: AttributeDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"attributes",
],
summary=_("rewrite some fields of an existing attribute saving non-editables"),
responses={status.HTTP_200_OK: AttributeDetailSerializer(), **BASE_ERRORS},
),
}
ATTRIBUTE_VALUE_SCHEMA = {
"list": extend_schema(
tags=[
"attributeValues",
],
summary=_("list all attribute values (simple view)"),
responses={
status.HTTP_200_OK: AttributeValueSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"attributeValues",
],
summary=_("retrieve a single attribute value (detailed view)"),
responses={status.HTTP_200_OK: AttributeValueDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"attributeValues",
],
summary=_("create an attribute value"),
responses={
status.HTTP_201_CREATED: AttributeValueDetailSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"attributeValues",
],
summary=_("delete an attribute value"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"attributeValues",
],
summary=_("rewrite an existing attribute value saving non-editables"),
responses={status.HTTP_200_OK: AttributeValueDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"attributeValues",
],
summary=_(
"rewrite some fields of an existing attribute value saving non-editables"
),
responses={status.HTTP_200_OK: AttributeValueDetailSerializer(), **BASE_ERRORS},
),
}
CATEGORY_SCHEMA = {
"list": extend_schema(
tags=[
"categories",
],
summary=_("list all categories (simple view)"),
description=_("list all categories (simple view)"),
responses={
status.HTTP_200_OK: CategorySimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"categories",
],
summary=_("retrieve a single category (detailed view)"),
description=_("retrieve a single category (detailed view)"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Category UUID or slug"),
type=OpenApiTypes.STR,
),
],
responses={status.HTTP_200_OK: CategoryDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"categories",
],
summary=_("create a category"),
description=_("create a category"),
responses={status.HTTP_201_CREATED: CategoryDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"categories",
],
summary=_("delete a category"),
description=_("delete a category"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"categories",
],
summary=_("rewrite an existing category saving non-editables"),
description=_("rewrite an existing category saving non-editables"),
responses={status.HTTP_200_OK: CategoryDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"categories",
],
summary=_("rewrite some fields of an existing category saving non-editables"),
description=_(
"rewrite some fields of an existing category saving non-editables"
),
responses={status.HTTP_200_OK: CategoryDetailSerializer(), **BASE_ERRORS},
),
"seo_meta": extend_schema(
tags=[
"categories",
],
summary=_("SEO Meta snapshot"),
description=_("returns a snapshot of the category's SEO meta data"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Category UUID or slug"),
type=OpenApiTypes.STR,
),
],
responses={
status.HTTP_200_OK: SeoSnapshotSerializer(),
**BASE_ERRORS,
},
),
}
ORDER_SCHEMA = {
"list": extend_schema(
tags=[
"orders",
],
summary=_("list all orders (simple view)"),
description=_("for non-staff users, only their own orders are returned."),
parameters=[
OpenApiParameter(
name="search",
type=OpenApiTypes.STR,
description=_(
"Case-insensitive substring search across human_readable_id, "
"order_products.product.name, and order_products.product.partnumber"
),
),
OpenApiParameter(
name="min_buy_time",
type=OpenApiTypes.DATETIME,
description=_("Filter orders with buy_time >= this ISO 8601 datetime"),
),
OpenApiParameter(
name="max_buy_time",
type=OpenApiTypes.DATETIME,
description=_("Filter orders with buy_time <= this ISO 8601 datetime"),
),
OpenApiParameter(
name="uuid",
type=OpenApiTypes.UUID,
description=_("Filter by exact order UUID"),
),
OpenApiParameter(
name="human_readable_id",
type=OpenApiTypes.STR,
description=_("Filter by exact human-readable order ID"),
),
OpenApiParameter(
name="user_email",
type=OpenApiTypes.STR,
description=_("Filter by user's email (case-insensitive exact match)"),
),
OpenApiParameter(
name="user",
type=OpenApiTypes.UUID,
description=_("Filter by user's UUID"),
),
OpenApiParameter(
name="status",
type=OpenApiTypes.STR,
description=_(
"Filter by order status (case-insensitive substring match)"
),
),
OpenApiParameter(
name="order_by",
type=OpenApiTypes.STR,
description=_(
"Order by one of: uuid, human_readable_id, user_email, user, "
"status, created, modified, buy_time, random. "
"Prefix with '-' for descending (e.g. '-buy_time')."
),
),
],
responses={status.HTTP_200_OK: OrderSimpleSerializer(many=True), **BASE_ERRORS},
),
"retrieve": extend_schema(
tags=[
"orders",
],
summary=_("retrieve a single order (detailed view)"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Order UUID or human-readable id"),
type=OpenApiTypes.STR,
),
],
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"orders",
],
summary=_("create an order"),
description=_("doesn't work for non-staff users."),
responses={status.HTTP_201_CREATED: OrderDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"orders",
],
summary=_("delete an order"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"orders",
],
summary=_("rewrite an existing order saving non-editables"),
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"orders",
],
summary=_("rewrite some fields of an existing order saving non-editables"),
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
"buy": extend_schema(
tags=[
"orders",
],
summary=_("purchase an order"),
description=_(
"finalizes the order purchase. if `force_balance` is used,"
" the purchase is completed using the user's balance;"
" if `force_payment` is used, a transaction is initiated."
),
request=BuyOrderSerializer(),
responses={
status.HTTP_200_OK: OrderDetailSerializer(),
status.HTTP_202_ACCEPTED: TransactionProcessSerializer(),
**BASE_ERRORS,
},
),
"current": extend_schema(
tags=[
"orders",
],
summary=_("retrieve current pending order of a user"),
description=_("retrieves a current pending order of an authenticated user"),
responses={
status.HTTP_200_OK: OrderDetailSerializer(),
**BASE_ERRORS,
},
),
"buy_unregistered": extend_schema(
tags=[
"orders",
],
summary=_("purchase an order without account creation"),
description=_("finalizes the order purchase for a non-registered user."),
request=BuyUnregisteredOrderSerializer(),
responses={
status.HTTP_202_ACCEPTED: TransactionProcessSerializer(),
**BASE_ERRORS,
},
),
"add_order_product": extend_schema(
tags=[
"orders",
],
summary=_("add product to order"),
description=_(
"adds a product to an order using the provided `product_uuid` and `attributes`."
),
request=AddOrderProductSerializer(),
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
"bulk_add_order_products": extend_schema(
tags=[
"orders",
],
summary=_("add a list of products to order, quantities will not count"),
description=_(
"adds a list of products to an order using the provided `product_uuid` and `attributes`."
),
request=BulkAddOrderProductsSerializer(),
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
"remove_order_product": extend_schema(
tags=[
"orders",
],
summary=_("remove product from order"),
description=_(
"removes a product from an order using the provided `product_uuid` and `attributes`."
),
request=RemoveOrderProductSerializer(),
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
"bulk_remove_order_products": extend_schema(
tags=[
"orders",
],
summary=_("remove product from order, quantities will not count"),
description=_(
"removes a list of products from an order using the provided `product_uuid` and `attributes`"
),
request=BulkRemoveOrderProductsSerializer(),
responses={status.HTTP_200_OK: OrderDetailSerializer(), **BASE_ERRORS},
),
}
WISHLIST_SCHEMA = {
"list": extend_schema(
tags=[
"wishlists",
],
summary=_("list all wishlists (simple view)"),
description=_("for non-staff users, only their own wishlists are returned."),
responses={
status.HTTP_200_OK: WishlistSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"wishlists",
],
summary=_("retrieve a single wishlist (detailed view)"),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"wishlists",
],
summary=_("create an wishlist"),
description=_("Doesn't work for non-staff users."),
responses={status.HTTP_201_CREATED: WishlistDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"wishlists",
],
summary=_("delete an wishlist"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"wishlists",
],
summary=_("rewrite an existing wishlist saving non-editables"),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"wishlists",
],
summary=_("rewrite some fields of an existing wishlist saving non-editables"),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
"current": extend_schema(
tags=[
"wishlists",
],
summary=_("retrieve current pending wishlist of a user"),
description=_("retrieves a current pending wishlist of an authenticated user"),
responses={
status.HTTP_200_OK: WishlistDetailSerializer(),
**BASE_ERRORS,
},
),
"add_wishlist_product": extend_schema(
tags=[
"wishlists",
],
summary=_("add product to wishlist"),
description=_(
"adds a product to an wishlist using the provided `product_uuid`"
),
request=AddWishlistProductSerializer(),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
"remove_wishlist_product": extend_schema(
tags=[
"wishlists",
],
summary=_("remove product from wishlist"),
description=_(
"removes a product from an wishlist using the provided `product_uuid`"
),
request=RemoveWishlistProductSerializer(),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
"bulk_add_wishlist_products": extend_schema(
tags=[
"wishlists",
],
summary=_("add many products to wishlist"),
description=_(
"adds many products to an wishlist using the provided `product_uuids`"
),
request=BulkAddWishlistProductSerializer(),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
"bulk_remove_wishlist_products": extend_schema(
tags=[
"wishlists",
],
summary=_("remove many products from wishlist"),
description=_(
"removes many products from an wishlist using the provided `product_uuids`"
),
request=BulkRemoveWishlistProductSerializer(),
responses={status.HTTP_200_OK: WishlistDetailSerializer(), **BASE_ERRORS},
),
}
ATTRIBUTES_DESC = _(
"Filter by one or more attribute name/value pairs. \n"
"• **Syntax**: `attr_name=method-value[;attr2=method2-value2]…` \n"
"• **Methods** (defaults to `icontains` if omitted): "
"`iexact`, `exact`, `icontains`, `contains`, `isnull`, "
"`startswith`, `istartswith`, `endswith`, `iendswith`, "
"`regex`, `iregex`, `lt`, `lte`, `gt`, `gte`, `in` \n"
"• **Value typing**: JSON is attempted first (so you can pass lists/dicts), "
"`true`/`false` for booleans, integers, floats; otherwise treated as string. \n"
"• **Base64**: prefix with `b64-` to URL-safe base64-encode the raw value. \n"
"Examples: \n"
'`color=exact-red`, `size=gt-10`, `features=in-["wifi","bluetooth"]`, \n'
"`b64-description=icontains-aGVhdC1jb2xk`"
)
PRODUCT_SCHEMA = {
"list": extend_schema(
tags=[
"products",
],
summary=_("list all products (simple view)"),
description=_("list all products (simple view)"),
parameters=[
OpenApiParameter(
name="uuid",
location="query",
description=_("(exact) Product UUID"),
type=str,
),
OpenApiParameter(
name="order_by",
location="query",
description=_(
"Comma-separated list of fields to sort by. "
"Prefix with `-` for descending. \n"
"**Allowed:** uuid, rating, name, slug, created, modified, price, random"
),
required=False,
type=str,
),
],
responses={
status.HTTP_200_OK: ProductSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"products",
],
summary=_("retrieve a single product (detailed view)"),
description=_("retrieve a single product (detailed view)"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Product UUID or slug"),
type=str,
),
],
responses={
status.HTTP_200_OK: ProductDetailSerializer(),
**BASE_ERRORS,
},
),
"create": extend_schema(
tags=[
"products",
],
summary=_("create a product"),
description=_("create a product"),
responses={
status.HTTP_201_CREATED: ProductDetailSerializer(),
**BASE_ERRORS,
},
),
"update": extend_schema(
tags=[
"products",
],
summary=_("rewrite an existing product, preserving non-editable fields"),
description=_("rewrite an existing product, preserving non-editable fields"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Product UUID or slug"),
type=str,
),
],
responses={
status.HTTP_200_OK: ProductDetailSerializer(),
**BASE_ERRORS,
},
),
"partial_update": extend_schema(
tags=[
"products",
],
summary=_(
"update some fields of an existing product, preserving non-editable fields"
),
description=_(
"update some fields of an existing product, preserving non-editable fields"
),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Product UUID or slug"),
type=str,
),
],
responses={
status.HTTP_200_OK: ProductDetailSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"products",
],
summary=_("delete a product"),
description=_("delete a product"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Product UUID or slug"),
type=str,
),
],
responses={
status.HTTP_204_NO_CONTENT: {},
**BASE_ERRORS,
},
),
"feedbacks": extend_schema(
tags=[
"products",
],
summary=_("lists all permitted feedbacks for a product"),
description=_("lists all permitted feedbacks for a product"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Product UUID or slug"),
type=str,
),
],
responses={
status.HTTP_200_OK: FeedbackSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"exact_list": extend_schema(
tags=[
"products",
],
summary=_("retrieve exact products by identifier"),
description=_(
"retrieve a list of products by identifier type (uuid, slug, or sku). "
"Send a POST request with `identificator_type` and `identificators` (list of values)."
),
responses={
status.HTTP_200_OK: ProductSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"seo_meta": extend_schema(
tags=[
"products",
],
summary=_("SEO Meta snapshot"),
description=_("returns a snapshot of the product's SEO meta data"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Product UUID or slug"),
type=str,
),
],
responses={
status.HTTP_200_OK: SeoSnapshotSerializer(),
**BASE_ERRORS,
},
),
}
ADDRESS_SCHEMA = {
"list": extend_schema(
tags=[
"addresses",
],
summary=_("list all addresses"),
responses={
status.HTTP_200_OK: AddressSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"addresses",
],
summary=_("retrieve a single address"),
responses={
status.HTTP_200_OK: AddressSerializer(),
**BASE_ERRORS,
},
),
"create": extend_schema(
tags=[
"addresses",
],
summary=_("create a new address"),
request=AddressCreateSerializer(),
responses={
status.HTTP_201_CREATED: AddressSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"addresses",
],
summary=_("delete an address"),
responses={
status.HTTP_204_NO_CONTENT: {},
**BASE_ERRORS,
},
),
"update": extend_schema(
tags=[
"addresses",
],
summary=_("update an entire address"),
request=AddressSerializer(),
responses={
status.HTTP_200_OK: AddressSerializer(),
**BASE_ERRORS,
},
),
"partial_update": extend_schema(
tags=[
"addresses",
],
summary=_("partially update an address"),
request=AddressSerializer(),
responses={
status.HTTP_200_OK: AddressSerializer(),
**BASE_ERRORS,
},
),
"autocomplete": extend_schema(
tags=[
"addresses",
],
summary=_("autocomplete address suggestions"),
parameters=[
OpenApiParameter(
name="q",
location="query",
description=_(
"raw data query string, please append with data from geo-IP endpoint"
),
type=str,
),
OpenApiParameter(
name="limit",
location="query",
description=_("limit the results amount, 1 < limit < 10, default: 5"),
type=int,
),
],
responses={
status.HTTP_200_OK: AddressSuggestionSerializer(many=True),
**BASE_ERRORS,
},
),
}
FEEDBACK_SCHEMA = {
"list": extend_schema(
tags=[
"feedbacks",
],
summary=_("list all feedbacks (simple view)"),
responses={
status.HTTP_200_OK: FeedbackSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"feedbacks",
],
summary=_("retrieve a single feedback (detailed view)"),
responses={status.HTTP_200_OK: FeedbackDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"feedbacks",
],
summary=_("create a feedback"),
responses={status.HTTP_201_CREATED: FeedbackDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"feedbacks",
],
summary=_("delete a feedback"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"feedbacks",
],
summary=_("rewrite an existing feedback saving non-editables"),
responses={status.HTTP_200_OK: FeedbackDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"feedbacks",
],
summary=_("rewrite some fields of an existing feedback saving non-editables"),
responses={status.HTTP_200_OK: FeedbackDetailSerializer(), **BASE_ERRORS},
),
}
ORDER_PRODUCT_SCHEMA = {
"list": extend_schema(
tags=[
"orderProducts",
],
summary=_("list all orderproduct relations (simple view)"),
responses={
status.HTTP_200_OK: OrderProductSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"orderProducts",
],
summary=_("retrieve a single orderproduct relation (detailed view)"),
responses={
status.HTTP_200_OK: OrderProductDetailSerializer(),
**BASE_ERRORS,
},
),
"create": extend_schema(
tags=[
"orderProducts",
],
summary=_("create a new orderproduct relation"),
responses={
status.HTTP_201_CREATED: OrderProductDetailSerializer(),
**BASE_ERRORS,
},
),
"update": extend_schema(
tags=[
"orderProducts",
],
summary=_("replace an existing orderproduct relation"),
responses={
status.HTTP_200_OK: OrderProductDetailSerializer(),
**BASE_ERRORS,
},
),
"partial_update": extend_schema(
tags=[
"orderProducts",
],
summary=_("partially update an existing orderproduct relation"),
responses={
status.HTTP_200_OK: OrderProductDetailSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"orderProducts",
],
summary=_("delete an orderproduct relation"),
responses={
status.HTTP_204_NO_CONTENT: {},
**BASE_ERRORS,
},
),
"do_feedback": extend_schema(
tags=[
"orderProducts",
],
summary=_("add or remove feedback on an orderproduct relation"),
request=DoFeedbackSerializer,
responses={
status.HTTP_201_CREATED: FeedbackDetailSerializer(),
status.HTTP_204_NO_CONTENT: {},
status.HTTP_400_BAD_REQUEST: {},
status.HTTP_404_NOT_FOUND: {},
**BASE_ERRORS,
},
),
}
BRAND_SCHEMA = {
"list": extend_schema(
tags=[
"brands",
],
summary=_("list all brands (simple view)"),
responses={status.HTTP_200_OK: BrandSimpleSerializer(many=True), **BASE_ERRORS},
),
"retrieve": extend_schema(
tags=[
"brands",
],
summary=_("retrieve a single brand (detailed view)"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Brand UUID or slug"),
type=OpenApiTypes.STR,
),
],
responses={status.HTTP_200_OK: BrandDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"brands",
],
summary=_("create a brand"),
responses={status.HTTP_201_CREATED: BrandDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"brands",
],
summary=_("delete a brand"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"brands",
],
summary=_("rewrite an existing brand saving non-editables"),
responses={status.HTTP_200_OK: BrandDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"brands",
],
summary=_("rewrite some fields of an existing brand saving non-editables"),
responses={status.HTTP_200_OK: BrandDetailSerializer(), **BASE_ERRORS},
),
"seo_meta": extend_schema(
tags=[
"brands",
],
summary=_("SEO Meta snapshot"),
parameters=[
OpenApiParameter(
name="lookup_value",
location="path",
description=_("Brand UUID or slug"),
type=OpenApiTypes.STR,
),
],
responses={status.HTTP_200_OK: SeoSnapshotSerializer(), **BASE_ERRORS},
),
}
VENDOR_SCHEMA = {
"list": extend_schema(
tags=[
"vendors",
],
summary=_("list all vendors (simple view)"),
responses={
status.HTTP_200_OK: VendorSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"vendors",
],
summary=_("retrieve a single vendor (detailed view)"),
responses={status.HTTP_200_OK: VendorDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"vendors",
],
summary=_("create a vendor"),
responses={status.HTTP_201_CREATED: VendorDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"vendors",
],
summary=_("delete a vendor"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"vendors",
],
summary=_("rewrite an existing vendor saving non-editables"),
responses={status.HTTP_200_OK: VendorDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"vendors",
],
summary=_("rewrite some fields of an existing vendor saving non-editables"),
responses={status.HTTP_200_OK: VendorDetailSerializer(), **BASE_ERRORS},
),
}
PRODUCT_IMAGE_SCHEMA = {
"list": extend_schema(
tags=[
"productImages",
],
summary=_("list all product images (simple view)"),
responses={
status.HTTP_200_OK: ProductImageSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"productImages",
],
summary=_("retrieve a single product image (detailed view)"),
responses={status.HTTP_200_OK: ProductImageDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"productImages",
],
summary=_("create a product image"),
responses={
status.HTTP_201_CREATED: ProductImageDetailSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"productImages",
],
summary=_("delete a product image"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"productImages",
],
summary=_("rewrite an existing product image saving non-editables"),
responses={status.HTTP_200_OK: ProductImageDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"productImages",
],
summary=_(
"rewrite some fields of an existing product image saving non-editables"
),
responses={status.HTTP_200_OK: ProductImageDetailSerializer(), **BASE_ERRORS},
),
}
PROMOCODE_SCHEMA = {
"list": extend_schema(
tags=[
"promocodes",
],
summary=_("list all promo codes (simple view)"),
responses={
status.HTTP_200_OK: PromoCodeSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"promocodes",
],
summary=_("retrieve a single promo code (detailed view)"),
responses={status.HTTP_200_OK: PromoCodeDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"promocodes",
],
summary=_("create a promo code"),
responses={status.HTTP_201_CREATED: PromoCodeDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"promocodes",
],
summary=_("delete a promo code"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"promocodes",
],
summary=_("rewrite an existing promo code saving non-editables"),
responses={status.HTTP_200_OK: PromoCodeDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"promocodes",
],
summary=_("rewrite some fields of an existing promo code saving non-editables"),
responses={status.HTTP_200_OK: PromoCodeDetailSerializer(), **BASE_ERRORS},
),
}
PROMOTION_SCHEMA = {
"list": extend_schema(
tags=[
"promotions",
],
summary=_("list all promotions (simple view)"),
responses={
status.HTTP_200_OK: PromotionSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"promotions",
],
summary=_("retrieve a single promotion (detailed view)"),
responses={status.HTTP_200_OK: PromotionDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"promotions",
],
summary=_("create a promotion"),
responses={status.HTTP_201_CREATED: PromotionDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"promotions",
],
summary=_("delete a promotion"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"promotions",
],
summary=_("rewrite an existing promotion saving non-editables"),
responses={status.HTTP_200_OK: PromotionDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"promotions",
],
summary=_("rewrite some fields of an existing promotion saving non-editables"),
responses={status.HTTP_200_OK: PromotionDetailSerializer(), **BASE_ERRORS},
),
}
STOCK_SCHEMA = {
"list": extend_schema(
tags=[
"stocks",
],
summary=_("list all stocks (simple view)"),
responses={status.HTTP_200_OK: StockSimpleSerializer(many=True), **BASE_ERRORS},
),
"retrieve": extend_schema(
tags=[
"stocks",
],
summary=_("retrieve a single stock (detailed view)"),
responses={status.HTTP_200_OK: StockDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"stocks",
],
summary=_("create a stock record"),
responses={status.HTTP_201_CREATED: StockDetailSerializer(), **BASE_ERRORS},
),
"destroy": extend_schema(
tags=[
"stocks",
],
summary=_("delete a stock record"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"stocks",
],
summary=_("rewrite an existing stock record saving non-editables"),
responses={status.HTTP_200_OK: StockDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"stocks",
],
summary=_(
"rewrite some fields of an existing stock record saving non-editables"
),
responses={status.HTTP_200_OK: StockDetailSerializer(), **BASE_ERRORS},
),
}
PRODUCT_TAG_SCHEMA = {
"list": extend_schema(
tags=[
"productTags",
],
summary=_("list all product tags (simple view)"),
responses={
status.HTTP_200_OK: ProductTagSimpleSerializer(many=True),
**BASE_ERRORS,
},
),
"retrieve": extend_schema(
tags=[
"productTags",
],
summary=_("retrieve a single product tag (detailed view)"),
responses={status.HTTP_200_OK: ProductTagDetailSerializer(), **BASE_ERRORS},
),
"create": extend_schema(
tags=[
"productTags",
],
summary=_("create a product tag"),
responses={
status.HTTP_201_CREATED: ProductTagDetailSerializer(),
**BASE_ERRORS,
},
),
"destroy": extend_schema(
tags=[
"productTags",
],
summary=_("delete a product tag"),
responses={status.HTTP_204_NO_CONTENT: {}, **BASE_ERRORS},
),
"update": extend_schema(
tags=[
"productTags",
],
summary=_("rewrite an existing product tag saving non-editables"),
responses={status.HTTP_200_OK: ProductTagDetailSerializer(), **BASE_ERRORS},
),
"partial_update": extend_schema(
tags=[
"productTags",
],
summary=_(
"rewrite some fields of an existing product tag saving non-editables"
),
responses={status.HTTP_200_OK: ProductTagDetailSerializer(), **BASE_ERRORS},
),
}