change command for migration of users
This commit is contained in:
parent
3d83c2a3aa
commit
7617981259
|
|
@ -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.'))
|
||||||
|
|
|
||||||
|
|
@ -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.'))
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
9
apps/collection/serializers/back.py
Normal file
9
apps/collection/serializers/back.py
Normal 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__'
|
||||||
11
apps/collection/urls/back.py
Normal file
11
apps/collection/urls/back.py
Normal 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'),
|
||||||
|
|
||||||
|
]
|
||||||
19
apps/collection/views/back.py
Normal file
19
apps/collection/views/back.py
Normal 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, )
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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"]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
|
|
@ -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')),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user