diff --git a/tienda_ilusion/don_confiao/api/__init__.py b/tienda_ilusion/don_confiao/api/__init__.py index 275997b..ae91708 100644 --- a/tienda_ilusion/don_confiao/api/__init__.py +++ b/tienda_ilusion/don_confiao/api/__init__.py @@ -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", diff --git a/tienda_ilusion/don_confiao/api/sales.py b/tienda_ilusion/don_confiao/api/sales.py index 125422c..3f702f9 100644 --- a/tienda_ilusion/don_confiao/api/sales.py +++ b/tienda_ilusion/don_confiao/api/sales.py @@ -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] diff --git a/tienda_ilusion/don_confiao/serializers/sales.py b/tienda_ilusion/don_confiao/serializers/sales.py index 72db3cf..17ea8fd 100644 --- a/tienda_ilusion/don_confiao/serializers/sales.py +++ b/tienda_ilusion/don_confiao/serializers/sales.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from django.urls import reverse from ..models.sales import ( Sale, @@ -11,6 +12,17 @@ from .products import ListProductSerializer from .customers import ListCustomerSerializer +class PublicSummaryLinkMixin: + def get_link(self, obj): + path = reverse( + "don_confiao:public_purchase_summary", args=[obj.code] + ) + request = self.context.get("request") + if request: + return request.build_absolute_uri(path) + return path + + class SaleLineSerializer(serializers.ModelSerializer): class Meta: model = SaleLine @@ -87,13 +99,14 @@ class SummarySaleLineSerializer(serializers.ModelSerializer): fields = ["product", "quantity", "unit_price", "description"] -class SaleSummarySerializer(serializers.ModelSerializer): +class SaleSummarySerializer(PublicSummaryLinkMixin, serializers.ModelSerializer): customer = ListCustomerSerializer() lines = SummarySaleLineSerializer(many=True, source="saleline_set") + link = serializers.SerializerMethodField() class Meta: model = Sale - fields = ["id", "date", "customer", "payment_method", "lines"] + fields = ["id", "code", "date", "customer", "payment_method", "lines", "link"] class CatalogSummarySaleLineSerializer(serializers.ModelSerializer): @@ -104,15 +117,18 @@ class CatalogSummarySaleLineSerializer(serializers.ModelSerializer): fields = ["product", "quantity", "unit_price", "description"] -class CatalogSaleSummarySerializer(serializers.ModelSerializer): +class CatalogSaleSummarySerializer( + PublicSummaryLinkMixin, serializers.ModelSerializer +): customer = ListCustomerSerializer() lines = CatalogSummarySaleLineSerializer( many=True, source="catalogsaleline_set" ) + link = serializers.SerializerMethodField() class Meta: model = CatalogSale - fields = ["id", "date", "customer", "lines"] + fields = ["id", "code", "date", "customer", "lines", "link"] class SaleForRenconciliationSerializer(serializers.Serializer): diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index e7e5592..d7a8a44 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -16,6 +16,7 @@ from .api import ( CatalogSaleView, SaleSummary, CatalogSaleSummary, + PublicSaleSummaryView, SalesForTrytonView, SalesToTrytonView, CatalogSalesToTrytonView, @@ -58,6 +59,16 @@ urlpatterns = [ CatalogSaleSummary.as_view(), name="catalog_purchase_json_summary", ), + path( + "resumen_publico/", + PublicSaleSummaryView.as_view(), + name="public_purchase_summary", + ), + path( + "resumen_publico", + PublicSaleSummaryView.as_view(), + name="public_purchase_summary_query", + ), path( "payment_methods/all/select_format", PaymentMethodView.as_view(),