Back news permissions

This commit is contained in:
Виктор Гладких 2019-11-22 15:46:59 +03:00
parent 806a7d63e4
commit e0352b7d93
7 changed files with 56 additions and 17 deletions

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2019-11-22 09:12
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0037_sitesettings_old_id'),
('news', '0035_news_views_count'),
]
operations = [
migrations.AddField(
model_name='news',
name='site',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.SiteSettings', verbose_name='site settings'),
),
]

View File

@ -203,7 +203,8 @@ class News(GalleryModelMixin, BaseAttributes, TranslatedFieldsMixin, HasTagsMixi
banner = models.ForeignKey('news.NewsBanner', blank=True, null=True, banner = models.ForeignKey('news.NewsBanner', blank=True, null=True,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
verbose_name=_('banner')) verbose_name=_('banner'))
site = models.ForeignKey('main.SiteSettings', blank=True, null=True,
on_delete=models.SET_NULL, verbose_name=_('site settings'))
objects = NewsQuerySet.as_manager() objects = NewsQuerySet.as_manager()
class Meta: class Meta:

View File

@ -5,6 +5,7 @@ from rest_framework.fields import SerializerMethodField
from account.serializers.common import UserBaseSerializer from account.serializers.common import UserBaseSerializer
from gallery.models import Image from gallery.models import Image
from main.models import SiteSettings
from location import models as location_models from location import models as location_models
from location.serializers import CountrySimpleSerializer, AddressBaseSerializer from location.serializers import CountrySimpleSerializer, AddressBaseSerializer
from news import models from news import models
@ -65,7 +66,6 @@ class NewsBaseSerializer(ProjectModelSerializer):
subtitle_translated = TranslatedField() subtitle_translated = TranslatedField()
news_type = NewsTypeSerializer(read_only=True) news_type = NewsTypeSerializer(read_only=True)
tags = TagBaseSerializer(read_only=True, many=True, source='visible_tags') tags = TagBaseSerializer(read_only=True, many=True, source='visible_tags')
in_favorites = serializers.BooleanField(allow_null=True)
view_counter = serializers.IntegerField(read_only=True) view_counter = serializers.IntegerField(read_only=True)
class Meta: class Meta:
@ -80,7 +80,6 @@ class NewsBaseSerializer(ProjectModelSerializer):
'news_type', 'news_type',
'tags', 'tags',
'slug', 'slug',
'in_favorites',
'view_counter', 'view_counter',
) )
@ -184,6 +183,9 @@ class NewsBackOfficeDetailSerializer(NewsBackOfficeBaseSerializer,
country_id = serializers.PrimaryKeyRelatedField( country_id = serializers.PrimaryKeyRelatedField(
source='country', write_only=True, source='country', write_only=True,
queryset=location_models.Country.objects.all()) queryset=location_models.Country.objects.all())
site_id = serializers.PrimaryKeyRelatedField(
source='site', write_only=True,
queryset=SiteSettings.objects.all())
template_display = serializers.CharField(source='get_template_display', template_display = serializers.CharField(source='get_template_display',
read_only=True) read_only=True)
@ -195,6 +197,7 @@ class NewsBackOfficeDetailSerializer(NewsBackOfficeBaseSerializer,
'description', 'description',
'news_type_id', 'news_type_id',
'country_id', 'country_id',
'site_id',
'template', 'template',
'template_display', 'template_display',
) )

View File

