Opened 9 years ago

Closed 9 years ago

Last modified 9 years ago

#25890 closed Cleanup/optimization (invalid)

AUTH_USER_MODEL unfriendly to custom models with more than one level of encapsulation

Reported by: Junhua LIU Owned by: nobody
Component: contrib.auth Version: 1.9
Severity: Normal Keywords: AUTH_USER_MODEL
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

In db/models/utils.py, when model is a string, it's handled by the following:

app_label, model_name = model.split(".")

In the event if AUTH_USER_MODEL has more than a level of encapsulation (e.g. "apps/authn/CustomUser"), it throws a ValueError: too many values to unpack.

Suggested fix:

def make_model_tuple(model):
    """
    Takes a model or a string of the form "app_label.ModelName" and returns a
    corresponding ("app_label", "modelname") tuple. If a tuple is passed in,
    it's assumed to be a valid model tuple already and returned unchanged.
    """
    if isinstance(model, tuple):
        model_tuple = model
    elif isinstance(model, six.string_types):
        strings = model.split(".")
        app_label = ".".join(strings[:-1])
        model_name = strings[-1]
        # app_label, model_name = model.split(".")
        model_tuple = app_label, model_name.lower()
    else:
        model_tuple = model._meta.app_label, model._meta.model_name
    assert len(model_tuple) == 2, "Invalid model representation: %s" % model
    return model_tuple

Change History (3)

comment:1 by Aymeric Augustin, 9 years ago

Resolution: invalid
Status: newclosed

An application label cannot contain periods.

For instance the User model of the django.contrib.auth app is located at django.contrib.auth.models.User. The application's name is django.contrib.auth and its label is auth. The default value of AUTH_USER_MODEL is auth.User.

in reply to:  1 comment:2 by Junhua LIU, 9 years ago

How about a custom User Model that implement AbstractBaseUser, and is located at apps/authn/CustomUser?

Replying to aaugustin:

An application label cannot contain periods.

For instance the User model of the django.contrib.auth app is located at django.contrib.auth.models.User. The application's name is django.contrib.auth and its label is auth. The default value of AUTH_USER_MODEL is auth.User.

comment:3 by Aymeric Augustin, 9 years ago

I have no idea what apps/authn/CustomUser means. If your file doesn't have at least a .py extension nothing's going to work.

Note: See TracTickets for help on using tickets.
Back to Top