diff --git a/apps/account/transfer_data.py b/apps/account/transfer_data.py index 41d430fa..75e0d8ee 100644 --- a/apps/account/transfer_data.py +++ b/apps/account/transfer_data.py @@ -1,7 +1,10 @@ -from django.db.models import Value, IntegerField, F from pprint import pprint -from transfer.models import Profiles, Accounts + +from django.db.models import Q + +from transfer.models import Accounts, Identities from transfer.serializers.account import UserSerializer +from transfer.serializers.user_social_auth import UserSocialAuthSerializer STOP_LIST = ( 'cyril@tomatic.net', @@ -14,8 +17,8 @@ STOP_LIST = ( def transfer_user(): # queryset = Profiles.objects.all() - # queryset = queryset.annotate(nickname=F("account__nickname")) - # queryset = queryset.annotate(email=F("account__email")) + # 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) @@ -24,9 +27,29 @@ def transfer_user(): if serialized_data.is_valid(): serialized_data.save() else: - pprint(f"News serializer errors: {serialized_data.errors}") + pprint(f'News serializer errors: {serialized_data.errors}') + + +def transfer_identities(): + queryset = Identities.objects.exclude( + Q(account_id__isnull=True) | + Q(account__confirmed_at__isnull=True) | + Q(account__email__in=STOP_LIST) + ).values_list( + 'account_id', + 'provider', + 'uid', + ) + + serialized_data = UserSocialAuthSerializer(data=list(queryset.values()), many=True) + + if serialized_data.is_valid(): + serialized_data.save() + else: + pprint(f'UserSocialAuth serializer errors: {serialized_data.errors}') data_types = { - "account": [transfer_user] + 'account': [transfer_user], + 'identities': [transfer_identities], } diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index e75deb32..d2387d0d 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -23,6 +23,7 @@ class Command(BaseCommand): 'menu', 'location_establishment', 'whirligig', + 'identities', ] LONG_DATA_TYPES = [ diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 599445c2..8527eeb6 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -987,3 +987,17 @@ class MetadatumAliases(MigrateMixin): class Meta: managed = False db_table = 'metadatum_aliases' + + +class Identities(MigrateMixin): + using = 'legacy' + + account = models.ForeignKey(Accounts, models.DO_NOTHING, blank=True, null=True) + provider = models.CharField(max_length=255, blank=True, null=True) + uid = models.CharField(max_length=255, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'identities' diff --git a/apps/transfer/serializers/user_social_auth.py b/apps/transfer/serializers/user_social_auth.py new file mode 100644 index 00000000..dc260fa0 --- /dev/null +++ b/apps/transfer/serializers/user_social_auth.py @@ -0,0 +1,30 @@ +from rest_framework import serializers +from social_django.models import UserSocialAuth + +from account.models import User + + +class UserSocialAuthSerializer(serializers.Serializer): + account_id = serializers.IntegerField() + provider = serializers.CharField() + uid = serializers.CharField() + + def validate(self, data): + data.update({ + 'user': self.get_account(data), + }) + data.pop('account_id') + return data + + def create(self, validated_data): + try: + return UserSocialAuth.objects.create(**validated_data) + except Exception as e: + raise ValueError(f"Error creating UserSocialAuth with {validated_data}: {e}") + + @staticmethod + def get_account(data): + user = User.objects.filter(old_id=data['account_id']).first() + if not user: + raise ValueError(f"User account not found with old_id {data['account_id']}") + return user