-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
34 changed files
with
1,381 additions
and
61 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
PUBLIC_GROUP = 'public' | ||
ADMIN_GROUP = 'admin' |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,99 @@ | ||
from rest_framework.viewsets import GenericViewSet | ||
from rest_framework import mixins | ||
from common.serializers.mixins import DictMixinSerializer | ||
from common.constants import roles | ||
|
||
class ExtendedGenericViewSet(GenericViewSet): | ||
class ExtendedView: | ||
multi_permission_classes = None | ||
multi_serializer_class = None | ||
request = None | ||
|
||
def get_serializer_class(self): | ||
assert self.serializer_class or self.multi_serializer_class, ( | ||
'"%s" should either include `serializer_class`,' | ||
'`multi_serializer_class`, attributem, or override the ' | ||
'`get_serializer_class()` method.' % self.__class__.__name__ | ||
) | ||
if not self.multi_serializer_class: | ||
return self.serializer_class | ||
|
||
user = self.request.user | ||
if user.is_anonymous: | ||
user_roles = (roles.PUBLIC_GROUP,) | ||
elif user.is_superuser: | ||
user_roles = (roles.ADMIN_GROUP,) | ||
else: | ||
user_roles = set(user.groups.all()).values_list('code', flat=True) | ||
|
||
if hasattr(self, 'action') and self.action: | ||
action = self.action | ||
else: | ||
action = self.request.method | ||
|
||
# Trying to get role + action serializer | ||
for role in user_roles: | ||
serializer_key = f'{role}__{action}' | ||
if self.multi_serializer_class.get(serializer_key): | ||
return self.multi_serializer_class.get(serializer_key) | ||
|
||
# Trying to get role serializer | ||
for role in user_roles: | ||
serializer_key = role | ||
if self.multi_serializer_class.get(serializer_key): | ||
return self.multi_serializer_class.get(serializer_key) | ||
|
||
# Trying to get action serializer or default | ||
return self.multi_serializer_class.get(action) or self.serializer_class | ||
|
||
def get_permissions(self): | ||
# define request action or method | ||
if hasattr(self, 'action'): | ||
action = self.action | ||
else: | ||
action = self.request.method | ||
|
||
if self.multi_permission_classes: | ||
permissions = self.multi_permission_classes.get(action) | ||
if permissions: | ||
return [permission() for permission in permissions] | ||
|
||
return [permission() for permission in self.permission_classes] | ||
|
||
class ExtendedGenericViewSet(ExtendedView, GenericViewSet): | ||
pass | ||
|
||
class ListViewSet(ExtendedGenericViewSet, mixins.ListModelMixin): | ||
pass | ||
|
||
class UpdateViewSet(ExtendedGenericViewSet, mixins.UpdateModelMixin): | ||
pass | ||
|
||
class DictListMixin(ListViewSet): | ||
serializer_class = DictMixinSerializer | ||
pagination_class = None | ||
model = None | ||
|
||
def get_queryset(self): | ||
assert self.model, ( | ||
'"%s" should either include attribute `model`' % self.__class__.__name__ | ||
) | ||
return self.model.objects.filter(is_active=True) | ||
|
||
|
||
class CRUViewSet(ExtendedGenericViewSet, | ||
mixins.CreateModelMixin, | ||
mixins.RetrieveModelMixin, | ||
mixins.UpdateModelMixin, | ||
mixins.DestroyModelMixin, | ||
mixins.ListModelMixin,): | ||
pass | ||
|
||
class CRUDViewSet(CRUViewSet, | ||
mixins.DestroyModelMixin,): | ||
pass | ||
|
||
class ListCreateUpdateViewSet(ExtendedGenericViewSet, | ||
mixins.ListModelMixin, | ||
mixins.CreateModelMixin, | ||
mixins.UpdateModelMixin,): | ||
pass | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
from django.db.models import Q | ||
from rest_framework.filters import BaseFilterBackend | ||
|
||
############################################################# | ||
# Пользовательская общая фильтрация | ||
############################################################# | ||
|
||
class OwnedByOrganisation(BaseFilterBackend): | ||
def filter_queryset(self, request, queryset, view): | ||
org_id = request.parser_context['kwargs'].get('pk') | ||
return queryset.filter(organisation_id=org_id) | ||
|
||
|
||
class MyOrganisation(BaseFilterBackend): | ||
def filter_queryset(self, request, queryset, view): | ||
user = request.user | ||
return queryset.filter( | ||
Q(director=user) | Q(employees=user) | ||
) | ||
|
||
|
||
class MyGroup(BaseFilterBackend): | ||
def filter_queryset(self, request, queryset, view): | ||
user = request.user | ||
return queryset.filter( | ||
Q(organisation__director=user) | Q(organisation__employees=user) | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
DIRECTOR_POSITION = '1' | ||
MANAGER_POSITION = '2' | ||
OPERATOR_POSITION = '3' |
Oops, something went wrong.