added bo endpoints for ads

This commit is contained in:
Anatoly 2019-11-18 12:48:24 +03:00
parent 4412e39e96
commit d0fec2591f
10 changed files with 163 additions and 4 deletions

View File

@ -2,11 +2,12 @@
import uuid
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from main.models import Page
from translation.models import Language
from utils.models import ProjectBaseMixin, ImageMixin, PlatformMixin, URLImageMixin
from main.models import Page
class AdvertisementQuerySet(models.QuerySet):
@ -25,6 +26,10 @@ class AdvertisementQuerySet(models.QuerySet):
"""Filter by locale."""
return self.filter(target_languages__locale=locale)
def valid(self):
"""Return only valid advertisements."""
return self.filter(end__lte=timezone.now())
class Advertisement(ProjectBaseMixin):
"""Advertisement model."""

View File

@ -1,3 +1,4 @@
from .common import *
from .mobile import *
from .web import *
from .back import *

View File

@ -0,0 +1,26 @@
"""Serializers for back office app advertisements"""
from main.serializers import PageBaseSerializer
class AdvertisementPageBaseSerializer(PageBaseSerializer):
"""Base serializer for linking page w/ advertisement."""
class Meta(PageBaseSerializer.Meta):
"""Meta class."""
PageBaseSerializer.Meta.extra_kwargs.update({
'advertisement': {'write_only': True},
'image_url': {'required': True},
'width': {'required': True},
'height': {'required': True},
})
class AdvertisementPageListCreateSerializer(AdvertisementPageBaseSerializer):
"""Serializer for linking page w/ advertisement."""
def create(self, validated_data):
"""Overridden create method."""
validated_data['advertisement'] = self.context.get('view').get_object()
return super().create(validated_data)

View File

@ -3,15 +3,28 @@ from rest_framework import serializers
from advertisement import models
from translation.serializers import LanguageSerializer
from main.serializers import SiteShortSerializer
from main.serializers import PageBaseSerializer
from main.serializers import SiteShortSerializer, PageBaseSerializer
from translation.models import Language
from main.models import SiteSettings
class AdvertisementBaseSerializer(serializers.ModelSerializer):
"""Base serializer for model Advertisement."""
languages = LanguageSerializer(many=True, read_only=True)
languages = LanguageSerializer(many=True, read_only=True,
source='target_languages')
target_languages = serializers.PrimaryKeyRelatedField(
queryset=Language.objects.all(),
many=True,
write_only=True
)
sites = SiteShortSerializer(many=True, read_only=True)
target_sites = serializers.PrimaryKeyRelatedField(
queryset=SiteSettings.objects.all(),
many=True,
write_only=True,
source='sites'
)
class Meta:
model = models.Advertisement
@ -21,7 +34,9 @@ class AdvertisementBaseSerializer(serializers.ModelSerializer):
'url',
'block_level',
'languages',
'target_languages',
'sites',
'target_sites',
'start',
'end',
]

View File

@ -0,0 +1,18 @@
"""Advertisement back office urlpaths."""
from django.urls import path
from advertisement import views
from advertisement.urls.common import common_urlpatterns
app_name = 'advertisements'
urlpatterns = [
path('', views.AdvertisementListCreateView.as_view(), name='list-create'),
path('<int:pk>/', views.AdvertisementRUDView.as_view(), name='rud'),
path('<int:pk>/page/', views.AdvertisementPageListCreateView.as_view(),
name='page-list-create'),
path('<int:ad_pk>/page/<int:page_pk>/', views.AdvertisementPageRUDView.as_view(),
name='page-rud')
]
urlpatterns += common_urlpatterns

View File

@ -1,5 +1,6 @@
"""Advertisement common urlpaths."""
from django.urls import path
from advertisement import views
app_name = 'advertisements'

View File

@ -1,3 +1,4 @@
from .common import *
from .mobile import *
from .web import *
from .back import *

View File

@ -0,0 +1,86 @@
"""Back office views for app advertisement"""
from rest_framework import generics
from rest_framework import permissions
from django.shortcuts import get_object_or_404
from advertisement.models import Advertisement
from rest_framework.response import Response
from rest_framework import status
from advertisement.serializers import (AdvertisementBaseSerializer,
AdvertisementPageBaseSerializer,
AdvertisementPageListCreateSerializer)
class AdvertisementBackOfficeViewMixin(generics.GenericAPIView):
"""Base back office advertisement view."""
permission_classes = (permissions.IsAuthenticated, )
def get_queryset(self):
"""Overridden get queryset method."""
return Advertisement.objects.with_base_related()
class AdvertisementListCreateView(AdvertisementBackOfficeViewMixin, generics.ListCreateAPIView):
"""List|Create advertisement view."""
serializer_class = AdvertisementBaseSerializer
class AdvertisementRUDView(AdvertisementBackOfficeViewMixin,
generics.RetrieveUpdateDestroyAPIView):
"""Retrieve|Update|Destroy advertisement page view."""
serializer_class = AdvertisementBaseSerializer
def delete(self, request, *args, **kwargs):
instance = self.get_object()
# Delete all object that linked to this advertisement
instance.pages.all().delete()
# Delete an instance
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
class AdvertisementPageListCreateView(AdvertisementBackOfficeViewMixin,
generics.ListCreateAPIView):
"""Retrieve|Update|Destroy advertisement page view."""
serializer_class = AdvertisementPageListCreateSerializer
def get_object(self):
"""Returns the object the view is displaying."""
ad_qs = Advertisement.objects.all()
filtered_ad_qs = self.filter_queryset(ad_qs)
ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs['pk'])
# May raise a permission denied
self.check_object_permissions(self.request, ad)
return ad
def get_queryset(self):
"""Overridden get_queryset method."""
return self.get_object().pages.all()
class AdvertisementPageRUDView(AdvertisementBackOfficeViewMixin,
generics.CreateAPIView,
generics.RetrieveUpdateDestroyAPIView):
"""Create|Retrieve|Update|Destroy advertisement page view."""
serializer_class = AdvertisementPageBaseSerializer
def get_object(self):
"""Returns the object the view is displaying."""
ad_qs = Advertisement.objects.all()
filtered_ad_qs = self.filter_queryset(ad_qs)
ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs['ad_pk'])
page = get_object_or_404(ad.pages.all(), pk=self.kwargs['page_pk'])
# May raise a permission denied
self.check_object_permissions(self.request, page)
return page

View File

@ -186,7 +186,11 @@ class PageBaseSerializer(serializers.ModelSerializer):
'image_url',
'width',
'height',
'advertisement',
]
extra_kwargs = {
'establishment': {'write_only': True}
}
class PageTypeBaseSerializer(serializers.ModelSerializer):

View File

@ -13,5 +13,7 @@ urlpatterns = [
path('review/', include('review.urls.back')),
path('tags/', include(('tag.urls.back', 'tag'), namespace='tag')),
path('products/', include(('product.urls.back', 'product'), namespace='product')),
path('re_blocks/', include(('advertisement.urls.back', 'advertisement'),
namespace='advertisement')),
]