#20541: Differenciate user from superuser creation in django.contrib.auth at a
signal level
--------------------------------------+--------------------
     Reporter:  antonio@…             |      Owner:  nobody
         Type:  Cleanup/optimization  |     Status:  new
    Component:  contrib.auth          |    Version:  1.5
     Severity:  Normal                |   Keywords:
 Triage Stage:  Unreviewed            |  Has patch:  1
Easy pickings:  1                     |      UI/UX:  0
--------------------------------------+--------------------
 Hi all,

 Currently the steps to create a superuser
 (auth.models.User.create_superuser) are:

 1) Create user
 2) Save User
 3) Assign staff, active, superuser
 4) Save again

 When the first save happens the post_save signal is raised, but the user
 is not a superuser yet. The signal will get raised again after a few
 lines, which is wasteful. My proposal is to implement superuser creation
 like this:

 {{{
 class UserManager(BaseUserManager):

     def create_user(self, username, email=None, password=None, save=True,
 **extra_fields):
         """
         Creates and saves a User with the given username, email and
 password.
         """
         now = timezone.now()
         if not username:
             raise ValueError('The given username must be set')
         email = self.normalize_email(email)
         user = self.model(username=username, email=email,
                           is_staff=False, is_active=True,
 is_superuser=False,
                           last_login=now, date_joined=now, **extra_fields)

         user.set_password(password)
         if save:
                 user.save(using=self._db)
         return user

     def create_superuser(self, username, email, password, **extra_fields):
         u = self.create_user(username, email, password, save=False,
 **extra_fields)
         u.is_staff = True
         u.is_active = True
         u.is_superuser = True
         u.save(using=self._db)
         return u
 }}}

 Now when post_save is fired, one can check is_superuser, is_staff or
 is_active and take action based on that.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/20541>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.008a28ee57abbafb5f92f9ecb688535d%40djangoproject.com?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to