create, delete, get favorite news
This commit is contained in:
parent
28471686be
commit
d853960d2e
|
|
@ -10,4 +10,6 @@ urlpatterns = [
|
|||
name='establishment-list'),
|
||||
path('products/', views.FavoritesProductListView.as_view(),
|
||||
name='product-list'),
|
||||
path('news/', views.FavoritesNewsListView.as_view(),
|
||||
name='news-list'),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -3,6 +3,9 @@ from rest_framework import generics
|
|||
from establishment.models import Establishment
|
||||
from establishment.filters import EstablishmentFilter
|
||||
from establishment.serializers import EstablishmentBaseSerializer
|
||||
from news.filters import NewsListFilterSet
|
||||
from news.models import News
|
||||
from news.serializers import NewsBaseSerializer
|
||||
from product.models import Product
|
||||
from product.serializers import ProductBaseSerializer
|
||||
from product.filters import ProductFilterSet
|
||||
|
|
@ -39,3 +42,14 @@ class FavoritesProductListView(generics.ListAPIView):
|
|||
"""Override get_queryset method"""
|
||||
return Product.objects.filter(favorites__user=self.request.user) \
|
||||
.order_by('-favorites')
|
||||
|
||||
|
||||
class FavoritesNewsListView(generics.ListAPIView):
|
||||
"""List views for news in favorites."""
|
||||
|
||||
serializer_class = NewsBaseSerializer
|
||||
filter_class = NewsListFilterSet
|
||||
|
||||
def get_queryset(self):
|
||||
"""Override get_queryset method"""
|
||||
return News.objects.filter(favorites__user=self.request.user).order_by('-favorites')
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ class News(BaseAttributes, TranslatedFieldsMixin):
|
|||
verbose_name=_('Tags'))
|
||||
gallery = models.ManyToManyField('gallery.Image', through='news.NewsGallery')
|
||||
ratings = generic.GenericRelation(Rating)
|
||||
|
||||
favorites = generic.GenericRelation(to='favorites.Favorites')
|
||||
agenda = models.ForeignKey('news.Agenda', blank=True, null=True,
|
||||
on_delete=models.SET_NULL,
|
||||
verbose_name=_('agenda'))
|
||||
|
|
|
|||
|
|
@ -8,7 +8,8 @@ from location import models as location_models
|
|||
from location.serializers import CountrySimpleSerializer, AddressBaseSerializer
|
||||
from news import models
|
||||
from tag.serializers import TagBaseSerializer
|
||||
from utils.serializers import TranslatedField, ProjectModelSerializer
|
||||
from utils import exceptions as utils_exceptions
|
||||
from utils.serializers import TranslatedField, ProjectModelSerializer, FavoritesCreateSerializer
|
||||
|
||||
|
||||
class AgendaSerializer(ProjectModelSerializer):
|
||||
|
|
@ -293,3 +294,33 @@ class NewsBackOfficeGallerySerializer(serializers.ModelSerializer):
|
|||
attrs['image'] = image
|
||||
|
||||
return attrs
|
||||
|
||||
|
||||
class NewsFavoritesCreateSerializer(FavoritesCreateSerializer):
|
||||
"""Serializer to favorite object w/ model News."""
|
||||
|
||||
def validate(self, attrs):
|
||||
"""Overridden validate method"""
|
||||
# Check establishment object
|
||||
news_qs = models.News.objects.filter(slug=self.slug)
|
||||
|
||||
# Check establishment obj by slug from lookup_kwarg
|
||||
if not news_qs.exists():
|
||||
raise serializers.ValidationError({'detail': _('Object not found.')})
|
||||
else:
|
||||
news = news_qs.first()
|
||||
|
||||
# Check existence in favorites
|
||||
if news.favorites.filter(user=self.user).exists():
|
||||
raise utils_exceptions.FavoritesError()
|
||||
|
||||
attrs['news'] = news
|
||||
return attrs
|
||||
|
||||
def create(self, validated_data, *args, **kwargs):
|
||||
"""Overridden create method"""
|
||||
validated_data.update({
|
||||
'user': self.user,
|
||||
'content_object': validated_data.pop('news')
|
||||
})
|
||||
return super().create(validated_data)
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@ from news.models import NewsType, News
|
|||
from account.models import User, Role, UserRole
|
||||
from translation.models import Language
|
||||
from location.models import Country
|
||||
|
||||
|
||||
# Create your tests here.
|
||||
|
||||
|
||||
|
|
@ -114,3 +116,15 @@ class NewsTestCase(BaseTestCase):
|
|||
|
||||
response = self.client.put(url, data=data, format='json')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
|
||||
def test_web_favorite_create_delete(self):
|
||||
data = {
|
||||
"user": self.user.id,
|
||||
"object_id": self.test_news.id
|
||||
}
|
||||
|
||||
response = self.client.post(f'/api/web/news/slug/{self.test_news.slug}/favorites/', data=data)
|
||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||
|
||||
response = self.client.delete(f'/api/web/news/slug/{self.test_news.slug}/favorites/', format='json')
|
||||
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
|
||||
|
|
|
|||
|
|
@ -8,4 +8,5 @@ urlpatterns = [
|
|||
path('', views.NewsListView.as_view(), name='list'),
|
||||
path('types/', views.NewsTypeListView.as_view(), name='type'),
|
||||
path('slug/<slug:slug>/', views.NewsDetailView.as_view(), name='rud'),
|
||||
path('slug/<slug:slug>/favorites/', views.NewsFavoritesCreateDestroyView.as_view(), name='create-destroy-favorites')
|
||||
]
|
||||
|
|
|
|||
|
|
@ -152,3 +152,20 @@ class NewsBackOfficeRUDView(NewsBackOfficeMixinView,
|
|||
add_rating(remote_addr=request.META.get('REMOTE_ADDR'),
|
||||
pk=pk, model='news', app_label='news')
|
||||
return self.retrieve(request, *args, **kwargs)
|
||||
|
||||
|
||||
class NewsFavoritesCreateDestroyView(generics.CreateAPIView, generics.DestroyAPIView):
|
||||
"""View for create/destroy news from favorites."""
|
||||
|
||||
serializer_class = serializers.NewsFavoritesCreateSerializer
|
||||
lookup_field = 'slug'
|
||||
|
||||
def get_object(self):
|
||||
"""
|
||||
Returns the object the view is displaying.
|
||||
"""
|
||||
news = get_object_or_404(models.News, slug=self.kwargs['slug'])
|
||||
favorites = get_object_or_404(news.favorites.filter(user=self.request.user))
|
||||
# May raise a permission denied
|
||||
self.check_object_permissions(self.request, favorites)
|
||||
return favorites
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user