[Django] #29019: Superuser creation for custom user model fails with required ManyToMany field

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[Django] #29019: Superuser creation for custom user model fails with required ManyToMany field

Django
#29019: Superuser creation for custom user model fails with required ManyToMany
field
----------------------------------------+-----------------------------
               Reporter:  James Kirsop  |          Owner:  nobody
                   Type:  Bug           |         Status:  new
              Component:  contrib.auth  |        Version:  2.0
               Severity:  Normal        |       Keywords:  user custom
           Triage Stage:  Unreviewed    |      Has patch:  0
    Needs documentation:  0             |    Needs tests:  0
Patch needs improvement:  0             |  Easy pickings:  0
                  UI/UX:  0             |
----------------------------------------+-----------------------------
 I've defined a custom user model with a ManyToMany field.

 When running `manage.py createsuperuser` I receive the following error
 after entering the user's email address:

 {{{
 Traceback (most recent call last):
   File "./manage.py", line 22, in <module>
     execute_from_command_line(sys.argv)
   File "/Users/jkirsop/Development/artemis/venv/lib/python3.6/site-
 packages/django/core/management/__init__.py", line 371, in
 execute_from_command_line
     utility.execute()
   File "/Users/jkirsop/Development/artemis/venv/lib/python3.6/site-
 packages/django/core/management/__init__.py", line 365, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/Users/jkirsop/Development/artemis/venv/lib/python3.6/site-
 packages/django/core/management/base.py", line 288, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/Users/jkirsop/Development/artemis/venv/lib/python3.6/site-
 packages/django/contrib/auth/management/commands/createsuperuser.py", line
 59, in execute
     return super().execute(*args, **options)
   File "/Users/jkirsop/Development/artemis/venv/lib/python3.6/site-
 packages/django/core/management/base.py", line 335, in execute
     output = self.handle(*args, **options)
   File "/Users/jkirsop/Development/artemis/venv/lib/python3.6/site-
 packages/django/contrib/auth/management/commands/createsuperuser.py", line
 133, in handle
     ) if field.remote_field else '',
 AttributeError: 'ManyToManyRel' object has no attribute 'field_name'
 }}}

 **Models**
 My custom user model is defined as such (relevant pieces only included):
 {{{
 class OrgUser(AbstractBaseUser, PermissionsMixin):
         email = models.EmailField(
                 verbose_name='email address',
                 max_length=255,
                 unique=True,
         )
         orgs = models.ManyToManyField(Organisation)
         USERNAME_FIELD = 'email'
         REQUIRED_FIELDS = ['orgs']
         objects = OrgUserManager()
 }}}

 and Organisations
 {{{
 class Organisation(models.Model):
         name = models.CharField(max_length=60)

         def __str__(self):
                 return self.name
 }}}

 It seems that if I remove the need for the Orgs to be a `REQUIRED_FIELD`
 the issue goes away. However, it's central to my project and needs to be
 defined on every user.

 Happy to update the ticket with any other code snippets if required.

