Merge branch 'develop' into feature/employee_crud

This commit is contained in:
ВашÐВиктор ГладкихÐ 2019-09-19 10:10:31 +03:00
commit fd0a491e89
17 changed files with 221 additions and 26 deletions

View File

@ -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'),
),
]

View File

@ -1,28 +1,22 @@
"""Advertisement app models.""" """Advertisement app models."""
import uuid
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ 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.""" """Advertisement model."""
LEVEL_1 = 1 uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
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'))
)
url = models.URLField(verbose_name=_('Ad URL')) url = models.URLField(verbose_name=_('Ad URL'))
width = models.PositiveIntegerField(verbose_name=_('Block width')) width = models.PositiveIntegerField(verbose_name=_('Block width'))
height = models.PositiveIntegerField(verbose_name=_('Block height')) height = models.PositiveIntegerField(verbose_name=_('Block height'))
block_level = models.PositiveSmallIntegerField(choices=BLOCK_LEVEL_CHOICES, block_level = models.CharField(verbose_name=_('Block level'), max_length=10)
verbose_name=_('Block level')) target_languages = models.ManyToManyField(Language)
class Meta: class Meta:
verbose_name = _('Advertisement') verbose_name = _('Advertisement')

View File

@ -2,6 +2,7 @@
from rest_framework import serializers from rest_framework import serializers
from advertisement import models from advertisement import models
from translation.serializers import LanguageSerializer
class AdvertisementSerializer(serializers.ModelSerializer): class AdvertisementSerializer(serializers.ModelSerializer):
@ -11,9 +12,11 @@ class AdvertisementSerializer(serializers.ModelSerializer):
model = models.Advertisement model = models.Advertisement
fields = ( fields = (
'id', 'id',
'uuid',
'url', 'url',
'image', 'image',
'width', 'width',
'height', 'height',
'block_level', 'block_level',
'source'
) )

View File

@ -3,8 +3,8 @@ from django.urls import path
from advertisement.views import web as views from advertisement.views import web as views
app_name = 'advertisement' app_name = 'advertisements'
urlpatterns = [ urlpatterns = [
path('', views.AdvertisementListView.as_view(), name='list') path('<str:page>/', views.AdvertisementListView.as_view(), name='list')
] ]

View File

@ -10,6 +10,10 @@ class AdvertisementListView(generics.ListAPIView):
"""List view for model Advertisement""" """List view for model Advertisement"""
pagination_class = None pagination_class = None
model = models.Advertisement model = models.Advertisement
permission_classes = (permissions.AllowAny, ) permission_classes = (permissions.AllowAny,)
queryset = models.Advertisement.objects.all()
serializer_class = serializers.AdvertisementSerializer 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)

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.4 on 2019-09-13 13:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('establishment', '0018_socialnetwork'),
]
operations = [
migrations.AddField(
model_name='position',
name='priority',
field=models.IntegerField(default=None, null=True, unique=True),
),
]

View File

@ -335,6 +335,8 @@ class Position(BaseAttributes, TranslatedFieldsMixin):
name = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'), name = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'),
help_text='{"en":"some text"}') help_text='{"en":"some text"}')
priority = models.IntegerField(unique=True, null=True, default=None)
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -146,12 +146,13 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
name = serializers.CharField(source='employee.name') name = serializers.CharField(source='employee.name')
position_translated = serializers.CharField(source='position.name_translated') position_translated = serializers.CharField(source='position.name_translated')
awards = AwardSerializer(source='employee.awards', many=True) awards = AwardSerializer(source='employee.awards', many=True)
priority = serializers.IntegerField(source='position.priority')
class Meta: class Meta:
"""Meta class.""" """Meta class."""
model = models.Employee model = models.Employee
fields = ('id', 'name', 'position_translated', 'awards') fields = ('id', 'name', 'position_translated', 'awards', 'priority')
class EstablishmentBaseSerializer(serializers.ModelSerializer): class EstablishmentBaseSerializer(serializers.ModelSerializer):
@ -160,7 +161,7 @@ class EstablishmentBaseSerializer(serializers.ModelSerializer):
subtypes = EstablishmentSubTypeSerializer(many=True) subtypes = EstablishmentSubTypeSerializer(many=True)
address = AddressSerializer() address = AddressSerializer()
tags = MetaDataContentSerializer(many=True) tags = MetaDataContentSerializer(many=True)
preview_image = serializers.ImageField(source='image') preview_image = serializers.SerializerMethodField()
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.4 on 2019-09-12 13:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0013_auto_20190901_1032'),
]
operations = [
migrations.AddField(
model_name='feature',
name='priority',
field=models.IntegerField(default=None, null=True, unique=True),
),
]

View File

@ -0,0 +1,14 @@
# Generated by Django 2.2.4 on 2019-09-18 13:41
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0014_feature_priority'),
('main', '0014_carousel'),
]
operations = [
]

View File

@ -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',
},
),
]

View File

@ -5,6 +5,8 @@ from django.contrib.postgres.fields import JSONField
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from advertisement.models import Advertisement
from location.models import Country from location.models import Country
from main import methods from main import methods
from review.models import Review from review.models import Review
@ -161,6 +163,7 @@ class Feature(ProjectBaseMixin):
"""Feature model.""" """Feature model."""
slug = models.CharField(max_length=255, unique=True) slug = models.CharField(max_length=255, unique=True)
priority = models.IntegerField(unique=True, null=True, default=None)
site_settings = models.ManyToManyField(SiteSettings, through='SiteFeature') site_settings = models.ManyToManyField(SiteSettings, through='SiteFeature')
class Meta: class Meta:
@ -340,3 +343,18 @@ class Carousel(models.Model):
@property @property
def model_name(self): def model_name(self):
return self.content_object.__class__.__name__ 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}'

View File

@ -1,6 +1,7 @@
"""Main app serializers.""" """Main app serializers."""
from rest_framework import serializers from rest_framework import serializers
from advertisement.serializers.web import AdvertisementSerializer
from location.serializers import CountrySerializer from location.serializers import CountrySerializer
from main import models from main import models
@ -15,20 +16,23 @@ class FeatureSerializer(serializers.ModelSerializer):
fields = ( fields = (
'id', 'id',
'slug', 'slug',
'priority'
) )
class SiteFeatureSerializer(serializers.ModelSerializer): class SiteFeatureSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(source='feature.id') id = serializers.IntegerField(source='feature.id')
slug = serializers.CharField(source='feature.slug') slug = serializers.CharField(source='feature.slug')
priority = serializers.IntegerField(source='feature.priority')
class Meta: class Meta:
"""Meta class.""" """Meta class."""
model = models.SiteFeature model = models.SiteFeature
fields = ('main', fields = ('main',
'id', 'id',
'slug') 'slug',
'priority'
)
class SiteSettingsSerializer(serializers.ModelSerializer): class SiteSettingsSerializer(serializers.ModelSerializer):
@ -36,7 +40,7 @@ class SiteSettingsSerializer(serializers.ModelSerializer):
published_features = SiteFeatureSerializer(source='published_sitefeatures', published_features = SiteFeatureSerializer(source='published_sitefeatures',
many=True, allow_null=True) many=True, allow_null=True)
#todo: remove this # todo: remove this
country_code = serializers.CharField(source='subdomain', read_only=True) country_code = serializers.CharField(source='subdomain', read_only=True)
class Meta: class Meta:
@ -58,7 +62,6 @@ class SiteSettingsSerializer(serializers.ModelSerializer):
class SiteSerializer(serializers.ModelSerializer): class SiteSerializer(serializers.ModelSerializer):
country = CountrySerializer() country = CountrySerializer()
class Meta: class Meta:
@ -106,7 +109,7 @@ class AwardSerializer(AwardBaseSerializer):
class MetaDataContentSerializer(serializers.ModelSerializer): 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( label_translated = serializers.CharField(
source='metadata.label_translated', read_only=True, allow_null=True) source='metadata.label_translated', read_only=True, allow_null=True)
@ -120,6 +123,7 @@ class MetaDataContentSerializer(serializers.ModelSerializer):
class CurrencySerializer(serializers.ModelSerializer): class CurrencySerializer(serializers.ModelSerializer):
"""Currency serializer""" """Currency serializer"""
class Meta: class Meta:
model = models.Currency model = models.Currency
fields = [ fields = [
@ -151,3 +155,17 @@ class CarouselListSerializer(serializers.ModelSerializer):
'image', 'image',
'vintage_year', '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'
]

View File

@ -16,6 +16,19 @@ class EstablishmentDocument(Document):
description = fields.ObjectField(attr='description_indexing', description = fields.ObjectField(attr='description_indexing',
properties=OBJECT_FIELD_PROPERTIES) properties=OBJECT_FIELD_PROPERTIES)
establishment_type = fields.ObjectField(
properties={
'id': fields.IntegerField(),
'name': fields.ObjectField(attr='name_indexing',
properties=OBJECT_FIELD_PROPERTIES)
})
establishment_subtypes = fields.ObjectField(
properties={
'id': fields.IntegerField(),
'name': fields.ObjectField(attr='name_indexing',
properties=OBJECT_FIELD_PROPERTIES)
},
multi=True)
tags = fields.ObjectField( tags = fields.ObjectField(
properties={ properties={
'id': fields.IntegerField(attr='metadata.id'), 'id': fields.IntegerField(attr='metadata.id'),
@ -55,6 +68,12 @@ class EstablishmentDocument(Document):
), ),
} }
) )
collections = fields.ObjectField(
properties={
'id': fields.IntegerField(attr='collection.id'),
'collection_type': fields.IntegerField(attr='collection.collection_type'),
},
multi=True)
class Django: class Django:

View File

@ -60,6 +60,9 @@ class EstablishmentDocumentSerializer(DocumentSerializer):
'description_translated', 'description_translated',
'tags', 'tags',
'address', 'address',
'collections',
'establishment_type',
'establishment_subtypes',
) )
@staticmethod @staticmethod

View File

@ -1,7 +1,8 @@
"""Search indexes app views.""" """Search indexes app views."""
from rest_framework import permissions from rest_framework import permissions
from django_elasticsearch_dsl_drf import constants from django_elasticsearch_dsl_drf import constants
from django_elasticsearch_dsl_drf.filter_backends import FilteringFilterBackend from django_elasticsearch_dsl_drf.filter_backends import (FilteringFilterBackend,
GeoSpatialFilteringFilterBackend)
from django_elasticsearch_dsl_drf.viewsets import BaseDocumentViewSet from django_elasticsearch_dsl_drf.viewsets import BaseDocumentViewSet
from django_elasticsearch_dsl_drf.pagination import PageNumberPagination from django_elasticsearch_dsl_drf.pagination import PageNumberPagination
from search_indexes import serializers, filters from search_indexes import serializers, filters
@ -47,6 +48,7 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
filter_backends = [ filter_backends = [
FilteringFilterBackend, FilteringFilterBackend,
filters.CustomSearchFilterBackend, filters.CustomSearchFilterBackend,
GeoSpatialFilteringFilterBackend,
] ]
search_fields = ( search_fields = (
@ -91,5 +93,23 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
}, },
'tags_category_id': { 'tags_category_id': {
'field': 'tags.category.id', 'field': 'tags.category.id',
},
'collection_type': {
'field': 'collections.collection_type'
},
'establishment_type': {
'field': 'establishment_type.id'
},
'establishment_subtypes': {
'field': 'establishment_subtypes.id'
},
}
geo_spatial_filter_fields = {
'location': {
'field': 'address.location',
'lookups': [
constants.LOOKUP_FILTER_GEO_BOUNDING_BOX,
]
} }
} }

View File

@ -186,10 +186,12 @@ class PlatformMixin(models.Model):
MOBILE = 0 MOBILE = 0
WEB = 1 WEB = 1
ALL = 2
SOURCES = ( SOURCES = (
(MOBILE, _('Mobile')), (MOBILE, _('Mobile')),
(WEB, _('Web')), (WEB, _('Web')),
(ALL, _('All'))
) )
source = models.PositiveSmallIntegerField(choices=SOURCES, default=MOBILE, source = models.PositiveSmallIntegerField(choices=SOURCES, default=MOBILE,
verbose_name=_('Source')) verbose_name=_('Source'))