Skip to content

Commit

Permalink
Chore:Upgrade Invoices w Grouping (uselotus#429)
Browse files Browse the repository at this point in the history
Co-authored-by: Diego Escobedo <[email protected]>
Co-authored-by: Dagmawi Haile <[email protected]>
  • Loading branch information
3 people authored Jan 23, 2023
1 parent c30fb33 commit 305582d
Show file tree
Hide file tree
Showing 58 changed files with 1,167 additions and 602 deletions.
1 change: 0 additions & 1 deletion backend/api/serializers/model_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,6 @@ class Meta(InvoiceSerializer.Meta):
[
"line_items",
"customer",
"invoice_pdf",
]
)
)
Expand Down
44 changes: 43 additions & 1 deletion backend/api/serializers/nonmodel_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,53 @@
LightweightPlanVersionSerializer,
SubscriptionCategoricalFilterSerializer,
)
from metering_billing.models import Customer, Feature, Metric, SubscriptionRecord
from metering_billing.models import (
Customer,
Feature,
Invoice,
Metric,
SubscriptionRecord,
)
from metering_billing.serializers.serializer_utils import (
SlugRelatedFieldWithOrganization,
SlugRelatedFieldWithOrganizationPK,
)
from rest_framework import serializers


class GetInvoicePdfURLRequestSerializer(serializers.Serializer):
invoice_id = SlugRelatedFieldWithOrganization(
slug_field="invoice_id",
queryset=Invoice.objects.all(),
help_text="The invoice_id of the invoice you want to get the PDF URL for.",
required=False,
allow_null=True,
)
invoice_number = SlugRelatedFieldWithOrganization(
slug_field="invoice_number",
queryset=Invoice.objects.all(),
help_text="The invoice_number of the invoice you want to get the PDF URL for.",
required=False,
allow_null=True,
)

def validate(self, data):
if "invoice_id" not in data and "invoice_number" not in data:
raise serializers.ValidationError(
"You must provide either an invoice_id or an invoice_number."
)
if (
data.get("invoice_id") is not None
and data.get("invoice_number") is not None
):
if data["invoice_id"] != data["invoice_number"]:
raise serializers.ValidationError(
"The invoice_id and invoice_number do not match."
)
data["invoice"] = data.get("invoice_id") or data.get("invoice_number")
return data


class GetFeatureAccessSerializer(serializers.Serializer):
feature_name = serializers.CharField(
help_text="Name of the feature to check access for."
Expand Down Expand Up @@ -241,3 +281,5 @@ def validate(self, data):

return data
return data
return data
return data
29 changes: 29 additions & 0 deletions backend/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
GetCustomerFeatureAccessRequestSerializer,
GetEventAccessSerializer,
GetFeatureAccessSerializer,
GetInvoicePdfURLRequestSerializer,
MetricAccessRequestSerializer,
MetricAccessResponseSerializer,
)
Expand Down Expand Up @@ -68,6 +69,7 @@
)
from metering_billing.exceptions.exceptions import NotFoundException
from metering_billing.invoice import generate_invoice
from metering_billing.invoice_pdf import get_invoice_presigned_url
from metering_billing.kafka.producer import Producer
from metering_billing.models import (
CategoricalFilter,
Expand Down Expand Up @@ -1483,6 +1485,31 @@ def get(self, request, format=None):
)


class GetInvoicePdfURL(APIView):
permission_classes = [IsAuthenticated | HasUserAPIKey]

@extend_schema(
parameters=[GetInvoicePdfURLRequestSerializer],
responses={
200: inline_serializer(
name="GetInvoicePdfURLResponse",
fields={
"url": serializers.URLField(),
},
),
},
)
def get(self, request, format=None):
organization = request.organization
serializer = GetInvoicePdfURLRequestSerializer(
data=request.query_params, context={"organization": organization}
)
serializer.is_valid(raise_exception=True)
invoice = serializer.validated_data["invoice"]
url = get_invoice_presigned_url(invoice).get("url")
return Response({"url": url}, status=status.HTTP_200_OK)


class ConfirmIdemsReceivedView(APIView):
permission_classes = [IsAuthenticated | HasUserAPIKey]

Expand Down Expand Up @@ -1703,3 +1730,5 @@ def track_event(request):
return JsonResponse({"success": "all"}, status=status.HTTP_201_CREATED)
return JsonResponse({"success": "all"}, status=status.HTTP_201_CREATED)
return JsonResponse({"success": "all"}, status=status.HTTP_201_CREATED)
return JsonResponse({"success": "all"}, status=status.HTTP_201_CREATED)
return JsonResponse({"success": "all"}, status=status.HTTP_201_CREATED)
3 changes: 3 additions & 0 deletions backend/lotus/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
CustomersSummaryView,
CustomersWithRevenueView,
DraftInvoiceView,
GetInvoicePdfURL,
ImportCustomersView,
ImportPaymentObjectsView,
PeriodMetricRevenueView,
Expand Down Expand Up @@ -118,6 +119,7 @@
path("api/", include((api_router.urls, "api"), namespace="api")),
path("api/ping/", api_views.Ping.as_view(), name="ping"),
path("api/track/", api_views.track_event, name="track_event"),
path("api/invoice_url/", api_views.GetInvoicePdfURL.as_view(), name="invoice_url"),
path(
"api/metric_access/",
api_views.MetricAccessView.as_view(),
Expand Down Expand Up @@ -145,6 +147,7 @@
),
# App views
path("app/", include(router.urls)),
path("app/invoice_url/", GetInvoicePdfURL.as_view(), name="invoice_url"),
path(
"app/customer_summary/",
CustomersSummaryView.as_view(),
Expand Down
Loading

0 comments on commit 305582d

Please sign in to comment.