diff --git a/apps/advertisement/migrations/0002_auto_20190917_1307.py b/apps/advertisement/migrations/0002_auto_20190917_1307.py new file mode 100644 index 00000000..cec5d157 --- /dev/null +++ b/apps/advertisement/migrations/0002_auto_20190917_1307.py @@ -0,0 +1,35 @@ +# Generated by Django 2.2.4 on 2019-09-17 13:07 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('translation', '0003_auto_20190901_1032'), + ('advertisement', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='advertisement', + name='source', + field=models.PositiveSmallIntegerField(choices=[(0, 'Mobile'), (1, 'Web')], default=0, verbose_name='Source'), + ), + migrations.AddField( + model_name='advertisement', + name='target_languages', + field=models.ManyToManyField(to='translation.Language'), + ), + migrations.AddField( + model_name='advertisement', + name='uuid', + field=models.UUIDField(default=uuid.UUID('5fcaa103-a7da-49ad-be7e-1292371f008e'), editable=False, unique=True), + ), + migrations.AlterField( + model_name='advertisement', + name='block_level', + field=models.CharField(max_length=10, verbose_name='Block level'), + ), + ] diff --git a/apps/advertisement/models.py b/apps/advertisement/models.py index 75978009..fdc25988 100644 --- a/apps/advertisement/models.py +++ b/apps/advertisement/models.py @@ -1,28 +1,22 @@ """Advertisement app models.""" +import uuid + from django.db import models from django.utils.translation import gettext_lazy as _ -from utils.models import ProjectBaseMixin, ImageMixin +from translation.models import Language +from utils.models import ProjectBaseMixin, ImageMixin, PlatformMixin -class Advertisement(ImageMixin, ProjectBaseMixin): +class Advertisement(ImageMixin, ProjectBaseMixin, PlatformMixin): """Advertisement model.""" - LEVEL_1 = 1 - LEVEL_2 = 2 - LEVEL_3 = 3 - - BLOCK_LEVEL_CHOICES = ( - (LEVEL_1, _('Ad block level 1')), - (LEVEL_2, _('Ad block level 2')), - (LEVEL_3, _('Ad block level 3')) - ) - + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) url = models.URLField(verbose_name=_('Ad URL')) width = models.PositiveIntegerField(verbose_name=_('Block width')) height = models.PositiveIntegerField(verbose_name=_('Block height')) - block_level = models.PositiveSmallIntegerField(choices=BLOCK_LEVEL_CHOICES, - verbose_name=_('Block level')) + block_level = models.CharField(verbose_name=_('Block level'), max_length=10) + target_languages = models.ManyToManyField(Language) class Meta: verbose_name = _('Advertisement') diff --git a/apps/advertisement/serializers/web.py b/apps/advertisement/serializers/web.py index 4000b1b6..c12ab8f9 100644 --- a/apps/advertisement/serializers/web.py +++ b/apps/advertisement/serializers/web.py @@ -2,6 +2,7 @@ from rest_framework import serializers from advertisement import models +from translation.serializers import LanguageSerializer class AdvertisementSerializer(serializers.ModelSerializer): @@ -11,9 +12,11 @@ class AdvertisementSerializer(serializers.ModelSerializer): model = models.Advertisement fields = ( 'id', + 'uuid', 'url', 'image', 'width', 'height', 'block_level', + 'source' ) diff --git a/apps/advertisement/urls/web.py b/apps/advertisement/urls/web.py index f7550015..48f9d71a 100644 --- a/apps/advertisement/urls/web.py +++ b/apps/advertisement/urls/web.py @@ -3,8 +3,8 @@ from django.urls import path from advertisement.views import web as views -app_name = 'advertisement' +app_name = 'advertisements' urlpatterns = [ - path('', views.AdvertisementListView.as_view(), name='list') + path('/', views.AdvertisementListView.as_view(), name='list') ] diff --git a/apps/advertisement/views/web.py b/apps/advertisement/views/web.py index a02cff3c..1740022c 100644 --- a/apps/advertisement/views/web.py +++ b/apps/advertisement/views/web.py @@ -10,6 +10,10 @@ class AdvertisementListView(generics.ListAPIView): """List view for model Advertisement""" pagination_class = None model = models.Advertisement - permission_classes = (permissions.AllowAny, ) - queryset = models.Advertisement.objects.all() + permission_classes = (permissions.AllowAny,) serializer_class = serializers.AdvertisementSerializer + + def get_queryset(self): + return models.Advertisement.objects\ + .filter(page__page_name__contains=self.kwargs['page'])\ + .filter(target_languages__locale=self.request.locale) diff --git a/apps/main/migrations/0015_page.py b/apps/main/migrations/0015_page.py new file mode 100644 index 00000000..1ce11443 --- /dev/null +++ b/apps/main/migrations/0015_page.py @@ -0,0 +1,26 @@ +# Generated by Django 2.2.4 on 2019-09-17 13:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('advertisement', '0002_auto_20190917_1307'), + ('main', '0014_carousel'), + ] + + operations = [ + migrations.CreateModel( + name='Page', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('page_name', models.CharField(max_length=255, unique=True)), + ('advertisements', models.ManyToManyField(to='advertisement.Advertisement')), + ], + options={ + 'verbose_name': 'Page', + 'verbose_name_plural': 'Pages', + }, + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 37e9dd0b..b2e3fd39 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -5,6 +5,8 @@ from django.contrib.postgres.fields import JSONField from django.db import models from django.utils.translation import gettext_lazy as _ from django.contrib.contenttypes.models import ContentType + +from advertisement.models import Advertisement from location.models import Country from main import methods from review.models import Review @@ -341,3 +343,18 @@ class Carousel(models.Model): @property def model_name(self): return self.content_object.__class__.__name__ + + +class Page(models.Model): + """Page model.""" + + page_name = models.CharField(max_length=255, unique=True) + advertisements = models.ManyToManyField(Advertisement) + + class Meta: + """Meta class.""" + verbose_name = _('Page') + verbose_name_plural = _('Pages') + + def __str__(self): + return f'{self.page_name}' diff --git a/apps/main/serializers.py b/apps/main/serializers.py index 0c84da86..607e3a30 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -1,6 +1,7 @@ """Main app serializers.""" from rest_framework import serializers +from advertisement.serializers.web import AdvertisementSerializer from location.serializers import CountrySerializer from main import models @@ -20,7 +21,6 @@ class FeatureSerializer(serializers.ModelSerializer): class SiteFeatureSerializer(serializers.ModelSerializer): - id = serializers.IntegerField(source='feature.id') slug = serializers.CharField(source='feature.slug') priority = serializers.IntegerField(source='feature.priority') @@ -40,7 +40,7 @@ class SiteSettingsSerializer(serializers.ModelSerializer): published_features = SiteFeatureSerializer(source='published_sitefeatures', many=True, allow_null=True) - #todo: remove this + # todo: remove this country_code = serializers.CharField(source='subdomain', read_only=True) class Meta: @@ -62,7 +62,6 @@ class SiteSettingsSerializer(serializers.ModelSerializer): class SiteSerializer(serializers.ModelSerializer): - country = CountrySerializer() class Meta: @@ -110,7 +109,7 @@ class AwardSerializer(AwardBaseSerializer): class MetaDataContentSerializer(serializers.ModelSerializer): - id = serializers.IntegerField(source='metadata.id', read_only=True,) + id = serializers.IntegerField(source='metadata.id', read_only=True, ) label_translated = serializers.CharField( source='metadata.label_translated', read_only=True, allow_null=True) @@ -124,6 +123,7 @@ class MetaDataContentSerializer(serializers.ModelSerializer): class CurrencySerializer(serializers.ModelSerializer): """Currency serializer""" + class Meta: model = models.Currency fields = [ @@ -155,3 +155,17 @@ class CarouselListSerializer(serializers.ModelSerializer): 'image', 'vintage_year', ] + + +class PageSerializer(serializers.ModelSerializer): + page_name = serializers.CharField() + advertisements = AdvertisementSerializer(source='advertisements', many=True) + + class Meta: + """Meta class.""" + model = models.Carousel + fields = [ + 'id', + 'page_name', + 'advertisements' + ] diff --git a/apps/utils/models.py b/apps/utils/models.py index 92db5c47..60d2e9c3 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -186,10 +186,12 @@ class PlatformMixin(models.Model): MOBILE = 0 WEB = 1 + ALL = 2 SOURCES = ( (MOBILE, _('Mobile')), (WEB, _('Web')), + (ALL, _('All')) ) source = models.PositiveSmallIntegerField(choices=SOURCES, default=MOBILE, verbose_name=_('Source'))