Я пока сделал так, потомучто не нашел в исходниках как это более корректно поправить. Либо манкипатчить, либо ещё чего - все хуже чем текущее решение:
common/admin.py:
# coding: utf-8
from django.contrib.auth.models import User, Permission
from django.contrib.contenttypes.models import ContentType
from django.db import IntegrityError
…
try:
content_type = ContentType.objects.get(app_label=User._meta.app_label, model=User._meta.module_name)
Permission.objects.create(
name="Can change your password",
content_type=content_type,
codename="can_change_your_password")
except IntegrityError:
pass
common/middleware.py:
from django.core.exceptions import PermissionDenied
class AdminPasswordChangeOverrider(object):
def process_view(self, request, view_func, view_args, view_kwargs):
if (view_func.__module__, view_func.func_name) == ('django.contrib.admin.sites', 'password_change'):
if not request.user.has_perm('auth.can_change_your_password'):
raise PermissionDenied