carousel api for news
This commit is contained in:
parent
f95a082db3
commit
7e878956e3
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user