[Python-modules-commits] [django-guardian] 01/14: Import django-guardian_1.3.2.orig.tar.gz
Brian May
bam at moszumanska.debian.org
Sat Nov 14 03:27:17 UTC 2015
This is an automated email from the git hooks/post-receive script.
bam pushed a commit to branch master
in repository django-guardian.
commit 5f8470ff0f7419b67905b358555e1777f072f409
Author: Brian May <bam at debian.org>
Date: Sat Nov 14 13:28:03 2015 +1100
Import django-guardian_1.3.2.orig.tar.gz
---
.travis.yml | 31 ++--
CHANGES | 17 +++
README.rst | 27 ++--
docs/develop/supported-versions.rst | 21 +--
docs/userguide/assign.rst | 2 +-
example_project/settings.py | 5 +-
guardian/__init__.py | 2 +-
guardian/admin.py | 35 +++--
guardian/compat.py | 17 ++-
guardian/decorators.py | 9 +-
guardian/locale/ru/LC_MESSAGES/django.mo | Bin 0 -> 2205 bytes
guardian/locale/ru/LC_MESSAGES/django.po | 157 +++++++++++++++++++++
guardian/management/__init__.py | 34 +++--
guardian/shortcuts.py | 44 +++---
.../contrib/grappelli/obj_perms_manage.html | 2 +-
.../admin/guardian/model/obj_perms_manage.html | 1 -
.../admin/guardian/model/obj_perms_no.html | 4 +-
.../admin/guardian/model/obj_perms_yes.html | 4 +-
guardian/templatetags/guardian_tags.py | 44 ------
.../testapp/migrations/0004_auto_20151112_2209.py | 36 +++++
guardian/testapp/models.py | 8 +-
guardian/testapp/tests/__init__.py | 36 ++---
guardian/testapp/tests/conf.py | 9 --
.../testapp/tests/{admin_test.py => test_admin.py} | 8 +-
.../testapp/tests/{conf_test.py => test_conf.py} | 0
.../testapp/tests/{core_test.py => test_core.py} | 0
...custompkmodel_test.py => test_custompkmodel.py} | 0
.../{decorators_test.py => test_decorators.py} | 0
.../{direct_rel_test.py => test_direct_rel.py} | 0
.../testapp/tests/{forms_test.py => test_forms.py} | 0
.../{management_test.py => test_management.py} | 13 +-
.../tests/{managers_test.py => test_managers.py} | 0
.../tests/{mixins_test.py => test_mixins.py} | 0
.../tests/{orphans_test.py => test_orphans.py} | 0
.../testapp/tests/{other_test.py => test_other.py} | 4 +-
.../tests/{shortcuts_test.py => test_shortcuts.py} | 26 +++-
.../testapp/tests/{tags_test.py => test_tags.py} | 0
.../testapp/tests/{utils_test.py => test_utils.py} | 2 +-
guardian/testsettings.py | 7 +-
guardian/utils.py | 6 +-
setup.py | 6 +-
tests.py | 5 +-
tox.ini | 86 ++++-------
43 files changed, 438 insertions(+), 270 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index b7b81be..1dd41bc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,23 +1,20 @@
language: python
sudo: false
python:
- - 2.6
- 2.7
- 3.3
- 3.4
+ - 3.5
env:
- - DJANGO_VERSION=1.2.7
- - DJANGO_VERSION=1.3.7
- - DJANGO_VERSION=1.4.19
- DJANGO_VERSION=1.5.12
- - DJANGO_VERSION=1.6.10
- - DJANGO_VERSION=1.7.4
+ - DJANGO_VERSION=1.6.11
+ - DJANGO_VERSION=1.7.10
- DJANGO_VERSION=1.8
+ - DJANGO_VERSION=1.9b1
install:
- travis_retry pip install -q mock==1.0.1 Django==$DJANGO_VERSION coverage coveralls
- - travis_retry pip install --use-mirrors
script:
- coverage run --source=guardian setup.py test
@@ -33,16 +30,10 @@ notifications:
matrix:
exclude:
- python: 3.3
- env: DJANGO_VERSION=1.2.7
- - python: 3.3
- env: DJANGO_VERSION=1.3.7
- - python: 3.3
- env: DJANGO_VERSION=1.4.19
- - python: 3.4
- env: DJANGO_VERSION=1.2.7
- - python: 3.4
- env: DJANGO_VERSION=1.3.7
- - python: 3.4
- env: DJANGO_VERSION=1.4.19
- - python: 2.6
- - env: DJANGO_VERSION=1.7.4
+ env: DJANGO_VERSION=1.9b1
+ - python: 3.5
+ env: DJANGO_VERSION=1.5.12
+ - python: 3.5
+ env: DJANGO_VERSION=1.6.11
+ - python: 3.5
+ env: DJANGO_VERSION=1.7.10
diff --git a/CHANGES b/CHANGES
index 2a6bfb2..0035158 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,20 @@
+Release 1.3.2 (Nov 14, 2015)
+============================
+
+* Fixes tests for all versions of Django.
+* Tests pass for Django 1.9b1.
+* Drops support for Django < 1.5
+* Add Russian translation.
+* Various bug fixes.
+* Ensure password for anonymous user is set to unusable, not None.
+
+
+Release 1.3.1 (Oct 20, 2015)
+============================
+
+* Fixes for 1.8 compat
+
+
Release 1.3 (Jun 3, 2015)
=========================
diff --git a/README.rst b/README.rst
index 1c86c4c..b8ba0e6 100644
--- a/README.rst
+++ b/README.rst
@@ -2,21 +2,11 @@
django-guardian
===============
-.. image:: https://secure.travis-ci.org/lukaszb/django-guardian.png?branch=master
- :target: http://travis-ci.org/lukaszb/django-guardian
-
-.. image:: https://coveralls.io/repos/lukaszb/django-guardian/badge.png?branch=master
- :target: https://coveralls.io/r/lukaszb/django-guardian/
-
-.. image:: https://pypip.in/v/django-guardian/badge.png
- :target: https://crate.io/packages/django-guardian/
-
-.. image:: https://pypip.in/d/django-guardian/badge.png
- :target: https://crate.io/packages/django-guardian/
-
+.. image:: https://travis-ci.org/django-guardian/django-guardian.svg?branch=devel
+ :target: https://travis-ci.org/django-guardian/django-guardian
``django-guardian`` is implementation of per object permissions [1]_ as
-authorization backend which is supported since Django_ 1.2. It won't
+authorization backend which is supported since Django_ 1.5. It won't
work with older Django_ releases.
Documentation
@@ -43,18 +33,21 @@ We need to hook ``django-guardian`` into our project.
'guardian',
)
-2. Add extra authorization backend::
+2. Add extra authorization backend to your `settings.py`::
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend', # default
'guardian.backends.ObjectPermissionBackend',
)
-3. Configure anonymous user ID ::
+3. Configure anonymous user ID in your `settings.py`::
ANONYMOUS_USER_ID = -1
-
+4. Create ``guardian`` database tables by running::
+
+ python manage.py migrate
+
Usage
-----
@@ -63,10 +56,12 @@ with Django_.
Lets start really quickly::
+ >>> from django.contrib.auth.models import User, Group
>>> jack = User.objects.create_user('jack', 'jack at example.com', 'topsecretagentjack')
>>> admins = Group.objects.create(name='admins')
>>> jack.has_perm('change_group', admins)
False
+ >>> from guardian.models import UserObjectPermission
>>> UserObjectPermission.objects.assign_perm('change_group', user=jack, obj=admins)
<UserObjectPermission: admins | jack | change_group>
>>> jack.has_perm('change_group', admins)
diff --git a/docs/develop/supported-versions.rst b/docs/develop/supported-versions.rst
index 46fbf67..f6d67b0 100644
--- a/docs/develop/supported-versions.rst
+++ b/docs/develop/supported-versions.rst
@@ -3,22 +3,13 @@
Supported versions
==================
-``django-guardian`` supports Python 2.6+/3.3+ and Django 1.3+. Also, we support
-``django-grappelli`` 2.3.5.
-
-.. note::
- ``django-grappelli`` support was an experiment. We are not going to maintain
- this support starting with version 1.2. It means that since v1.2 grappelli
- parts within guardian would be deprecated. And removed before next big
- release (which most probably would be 2.0).
+``django-guardian`` supports Python 2.7+/3.3+ and Django 1.5+.
Rules
-----
-* We would support Python 2.7 and Python 2.6 (until Django drops support for
- 2.6). Since Django 1.5 we also support Python 3.3+.
-* We support Django 1.3+, however next big ``guardian`` release (v2.0) we would
- support Django 1.6+ (or higher, depending on the date guardian v2.0 would be
- released). This is due to many simplifications in code we could do. There is
- also a chance that v2.0 would drop support for Python 2.X.
-
+* We would support Python 2.7. We also support Python 3.3+.
+* Support for Python 3.3 may get dropped in the future.
+* We support Django 1.5+, however next big ``guardian`` release (v2.0) we would
+ support Django 1.7+ (or higher, depending on the date guardian v2.0 would be
+ released). This is due to many simplifications in code we could do.
diff --git a/docs/userguide/assign.rst b/docs/userguide/assign.rst
index 551b7d6..1a50f25 100644
--- a/docs/userguide/assign.rst
+++ b/docs/userguide/assign.rst
@@ -48,7 +48,7 @@ permissions.
- *delete_modelname*
(where *modelname* is a simplified name of our model's class). See
- http://docs.djangoproject.com/en/1.2/topics/auth/#default-permissions for
+ https://docs.djangoproject.com/en/dev/topics/auth/default/#default-permissions for
more detail.
There is nothing new here since creation of permissions is
diff --git a/example_project/settings.py b/example_project/settings.py
index 02291df..e4a230a 100644
--- a/example_project/settings.py
+++ b/example_project/settings.py
@@ -38,11 +38,8 @@ INSTALLED_APPS = (
'posts',
'core',
'integration_tests',
+ 'django.contrib.staticfiles',
)
-if django.VERSION < (1, 3):
- INSTALLED_APPS += ('staticfiles',)
-else:
- INSTALLED_APPS += ('django.contrib.staticfiles',)
if 'GUARDIAN_NO_TESTS_APP' in os.environ:
_apps = list(INSTALLED_APPS)
diff --git a/guardian/__init__.py b/guardian/__init__.py
index 0d8d71e..f6467dc 100644
--- a/guardian/__init__.py
+++ b/guardian/__init__.py
@@ -3,7 +3,7 @@ Implementation of per object permissions for Django 1.2 or later.
"""
from __future__ import unicode_literals
-VERSION = (1, 3)
+VERSION = (1, 3, 2)
__version__ = '.'.join((str(each) for each in VERSION[:4]))
diff --git a/guardian/admin.py b/guardian/admin.py
index 5c83454..9be0f9e 100644
--- a/guardian/admin.py
+++ b/guardian/admin.py
@@ -10,10 +10,9 @@ from django.contrib.admin.widgets import FilteredSelectMultiple
from django.core.urlresolvers import reverse
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.template import RequestContext
-from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext, ugettext_lazy as _
-from guardian.compat import get_user_model, get_model_name
+from guardian.compat import OrderedDict, get_user_model, get_model_name
from guardian.forms import UserObjectPermissionsForm
from guardian.forms import GroupObjectPermissionsForm
from guardian.shortcuts import get_perms
@@ -148,16 +147,26 @@ class GuardedModelAdminMixin(object):
shown. In order to add or manage user or group one should use links or
forms presented within the page.
"""
- obj = get_object_or_404(self.queryset(request), pk=object_pk)
- users_perms = SortedDict(
- get_users_with_perms(obj, attach_perms=True,
- with_group_users=False))
+ try:
+ # django >= 1.7
+ from django.contrib.admin.utils import unquote
+ except ImportError:
+ # django < 1.7
+ from django.contrib.admin.util import unquote
+ obj = get_object_or_404(self.get_queryset(request), pk=unquote(object_pk))
+ users_perms = OrderedDict(
+ sorted(
+ get_users_with_perms(obj, attach_perms=True, with_group_users=False).items(),
+ key=lambda user: getattr(user[0], get_user_model().USERNAME_FIELD)
+ )
+ )
- users_perms.keyOrder.sort(key=lambda user:
- getattr(user, get_user_model().USERNAME_FIELD))
- groups_perms = SortedDict(
- get_groups_with_perms(obj, attach_perms=True))
- groups_perms.keyOrder.sort(key=lambda group: group.name)
+ groups_perms = OrderedDict(
+ sorted(
+ get_groups_with_perms(obj, attach_perms=True).items(),
+ key=lambda group: group[0].name
+ )
+ )
if request.method == 'POST' and 'submit_manage_user' in request.POST:
user_form = UserManage(request.POST)
@@ -221,7 +230,7 @@ class GuardedModelAdminMixin(object):
Manages selected users' permissions for current object.
"""
user = get_object_or_404(get_user_model(), pk=user_id)
- obj = get_object_or_404(self.queryset(request), pk=object_pk)
+ obj = get_object_or_404(self.get_queryset(request), pk=object_pk)
form_class = self.get_obj_perms_manage_user_form()
form = form_class(user, obj, request.POST or None)
@@ -274,7 +283,7 @@ class GuardedModelAdminMixin(object):
Manages selected groups' permissions for current object.
"""
group = get_object_or_404(Group, id=group_id)
- obj = get_object_or_404(self.queryset(request), pk=object_pk)
+ obj = get_object_or_404(self.get_queryset(request), pk=object_pk)
form_class = self.get_obj_perms_manage_group_form()
form = form_class(group, obj, request.POST or None)
diff --git a/guardian/compat.py b/guardian/compat.py
index 387903f..4376c4f 100644
--- a/guardian/compat.py
+++ b/guardian/compat.py
@@ -78,7 +78,11 @@ def get_user_permission_full_codename(perm):
``myapp.CustomUser`` is used it would return ``myapp.change_customuser``.
"""
User = get_user_model()
- return '%s.%s_%s' % (User._meta.app_label, perm, User._meta.module_name)
+ if django.VERSION < (1, 7):
+ model_name = User._meta.module_name
+ else:
+ model_name = User._meta.model_name
+ return '%s.%s_%s' % (User._meta.app_label, perm, model_name)
def get_user_permission_codename(perm):
"""
@@ -120,6 +124,17 @@ try:
except NameError:
basestring = unicode = str = str
+
+# OrderedDict only available in Python 2.7.
+# This will always be the case in Django 1.7 and above, as these versions
+# no longer support Python 2.6.
+# For Django <= 1.6 and Python 2.6 fall back to SortedDict.
+try:
+ from collections import OrderedDict
+except ImportError:
+ from django.utils.datastructures import SortedDict as OrderedDict
+
+
# Django 1.7 compatibility
# create_permission API changed: skip the create_models (second
# positional argument) if we have django 1.7+ and 2+ positional
diff --git a/guardian/decorators.py b/guardian/decorators.py
index 31ad6c9..909aad6 100644
--- a/guardian/decorators.py
+++ b/guardian/decorators.py
@@ -3,7 +3,14 @@ from __future__ import unicode_literals
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.utils.functional import wraps
-from django.db.models import Model, get_model
+from django.db.models import Model
+try:
+ # django >= 1.7
+ from django.apps import apps
+ get_model = apps.get_model
+except ImportError:
+ # django < 1.7
+ from django.db.models import get_model
from django.db.models.base import ModelBase
from django.db.models.query import QuerySet
from django.shortcuts import get_object_or_404
diff --git a/guardian/locale/ru/LC_MESSAGES/django.mo b/guardian/locale/ru/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..b7bd052
Binary files /dev/null and b/guardian/locale/ru/LC_MESSAGES/django.mo differ
diff --git a/guardian/locale/ru/LC_MESSAGES/django.po b/guardian/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8b81fef
--- /dev/null
+++ b/guardian/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,157 @@
+# Polish translation of django-guardian.
+# This file is distributed under the same license as django-guardian's package.
+# Translator: Tomasz Wsuł <2nickers at gmail.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django-guardian 1.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-12-29 00:14+0100\n"
+"PO-Revision-Date: 2013-12-29 17:29-0600\n"
+"Last-Translator: <2nickers at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Translated-Using: django-rosetta 0.7.3\n"
+
+#: admin.py:32 admin.py:42 forms.py:55
+msgid "Permissions"
+msgstr "Права"
+
+#: admin.py:189
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:12
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:14
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:25
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:14
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:25
+#: templates/admin/guardian/model/change_form.html:5
+#: templates/admin/guardian/model/obj_perms_manage.html:17
+#: templates/admin/guardian/model/obj_perms_manage_group.html:14
+#: templates/admin/guardian/model/obj_perms_manage_group.html:25
+#: templates/admin/guardian/model/obj_perms_manage_user.html:14
+#: templates/admin/guardian/model/obj_perms_manage_user.html:25
+msgid "Object permissions"
+msgstr "Права на объект"
+
+#: admin.py:278 admin.py:331
+msgid "Permissions saved."
+msgstr "Права сохранены."
+
+#: admin.py:375
+msgid "Username"
+msgstr "Имя пользователя"
+
+#: admin.py:378
+msgid "This value may contain only letters, numbers and @/./+/-/_ characters."
+msgstr "Это значение должно содержать буквы, цифры и символы @/./+/-/_"
+
+#: admin.py:380
+msgid "This user does not exist"
+msgstr "Этот пользователь не существует"
+
+#: admin.py:397
+msgid "This group does not exist"
+msgstr "Эта группа не существует"
+
+#: models.py:46
+msgid "object ID"
+msgstr "ID объекта"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:8
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:10
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:10
+#: templates/admin/guardian/model/obj_perms_manage.html:13
+#: templates/admin/guardian/model/obj_perms_manage_group.html:10
+#: templates/admin/guardian/model/obj_perms_manage_user.html:10
+msgid "Home"
+msgstr "Домой"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:21
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:82
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Исправьте ошибку ниже."
+msgstr[1] "Исправьте ошибки ниже."
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:25
+#: templates/admin/guardian/model/obj_perms_manage.html:32
+msgid "Users"
+msgstr "Пользователи"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:28
+#: templates/admin/guardian/model/obj_perms_manage.html:38
+msgid "User permissions"
+msgstr "Права пользователя"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:33
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:34
+#: templates/admin/guardian/model/obj_perms_manage.html:41
+#: templates/admin/guardian/model/obj_perms_manage_user.html:30
+msgid "User"
+msgstr "Пользователь"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:37
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:98
+#: templates/admin/guardian/model/obj_perms_manage.html:45
+#: templates/admin/guardian/model/obj_perms_manage.html:99
+msgid "Action"
+msgstr "Действие"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:54
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:115
+#: templates/admin/guardian/model/obj_perms_manage.html:62
+#: templates/admin/guardian/model/obj_perms_manage.html:116
+msgid "Edit"
+msgstr "Редактировать"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:70
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:15
+#: templates/admin/guardian/model/obj_perms_manage.html:73
+#: templates/admin/guardian/model/obj_perms_manage_user.html:15
+msgid "Manage user"
+msgstr "Управление пользователем"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:86
+#: templates/admin/guardian/model/obj_perms_manage.html:86
+msgid "Groups"
+msgstr "Группы"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:89
+#: templates/admin/guardian/model/obj_perms_manage.html:92
+msgid "Group permissions"
+msgstr "Групповые права"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:94
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:34
+#: templates/admin/guardian/model/obj_perms_manage.html:95
+#: templates/admin/guardian/model/obj_perms_manage_group.html:30
+msgid "Group"
+msgstr "Группа"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage.html:132
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:15
+#: templates/admin/guardian/model/obj_perms_manage.html:127
+#: templates/admin/guardian/model/obj_perms_manage_group.html:15
+msgid "Manage group"
+msgstr "Управление группой"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:28
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:28
+#: templates/admin/guardian/model/obj_perms_manage_group.html:27
+#: templates/admin/guardian/model/obj_perms_manage_user.html:27
+msgid "Object"
+msgstr "Объект"
+
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_group.html:45
+#: templates/admin/guardian/contrib/grappelli/obj_perms_manage_user.html:45
+#: templates/admin/guardian/model/obj_perms_manage_group.html:37
+#: templates/admin/guardian/model/obj_perms_manage_user.html:37
+msgid "Save"
+msgstr "Сохранить"
+
+#: templates/admin/guardian/model/obj_perms_manage.html:28
+#: templates/admin/guardian/model/obj_perms_manage.html:82
+msgid "Please correct the errors below."
+msgstr "Исправьте ошибки ниже."
diff --git a/guardian/management/__init__.py b/guardian/management/__init__.py
index 5f38daf..f49b18c 100644
--- a/guardian/management/__init__.py
+++ b/guardian/management/__init__.py
@@ -3,7 +3,6 @@ from __future__ import unicode_literals
import django
from django.db.models import signals
-from guardian import models as guardian_app
from guardian.conf import settings as guardian_settings
from guardian.compat import get_user_model
from guardian.compat import import_string
@@ -19,7 +18,9 @@ def get_init_anonymous_user(User):
kwargs = {
User.USERNAME_FIELD: guardian_settings.ANONYMOUS_DEFAULT_USERNAME_VALUE
}
- return User(**kwargs)
+ user = User(**kwargs)
+ user.set_unusable_password()
+ return user
def create_anonymous_user(sender, **kwargs):
@@ -30,18 +31,23 @@ def create_anonymous_user(sender, **kwargs):
try:
User.objects.get(pk=guardian_settings.ANONYMOUS_USER_ID)
except User.DoesNotExist:
- if django.VERSION >= (1, 5):
- retrieve_anonymous_function = import_string(
- guardian_settings.GET_INIT_ANONYMOUS_USER)
- user = retrieve_anonymous_function(User)
- # Always set pk to the one pointed at settings
- user.pk = guardian_settings.ANONYMOUS_USER_ID
- user.save()
- else:
- User.objects.create(pk=guardian_settings.ANONYMOUS_USER_ID,
- username=guardian_settings.ANONYMOUS_DEFAULT_USERNAME_VALUE)
+ retrieve_anonymous_function = import_string(
+ guardian_settings.GET_INIT_ANONYMOUS_USER)
+ user = retrieve_anonymous_function(User)
+ # Always set pk to the one pointed at settings
+ user.pk = guardian_settings.ANONYMOUS_USER_ID
+ user.save()
# Only create an anonymous user if support is enabled.
if guardian_settings.ANONYMOUS_USER_ID is not None:
- signals.post_syncdb.connect(create_anonymous_user, sender=guardian_app,
- dispatch_uid="guardian.management.create_anonymous_user")
+ if django.VERSION >= (1, 7):
+ # Django 1.7+ uses post_migrate signal
+ from django.apps import apps
+ guardian_app = apps.get_app_config('guardian')
+ signals.post_migrate.connect(create_anonymous_user, sender=guardian_app,
+ dispatch_uid="guardian.management.create_anonymous_user")
+ else:
+ # Django 1.6 and earlier uses post_syncdb signal
+ from guardian import models as guardian_app
+ signals.post_syncdb.connect(create_anonymous_user, sender=guardian_app,
+ dispatch_uid="guardian.management.create_anonymous_user")
diff --git a/guardian/shortcuts.py b/guardian/shortcuts.py
index 5ef280c..06966b9 100644
--- a/guardian/shortcuts.py
+++ b/guardian/shortcuts.py
@@ -8,6 +8,13 @@ from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import Count, Q
+try:
+ # django >= 1.7
+ from django.apps import apps
+ get_model = apps.get_model
+except ImportError:
+ # django < 1.7
+ from django.db.models import get_model
from django.shortcuts import _get_queryset
from itertools import groupby
@@ -152,7 +159,7 @@ def get_perms_for_model(cls):
"""
if isinstance(cls, basestring):
app_label, model_name = cls.split('.')
- model = models.get_model(app_label, model_name)
+ model = get_model(app_label, model_name)
else:
model = cls
ctype = ContentType.objects.get_for_model(model)
@@ -290,6 +297,9 @@ def get_objects_for_user(user, perms, klass=None, use_groups=True, any_perm=Fals
Returns queryset of objects for which a given ``user`` has *all*
permissions present at ``perms``.
+ If ``perms`` is an empty list, then it returns objects for which
+ a given ``user`` has *any* object permission.
+
:param user: ``User`` or ``AnonymousUser`` instance for which objects would
be returned.
:param perms: single permission string, or sequence of permission strings
@@ -381,13 +391,13 @@ def get_objects_for_user(user, perms, klass=None, use_groups=True, any_perm=Fals
ctype = new_ctype
# Compute queryset and ctype if still missing
- if ctype is None and klass is None:
- raise WrongAppError("Cannot determine content type")
- elif ctype is None and klass is not None:
+ if ctype is None and klass is not None:
queryset = _get_queryset(klass)
ctype = ContentType.objects.get_for_model(queryset.model)
elif ctype is not None and klass is None:
queryset = _get_queryset(ctype.model_class())
+ elif klass is None:
+ raise WrongAppError("Cannot determine content type")
else:
queryset = _get_queryset(klass)
if ctype.model_class() != queryset.model:
@@ -413,7 +423,7 @@ def get_objects_for_user(user, perms, klass=None, use_groups=True, any_perm=Fals
# a superuser has by default assigned global perms for any
if accept_global_perms and with_superuser:
for code in codenames:
- if user.has_perm(app_label + '.' + code):
+ if user.has_perm(ctype.app_label + '.' + code):
global_perms.add(code)
for code in global_perms:
codenames.remove(code)
@@ -439,8 +449,9 @@ def get_objects_for_user(user, perms, klass=None, use_groups=True, any_perm=Fals
user_model = get_user_obj_perms_model(queryset.model)
user_obj_perms_queryset = (user_model.objects
.filter(user=user)
- .filter(permission__content_type=ctype)
- .filter(permission__codename__in=codenames))
+ .filter(permission__content_type=ctype))
+ if len(codenames):
+ user_obj_perms_queryset = user_obj_perms_queryset.filter(permission__codename__in=codenames)
if user_model.objects.is_generic():
fields = ['object_pk', 'permission__codename']
else:
@@ -450,15 +461,18 @@ def get_objects_for_user(user, perms, klass=None, use_groups=True, any_perm=Fals
group_model = get_group_obj_perms_model(queryset.model)
group_filters = {
'permission__content_type': ctype,
- 'permission__codename__in': codenames,
'group__%s' % get_user_model().groups.field.related_query_name(): user,
}
+ if len(codenames):
+ group_filters.update({
+ 'permission__codename__in': codenames,
+ })
groups_obj_perms_queryset = group_model.objects.filter(**group_filters)
if group_model.objects.is_generic():
fields = ['object_pk', 'permission__codename']
else:
fields = ['content_object__pk', 'permission__codename']
- if not any_perm and not has_global_perms:
+ if not any_perm and len(codenames) and not has_global_perms:
user_obj_perms = user_obj_perms_queryset.values_list(*fields)
groups_obj_perms = groups_obj_perms_queryset.values_list(*fields)
data = list(user_obj_perms) + list(groups_obj_perms)
@@ -476,17 +490,11 @@ def get_objects_for_user(user, perms, klass=None, use_groups=True, any_perm=Fals
counts = user_obj_perms_queryset.values(fields[0]).annotate(object_pk_count=Count(fields[0]))
user_obj_perms_queryset = counts.filter(object_pk_count__gte=len(codenames))
- values = user_obj_perms_queryset.values_list(fields[0], flat=True)
- if user_model.objects.is_generic():
- values = list(values)
- objects = queryset.filter(pk__in=values)
+ q = Q(pk__in=user_obj_perms_queryset.values(fields[0]))
if use_groups:
- values = groups_obj_perms_queryset.values_list(fields[0], flat=True)
- if group_model.objects.is_generic():
- values = list(values)
- objects |= queryset.filter(pk__in=values)
+ q |= Q(pk__in=groups_obj_perms_queryset.values(fields[0]))
- return objects
+ return queryset.filter(q)
def get_objects_for_group(group, perms, klass=None, any_perm=False, accept_global_perms=True):
diff --git a/guardian/templates/admin/guardian/contrib/grappelli/obj_perms_manage.html b/guardian/templates/admin/guardian/contrib/grappelli/obj_perms_manage.html
index 098310d..05c6c81 100644
--- a/guardian/templates/admin/guardian/contrib/grappelli/obj_perms_manage.html
+++ b/guardian/templates/admin/guardian/contrib/grappelli/obj_perms_manage.html
@@ -1,7 +1,7 @@
{% extends "admin/change_form.html" %}
{% load i18n %}
{% load guardian_tags %}
-{% friendly_load admin_static %}
+{% load admin_static %}
{% block breadcrumbs %}{% if not is_popup %}
<ul>
diff --git a/guardian/templates/admin/guardian/model/obj_perms_manage.html b/guardian/templates/admin/guardian/model/obj_perms_manage.html
index 6411196..e0a5049 100644
--- a/guardian/templates/admin/guardian/model/obj_perms_manage.html
+++ b/guardian/templates/admin/guardian/model/obj_perms_manage.html
@@ -1,7 +1,6 @@
{% extends "admin/change_form.html" %}
{% load i18n %}
{% load guardian_tags %}
-{% friendly_load adminmedia %}
{% block extrahead %}{{ block.super }}
<style type="text/css">
diff --git a/guardian/templates/admin/guardian/model/obj_perms_no.html b/guardian/templates/admin/guardian/model/obj_perms_no.html
index af1b1dd..4a54eaf 100644
--- a/guardian/templates/admin/guardian/model/obj_perms_no.html
+++ b/guardian/templates/admin/guardian/model/obj_perms_no.html
@@ -1,3 +1,3 @@
{% load guardian_tags %}
-{% friendly_load adminmedia %}
-<img src="{{ STATIC_URL }}admin/img/icon-no.gif"/>
+{% load staticfiles %}
+<img src="{% static 'admin/img/icon-no.gif' %}"/>
diff --git a/guardian/templates/admin/guardian/model/obj_perms_yes.html b/guardian/templates/admin/guardian/model/obj_perms_yes.html
index bc1e927..80dc13f 100644
--- a/guardian/templates/admin/guardian/model/obj_perms_yes.html
+++ b/guardian/templates/admin/guardian/model/obj_perms_yes.html
@@ -1,3 +1,3 @@
{% load guardian_tags %}
-{% friendly_load adminmedia %}
-<img src="{{ STATIC_URL }}admin/img/icon-yes.gif"/>
+{% load staticfiles %}
+<img src="{% static 'admin/img/icon-yes.gif' %}"/>
diff --git a/guardian/templatetags/guardian_tags.py b/guardian/templatetags/guardian_tags.py
index 04c3595..976ca49 100644
--- a/guardian/templatetags/guardian_tags.py
+++ b/guardian/templatetags/guardian_tags.py
@@ -8,15 +8,6 @@
from __future__ import unicode_literals
from django import template
from django.contrib.auth.models import Group, AnonymousUser
-try:
- # Django < 1.8
- from django.template import get_library
- from django.template import InvalidTemplateLibrary
-except ImportError:
- # Django >= 1.8
- from django.template.base import get_library
- from django.template.base import InvalidTemplateLibrary
-from django.template.defaulttags import LoadNode
from guardian.compat import get_user_model
from guardian.exceptions import NotUserNorGroup
@@ -25,41 +16,6 @@ from guardian.core import ObjectPermissionChecker
register = template.Library()
- at register.tag
-def friendly_load(parser, token):
- '''
- Tries to load a custom template tag set. Non existing tag libraries
- are ignored.
-
- This means that, if used in conjuction with ``if_has_tag``, you can try to
- load the comments template tag library to enable comments even if the
- comments framework is not installed.
-
- For example::
-
- {% load friendly_loader %}
- {% friendly_load comments webdesign %}
-
- {% if_has_tag render_comment_list %}
- {% render_comment_list for obj %}
- {% else %}
- {% if_has_tag lorem %}
- {% lorem %}
- {% endif_has_tag %}
- {% endif_has_tag %}
- '''
- bits = token.contents.split()
- for taglib in bits[1:]:
- try:
- lib = get_library(taglib)
- parser.add_library(lib)
- except InvalidTemplateLibrary:
- pass
- return LoadNode()
-
-
-
-
class ObjectPermissionsNode(template.Node):
def __init__(self, for_whom, obj, context_var):
self.for_whom = template.Variable(for_whom)
diff --git a/guardian/testapp/migrations/0004_auto_20151112_2209.py b/guardian/testapp/migrations/0004_auto_20151112_2209.py
new file mode 100644
index 0000000..cf39c25
--- /dev/null
+++ b/guardian/testapp/migrations/0004_auto_20151112_2209.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.core.validators
+import django.contrib.auth.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('testapp', '0003_auto_20141124_0729'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='customuser',
+ name='email',
+ field=models.EmailField(max_length=254, verbose_name='email address', blank=True),
+ ),
+ migrations.AlterField(
+ model_name='customuser',
+ name='groups',
+ field=models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups'),
+ ),
+ migrations.AlterField(
+ model_name='customuser',
+ name='last_login',
+ field=models.DateTimeField(null=True, verbose_name='last login', blank=True),
+ ),
+ migrations.AlterField(
+ model_name='customuser',
+ name='username',
+ field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator('^[\\w. at +-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username'),
+ ),
+ ]
diff --git a/guardian/testapp/models.py b/guardian/testapp/models.py
index 49952bf..5dbf659 100644
--- a/guardian/testapp/models.py
+++ b/guardian/testapp/models.py
@@ -1,7 +1,6 @@
from __future__ import unicode_literals
from datetime import datetime
-import django
from django.db import models
from django.contrib.admin.models import LogEntry
@@ -67,7 +66,6 @@ class NonIntPKModel(models.Model):
char_pk = models.CharField(primary_key=True, max_length=128)
-if django.VERSION > (1, 5):
- from django.contrib.auth.models import AbstractUser
- class CustomUser(AbstractUser, GuardianUserMixin):
- custom_id = models.AutoField(primary_key=True)
+from django.contrib.auth.models import AbstractUser
+class CustomUser(AbstractUser, GuardianUserMixin):
+ custom_id = models.AutoField(primary_key=True)
diff --git a/guardian/testapp/tests/__init__.py b/guardian/testapp/tests/__init__.py
index a91623d..b8a7c58 100644
--- a/guardian/testapp/tests/__init__.py
+++ b/guardian/testapp/tests/__init__.py
@@ -1,24 +1,24 @@
from __future__ import unicode_literals
import django
-from django.conf import settings
+if django.VERSION < (1, 7):
+ from django.conf import settings
-from .conf_test import *
-from .core_test import *
-from .custompkmodel_test import *
-from .decorators_test import *
-from .direct_rel_test import *
-from .forms_test import *
-from .managers_test import *
-from .management_test import *
-from .orphans_test import *
-from .other_test import *
-from .utils_test import *
-from .shortcuts_test import *
-from .tags_test import *
+ from .test_conf import *
+ from .test_core import *
+ from .test_custompkmodel import *
+ from .test_decorators import *
+ from .test_direct_rel import *
+ from .test_forms import *
+ from .test_managers import *
+ from .test_management import *
+ from .test_orphans import *
+ from .test_other import *
+ from .test_utils import *
+ from .test_shortcuts import *
+ from .test_tags import *
-if 'django.contrib.admin' in settings.INSTALLED_APPS:
- from .admin_test import *
-if django.VERSION >= (1, 3):
- from .mixins_test import *
+ if 'django.contrib.admin' in settings.INSTALLED_APPS:
+ from .test_admin import *
+ from .test_mixins import *
diff --git a/guardian/testapp/tests/conf.py b/guardian/testapp/tests/conf.py
index e4e0761..98b255e 100644
--- a/guardian/testapp/tests/conf.py
+++ b/guardian/testapp/tests/conf.py
@@ -23,15 +23,6 @@ def skipUnlessTestApp(obj):
'app %r must be installed to run this test' % app)(obj)
-def skipUnlessSupportsCustomUser(obj):
- # XXX: Following fixes problem with Python 2.6 and Django 1.2
- gte15 = django.VERSION >= (1, 5)
- if not gte15:
- return lambda *args, **kwargs: None
- # XXX: End of the workaround
- return unittest.skipUnless(django.VERSION >= (1, 5), 'Must have Django 1.5 or greater')(obj)
-
-
class TestDataMixin(object):
def setUp(self):
super(TestDataMixin, self).setUp()
diff --git a/guardian/testapp/tests/admin_test.py b/guardian/testapp/tests/test_admin.py
similarity index 99%
rename from guardian/testapp/tests/admin_test.py
rename to guardian/testapp/tests/test_admin.py
index 33625cf..170c913 100644
--- a/guardian/testapp/tests/admin_test.py
+++ b/guardian/testapp/tests/test_admin.py
@@ -343,7 +343,7 @@ class GuardedModelAdminTests(TestCase):
object_id=jane.pk, action_flag=1, change_message='bar')
request = HttpRequest()
request.user = joe
- qs = gma.queryset(request)
+ qs = gma.get_queryset(request)
self.assertEqual([e.pk for e in qs], [joe_entry.pk])
def test_user_can_acces_owned_objects_only_unless_superuser(self):
@@ -361,7 +361,7 @@ class GuardedModelAdminTests(TestCase):
object_id=jane.pk, action_flag=1, change_message='bar')
... 436 lines suppressed ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/django-guardian.git
More information about the Python-modules-commits
mailing list