Skip to content

Commit

Permalink
Merge pull request #522 from nephila/feature/django18
Browse files Browse the repository at this point in the history
First batch of Django 1.8 compatibility
  • Loading branch information
yakky committed May 1, 2015
2 parents 7b0bf6a + 2d2068f commit 04b4473
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 46 deletions.
18 changes: 18 additions & 0 deletions .travis.yml
Expand Up @@ -19,6 +19,8 @@ env:
- DJANGO="Django>=1.6,<1.7" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- DJANGO="Django>=1.7,<1.8" EASY_THUMBNAILS="easy-thumbnails>2.0"
- DJANGO="Django>=1.7,<1.8" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0"
- DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- DJANGO="https://github.com/django/django/archive/master.zip" EASY_THUMBNAILS="easy-thumbnails>2.0"

script: coverage run --rcfile=coverage.rc test_settings.py
Expand All @@ -33,6 +35,10 @@ matrix:
env: DJANGO="Django>=1.7,<1.8" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 2.6
env: DJANGO="Django>=1.7,<1.8" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- python: 2.6
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 2.6
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- python: 2.6
env: DJANGO="https://github.com/django/django/archive/master.zip" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 3.3
Expand All @@ -46,3 +52,15 @@ matrix:
env: DJANGO="https://github.com/django/django/archive/master.zip" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 3.4
env: DJANGO="https://github.com/django/django/archive/master.zip" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 2.7
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 3.3
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 3.4
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0"
- python: 2.7
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- python: 3.3
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
- python: 3.4
env: DJANGO="Django>=1.8,<1.9" EASY_THUMBNAILS="easy-thumbnails>2.0" CUSTOM_IMAGE="filer.test_utils.custom_image.models.Image"
58 changes: 29 additions & 29 deletions filer/admin/folderadmin.py
@@ -1,51 +1,52 @@
#-*- coding: utf-8 -*-
from __future__ import unicode_literals
import itertools
import os
import re

from django import forms
from django import template
from django.core.exceptions import ValidationError
from django import forms, template
from django.conf import settings as django_settings
from django.contrib import messages
from django.contrib.admin import helpers
from django.contrib.admin.util import quote, unquote, capfirst
from django.contrib import messages
from django.utils.http import urlquote
from filer.admin.patched.admin_utils import get_deleted_objects
from django.core.exceptions import ValidationError
from django.core.exceptions import PermissionDenied
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse
from django.db import router, models
from django.db.models import Q
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext

try:
from django.utils.encoding import force_text
except ImportError:
# Django < 1.5
from django.utils.encoding import force_unicode as force_text
from django.utils.html import escape
from django.utils.http import urlquote
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
from django.utils.translation import ungettext, ugettext_lazy

from filer import settings
from filer.admin.forms import (CopyFilesAndFoldersForm, ResizeImagesForm,
RenameFilesForm)
from filer.admin.permissions import PrimitivePermissionAwareModelAdmin
from filer.views import (popup_status, popup_param, selectfolder_status,
selectfolder_param)
from filer.admin.tools import (userperms_for_request,
check_folder_edit_permissions,
check_files_edit_permissions,
check_files_read_permissions,
check_folder_read_permissions)
from filer.admin.patched.admin_utils import get_deleted_objects
from filer.admin.tools import (userperms_for_request,
check_folder_edit_permissions,
check_files_edit_permissions,
check_files_read_permissions,
check_folder_read_permissions)
from filer.models import (Folder, FolderRoot, UnfiledImages, File, tools,
ImagesWithMissingData, FolderPermission, Image)
from filer.settings import FILER_STATICMEDIA_PREFIX, FILER_PAGINATE_BY
from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer
from filer.thumbnail_processors import normalize_subject_location
from django.conf import settings as django_settings
import os
import re
import itertools
from filer.utils.compatibility import get_delete_permission
from filer.utils.filer_easy_thumbnails import FilerActionThumbnailer
from filer.views import (popup_status, popup_param, selectfolder_status,
selectfolder_param)


