Skip to content
This repository has been archived by the owner on Jul 21, 2021. It is now read-only.

Commit

Permalink
Porting to Python 3 from Python 2
Browse files Browse the repository at this point in the history
- Porting to Python 3 from Python 2
- Fix tests due to the porting
  • Loading branch information
lambdalisue committed Dec 9, 2015
1 parent 7a2fcf1 commit bc3ed16
Show file tree
Hide file tree
Showing 58 changed files with 197 additions and 289 deletions.
3 changes: 2 additions & 1 deletion .coveragerc
Expand Up @@ -4,7 +4,8 @@ include =
tests/*.py
omit =
src/permission/__init__.py
src/permission/tests/compatatibility.py
src/permission/compat.py
src/permission/tests/compat.py
exclude_lines =
pragma: no cover
if __name__ == .__main__.:
4 changes: 2 additions & 2 deletions .travis.yml
Expand Up @@ -2,11 +2,11 @@ sudo: false
language: python

install:
- pip install "tox>=1.8"
- pip install tox detox
- pip install coverage coveralls

script:
- tox -r
- detox -r

after_success:
- coverage report
Expand Down
4 changes: 2 additions & 2 deletions docs/permission.tests.rst
Expand Up @@ -14,10 +14,10 @@ Subpackages
Submodules
----------

permission.tests.compatibility module
permission.tests.compat module
-------------------------------------

.. automodule:: permission.tests.compatibility
.. automodule:: permission.tests.compat
:members:
:undoc-members:
:show-inheritance:
Expand Down
31 changes: 11 additions & 20 deletions runtests.py
Expand Up @@ -11,20 +11,12 @@
import os
import sys

BASE_DIR = os.path.dirname(__file__)

def parse_args():
import optparse
parser = optparse.OptionParser()
parser.add_option('--where', default=None)
opts, args = parser.parse_args()
return opts, args


def run_tests(base_dir=None, apps=None, verbosity=1, interactive=False):
base_dir = base_dir or os.path.dirname(__file__)
def run_tests(apps=None, verbosity=1, interactive=False):
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
sys.path.insert(0, os.path.join(base_dir, 'src'))
sys.path.insert(0, os.path.join(base_dir, 'tests'))
sys.path.insert(0, os.path.join(BASE_DIR, 'src'))
sys.path.insert(0, os.path.join(BASE_DIR, 'tests'))

import django
if django.VERSION >= (1, 7):
Expand All @@ -33,18 +25,17 @@ def run_tests(base_dir=None, apps=None, verbosity=1, interactive=False):
from django.conf import settings
from django.test.utils import get_runner
TestRunner = get_runner(settings)
test_runner = TestRunner(verbosity=verbosity,
interactive=interactive, failfast=False)
test_runner = TestRunner(
verbosity=verbosity,
interactive=interactive,
failfast=False
)
if apps:
app_tests = [x.strip() for x in apps if x]
else:
app_tests = [
'permission',
]
app_tests = ['permission']
failures = test_runner.run_tests(app_tests)
sys.exit(bool(failures))


if __name__ == '__main__':
opts, args = parse_args()
run_tests(opts.where, args)
run_tests(apps=sys.argv[1:])
10 changes: 0 additions & 10 deletions setup.py
Expand Up @@ -19,15 +19,6 @@ def readlist(filename):
rows = [x.strip() for x in rows if x.strip()]
return list(rows)

# if we are running on python 3, enable 2to3 and
# let it use the custom fixers from the custom_fixers
# package.
extra = {}
if sys.version_info >= (3, 0):
extra.update(
use_2to3=True,
)

setup(
name=NAME,
version=VERSION,
Expand Down Expand Up @@ -72,5 +63,4 @@ def readlist(filename):
install_requires=readlist('requirements.txt'),
test_suite='runtests.run_tests',
tests_require=readlist('requirements-test.txt'),
**extra
)
6 changes: 1 addition & 5 deletions src/permission/__init__.py
@@ -1,10 +1,6 @@
# coding=utf-8
"""
django-permission
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from app_version import get_versions
__version__, VERSION = get_versions('django-permission', allow_ambiguous=True)

# load shortcut functions
from permission.utils.logics import add_permission_logic
from permission.utils.logics import remove_permission_logic
Expand Down
11 changes: 8 additions & 3 deletions src/permission/backends.py
Expand Up @@ -2,13 +2,14 @@
"""
Logical permission backends module
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
__all__ = ('PermissionBackend',)
from permission.conf import settings
from permission.utils.handlers import registry
from permission.utils.permissions import perm_to_permission


__all__ = ('PermissionBackend',)


class PermissionBackend(object):
"""
A handler based permission backend
Expand Down Expand Up @@ -57,7 +58,11 @@ def has_perm(self, user_obj, perm, obj=None):
if settings.PERMISSION_CHECK_PERMISSION_PRESENCE:
# get permission instance from string permission (perm)
# it raise ObjectDoesNotExists when the permission is not exists
perm_to_permission(perm)
try:
perm_to_permission(perm)
except AttributeError:
# Django 1.2 internally use wrong permission string thus ignore
pass

# get permission handlers fot this perm
cache_name = '_%s_cache' % perm
Expand Down
23 changes: 13 additions & 10 deletions src/permission/compat.py
@@ -1,10 +1,8 @@
# coding=utf-8
"""
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
import django

try:
import collections

def isiterable(x):
return isinstance(x, collections.Iterable)
except ImportError:
Expand All @@ -15,22 +13,27 @@ def isiterable(x):
except TypeError:
return False


try:
from django.template.base import add_to_builtins
except ImportError:
from django.template.loader import add_to_builtins

import django
if django.VERSION < (1, 8):
# Fix: RemovedInDjango19Warning
from django.utils.importlib import import_module
else:
try:
# django.utils.importlib is removed from Django 1.9
from importlib import import_module
except ImportError:
from django.utils.importlib import import_module

try:
# Django 1.7 or over use the new application loading system
from django.apps import apps
get_model = apps.get_model
except ImportError:
from django.db.models.loading import get_model

try:
# Python 3
from urllib.parse import urlparse
except ImportError:
# Python 2
from urlparse import urlparse
5 changes: 3 additions & 2 deletions src/permission/conf.py
Expand Up @@ -2,14 +2,15 @@
"""
django-permission application configure
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
__all__ = ('settings',)
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from appconf import AppConf
from permission.handlers import LogicalPermissionHandler


__all__ = ('settings',)


class PermissionConf(AppConf):
DEFAULT_PERMISSION_HANDLER = LogicalPermissionHandler
"""Default permission handler class"""
Expand Down
2 changes: 1 addition & 1 deletion src/permission/decorators/__init__.py
@@ -1 +1 @@
from permission_required import permission_required
from permission.decorators.permission_required import permission_required
7 changes: 3 additions & 4 deletions src/permission/decorators/classbase.py
Expand Up @@ -2,13 +2,12 @@
"""
permission_required decorator for generic classbased view from django 1.3
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from functools import wraps
from django.utils.decorators import available_attrs
from django.core.exceptions import PermissionDenied

from permission.decorators.utils import redirect_to_login


def permission_required(perm, queryset=None,
login_url=None, raise_exception=False):
"""
Expand Down Expand Up @@ -63,7 +62,7 @@ def get_object_from_classbased_instance(
instance, queryset, request, *args, **kwargs):
"""
Get object from an instance of classbased generic view
Parameters
----------
instance : instance
Expand Down Expand Up @@ -93,7 +92,7 @@ def get_object_from_classbased_instance(
queryset = instance.queryset
elif hasattr(instance, 'model') and not queryset:
queryset = instance.model._default_manager.all()

# get object
if hasattr(instance, 'get_object'):
try:
Expand Down
4 changes: 1 addition & 3 deletions src/permission/decorators/functionbase.py
Expand Up @@ -2,13 +2,11 @@
"""
permission_required decorator for generic function view
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
import copy
from functools import wraps
from django.shortcuts import get_object_or_404
from django.utils.decorators import available_attrs
from django.core.exceptions import PermissionDenied

from permission.decorators.utils import redirect_to_login


Expand Down Expand Up @@ -137,7 +135,7 @@ def get_object_from_date_based_view(request, *args, **kwargs):
object_id = kwargs.get('object_id', None)
slug = kwargs.get('slug', None)
slug_field = kwargs.get('slug_field', 'slug')

try:
tt = time.strptime(
'%s-%s-%s' % (year, month, day),
Expand Down
4 changes: 1 addition & 3 deletions src/permission/decorators/methodbase.py
Expand Up @@ -2,12 +2,10 @@
"""
permission_required decorator for generic classbased/functionbased view
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from functools import wraps
from django.http import HttpRequest
from django.utils.decorators import available_attrs
from django.core.exceptions import PermissionDenied

from permission.decorators.utils import redirect_to_login


Expand Down Expand Up @@ -68,7 +66,7 @@ def inner(self, request=None, *args, **kwargs):
obj = get_object_from_classbased_instance(
self, queryset, request, *args, **kwargs
)

if not request.user.has_perm(perm, obj=obj):
if raise_exception:
raise PermissionDenied
Expand Down
10 changes: 3 additions & 7 deletions src/permission/decorators/permission_required.py
@@ -1,17 +1,13 @@
# coding=utf-8
"""
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
# coding=utf-8
"""
Decorator module for permission
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
__all__ = ['permission_required']
import inspect
from django.db.models import Model


__all__ = ['permission_required']


def permission_required(perm, queryset_or_model=None,
login_url=None, raise_exception=False):
"""
Expand Down
12 changes: 7 additions & 5 deletions src/permission/decorators/utils.py
Expand Up @@ -2,11 +2,13 @@
"""
Decorator utility module
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
__all__ = ['redirect_to_login']
import urlparse
from django.contrib.auth import REDIRECT_FIELD_NAME
from permission.conf import settings
from permission.compat import urlparse


__all__ = ['redirect_to_login']


def redirect_to_login(request, login_url=None,
redirect_field_name=REDIRECT_FIELD_NAME):
Expand All @@ -15,8 +17,8 @@ def redirect_to_login(request, login_url=None,
# if the login url is the same scheme and net location then just
# use the path as the "next" url.
login_scheme, login_netloc = \
urlparse.urlparse(login_url or settings.LOGIN_URL)[:2]
current_scheme, current_netloc = urlparse.urlparse(path)[:2]
urlparse(login_url or settings.LOGIN_URL)[:2]
current_scheme, current_netloc = urlparse(path)[:2]
if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path()
Expand Down
5 changes: 1 addition & 4 deletions src/permission/handlers.py
@@ -1,10 +1,7 @@
# coding=utf-8
"""
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
import collections
from permission.utils.permissions import get_app_perms
from permission.utils.permissions import get_model_perms
import collections


class PermissionHandler(object):
Expand Down
1 change: 0 additions & 1 deletion src/permission/logics/__init__.py
Expand Up @@ -2,7 +2,6 @@
"""
Permission logic module
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from permission.logics.base import PermissionLogic
from permission.logics.author import AuthorPermissionLogic
from permission.logics.collaborators import CollaboratorsPermissionLogic
Expand Down
1 change: 0 additions & 1 deletion src/permission/logics/author.py
Expand Up @@ -2,7 +2,6 @@
"""
Permission logic module for author based permission system
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from permission.conf import settings
from permission.logics.base import PermissionLogic
from permission.utils.field_lookup import field_lookup
Expand Down
3 changes: 0 additions & 3 deletions src/permission/logics/base.py
@@ -1,7 +1,4 @@
# coding=utf-8
"""
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'


class PermissionLogic(object):
Expand Down
1 change: 0 additions & 1 deletion src/permission/logics/collaborators.py
Expand Up @@ -2,7 +2,6 @@
"""
Permission logic module for collaborators based permission system
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from permission.conf import settings
from permission.logics.base import PermissionLogic
from permission.utils.field_lookup import field_lookup
Expand Down
1 change: 0 additions & 1 deletion src/permission/logics/groupin.py
Expand Up @@ -2,7 +2,6 @@
"""
Permission logic module for group based permission system
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
from permission.conf import settings
from permission.logics.base import PermissionLogic

Expand Down

0 comments on commit bc3ed16

Please sign in to comment.