From 761798125915e042565d09dfaa9613c7ca3c10a7 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Mon, 11 Nov 2019 15:29:31 +0300 Subject: [PATCH] change command for migration of users --- .../management/commands/add_account.py | 35 +++++++++---------- .../account/management/commands/add_social.py | 16 +++------ apps/account/transfer_data.py | 14 ++++---- apps/collection/serializers/back.py | 9 +++++ apps/collection/urls/back.py | 11 ++++++ apps/collection/views/back.py | 19 ++++++++++ apps/establishment/transfer_data.py | 7 ++-- apps/transfer/serializers/account.py | 9 +++-- apps/transfer/serializers/establishment.py | 3 +- docker-compose.mysql.yml | 33 ++++------------- project/urls/back.py | 1 + 11 files changed, 86 insertions(+), 71 deletions(-) create mode 100644 apps/collection/serializers/back.py create mode 100644 apps/collection/urls/back.py create mode 100644 apps/collection/views/back.py diff --git a/apps/account/management/commands/add_account.py b/apps/account/management/commands/add_account.py index 2b72767c..2e5842c5 100644 --- a/apps/account/management/commands/add_account.py +++ b/apps/account/management/commands/add_account.py @@ -1,6 +1,7 @@ from django.core.management.base import BaseCommand from django.db import connections -from django.db.models import Q +from django.db.models import Q, F, Value +from django.db.models.functions import ConcatPair from establishment.management.commands.add_position import namedtuplefetchall from account.models import User @@ -11,33 +12,29 @@ class Command(BaseCommand): def account_sql(self): with connections['legacy'].cursor() as cursor: cursor.execute(''' - select a.email, a.id as account_id, a.encrypted_password + select a.email, a.id as account_id, a.encrypted_password, + case when a.confirmed_at is not null then true else false end as confirmed_at, + case when a.confirmed_at is null then true else false end as unconfirmed_email, + nickname from accounts as a - where a.email is not null - and a.email not in ('cyril@tomatic.net', - 'cyril2@tomatic.net', - 'd.sadykova@id-east.ru', - 'd.sadykova@octopod.ru', - 'n.yurchenko@id-east.ru' - ) - and a.confirmed_at is not null + where a.email is not null and a.nickname!='admin' ''') return namedtuplefetchall(cursor) def handle(self, *args, **kwargs): objects = [] for a in self.account_sql(): - count = User.objects.filter(Q(email=a.email) | Q(old_id=a.account_id)).count() - if count == 0: + users = User.objects.filter(Q(email=a.email) | Q(old_id=a.account_id)) + if not users.exists(): objects.append(User(email=a.email, - unconfirmed_email=False, - email_confirmed=True, + unconfirmed_email=a.unconfirmed_email, + email_confirmed=a.confirmed_at, old_id=a.account_id, - password='bcrypt$'+a.encrypted_password + password=a.encrypted_password, + username=a.nickname )) - else: - user = User.objects.filter(Q(email=a.email) | Q(old_id=a.account_id)) - user.update(password='bcrypt$'+a.encrypted_password) User.objects.bulk_create(objects) - self.stdout.write(self.style.WARNING(f'Created accounts objects.')) \ No newline at end of file + user = User.objects.filter(old_id__isnull=False) + user.update(password=ConcatPair(Value('bcrypt$'), F('password'))) + self.stdout.write(self.style.WARNING(f'Created accounts objects.')) diff --git a/apps/account/management/commands/add_social.py b/apps/account/management/commands/add_social.py index c7894c32..ecf86d60 100644 --- a/apps/account/management/commands/add_social.py +++ b/apps/account/management/commands/add_social.py @@ -20,14 +20,7 @@ class Command(BaseCommand): ( select a.email, a.id as account_id from accounts as a - where a.email is not null - and a.email not in ('cyril@tomatic.net', - 'cyril2@tomatic.net', - 'd.sadykova@id-east.ru', - 'd.sadykova@octopod.ru', - 'n.yurchenko@id-east.ru' - ) - and a.confirmed_at is not null + where a.email is not null ) t join identities i on i.account_id = t.account_id ''') @@ -39,13 +32,12 @@ class Command(BaseCommand): user = User.objects.filter(old_id=s.account_id) if user.count() > 0: social = UserSocialAuth.objects.filter(user=user.first(), - provider=s.provider, - uid=s.uid) + provider=s.provider, + uid=s.uid) if social.count() == 0: objects.append(UserSocialAuth(user=user.first(), provider=s.provider, uid=s.uid) - ) - print('INSERT') + ) UserSocialAuth.objects.bulk_create(objects) self.stdout.write(self.style.WARNING(f'Created social objects.')) \ No newline at end of file diff --git a/apps/account/transfer_data.py b/apps/account/transfer_data.py index 75e0d8ee..0f199173 100644 --- a/apps/account/transfer_data.py +++ b/apps/account/transfer_data.py @@ -7,11 +7,11 @@ from transfer.serializers.account import UserSerializer from transfer.serializers.user_social_auth import UserSocialAuthSerializer STOP_LIST = ( - 'cyril@tomatic.net', - 'cyril2@tomatic.net', - 'd.sadykova@id-east.ru', - 'd.sadykova@octopod.ru', - 'n.yurchenko@id-east.ru', + # 'cyril@tomatic.net', + # 'cyril2@tomatic.net', + # 'd.sadykova@id-east.ru', + # 'd.sadykova@octopod.ru', + # 'n.yurchenko@id-east.ru', ) @@ -20,7 +20,7 @@ def transfer_user(): # queryset = queryset.annotate(nickname=F('account__nickname')) # queryset = queryset.annotate(email=F('account__email')) - queryset = Accounts.objects.filter(confirmed_at__isnull=False).exclude(email__in=STOP_LIST) + queryset = Accounts.objects.exclude(email__in=STOP_LIST) serialized_data = UserSerializer(data=list(queryset.values()), many=True) @@ -33,7 +33,7 @@ def transfer_user(): def transfer_identities(): queryset = Identities.objects.exclude( Q(account_id__isnull=True) | - Q(account__confirmed_at__isnull=True) | + # Q(account__confirmed_at__isnull=True) | Q(account__email__in=STOP_LIST) ).values_list( 'account_id', diff --git a/apps/collection/serializers/back.py b/apps/collection/serializers/back.py new file mode 100644 index 00000000..45eaec73 --- /dev/null +++ b/apps/collection/serializers/back.py @@ -0,0 +1,9 @@ +from rest_framework import serializers +from collection import models + + +class CollectionSerializer(serializers.ModelSerializer): + """Collection serializer.""" + class Meta: + model = models.Collection.objects.all() + fields = '__all__' diff --git a/apps/collection/urls/back.py b/apps/collection/urls/back.py new file mode 100644 index 00000000..3ac8a073 --- /dev/null +++ b/apps/collection/urls/back.py @@ -0,0 +1,11 @@ +"""Collection common urlpaths.""" +from django.urls import path + +from collection.views import back as views + +app_name = 'collection' + +urlpatterns = [ + path('', views.CollectionListCreateView.as_view(), name='list-create'), + +] \ No newline at end of file diff --git a/apps/collection/views/back.py b/apps/collection/views/back.py new file mode 100644 index 00000000..af08aff5 --- /dev/null +++ b/apps/collection/views/back.py @@ -0,0 +1,19 @@ +from rest_framework import generics, permissions +from collection import models +from collection.serializers import common, back + + +class CollectionListCreateView(generics.ListCreateAPIView): + """Collection list-create view.""" + queryset = models.Collection.objects.all() + serializer_class = back.CollectionSerializer + # todo: conf. permissions by TT + permission_classes = (permissions.IsAuthenticated, ) + + +class CollectionRUDView(generics.RetrieveUpdateDestroyAPIView): + """Collection list-create view.""" + queryset = models.Collection.objects.all() + serializer_class = back.CollectionSerializer + # todo: conf. permissions by TT + permission_classes = (permissions.IsAuthenticated, ) \ No newline at end of file diff --git a/apps/establishment/transfer_data.py b/apps/establishment/transfer_data.py index 15f9524d..e2747714 100644 --- a/apps/establishment/transfer_data.py +++ b/apps/establishment/transfer_data.py @@ -12,11 +12,12 @@ from transfer.serializers.plate import PlateSerializer def transfer_establishment(): result = [] - # todo: filter(location__city__name__icontains='paris') old_establishments = Establishments.objects.exclude( id__in=list(Establishment.objects.all().values_list('old_id', flat=True)) ).exclude( - Q(type='Wineyard') | + # Q(type='Wineyard') | + Q(type='Restaurant') | + Q(type='Shop') | Q(location__timezone__isnull=True), ).prefetch_related( 'establishmentinfos_set', @@ -28,7 +29,7 @@ def transfer_establishment(): data = { 'old_id': item.id, 'name': item.name, - 'name_translated': item.index_name, + 'transliterated_name': item.index_name, 'slug': item.slug, 'type': item.type, 'phone': item.phone, diff --git a/apps/transfer/serializers/account.py b/apps/transfer/serializers/account.py index 5b0e1369..86b28e03 100644 --- a/apps/transfer/serializers/account.py +++ b/apps/transfer/serializers/account.py @@ -5,7 +5,7 @@ from account.models import User class UserSerializer(serializers.ModelSerializer): nickname = serializers.CharField() email = serializers.CharField() - confirmed_at = serializers.DateTimeField() + confirmed_at = serializers.DateTimeField(allow_null=True) id = serializers.CharField() class Meta: @@ -30,8 +30,11 @@ class UserSerializer(serializers.ModelSerializer): # использовать get_or_create User.objects.create(**validated_data) - def get_email_confirmed(self, obj): - return True + def get_email_confirmed(self, data): + if data.get("confirmed_at"): + return True + else: + return False def get_username(self, obj): return obj["email"] diff --git a/apps/transfer/serializers/establishment.py b/apps/transfer/serializers/establishment.py index 78db0995..abc4d6f3 100644 --- a/apps/transfer/serializers/establishment.py +++ b/apps/transfer/serializers/establishment.py @@ -35,7 +35,7 @@ class EstablishmentSerializer(serializers.ModelSerializer): 'created', 'old_id', # + 'name', # + - 'name_translated', # + + 'transliterated_name', # + 'tz', # + 'website', # + 'facebook', # + @@ -101,6 +101,7 @@ class EstablishmentSerializer(serializers.ModelSerializer): types = { 'Restaurant': EstablishmentType.RESTAURANT, 'Shop': EstablishmentType.ARTISAN, + 'Wineyard': EstablishmentType.PRODUCER, } obj, _ = EstablishmentType.objects.get_or_create(index_name=types[data['type']]) return obj.id diff --git a/docker-compose.mysql.yml b/docker-compose.mysql.yml index 4d4e553e..c325fce1 100644 --- a/docker-compose.mysql.yml +++ b/docker-compose.mysql.yml @@ -14,8 +14,7 @@ services: volumes: - .:/code - gm-mysql_db:/var/lib/mysql - networks: - - mysql_network + # PostgreSQL database db: @@ -31,8 +30,7 @@ services: - "5436:5432" volumes: - gm-db:/var/lib/postgresql/data/ - networks: - - database_network + elasticsearch: image: elasticsearch:7.3.1 @@ -46,14 +44,12 @@ services: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - discovery.type=single-node - xpack.security.enabled=false - networks: - - elasticsearch_network + # Redis redis: image: redis:alpine - networks: - - redis_network + # Celery worker: @@ -71,8 +67,7 @@ services: links: - db - redis - networks: - - redis_network + worker_beat: build: . @@ -89,8 +84,7 @@ services: links: - db - redis - networks: - - redis_network + # App: G&M gm_app: @@ -115,11 +109,7 @@ services: - gm-media:/media-data ports: - "8000:8000" - networks: - - redis_network - - database_network - - mysql_network - - elasticsearch_network + volumes: gm-mysql_db: @@ -130,12 +120,3 @@ volumes: name: gm-media gm-esdata: -networks: - database_network: - driver: bridge - mysql_network: - driver: bridge - elasticsearch_network: - driver: bridge - redis_network: - driver: bridge diff --git a/project/urls/back.py b/project/urls/back.py index 40b3415a..7087d9e9 100644 --- a/project/urls/back.py +++ b/project/urls/back.py @@ -6,6 +6,7 @@ urlpatterns = [ path('account/', include('account.urls.back')), path('comment/', include('comment.urls.back')), path('establishments/', include('establishment.urls.back')), + path('collections/', include('collection.urls.back')), path('gallery/', include(('gallery.urls', 'gallery'), namespace='gallery')), path('location/', include('location.urls.back')), path('news/', include('news.urls.back')),