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.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.'))
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
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.'))

View File

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

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():
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,

View File

@ -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"]

View File

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

View File

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

View File

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