mirror of
https://github.com/jazzband/django-authority.git
synced 2026-03-16 22:20:28 +00:00
Add support for Django 1.11 (#58)
* refs #1: Updated tox + travis. * refs #1; Fixed path to register. * refs #1: Updated urls.py * refs #1: Added username field. Not really sure why it was needed, but whatever. * Added an update note. * refs #2: Updated travis. * refs #2: Updated command to run tests. * refs #2: Added a test showing permission_required is busted. * refs #2: Custom user modal needs a default manager. * refs #2: Updated settings. * refs #2: Stop the exception from being raised. * refs #2: Fixed a problem with named parameters.
This commit is contained in:
parent
14b92a0dcd
commit
a868d54945
9 changed files with 93 additions and 62 deletions
|
|
@ -7,9 +7,11 @@ cache:
|
|||
env:
|
||||
matrix:
|
||||
- TOXENV=py27-dj18
|
||||
- TOXENV=py33-dj18
|
||||
- TOXENV=py34-dj18
|
||||
- TOXENV=py35-dj18
|
||||
- TOXENV=py27-dj111
|
||||
- TOXENV=py34-dj111
|
||||
- TOXENV=py35-dj111
|
||||
install:
|
||||
- pip install tox codecov
|
||||
script: tox -v
|
||||
|
|
|
|||
|
|
@ -57,6 +57,11 @@ html version using the setup.py::
|
|||
Changelog:
|
||||
==========
|
||||
|
||||
0.12 (TBD):
|
||||
-----------------
|
||||
|
||||
* Added support for Django 1.11
|
||||
|
||||
0.11 (2016-07-17):
|
||||
-----------------
|
||||
|
||||
|
|
|
|||
|
|
@ -25,8 +25,9 @@ def add_permission(request, app_label, module_name, pk, approved=False,
|
|||
template_name='authority/permission_form.html',
|
||||
extra_context=None, form_class=UserPermissionForm):
|
||||
codename = request.POST.get('codename', None)
|
||||
model = apps.get_model(app_label, module_name)
|
||||
if model is None:
|
||||
try:
|
||||
model = apps.get_model(app_label, module_name)
|
||||
except LookupError:
|
||||
return permission_denied(request)
|
||||
obj = get_object_or_404(model, pk=pk)
|
||||
next = get_next(request, obj)
|
||||
|
|
@ -108,5 +109,8 @@ def permission_denied(request, template_name=None, extra_context=None):
|
|||
}
|
||||
if extra_context:
|
||||
context.update(extra_context)
|
||||
return HttpResponseForbidden(loader.render_to_string(template_name,
|
||||
context, request))
|
||||
return HttpResponseForbidden(loader.render_to_string(
|
||||
template_name=template_name,
|
||||
context=context,
|
||||
request=request,
|
||||
))
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ from authority.permissions import BasePermission
|
|||
class FlatPagePermission(BasePermission):
|
||||
"""
|
||||
This class contains a bunch of checks:
|
||||
|
||||
|
||||
1. the default checks 'add_flatpage', 'browse_flatpage',
|
||||
'change_flatpage' and 'delete_flatpage'
|
||||
2. the custom checks:
|
||||
|
|
@ -49,4 +49,4 @@ class FlatPagePermission(BasePermission):
|
|||
return False
|
||||
top_secret.short_description=_('Is allowed to see top secret flatpages')
|
||||
|
||||
authority.register(FlatPage, FlatPagePermission)
|
||||
authority.sites.register(FlatPage, FlatPagePermission)
|
||||
|
|
|
|||
|
|
@ -1,23 +1,26 @@
|
|||
"""
|
||||
This file demonstrates two different styles of tests (one doctest and one
|
||||
unittest). These will both pass when you run "manage.py test".
|
||||
|
||||
Replace these with more appropriate tests for your application.
|
||||
"""
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.test import TestCase
|
||||
|
||||
class SimpleTest(TestCase):
|
||||
def test_basic_addition(self):
|
||||
"""
|
||||
Tests that 1 + 1 always equals 2.
|
||||
"""
|
||||
self.failUnlessEqual(1 + 1, 2)
|
||||
from authority.compat import get_user_model
|
||||
|
||||
__test__ = {"doctest": """
|
||||
Another way to test that 1 + 1 is equal to 2.
|
||||
|
||||
>>> 1 + 1 == 2
|
||||
True
|
||||
"""}
|
||||
class AddPermissionTestCase(TestCase):
|
||||
def test_add_permission_permission_denied_is_403(self):
|
||||
user = get_user_model().objects.create(
|
||||
username='foo',
|
||||
email='foo@example.com',
|
||||
)
|
||||
user.set_password('pw')
|
||||
user.save()
|
||||
|
||||
assert self.client.login(username='foo@example.com', password='pw')
|
||||
url = reverse(
|
||||
'authority-add-permission-request',
|
||||
kwargs={
|
||||
'app_label': 'foo',
|
||||
'module_name': 'Bar',
|
||||
'pk': 1,
|
||||
},
|
||||
)
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 403)
|
||||
|
|
|
|||
|
|
@ -54,11 +54,6 @@ INTERNAL_IPS = ('127.0.0.1',)
|
|||
|
||||
|
||||
TEMPLATE_CONTEXT_PROCESSORS = (
|
||||
'django.core.context_processors.auth',
|
||||
'django.core.context_processors.debug',
|
||||
'django.core.context_processors.i18n',
|
||||
'django.core.context_processors.media',
|
||||
'django.core.context_processors.request',
|
||||
)
|
||||
|
||||
ROOT_URLCONF = 'example.urls'
|
||||
|
|
@ -80,14 +75,28 @@ if VERSION >= (1, 5):
|
|||
INSTALLED_APPS = INSTALLED_APPS + ('example.users',)
|
||||
AUTH_USER_MODEL = 'users.User'
|
||||
|
||||
TEMPLATE_LOADERS = (
|
||||
'django.template.loaders.filesystem.load_template_source',
|
||||
'django.template.loaders.app_directories.load_template_source',
|
||||
)
|
||||
|
||||
TEMPLATE_DIRS = (
|
||||
os.path.join(PROJECT_ROOT, "templates"),
|
||||
)
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [
|
||||
# insert your TEMPLATE_DIRS here
|
||||
],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
# Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
|
||||
# list if you haven't customized them:
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media',
|
||||
'django.template.context_processors.static',
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
# Use local_settings.py for things to override privately
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -1,39 +1,42 @@
|
|||
try:
|
||||
from django.conf.urls import patterns, include, handler500, url
|
||||
except ImportError: # django < 1.4
|
||||
from django.conf.urls.defaults import patterns, include, handler500, url
|
||||
import django.contrib.auth.views
|
||||
from django.conf.urls import include, handler500, url
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
import authority
|
||||
|
||||
admin.autodiscover()
|
||||
authority.autodiscover()
|
||||
|
||||
handler500 # Pyflakes
|
||||
import authority.views
|
||||
import authority.urls
|
||||
import example.exampleapp.views
|
||||
|
||||
from exampleapp.forms import SpecialUserPermissionForm
|
||||
|
||||
urlpatterns = patterns('',
|
||||
(r'^admin/(.*)', admin.site.root),
|
||||
#('^admin/', include(admin.site.urls)),
|
||||
url(r'^authority/permission/add/(?P<app_label>[\w\-]+)/(?P<module_name>[\w\-]+)/(?P<pk>\d+)/$',
|
||||
view='authority.views.add_permission',
|
||||
authority.autodiscover()
|
||||
|
||||
handler500 # flake8
|
||||
|
||||
urlpatterns = (
|
||||
url(
|
||||
r'^authority/permission/add/(?P<app_label>[\w\-]+)/(?P<module_name>[\w\-]+)/(?P<pk>\d+)/$', # noqa
|
||||
view=authority.views.add_permission,
|
||||
name="authority-add-permission",
|
||||
kwargs={'approved': True, 'form_class': SpecialUserPermissionForm}
|
||||
),
|
||||
url(r'^request/add/(?P<app_label>[\w\-]+)/(?P<module_name>[\w\-]+)/(?P<pk>\d+)/$',
|
||||
view='authority.views.add_permission',
|
||||
url(
|
||||
r'^request/add/(?P<app_label>[\w\-]+)/(?P<module_name>[\w\-]+)/(?P<pk>\d+)/$', # noqa
|
||||
view=authority.views.add_permission,
|
||||
name="authority-add-permission-request",
|
||||
kwargs={'approved': False, 'form_class': SpecialUserPermissionForm}
|
||||
),
|
||||
(r'^authority/', include('authority.urls')),
|
||||
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
|
||||
url(r'^(?P<url>[\/0-9A-Za-z]+)$', 'example.exampleapp.views.top_secret', {'lala': 'oh yeah!'}),
|
||||
url(r'^authority/', include(authority.urls)),
|
||||
url(r'^accounts/login/$', django.contrib.auth.views.login),
|
||||
url(
|
||||
r'^(?P<url>[\/0-9A-Za-z]+)$',
|
||||
example.exampleapp.views.top_secret,
|
||||
{'lala': 'oh yeah!'},
|
||||
),
|
||||
)
|
||||
|
||||
if settings.DEBUG:
|
||||
urlpatterns += patterns('',
|
||||
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
|
||||
urlpatterns += (
|
||||
url(r'^media/(?P<path>.*)$', django.views.static.serve, {
|
||||
'document_root': settings.MEDIA_ROOT,
|
||||
}),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
|
||||
from django.contrib.auth.models import UserManager
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
|
|
@ -7,6 +8,7 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|||
USERNAME_FIELD = 'email'
|
||||
REQUIRED_FIELDS = ['first_name', 'last_name']
|
||||
|
||||
username = models.CharField(max_length=100)
|
||||
first_name = models.CharField(max_length=50)
|
||||
last_name = models.CharField(max_length=50)
|
||||
email = models.EmailField(unique=True)
|
||||
|
|
@ -14,3 +16,5 @@ class User(AbstractBaseUser, PermissionsMixin):
|
|||
is_staff = models.BooleanField(default=False)
|
||||
is_active = models.BooleanField(default=True)
|
||||
date_joined = models.DateTimeField(default=timezone.now)
|
||||
|
||||
objects = UserManager()
|
||||
|
|
|
|||
5
tox.ini
5
tox.ini
|
|
@ -3,7 +3,7 @@ skipsdist = True
|
|||
usedevelop = True
|
||||
minversion = 1.8
|
||||
envlist =
|
||||
py{27,33,34,35}-dj{18,19,110}
|
||||
py{27,33,34,35}-dj{18,19,110,111}
|
||||
|
||||
[testenv]
|
||||
basepython =
|
||||
|
|
@ -12,8 +12,9 @@ basepython =
|
|||
py34: python3.4
|
||||
py35: python3.5
|
||||
usedevelop = true
|
||||
commands = python example/manage.py test authority
|
||||
commands = python example/manage.py test authority exampleapp
|
||||
deps =
|
||||
dj18: Django<1.9
|
||||
dj19: Django<1.10
|
||||
dj110: Django<1.11
|
||||
dj111: Django<1.12
|
||||
|
|
|
|||
Loading…
Reference in a new issue