diff --git a/apps/main/models.py b/apps/main/models.py index ea853c04..8856bec5 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -20,8 +20,10 @@ from review.models import Review from tag.models import Tag from utils.exceptions import UnprocessableEntityError from utils.methods import dictfetchall -from utils.models import (ProjectBaseMixin, TJSONField, URLImageMixin, - TranslatedFieldsMixin, PlatformMixin) +from utils.models import ( + ProjectBaseMixin, TJSONField, URLImageMixin, + TranslatedFieldsMixin, PlatformMixin, +) class Currency(TranslatedFieldsMixin, models.Model): @@ -156,10 +158,10 @@ class SiteFeature(ProjectBaseMixin): published = models.BooleanField(default=False, verbose_name=_('Published')) main = models.BooleanField(default=False, help_text='shows on main page', - verbose_name=_('Main'),) + verbose_name=_('Main'), ) backoffice = models.BooleanField(default=False, help_text='shows on backoffice page', - verbose_name=_('backoffice'),) + verbose_name=_('backoffice'), ) nested = models.ManyToManyField('self', blank=True, symmetrical=False) old_id = models.IntegerField(null=True, blank=True) @@ -458,7 +460,7 @@ class Panel(ProjectBaseMixin): } with connections['default'].cursor() as cursor: count = self._raw_count(raw) - start = page*page_size + start = page * page_size cursor.execute(*self.set_limits(start, page_size)) data["count"] = count data["next"] = self.get_next_page(count, page, page_size) @@ -468,7 +470,7 @@ class Panel(ProjectBaseMixin): return data def get_next_page(self, count, page, page_size): - max_page = count/page_size-1 + max_page = count / page_size - 1 if not 0 <= page <= max_page: raise exceptions.NotFound('Invalid page.') if max_page > page: diff --git a/apps/main/serializers/common.py b/apps/main/serializers/common.py index 6a556ee6..9eccd718 100644 --- a/apps/main/serializers/common.py +++ b/apps/main/serializers/common.py @@ -5,7 +5,7 @@ from rest_framework import serializers from location.serializers import CountrySerializer from main import models from tag.serializers import TagBackOfficeSerializer -from utils.serializers import ProjectModelSerializer, TranslatedField, RecursiveFieldSerializer +from utils.serializers import ProjectModelSerializer, RecursiveFieldSerializer, TranslatedField class FeatureSerializer(serializers.ModelSerializer): diff --git a/apps/main/urls/common.py b/apps/main/urls/common.py index 6b8f26ce..9741ca60 100644 --- a/apps/main/urls/common.py +++ b/apps/main/urls/common.py @@ -9,4 +9,10 @@ common_urlpatterns = [ path('awards//', AwardRetrieveView.as_view(), name='awards_retrieve'), path('carousel/', CarouselListView.as_view(), name='carousel-list'), path('determine-location/', DetermineLocation.as_view(), name='determine-location'), + path('content-pages/', ContentPageView.as_view(), name='content-pages-list'), + path('content-pages//', ContentPageIdRetrieveView.as_view(), name='content-pages-retrieve-id'), + path('content-pages/create/', ContentPageAdminView.as_view(), name='content-pages-admin-list'), + path('content-pages/slug//', ContentPageRetrieveView.as_view(), name='content-pages-retrieve-slug'), + path('content-pages/update/slug//', ContentPageRetrieveAdminView.as_view(), + name='content-pages-admin-retrieve') ] diff --git a/apps/main/views/common.py b/apps/main/views/common.py index c565998d..b93096b4 100644 --- a/apps/main/views/common.py +++ b/apps/main/views/common.py @@ -1,10 +1,15 @@ """Main app views.""" from django.http import Http404 -from django.conf import settings from rest_framework import generics, permissions +from rest_framework.renderers import StaticHTMLRenderer from rest_framework.response import Response from main import methods, models, serializers +from news.models import News, NewsType +from news.serializers import NewsDetailSerializer, NewsListSerializer +from news.views import NewsMixinView +from utils.serializers import EmptySerializer + # # class FeatureViewMixin: @@ -42,7 +47,6 @@ from main import methods, models, serializers # class SiteFeaturesRUDView(SiteFeaturesViewMixin, # generics.RetrieveUpdateDestroyAPIView): # """Site features RUD.""" -from utils.serializers import EmptySerializer class AwardView(generics.ListAPIView): @@ -95,3 +99,72 @@ class DetermineLocation(generics.GenericAPIView): 'country_code': country_code, }) raise Http404 + + +class ContentPageBaseView(generics.GenericAPIView): + + @property + def static_page_category(self): + name = 'static' + + static_page_category = NewsType.objects.filter(name=name).first() + + if static_page_category is None: + static_page_category = NewsType.objects.create(name=name) + + return static_page_category + + def get_queryset(self): + return super().get_queryset().filter(news_type=self.static_page_category) + + +class ContentPageView(ContentPageBaseView, generics.ListAPIView): + """Method to get content pages""" + + permission_classes = (permissions.AllowAny,) + serializer_class = NewsListSerializer + queryset = News.objects.all() + + +class ContentPageAdminView(generics.ListCreateAPIView): + """Method to get content pages""" + + permission_classes = (permissions.IsAdminUser,) + serializer_class = NewsListSerializer + queryset = News.objects.all() + + +class ContentPageRetrieveView(NewsMixinView, generics.RetrieveAPIView): + """Retrieve method to get content pages""" + + lookup_field = None + permission_classes = (permissions.AllowAny,) + serializer_class = NewsDetailSerializer + queryset = News.objects.all() + renderer_classes = [StaticHTMLRenderer] + + def get(self, request, *args, **kwargs): + instance = self.get_object() + return Response(instance.description.get(request.locale)) + + +class ContentPageIdRetrieveView(generics.RetrieveAPIView): + """Retrieve method to get content pages""" + + permission_classes = (permissions.AllowAny,) + serializer_class = NewsDetailSerializer + queryset = News.objects.all() + renderer_classes = [StaticHTMLRenderer] + + def get(self, request, *args, **kwargs): + instance = self.get_object() + return Response(instance.description.get(request.locale)) + + +class ContentPageRetrieveAdminView(NewsMixinView, generics.RetrieveUpdateDestroyAPIView): + """Retrieve method to get content pages""" + + lookup_field = None + permission_classes = (permissions.IsAdminUser,) + serializer_class = NewsDetailSerializer + queryset = News.objects.all()