Merge branch 'develop' of ssh://gl.id-east.ru:222/gm/gm-backend into develop

This commit is contained in:
Dmitriy Kuzmenko 2019-12-09 17:47:51 +03:00
commit 9d557e4ce8
18 changed files with 142 additions and 60 deletions

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2019-12-06 06:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('establishment', '0067_auto_20191122_1244'),
('account', '0023_auto_20191204_0916'),
]
operations = [
migrations.AddField(
model_name='role',
name='establishment_subtype',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='establishment.EstablishmentSubType', verbose_name='Establishment subtype'),
),
]

View File

@ -1,5 +1,6 @@
"""Account models""" """Account models"""
from datetime import datetime from datetime import datetime
from tabnanny import verbose
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager
@ -15,7 +16,7 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from authorization.models import Application from authorization.models import Application
from establishment.models import Establishment from establishment.models import Establishment, EstablishmentSubType
from location.models import Country from location.models import Country
from main.models import SiteSettings from main.models import SiteSettings
from utils.models import GMTokenGenerator from utils.models import GMTokenGenerator
@ -33,7 +34,7 @@ class Role(ProjectBaseMixin):
REVIEWER_MANGER = 6 REVIEWER_MANGER = 6
RESTAURANT_REVIEWER = 7 RESTAURANT_REVIEWER = 7
SALES_MAN = 8 SALES_MAN = 8
WINERY_REVIEWER = 9 WINERY_REVIEWER = 9 # Establishments subtype "winery"
SELLER = 10 SELLER = 10
ROLE_CHOICES = ( ROLE_CHOICES = (
@ -54,6 +55,9 @@ class Role(ProjectBaseMixin):
null=True, blank=True, on_delete=models.SET_NULL) null=True, blank=True, on_delete=models.SET_NULL)
site = models.ForeignKey(SiteSettings, verbose_name=_('Site settings'), site = models.ForeignKey(SiteSettings, verbose_name=_('Site settings'),
null=True, blank=True, on_delete=models.SET_NULL) null=True, blank=True, on_delete=models.SET_NULL)
establishment_subtype = models.ForeignKey(EstablishmentSubType,
verbose_name=_('Establishment subtype'),
null=True, blank=True, on_delete=models.SET_NULL)
class UserManager(BaseUserManager): class UserManager(BaseUserManager):

View File

