Opened 17 months ago
Closed 17 months ago
#35563 closed Cleanup/optimization (wontfix)
Fetch related user permissions if "user_permissions" are added in add_fieldsets on Admin Panel
| Reported by: | Ali Hassan | Owned by: | alihassanc5 | 
|---|---|---|---|
| Component: | contrib.auth | Version: | 5.0 | 
| Severity: | Normal | Keywords: | |
| Cc: | Ali Hassan | Triage Stage: | Unreviewed | 
| Has patch: | no | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description
So I created my custom UserAdmin which is inherited from Base UserAdmin class, I am using default Django model.
Python: 3.10.14
DB Engine: Postgres
I have added user_permissions in add_fieldsets:
add_fieldsets = (
        (
            None,
            {
                "classes": ("wide",),
                "fields": (
                    "first_name",
                    "last_name",
                    "email",
                    "password1",
                    "password2",
                    "is_active",
                    "is_staff",
                    "is_superuser",
                    "user_permissions",
                ),
            },
        ),
    )
 
user_permissions causing an issue because it's fetching all the related content-type in a separate query.
So, my proposed solutions is to fetch all the related permissions if it's in fieldset, same like we are doing in our UserChangeForm
class UserChangeForm(forms.ModelForm):
    password = ReadOnlyPasswordHashField(
        label=_("Password"),
        help_text=_(
            "Raw passwords are not stored, so there is no way to see this "
            "user’s password, but you can change the password using "
            '<a href="{}">this form</a>.'
        ),
    )
    class Meta:
        model = User
        fields = "__all__"
        field_classes = {"username": UsernameField}
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        password = self.fields.get("password")
        if password:
            password.help_text = password.help_text.format(
                f"../../{self.instance.pk}/password/"
            )
        user_permissions = self.fields.get("user_permissions")
        if user_permissions:
            user_permissions.queryset = user_permissions.queryset.select_related(
                "content_type"
            )
Could you please assign this issue to me? I will be happy to provide the solution, thanks!
Attachments (1)
Change History (3)
by , 17 months ago
| Attachment: | image-20240626-155934.png added | 
|---|
comment:1 by , 17 months ago
| Component: | contrib.admin → contrib.auth | 
|---|
comment:2 by , 17 months ago
| Resolution: | → wontfix | 
|---|---|
| Status: | assigned → closed | 
Hello Ali Hassan, thank you for your interest in making Django better!
I'm a little undecided about how to triage this issue, on one hand I can see value in what you are proposing, but on the other hand we need to be mindful of existing projects using/overriding
UserAdminand how a change like this may disrupt them.As far as I understand your description, you could definitely define your own prefetch for the
user_permissionsin your customUserAdmin. If that is indeed the case, it seems a very specific need arising from a niche use case, in which case I don't think this applies to the broader ecosystem.Given the above, I'll close the ticket accordingly, but if you disagree, you can consider starting a new conversation on the Django Forum, where you'll reach a wider audience and likely get extra feedback. More information in the documented guidelines for requesting features.