class AddFolderPopupForm(forms.ModelForm):
Expand Down Expand Up @@ -301,8 +302,8 @@ def directory_listing(self, request, folder_id=None, viewtype=None):
perms = FolderPermission.objects.get_read_id_list(request.user)
root_exclude_kw = {'parent__isnull': False, 'parent__id__in': perms}
if perms != 'All':
file_qs = file_qs.filter(Q(folder__id__in=perms) | Q(owner=request.user))
folder_qs = folder_qs.filter(Q(id__in=perms) | Q(owner=request.user))
file_qs = file_qs.filter(models.Q(folder__id__in=perms) | models.Q(owner=request.user))
folder_qs = folder_qs.filter(models.Q(id__in=perms) | models.Q(owner=request.user))
else:
root_exclude_kw.pop('parent__id__in')
if folder.is_root:
Expand Down Expand Up @@ -414,19 +415,19 @@ def directory_listing(self, request, folder_id=None, viewtype=None):

def filter_folder(self, qs, terms=[]):
for term in terms:
filters = Q(name__icontains=term)
filters = models.Q(name__icontains=term)
for filter_ in self.get_owner_filter_lookups():
filters |= Q(**{filter_: term})
filters |= models.Q(**{filter_: term})
qs = qs.filter(filters)
return qs

def filter_file(self, qs, terms=[]):
for term in terms:
filters = (Q(name__icontains=term) |
Q(description__icontains=term) |
Q(original_filename__icontains=term))
filters = (models.Q(name__icontains=term) |
models.Q(description__icontains=term) |
models.Q(original_filename__icontains=term))
for filter_ in self.get_owner_filter_lookups():
filters |= Q(**{filter_: term})
filters |= models.Q(**{filter_: term})
qs = qs.filter(filters)
return qs

Expand Down Expand Up @@ -732,8 +733,7 @@ def _format_callback(self, obj, user, admin_site, perms_needed):
opts.app_label,
opts.object_name.lower()),
None, (quote(obj._get_pk_val()),))
p = '%s.%s' % (opts.app_label,
opts.get_delete_permission())
p = get_delete_permission(opts)
if not user.has_perm(p):
perms_needed.add(opts.verbose_name)
# Display a link to the admin page.
Expand Down
7 changes: 4 additions & 3 deletions filer/admin/patched/admin_utils.py
Expand Up @@ -11,6 +11,7 @@
from __future__ import unicode_literals

from django.contrib.admin.util import NestedObjects, quote
from django.core.urlresolvers import reverse
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.text import capfirst
Expand All @@ -19,7 +20,8 @@
except ImportError:
# Django < 1.5
from django.utils.encoding import force_unicode as force_text
from django.core.urlresolvers import reverse

from filer.utils.compatibility import get_delete_permission


def get_deleted_objects(objs, opts, user, admin_site, using):
Expand Down Expand Up @@ -47,8 +49,7 @@ def format_callback(obj):
opts.app_label,
opts.object_name.lower()),
None, (quote(obj._get_pk_val()),))
p = '%s.%s' % (opts.app_label,
opts.get_delete_permission())
p = get_delete_permission(opts)
if not user.has_perm(p):
perms_needed.add(opts.verbose_name)
# Display a link to the admin page.
Expand Down
9 changes: 7 additions & 2 deletions filer/admin/permissions.py
Expand Up @@ -2,6 +2,8 @@
from django.contrib import admin
from django.core.urlresolvers import reverse

from filer.utils.compatibility import DJANGO_1_7