@ -33,6 +33,7 @@ class BackUserSerializer(serializers.ModelSerializer):
'email_confirmed', 'email_confirmed',
'newsletter', 'newsletter',
'roles', 'roles',
'password'
) )
extra_kwargs = { extra_kwargs = {
'password': {'write_only': True} 'password': {'write_only': True}

View File

@ -8,6 +8,6 @@ app_name = 'account'
urlpatterns = [ urlpatterns = [
path('role/', views.RoleLstView.as_view(), name='role-list-create'), path('role/', views.RoleLstView.as_view(), name='role-list-create'),
path('user-role/', views.UserRoleLstView.as_view(), name='user-role-list-create'), path('user-role/', views.UserRoleLstView.as_view(), name='user-role-list-create'),
path('user/', views.UserLstView.as_view(), name='user-list-create'), path('user/', views.UserLstView.as_view(), name='user-create-list'),
path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'), path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'),
] ]

View File

@ -22,6 +22,10 @@ class AdvertisementQuerySet(models.QuerySet):
"""Filter Advertisement by page type.""" """Filter Advertisement by page type."""
return self.filter(page_type__name=page_type) return self.filter(page_type__name=page_type)
def by_country(self, code: str):
"""Filter Advertisement by country code."""
return self.filter(sites__country__code=code)
def by_locale(self, locale): def by_locale(self, locale):
"""Filter by locale.""" """Filter by locale."""
return self.filter(target_languages__locale=locale) return self.filter(target_languages__locale=locale)

View File

@ -11,14 +11,11 @@ from main.models import SiteSettings
class AdvertisementBaseSerializer(serializers.ModelSerializer): class AdvertisementBaseSerializer(serializers.ModelSerializer):
"""Base serializer for model Advertisement.""" """Base serializer for model Advertisement."""
languages = LanguageSerializer(many=True, read_only=True,
source='target_languages')
target_languages = serializers.PrimaryKeyRelatedField( target_languages = serializers.PrimaryKeyRelatedField(
queryset=Language.objects.all(), queryset=Language.objects.all(),
many=True, many=True,
write_only=True write_only=True
) )
sites = SiteShortSerializer(many=True, read_only=True)
target_sites = serializers.PrimaryKeyRelatedField( target_sites = serializers.PrimaryKeyRelatedField(
queryset=SiteSettings.objects.all(), queryset=SiteSettings.objects.all(),
many=True, many=True,
@ -33,9 +30,7 @@ class AdvertisementBaseSerializer(serializers.ModelSerializer):
'uuid', 'uuid',
'url', 'url',
'block_level', 'block_level',
'languages',
'target_languages', 'target_languages',
'sites',
'target_sites', 'target_sites',
'start', 'start',
'end', 'end',

View File

@ -28,5 +28,8 @@ class AdvertisementPageTypeListView(AdvertisementBaseView, generics.ListAPIView)
product_type = self.kwargs.get('page_type') product_type = self.kwargs.get('page_type')
qs = super(AdvertisementPageTypeListView, self).get_queryset() qs = super(AdvertisementPageTypeListView, self).get_queryset()
if product_type: if product_type:
return qs.by_page_type(product_type) return qs.by_page_type(product_type) \
.by_country(self.request.country_code) \
.by_locale(self.request.locale) \
.distinct('id')
return qs.none() return qs.none()

View File

@ -7,3 +7,4 @@ class AdvertisementPageTypeWebListView(AdvertisementPageTypeListView):
"""Advertisement mobile list view.""" """Advertisement mobile list view."""
serializer_class = AdvertisementPageTypeWebListSerializer serializer_class = AdvertisementPageTypeWebListSerializer

View File

@ -830,25 +830,6 @@ class ContactEmail(models.Model):
return f'{self.email}' return f'{self.email}'
#
# class Wine(TranslatedFieldsMixin, models.Model):
# """Wine model."""
# establishment = models.ForeignKey(
# 'establishment.Establishment', verbose_name=_('establishment'),
# on_delete=models.CASCADE)
# bottles = models.IntegerField(_('bottles'))
# price_min = models.DecimalField(
# _('price min'), max_digits=14, decimal_places=2)
# price_max = models.DecimalField(
# _('price max'), max_digits=14, decimal_places=2)
# by_glass = models.BooleanField(_('by glass'))
# price_glass_min = models.DecimalField(
# _('price min'), max_digits=14, decimal_places=2)
# price_glass_max = models.DecimalField(
# _('price max'), max_digits=14, decimal_places=2)
#
class Plate(TranslatedFieldsMixin, models.Model): class Plate(TranslatedFieldsMixin, models.Model):
"""Plate model.""" """Plate model."""
STR_FIELD_NAME = 'name' STR_FIELD_NAME = 'name'

View File

@ -450,14 +450,18 @@ class EstablishmentSimilarSerializer(EstablishmentBaseSerializer):
address = AddressDetailSerializer(read_only=True) address = AddressDetailSerializer(read_only=True)
schedule = ScheduleRUDSerializer(many=True, allow_null=True) schedule = ScheduleRUDSerializer(many=True, allow_null=True)
establishment_type = EstablishmentTypeGeoSerializer() type = EstablishmentTypeGeoSerializer(source='establishment_type')
artisan_category = TagBaseSerializer(many=True, allow_null=True) artisan_category = TagBaseSerializer(many=True, allow_null=True, read_only=True)
restaurant_category = TagBaseSerializer(many=True, allow_null=True, read_only=True)
restaurant_cuisine = TagBaseSerializer(many=True, allow_null=True, read_only=True)
class Meta(EstablishmentBaseSerializer.Meta): class Meta(EstablishmentBaseSerializer.Meta):
fields = EstablishmentBaseSerializer.Meta.fields + [ fields = EstablishmentBaseSerializer.Meta.fields + [
'schedule', 'schedule',
'establishment_type', 'type',
'artisan_category', 'artisan_category',
'restaurant_category',
'restaurant_cuisine',
] ]

View File

@ -4,7 +4,8 @@ from account.models import User
from rest_framework import status from rest_framework import status
from http.cookies import SimpleCookie from http.cookies import SimpleCookie
from main.models import Currency from main.models import Currency
from establishment.models import Establishment, EstablishmentType, Menu, SocialChoice, SocialNetwork from establishment.models import Establishment, EstablishmentType, EstablishmentSubType,\
Menu, SocialChoice, SocialNetwork
# Create your tests here. # Create your tests here.
from translation.models import Language from translation.models import Language
from account.models import Role, UserRole from account.models import Role, UserRole
@ -87,7 +88,7 @@ class BaseTestCase(APITestCase):
) )
class EstablishmentBTests(BaseTestCase): class EstablishmentBackTests(BaseTestCase):
def test_establishment_CRUD(self): def test_establishment_CRUD(self):
params = {'page': 1, 'page_size': 1, } params = {'page': 1, 'page_size': 1, }
response = self.client.get('/api/back/establishments/', params, format='json') response = self.client.get('/api/back/establishments/', params, format='json')

View File

@ -3,10 +3,9 @@ from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from rest_framework import generics, permissions, status from rest_framework import generics, permissions, status
from utils.permissions import IsCountryAdmin, IsEstablishmentManager
from establishment import filters, models, serializers from establishment import filters, models, serializers
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
from utils.permissions import IsCountryAdmin, IsEstablishmentManager from utils.permissions import IsCountryAdmin, IsEstablishmentManager, IsWineryReviewer
from utils.views import CreateDestroyGalleryViewMixin from utils.views import CreateDestroyGalleryViewMixin
from timetable.models import Timetable from timetable.models import Timetable
from rest_framework import status from rest_framework import status
@ -25,7 +24,8 @@ class EstablishmentListCreateView(EstablishmentMixinViews, generics.ListCreateAP
"""Establishment list/create view.""" """Establishment list/create view."""
filter_class = filters.EstablishmentFilter filter_class = filters.EstablishmentFilter
permission_classes = [IsCountryAdmin | IsEstablishmentManager]
permission_classes = [IsWineryReviewer | IsCountryAdmin | IsEstablishmentManager]
queryset = models.Establishment.objects.all() queryset = models.Establishment.objects.all()
serializer_class = serializers.EstablishmentListCreateSerializer serializer_class = serializers.EstablishmentListCreateSerializer
@ -34,14 +34,14 @@ class EstablishmentRUDView(generics.RetrieveUpdateDestroyAPIView):
lookup_field = 'slug' lookup_field = 'slug'
queryset = models.Establishment.objects.all() queryset = models.Establishment.objects.all()
serializer_class = serializers.EstablishmentRUDSerializer serializer_class = serializers.EstablishmentRUDSerializer
permission_classes = [IsCountryAdmin | IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsCountryAdmin | IsEstablishmentManager]
class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView): class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Establishment schedule RUD view""" """Establishment schedule RUD view"""
lookup_field = 'slug' lookup_field = 'slug'
serializer_class = ScheduleRUDSerializer serializer_class = ScheduleRUDSerializer
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer |IsEstablishmentManager]
def get_object(self): def get_object(self):
""" """
@ -67,21 +67,21 @@ class EstablishmentScheduleCreateView(generics.CreateAPIView):
lookup_field = 'slug' lookup_field = 'slug'
serializer_class = ScheduleCreateSerializer serializer_class = ScheduleCreateSerializer
queryset = Timetable.objects.all() queryset = Timetable.objects.all()
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class MenuListCreateView(generics.ListCreateAPIView): class MenuListCreateView(generics.ListCreateAPIView):
"""Menu list create view.""" """Menu list create view."""
serializer_class = serializers.MenuSerializers serializer_class = serializers.MenuSerializers
queryset = models.Menu.objects.all() queryset = models.Menu.objects.all()
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class MenuRUDView(generics.RetrieveUpdateDestroyAPIView): class MenuRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Menu RUD view.""" """Menu RUD view."""
serializer_class = serializers.MenuRUDSerializers serializer_class = serializers.MenuRUDSerializers
queryset = models.Menu.objects.all() queryset = models.Menu.objects.all()
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class SocialChoiceListCreateView(generics.ListCreateAPIView): class SocialChoiceListCreateView(generics.ListCreateAPIView):
@ -119,14 +119,14 @@ class PlateListCreateView(generics.ListCreateAPIView):
serializer_class = serializers.PlatesSerializers serializer_class = serializers.PlatesSerializers
queryset = models.Plate.objects.all() queryset = models.Plate.objects.all()
pagination_class = None pagination_class = None
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class PlateRUDView(generics.RetrieveUpdateDestroyAPIView): class PlateRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Plate RUD view.""" """Plate RUD view."""
serializer_class = serializers.PlatesSerializers serializer_class = serializers.PlatesSerializers
queryset = models.Plate.objects.all() queryset = models.Plate.objects.all()
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class PhonesListCreateView(generics.ListCreateAPIView): class PhonesListCreateView(generics.ListCreateAPIView):
@ -134,14 +134,14 @@ class PhonesListCreateView(generics.ListCreateAPIView):
serializer_class = serializers.ContactPhoneBackSerializers serializer_class = serializers.ContactPhoneBackSerializers
queryset = models.ContactPhone.objects.all() queryset = models.ContactPhone.objects.all()
pagination_class = None pagination_class = None
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class PhonesRUDView(generics.RetrieveUpdateDestroyAPIView): class PhonesRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Phones RUD view.""" """Phones RUD view."""
serializer_class = serializers.ContactPhoneBackSerializers serializer_class = serializers.ContactPhoneBackSerializers
queryset = models.ContactPhone.objects.all() queryset = models.ContactPhone.objects.all()
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class EmailListCreateView(generics.ListCreateAPIView): class EmailListCreateView(generics.ListCreateAPIView):
@ -149,14 +149,14 @@ class EmailListCreateView(generics.ListCreateAPIView):
serializer_class = serializers.ContactEmailBackSerializers serializer_class = serializers.ContactEmailBackSerializers
queryset = models.ContactEmail.objects.all() queryset = models.ContactEmail.objects.all()
pagination_class = None pagination_class = None
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class EmailRUDView(generics.RetrieveUpdateDestroyAPIView): class EmailRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Email RUD view.""" """Email RUD view."""
serializer_class = serializers.ContactEmailBackSerializers serializer_class = serializers.ContactEmailBackSerializers
queryset = models.ContactEmail.objects.all() queryset = models.ContactEmail.objects.all()
permission_classes = [IsEstablishmentManager] permission_classes = [IsWineryReviewer | IsEstablishmentManager]
class EmployeeListCreateView(generics.ListCreateAPIView): class EmployeeListCreateView(generics.ListCreateAPIView):

View File

@ -30,6 +30,8 @@ class FavoritesEstablishmentListView(generics.ListAPIView):
"""Override get_queryset method""" """Override get_queryset method"""
return Establishment.objects.filter(favorites__user=self.request.user) \ return Establishment.objects.filter(favorites__user=self.request.user) \
.order_by('-favorites').with_base_related() \ .order_by('-favorites').with_base_related() \
.with_certain_tag_category_related('category', 'restaurant_category') \
.with_certain_tag_category_related('cuisine', 'restaurant_cuisine') \
.with_certain_tag_category_related('shop_category', 'artisan_category') .with_certain_tag_category_related('shop_category', 'artisan_category')

View File

@ -6,7 +6,8 @@ from comment.models import Comment
from comment.serializers import CommentSerializer from comment.serializers import CommentSerializer
from establishment.serializers import EstablishmentProductShortSerializer from establishment.serializers import EstablishmentProductShortSerializer
from establishment.serializers.common import _EstablishmentAddressShortSerializer from establishment.serializers.common import _EstablishmentAddressShortSerializer
from location.serializers import WineOriginRegionBaseSerializer, WineOriginBaseSerializer from location.serializers import WineOriginRegionBaseSerializer,\
WineOriginBaseSerializer, EstablishmentWineOriginBaseSerializer
from main.serializers import AwardSerializer from main.serializers import AwardSerializer
from product import models from product import models
from review.serializers import ReviewShortSerializer from review.serializers import ReviewShortSerializer
@ -95,6 +96,7 @@ class ProductBaseSerializer(serializers.ModelSerializer):
preview_image_url = serializers.URLField(allow_null=True, preview_image_url = serializers.URLField(allow_null=True,
read_only=True) read_only=True)
in_favorites = serializers.BooleanField(allow_null=True) in_favorites = serializers.BooleanField(allow_null=True)
wine_origins = EstablishmentWineOriginBaseSerializer(many=True, read_only=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -2,6 +2,7 @@
from django.conf import settings from django.conf import settings
from django_elasticsearch_dsl import Document, Index, fields from django_elasticsearch_dsl import Document, Index, fields
from tag import models from tag import models
from news.models import News
TagCategoryIndex = Index(settings.ELASTICSEARCH_INDEX_NAMES.get(__name__, 'tag_category')) TagCategoryIndex = Index(settings.ELASTICSEARCH_INDEX_NAMES.get(__name__, 'tag_category'))
TagCategoryIndex.settings(number_of_shards=2, number_of_replicas=2) TagCategoryIndex.settings(number_of_shards=2, number_of_replicas=2)
@ -26,8 +27,16 @@ class TagCategoryDocument(Document):
'public', 'public',
'value_type' 'value_type'
) )
related_models = [models.Tag] related_models = [models.Tag, News]
def get_queryset(self): def get_queryset(self):
return super().get_queryset().with_base_related() return super().get_queryset().with_base_related()
def get_instances_from_related(self, related_instance):
"""If related_models is set, define how to retrieve the Car instance(s) from the related model.
The related_models option should be used with caution because it can lead in the index
to the updating of a lot of items.
"""
if isinstance(related_instance, News):
return related_instance.tags

View File

@ -243,8 +243,8 @@ class WineOriginSerializer(serializers.Serializer):
class EstablishmentDocumentSerializer(InFavoritesMixin, DocumentSerializer): class EstablishmentDocumentSerializer(InFavoritesMixin, DocumentSerializer):
"""Establishment document serializer.""" """Establishment document serializer."""
establishment_type = EstablishmentTypeSerializer() type = EstablishmentTypeSerializer(source='establishment_type')
establishment_subtypes = EstablishmentTypeSerializer(many=True) subtypes = EstablishmentTypeSerializer(many=True, source='establishment_subtypes')
address = AddressDocumentSerializer(allow_null=True) address = AddressDocumentSerializer(allow_null=True)
tags = TagsDocumentSerializer(many=True, source='visible_tags') tags = TagsDocumentSerializer(many=True, source='visible_tags')
restaurant_category = TagsDocumentSerializer(many=True, allow_null=True) restaurant_category = TagsDocumentSerializer(many=True, allow_null=True)
@ -280,8 +280,8 @@ class EstablishmentDocumentSerializer(InFavoritesMixin, DocumentSerializer):
'wine_origins', 'wine_origins',
# 'works_now', # 'works_now',
# 'collections', # 'collections',
# 'establishment_type', 'type',
# 'establishment_subtypes', 'subtypes',
) )

View File

@ -68,7 +68,7 @@ class GuideSerializer(TransferSerializerMixin):
class GuideFilterSerializer(TransferSerializerMixin): class GuideFilterSerializer(TransferSerializerMixin):
id = serializers.IntegerField() id = serializers.IntegerField()
year = serializers.CharField(allow_null=True) year = serializers.CharField(allow_null=True)
establishment_type = serializers.CharField(allow_null=True) type = serializers.CharField(allow_null=True, source='establishment_type')
countries = serializers.CharField(allow_null=True) countries = serializers.CharField(allow_null=True)
regions = serializers.CharField(allow_null=True) regions = serializers.CharField(allow_null=True)
subregions = serializers.CharField(allow_null=True) subregions = serializers.CharField(allow_null=True)
@ -86,7 +86,7 @@ class GuideFilterSerializer(TransferSerializerMixin):
fields = ( fields = (
'id', 'id',
'year', 'year',
'establishment_type', 'type',
'countries', 'countries',
'regions', 'regions',
'subregions', 'subregions',

View File

@ -7,7 +7,8 @@ from rest_framework_simplejwt.tokens import AccessToken
from account.models import UserRole, Role from account.models import UserRole, Role
from authorization.models import JWTRefreshToken from authorization.models import JWTRefreshToken
from utils.tokens import GMRefreshToken from utils.tokens import GMRefreshToken
from establishment.models import EstablishmentSubType
from location.models import Address
class IsAuthenticatedAndTokenIsValid(permissions.BasePermission): class IsAuthenticatedAndTokenIsValid(permissions.BasePermission):
""" """
@ -56,8 +57,9 @@ class IsGuest(permissions.IsAuthenticatedOrReadOnly):
""" """
Object-level permission to only allow owners of an object to edit it. Object-level permission to only allow owners of an object to edit it.
""" """
SAFE_METHODS = ('GET', 'HEAD', 'OPTIONS')
def has_permission(self, request, view): def has_permission(self, request, view):
rules = [ rules = [
request.user.is_superuser, request.user.is_superuser,
request.method in permissions.SAFE_METHODS request.method in permissions.SAFE_METHODS
@ -306,7 +308,6 @@ class IsEstablishmentManager(IsStandardUser):
rules = [ rules = [
# special! # special!
super().has_permission(request, view) super().has_permission(request, view)
# super().has_object_permission(request, view, obj)
] ]
role = Role.objects.filter(role=Role.ESTABLISHMENT_MANAGER) \ role = Role.objects.filter(role=Role.ESTABLISHMENT_MANAGER) \
@ -319,7 +320,6 @@ class IsEstablishmentManager(IsStandardUser):
).exists(), ).exists(),
# special! # special!
super().has_permission(request, view) super().has_permission(request, view)
# super().has_object_permission(request, view, obj)
] ]
return any(rules) return any(rules)
@ -368,7 +368,7 @@ class IsRestaurantReviewer(IsStandardUser):
# and request.user.email_confirmed, # and request.user.email_confirmed,
if hasattr(request.data, 'user') and hasattr(request.data, 'object_id'): if hasattr(request.data, 'user') and hasattr(request.data, 'object_id'):
role = Role.objects.filter(role=Role.RESTAURANT_REVIEWER) \ role = Role.objects.filter(role=Role.RESTAURANT_REVIEWER) \
.first() # 'Comments moderator' .first()
rules = [ rules = [
UserRole.objects.filter(user=request.user, role=role, UserRole.objects.filter(user=request.user, role=role,
@ -394,3 +394,58 @@ class IsRestaurantReviewer(IsStandardUser):
] ]
return any(rules) return any(rules)
class IsWineryReviewer(IsStandardUser):
def has_permission(self, request, view):
rules = [
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'])
est = EstablishmentSubType.objects.filter(establishment_type_id=request.data['type_id'])
if est.exists():
role = Role.objects.filter(establishment_subtype_id__in=[type.id for 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=[id for type.id 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)