modified role model
This commit is contained in:
parent
36c4641ed0
commit
38a6508396
|
|
@ -7,14 +7,14 @@ from account import models
|
|||
|
||||
@admin.register(models.Role)
|
||||
class RoleAdmin(admin.ModelAdmin):
|
||||
list_display = ['id', 'role', 'country']
|
||||
raw_id_fields = ['country', ]
|
||||
list_display = ['id', 'role', 'country', 'establishment_subtype', ]
|
||||
raw_id_fields = ['country', 'establishment_subtype', ]
|
||||
|
||||
|
||||
@admin.register(models.UserRole)
|
||||
class UserRoleAdmin(admin.ModelAdmin):
|
||||
list_display = ['user', 'role', 'establishment', ]
|
||||
raw_id_fields = ['user', 'role', 'establishment', 'requester', ]
|
||||
list_display = ['user', 'role', ]
|
||||
raw_id_fields = ['user', 'role', 'requester', 'establishment', ]
|
||||
|
||||
|
||||
@admin.register(models.User)
|
||||
|
|
|
|||
|
|
@ -49,8 +49,9 @@ class Role(ProjectBaseMixin):
|
|||
SALES_MAN = 8
|
||||
WINERY_REVIEWER = 9 # Establishments subtype "winery"
|
||||
SELLER = 10
|
||||
LIQUOR_REVIEWER = 11
|
||||
DISTILLERY_LIQUOR_INSPECTOR = 11
|
||||
PRODUCT_REVIEWER = 12
|
||||
ESTABLISHMENT_ADMINISTRATOR = 13
|
||||
|
||||
ROLE_CHOICES = (
|
||||
(STANDARD_USER, _('Standard user')),
|
||||
|
|
@ -63,10 +64,21 @@ class Role(ProjectBaseMixin):
|
|||
(SALES_MAN, _('Sales man')),
|
||||
(WINERY_REVIEWER, _('Winery reviewer')),
|
||||
(SELLER, _('Seller')),
|
||||
(LIQUOR_REVIEWER, _('Liquor reviewer')),
|
||||
(DISTILLERY_LIQUOR_INSPECTOR, _('Distillery & Liquor inspector')),
|
||||
(PRODUCT_REVIEWER, _('Product reviewer')),
|
||||
(ESTABLISHMENT_ADMINISTRATOR, _('Establishment administrator')),
|
||||
)
|
||||
|
||||
ESTABLISHMENT_EDITORS = [
|
||||
COUNTRY_ADMIN,
|
||||
ESTABLISHMENT_MANAGER,
|
||||
ESTABLISHMENT_ADMINISTRATOR,
|
||||
]
|
||||
|
||||
PRODUCT_EDITORS = ESTABLISHMENT_EDITORS + [
|
||||
DISTILLERY_LIQUOR_INSPECTOR
|
||||
]
|
||||
|
||||
role = models.PositiveIntegerField(verbose_name=_('Role'), choices=ROLE_CHOICES,
|
||||
null=False, blank=False)
|
||||
country = models.ForeignKey(Country, verbose_name=_('Country'),
|
||||
|
|
@ -480,6 +492,18 @@ class UserRoleQueryset(models.QuerySet):
|
|||
})
|
||||
return role_counter
|
||||
|
||||
def validated(self):
|
||||
"""Filter QuerySet by state."""
|
||||
return self.filter(state=self.model.VALIDATED)
|
||||
|
||||
def establishment_editors(self):
|
||||
"""Return QuerySet filtered by role and state."""
|
||||
return self.validated().filter(role__role__in=Role.ESTABLISHMENT_EDITORS)
|
||||
|
||||
def product_editors(self):
|
||||
"""Return QuerySet filtered by role and state."""
|
||||
return self.validated().filter(role__role__in=Role.PRODUCT_EDITORS)
|
||||
|
||||
|
||||
class UserRole(ProjectBaseMixin):
|
||||
"""UserRole model."""
|
||||
|
|
|
|||
|
|
@ -514,6 +514,29 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
to_attr='main_image')
|
||||
)
|
||||
|
||||
def available_establishments(self, user, country_code: str = None):
|
||||
"""Return QuerySet with establishment that is available for editing."""
|
||||
from account.models import UserRole
|
||||
|
||||
available_ids = Subquery(
|
||||
UserRole.objects.filter(user=user)
|
||||
.distinct('user', 'establishment')
|
||||
.values_list('establishment', flat=True)
|
||||
)
|
||||
|
||||
filters = {}
|
||||
|
||||
if country_code:
|
||||
filters.update({'address__city__country__code': country_code,
|
||||
'id__in': available_ids})
|
||||
return self.filter(**filters)
|
||||
|
||||
def available_objects(self, user, country_code: str = None):
|
||||
access_roles = user.userrole_set.establishment_editors()
|
||||
if access_roles.exists():
|
||||
return self.available_establishments(user, country_code)
|
||||
return self.none()
|
||||
|
||||
|
||||
class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin,
|
||||
TranslatedFieldsMixin, HasTagsMixin, FavoritesMixin):
|
||||
|
|
@ -767,13 +790,6 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin,
|
|||
"""
|
||||
return self.address.country_id if hasattr(self.address, 'country_id') else None
|
||||
|
||||
@property
|
||||
def establishment_id(self):
|
||||
"""
|
||||
Return establishment id of establishment location
|
||||
"""
|
||||
return self.id
|
||||
|
||||
@property
|
||||
def wines(self):
|
||||
"""Return list products with type wine"""
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
"""Establishment app views."""
|
||||
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from rest_framework import generics, permissions, status
|
||||
|
|
@ -10,7 +9,9 @@ from establishment import filters, models, serializers
|
|||
from establishment.models import EstablishmentEmployee
|
||||
from timetable.models import Timetable
|
||||
from timetable.serialziers import ScheduleCreateSerializer, ScheduleRUDSerializer
|
||||
from utils.permissions import IsCountryAdmin, IsEstablishmentManager, IsWineryReviewer
|
||||
from utils.permissions import (
|
||||
IsCountryAdmin, IsEstablishmentManager,
|
||||
IsWineryReviewer, IsEstablishmentAdministrator)
|
||||
from utils.views import CreateDestroyGalleryViewMixin
|
||||
|
||||
|
||||
|
|
@ -18,7 +19,7 @@ class EstablishmentMixinViews:
|
|||
"""Establishment mixin."""
|
||||
|
||||
def get_queryset(self):
|
||||
"""Overrided method 'get_queryset'."""
|
||||
"""Overridden method 'get_queryset'."""
|
||||
return models.Establishment.objects.with_base_related()
|
||||
|
||||
|
||||
|
|
@ -27,10 +28,20 @@ class EstablishmentListCreateView(EstablishmentMixinViews, generics.ListCreateAP
|
|||
|
||||
filter_class = filters.EstablishmentFilter
|
||||
|
||||
permission_classes = [IsWineryReviewer | IsCountryAdmin | IsEstablishmentManager]
|
||||
permission_classes = [
|
||||
IsWineryReviewer |
|
||||
IsCountryAdmin |
|
||||
IsEstablishmentManager |
|
||||
IsEstablishmentAdministrator
|
||||
]
|
||||
queryset = models.Establishment.objects.all()
|
||||
serializer_class = serializers.EstablishmentListCreateSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
"""Overridden get_queryset method."""
|
||||
qs = super(EstablishmentListCreateView, self).get_queryset()
|
||||
return qs.available_objects(self.request.user, self.request.country_code)
|
||||
|
||||
|
||||
class EmployeeEstablishmentsListView(generics.ListAPIView):
|
||||
"""Establishment by employee list view."""
|
||||
|
|
@ -52,7 +63,12 @@ class EstablishmentRUDView(generics.RetrieveUpdateDestroyAPIView):
|
|||
'establishmentemployee_set__establishment',
|
||||
)
|
||||
serializer_class = serializers.EstablishmentRUDSerializer
|
||||
permission_classes = [IsWineryReviewer | IsCountryAdmin | IsEstablishmentManager]
|
||||
permission_classes = [
|
||||
IsWineryReviewer |
|
||||
IsCountryAdmin |
|
||||
IsEstablishmentManager |
|
||||
IsEstablishmentAdministrator
|
||||
]
|
||||
|
||||
|
||||
class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator
|
|||
from django.db import models
|
||||
from django.db.models import Case, When, F
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.db.models import Subquery
|
||||
|
||||
from location.models import WineOriginAddressMixin
|
||||
from review.models import Review
|
||||
|
|
@ -227,6 +228,23 @@ class ProductQuerySet(models.QuerySet):
|
|||
.distinct(*similarity_rules['distinction'],
|
||||
'id')
|
||||
|
||||
def available_products(self, user):
|
||||
"""Return QuerySet with products that is available for editing."""
|
||||
from account.models import UserRole
|
||||
|
||||
available_ids = Subquery(
|
||||
UserRole.objects.filter(user=user)
|
||||
.distinct('user', 'establishment')
|
||||
.values_list('establishment__products', flat=True)
|
||||
)
|
||||
return self.filter(id__in=available_ids)
|
||||
|
||||
def available_objects(self, user):
|
||||
access_roles = user.userrole_set.product_editors()
|
||||
if access_roles.exists():
|
||||
return self.available_products(user)
|
||||
return self.none()
|
||||
|
||||
|
||||
class Product(GalleryMixin, TranslatedFieldsMixin, BaseAttributes,
|
||||
HasTagsMixin, FavoritesMixin):
|
||||
|
|
|
|||
|
|
@ -2,12 +2,16 @@
|
|||
from django.shortcuts import get_object_or_404
|
||||
from rest_framework import generics, status, permissions, views
|
||||
from rest_framework.response import Response
|
||||
from django.db.models import Prefetch
|
||||
|
||||
from product import serializers, models
|
||||
from location.models import Address, City, Country
|
||||
from product.views import ProductBaseView
|
||||
from utils.serializers import ImageBaseSerializer
|
||||
from utils.views import CreateDestroyGalleryViewMixin
|
||||
from utils.permissions import IsLiquorReviewer, IsProductReviewer
|
||||
from utils.permissions import (
|
||||
IsDistilleryLiquorInspector, IsProductReviewer,
|
||||
IsEstablishmentManager, IsEstablishmentAdministrator)
|
||||
|
||||
|
||||
class ProductBackOfficeMixinView(ProductBaseView):
|
||||
|
|
@ -17,7 +21,7 @@ class ProductBackOfficeMixinView(ProductBaseView):
|
|||
|
||||
def get_queryset(self):
|
||||
"""Override get_queryset method."""
|
||||
qs = models.Product.objects.annotate_in_favorites(self.request.user)
|
||||
qs = models.Product.objects.with_extended_related().annotate_in_favorites(self.request.user)
|
||||
return qs
|
||||
|
||||
|
||||
|
|
@ -92,14 +96,29 @@ class ProductDetailBackOfficeView(ProductBackOfficeMixinView,
|
|||
generics.RetrieveUpdateDestroyAPIView):
|
||||
"""Product back-office R/U/D view."""
|
||||
serializer_class = serializers.ProductBackOfficeDetailSerializer
|
||||
permission_classes = [IsLiquorReviewer | IsProductReviewer]
|
||||
permission_classes = [
|
||||
# IsLiquorReviewer |
|
||||
# IsProductReviewer |
|
||||
IsEstablishmentManager |
|
||||
IsEstablishmentAdministrator
|
||||
]
|
||||
|
||||
|
||||
class ProductListCreateBackOfficeView(BackOfficeListCreateMixin, ProductBackOfficeMixinView,
|
||||
class ProductListCreateBackOfficeView(ProductBackOfficeMixinView,
|
||||
generics.ListCreateAPIView):
|
||||
"""Product back-office list-create view."""
|
||||
serializer_class = serializers.ProductBackOfficeDetailSerializer
|
||||
permission_classes = [IsLiquorReviewer | IsProductReviewer]
|
||||
permission_classes = [
|
||||
IsDistilleryLiquorInspector |
|
||||
IsProductReviewer |
|
||||
IsEstablishmentAdministrator |
|
||||
IsEstablishmentManager
|
||||
]
|
||||
|
||||
def get_queryset(self):
|
||||
"""Overridden get_queryset method."""
|
||||
qs = super(ProductListCreateBackOfficeView, self).get_queryset()
|
||||
return qs.available_objects(self.request.user)
|
||||
|
||||
|
||||
class ProductTypeListCreateBackOfficeView(BackOfficeListCreateMixin,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ from rest_framework_simplejwt.tokens import AccessToken
|
|||
from account.models import UserRole, Role
|
||||
from authorization.models import JWTRefreshToken
|
||||
from utils.tokens import GMRefreshToken
|
||||
from establishment.models import EstablishmentSubType
|
||||
from establishment.models import EstablishmentSubType, Establishment
|
||||
from location.models import Address
|
||||
from product.models import Product, ProductType
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ class IsRefreshTokenValid(permissions.BasePermission):
|
|||
return False
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
# Read permissions are allowed to any request,
|
||||
# Read permissions are allowed to all request,
|
||||
# so we'll always allow GET, HEAD or OPTIONS requests.
|
||||
if request.method in permissions.SAFE_METHODS or \
|
||||
obj.user == request.user or request.user.is_superuser:
|
||||
|
|
@ -59,24 +59,23 @@ class IsGuest(permissions.IsAuthenticatedOrReadOnly):
|
|||
"""
|
||||
Object-level permission to only allow owners of an object to edit it.
|
||||
"""
|
||||
SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')
|
||||
def has_permission(self, request, view):
|
||||
|
||||
rules = [
|
||||
request.user.is_superuser,
|
||||
request.user.is_anonymous,
|
||||
request.method in permissions.SAFE_METHODS
|
||||
]
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
rules = [
|
||||
request.user.is_superuser,
|
||||
request.user.is_anonymous,
|
||||
request.method in permissions.SAFE_METHODS
|
||||
]
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsStandardUser(IsGuest):
|
||||
class IsStandardUser(permissions.IsAuthenticated):
|
||||
"""
|
||||
Object-level permission to only allow owners of an object to edit it.
|
||||
Assumes the model instance has an `owner` attribute.
|
||||
|
|
@ -85,8 +84,7 @@ class IsStandardUser(IsGuest):
|
|||
def has_permission(self, request, view):
|
||||
|
||||
rules = [super().has_permission(request, view),
|
||||
request.user.is_authenticated,
|
||||
hasattr(request, 'user')
|
||||
request.user.email_confirmed,
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
|
|
@ -95,8 +93,7 @@ class IsStandardUser(IsGuest):
|
|||
# Read permissions are allowed to any request
|
||||
|
||||
rules = [super().has_object_permission(request, view, obj),
|
||||
request.user.is_authenticated,
|
||||
hasattr(request, 'user')
|
||||
request.user.email_confirmed,
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
|
|
@ -133,10 +130,10 @@ class IsContentPageManager(IsStandardUser):
|
|||
super().has_permission(request, view)
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
# Read permissions are allowed to any request.
|
||||
# Read permissions are allowed to all request.
|
||||
if hasattr(obj, 'site_id'):
|
||||
role = Role.objects.filter(role=Role.CONTENT_PAGE_MANAGER,
|
||||
site_id=obj.site_id) \
|
||||
|
|
@ -156,7 +153,7 @@ class IsContentPageManager(IsStandardUser):
|
|||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsCountryAdmin(IsStandardUser):
|
||||
|
|
@ -169,11 +166,12 @@ class IsCountryAdmin(IsStandardUser):
|
|||
rules = [
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
|
||||
rule = False
|
||||
# and request.user.email_confirmed,
|
||||
if hasattr(request.data, 'user'):
|
||||
if hasattr(request.data, 'site_id'):
|
||||
# Read permissions are allowed to any request.
|
||||
|
||||
# Read permissions are allowed to all request.
|
||||
role = Role.objects.filter(role=Role.COUNTRY_ADMIN,
|
||||
site_id=request.data.site_id) \
|
||||
.first()
|
||||
|
|
@ -184,22 +182,24 @@ class IsCountryAdmin(IsStandardUser):
|
|||
]
|
||||
elif hasattr(request.data, 'country_id'):
|
||||
|
||||
role = Role.objects.filter(role=Role.COUNTRY_ADMIN,
|
||||
country_id=request.data.country_id) \
|
||||
.first()
|
||||
|
||||
role = Role.objects.filter(
|
||||
role=Role.COUNTRY_ADMIN,
|
||||
country_id=request.data.country_id
|
||||
).first()
|
||||
rules = [
|
||||
UserRole.objects.filter(user=request.user, role=role).exists(),
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
return any(rules)
|
||||
rules.append(rule)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
# Read permissions are allowed to any request.
|
||||
# Read permissions are allowed to all request.
|
||||
if hasattr(obj, 'site_id'):
|
||||
role = Role.objects.filter(role=Role.COUNTRY_ADMIN,
|
||||
site_id=obj.site_id) \
|
||||
.first()
|
||||
role = Role.objects.filter(
|
||||
role=Role.COUNTRY_ADMIN,
|
||||
site_id=obj.site_id
|
||||
).first()
|
||||
|
||||
rules = [
|
||||
super().has_object_permission(request, view, obj)
|
||||
|
|
@ -225,7 +225,7 @@ class IsCountryAdmin(IsStandardUser):
|
|||
super().has_object_permission(request, view, obj),
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsCommentModerator(IsStandardUser):
|
||||
|
|
@ -239,8 +239,8 @@ class IsCommentModerator(IsStandardUser):
|
|||
super().has_permission(request, view)
|
||||
]
|
||||
|
||||
if any(rules) and hasattr(request.data, 'site_id'):
|
||||
# Read permissions are allowed to any request.
|
||||
if all(rules) and hasattr(request.data, 'site_id'):
|
||||
# Read permissions are allowed to all request.
|
||||
|
||||
role = Role.objects.filter(role=Role.COMMENTS_MODERATOR,
|
||||
site_id=request.data.site_id) \
|
||||
|
|
@ -251,7 +251,7 @@ class IsCommentModerator(IsStandardUser):
|
|||
super().has_permission(request, view)
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
|
||||
|
|
@ -270,7 +270,7 @@ class IsCommentModerator(IsStandardUser):
|
|||
obj.user != request.user,
|
||||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsEstablishmentManager(IsStandardUser):
|
||||
|
|
@ -279,40 +279,69 @@ class IsEstablishmentManager(IsStandardUser):
|
|||
rules = [
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
rule = False
|
||||
if (request.user.is_authenticated and
|
||||
hasattr(request, 'country_code') and
|
||||
request.country_code):
|
||||
user = request.user
|
||||
role = Role.objects.filter(
|
||||
role=Role.ESTABLISHMENT_MANAGER, site__country__code=request.country_code,
|
||||
).only('id')
|
||||
if role.exists():
|
||||
user_role = UserRole.objects.filter(
|
||||
user=user, role__id__in=role.values_list('id', flat=True),
|
||||
)
|
||||
rule = True if user_role.exists() else rule
|
||||
rules.append(rule)
|
||||
return all(rules)
|
||||
|
||||
if hasattr(request.data, 'user'):
|
||||
if hasattr(request.data, 'establishment_id'):
|
||||
role = Role.objects.filter(role=Role.ESTABLISHMENT_MANAGER) \
|
||||
.first()
|
||||
def has_object_permission(self, request, view, obj):
|
||||
return self.has_permission(request, view)
|
||||
|
||||
rules = [
|
||||
UserRole.objects.filter(user=request.user, role=role,
|
||||
establishment_id=request.data.establishment_id
|
||||
).exists(),
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
return any(rules)
|
||||
|
||||
class IsEstablishmentAdministrator(IsStandardUser):
|
||||
|
||||
def has_permission(self, request, view):
|
||||
rules = [
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
rule = False
|
||||
if (request.user.is_authenticated and
|
||||
hasattr(request, 'country_code') and
|
||||
request.country_code):
|
||||
user = request.user
|
||||
role = Role.objects.filter(
|
||||
role=Role.ESTABLISHMENT_ADMINISTRATOR, site__country__code=request.country_code,
|
||||
).only('id')
|
||||
if role.exists():
|
||||
user_role = UserRole.objects.filter(
|
||||
user=user, role__id__in=role.values_list('id', flat=True),
|
||||
)
|
||||
rule = True if user_role.exists() else rule
|
||||
rules.append(rule)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
|
||||
rules = [
|
||||
# special!
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
rule = False
|
||||
role = Role.objects.filter(role=Role.ESTABLISHMENT_ADMINISTRATOR).only('id')
|
||||
if request.user.is_authenticated and role.exists() and hasattr(obj, 'id'):
|
||||
user = request.user
|
||||
filters = {
|
||||
'user': user,
|
||||
'role__id__in': role.values_list('id', flat=True),
|
||||
}
|
||||
if isinstance(obj, Establishment):
|
||||
filters.update({'establishment__id': obj.id})
|
||||
|
||||
role = Role.objects.filter(role=Role.ESTABLISHMENT_MANAGER) \
|
||||
.first()
|
||||
|
||||
if hasattr(obj, 'establishment_id'):
|
||||
rules = [
|
||||
UserRole.objects.filter(user=request.user, role=role,
|
||||
establishment_id=obj.establishment_id
|
||||
).exists(),
|
||||
# special!
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
if isinstance(obj, Product):
|
||||
filters.update({'establishment__products__id': obj.id})
|
||||
rule = True if UserRole.objects.filter(**filters).exists() else rule
|
||||
rules.append(rule)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsReviewerManager(IsStandardUser):
|
||||
|
|
@ -324,8 +353,8 @@ class IsReviewerManager(IsStandardUser):
|
|||
|
||||
# and request.user.email_confirmed,
|
||||
if hasattr(request.data, 'user') and hasattr(request.data, 'site_id'):
|
||||
role = Role.objects.filter(role=Role.REVIEWER_MANGER) \
|
||||
.first()
|
||||
role = Role.objects.filter(role=Role.REVIEWER_MANGER
|
||||
).first()
|
||||
|
||||
rules = [
|
||||
UserRole.objects.filter(user=request.user, role=role,
|
||||
|
|
@ -333,7 +362,7 @@ class IsReviewerManager(IsStandardUser):
|
|||
).exists(),
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
role = Role.objects.filter(role=Role.REVIEWER_MANGER,
|
||||
|
|
@ -345,7 +374,7 @@ class IsReviewerManager(IsStandardUser):
|
|||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsRestaurantReviewer(IsStandardUser):
|
||||
|
|
@ -366,7 +395,7 @@ class IsRestaurantReviewer(IsStandardUser):
|
|||
).exists(),
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
content_type = ContentType.objects.get(app_lable='establishment',
|
||||
|
|
@ -383,7 +412,7 @@ class IsRestaurantReviewer(IsStandardUser):
|
|||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsWineryReviewer(IsStandardUser):
|
||||
|
|
@ -393,107 +422,78 @@ class IsWineryReviewer(IsStandardUser):
|
|||
super().has_permission(request, view)
|
||||
]
|
||||
|
||||
if 'type_id' in request.data and 'address_id' in request.data and request.user:
|
||||
countries = Address.objects.filter(id=request.data['address_id'])
|
||||
rule = False
|
||||
if request.user.is_authenticated:
|
||||
if hasattr(request, 'data'):
|
||||
type_id = request.data.get('type_id')
|
||||
address_id = request.data.get('address_id')
|
||||
|
||||
est = EstablishmentSubType.objects.filter(establishment_type_id=request.data['type_id'])
|
||||
if est.exists():
|
||||
role = Role.objects.filter(establishment_subtype_id__in=[est_type.id for est_type in est],
|
||||
role=Role.WINERY_REVIEWER,
|
||||
country_id__in=[country.id for country in countries]) \
|
||||
.first()
|
||||
if type_id and address_id:
|
||||
address_qs = Address.objects.filter(id=address_id) \
|
||||
.only('city__country')
|
||||
|
||||
rules.append(
|
||||
UserRole.objects.filter(user=request.user, role=role).exists()
|
||||
)
|
||||
if address_qs.exists():
|
||||
country_id = address_qs.values_list('city__country', flat=True)
|
||||
|
||||
return any(rules)
|
||||
est_subtype_qs = EstablishmentSubType.objects.filter(establishment_type_id=type_id).only('id')
|
||||
if est_subtype_qs.exists():
|
||||
role = Role.objects.filter(
|
||||
establishment_subtype_id=est_subtype_qs.values_list('id', flat=True)[0],
|
||||
role=Role.WINERY_REVIEWER,
|
||||
country_id=country_id
|
||||
)
|
||||
rule = True if role.exists() else rule
|
||||
rules.append(rule)
|
||||
return all(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
rules = [
|
||||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
|
||||
if hasattr(obj, 'type_id') or hasattr(obj, 'establishment_type_id'):
|
||||
type_id: int
|
||||
rule = False
|
||||
if request.user.is_authenticated:
|
||||
type_id = None
|
||||
object_id = None
|
||||
country_id = None
|
||||
|
||||
if hasattr(obj, 'type_id'):
|
||||
type_id = obj.type_id
|
||||
else:
|
||||
|
||||
if hasattr(obj, 'establishment_type_id'):
|
||||
type_id = obj.establishment_type_id
|
||||
|
||||
est = EstablishmentSubType.objects.filter(establishment_type_id=type_id)
|
||||
role = Role.objects.filter(role=Role.WINERY_REVIEWER,
|
||||
establishment_subtype_id__in=[est_type.id for est_type in est],
|
||||
country_id=obj.country_id).first()
|
||||
|
||||
object_id: int
|
||||
if hasattr(obj, 'object_id'):
|
||||
object_id = obj.object_id
|
||||
else:
|
||||
|
||||
if hasattr(obj, 'establishment_id'):
|
||||
object_id = obj.establishment_id
|
||||
|
||||
rules = [
|
||||
UserRole.objects.filter(user=request.user, role=role,
|
||||
establishment_id=object_id
|
||||
).exists(),
|
||||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
return any(rules)
|
||||
if hasattr(obj, 'country_id'):
|
||||
country_id = obj.country_id
|
||||
|
||||
if type_id and object_id and country_id:
|
||||
est_subtype_qs = EstablishmentSubType.objects.filter(
|
||||
establishment_type_id=type_id
|
||||
).only('id')
|
||||
|
||||
class IsWineryReviewer(IsStandardUser):
|
||||
if est_subtype_qs.exists():
|
||||
est_subtype_id = est_subtype_qs.values_list('id', flat=True)[0]
|
||||
|
||||
def has_permission(self, request, view):
|
||||
rules = [
|
||||
super().has_permission(request, view)
|
||||
]
|
||||
role = Role.objects.filter(
|
||||
role=Role.WINERY_REVIEWER,
|
||||
establishment_subtype_id=est_subtype_id,
|
||||
country_id=country_id
|
||||
).first()
|
||||
|
||||
if 'type_id' in request.data and 'address_id' in request.data and request.user:
|
||||
countries = Address.objects.filter(id=request.data['address_id'])
|
||||
|
||||
est = EstablishmentSubType.objects.filter(establishment_type_id=request.data['type_id'])
|
||||
if est.exists():
|
||||
role = Role.objects.filter(establishment_subtype_id__in=[est_type.id for est_type in est],
|
||||
role=Role.WINERY_REVIEWER,
|
||||
country_id__in=[country.id for country in countries]) \
|
||||
.first()
|
||||
|
||||
rules.append(
|
||||
UserRole.objects.filter(user=request.user, role=role).exists()
|
||||
)
|
||||
|
||||
return any(rules)
|
||||
|
||||
def has_object_permission(self, request, view, obj):
|
||||
rules = [
|
||||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
|
||||
if hasattr(obj, 'type_id') or hasattr(obj, 'establishment_type_id'):
|
||||
type_id: int
|
||||
if hasattr(obj, 'type_id'):
|
||||
type_id = obj.type_id
|
||||
else:
|
||||
type_id = obj.establishment_type_id
|
||||
|
||||
est = EstablishmentSubType.objects.filter(establishment_type_id=type_id)
|
||||
role = Role.objects.filter(role=Role.WINERY_REVIEWER,
|
||||
establishment_subtype_id__in=[est_type.id for est_type in est],
|
||||
country_id=obj.country_id).first()
|
||||
|
||||
object_id: int
|
||||
if hasattr(obj, 'object_id'):
|
||||
object_id = obj.object_id
|
||||
else:
|
||||
object_id = obj.establishment_id
|
||||
|
||||
rules = [
|
||||
UserRole.objects.filter(user=request.user, role=role,
|
||||
establishment_id=object_id
|
||||
).exists(),
|
||||
super().has_object_permission(request, view, obj)
|
||||
]
|
||||
return any(rules)
|
||||
user_role = UserRole.objects.filter(
|
||||
user=request.user,
|
||||
role=role,
|
||||
establishment_id=object_id,
|
||||
)
|
||||
rule = True if user_role.exists() else rule
|
||||
rules.append(rule)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsProductReviewer(IsStandardUser):
|
||||
|
|
@ -526,10 +526,10 @@ class IsProductReviewer(IsStandardUser):
|
|||
.exists()
|
||||
|
||||
rules.append(permission)
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
|
||||
class IsLiquorReviewer(IsStandardUser):
|
||||
class IsDistilleryLiquorInspector(IsStandardUser):
|
||||
def has_permission(self, request, view):
|
||||
rules = [
|
||||
super().has_permission(request, view)
|
||||
|
|
@ -548,7 +548,7 @@ class IsLiquorReviewer(IsStandardUser):
|
|||
id=request.data['product_type_id'])
|
||||
|
||||
if product_types.exists():
|
||||
roles = Role.objects.filter(role=Role.LIQUOR_REVIEWER,
|
||||
roles = Role.objects.filter(role=Role.DISTILLERY_LIQUOR_INSPECTOR,
|
||||
site_id=request.data['site_id'])
|
||||
|
||||
if 'pk' in view.kwargs:
|
||||
|
|
@ -564,7 +564,7 @@ class IsLiquorReviewer(IsStandardUser):
|
|||
id=product.product_type_id)
|
||||
|
||||
if product_types.exists():
|
||||
roles = Role.objects.filter(role=Role.LIQUOR_REVIEWER,
|
||||
roles = Role.objects.filter(role=Role.DISTILLERY_LIQUOR_INSPECTOR,
|
||||
site_id=product.site_id)
|
||||
|
||||
if roles is not None:
|
||||
|
|
@ -572,7 +572,7 @@ class IsLiquorReviewer(IsStandardUser):
|
|||
.exists()
|
||||
|
||||
rules.append(permission)
|
||||
return any(rules)
|
||||
return all(rules)
|
||||
|
||||
#
|
||||
# def has_object_permission(self, request, view, obj):
|
||||
|
|
@ -590,8 +590,8 @@ class IsLiquorReviewer(IsStandardUser):
|
|||
# # product = Product.objects.get(pk=pk_object)
|
||||
# #
|
||||
# # if product.sites.exists():
|
||||
# # role = Role.objects.filter(role=Role.LIQUOR_REVIEWER, site__in=[site for site in product.sites])
|
||||
# # role = Role.objects.filter(role=Role.DISTILLERY_LIQUOR_INSPECTOR, site__in=[site for site in product.sites])
|
||||
# # permission = UserRole.objects.filter(user=request.user, role=role).exists()
|
||||
# #
|
||||
# # rules.append(permission)
|
||||
# return any(rules)
|
||||
# return all(rules)
|
||||
Loading…
Reference in New Issue
Block a user