added bo endpoints for ads
This commit is contained in:
parent
4412e39e96
commit
d0fec2591f
|
|
@ -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."""
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from .common import *
|
||||
from .mobile import *
|
||||
from .web import *
|
||||
from .back import *
|
||||
|
|
|
|||
26
apps/advertisement/serializers/back.py
Normal file
26
apps/advertisement/serializers/back.py
Normal 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)
|
||||
|
|
@ -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',
|
||||
]
|
||||
|
|
|
|||
18
apps/advertisement/urls/back.py
Normal file
18
apps/advertisement/urls/back.py
Normal 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
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
"""Advertisement common urlpaths."""
|
||||
from django.urls import path
|
||||
from advertisement import views
|
||||
|
||||
|
||||
app_name = 'advertisements'
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
from .common import *
|
||||
from .mobile import *
|
||||
from .web import *
|
||||
from .back import *
|
||||
|
|
|
|||
86
apps/advertisement/views/back.py
Normal file
86
apps/advertisement/views/back.py
Normal 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
|
||||
|
|
@ -186,7 +186,11 @@ class PageBaseSerializer(serializers.ModelSerializer):
|
|||
'image_url',
|
||||
'width',
|
||||
'height',
|
||||
'advertisement',
|
||||
]
|
||||
extra_kwargs = {
|
||||
'establishment': {'write_only': True}
|
||||
}
|
||||
|
||||
|
||||
class PageTypeBaseSerializer(serializers.ModelSerializer):
|
||||
|
|
|
|||
|
|
@ -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')),
|
||||
]
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user