From 16e873e32b73c286ebdd4fd0050dc9229f2809a8 Mon Sep 17 00:00:00 2001 From: Joseph Kocherhans Date: Thu, 9 Nov 2006 16:45:11 +0000 Subject: [PATCH] [generic-auth] Added an extensible function for filtering querysets based on permission into the tests. This should be moved out into the actual codebase at some point. Note that it's far from complete. git-svn-id: http://code.djangoproject.com/svn/django/branches/generic-auth@4057 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/regressiontests/generic_auth/models.py | 2 +- tests/regressiontests/generic_auth/tests.py | 66 +++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/tests/regressiontests/generic_auth/models.py b/tests/regressiontests/generic_auth/models.py index 6525e64375..ac45afd299 100644 --- a/tests/regressiontests/generic_auth/models.py +++ b/tests/regressiontests/generic_auth/models.py @@ -5,6 +5,6 @@ class Person(models.Model): name = models.CharField(maxlength=20) class Article(models.Model): - name = models.CharField(maxlength=100) + title = models.CharField(maxlength=100) body = models.TextField() creator = models.ForeignKey(User) diff --git a/tests/regressiontests/generic_auth/tests.py b/tests/regressiontests/generic_auth/tests.py index e600258746..ab67a62252 100644 --- a/tests/regressiontests/generic_auth/tests.py +++ b/tests/regressiontests/generic_auth/tests.py @@ -105,7 +105,7 @@ appropriate models (in this case User, Permision, and Article). Create an Article for our tests, and set it's `owner` attribute to the user we created above. ->>> article = Article(name='test', body='test', creator=user) +>>> article = Article(title='test', body='test', creator=user) >>> article.save() @@ -142,4 +142,68 @@ Make sure it worked. True + +QuerySet Filtering by Permissions +--------------------------------- + +Checking permissions on a single object only solves half of the problem. We +also need a way to get a list of objects for which a user has a given permission. + +This is implemented as a function for now, but it might be more desirable to +be a method of QuerySet. We'll just to use plain old functions to start with, +then we'll test the extensible function version. + +>>> def owner_filter(user, permission, queryset): +... return queryset.filter(creator=user) +... + +>>> user_2 = User.objects.create_user('user 2', 'test@example.com', 'password') +>>> user_2.save() + +>>> article_1 = Article(title='article 1', body='article 1', creator=user_2) +>>> article_1.save() +>>> article_2 = Article(title='article 2', body='article 2', creator=user) +>>> article_2.save() +>>> article_3 = Article(title='article 3', body='article 3', creator=user) +>>> article_3.save() + +>>> qs = owner_filter(user, change_permission, Article.objects.all()) +>>> qs.count() +3 +>>> [a.title for a in qs] +['test', 'article 2', 'article 3'] + + +QuerySetFilter is a craptacular name... let's change that. + +>>> class QuerySetFilter(object): +... def __init__(self): +... self.registry = {} +... +... def __call__(self, user, permission, queryset): +... types = (type(user), type(permission), queryset.model) +... #print "Looking up types: " + types.__repr__() +... func = self.registry.get(types) +... if func: +... return func(user, permission, queryset) +... else: +... return queryset +... +... def register(self, func, user_type, permission_type, qs_model_type): +... types = (user_type, permission_type, qs_model_type) +... #print "Registering types: " + types.__repr__() +... self.registry[types] = func +... + +Now try the same stuff using the extensible function. + +>>> qs_filter = QuerySetFilter() +>>> qs_filter.register(owner_filter, User, Permission, Article) + +>>> qs = qs_filter(user, change_permission, Article.objects.all()) +>>> qs.count() +3 +>>> [a.title for a in qs] +['test', 'article 2', 'article 3'] + """