--
Ticket URL: <https://code.djangoproject.com/ticket/29019>
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 [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/054.a905898107b3fb1c61eaac5a7f66ceec%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS (was: Superuser creation for custom user model fails with required ManyToMany field)

Django
#29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS
------------------------------+------------------------------------
     Reporter:  James Kirsop  |                    Owner:  nobody
         Type:  Bug           |                   Status:  new
    Component:  contrib.auth  |                  Version:  2.0
     Severity:  Normal        |               Resolution:
     Keywords:  user custom   |             Triage Stage:  Accepted
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+------------------------------------
Changes (by Tim Graham):

 * stage:  Unreviewed => Accepted


--
Ticket URL: <https://code.djangoproject.com/ticket/29019#comment:1>
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 [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/069.41679586c93b5fa2ca0389b2d5909f66%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS

Django
In reply to this post by Django
#29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS
------------------------------+------------------------------------
     Reporter:  James Kirsop  |                    Owner:  nobody
         Type:  Bug           |                   Status:  new
    Component:  contrib.auth  |                  Version:  2.0
     Severity:  Normal        |               Resolution:
     Keywords:  user custom   |             Triage Stage:  Accepted
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+------------------------------------

Comment (by Sergey Yurchenko):

 REQUIRED_FIELDS is field special for createsuperuser command.
 [https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#django.contrib.auth.models.CustomUser.REQUIRED_FIELDS]

 In your forms or API this field would be still required if you remove it
 from REQUIRED_FIELDS
 I don`t think there is a good way to set m2m fields during creation if
 superuser

--
Ticket URL: <https://code.djangoproject.com/ticket/29019#comment:2>
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 [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/069.390f7356c87f0bd34a87e9314871f6f0%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS

Django
In reply to this post by Django
#29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS
------------------------------+------------------------------------
     Reporter:  James Kirsop  |                    Owner:  nobody
         Type:  Bug           |                   Status:  new
    Component:  contrib.auth  |                  Version:  2.0
     Severity:  Normal        |               Resolution:
     Keywords:  user custom   |             Triage Stage:  Accepted
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+------------------------------------

Comment (by Tim Graham):

 Similar to foreign keys, ids could be accepted for ManyToManyFields. In
 the case of a through model, a helpful error message could be displayed
 indicating that it's not supported. In any case, Django shouldn't crash
 without a helpful message.

--
Ticket URL: <https://code.djangoproject.com/ticket/29019#comment:3>
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 [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/069.a5106c2a2ec2748d78704b5e87f24c20%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS

Django
In reply to this post by Django
#29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS
------------------------------+-------------------------------------------
     Reporter:  James Kirsop  |                    Owner:  Williams Mendez
         Type:  Bug           |                   Status:  assigned
    Component:  contrib.auth  |                  Version:  2.0
     Severity:  Normal        |               Resolution:
     Keywords:  user custom   |             Triage Stage:  Accepted
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+-------------------------------------------
Changes (by Williams Mendez):

 * owner:  nobody => Williams Mendez
 * status:  new => assigned


--
Ticket URL: <https://code.djangoproject.com/ticket/29019#comment:4>
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 [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/069.1e0a8a776d813012a65da6aeca6d3777%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [Django] #29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS

Django
In reply to this post by Django
#29019: createsuperuser crashes if a ManyToManyField is in REQUIRED_FIELDS
------------------------------+-------------------------------------------
     Reporter:  James Kirsop  |                    Owner:  Williams Mendez
         Type:  Bug           |                   Status:  assigned
    Component:  contrib.auth  |                  Version:  2.0
     Severity:  Normal        |               Resolution:
     Keywords:  user custom   |             Triage Stage:  Accepted
    Has patch:  0             |      Needs documentation:  0
  Needs tests:  0             |  Patch needs improvement:  0
Easy pickings:  0             |                    UI/UX:  0
------------------------------+-------------------------------------------

Comment (by Lenno Nagel):

 Hi!

 We explored a couple of ideas regarding this during DjangoCon Europe 2018.

 The aspect that blocks implementation is the create_superuser function in
 the default UserManager class that has no support for M2M field data
 present in **kwargs. Such data would have to be extracted from kwargs and
 handled after the user.save(..) call, however we did not feel comfortable
 with proposing code for this solution without prior discussion.

 It was found that it is perhaps best simply to warn the user whenever M2M
 fields have been added to REQUIRED_FIELDS and suggest that in this case, a
 custom user manager must also be written that handles the data properly.
 We could not find a safe way to detect whether the default manager has
 been overridden or whether it would handle the M2M field in the
 create_superuser function, so this warning has to be marked as ignored
 manually by the user.

 A proposed solution:
 https://github.com/django/django/pull/9990

 Regards,
 Lenno

--
Ticket URL: <https://code.djangoproject.com/ticket/29019#comment:5>
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 [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/069.705b596dd7b4350ad47e8fd21b6f8a44%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.