feat(#46): add public order summary and fill_codes endpoints

This commit is contained in:
mono
2026-08-08 13:28:53 -05:00
parent 332884907c
commit 2438cf2576
4 changed files with 106 additions and 8 deletions

View File

@@ -6,6 +6,7 @@ from .sales import (
CatalogSaleView,
SaleSummary,
CatalogSaleSummary,
PublicSaleSummaryView,
SalesForTrytonView,
SalesToTrytonView,
CatalogSalesToTrytonView,
@@ -33,6 +34,7 @@ __all__ = [
"CatalogSaleView",
"SaleSummary",
"CatalogSaleSummary",
"PublicSaleSummaryView",
"SalesForTrytonView",
"SalesToTrytonView",
"CatalogSalesToTrytonView",

View File

@@ -1,11 +1,17 @@
from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.decorators import action
import io
import csv
from ..models.sales import Sale, SaleLine, CatalogSale
from ..models.sales import (
Sale,
SaleLine,
CatalogSale,
generate_order_code,
)
from ..models.customers import Customer
from ..models.products import Product
from ..serializers import (
@@ -20,11 +26,27 @@ from ..services.tryton.client import get_tryton_client
from ..views import sales_to_tryton_csv
def _fill_codes(Model):
rows = Model.objects.all()
for row in rows:
row.code = generate_order_code()
Model.objects.bulk_update(rows, ["code"])
return len(rows)
class SaleView(viewsets.ModelViewSet):
queryset = Sale.objects.all()
serializer_class = SaleSerializer
permission_classes = [IsNotPublico]
@action(
detail=False,
methods=["post"],
permission_classes=[IsAuthenticated, IsAdministrator],
)
def fill_codes(self, request):
return Response({"sales_updated": _fill_codes(Sale)})
def create(self, request):
data = request.data
customer = Customer.objects.get(pk=data["customer"])
@@ -60,7 +82,17 @@ class CatalogSaleView(viewsets.ModelViewSet):
queryset = CatalogSale.objects.all()
serializer_class = CatalogSaleSerializer
@action(
detail=False,
methods=["post"],
permission_classes=[IsAuthenticated, IsAdministrator],
)
def fill_codes(self, request):
return Response({"catalog_sales_updated": _fill_codes(CatalogSale)})
def get_permissions(self):
if self.action == "fill_codes":
return [IsAuthenticated(), IsAdministrator()]
if self.action == "create":
return [IsAuthenticated()]
return [IsNotPublico()]
@@ -71,7 +103,9 @@ class SaleSummary(APIView):
def get(self, request, id):
sale = Sale.objects.get(pk=id)
serializer = SaleSummarySerializer(sale)
serializer = SaleSummarySerializer(
sale, context={"request": request}
)
return Response(serializer.data)
@@ -80,10 +114,45 @@ class CatalogSaleSummary(APIView):
def get(self, request, id):
catalog_sale = CatalogSale.objects.get(pk=id)
serializer = CatalogSaleSummarySerializer(catalog_sale)
serializer = CatalogSaleSummarySerializer(
catalog_sale, context={"request": request}
)
return Response(serializer.data)
class PublicSaleSummaryView(APIView):
permission_classes = [AllowAny]
def get(self, request, code=None):
code = code or request.query_params.get("code")
if not code:
return Response(
{"detail": "code is required"}, status=400
)
sale = Sale.objects.filter(code=code).first()
if sale:
serializer = SaleSummarySerializer(
sale, context={"request": request}
)
data = serializer.data
data["type"] = "sale"
return Response(data)
catalog_sale = CatalogSale.objects.filter(code=code).first()
if catalog_sale:
serializer = CatalogSaleSummarySerializer(
catalog_sale, context={"request": request}
)
data = serializer.data
data["type"] = "catalog"
return Response(data)
return Response(
{"detail": "order not found"}, status=404
)
class SalesForTrytonView(APIView):
permission_classes = [IsAuthenticated, IsAdministrator]