From 1687e804929ee22e218ce98b33e9a72e82f99f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 21 Nov 2019 13:13:19 +0300 Subject: [PATCH 01/11] Check serial number for product --- .../management/commands/add_product_tag.py | 11 +++++++++++ .../migrations/0019_product_serial_number.py | 18 ++++++++++++++++++ apps/product/models.py | 4 ++++ 3 files changed, 33 insertions(+) create mode 100644 apps/product/migrations/0019_product_serial_number.py diff --git a/apps/product/management/commands/add_product_tag.py b/apps/product/management/commands/add_product_tag.py index 6377fcac..9ee09bdd 100644 --- a/apps/product/management/commands/add_product_tag.py +++ b/apps/product/management/commands/add_product_tag.py @@ -149,6 +149,17 @@ class Command(BaseCommand): tag.label = new_label tag.save() + + def check_serail_number(self): + category = TagCategory.objects.get(index_name='serial_number') + tags = Tag.objects.filter(category=category, products__isnull=False) + for tag in tqdm(tags, desc='Update serial number for product'): + tag.products.all().update(serial_number=tag.value) + + self.stdout.write(self.style.WARNING(f'Check serial number product end.')) + + + def handle(self, *args, **kwargs): self.remove_tags_product() self.remove_tags() diff --git a/apps/product/migrations/0019_product_serial_number.py b/apps/product/migrations/0019_product_serial_number.py new file mode 100644 index 00000000..eb8bef34 --- /dev/null +++ b/apps/product/migrations/0019_product_serial_number.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.7 on 2019-11-21 09:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0018_purchasedproduct'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='serial_number', + field=models.CharField(default=None, max_length=255, null=True, verbose_name='Serial number'), + ), + ] diff --git a/apps/product/models.py b/apps/product/models.py index f499afee..3d27559f 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -219,6 +219,10 @@ class Product(GalleryModelMixin, TranslatedFieldsMixin, BaseAttributes, HasTagsM comments = generic.GenericRelation(to='comment.Comment') awards = generic.GenericRelation(to='main.Award', related_query_name='product') + serial_number = models.CharField(max_length=255, + default=None, null=True, + verbose_name=_('Serial number')) + objects = ProductManager.from_queryset(ProductQuerySet)() class Meta: From 938b9436eb4e7a142a3cd78e3a11da2a0a873f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 21 Nov 2019 13:25:31 +0300 Subject: [PATCH 02/11] Fix name def --- apps/product/management/commands/add_product_tag.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/product/management/commands/add_product_tag.py b/apps/product/management/commands/add_product_tag.py index 9ee09bdd..1ff823b0 100644 --- a/apps/product/management/commands/add_product_tag.py +++ b/apps/product/management/commands/add_product_tag.py @@ -149,8 +149,7 @@ class Command(BaseCommand): tag.label = new_label tag.save() - - def check_serail_number(self): + def check_serial_number(self): category = TagCategory.objects.get(index_name='serial_number') tags = Tag.objects.filter(category=category, products__isnull=False) for tag in tqdm(tags, desc='Update serial number for product'): @@ -158,8 +157,6 @@ class Command(BaseCommand): self.stdout.write(self.style.WARNING(f'Check serial number product end.')) - - def handle(self, *args, **kwargs): self.remove_tags_product() self.remove_tags() @@ -168,3 +165,4 @@ class Command(BaseCommand): self.add_tag() self.check_tag() self.add_product_tag() + self.check_serial_number() From 9a2f7fec39b8e9d170e417dde53e49c3312e8098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 21 Nov 2019 14:33:27 +0300 Subject: [PATCH 03/11] fix --- apps/product/management/commands/add_product_tag.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/product/management/commands/add_product_tag.py b/apps/product/management/commands/add_product_tag.py index 1ff823b0..e430166d 100644 --- a/apps/product/management/commands/add_product_tag.py +++ b/apps/product/management/commands/add_product_tag.py @@ -101,14 +101,12 @@ class Command(BaseCommand): p.tags.clear() print('End clear tags product') - def remove_tags(self): print('Begin delete many tags') Tag.objects.\ filter(news__isnull=True, establishments__isnull=True).delete() print('End delete many tags') - def product_sql(self): with connections['legacy'].cursor() as cursor: cursor.execute(''' From a2087213a4265b82eddb36e1d80cd8643bb794f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 21 Nov 2019 15:22:22 +0300 Subject: [PATCH 04/11] Check serial number command --- .../management/commands/add_product_tag.py | 11 +--------- .../commands/check_serial_number.py | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 apps/product/management/commands/check_serial_number.py diff --git a/apps/product/management/commands/add_product_tag.py b/apps/product/management/commands/add_product_tag.py index e430166d..01f5d7f7 100644 --- a/apps/product/management/commands/add_product_tag.py +++ b/apps/product/management/commands/add_product_tag.py @@ -7,7 +7,7 @@ from tqdm import tqdm class Command(BaseCommand): - help = '''Add add product tags networks from old db to new db. + help = '''Add product tags networks from old db to new db. Run after add_product!!!''' def category_sql(self): @@ -147,14 +147,6 @@ class Command(BaseCommand): tag.label = new_label tag.save() - def check_serial_number(self): - category = TagCategory.objects.get(index_name='serial_number') - tags = Tag.objects.filter(category=category, products__isnull=False) - for tag in tqdm(tags, desc='Update serial number for product'): - tag.products.all().update(serial_number=tag.value) - - self.stdout.write(self.style.WARNING(f'Check serial number product end.')) - def handle(self, *args, **kwargs): self.remove_tags_product() self.remove_tags() @@ -163,4 +155,3 @@ class Command(BaseCommand): self.add_tag() self.check_tag() self.add_product_tag() - self.check_serial_number() diff --git a/apps/product/management/commands/check_serial_number.py b/apps/product/management/commands/check_serial_number.py new file mode 100644 index 00000000..ae2e43a3 --- /dev/null +++ b/apps/product/management/commands/check_serial_number.py @@ -0,0 +1,22 @@ +from django.core.management.base import BaseCommand +from django.db import connections +from establishment.management.commands.add_position import namedtuplefetchall +from tag.models import Tag, TagCategory +from product.models import Product, ProductType +from tqdm import tqdm + + +class Command(BaseCommand): + help = '''Check product serial number from old db to new db. + Run after add_product_tag!!!''' + + def check_serial_number(self): + category = TagCategory.objects.get(index_name='serial_number') + tags = Tag.objects.filter(category=category, products__isnull=False) + for tag in tqdm(tags, desc='Update serial number for product'): + tag.products.all().update(serial_number=tag.value) + + self.stdout.write(self.style.WARNING(f'Check serial number product end.')) + + def handle(self, *args, **kwargs): + self.check_serial_number() From 5236bca874fe03d14c550ae9496c0037ce4cebcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 21 Nov 2019 15:22:43 +0300 Subject: [PATCH 05/11] Check serial number command --- apps/product/management/commands/check_serial_number.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/product/management/commands/check_serial_number.py b/apps/product/management/commands/check_serial_number.py index ae2e43a3..75d1a693 100644 --- a/apps/product/management/commands/check_serial_number.py +++ b/apps/product/management/commands/check_serial_number.py @@ -1,8 +1,5 @@ from django.core.management.base import BaseCommand -from django.db import connections -from establishment.management.commands.add_position import namedtuplefetchall from tag.models import Tag, TagCategory -from product.models import Product, ProductType from tqdm import tqdm From 26b8dcd082f997883cc56628a84e254c647b26b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=D1=85?= Date: Thu, 21 Nov 2019 15:26:43 +0300 Subject: [PATCH 06/11] Check serial number command --- apps/product/management/commands/check_serial_number.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/product/management/commands/check_serial_number.py b/apps/product/management/commands/check_serial_number.py index 75d1a693..d9caf69a 100644 --- a/apps/product/management/commands/check_serial_number.py +++ b/apps/product/management/commands/check_serial_number.py @@ -12,6 +12,7 @@ class Command(BaseCommand): tags = Tag.objects.filter(category=category, products__isnull=False) for tag in tqdm(tags, desc='Update serial number for product'): tag.products.all().update(serial_number=tag.value) + tag.products.clear() self.stdout.write(self.style.WARNING(f'Check serial number product end.')) From 93056cf524994e5a4d3a7a33d11cd01a28fa84b3 Mon Sep 17 00:00:00 2001 From: littlewolf Date: Tue, 3 Dec 2019 13:35:52 +0300 Subject: [PATCH 07/11] Add filter Add queryset Add settings --- _dockerfiles/db/Dockerfile | 2 +- apps/location/filters.py | 24 ++++++++++++++++++++++++ apps/location/models.py | 15 +++++++++++++++ apps/location/views/back.py | 4 ++++ docker-compose.mysql.yml | 1 + project/settings/local.py | 14 +++++++++++++- 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 apps/location/filters.py diff --git a/_dockerfiles/db/Dockerfile b/_dockerfiles/db/Dockerfile index 45c707d9..e8a9ded3 100644 --- a/_dockerfiles/db/Dockerfile +++ b/_dockerfiles/db/Dockerfile @@ -1,3 +1,3 @@ -FROM mdillon/postgis:9.5 +FROM mdillon/postgis:latest RUN localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8 ENV LANG ru_RU.utf8 diff --git a/apps/location/filters.py b/apps/location/filters.py new file mode 100644 index 00000000..5e95db44 --- /dev/null +++ b/apps/location/filters.py @@ -0,0 +1,24 @@ +from django.core.validators import EMPTY_VALUES +from django_filters import rest_framework as filters + +from location import models + + +class CityBackFilter(filters.FilterSet): + """Employee filter set.""" + + search = filters.CharFilter(method='search_by_name') + + class Meta: + """Meta class.""" + + model = models.City + fields = ( + 'search', + ) + + def search_by_name(self, queryset, name, value): + """Search by name or last name.""" + if value not in EMPTY_VALUES: + return queryset.search_by_name(value) + return queryset diff --git a/apps/location/models.py b/apps/location/models.py index 3f104644..32a6cf4f 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -5,6 +5,9 @@ from django.db.models.signals import post_save from django.db.transaction import on_commit from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ +from functools import reduce +from typing import List + from translation.models import Language from utils.models import (ProjectBaseMixin, SVGImageMixin, TJSONField, @@ -92,6 +95,18 @@ class Region(models.Model): class CityQuerySet(models.QuerySet): """Extended queryset for City model.""" + def _generic_search(self, value, filter_fields_names: List[str]): + """Generic method for searching value in specified fields""" + filters = [ + {f'{field}__icontains': value} + for field in filter_fields_names + ] + return self.filter(reduce(lambda x, y: x | y, [models.Q(**i) for i in filters])) + + def search_by_name(self, value): + """Search by name or last_name.""" + return self._generic_search(value, ['name', 'code', 'postal_code']) + def by_country_code(self, code): """Return establishments by country code""" return self.filter(country__code=code) diff --git a/apps/location/views/back.py b/apps/location/views/back.py index 4d420154..8406dee3 100644 --- a/apps/location/views/back.py +++ b/apps/location/views/back.py @@ -9,6 +9,8 @@ from rest_framework.permissions import IsAuthenticatedOrReadOnly from django.shortcuts import get_object_or_404 from utils.serializers import ImageBaseSerializer +from location import filters + # Address @@ -31,6 +33,8 @@ class CityListCreateView(common.CityViewMixin, generics.ListCreateAPIView): """Create view for model City.""" serializer_class = serializers.CitySerializer permission_classes = [IsAuthenticatedOrReadOnly|IsCountryAdmin] + queryset = models.City.objects.all() + filter_class = filters.CityBackFilter class CityRUDView(common.CityViewMixin, generics.RetrieveUpdateDestroyAPIView): diff --git a/docker-compose.mysql.yml b/docker-compose.mysql.yml index a8900226..800a9644 100644 --- a/docker-compose.mysql.yml +++ b/docker-compose.mysql.yml @@ -29,6 +29,7 @@ services: - "5436:5432" volumes: - gm-db:/var/lib/postgresql/data/ + - .:/code elasticsearch: diff --git a/project/settings/local.py b/project/settings/local.py index 6a592a46..989af4ef 100644 --- a/project/settings/local.py +++ b/project/settings/local.py @@ -41,7 +41,19 @@ DATABASES.update({ 'PORT': 3306, 'NAME': 'dev', 'USER': 'dev', - 'PASSWORD': 'octosecret123'}}) + 'PASSWORD': 'octosecret123'}, + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': os.environ.get('DB_NAME'), + 'USER': os.environ.get('DB_USERNAME'), + 'PASSWORD': os.environ.get('DB_PASSWORD'), + 'HOST': os.environ.get('DB_HOSTNAME'), + 'PORT': os.environ.get('DB_PORT'), + 'OPTIONS': { + 'options': '-c search_path=gm' + }, + }, +}) # LOGGING From 3e0fad21391560488e679ba31edd05ee45427d95 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Mon, 9 Dec 2019 12:14:55 +0300 Subject: [PATCH 08/11] add merge of migrations --- .../product/migrations/0020_merge_20191209_0911.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apps/product/migrations/0020_merge_20191209_0911.py diff --git a/apps/product/migrations/0020_merge_20191209_0911.py b/apps/product/migrations/0020_merge_20191209_0911.py new file mode 100644 index 00000000..b8c83246 --- /dev/null +++ b/apps/product/migrations/0020_merge_20191209_0911.py @@ -0,0 +1,14 @@ +# Generated by Django 2.2.7 on 2019-12-09 09:11 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0019_auto_20191204_1420'), + ('product', '0019_product_serial_number'), + ] + + operations = [ + ] From dc7a6a911aadc1156fe8867ba462eab708164db7 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 9 Dec 2019 14:29:54 +0300 Subject: [PATCH 09/11] refactoring --- apps/advertisement/models.py | 4 ++++ apps/advertisement/serializers/common.py | 5 ----- apps/advertisement/views/common.py | 5 ++++- apps/advertisement/views/web.py | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/advertisement/models.py b/apps/advertisement/models.py index 920e3389..66cd0024 100644 --- a/apps/advertisement/models.py +++ b/apps/advertisement/models.py @@ -22,6 +22,10 @@ class AdvertisementQuerySet(models.QuerySet): """Filter Advertisement by page type.""" return self.filter(page_type__name=page_type) + def by_country(self, code: str): + """Filter Advertisement by country code.""" + return self.filter(sites__country__code=code) + def by_locale(self, locale): """Filter by locale.""" return self.filter(target_languages__locale=locale) diff --git a/apps/advertisement/serializers/common.py b/apps/advertisement/serializers/common.py index 0adb74f9..9caee0c2 100644 --- a/apps/advertisement/serializers/common.py +++ b/apps/advertisement/serializers/common.py @@ -11,14 +11,11 @@ from main.models import SiteSettings class AdvertisementBaseSerializer(serializers.ModelSerializer): """Base serializer for model Advertisement.""" - 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, @@ -33,9 +30,7 @@ class AdvertisementBaseSerializer(serializers.ModelSerializer): 'uuid', 'url', 'block_level', - 'languages', 'target_languages', - 'sites', 'target_sites', 'start', 'end', diff --git a/apps/advertisement/views/common.py b/apps/advertisement/views/common.py index 43c6e965..02c61873 100644 --- a/apps/advertisement/views/common.py +++ b/apps/advertisement/views/common.py @@ -28,5 +28,8 @@ class AdvertisementPageTypeListView(AdvertisementBaseView, generics.ListAPIView) product_type = self.kwargs.get('page_type') qs = super(AdvertisementPageTypeListView, self).get_queryset() if product_type: - return qs.by_page_type(product_type) + return qs.by_page_type(product_type) \ + .by_country(self.request.country_code) \ + .by_locale(self.request.locale) \ + .distinct('id') return qs.none() diff --git a/apps/advertisement/views/web.py b/apps/advertisement/views/web.py index db1cfde8..a9e527a0 100644 --- a/apps/advertisement/views/web.py +++ b/apps/advertisement/views/web.py @@ -7,3 +7,4 @@ class AdvertisementPageTypeWebListView(AdvertisementPageTypeListView): """Advertisement mobile list view.""" serializer_class = AdvertisementPageTypeWebListSerializer + From ea760fc674784e520e16501ac7b0d19d43d7f7ae Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Mon, 9 Dec 2019 15:00:15 +0300 Subject: [PATCH 10/11] rename attrs --- apps/search_indexes/serializers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index a43ebaf7..3b5561fa 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -243,8 +243,8 @@ class WineOriginSerializer(serializers.Serializer): class EstablishmentDocumentSerializer(InFavoritesMixin, DocumentSerializer): """Establishment document serializer.""" - establishment_type = EstablishmentTypeSerializer() - establishment_subtypes = EstablishmentTypeSerializer(many=True) + type = EstablishmentTypeSerializer(source='establishment_type') + subtypes = EstablishmentTypeSerializer(many=True, source='establishment_subtypes') address = AddressDocumentSerializer(allow_null=True) tags = TagsDocumentSerializer(many=True, source='visible_tags') restaurant_category = TagsDocumentSerializer(many=True, allow_null=True) @@ -280,8 +280,8 @@ class EstablishmentDocumentSerializer(InFavoritesMixin, DocumentSerializer): 'wine_origins', # 'works_now', # 'collections', - # 'establishment_type', - # 'establishment_subtypes', + 'type', + 'subtypes', ) From 912431690d5c12384542c5834b5df3c4b05d89cd Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Mon, 9 Dec 2019 15:21:39 +0300 Subject: [PATCH 11/11] rename attrs #2 --- apps/establishment/serializers/common.py | 4 ++-- apps/transfer/serializers/guide.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/establishment/serializers/common.py b/apps/establishment/serializers/common.py index 52d7ae69..5c77ccbf 100644 --- a/apps/establishment/serializers/common.py +++ b/apps/establishment/serializers/common.py @@ -450,13 +450,13 @@ class EstablishmentSimilarSerializer(EstablishmentBaseSerializer): address = AddressDetailSerializer(read_only=True) schedule = ScheduleRUDSerializer(many=True, allow_null=True) - establishment_type = EstablishmentTypeGeoSerializer() + type = EstablishmentTypeGeoSerializer(source='establishment_type') artisan_category = TagBaseSerializer(many=True, allow_null=True) class Meta(EstablishmentBaseSerializer.Meta): fields = EstablishmentBaseSerializer.Meta.fields + [ 'schedule', - 'establishment_type', + 'type', 'artisan_category', ] diff --git a/apps/transfer/serializers/guide.py b/apps/transfer/serializers/guide.py index f0cddd02..8a083e55 100644 --- a/apps/transfer/serializers/guide.py +++ b/apps/transfer/serializers/guide.py @@ -68,7 +68,7 @@ class GuideSerializer(TransferSerializerMixin): class GuideFilterSerializer(TransferSerializerMixin): id = serializers.IntegerField() year = serializers.CharField(allow_null=True) - establishment_type = serializers.CharField(allow_null=True) + type = serializers.CharField(allow_null=True, source='establishment_type') countries = serializers.CharField(allow_null=True) regions = serializers.CharField(allow_null=True) subregions = serializers.CharField(allow_null=True) @@ -86,7 +86,7 @@ class GuideFilterSerializer(TransferSerializerMixin): fields = ( 'id', 'year', - 'establishment_type', + 'type', 'countries', 'regions', 'subregions',