[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