carousel api for news

This commit is contained in:
alex 2019-11-22 16:22:31 +03:00
parent f95a082db3
commit 7e878956e3
6 changed files with 67 additions and 9 deletions

View File

@ -11,7 +11,7 @@ from news import models
from tag.serializers import TagBaseSerializer from tag.serializers import TagBaseSerializer
from utils import exceptions as utils_exceptions from utils import exceptions as utils_exceptions
from utils.serializers import (TranslatedField, ProjectModelSerializer, from utils.serializers import (TranslatedField, ProjectModelSerializer,
FavoritesCreateSerializer, ImageBaseSerializer) FavoritesCreateSerializer, ImageBaseSerializer, CarouselCreateSerializer)
class AgendaSerializer(ProjectModelSerializer): class AgendaSerializer(ProjectModelSerializer):
@ -269,3 +269,24 @@ class NewsFavoritesCreateSerializer(FavoritesCreateSerializer):
'content_object': validated_data.pop('news') 'content_object': validated_data.pop('news')
}) })
return super().create(validated_data) return super().create(validated_data)
class NewsCarouselCreateSerializer(CarouselCreateSerializer):
"""Serializer to carousel object w/ model News."""
def validate(self, attrs):
news = models.News.objects.filter(slug=self.slug).first()
if not news:
raise serializers.ValidationError({'detail': _('Object not found.')})
if news.carousels.exists():
raise utils_exceptions.CarouselError()
attrs['news'] = news
return attrs
def create(self, validated_data, *args, **kwargs):
validated_data.update({
'content_object': validated_data.pop('news')
})
return super().create(validated_data)

View File

@ -5,5 +5,8 @@ common_urlpatterns = [
path('', views.NewsListView.as_view(), name='list'), path('', views.NewsListView.as_view(), name='list'),
path('types/', views.NewsTypeListView.as_view(), name='type'), path('types/', views.NewsTypeListView.as_view(), name='type'),
path('slug/<slug:slug>/', views.NewsDetailView.as_view(), name='rud'), path('slug/<slug:slug>/', views.NewsDetailView.as_view(), name='rud'),
path('slug/<slug:slug>/favorites/', views.NewsFavoritesCreateDestroyView.as_view(), name='create-destroy-favorites') path('slug/<slug:slug>/favorites/', views.NewsFavoritesCreateDestroyView.as_view(),
name='create-destroy-favorites'),
path('slug/<slug:slug>/carousels/', views.NewsCarouselCreateDestroyView.as_view(),
name='create-destroy-carousels'),
] ]

View File

@ -6,7 +6,7 @@ from rest_framework import generics, permissions
from news import filters, models, serializers from news import filters, models, serializers
from rating.tasks import add_rating from rating.tasks import add_rating
from utils.permissions import IsCountryAdmin, IsContentPageManager from utils.permissions import IsCountryAdmin, IsContentPageManager
from utils.views import CreateDestroyGalleryViewMixin, FavoritesCreateDestroyMixinView from utils.views import CreateDestroyGalleryViewMixin, FavoritesCreateDestroyMixinView, CarouselCreateDestroyMixinView
from utils.serializers import ImageBaseSerializer from utils.serializers import ImageBaseSerializer
@ -155,3 +155,10 @@ class NewsFavoritesCreateDestroyView(FavoritesCreateDestroyMixinView):
_model = models.News _model = models.News
serializer_class = serializers.NewsFavoritesCreateSerializer serializer_class = serializers.NewsFavoritesCreateSerializer
class NewsCarouselCreateDestroyView(CarouselCreateDestroyMixinView):
"""View for create/destroy news from carousel."""
_model = models.News
serializer_class = serializers.NewsCarouselCreateSerializer

View File

@ -135,6 +135,14 @@ class FavoritesError(exceptions.APIException):
default_detail = _('Item is already in favorites.') default_detail = _('Item is already in favorites.')
class CarouselError(exceptions.APIException):
"""
The exception should be thrown when the object is already in carousels.
"""
status_code = status.HTTP_400_BAD_REQUEST
default_detail = _('Item is already in carousels.')
class PasswordResetRequestExistedError(exceptions.APIException): class PasswordResetRequestExistedError(exceptions.APIException):
""" """
The exception should be thrown when password reset request The exception should be thrown when password reset request

View File

@ -2,10 +2,11 @@
import pytz import pytz
from django.core import exceptions from django.core import exceptions
from rest_framework import serializers from rest_framework import serializers
from utils import models
from translation.models import Language
from favorites.models import Favorites from favorites.models import Favorites
from gallery.models import Image from main.models import Carousel
from translation.models import Language
from utils import models
class EmptySerializer(serializers.Serializer): class EmptySerializer(serializers.Serializer):
@ -80,7 +81,6 @@ class FavoritesCreateSerializer(serializers.ModelSerializer):
"""Serializer to favorite object.""" """Serializer to favorite object."""
class Meta: class Meta:
"""Serializer for model Comment."""
model = Favorites model = Favorites
fields = [ fields = [
'id', 'id',
@ -101,6 +101,24 @@ class FavoritesCreateSerializer(serializers.ModelSerializer):
return self.request.parser_context.get('kwargs').get('slug') return self.request.parser_context.get('kwargs').get('slug')
class CarouselCreateSerializer(serializers.ModelSerializer):
"""Carousel to favorite object."""
class Meta:
model = Carousel
fields = [
'id',
]
@property
def request(self):
return self.context.get('request')
@property
def slug(self):
return self.request.parser_context.get('kwargs').get('slug')
class RecursiveFieldSerializer(serializers.Serializer): class RecursiveFieldSerializer(serializers.Serializer):
def to_representation(self, value): def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context) serializer = self.parent.parent.__class__(value, context=self.context)

View File

@ -170,9 +170,10 @@ class CarouselCreateDestroyMixinView(BaseCreateDestroyMixinView):
Returns the object the view is displaying. Returns the object the view is displaying.
""" """
obj = self.get_base_object() obj = self.get_base_object()
carousels = get_object_or_404(obj.carousels.filter(user=self.request.user)) carousels = get_object_or_404(obj.carousels.all())
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, carousels) # TODO: возможно нужны пермишены
# self.check_object_permissions(self.request, carousels)
return carousels return carousels