Skip to content

Commit d79268e

Browse files
Merge pull request #379 from MySecondLanguage/optimized-permission
Optimized permission
2 parents 90a04ea + 9d93b44 commit d79268e

File tree

10 files changed

+112
-1
lines changed

10 files changed

+112
-1
lines changed

nxtbn/core/api/dashboard/views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
from rest_framework import serializers
2727

2828
from nxtbn.core import LanguageChoices
29+
from nxtbn.core.admin_permissions import GranularPermission, IsStoreAdmin, IsStoreStaff
2930
from nxtbn.core.api.dashboard.serializers import InvoiceSettingsSerializer, SiteSettingsSerializer
3031
from nxtbn.core.models import InvoiceSettings, SiteSettings
3132
from nxtbn.users import UserRole
3233

3334

3435

3536
class SiteSettingsView(generics.RetrieveUpdateAPIView):
37+
permission_classes = (IsStoreAdmin,)
3638
queryset = SiteSettings.objects.all()
3739
serializer_class = SiteSettingsSerializer
3840

@@ -49,6 +51,7 @@ def get_object(self):
4951

5052

5153
class InvoiceSettingsView(generics.RetrieveUpdateAPIView):
54+
permission_classes = (IsStoreAdmin,)
5255
queryset = InvoiceSettings.objects.all()
5356
serializer_class = InvoiceSettingsSerializer
5457

@@ -64,6 +67,7 @@ def get_object(self):
6467

6568

