feat/46-order-summary-public #47
@@ -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",
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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/<str:code>",
|
||||
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(),
|
||||
|
||||
Reference in New Issue
Block a user