class PrimitivePermissionAwareModelAdmin(admin.ModelAdmin):
def has_add_permission(self, request):
Expand All @@ -28,7 +30,10 @@ def _get_post_url(self, obj):
and admin url may change """
## Code borrowed from django ModelAdmin to determine changelist on the fly
opts = obj._meta
module_name = opts.module_name
if DJANGO_1_7:
model_name = opts.module_name
else:
model_name = opts.model_name
return reverse('admin:%s_%s_changelist' %
(opts.app_label, module_name),
(opts.app_label, model_name),
current_app=self.admin_site.name)
17 changes: 9 additions & 8 deletions filer/models/filemodels.py
@@ -1,7 +1,6 @@
#-*- coding: utf-8 -*-
from __future__ import unicode_literals

import django
import hashlib
import os

Expand All @@ -10,12 +9,14 @@
from django.core.files.base import ContentFile
from django.db import models
from django.utils.translation import ugettext_lazy as _

from polymorphic import PolymorphicModel, PolymorphicManager

from filer import settings as filer_settings
from filer.fields.multistorage_file import MultiStorageFileField
from filer.models import mixins
from filer import settings as filer_settings
from filer.models.foldermodels import Folder
from filer.utils.compatibility import python_2_unicode_compatible
from polymorphic import PolymorphicModel, PolymorphicManager
from filer.utils.compatibility import python_2_unicode_compatible, DJANGO_1_7


class FileManager(PolymorphicManager):
Expand Down Expand Up @@ -218,13 +219,13 @@ def __str__(self):
return text

def get_admin_url_path(self):
if django.VERSION < (1, 7):
module_name = self._meta.module_name
if DJANGO_1_7:
model_name = self._meta.module_name
else:
module_name = self._meta.model_name
model_name = self._meta.model_name
return urlresolvers.reverse(
'admin:%s_%s_change' % (self._meta.app_label,
module_name,),
model_name,),
args=(self.pk,)
)

Expand Down
19 changes: 17 additions & 2 deletions filer/utils/compatibility.py
@@ -1,7 +1,8 @@
# -*- coding: utf-8 -*-
from distutils.version import LooseVersion
import django
import sys

import django
from django.utils import six

try:
Expand All @@ -16,6 +17,10 @@ def truncate_words(s, num, end_text='...'):
truncate_words = allow_lazy(truncate_words, six.text_type)

DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5')
DJANGO_1_5 = LooseVersion(django.get_version()) < LooseVersion('1.6')
DJANGO_1_6 = LooseVersion(django.get_version()) < LooseVersion('1.7')
DJANGO_1_7 = LooseVersion(django.get_version()) < LooseVersion('1.8')
DJANGO_1_8 = LooseVersion(django.get_version()) < LooseVersion('1.9')


if not six.PY3:
Expand Down Expand Up @@ -48,4 +53,14 @@ def python_2_unicode_compatible(klass):
return klass
except ImportError:
force_unicode = lambda s: str(s)
from django.utils.encoding import python_2_unicode_compatible
from django.utils.encoding import python_2_unicode_compatible


def get_delete_permission(opts):
try:
from django.contrib.auth import get_permission_codename
return '%s.%s' % (opts.app_label,
get_permission_codename('delete', opts))
except ImportError:
return '%s.%s' % (opts.app_label,
opts.get_delete_permission())
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -26,7 +26,7 @@ def read(fname):
install_requires = (
'Django>=1.4',
'easy-thumbnails>=1.0',
'django-mptt>=0.6,<0.6.2',
'django-mptt>=0.6',
'django_polymorphic>=0.2',
'Unidecode>=0.04',
),
Expand Down
15 changes: 14 additions & 1 deletion tox.ini
@@ -1,5 +1,5 @@
[tox]
envlist=py{26,27}-django{14}, py{26,27,33,34}-django{15,16}, py{27,33,34}-django{17,dev}, py{27,33,34}-django{16,17}-custom
envlist=py{26,27}-django{14}, py{26,27,33,34}-django{15,16}, py{27,33,34}-django{17,18}, py{27,33,34}-django{16,17,18}-custom


[testenv:docs]
Expand Down Expand Up @@ -27,6 +27,7 @@ deps=
django16: django<1.7
django16: south
django17: django<1.8
django18: django<1.9
djangodev: git+git://github.com/django/django.git#egg=Django
py26: unittest2
py26: argparse
Expand Down Expand Up @@ -55,3 +56,15 @@ setenv =
[testenv:py34-django17-custom]
setenv =
CUSTOM_IMAGE=filer.test_utils.custom_image.models.Image

[testenv:py27-django18-custom]
setenv =
CUSTOM_IMAGE=filer.test_utils.custom_image.models.Image

[testenv:py33-django18-custom]
setenv =
CUSTOM_IMAGE=filer.test_utils.custom_image.models.Image

[testenv:py34-django18-custom]
setenv =
CUSTOM_IMAGE=filer.test_utils.custom_image.models.Image

0 comments on commit 04b4473

Please sign in to comment.