Codebase list django-guardian / a6f18fd
Merge tag 'upstream/1.4.9' into debian/master Upstream version 1.4.9 Brian May 6 years ago
17 changed file(s) with 96 addition(s) and 27 deletion(s). Raw diff Collapse all Expand all
4646
4747 matrix:
4848 fast_finish: true
49 exclude:
50 - python: 2.7
51 env: DJANGO_VERSION=master DATABASE_URL=postgres://postgres@/django_guardian
52 - python: 2.7
53 env: DJANGO_VERSION=master DATABASE_URL=mysql://root:@localhost/django_guardian
54 - python: 2.7
55 env: DJANGO_VERSION=master DATABASE_URL=sqlite://
56 - python: 3.4
57 env: DJANGO_VERSION=master DATABASE_URL=postgres://postgres@/django_guardian
58 - python: 3.4
59 env: DJANGO_VERSION=master DATABASE_URL=mysql://root:@localhost/django_guardian
60 - python: 3.4
61 env: DJANGO_VERSION=master DATABASE_URL=sqlite://
4962 allow_failures:
5063 - env: DJANGO_VERSION=master DATABASE_URL=postgres://postgres@/django_guardian
5164 - env: DJANGO_VERSION=master DATABASE_URL=mysql://root:@localhost/django_guardian
0 Release 1.4.9 (Jul 01, 2017)
1 ============================
2
3 * Drop ``django_guardian.compat.OrderedDict`` as a consequence of drop Python 1.6
4 earlier.
5 * Fix django admin 1.11 not showing selected permissions
6 * Add a optional checker variable to get_obj_perms
7 * Add missing classifiers in setup.py
8
9
010 Release 1.4.8 (Apr 04, 2017)
111 ============================
212
00 Metadata-Version: 1.1
11 Name: django-guardian
2 Version: 1.4.8
2 Version: 1.4.9
33 Summary: Implementation of per object permissions for Django.
44 Home-page: http://github.com/django-guardian/django-guardian
55 Author: Lukasz Balcerzak
125125 Classifier: Development Status :: 5 - Production/Stable
126126 Classifier: Environment :: Web Environment
127127 Classifier: Framework :: Django
128 Classifier: Framework :: Django :: 1.8
129 Classifier: Framework :: Django :: 1.9
130 Classifier: Framework :: Django :: 1.10
131 Classifier: Framework :: Django :: 1.11
128132 Classifier: Intended Audience :: Developers
129133 Classifier: License :: OSI Approved :: BSD License
130134 Classifier: Operating System :: OS Independent
00 Metadata-Version: 1.1
11 Name: django-guardian
2 Version: 1.4.8
2 Version: 1.4.9
33 Summary: Implementation of per object permissions for Django.
44 Home-page: http://github.com/django-guardian/django-guardian
55 Author: Lukasz Balcerzak
125125 Classifier: Development Status :: 5 - Production/Stable
126126 Classifier: Environment :: Web Environment
127127 Classifier: Framework :: Django
128 Classifier: Framework :: Django :: 1.8
129 Classifier: Framework :: Django :: 1.9
130 Classifier: Framework :: Django :: 1.10
131 Classifier: Framework :: Django :: 1.11
128132 Classifier: Intended Audience :: Developers
129133 Classifier: License :: OSI Approved :: BSD License
130134 Classifier: Operating System :: OS Independent
7373 various reasons, i.e. there were no reply for over a month after our last
7474 comment, there were no tests for the changes etc.
7575
76
77 How to do a new release?
78 ----------------------------
79
80 To enroll a new relase you should perform the following task:
81
82 * Ensure file ``CHANGES`` reflects all important changes.
83 * Ensure file ``CHANGES`` includes a new version identifier and current release date.
84 * Execute ``bumpversion patch`` (or accordinly - see `Semantic Versioning 2.0 <http://semver.org/>`_ ) to reflects changes in codebase.
85 * Commit changes of codebase, e.g. ``git commit -m "Release 1.4.8" -a``.
86 * Tag a new release, e.g. ``git tag "v1.4.8"``.
87 * Push new tag to repo - ``git push origin --tags``.
88 * Push a new release to PyPI - ``python setup.py sdist bdist_wheel upload``.
33 ========
44
55 ``django-guardian`` is an implementation of object permissions for Django_
6 providing extra *authentication backend*.
6 providing an extra *authentication backend*.
77
88 Features
99 --------
2828 Alternate projects
2929 ------------------
3030
31 Django_ still has *only* foundation for object permissions [1]_ and
32 ``django-guardian`` make use of new facilities and it is based on them. There
33 are some other pluggable applications which does *NOT* require 1.2+
34 version of Django_. For instance, there are great `django-authority`_ or
35 `django-permissions`_ available out there.
31 Django_ still *only* has the foundation for object permissions [1]_ and
32 ``django-guardian`` makes use of new facilities and it is based on them. There
33 are some other pluggable applications which do *NOT* require Django_ version 1.2+.
34 For instance, `django-authority`_ or
35 `django-permissions`_ are great options available.
3636
3737 .. _django: http://www.djangoproject.com/
38 .. _django-authority: http://bitbucket.org/jezdez/django-authority/
39 .. _django-permissions: http://bitbucket.org/diefenbach/django-permissions/
38 .. _django-authority: https://github.com/jazzband/django-authority
39 .. _django-permissions: https://github.com/lambdalisue/django-permission
4040 .. _issue-tracker: http://github.com/lukaszb/django-guardian
4141 .. _grappelli: https://github.com/sehmaschine/django-grappelli
4242
33 from django.conf.urls import url
44 from . import views
55
6
7 app_name = 'articles'
68 urlpatterns = [
79 url(r'^$', views.ArticleListView.as_view(),
810 name="list"),
88 admin.autodiscover()
99
1010 urlpatterns = [
11 url(r'^admin/', include(admin.site.urls)),
11 url(r'^admin/', admin.site.urls),
1212 url(r'^logout/$', logout, {'next_page': '/'}, name='logout'),
1313 url(r'^article/', include('articles.urls', namespace='articles')),
1414 url(r'^', include('posts.urls')),
66 default_app_config = 'guardian.apps.GuardianConfig'
77
88 # PEP 396: The __version__ attribute's value SHOULD be a string.
9 __version__ = '1.4.8'
9 __version__ = '1.4.9'
1010
1111 # Compatibility to eg. django-rest-framework
1212 VERSION = tuple(int(x) for x in __version__.split('.')[:3])
00 from __future__ import unicode_literals
1
2 from collections import OrderedDict
3
14 from django import forms
25 from django.conf import settings
36 from django.contrib import admin, messages
69 from django.template import RequestContext
710 from django.utils.translation import ugettext_lazy as _
811 from django.utils.translation import ugettext
9 from guardian.compat import get_model_name, get_user_model, OrderedDict, url, reverse
12 from guardian.compat import get_model_name, get_user_model, url, reverse
1013 from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm
1114 from guardian.models import Group
1215 from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms,
00 from __future__ import unicode_literals
1 # OrderedDict only available in Python 2.7.
2 # This will always be the case in Django 1.7 and above, as these versions
3 # no longer support Python 2.6.
41
5 from collections import OrderedDict
62 from django.conf import settings
73 from django.conf.urls import handler404, handler500, include, url
84 from django.contrib.auth.models import AnonymousUser, Group, Permission
3030 field = field_class(
3131 label=self.get_obj_perms_field_label(),
3232 choices=self.get_obj_perms_field_choices(),
33 initial=self.get_obj_perms_field_initial(),
33 initial=list(self.get_obj_perms_field_initial()),
3434 widget=self.get_obj_perms_field_widget(),
3535 required=self.are_obj_perms_required(),
3636 )
1818
1919 class ObjectPermissionsNode(template.Node):
2020
21 def __init__(self, for_whom, obj, context_var):
21 def __init__(self, for_whom, obj, context_var, checker=None):
2222 self.for_whom = template.Variable(for_whom)
2323 self.obj = template.Variable(obj)
2424 self.context_var = context_var
25 self.checker = template.Variable(checker) if checker else None
2526
2627 def render(self, context):
2728 for_whom = self.for_whom.resolve(context)
4041 obj = self.obj.resolve(context)
4142 if not obj:
4243 return ''
43
44 check = ObjectPermissionChecker(for_whom)
44
45 check = self.checker.resolve(context) if self.checker else ObjectPermissionChecker(for_whom)
4546 perms = check.get_perms(obj)
4647
4748 context[self.context_var] = perms
8283
8384 """
8485 bits = token.split_contents()
85 format = '{% get_obj_perms user/group for obj as "context_var" %}'
86 if len(bits) != 6 or bits[2] != 'for' or bits[4] != 'as':
86 format = '{% get_obj_perms user/group for obj as "context_var" perm_checker %}'
87 if not (6 <= len(bits) <= 7) or bits[2] != 'for' or bits[4] != 'as':
8788 raise template.TemplateSyntaxError("get_obj_perms tag should be in "
8889 "format: %s" % format)
8990
9495 raise template.TemplateSyntaxError("get_obj_perms tag's context_var "
9596 "argument should be in quotes")
9697 context_var = context_var[1:-1]
97 return ObjectPermissionsNode(for_whom, obj, context_var)
98 checker = bits[6] if len(bits) == 7 else None
99 return ObjectPermissionsNode(for_whom, obj, context_var, checker)
161161 response = self.client.post(url, data, follow=True)
162162 self.assertEqual(len(response.redirect_chain), 1)
163163 self.assertEqual(response.redirect_chain[0][1], 302)
164
164 self.assertIn('selected', str(response.context['form']))
165165 self.assertEqual(
166166 set(get_perms(self.user, self.obj)),
167167 set(perms),
55 from django.test import TestCase
66
77 from guardian.compat import get_user_model, template_debug_getter, template_debug_setter
8 from guardian.core import ObjectPermissionChecker
89 from guardian.exceptions import NotUserNorGroup
910 from guardian.models import UserObjectPermission, GroupObjectPermission
1011
130131 output = render(template, context)
131132
132133 self.assertEqual(output, 'delete_contenttype')
134
135 def test_checker(self):
136 GroupObjectPermission.objects.assign_perm("delete_contenttype", self.group,
137 self.ctype)
138
139 checker = ObjectPermissionChecker(self.user)
140 checker.prefetch_perms(Group.objects.all())
141
142 template = ''.join((
143 '{% load guardian_tags %}',
144 '{% get_obj_perms group for contenttype as "obj_perms" checker %}',
145 '{{ obj_perms|join:" " }}',
146 ))
147 context = {'group': self.group, 'contenttype': self.ctype, 'checker': checker}
148 output = render(template, context)
149
150 self.assertEqual(output, 'delete_contenttype')
00 [bumpversion]
1 current_version = 1.4.8
1 current_version = 1.4.9
22
33 [build_sphinx]
44 source-dir = docs/
22 from extras import RunFlakesCommand
33
44
5 version = '1.4.8'
5 version = '1.4.9'
66
77 readme_file = os.path.join(os.path.dirname(__file__), 'README.rst')
88 with open(readme_file, 'r') as f:
3434 classifiers=['Development Status :: 5 - Production/Stable',
3535 'Environment :: Web Environment',
3636 'Framework :: Django',
37 'Framework :: Django :: 1.8',
38 'Framework :: Django :: 1.9',
39 'Framework :: Django :: 1.10',
40 'Framework :: Django :: 1.11',
3741 'Intended Audience :: Developers',
3842 'License :: OSI Approved :: BSD License',
3943 'Operating System :: OS Independent',