Back news permissions
This commit is contained in:
parent
806a7d63e4
commit
e0352b7d93
20
apps/news/migrations/0036_news_site.py
Normal file
20
apps/news/migrations/0036_news_site.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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."""
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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']
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user