Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions mongoengine/django/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -395,13 +406,16 @@ 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:
from .mongo_auth.models import get_user_document
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
Expand Down
2 changes: 0 additions & 2 deletions mongoengine/django/mongo_auth/models.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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)
Expand Down
83 changes: 82 additions & 1 deletion tests/test_django.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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'})
Expand Down