permission
This commit is contained in:
parent
d441e69b81
commit
0a8db7e3ad
20
apps/product/migrations/0021_product_site.py
Normal file
20
apps/product/migrations/0021_product_site.py
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-10 14:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('main', '0040_footer'),
|
||||||
|
('product', '0020_merge_20191209_0911'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='product',
|
||||||
|
name='site',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='main.SiteSettings'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
# Generated by Django 2.2.7 on 2019-12-10 07:40
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('main', '0039_sitefeature_old_id'),
|
|
||||||
('product', '0020_merge_20191209_0911'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='product',
|
|
||||||
name='sites',
|
|
||||||
field=models.ManyToManyField(to='main.SiteSettings'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
18
apps/product/migrations/0022_auto_20191210_1517.py
Normal file
18
apps/product/migrations/0022_auto_20191210_1517.py
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-10 15:17
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0021_product_site'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='producttype',
|
||||||
|
name='index_name',
|
||||||
|
field=models.CharField(choices=[('food', 'food'), ('wine', 'wine'), ('liquor', 'liquor'), ('souvenir', 'souvenir'), ('book', 'book')], db_index=True, max_length=50, unique=True, verbose_name='Index name'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -25,10 +25,17 @@ class ProductType(TranslatedFieldsMixin, ProjectBaseMixin):
|
||||||
SOUVENIR = 'souvenir'
|
SOUVENIR = 'souvenir'
|
||||||
BOOK = 'book'
|
BOOK = 'book'
|
||||||
|
|
||||||
|
INDEX_CHOICES = (
|
||||||
|
(FOOD, 'food'),
|
||||||
|
(WINE, 'wine'),
|
||||||
|
(LIQUOR, 'liquor'),
|
||||||
|
(SOUVENIR, 'souvenir'),
|
||||||
|
(BOOK, 'book')
|
||||||
|
)
|
||||||
name = TJSONField(blank=True, null=True, default=None,
|
name = TJSONField(blank=True, null=True, default=None,
|
||||||
verbose_name=_('Name'), help_text='{"en-GB":"some text"}')
|
verbose_name=_('Name'), help_text='{"en-GB":"some text"}')
|
||||||
index_name = models.CharField(max_length=50, unique=True, db_index=True,
|
index_name = models.CharField(max_length=50, unique=True, db_index=True,
|
||||||
verbose_name=_('Index name'))
|
verbose_name=_('Index name'), choices=INDEX_CHOICES)
|
||||||
use_subtypes = models.BooleanField(_('Use subtypes'), default=True)
|
use_subtypes = models.BooleanField(_('Use subtypes'), default=True)
|
||||||
tag_categories = models.ManyToManyField('tag.TagCategory',
|
tag_categories = models.ManyToManyField('tag.TagCategory',
|
||||||
related_name='product_types',
|
related_name='product_types',
|
||||||
|
|
@ -222,7 +229,7 @@ class Product(GalleryModelMixin, TranslatedFieldsMixin, BaseAttributes,
|
||||||
default=None, null=True,
|
default=None, null=True,
|
||||||
verbose_name=_('Serial number'))
|
verbose_name=_('Serial number'))
|
||||||
|
|
||||||
sites = models.ManyToManyField(to='main.SiteSettings')
|
site = models.ForeignKey(to='main.SiteSettings', null=True, blank=True, on_delete=models.CASCADE)
|
||||||
|
|
||||||
objects = ProductManager.from_queryset(ProductQuerySet)()
|
objects = ProductManager.from_queryset(ProductQuerySet)()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ from product.serializers import ProductDetailSerializer, ProductTypeBaseSerializ
|
||||||
ProductSubTypeBaseSerializer
|
ProductSubTypeBaseSerializer
|
||||||
from tag.models import TagCategory
|
from tag.models import TagCategory
|
||||||
from account.serializers.common import UserShortSerializer
|
from account.serializers.common import UserShortSerializer
|
||||||
|
from main.serializers import SiteSettingsSerializer
|
||||||
|
|
||||||
class ProductBackOfficeGallerySerializer(serializers.ModelSerializer):
|
class ProductBackOfficeGallerySerializer(serializers.ModelSerializer):
|
||||||
"""Serializer class for model ProductGallery."""
|
"""Serializer class for model ProductGallery."""
|
||||||
|
|
@ -54,6 +54,7 @@ class ProductBackOfficeGallerySerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class ProductBackOfficeDetailSerializer(ProductDetailSerializer):
|
class ProductBackOfficeDetailSerializer(ProductDetailSerializer):
|
||||||
"""Product back-office detail serializer."""
|
"""Product back-office detail serializer."""
|
||||||
|
in_favorites = serializers.BooleanField(allow_null=True, read_only=True)
|
||||||
|
|
||||||
class Meta(ProductDetailSerializer.Meta):
|
class Meta(ProductDetailSerializer.Meta):
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
@ -67,9 +68,10 @@ class ProductBackOfficeDetailSerializer(ProductDetailSerializer):
|
||||||
# 'wine_sub_region',
|
# 'wine_sub_region',
|
||||||
'wine_village',
|
'wine_village',
|
||||||
'state',
|
'state',
|
||||||
|
'site',
|
||||||
|
'product_type'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class ProductTypeBackOfficeDetailSerializer(ProductTypeBaseSerializer):
|
class ProductTypeBackOfficeDetailSerializer(ProductTypeBaseSerializer):
|
||||||
"""Product type back-office detail serializer."""
|
"""Product type back-office detail serializer."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ class ProductBaseSerializer(serializers.ModelSerializer):
|
||||||
wine_colors = TagBaseSerializer(many=True, read_only=True)
|
wine_colors = TagBaseSerializer(many=True, read_only=True)
|
||||||
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, read_only=True)
|
||||||
wine_origins = EstablishmentWineOriginBaseSerializer(many=True, read_only=True)
|
wine_origins = EstablishmentWineOriginBaseSerializer(many=True, read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ from translation.models import Language
|
||||||
from account.models import Role, UserRole
|
from account.models import Role, UserRole
|
||||||
from location.models import Country, Address, City, Region
|
from location.models import Country, Address, City, Region
|
||||||
from main.models import SiteSettings
|
from main.models import SiteSettings
|
||||||
from product.models import Product
|
from product.models import Product, ProductType
|
||||||
|
|
||||||
class BaseTestCase(APITestCase):
|
class BaseTestCase(APITestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
@ -71,12 +71,19 @@ class BaseTestCase(APITestCase):
|
||||||
|
|
||||||
self.user_role.save()
|
self.user_role.save()
|
||||||
|
|
||||||
self.product = Product.objects.create()
|
self.product_type = ProductType.objects.create(index_name=ProductType.LIQUOR)
|
||||||
|
self.product_type.save()
|
||||||
|
|
||||||
|
self.product = Product.objects.create(name='Product')
|
||||||
self.product.save()
|
self.product.save()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class LiquorReviewerTests(BaseTestCase):
|
class LiquorReviewerTests(BaseTestCase):
|
||||||
def test_get(self):
|
def test_get(self):
|
||||||
|
self.product.product_type = self.product_type
|
||||||
|
self.product.save()
|
||||||
|
|
||||||
url = reverse("back:product:list-create")
|
url = reverse("back:product:list-create")
|
||||||
response = self.client.get(url, format='json')
|
response = self.client.get(url, format='json')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
@ -86,8 +93,6 @@ class LiquorReviewerTests(BaseTestCase):
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
def test_post_patch_put_delete(self):
|
def test_post_patch_put_delete(self):
|
||||||
# POST
|
|
||||||
|
|
||||||
data_post = {
|
data_post = {
|
||||||
"slug": None,
|
"slug": None,
|
||||||
"public_mark": None,
|
"public_mark": None,
|
||||||
|
|
@ -97,13 +102,13 @@ class LiquorReviewerTests(BaseTestCase):
|
||||||
"available": False,
|
"available": False,
|
||||||
"establishment": None,
|
"establishment": None,
|
||||||
"wine_village": None,
|
"wine_village": None,
|
||||||
"in_favorites": 'false',
|
"state": Product.PUBLISHED,
|
||||||
"state": Product.PUBLISHED
|
"site_id": self.site.id,
|
||||||
|
"product_type_id": self.product_type.id
|
||||||
}
|
}
|
||||||
|
|
||||||
url = reverse("back:product:list-create")
|
url = reverse("back:product:list-create")
|
||||||
response = self.client.post(url, data=data_post, format='json')
|
response = self.client.post(url, data=data_post, format='json')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||||
|
|
||||||
data_patch = {
|
data_patch = {
|
||||||
'name': 'Test product'
|
'name': 'Test product'
|
||||||
|
|
@ -112,3 +117,5 @@ class LiquorReviewerTests(BaseTestCase):
|
||||||
response = self.client.patch(url, data=data_patch, format='json')
|
response = self.client.patch(url, data=data_patch, format='json')
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,6 @@ class ProductListCreateBackOfficeView(BackOfficeListCreateMixin, ProductBackOffi
|
||||||
permission_classes = [IsLiquorReviewer]
|
permission_classes = [IsLiquorReviewer]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ProductTypeListCreateBackOfficeView(BackOfficeListCreateMixin,
|
class ProductTypeListCreateBackOfficeView(BackOfficeListCreateMixin,
|
||||||
ProductTypeBackOfficeMixinView,
|
ProductTypeBackOfficeMixinView,
|
||||||
generics.ListCreateAPIView):
|
generics.ListCreateAPIView):
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ from authorization.models import JWTRefreshToken
|
||||||
from utils.tokens import GMRefreshToken
|
from utils.tokens import GMRefreshToken
|
||||||
from establishment.models import EstablishmentSubType
|
from establishment.models import EstablishmentSubType
|
||||||
from location.models import Address
|
from location.models import Address
|
||||||
from product.models import Product
|
from product.models import Product, ProductType
|
||||||
|
|
||||||
|
|
||||||
class IsAuthenticatedAndTokenIsValid(permissions.BasePermission):
|
class IsAuthenticatedAndTokenIsValid(permissions.BasePermission):
|
||||||
|
|
@ -448,38 +448,62 @@ class IsLiquorReviewer(IsStandardUser):
|
||||||
]
|
]
|
||||||
|
|
||||||
pk_object = None
|
pk_object = None
|
||||||
product = None
|
roles = None
|
||||||
permission = False
|
permission = False
|
||||||
|
|
||||||
|
if 'site_id' in request.data and 'product_type_id' in request.data:
|
||||||
|
if request.data['site_id'] is not None \
|
||||||
|
and request.data['product_type_id'] is not None:
|
||||||
|
|
||||||
|
product_types = ProductType.objects. \
|
||||||
|
filter(index_name=ProductType.LIQUOR,
|
||||||
|
id=request.data['product_type_id'])
|
||||||
|
|
||||||
|
if product_types.exists():
|
||||||
|
roles = Role.objects.filter(role=Role.LIQUOR_REVIEWER,
|
||||||
|
site_id=request.data['site_id'])
|
||||||
|
|
||||||
if 'pk' in view.kwargs:
|
if 'pk' in view.kwargs:
|
||||||
pk_object = view.kwargs['pk']
|
pk_object = view.kwargs['pk']
|
||||||
|
|
||||||
if pk_object is not None:
|
if pk_object is not None:
|
||||||
product = Product.objects.get(pk=pk_object)
|
product = Product.objects.get(pk=pk_object)
|
||||||
|
if product.site_id is not None \
|
||||||
|
and product.product_type_id is not None:
|
||||||
|
|
||||||
if hasattr(product, 'sites') and product.sites.exists():
|
product_types = ProductType.objects. \
|
||||||
role = Role.objects.filter(role=Role.LIQUOR_REVIEWER, site__in=[site for site in product.sites])
|
filter(index_name=ProductType.LIQUOR,
|
||||||
permission = UserRole.objects.filter(user=request.user, role=role).exists()
|
id=product.product_type_id)
|
||||||
|
|
||||||
|
if product_types.exists():
|
||||||
|
roles = Role.objects.filter(role=Role.LIQUOR_REVIEWER,
|
||||||
|
site_id=product.site_id)
|
||||||
|
|
||||||
|
if roles is not None:
|
||||||
|
permission = UserRole.objects.filter(user=request.user, role__in=[role for role in roles])\
|
||||||
|
.exists()
|
||||||
|
|
||||||
rules.append(permission)
|
rules.append(permission)
|
||||||
return any(rules)
|
return any(rules)
|
||||||
|
|
||||||
def has_object_permission(self, request, view, obj):
|
#
|
||||||
rules = [
|
# def has_object_permission(self, request, view, obj):
|
||||||
super().has_object_permission(request, view, obj)
|
# rules = [
|
||||||
]
|
# super().has_object_permission(request, view, obj)
|
||||||
pk_object = None
|
# ]
|
||||||
product = None
|
# # pk_object = None
|
||||||
permission = False
|
# # product = None
|
||||||
|
# # permission = False
|
||||||
if 'pk' in view.kwargs:
|
# #
|
||||||
pk_object = view.kwargs['pk']
|
# # if 'pk' in view.kwargs:
|
||||||
|
# # pk_object = view.kwargs['pk']
|
||||||
if pk_object is not None:
|
# #
|
||||||
product = Product.objects.get(pk=pk_object)
|
# # if pk_object is not None:
|
||||||
|
# # 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])
|
# # if product.sites.exists():
|
||||||
permission = UserRole.objects.filter(user=request.user, role=role).exists()
|
# # role = Role.objects.filter(role=Role.LIQUOR_REVIEWER, site__in=[site for site in product.sites])
|
||||||
|
# # permission = UserRole.objects.filter(user=request.user, role=role).exists()
|
||||||
rules.append(permission)
|
# #
|
||||||
return any(rules)
|
# # rules.append(permission)
|
||||||
|
# return any(rules)
|
||||||
Loading…
Reference in New Issue
Block a user