@ -5,6 +5,7 @@ from rest_framework.test import APITestCase
from rest_framework import status from rest_framework import status
from datetime import datetime, timedelta from datetime import datetime, timedelta
from main.models import SiteSettings
from news.models import NewsType, News from news.models import NewsType, News
from account.models import User, Role, UserRole from account.models import User, Role, UserRole
from translation.models import Language from translation.models import Language
@ -30,18 +31,22 @@ class BaseTestCase(APITestCase):
'refresh_token': tokens.get('refresh_token')}) 'refresh_token': tokens.get('refresh_token')})
self.test_news_type = NewsType.objects.create(name="Test news type") self.test_news_type = NewsType.objects.create(name="Test news type")
self.lang = Language.objects.get( self.lang, created = Language.objects.get_or_create(
title='Russia', title='Russia',
locale='ru-RU' locale='ru-RU'
) )
self.country_ru = Country.objects.get( self.country_ru, created = Country.objects.get_or_create(
name={"en-GB": "Russian"} name={"en-GB": "Russian"}
) )
self.site_ru, created = SiteSettings.objects.get_or_create(
subdomain='ru'
)
role = Role.objects.create( role = Role.objects.create(
role=Role.CONTENT_PAGE_MANAGER, role=Role.CONTENT_PAGE_MANAGER,
country=self.country_ru site_id=self.site_ru.id
) )
role.save() role.save()
@ -51,16 +56,18 @@ class BaseTestCase(APITestCase):
) )
user_role.save() user_role.save()
self.test_news = News.objects.create( self.test_news = News.objects.create(
created_by=self.user, modified_by=self.user, created_by=self.user, modified_by=self.user,
title={"en-GB": "Test news"}, title={"ru-RU": "Test news"},
news_type=self.test_news_type, news_type=self.test_news_type,
description={"en-GB": "Description test news"}, description={"ru-RU": "Description test news"},
start=datetime.now() + timedelta(hours=-2), start=datetime.now() + timedelta(hours=-2),
end=datetime.now() + timedelta(hours=2), end=datetime.now() + timedelta(hours=2),
state=News.PUBLISHED, state=News.PUBLISHED,
slug='test-news-slug', slug='test-news-slug',
country=self.country_ru, country=self.country_ru,
site=self.site_ru
) )
@ -70,14 +77,15 @@ class NewsTestCase(BaseTestCase):
def test_news_post(self): def test_news_post(self):
test_news = { test_news = {
"title": {"en-GB": "Test news POST"}, "title": {"ru-RU": "Test news POST"},
"news_type_id": self.test_news_type.id, "news_type_id": self.test_news_type.id,
"description": {"en-GB": "Description test news"}, "description": {"ru-RU": "Description test news"},
"start": datetime.now() + timedelta(hours=-2), "start": datetime.now() + timedelta(hours=-2),
"end": datetime.now() + timedelta(hours=2), "end": datetime.now() + timedelta(hours=2),
"state": News.PUBLISHED, "state": News.PUBLISHED,
"slug": 'test-news-slug_post', "slug": 'test-news-slug_post',
"country_id": self.country_ru.id, "country_id": self.country_ru.id,
"site_id": self.site_ru.id
} }
url = reverse("back:news:list-create") url = reverse("back:news:list-create")
@ -107,7 +115,7 @@ class NewsTestCase(BaseTestCase):
url = reverse('back:news:retrieve-update-destroy', kwargs={'pk': self.test_news.id}) url = reverse('back:news:retrieve-update-destroy', kwargs={'pk': self.test_news.id})
data = { data = {
'id': self.test_news.id, 'id': self.test_news.id,
'description': {"en-GB": "Description test news!"}, 'description': {"ru-RU": "Description test news!"},
'slug': self.test_news.slug, 'slug': self.test_news.slug,
'start': self.test_news.start, 'start': self.test_news.start,
'news_type_id': self.test_news.news_type_id, 'news_type_id': self.test_news.news_type_id,

View File

@ -84,7 +84,8 @@ class NewsBackOfficeLCView(NewsBackOfficeMixinView,
serializer_class = serializers.NewsBackOfficeBaseSerializer serializer_class = serializers.NewsBackOfficeBaseSerializer
filter_class = filters.NewsListFilterSet filter_class = filters.NewsListFilterSet
create_serializers_class = serializers.NewsBackOfficeDetailSerializer create_serializers_class = serializers.NewsBackOfficeDetailSerializer
permission_classes = [IsCountryAdmin | IsContentPageManager] # IsCountryAdmin |
permission_classes = [ IsContentPageManager]
def get_serializer_class(self): def get_serializer_class(self):
"""Override serializer class.""" """Override serializer class."""

View File

@ -119,8 +119,14 @@ class IsContentPageManager(IsStandardUser):
] ]
# and request.user.email_confirmed, # and request.user.email_confirmed,
if hasattr(request, 'user'): if hasattr(request, 'user'):
site_id = None
if hasattr(request, 'data'):
site_id = request.data['site_id']
else:
site_id = request.site_id
role = Role.objects.filter(role=Role.CONTENT_PAGE_MANAGER, role = Role.objects.filter(role=Role.CONTENT_PAGE_MANAGER,
country_id=request.country_id) \ site_id=site_id) \
.first() # 'Comments moderator' .first() # 'Comments moderator'
rules = [ rules = [
@ -134,12 +140,11 @@ class IsContentPageManager(IsStandardUser):
# Read permissions are allowed to any request. # Read permissions are allowed to any request.
role = Role.objects.filter(role=Role.CONTENT_PAGE_MANAGER, role = Role.objects.filter(role=Role.CONTENT_PAGE_MANAGER,
country_id=obj.country_id) \ site_id=obj.site_id) \
.first() # 'Comments moderator' .first()
rules = [ rules = [
UserRole.objects.filter(user=request.user, role=role).exists(), UserRole.objects.filter(user=request.user, role=role).exists(),
# and obj.user != request.user,
super().has_object_permission(request, view, obj) super().has_object_permission(request, view, obj)
] ]
return any(rules) return any(rules)

View File

@ -36,7 +36,7 @@ THUMBNAIL_DEBUG = True
# ADDED TRANSFER APP # ADDED TRANSFER APP
INSTALLED_APPS.append('transfer.apps.TransferConfig') # INSTALLED_APPS.append('transfer.apps.TransferConfig')
# DATABASES # DATABASES
@ -101,6 +101,7 @@ ELASTICSEARCH_INDEX_NAMES = {
'search_indexes.documents.establishment': 'local_establishment', 'search_indexes.documents.establishment': 'local_establishment',
'search_indexes.documents.product': 'local_product', 'search_indexes.documents.product': 'local_product',
} }
ELASTICSEARCH_DSL_AUTOSYNC = False
TESTING = sys.argv[1:2] == ['test'] TESTING = sys.argv[1:2] == ['test']