0
from django.db import models
import time
from django.contrib.auth.models import User
from allauth.account.signals import user_signed_up, password_set
from django.db.models.signals import post_save
from django.dispatch import receiver, Signal

@receiver(user_signed_up)
def employeeID(sender, **kwargs):
    # username = kwargs['request'].user.username
    username = kwargs['user'].username
    u = User.objects.get(username = username)
    u.username = str(time.time()).split('.')[0]
    u.save()

# Create your models here.
# @receiver(user_signed_up)
# def employeeID(sender=User, **kwargs):
#     old_username = kwargs['username']
#     user = User.objects.get(username = old_username)
#     user.username = str(time.time()).split('.')[0]
#     user.save()

# @receiver(user_signed_up)
# # def employeeID(request, user, sociallogin=None, **kwargs):
# def employeeID(sender, **kwargs):
#     print('signal received')
#     old_username = kwargs.username
#     user = User.objects.get(username = old_username)
#     user.username = str(time.time()).split('.')[0]
#     user.save()

# @receiver(user_signed_up)
# def employeeID(sender, **kwargs):
#     request = kwargs['request']
#     user = kwargs['user']
#     # Do your stuff with the user
#     username = request.user.username
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

# @receiver(user_signed_up)
# def employeeID(sender=User, **kwargs):
#     request = kwargs['request']
#     user = kwargs['user']
#     # Do your stuff with the user
#     username = request.user.username
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

# @receiver(user_signed_up, sender=User)
# def employeeID(sender=User, **kwargs):
#     username = kwargs['request'].user.username
#     # username = kwargs['user'].username
#     print(username)
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

# @receiver(user_signed_up)
# def employeeID(request, user, **kwargs):
#     # username = kwargs['request'].user.username
#     username = kwargs['user'].username
#     print(username)
#     u = User.objects.get(username = username)
#     u.username = str(time.time()).split('.')[0]
#     u.save()

Django version: 2.0

Python 3.6.2

*user registration with email(without verification) and password

Goal : Change the django-allauth's auto generated username with my own right after they signup.

Issue: I am not really sure whether the signals are not working or coming, or something wrong with my code but I am unable to change the auto generated django allauth username with my own. I have also posted the various iterations of my attempts here (commented out). These are just a very few of so many iterations and attempts of my code from last few days. I have so far spent an entire friday+saturday to achieve this. I have referred the following resources and tried to mimick or adapt them to my use case but no go.

Django - User and User Profile form creating two profiles instead of one
How to populate user profile with django-allauth provider information?
IndexError, list index out of range. Django-allauth signals
django-allauth: how to properly use email_confirmed signal to set user to active
How to populate user profile with django-allauth provider information?
django django-allauth save extra_data from social login in signal

Gajendra D Ambi
  • 3,832
  • 26
  • 30

1 Answers1

0

You should use pre_save for saving username and you could do this is in more convenient way, here I can provide you my function for generating usernames

def unique_username_generator(instance, new_username=None):

    #user_str = get_first_name(instance.name)

    #In your case
     user_str = instance.username 

    if new_username is not None:
        username = new_username

    else:
        user_num = random.randint(1,391020931223)
        username = '{user_str}_{user_num}'.format(user_num=user_num,
                    user_str=user_str)

    klass = instance.__class__

    qs_exists = klass.objects.filter(username=username).exists()
    if qs_exists:
        user_num = random.randint(1,391020931223)
        new_username = '{user_str}_{user_num}'.format(user_num=user_num,
                    user_str=user_str)
        return unique_username_generator(instance,new_username=new_username)

    return username

Edit it and use your own method for generating username, in your models

def username_pre_save_receiver(sender, instance, *args, **kwargs):
    if not instance.username:
        instance.username = unique_username_generator(instance)

pre_save.connect(username_pre_save_receiver, sender=User)
Pankaj Sharma
  • 2,185
  • 2
  • 24
  • 50