Skip to content

Commit 9f4ce02

Browse files
Merge pull request #386 from MySecondLanguage/invoice-query-optimized
Invoice query optimized
2 parents 478d822 + 211e04e commit 9f4ce02

File tree

4 files changed

+106
-5
lines changed

4 files changed

+106
-5
lines changed

nxtbn/core/admin_queries.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44

55
from nxtbn.core import CurrencyTypes
66
from nxtbn.core.admin_permissions import gql_store_admin_required
7-
from nxtbn.core.admin_types import AdminCurrencyTypesEnum, CurrencyExchangeType
8-
from nxtbn.core.models import CurrencyExchange
7+
from nxtbn.core.admin_types import AdminCurrencyTypesEnum, CurrencyExchangeType, InvoiceSettingsType
8+
from nxtbn.core.models import CurrencyExchange, InvoiceSettings
99
from graphene_django.filter import DjangoFilterConnectionField
1010

1111

1212
class AdminCoreQuery(graphene.ObjectType):
1313
currency_exchanges = DjangoFilterConnectionField(CurrencyExchangeType)
1414
currency_exchange = graphene.Field(CurrencyExchangeType, id=graphene.ID(required=True))
1515
allowed_currency_list = graphene.List(AdminCurrencyTypesEnum)
16+
default_invoice_settings = graphene.Field(InvoiceSettingsType)
1617

1718
@gql_store_admin_required
1819
def resolve_currency_exchanges(self, info, **kwargs):
@@ -36,3 +37,8 @@ def resolve_allowed_currency_list(self, info):
3637
for currency in CurrencyTypes.choices
3738
if currency[0] in allowed_currency_list
3839
]
40+
41+
@gql_store_admin_required
42+
def resolve_default_invoice_settings(self, info):
43+
site_id = getattr(settings, 'SITE_ID', 1)
44+
return InvoiceSettings.objects.get(site__id=site_id)

nxtbn/core/admin_types.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from graphene_django.types import DjangoObjectType
44

55
from nxtbn.core import CurrencyTypes
6-
from .models import CurrencyExchange
6+
from nxtbn.core.models import CurrencyExchange, InvoiceSettings, SiteSettings
77

88
class CurrencyExchangeType(DjangoObjectType):
99
db_id = graphene.ID(source='id')
@@ -17,6 +17,13 @@ class Meta:
1717
'exchange_rate': ['exact', 'icontains'],
1818
}
1919

20+
21+
class InvoiceSettingsType(DjangoObjectType):
22+
db_id = graphene.ID(source='id')
23+
class Meta:
24+
model = InvoiceSettings
25+
fields = "__all__"
26+
2027
class AdminCurrencyTypesEnum(graphene.ObjectType):
2128
value = graphene.String()
2229
label = graphene.String()

nxtbn/order/admin_queries.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1+
from django.conf import settings
12
import graphene
23
from graphene_django.filter import DjangoFilterConnectionField
34

45
from nxtbn.core.admin_permissions import gql_store_admin_required
5-
from nxtbn.order.admin_types import OrderType
6+
from nxtbn.core.models import SiteSettings
7+
from nxtbn.order.admin_types import OrderInvoiceType, OrderType
68
from nxtbn.order.models import Address, Order
79
from nxtbn.users import UserRole
810

911

1012
class AdminOrderQuery(graphene.ObjectType):
1113
orders = DjangoFilterConnectionField(OrderType)
1214
order = graphene.Field(OrderType, id=graphene.Int(required=True))
15+
order_invoice = graphene.Field(OrderInvoiceType, order_id=graphene.Int(required=True))
16+
order_invoices = DjangoFilterConnectionField(OrderInvoiceType)
1317

1418

1519

@@ -24,4 +28,25 @@ def resolve_order(self, info, id):
2428
except Order.DoesNotExist:
2529
raise Exception("Order not found")
2630

31+
return order
32+
33+
34+
@gql_store_admin_required
35+
def resolve_order_invoice(self, info, order_id):
36+
order = Order.objects.select_related(
37+
'billing_address', 'shipping_address'
38+
).prefetch_related(
39+
'line_items__variant'
40+
).get(id=order_id)
41+
42+
return order
43+
44+
@gql_store_admin_required
45+
def resolve_order_invoices(self, info, **kwargs):
46+
order = Order.objects.select_related(
47+
'billing_address', 'shipping_address'
48+
).prefetch_related(
49+
'line_items__variant'
50+
).all()
51+
2752
return order

nxtbn/order/admin_types.py

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
from django.conf import settings
12
import graphene
23
from graphene_django import DjangoObjectType
34
from graphene import relay
4-
from nxtbn.order.models import Address, Order
5+
from nxtbn.core.models import SiteSettings
6+
from nxtbn.order.models import Address, Order, OrderLineItem
57

68
from nxtbn.order.admin_filters import OrderFilter
79

@@ -58,4 +60,65 @@ class Meta:
5860
'comment',
5961
)
6062
interfaces = (relay.Node,)
63+
filterset_class = OrderFilter
64+
65+
66+
67+
class OrderInvoiceLineItemType(DjangoObjectType):
68+
total_price = graphene.String()
69+
price_per_unit = graphene.String()
70+
name = graphene.String()
71+
72+
class Meta:
73+
model = OrderLineItem
74+
fields = ['id', 'quantity']
75+
76+
def resolve_total_price(self, info):
77+
return self.humanize_total_price()
78+
79+
def resolve_price_per_unit(self, info):
80+
return self.humanize_price_per_unit()
81+
82+
def resolve_name(self, info):
83+
return self.variant.get_descriptive_name_minimal()
84+
85+
class OrderInvoiceType(DjangoObjectType):
86+
db_id = graphene.Int(source='id')
87+
humanize_total_price = graphene.String()
88+
items = graphene.List(OrderInvoiceLineItemType)
89+
total_price = graphene.String()
90+
91+
def resolve_humanize_total_price(self, info):
92+
return self.humanize_total_price()
93+
94+
def resolve_items(self, info):
95+
return self.line_items.all()
96+
97+
def resolve_total_price(self, info):
98+
return self.humanize_total_price()
99+
100+
class Meta:
101+
model = Order
102+
fields = (
103+
'alias',
104+
'id',
105+
'status',
106+
'shipping_address',
107+
'billing_address',
108+
'created_at',
109+
'total_price_without_tax',
110+
'total_shipping_cost',
111+
'total_discounted_amount',
112+
'total_tax',
113+
'customer_currency',
114+
'currency_conversion_rate',
115+
'authorize_status',
116+
'charge_status',
117+
'payment_term',
118+
'due_date',
119+
'preferred_payment_method',
120+
'reservation_status',
121+
'note',
122+
)
123+
interfaces = (relay.Node,)
61124
filterset_class = OrderFilter

0 commit comments

Comments
 (0)