mirror of
https://github.com/inventree/InvenTree.git
synced 2025-05-02 05:26:45 +00:00
Use better introspection, no longer required "role_required"
This commit is contained in:
parent
0f6cdd0037
commit
6e3cb326fb
@ -60,28 +60,12 @@ class RolePermission(permissions.BasePermission):
|
|||||||
|
|
||||||
permission = rolemap[request.method]
|
permission = rolemap[request.method]
|
||||||
|
|
||||||
role = getattr(view, 'role_required', None)
|
# Extract the model name associated with this request
|
||||||
|
model = view.serializer_class.Meta.model
|
||||||
|
|
||||||
if not role:
|
# And the specific database table
|
||||||
# Role not specified - allow access
|
table = model._meta.db_table
|
||||||
return True
|
|
||||||
|
|
||||||
roles = []
|
result = users.models.RuleSet.check_table_permission(user, table, permission)
|
||||||
|
|
||||||
if type(role) is str:
|
return result
|
||||||
roles = [role]
|
|
||||||
elif type(role) in [list, tuple]:
|
|
||||||
roles = role
|
|
||||||
else:
|
|
||||||
raise TypeError(f"'role_required' is of incorrect type ({type(role)}) for view {type(view).__name__}")
|
|
||||||
|
|
||||||
for role in roles:
|
|
||||||
|
|
||||||
if role not in users.models.RuleSet.RULESET_NAMES:
|
|
||||||
raise ValueError(f"Role '{role}' is not a valid role")
|
|
||||||
|
|
||||||
if not users.models.check_user_role(user, role, permission):
|
|
||||||
return False
|
|
||||||
|
|
||||||
# All checks passed
|
|
||||||
return True
|
|
||||||
|
@ -48,8 +48,6 @@ class PartCategoryTree(TreeSerializer):
|
|||||||
def get_items(self):
|
def get_items(self):
|
||||||
return PartCategory.objects.all().prefetch_related('parts', 'children')
|
return PartCategory.objects.all().prefetch_related('parts', 'children')
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
|
|
||||||
class CategoryList(generics.ListCreateAPIView):
|
class CategoryList(generics.ListCreateAPIView):
|
||||||
""" API endpoint for accessing a list of PartCategory objects.
|
""" API endpoint for accessing a list of PartCategory objects.
|
||||||
@ -106,16 +104,12 @@ class CategoryList(generics.ListCreateAPIView):
|
|||||||
'description',
|
'description',
|
||||||
]
|
]
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
|
|
||||||
class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
class CategoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
""" API endpoint for detail view of a single PartCategory object """
|
""" API endpoint for detail view of a single PartCategory object """
|
||||||
serializer_class = part_serializers.CategorySerializer
|
serializer_class = part_serializers.CategorySerializer
|
||||||
queryset = PartCategory.objects.all()
|
queryset = PartCategory.objects.all()
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
|
|
||||||
class CategoryParameters(generics.ListAPIView):
|
class CategoryParameters(generics.ListAPIView):
|
||||||
""" API endpoint for accessing a list of PartCategoryParameterTemplate objects.
|
""" API endpoint for accessing a list of PartCategoryParameterTemplate objects.
|
||||||
@ -126,8 +120,6 @@ class CategoryParameters(generics.ListAPIView):
|
|||||||
queryset = PartCategoryParameterTemplate.objects.all()
|
queryset = PartCategoryParameterTemplate.objects.all()
|
||||||
serializer_class = part_serializers.CategoryParameterTemplateSerializer
|
serializer_class = part_serializers.CategoryParameterTemplateSerializer
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""
|
"""
|
||||||
Custom filtering:
|
Custom filtering:
|
||||||
@ -172,8 +164,6 @@ class PartSalePriceList(generics.ListCreateAPIView):
|
|||||||
queryset = PartSellPriceBreak.objects.all()
|
queryset = PartSellPriceBreak.objects.all()
|
||||||
serializer_class = part_serializers.PartSalePriceSerializer
|
serializer_class = part_serializers.PartSalePriceSerializer
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
filter_backends = [
|
filter_backends = [
|
||||||
DjangoFilterBackend
|
DjangoFilterBackend
|
||||||
]
|
]
|
||||||
@ -191,8 +181,6 @@ class PartAttachmentList(generics.ListCreateAPIView, AttachmentMixin):
|
|||||||
queryset = PartAttachment.objects.all()
|
queryset = PartAttachment.objects.all()
|
||||||
serializer_class = part_serializers.PartAttachmentSerializer
|
serializer_class = part_serializers.PartAttachmentSerializer
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
filter_backends = [
|
filter_backends = [
|
||||||
DjangoFilterBackend,
|
DjangoFilterBackend,
|
||||||
]
|
]
|
||||||
@ -210,8 +198,6 @@ class PartTestTemplateList(generics.ListCreateAPIView):
|
|||||||
queryset = PartTestTemplate.objects.all()
|
queryset = PartTestTemplate.objects.all()
|
||||||
serializer_class = part_serializers.PartTestTemplateSerializer
|
serializer_class = part_serializers.PartTestTemplateSerializer
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
def filter_queryset(self, queryset):
|
def filter_queryset(self, queryset):
|
||||||
"""
|
"""
|
||||||
Filter the test list queryset.
|
Filter the test list queryset.
|
||||||
@ -253,8 +239,6 @@ class PartThumbs(generics.ListAPIView):
|
|||||||
API endpoint for retrieving information on available Part thumbnails
|
API endpoint for retrieving information on available Part thumbnails
|
||||||
"""
|
"""
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
queryset = Part.objects.all()
|
queryset = Part.objects.all()
|
||||||
serializer_class = part_serializers.PartThumbSerializer
|
serializer_class = part_serializers.PartThumbSerializer
|
||||||
|
|
||||||
@ -291,8 +275,6 @@ class PartThumbsUpdate(generics.RetrieveUpdateAPIView):
|
|||||||
queryset = Part.objects.all()
|
queryset = Part.objects.all()
|
||||||
serializer_class = part_serializers.PartThumbSerializerUpdate
|
serializer_class = part_serializers.PartThumbSerializerUpdate
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
filter_backends = [
|
filter_backends = [
|
||||||
DjangoFilterBackend
|
DjangoFilterBackend
|
||||||
]
|
]
|
||||||
@ -301,8 +283,6 @@ class PartThumbsUpdate(generics.RetrieveUpdateAPIView):
|
|||||||
class PartDetail(generics.RetrieveUpdateDestroyAPIView):
|
class PartDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
""" API endpoint for detail view of a single Part object """
|
""" API endpoint for detail view of a single Part object """
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
queryset = Part.objects.all()
|
queryset = Part.objects.all()
|
||||||
serializer_class = part_serializers.PartSerializer
|
serializer_class = part_serializers.PartSerializer
|
||||||
|
|
||||||
@ -389,8 +369,6 @@ class PartList(generics.ListCreateAPIView):
|
|||||||
|
|
||||||
queryset = Part.objects.all()
|
queryset = Part.objects.all()
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
starred_parts = None
|
starred_parts = None
|
||||||
|
|
||||||
def get_serializer(self, *args, **kwargs):
|
def get_serializer(self, *args, **kwargs):
|
||||||
@ -717,8 +695,6 @@ class PartParameterTemplateList(generics.ListCreateAPIView):
|
|||||||
- POST: Create a new PartParameterTemplate object
|
- POST: Create a new PartParameterTemplate object
|
||||||
"""
|
"""
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
queryset = PartParameterTemplate.objects.all()
|
queryset = PartParameterTemplate.objects.all()
|
||||||
serializer_class = part_serializers.PartParameterTemplateSerializer
|
serializer_class = part_serializers.PartParameterTemplateSerializer
|
||||||
|
|
||||||
@ -738,8 +714,6 @@ class PartParameterList(generics.ListCreateAPIView):
|
|||||||
- POST: Create a new PartParameter object
|
- POST: Create a new PartParameter object
|
||||||
"""
|
"""
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
queryset = PartParameter.objects.all()
|
queryset = PartParameter.objects.all()
|
||||||
serializer_class = part_serializers.PartParameterSerializer
|
serializer_class = part_serializers.PartParameterSerializer
|
||||||
|
|
||||||
@ -760,8 +734,6 @@ class BomList(generics.ListCreateAPIView):
|
|||||||
- POST: Create a new BomItem object
|
- POST: Create a new BomItem object
|
||||||
"""
|
"""
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
serializer_class = part_serializers.BomItemSerializer
|
serializer_class = part_serializers.BomItemSerializer
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
@ -901,8 +873,6 @@ class BomList(generics.ListCreateAPIView):
|
|||||||
class BomDetail(generics.RetrieveUpdateDestroyAPIView):
|
class BomDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
""" API endpoint for detail view of a single BomItem object """
|
""" API endpoint for detail view of a single BomItem object """
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
queryset = BomItem.objects.all()
|
queryset = BomItem.objects.all()
|
||||||
serializer_class = part_serializers.BomItemSerializer
|
serializer_class = part_serializers.BomItemSerializer
|
||||||
|
|
||||||
@ -910,8 +880,6 @@ class BomDetail(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
class BomItemValidate(generics.UpdateAPIView):
|
class BomItemValidate(generics.UpdateAPIView):
|
||||||
""" API endpoint for validating a BomItem """
|
""" API endpoint for validating a BomItem """
|
||||||
|
|
||||||
role_required = 'part'
|
|
||||||
|
|
||||||
# Very simple serializers
|
# Very simple serializers
|
||||||
class BomItemValidationSerializer(serializers.Serializer):
|
class BomItemValidationSerializer(serializers.Serializer):
|
||||||
|
|
||||||
|
@ -166,6 +166,25 @@ class RuleSet(models.Model):
|
|||||||
|
|
||||||
can_delete = models.BooleanField(verbose_name=_('Delete'), default=False, help_text=_('Permission to delete items'))
|
can_delete = models.BooleanField(verbose_name=_('Delete'), default=False, help_text=_('Permission to delete items'))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def check_table_permission(cls, user, table, permission):
|
||||||
|
"""
|
||||||
|
Check if the provided user has the specified permission against the table
|
||||||
|
"""
|
||||||
|
|
||||||
|
# If the table does *not* require permissions
|
||||||
|
if table in cls.RULESET_IGNORE:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Work out which roles touch the given table
|
||||||
|
for role in cls.RULESET_NAMES:
|
||||||
|
if table in cls.RULESET_MODELS[role]:
|
||||||
|
|
||||||
|
if check_user_role(user, role, permission):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_model_permission_string(model, permission):
|
def get_model_permission_string(model, permission):
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user