diff --git a/mongoengine/django/auth.py b/mongoengine/django/auth.py index 0a309c4cd..80ca42a02 100644 --- a/mongoengine/django/auth.py +++ b/mongoengine/django/auth.py @@ -328,6 +328,17 @@ def has_perm(self, perm, obj=None): # Otherwise we need to check the backends. return _user_has_perm(self, perm, obj) + def has_perms(self, perm_list, obj=None): + """ + Returns True if the user has each of the specified permissions. If + object is passed, it checks if the user has all required perms for this + object. + """ + for perm in perm_list: + if not self.has_perm(perm, obj): + return False + return True + def has_module_perms(self, app_label): """ Returns True if the user has any permissions in the given app label. @@ -395,6 +406,8 @@ def authenticate(self, username=None, password=None): def get_user(self, user_id): return self.user_document.objects.with_id(user_id) + # TODO: needs the whole permissions logic + @property def user_document(self): if self._user_doc is False: @@ -402,6 +415,7 @@ def user_document(self): self._user_doc = get_user_document() return self._user_doc + def get_user(userid): """Returns a User object from an id (User.id). Django's equivalent takes request, but taking an id instead leaves it up to the developer to store diff --git a/mongoengine/django/mongo_auth/models.py b/mongoengine/django/mongo_auth/models.py index ad4ceff8d..77a584f03 100644 --- a/mongoengine/django/mongo_auth/models.py +++ b/mongoengine/django/mongo_auth/models.py @@ -1,7 +1,6 @@ from django.conf import settings from django.contrib.auth.hashers import make_password from django.contrib.auth.models import UserManager -from django.core.exceptions import ImproperlyConfigured from django.db import models try: from django.utils.module_loading import import_module @@ -79,7 +78,6 @@ def contribute_to_class(self, model, name): field = models.CharField(_(name), max_length=30) field.contribute_to_class(self.dj_model, name) - def get(self, *args, **kwargs): try: return self.get_query_set().get(*args, **kwargs) diff --git a/tests/test_django.py b/tests/test_django.py index cb7efe6f1..5202e56c5 100644 --- a/tests/test_django.py +++ b/tests/test_django.py @@ -28,7 +28,7 @@ try: from django.contrib.auth import authenticate, get_user_model - from mongoengine.django.auth import User + from mongoengine.django.auth import User, ContentType, Permission, Group from mongoengine.django.mongo_auth.models import ( MongoUser, MongoUserManager, @@ -37,6 +37,11 @@ DJ15 = True except Exception: DJ15 = False +try: + from django.test import modify_settings + DJ17 = True +except Exception: + DJ17 = False from mongoengine.django.sessions import SessionStore, MongoSession from mongoengine.django.tests import MongoTestCase from datetime import tzinfo, timedelta @@ -321,6 +326,82 @@ def test_authenticate(self): self.assertEqual(user.id, db_user.id) +class MongoAuthBackendTest(MongoTestCase): + user_data = { + 'username': 'user', + 'email': 'user@example.com', + 'password': 'test', + } + backend = 'mongoengine.django.auth.MongoEngineBackend' + + UserModel = MongoUser + + def create_users(self): + self.user = MongoUser.objects.create_user( + username='test', + email='test@example.com', + password='test', + ) + self.superuser = MongoUser.objects.create_superuser( + username='test2', + email='test2@example.com', + password='test', + ) + + def setUp(self): + if not DJ17: + raise SkipTest('mongo_auth backend tests require Django 1.7') + self.patched_settings = modify_settings( + AUTHENTICATION_BACKENDS={'append': self.backend}, + ) + self.patched_settings.enable() + connect(db='mongoenginetest') + User.drop_collection() + ContentType.drop_collection() + Permission.drop_collection() + self.create_users() + super(MongoAuthBackendTest, self).setUp() + + def tearDown(self): + self.patched_settings.disable() + ContentType.objects.clear_cache() + + def test_has_perm(self): + user = self.UserModel._default_manager.get(pk=self.user.pk) + self.assertEqual(user.has_perm('auth.test'), False) + + user.is_staff = True + user.save() + self.assertEqual(user.has_perm('auth.test'), False) + + user.is_superuser = True + user.save() + self.assertEqual(user.has_perm('auth.test'), True) + + user.is_staff = True + user.is_superuser = True + user.is_active = False + user.save() + self.assertEqual(user.has_perm('auth.test'), False) + + def test_custom_perms(self): + user = self.UserModel._default_manager.get(pk=self.user.pk) + content_type = ContentType(app_label='test', model='group').save() + perm = Permission(name='test', content_type=content_type, codename='test').save() + user.user_permissions.append(perm) + user.save() + + # reloading user to purge the _perm_cache + user = self.UserModel._default_manager.get(pk=self.user.pk) + raise SkipTest("Permission logic not implemented on Mongo Backend") + self.assertEqual(user.get_all_permissions() == set(['auth.test']), True) + self.assertEqual(user.get_group_permissions(), set()) + self.assertEqual(user.has_module_perms('Group'), False) + self.assertEqual(user.has_module_perms('auth'), True) + self.assertEqual(user.has_perm('auth.test'), True) + self.assertEqual(user.has_perms(['auth.test']), True) + + class MongoTestCaseTest(MongoTestCase): def test_mongo_test_case(self): self.db.dummy_collection.insert({'collection': 'will be dropped'})