added bo endpoints for ads
This commit is contained in:
parent
4412e39e96
commit
d0fec2591f
|
|
@ -2,11 +2,12 @@
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
from main.models import Page
|
||||||
from translation.models import Language
|
from translation.models import Language
|
||||||
from utils.models import ProjectBaseMixin, ImageMixin, PlatformMixin, URLImageMixin
|
from utils.models import ProjectBaseMixin, ImageMixin, PlatformMixin, URLImageMixin
|
||||||
from main.models import Page
|
|
||||||
|
|
||||||
|
|
||||||
class AdvertisementQuerySet(models.QuerySet):
|
class AdvertisementQuerySet(models.QuerySet):
|
||||||
|
|
@ -25,6 +26,10 @@ class AdvertisementQuerySet(models.QuerySet):
|
||||||
"""Filter by locale."""
|
"""Filter by locale."""
|
||||||
return self.filter(target_languages__locale=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):
|
class Advertisement(ProjectBaseMixin):
|
||||||
"""Advertisement model."""
|
"""Advertisement model."""
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
from .common import *
|
from .common import *
|
||||||
from .mobile import *
|
from .mobile import *
|
||||||
from .web 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 advertisement import models
|
||||||
from translation.serializers import LanguageSerializer
|
from translation.serializers import LanguageSerializer
|
||||||
from main.serializers import SiteShortSerializer
|
from main.serializers import SiteShortSerializer, PageBaseSerializer
|
||||||
from main.serializers import PageBaseSerializer
|
from translation.models import Language
|
||||||
|
from main.models import SiteSettings
|
||||||
|
|
||||||
|
|
||||||
class AdvertisementBaseSerializer(serializers.ModelSerializer):
|
class AdvertisementBaseSerializer(serializers.ModelSerializer):
|
||||||
"""Base serializer for model Advertisement."""
|
"""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)
|
sites = SiteShortSerializer(many=True, read_only=True)
|
||||||
|
target_sites = serializers.PrimaryKeyRelatedField(
|
||||||
|
queryset=SiteSettings.objects.all(),
|
||||||
|
many=True,
|
||||||
|
write_only=True,
|
||||||
|
source='sites'
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Advertisement
|
model = models.Advertisement
|
||||||
|
|
@ -21,7 +34,9 @@ class AdvertisementBaseSerializer(serializers.ModelSerializer):
|
||||||
'url',
|
'url',
|
||||||
'block_level',
|
'block_level',
|
||||||
'languages',
|
'languages',
|
||||||
|
'target_languages',
|
||||||
'sites',
|
'sites',
|
||||||
|
'target_sites',
|
||||||
'start',
|
'start',
|
||||||
'end',
|
'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."""
|
"""Advertisement common urlpaths."""
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
from advertisement import views
|
||||||
|
|
||||||
|
|
||||||
app_name = 'advertisements'
|
app_name = 'advertisements'
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
from .common import *
|
from .common import *
|
||||||
from .mobile import *
|
from .mobile import *
|
||||||
from .web 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',
|
'image_url',
|
||||||
'width',
|
'width',
|
||||||
'height',
|
'height',
|
||||||
|
'advertisement',
|
||||||
]
|
]
|
||||||
|
extra_kwargs = {
|
||||||
|
'establishment': {'write_only': True}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class PageTypeBaseSerializer(serializers.ModelSerializer):
|
class PageTypeBaseSerializer(serializers.ModelSerializer):
|
||||||
|
|
|
||||||
|
|
@ -13,5 +13,7 @@ urlpatterns = [
|
||||||
path('review/', include('review.urls.back')),
|
path('review/', include('review.urls.back')),
|
||||||
path('tags/', include(('tag.urls.back', 'tag'), namespace='tag')),
|
path('tags/', include(('tag.urls.back', 'tag'), namespace='tag')),
|
||||||
path('products/', include(('product.urls.back', 'product'), namespace='product')),
|
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