diff --git a/apps/establishment/transfer_data.py b/apps/establishment/transfer_data.py index 4670e6cf..3005e6c4 100644 --- a/apps/establishment/transfer_data.py +++ b/apps/establishment/transfer_data.py @@ -1,9 +1,10 @@ from pprint import pprint -from django.db.models import Q +from django.db.models import Q, F -from transfer.models import Establishments +from transfer.models import Establishments, Dishes from transfer.serializers.establishment import EstablishmentSerializer +from transfer.serializers.plate import PlateSerializer def transfer_establishment(): @@ -77,6 +78,26 @@ def transfer_establishment(): pprint(f"Establishment serializer errors: {serialized_data.errors}") +def transfer_menu(): + dishes = Dishes.objects.exclude( + Q(establishment_id__isnull=True) | + Q(dish_type__isnull=True) | + Q(price__isnull=True) | + Q(currency__isnull=True) | + Q(name__isnull=True) | + Q(name__exact='') + ).annotate( + country_code=F('establishment__location__country_code'), + ) + + serialized_data = PlateSerializer(data=list(dishes.values()), many=True) + if serialized_data.is_valid(): + serialized_data.save() + else: + pprint(f"Menu serializer errors: {serialized_data.errors}") + + data_types = { - "establishment": [transfer_establishment] + "establishment": [transfer_establishment], + "menu": [transfer_menu], } diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index 1c146018..2e4d5de5 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -18,7 +18,8 @@ class Command(BaseCommand): 'establishment', 'gallery', 'commercial', - 'tmp' + 'tmp', + 'menu', ] def handle(self, *args, **options): diff --git a/apps/transfer/models.py b/apps/transfer/models.py index ffd0664e..e9d7b1e6 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -461,6 +461,23 @@ class Descriptions(MigrateMixin): db_table = 'descriptions' +class Dishes(MigrateMixin): + using = 'legacy' + + name = models.CharField(max_length=255, blank=True, null=True) + price = models.FloatField(blank=True, null=True) + currency = models.CharField(max_length=255, blank=True, null=True) + dish_type = models.CharField(max_length=255, blank=True, null=True) + signature = models.IntegerField(blank=True, null=True) + establishment = models.ForeignKey('Establishments', models.DO_NOTHING, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'dishes' + + # class EstablishmentAssets(MigrateMixin): # using = 'legacy' # diff --git a/apps/transfer/serializers/plate.py b/apps/transfer/serializers/plate.py new file mode 100644 index 00000000..7d5eb99b --- /dev/null +++ b/apps/transfer/serializers/plate.py @@ -0,0 +1,55 @@ +from rest_framework import serializers + +from establishment.models import Menu, Plate, Establishment +from main.models import Currency +from utils.constants import CODE_LOCALES + + +class PlateSerializer(serializers.Serializer): + name = serializers.CharField() + price = serializers.DecimalField(decimal_places=2, max_digits=10) + currency = serializers.CharField() + dish_type = serializers.CharField() + country_code = serializers.CharField() + establishment_id = serializers.IntegerField() + signature = serializers.IntegerField(allow_null=True) + + def create(self, validated_data): + establishment = Establishment.objects.filter(old_id=validated_data['establishment_id']).first() + if not establishment: + return + return Plate.objects.create(**self.get_plate_data(validated_data, establishment.id)) + + def get_plate_data(self, validated_data, est_id): + locale = CODE_LOCALES.get(validated_data['country_code'], 'en-GB') + payload = { + 'name': {locale: validated_data['name']}, + 'price': validated_data['price'], + 'currency_id': self.get_currency(validated_data), + 'menu_id': self.get_menu(validated_data, est_id), + 'is_signature_plate': bool(validated_data['signature']), + } + return payload + + @staticmethod + def get_menu(validated_data, est_id): + payload = { + 'establishment_id': est_id, + 'category': {'en-GB': validated_data['dish_type']}, + } + menu, _ = Menu.objects.get_or_create(**payload) + return menu.id + + @staticmethod + def get_currency(validated_data): + try: + currency = Currency.objects.get( + slug=validated_data['currency'], + sign='$', + ) + except Currency.DoesNotExist: + currency = Currency.objects.create( + slug=validated_data['currency'], + sign='$', + ) + return currency.id diff --git a/apps/utils/constants.py b/apps/utils/constants.py new file mode 100644 index 00000000..fe24c008 --- /dev/null +++ b/apps/utils/constants.py @@ -0,0 +1,26 @@ +CODE_LOCALES = { + 'AAA': 'en-GB', + 'AUS': 'en-AU', # Австралия + 'AUT': 'de-AT', # Австрия + 'BEL': 'de-BE', # Бельгия + 'BRA': 'pt-BR', # Бразилия + 'CAN': 'fr-CA', # Канада + 'DEU': 'da-DE', # Германия + 'FRA': 'fr-FR', # Франция + 'GEO': 'ka', # Грузия + 'GRC': 'el-GR', # Греция + 'HRV': 'hr-HR', # Хорватия + 'HUN': 'hu-HU', # Венгрия + 'ISR': 'en-IL', # Израиль + 'ITA': 'it-IT', # Италия + 'JPN': 'ja', # Япония + 'LUX': 'fr-LU', # Люксембург + 'MAR': 'ar-MA', # Марокко + 'MDV': 'dv', # Мальдивы + 'NLD': 'nl-NL', # Нидерланды + 'POL': 'pl', # Польша + 'ROU': 'ro', # Румыния + 'RUS': 'ru-RU', # Россия + 'SVN': 'hu-SI', # Словения + 'USA': 'en-US', # США +} diff --git a/project/settings/base.py b/project/settings/base.py index 2f05ca52..659a96ba 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -329,7 +329,7 @@ REDOC_SETTINGS = { # RabbitMQ # BROKER_URL = 'amqp://rabbitmq:5672' # Redis -BROKER_URL = 'redis://localhost:6379/1' +BROKER_URL = 'redis://redis:6379/1' CELERY_RESULT_BACKEND = BROKER_URL CELERY_BROKER_URL = BROKER_URL CELERY_ACCEPT_CONTENT = ['application/json'] diff --git a/project/settings/development.py b/project/settings/development.py index 6c643301..1cebcc87 100644 --- a/project/settings/development.py +++ b/project/settings/development.py @@ -19,8 +19,8 @@ DOMAIN_URI = 'gm.id-east.ru' # ELASTICSEARCH SETTINGS ELASTICSEARCH_DSL = { 'default': { - 'hosts': 'localhost:9200' - # 'hosts': 'elasticsearch:9200' + # 'hosts': 'localhost:9200' + 'hosts': 'elasticsearch:9200' } }