modified role model

This commit is contained in:
Anatoly 2020-01-24 18:04:32 +03:00
parent 36c4641ed0
commit 38a6508396
7 changed files with 265 additions and 172 deletions

View File

@ -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)

View File

@ -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."""

View File

@ -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"""

View File

@ -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):

View File

@ -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):

View File

@ -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,

View File

@ -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)