﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
32236	LoginRequiredMixin and PermissionRequiredMixin could use UserPassesTestMixin	Jaap Roes	Jerin Peter George	"Currently [https://github.com/django/django/blob/cc7c16af98e4c9a7146c248c8567aac7a50e0fbb/django/contrib/auth/mixins.py django.contrib.auth.mixins] defines `LoginRequiredMixin` and `PermissionRequiredMixin` as subclasses of `AccessMixin`.

It also defines an abstract `UserPassesTestMixin` that requires an implementation of `test_func` (or `get_test_func`). 
Both `LoginRequiredMixin` and `PermissionRequiredMixin` perform tests on the current user and could be implemented subclasses of `UserPassesTestMixin` with an implementation of  `test_func` (or `get_test_func`). That way they can re-use the dispatch logic in `UserPassesTestMixin`.

i.e.:
{{{
class LoginRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_authenticated


class PermissionRequiredMixin(UserPassesTestMixin):
    """"""Verify that the current user has all specified permissions.""""""
    permission_required = None

    def get_permission_required(self):
        """"""
        Override this method to override the permission_required attribute.
        Must return an iterable.
        """"""
        if self.permission_required is None:
            raise ImproperlyConfigured(
                '{0} is missing the permission_required attribute. Define {0}.permission_required, or override '
                '{0}.get_permission_required().'.format(self.__class__.__name__)
            )
        if isinstance(self.permission_required, str):
            perms = (self.permission_required,)
        else:
            perms = self.permission_required
        return perms

    def has_permission(self):
        """"""
        Override this method to customize the way permissions are checked.
        """"""
        perms = self.get_permission_required()
        return self.request.user.has_perms(perms)

    def get_test_func(self):
        return self.has_permission
}}}"	Cleanup/optimization	closed	contrib.auth	dev	Normal	wontfix			Accepted	0	0	0	0	1	0
