Пользовательская модель пользователя нарушает аутентификационные тесты - PullRequest
2 голосов
/ 27 марта 2011

Геккон там,

Я использую пользовательскую модель пользователя, которую я выбрал для вызова Member, которая расширяет модель пользователя по умолчанию (в значительной степени как описано здесь ).

Проблема в том, что это нарушает несколько тестов приложения auth, потому что тестовое устройство создает только стандартных пользователей , а не членов . Когда я добавляю отсутствующие member определений / строк в django / contrib / auth / fixtures / authtestdata.json, они запускаются снова, но это, конечно, не решение.

Это результат того, что я что-то сделал не так, и как мне лучше всего это исправить?

В качестве последнего средства я бы просто добавил патч для authtestdata.json в Buildout, но, возможно, есть более элегантное решение.

Большое спасибо,
Telofy

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

Обновление: пожалуйста, не обращайте внимания на мой пост ниже.Используйте исходную версию пользовательского бэкенда аутентификации и добавьте django.contrib.auth.backends.ModelBackend в качестве второго (резервного) бэкенда под пользовательский в AUTHENTICATION_BACKENDS в вашем settings.py.Он имеет тот же эффект и намного проще.

Теперь я избавился от патча и вместо этого расширил настраиваемый бэкэнд аутентификации , с которым я связался в своем вопросе, чтобы прибегнуть к методам исходного бэкенда аутентификации, если пользователя не удается найтитаблица участника (мой пользовательский пользователь).Если это происходит, выдается предупреждение (которое может немного раздражать при запуске тестов).Кроме того, тесты сообщений вызывают много исключений, но, похоже, они не оказывают никакого негативного влияния на тесты.Я надеюсь, что они намеренные.^^

# -*- encoding: utf-8 -*-
import logging
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model

logger = logging.getLogger(__name__)

# http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
class CustomUserModelBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = self.user_class.objects.get(username=username)
            if user.check_password(password):
                return user
        except self.user_class.DoesNotExist:
            user = super(CustomUserModelBackend, self).authenticate(username, password)
            if user:
                logger.warn("Using User, not Member: %s" % user)
            return user

    def get_user(self, user_id):
        try:
            return self.user_class.objects.get(pk=user_id)
        except self.user_class.DoesNotExist:
            user = super(CustomUserModelBackend, self).get_user(user_id)
            if user:
                logger.warn("Using User, not Member: %s" % user)
            return user

    @property
    def user_class(self):
        if not hasattr(self, '_user_class'):
            self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
            if not self._user_class:
                raise ImproperlyConfigured('Could not get custom user model')
        return self._user_class
1 голос
/ 27 марта 2011

Вы можете получить некоторую радость от установки параметра AUTH_USER_PROFILE в settings.py согласно http://docs.djangoproject.com/en/1.2/topics/auth/#storing-additional-information-about-users. Это отличный способ расширения стандартной пользовательской модели так, чтобы Django мог работать с ней.

...