change command for migration of users

This commit is contained in:
Dmitriy Kuzmenko 2019-11-11 15:29:31 +03:00
parent 3d83c2a3aa
commit 7617981259
11 changed files with 86 additions and 71 deletions

View File

@ -1,6 +1,7 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import connections 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 establishment.management.commands.add_position import namedtuplefetchall
from account.models import User from account.models import User
@ -11,33 +12,29 @@ class Command(BaseCommand):
def account_sql(self): def account_sql(self):
with connections['legacy'].cursor() as cursor: with connections['legacy'].cursor() as cursor:
cursor.execute(''' 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 from accounts as a
where a.email is not null where a.email is not null and a.nickname!='admin'
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
''') ''')
return namedtuplefetchall(cursor) return namedtuplefetchall(cursor)
def handle(self, *args, **kwargs): def handle(self, *args, **kwargs):
objects = [] objects = []
for a in self.account_sql(): for a in self.account_sql():
count = User.objects.filter(Q(email=a.email) | Q(old_id=a.account_id)).count() users = User.objects.filter(Q(email=a.email) | Q(old_id=a.account_id))
if count == 0: if not users.exists():
objects.append(User(email=a.email, objects.append(User(email=a.email,
unconfirmed_email=False, unconfirmed_email=a.unconfirmed_email,
email_confirmed=True, email_confirmed=a.confirmed_at,
old_id=a.account_id, 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) User.objects.bulk_create(objects)
self.stdout.write(self.style.WARNING(f'Created accounts objects.')) 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.'))

View File

@ -20,14 +20,7 @@ class Command(BaseCommand):
( (
select a.email, a.id as account_id select a.email, a.id as account_id
from accounts as a from accounts as a
where a.email is not null 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
) t ) t
join identities i on i.account_id = t.account_id 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) user = User.objects.filter(old_id=s.account_id)
if user.count() > 0: if user.count() > 0:
social = UserSocialAuth.objects.filter(user=user.first(), social = UserSocialAuth.objects.filter(user=user.first(),
provider=s.provider, provider=s.provider,
uid=s.uid) uid=s.uid)
if social.count() == 0: if social.count() == 0:
objects.append(UserSocialAuth(user=user.first(), provider=s.provider, objects.append(UserSocialAuth(user=user.first(), provider=s.provider,
uid=s.uid) uid=s.uid)
) )
print('INSERT')
UserSocialAuth.objects.bulk_create(objects) UserSocialAuth.objects.bulk_create(objects)
self.stdout.write(self.style.WARNING(f'Created social objects.')) self.stdout.write(self.style.WARNING(f'Created social objects.'))

View File

@ -7,11 +7,11 @@ from transfer.serializers.account import UserSerializer
from transfer.serializers.user_social_auth import UserSocialAuthSerializer from transfer.serializers.user_social_auth import UserSocialAuthSerializer
STOP_LIST = ( STOP_LIST = (
'cyril@tomatic.net', # 'cyril@tomatic.net',
'cyril2@tomatic.net', # 'cyril2@tomatic.net',
'd.sadykova@id-east.ru', # 'd.sadykova@id-east.ru',
'd.sadykova@octopod.ru', # 'd.sadykova@octopod.ru',
'n.yurchenko@id-east.ru', # 'n.yurchenko@id-east.ru',
) )
@ -20,7 +20,7 @@ def transfer_user():
# queryset = queryset.annotate(nickname=F('account__nickname')) # queryset = queryset.annotate(nickname=F('account__nickname'))
# queryset = queryset.annotate(email=F('account__email')) # 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) serialized_data = UserSerializer(data=list(queryset.values()), many=True)
@ -33,7 +33,7 @@ def transfer_user():
def transfer_identities(): def transfer_identities():
queryset = Identities.objects.exclude( queryset = Identities.objects.exclude(
Q(account_id__isnull=True) | Q(account_id__isnull=True) |
Q(account__confirmed_at__isnull=True) | # Q(account__confirmed_at__isnull=True) |
Q(account__email__in=STOP_LIST) Q(account__email__in=STOP_LIST)
).values_list( ).values_list(
'account_id', 'account_id',

View File

@ -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__'

View File

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

View File

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

View File

@ -12,11 +12,12 @@ from transfer.serializers.plate import PlateSerializer
def transfer_establishment(): def transfer_establishment():
result = [] result = []
# todo: filter(location__city__name__icontains='paris')
old_establishments = Establishments.objects.exclude( old_establishments = Establishments.objects.exclude(
id__in=list(Establishment.objects.all().values_list('old_id', flat=True)) id__in=list(Establishment.objects.all().values_list('old_id', flat=True))
).exclude( ).exclude(
Q(type='Wineyard') | # Q(type='Wineyard') |
Q(type='Restaurant') |
Q(type='Shop') |
Q(location__timezone__isnull=True), Q(location__timezone__isnull=True),
).prefetch_related( ).prefetch_related(
'establishmentinfos_set', 'establishmentinfos_set',
@ -28,7 +29,7 @@ def transfer_establishment():
data = { data = {
'old_id': item.id, 'old_id': item.id,
'name': item.name, 'name': item.name,
'name_translated': item.index_name, 'transliterated_name': item.index_name,
'slug': item.slug, 'slug': item.slug,
'type': item.type, 'type': item.type,
'phone': item.phone, 'phone': item.phone,

View File

@ -5,7 +5,7 @@ from account.models import User
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
nickname = serializers.CharField() nickname = serializers.CharField()
email = serializers.CharField() email = serializers.CharField()
confirmed_at = serializers.DateTimeField() confirmed_at = serializers.DateTimeField(allow_null=True)
id = serializers.CharField() id = serializers.CharField()
class Meta: class Meta:
@ -30,8 +30,11 @@ class UserSerializer(serializers.ModelSerializer):
# использовать get_or_create # использовать get_or_create
User.objects.create(**validated_data) User.objects.create(**validated_data)
def get_email_confirmed(self, obj): def get_email_confirmed(self, data):
return True if data.get("confirmed_at"):
return True
else:
return False
def get_username(self, obj): def get_username(self, obj):
return obj["email"] return obj["email"]

View File

@ -35,7 +35,7 @@ class EstablishmentSerializer(serializers.ModelSerializer):
'created', 'created',
'old_id', # + 'old_id', # +
'name', # + 'name', # +
'name_translated', # + 'transliterated_name', # +
'tz', # + 'tz', # +
'website', # + 'website', # +
'facebook', # + 'facebook', # +
@ -101,6 +101,7 @@ class EstablishmentSerializer(serializers.ModelSerializer):
types = { types = {
'Restaurant': EstablishmentType.RESTAURANT, 'Restaurant': EstablishmentType.RESTAURANT,
'Shop': EstablishmentType.ARTISAN, 'Shop': EstablishmentType.ARTISAN,
'Wineyard': EstablishmentType.PRODUCER,
} }
obj, _ = EstablishmentType.objects.get_or_create(index_name=types[data['type']]) obj, _ = EstablishmentType.objects.get_or_create(index_name=types[data['type']])
return obj.id return obj.id

View File

@ -14,8 +14,7 @@ services:
volumes: volumes:
- .:/code - .:/code
- gm-mysql_db:/var/lib/mysql - gm-mysql_db:/var/lib/mysql
networks:
- mysql_network
# PostgreSQL database # PostgreSQL database
db: db:
@ -31,8 +30,7 @@ services:
- "5436:5432" - "5436:5432"
volumes: volumes:
- gm-db:/var/lib/postgresql/data/ - gm-db:/var/lib/postgresql/data/
networks:
- database_network
elasticsearch: elasticsearch:
image: elasticsearch:7.3.1 image: elasticsearch:7.3.1
@ -46,14 +44,12 @@ services:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node - discovery.type=single-node
- xpack.security.enabled=false - xpack.security.enabled=false
networks:
- elasticsearch_network
# Redis # Redis
redis: redis:
image: redis:alpine image: redis:alpine
networks:
- redis_network
# Celery # Celery
worker: worker:
@ -71,8 +67,7 @@ services:
links: links:
- db - db
- redis - redis
networks:
- redis_network
worker_beat: worker_beat:
build: . build: .
@ -89,8 +84,7 @@ services:
links: links:
- db - db
- redis - redis
networks:
- redis_network
# App: G&M # App: G&M
gm_app: gm_app:
@ -115,11 +109,7 @@ services:
- gm-media:/media-data - gm-media:/media-data
ports: ports:
- "8000:8000" - "8000:8000"
networks:
- redis_network
- database_network
- mysql_network
- elasticsearch_network
volumes: volumes:
gm-mysql_db: gm-mysql_db:
@ -130,12 +120,3 @@ volumes:
name: gm-media name: gm-media
gm-esdata: gm-esdata:
networks:
database_network:
driver: bridge
mysql_network:
driver: bridge
elasticsearch_network:
driver: bridge
redis_network:
driver: bridge

View File

@ -6,6 +6,7 @@ urlpatterns = [
path('account/', include('account.urls.back')), path('account/', include('account.urls.back')),
path('comment/', include('comment.urls.back')), path('comment/', include('comment.urls.back')),
path('establishments/', include('establishment.urls.back')), path('establishments/', include('establishment.urls.back')),
path('collections/', include('collection.urls.back')),
path('gallery/', include(('gallery.urls', 'gallery'), namespace='gallery')), path('gallery/', include(('gallery.urls', 'gallery'), namespace='gallery')),
path('location/', include('location.urls.back')), path('location/', include('location.urls.back')),
path('news/', include('news.urls.back')), path('news/', include('news.urls.back')),