From 6b8fdf7eed9707858d1316abce935576899efec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Tue, 10 Dec 2019 10:45:35 +0300 Subject: [PATCH] Add migrate for product models --- apps/account/models.py | 5 +- apps/product/migrations/0021_product_sites.py | 19 +++++ apps/product/models.py | 2 + apps/product/tests.py | 79 +++++++++++++++++++ apps/product/views/back.py | 2 + apps/utils/permissions.py | 15 ++++ 6 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 apps/product/migrations/0021_product_sites.py create mode 100644 apps/product/tests.py diff --git a/apps/account/models.py b/apps/account/models.py index 8f6c6233..c5031ed7 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -36,6 +36,8 @@ class Role(ProjectBaseMixin): SALES_MAN = 8 WINERY_REVIEWER = 9 # Establishments subtype "winery" SELLER = 10 + LIQUOR_REVIEWER = 11 + ROLE_CHOICES = ( (STANDARD_USER, 'Standard user'), @@ -47,7 +49,8 @@ class Role(ProjectBaseMixin): (RESTAURANT_REVIEWER, 'Restaurant reviewer'), (SALES_MAN, 'Sales man'), (WINERY_REVIEWER, 'Winery reviewer'), - (SELLER, 'Seller') + (SELLER, 'Seller'), + (LIQUOR_REVIEWER, 'Liquor reviewer') ) role = models.PositiveIntegerField(verbose_name=_('Role'), choices=ROLE_CHOICES, null=False, blank=False) diff --git a/apps/product/migrations/0021_product_sites.py b/apps/product/migrations/0021_product_sites.py new file mode 100644 index 00000000..c68229fb --- /dev/null +++ b/apps/product/migrations/0021_product_sites.py @@ -0,0 +1,19 @@ +# 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'), + ), + ] diff --git a/apps/product/models.py b/apps/product/models.py index b125c7eb..902073ab 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -222,6 +222,8 @@ class Product(GalleryModelMixin, TranslatedFieldsMixin, BaseAttributes, default=None, null=True, verbose_name=_('Serial number')) + sites = models.ManyToManyField(to='main.SiteSettings') + objects = ProductManager.from_queryset(ProductQuerySet)() class Meta: diff --git a/apps/product/tests.py b/apps/product/tests.py new file mode 100644 index 00000000..91315117 --- /dev/null +++ b/apps/product/tests.py @@ -0,0 +1,79 @@ +from rest_framework.test import APITestCase +from rest_framework import status +from account.models import User +from http.cookies import SimpleCookie +from django.urls import reverse + +# Create your tests here. +from translation.models import Language +from account.models import Role, UserRole +from location.models import Country, Address, City, Region +from main.models import SiteSettings + + +class BaseTestCase(APITestCase): + def setUp(self): + self.username = 'sedragurda' + self.password = 'sedragurdaredips19' + self.email = 'sedragurda@desoz.com' + self.newsletter = True + self.user = User.objects.create_user( + username=self.username, + email=self.email, + password=self.password, + is_staff=True, + ) + # get tokens + tokens = User.create_jwt_tokens(self.user) + self.client.cookies = SimpleCookie( + {'access_token': tokens.get('access_token'), + 'refresh_token': tokens.get('refresh_token')}) + + + self.lang = Language.objects.create( + title='Russia', + locale='ru-RU' + ) + + self.country_ru = Country.objects.create( + name={'en-GB': 'Russian'}, + code='RU', + ) + + self.region = Region.objects.create(name='Moscow area', code='01', + country=self.country_ru) + self.region.save() + + self.city = City.objects.create( + name='Mosocow', code='01', + region=self.region, + country=self.country_ru) + self.city.save() + + self.address = Address.objects.create( + city=self.city, street_name_1='Krasnaya', + number=2, postal_code='010100') + self.address.save() + + self.site = SiteSettings.objects.create( + subdomain='ru', + country=self.country_ru + ) + + self.site.save() + + self.role = Role.objects.create(role=Role.LIQUOR_REVIEWER, + site=self.site) + self.role.save() + + self.user_role = UserRole.objects.create( + user=self.user, role=self.role) + + self.user_role.save() + + +class LiquorReviewerTests(BaseTestCase): + def test_get(self): + url = reverse("back:product:list-create") + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/apps/product/views/back.py b/apps/product/views/back.py index fc5e108f..3029e194 100644 --- a/apps/product/views/back.py +++ b/apps/product/views/back.py @@ -7,6 +7,7 @@ from product import serializers, models from product.views import ProductBaseView from utils.serializers import ImageBaseSerializer from utils.views import CreateDestroyGalleryViewMixin +from utils.permissions import IsLiquorReviewer class ProductBackOfficeMixinView(ProductBaseView): @@ -97,6 +98,7 @@ class ProductListCreateBackOfficeView(BackOfficeListCreateMixin, ProductBackOffi generics.ListCreateAPIView): """Product back-office list-create view.""" serializer_class = serializers.ProductBackOfficeDetailSerializer + permission_classes = [IsLiquorReviewer] class ProductTypeListCreateBackOfficeView(BackOfficeListCreateMixin, diff --git a/apps/utils/permissions.py b/apps/utils/permissions.py index 498f5932..3f1212d9 100644 --- a/apps/utils/permissions.py +++ b/apps/utils/permissions.py @@ -448,4 +448,19 @@ class IsWineryReviewer(IsStandardUser): ).exists(), super().has_object_permission(request, view, obj) ] + return any(rules) + + +class IsLiquorReviewer(IsStandardUser): + # Через establishment получать страну + def has_permission(self, request, view): + rules = [ + super().has_permission(request, view) + ] + return any(rules) + + def has_object_permission(self, request, view, obj): + rules = [ + super().has_object_permission(request, view, obj) + ] return any(rules) \ No newline at end of file