6669
class LanguageChoicesAPIView(APIView):
70+
permission_classes = (IsStoreStaff,)
6771
def get(self, request, *args, **kwargs):
6872
languages = [
6973
{"value": lang_value, "label": lang_label}

nxtbn/core/enum_perms.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,12 @@ class PermissionsEnum(models.TextChoices):
88
CAN_PROCCSS_ORDER = "can_process_order"
99
CAN_DELIVER_ORDER = "can_deliver_order"
1010
CAN_UPDATE_ORDER_PYMENT_TERM = "can_update_order_payment_term"
11-
CAN_UPDATE_ORDER_PAYMENT_METHOD = "can_update_order_payment_method"
11+
CAN_UPDATE_ORDER_PAYMENT_METHOD = "can_update_order_payment_method"
12+
13+
CAN_INITIATE_PAYMENT_REFUND = "CAN_INITIATE_PAYMENT_REFUND"
14+
15+
CAN_BULK_PRODUCT_STATUS_UPDATE = "can_bulk_product_status_update"
16+
CAN_BULK_PRODUCT_DELETE = "can_bulk_product_delete"
17+
18+
CAN_READ_CUSTOMER = "can_read_customer"
19+
CAN_UPDATE_CUSTOMER = "can_create_customer"

nxtbn/discount/api/dashboard/views.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from rest_framework import generics, viewsets
22
from rest_framework.response import Response
33
from rest_framework import status
4+
from nxtbn.core.admin_permissions import CommonPermissions
45
from nxtbn.core.paginator import NxtbnPagination
56
from nxtbn.discount.models import PromoCode, PromoCodeCustomer, PromoCodeProduct, PromoCodeUsage
67
from nxtbn.discount.api.dashboard.serializers import AttachPromoCodeEntitiesSerializer, PromoCodeCustomerSerializer, PromoCodeProductSerializer, PromoCodeCountedSerializer, PromoCodeUsageSerializer
@@ -50,18 +51,24 @@ def get_queryset(self):
5051
return PromoCode.objects.all()
5152

5253
class PromoCodeListCreateAPIView(PromocodeFilterMixin, generics.ListCreateAPIView):
54+
permission_classes = (CommonPermissions, )
55+
model = PromoCode
5356
pagination_class = NxtbnPagination
5457
queryset = PromoCode.objects.all()
5558
serializer_class = PromoCodeCountedSerializer
5659

5760

5861
class PromoCodeUpdateRetrieveDeleteView(generics.RetrieveUpdateDestroyAPIView):
62+
permission_classes = (CommonPermissions, )
63+
model = PromoCode
5964
queryset = PromoCode.objects.all()
6065
serializer_class = PromoCodeCountedSerializer
6166
lookup_field = 'id'
6267

6368

6469
class AttachPromoCodeEntitiesAPIView(generics.CreateAPIView):
70+
permission_classes = (CommonPermissions, )
71+
model = PromoCode
6572
serializer_class = AttachPromoCodeEntitiesSerializer
6673

6774
def create(self, request, *args, **kwargs):
@@ -81,6 +88,8 @@ class Meta:
8188
model = PromoCodeProduct
8289
fields = ['promo_code']
8390
class PromoCodeProductListAPIView(generics.ListAPIView):
91+
permission_classes = (CommonPermissions, )
92+
model = PromoCodeProduct
8493
queryset = PromoCodeProduct.objects.all()
8594
serializer_class = PromoCodeProductSerializer
8695
filter_backends = [
@@ -98,6 +107,8 @@ class Meta:
98107
model = PromoCodeCustomer
99108
fields = ['promo_code']
100109
class PromoCodeCustomertListAPIView(generics.ListAPIView):
110+
permission_classes = (CommonPermissions, )
111+
model = PromoCodeCustomer
101112
queryset = PromoCodeCustomer.objects.all()
102113
serializer_class = PromoCodeCustomerSerializer
103114
filter_backends = [
@@ -111,6 +122,8 @@ class PromoCodeCustomertListAPIView(generics.ListAPIView):
111122

112123

113124
class PromoCodeUsageListAPIView(generics.ListAPIView):
125+
permission_classes = (CommonPermissions, )
126+
model = PromoCodeUsage
114127
queryset = PromoCodeUsage.objects.all()
115128
serializer_class = PromoCodeUsageSerializer
116129
pagination_class = NxtbnPagination

nxtbn/invoice/api/dashboard/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
from rest_framework.permissions import AllowAny
55
from rest_framework.exceptions import APIException
66

7+
from nxtbn.core.admin_permissions import IsStoreStaff
78
from nxtbn.invoice.api.dashboard.serializers import OrderInvoiceSerializer
89
from nxtbn.order.models import Order
910
from nxtbn.users import UserRole
1011

1112

1213
class OrderInvoiceAPIView(generics.RetrieveAPIView):
14+
permission_classes = (IsStoreStaff,)
1315
queryset = Order.objects.all()
1416
serializer_class = OrderInvoiceSerializer
1517
lookup_field = 'alias'

nxtbn/payment/api/dashboard/views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@
55
from rest_framework.permissions import AllowAny
66
from rest_framework.exceptions import APIException
77

8+
from nxtbn.core.admin_permissions import CommonPermissions, GranularPermission
9+
from nxtbn.core.enum_perms import PermissionsEnum
810
from nxtbn.payment.models import Payment
911
from nxtbn.payment.api.dashboard.serializers import PaymentCreateSerializer, RefundSerializer
1012
from nxtbn.users import UserRole
1113

1214
class RefundAPIView(generics.UpdateAPIView):
15+
permission_classes = (GranularPermission, )
16+
model = Payment
17+
required_perm = PermissionsEnum.CAN_INITIATE_PAYMENT_REFUND
18+
1319
queryset = Payment.objects.all()
1420
serializer_class = RefundSerializer
1521

@@ -19,5 +25,6 @@ def get_object(self):
1925
return get_object_or_404(Payment, order__alias=order_alias)
2026

2127
class PaymentCreateAPIView(generics.CreateAPIView):
28+
permission_classes = (CommonPermissions, )
2229
queryset = Payment.objects.all()
2330
serializer_class = PaymentCreateSerializer

nxtbn/payment/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from django. utils import timezone
33

44
from nxtbn.core import CurrencyTypes, MoneyFieldTypes
5+
from nxtbn.core.enum_perms import PermissionsEnum
56
from nxtbn.core.mixin import MonetaryMixin
67
from nxtbn.core.models import AbstractBaseUUIDModel
78
from nxtbn.order import OrderStatus
@@ -60,6 +61,11 @@ class Payment(MonetaryMixin, AbstractBaseUUIDModel):
6061
payment_plugin_id = models.CharField(max_length=100, blank=True, null=True)
6162
gateway_name = models.CharField(max_length=100, blank=True, null=True)
6263

64+
class Meta:
65+
permissions = [
66+
(PermissionsEnum.CAN_INITIATE_PAYMENT_REFUND, "Can initiate refunds"),
67+
]
68+
6369
def save(self, *args, **kwargs):
6470
self.validate_amount()
6571
super(Payment, self).save(*args, **kwargs)

nxtbn/plugins/api/dashboard/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from django.forms import ValidationError
1313
import requests
14+
from nxtbn.core.admin_permissions import IsStoreAdmin
1415
from nxtbn.plugins.utils import PluginHandler
1516
from rest_framework import generics, status
1617
from rest_framework.response import Response
@@ -39,6 +40,7 @@
3940

4041

4142
class PluginListView(APIView):
43+
permission_classes = (IsStoreAdmin,)
4244
serializer_class = PluginSerializer
4345
HTTP_PERMISSIONS = {
4446
UserRole.STORE_MANAGER: {"get"},

nxtbn/product/api/dashboard/views.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
from django_filters import rest_framework as filters
1515

1616
from nxtbn.core import PublishableStatus
17+
from nxtbn.core.admin_permissions import CommonPermissions, GranularPermission
18+
from nxtbn.core.enum_perms import PermissionsEnum
1719
from nxtbn.core.paginator import NxtbnPagination
1820
from nxtbn.product.models import CategoryTranslation, CollectionTranslation, Color, Product, Category, Collection, ProductTag, ProductTagTranslation, ProductTranslation, ProductType, ProductVariant, Supplier, SupplierTranslation
1921
from nxtbn.product.api.dashboard.serializers import (
@@ -111,6 +113,8 @@ def get_queryset(self):
111113
return Product.objects.all().order_by('-created_at')
112114

113115
class ProductListView(ProductFilterMixin, generics.ListCreateAPIView):
116+
permission_classes = (CommonPermissions, )
117+
model = Product
114118
serializer_class = ProductSerializer
115119
pagination_class = NxtbnPagination
116120

@@ -120,6 +124,8 @@ def get_serializer_class(self):
120124
return ProductSerializer
121125

122126
class ProductMinimalListView(ProductFilterMixin, generics.ListAPIView):
127+
permission_classes = (CommonPermissions, )
128+
model = Product
123129
serializer_class = ProductMinimalSerializer
124130
pagination_class = None
125131

@@ -136,6 +142,8 @@ def get(self, request, *args, **kwargs):
136142

137143

138144
class ProductListDetailVariantView(ProductFilterMixin, generics.ListAPIView):
145+
permission_classes = (CommonPermissions, )
146+
model = Product
139147
serializer_class = ProductWithVariantSerializer
140148
pagination_class = NxtbnPagination
141149

@@ -146,28 +154,38 @@ def get_queryset(self):
146154

147155

148156
class ProductDetailView(generics.RetrieveUpdateDestroyAPIView):
157+
permission_classes = (CommonPermissions, )
158+
model = Product
149159
queryset = Product.objects.all()
150160
serializer_class = ProductMutationSerializer
151161
lookup_field = 'id'
152162

153163

154164
class ProductWithVariantView(generics.RetrieveAPIView):
165+
permission_classes = (CommonPermissions, )
166+
model = Product
155167
queryset = Product.objects.all()
156168
serializer_class = ProductWithVariantSerializer
157169
lookup_field = 'id'
158170

159171

160172
class CategoryListView(generics.ListCreateAPIView):
173+
permission_classes = (CommonPermissions, )
174+
model = Category
161175
queryset = Category.objects.filter()
162176
serializer_class = CategorySerializer
163177

164178

165179
class RecursiveCategoryListView(generics.ListCreateAPIView):
180+
permission_classes = (CommonPermissions, )
181+
model = Category
166182
queryset = Category.objects.filter(parent=None) # Get only top-level categories
167183
serializer_class = RecursiveCategorySerializer
168184
pagination_class = None
169185

170186
class CategoryByParentView(generics.ListAPIView):
187+
permission_classes = (CommonPermissions, )
188+
model = Category
171189
pagination_class = None
172190
queryset = Category.objects.all()
173191
serializer_class = BasicCategorySerializer
@@ -176,13 +194,17 @@ def get_queryset(self):
176194
return super().get_queryset().filter(parent=self.kwargs.get('id'))
177195

178196
class CategoryDetailView(generics.RetrieveUpdateDestroyAPIView):
197+
permission_classes = (CommonPermissions, )
198+
model = Category
179199
queryset = Category.objects.all()
180200
serializer_class = CategorySerializer
181201
lookup_field = 'id'
182202

183203

184204

185205
class CollectionViewSet(viewsets.ModelViewSet):
206+
permission_classes = (CommonPermissions, )
207+
model = Collection
186208
pagination_class = None
187209
queryset = Collection.objects.all()
188210
serializer_class = CollectionSerializer
@@ -193,6 +215,8 @@ def get_queryset(self):
193215
return Collection.objects.all()
194216

195217
class ColorViewSet(viewsets.ModelViewSet):
218+
permission_classes = (CommonPermissions, )
219+
model = Color
196220
pagination_class = None
197221
queryset = Color.objects.all()
198222
serializer_class = ColorSerializer
@@ -204,6 +228,8 @@ def get_queryset(self):
204228

205229

206230
class ProductTypeViewSet(viewsets.ModelViewSet):
231+
permission_classes = (CommonPermissions, )
232+
model = ProductType
207233
pagination_class = None
208234
queryset = ProductType.objects.all()
209235
serializer_class = ProductTypeSerializer
@@ -214,6 +240,8 @@ def get_queryset(self):
214240

215241

216242
class ProductTagViewSet(viewsets.ModelViewSet):
243+
permission_classes = (CommonPermissions, )
244+
model = ProductTag
217245
pagination_class = None
218246
queryset = ProductTag.objects.all()
219247
serializer_class = ProductTagSerializer
@@ -230,6 +258,8 @@ def list(self, request, *args, **kwargs):
230258

231259

232260
class ProductVariantDeleteAPIView(generics.DestroyAPIView):
261+
permission_classes = (CommonPermissions, )
262+
model = ProductVariant
233263
queryset = ProductVariant.objects.all()
234264

235265
def destroy(self, request, *args, **kwargs):
@@ -243,13 +273,18 @@ def destroy(self, request, *args, **kwargs):
243273

244274

245275
class TaxClassView(generics.ListCreateAPIView):
276+
permission_classes = (CommonPermissions, )
277+
model = TaxClass
246278
queryset = TaxClass.objects.all()
247279
serializer_class = TaxClassSerializer
248280
pagination_class = None
249281

250282

251283

252284
class BulkProductStatusUpdateAPIView(generics.UpdateAPIView):
285+
permission_classes = (GranularPermission, )
286+
model = Product
287+
required_perm = PermissionsEnum.CAN_BULK_PRODUCT_STATUS_UPDATE
253288
serializer_class = ProductStatusUpdateBulkSerializer
254289

255290
def update(self, request, *args, **kwargs):
@@ -264,6 +299,9 @@ def update(self, request, *args, **kwargs):
264299

265300

266301
class BulkProductDeleteAPIView(generics.DestroyAPIView):
302+
permission_classes = (GranularPermission, )
303+
model = Product
304+
required_perm = PermissionsEnum.CAN_BULK_PRODUCT_DELETE
267305
queryset = Product.objects.all()
268306

269307

@@ -311,6 +349,8 @@ class ProductVariantFilterMixin:
311349
filterset_class = ProductVariantFilter
312350

313351
class ProductVariants(ProductVariantFilterMixin, generics.ListAPIView):
352+
permission_classes = (CommonPermissions, )
353+
model = ProductVariant
314354
serializer_class = ProductVariantShortSerializer
315355
queryset = ProductVariant.objects.all()
316356
pagination_class = NxtbnPagination
@@ -331,12 +371,16 @@ class ProductVariants(ProductVariantFilterMixin, generics.ListAPIView):
331371

332372

333373
class InventoryListView(ProductFilterMixin, generics.ListCreateAPIView):
374+
permission_classes = (CommonPermissions, )
375+
model = ProductVariant
334376
serializer_class = InventorySerializer
335377
pagination_class = NxtbnPagination
336378

337379

338380

339381
class SupplierModelViewSet(viewsets.ModelViewSet):
382+
permission_classes = (CommonPermissions, )
383+
model = Supplier
340384
serializer_class = SupplierSerializer
341385
queryset = Supplier.objects.all()
342386
pagination_class = NxtbnPagination

0 commit comments

Comments
 (0)