Skip to content

Commit

Permalink
Merge pull request #1995 from yakky/feature/django_16
Browse files Browse the repository at this point in the history
WiP Django 1.6 support
  • Loading branch information
yakky committed Dec 9, 2013
2 parents 5db5a3f + 4a6481e commit 590ff7e
Show file tree
Hide file tree
Showing 38 changed files with 183 additions and 99 deletions.
28 changes: 27 additions & 1 deletion .travis.yml
Expand Up @@ -10,6 +10,12 @@ env:
- DJANGO=1.5 DATABASE_URL='sqlite://localhost/:memory:'
- DJANGO=1.5 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- DJANGO=1.5 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
- DJANGO=1.6 DATABASE_URL='sqlite://localhost/:memory:'
- DJANGO=1.6 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- DJANGO=1.6 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
- DJANGO=trunk DATABASE_URL='sqlite://localhost/:memory:'
- DJANGO=trunk DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- DJANGO=trunk DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'

before_script:
- sh -c "if [ '$DATABASE_URL' = 'postgres://postgres@127.0.0.1/djangocms_test' ]; then psql -c 'DROP DATABASE IF EXISTS djangocms_test;' -U postgres; fi"
Expand Down Expand Up @@ -38,7 +44,6 @@ notifications:
- "irc.freenode.org#django-cms"
- "irc.freenode.org#django-cms-sprint"


matrix:
exclude:
- python: 3.3
Expand All @@ -49,3 +54,24 @@ matrix:
env: DJANGO=1.4 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
- python: 3.3
env: DJANGO=1.5 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- python: 3.3
env: DJANGO=1.6 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- python: 2.6
env: DJANGO=trunk DATABASE_URL='sqlite://localhost/:memory:'
- python: 2.6
env: DJANGO=trunk DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
- python: 2.6
env: DJANGO=trunk DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
allow_failures:
- python: 3.3
env: DJANGO=trunk DATABASE_URL='sqlite://localhost/:memory:'
- python: 3.3
env: DJANGO=trunk DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- python: 3.3
env: DJANGO=trunk DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
- python: 2.7
env: DJANGO=trunk DATABASE_URL='sqlite://localhost/:memory:'
- python: 2.7
env: DJANGO=trunk DATABASE_URL='mysql://root@127.0.0.1/djangocms_test'
- python: 2.7
env: DJANGO=trunk DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test'
4 changes: 2 additions & 2 deletions cms/admin/change_list.py
Expand Up @@ -51,15 +51,15 @@ def __init__(self, request, *args, **kwargs):
self._current_site = current_site(request)
super(CMSChangeList, self).__init__(request, *args, **kwargs)
try:
self.query_set = self.get_query_set(request)
self.queryset = self.get_query_set(request)
except:
raise
self.get_results(request)

if self._current_site:
request.session['cms_admin_site'] = self._current_site.pk
self.set_sites(request)

def get_query_set(self, request=None):
if COPY_VAR in self.params:
del self.params[COPY_VAR]
Expand Down
12 changes: 7 additions & 5 deletions cms/admin/pageadmin.py
@@ -1,12 +1,10 @@
# -*- coding: utf-8 -*-
from distutils.version import LooseVersion
from functools import wraps
import sys
from cms.admin.placeholderadmin import PlaceholderAdmin
from cms.plugin_pool import plugin_pool
from django.contrib.admin.helpers import AdminForm

import django
from django.conf import settings
from django.contrib import admin, messages
from django.contrib.admin.models import LogEntry, CHANGE
Expand Down Expand Up @@ -44,8 +42,8 @@

from cms.utils.permissions import has_global_page_permission, has_generic_permission
from cms.utils.plugins import current_site
from cms.utils.compat import DJANGO_1_4

DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5')
require_POST = method_decorator(require_POST)

if 'reversion' in settings.INSTALLED_APPS:
Expand Down Expand Up @@ -85,6 +83,7 @@ def create_revision():
return ReversionContext()

PUBLISH_COMMENT = "Publish"
INITIAL_COMMENT = "Initial version."


class PageAdmin(PlaceholderAdmin, ModelAdmin):
Expand Down Expand Up @@ -142,6 +141,8 @@ def redirect_jsi18n(self, request):

def get_revision_instances(self, request, object):
"""Returns all the instances to be used in the object's revision."""
if isinstance(object, Title):
object = object.page
placeholder_relation = find_placeholder_relation(object)
data = [object]
filters = {'placeholder__%s' % placeholder_relation: object}
Expand Down Expand Up @@ -921,9 +922,10 @@ def publish_page(self, request, page_id):
from reversion.models import Version

content_type = ContentType.objects.get_for_model(Page)
versions_qs = Version.objects.filter(type=1, content_type=content_type, object_id_int=page.pk)
# reversion 1.8+ removes type field, revision filtering must be based on comments
versions_qs = Version.objects.filter(content_type=content_type, object_id_int=page.pk)
deleted = []
for version in versions_qs.exclude(revision__comment__exact=PUBLISH_COMMENT):
for version in versions_qs.exclude(revision__comment__in=(INITIAL_COMMENT, PUBLISH_COMMENT)):
if not version.revision_id in deleted:
revision = version.revision
revision.delete()
Expand Down
2 changes: 1 addition & 1 deletion cms/admin/permissionadmin.py
Expand Up @@ -70,7 +70,7 @@ def get_formset(self, request, obj=None, **kwargs):
if not obj.has_move_page_permission(request):
exclude.append('can_move_page')
formset_cls = super(PagePermissionInlineAdmin, self
).get_formset(request, obj=None, exclude=exclude, *kwargs)
).get_formset(request, obj=None, exclude=exclude, **kwargs)
qs = self.queryset(request)
if obj is not None:
qs = qs.filter(page=obj)
Expand Down
11 changes: 6 additions & 5 deletions cms/admin/placeholderadmin.py
Expand Up @@ -3,7 +3,7 @@
from django.contrib.admin.helpers import AdminForm
from django.utils.decorators import method_decorator
from django.db import transaction
from django.utils import simplejson
import json

from django.views.decorators.clickjacking import xframe_options_sameorigin
from cms.constants import PLUGIN_COPY_ACTION, PLUGIN_MOVE_ACTION
Expand All @@ -15,7 +15,8 @@
from cms.utils.compat.dj import force_unicode
from cms.plugins.utils import has_reached_plugin_limit, requires_reload
from django.contrib.admin import ModelAdmin
from django.http import HttpResponse, Http404, HttpResponseBadRequest, HttpResponseForbidden
from django.http import (HttpResponse, Http404, HttpResponseBadRequest,
HttpResponseForbidden)
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.template.defaultfilters import force_escape, escapejs
Expand Down Expand Up @@ -271,7 +272,7 @@ def add_plugin(self, request):
args=[plugin.pk])),
'breadcrumb': plugin.get_breadcrumb(),
}
return HttpResponse(simplejson.dumps(response), content_type='application/json')
return HttpResponse(json.dumps(response), content_type='application/json')

@method_decorator(require_POST)
@xframe_options_sameorigin
Expand Down Expand Up @@ -319,7 +320,7 @@ def copy_plugins(self, request):
'desc': force_unicode(plugin.get_short_description())})
self.post_copy_plugins(request, source_placeholder, target_placeholder, plugins)
json_response = {'plugin_list': reduced_list, 'reload': reload_required}
return HttpResponse(simplejson.dumps(json_response), content_type='application/json')
return HttpResponse(json.dumps(json_response), content_type='application/json')

@xframe_options_sameorigin
def edit_plugin(self, request, plugin_id):
Expand Down Expand Up @@ -440,7 +441,7 @@ def move_plugin(self, request):
x += 1
self.post_move_plugin(request, plugin)
json_response = {'reload': requires_reload(PLUGIN_MOVE_ACTION, [plugin])}
return HttpResponse(simplejson.dumps(json_response), content_type='application/json')
return HttpResponse(json.dumps(json_response), content_type='application/json')

@xframe_options_sameorigin
def delete_plugin(self, request, plugin_id):
Expand Down
25 changes: 15 additions & 10 deletions cms/models/pagemodel.py
@@ -1,22 +1,23 @@
# -*- coding: utf-8 -*-
from datetime import timedelta

from os.path import join
from cms import constants
from cms.constants import TEMPLATE_INHERITANCE_MAGIC
from cms.utils.compat.metaclasses import with_metaclass
from cms.utils.conf import get_cms_setting
from django.core.exceptions import PermissionDenied
from cms.exceptions import PublicIsUnmodifiable
from cms.models.managers import PageManager, PagePermissionsPermissionManager
from cms.models.metaclasses import PageMetaClass
from cms.models.placeholdermodel import Placeholder
from cms.models.pluginmodel import CMSPlugin
from cms.publisher.errors import MpttPublisherCantPublish
from cms.utils import i18n, page as page_utils
from cms.utils.compat import DJANGO_1_5
from cms.utils.compat.dj import force_unicode, python_2_unicode_compatible
from cms.utils.compat.metaclasses import with_metaclass
from cms.utils.conf import get_cms_setting
from cms.utils.copy_plugins import copy_plugins_to
from cms.utils.helpers import reversion_register
from cms.utils.compat.dj import force_unicode, python_2_unicode_compatible
from django.contrib.sites.models import Site
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
from django.db import models
from django.db.models import Q
Expand All @@ -25,7 +26,6 @@
from django.utils.translation import get_language, ugettext_lazy as _
from menus.menu_pool import menu_pool
from mptt.models import MPTTModel
from os.path import join


@python_2_unicode_compatible
Expand Down Expand Up @@ -62,7 +62,7 @@ class Page(with_metaclass(PageMetaClass, MPTTModel)):
reverse_id = models.CharField(_("id"), max_length=40, db_index=True, blank=True, null=True, help_text=_(
"An unique identifier that is used with the page_url templatetag for linking to this page"))
navigation_extenders = models.CharField(_("attached menu"), max_length=80, db_index=True, blank=True, null=True)
published = models.BooleanField(_("is published"), blank=True)
published = models.BooleanField(_("is published"), blank=True, default=False)

template = models.CharField(_("template"), max_length=100, choices=template_choices,
help_text=_('The template used to render the content.'),
Expand All @@ -73,7 +73,7 @@ class Page(with_metaclass(PageMetaClass, MPTTModel)):
limit_visibility_in_menu = models.SmallIntegerField(_("menu visibility"), default=None, null=True, blank=True,
choices=LIMIT_VISIBILITY_IN_MENU_CHOICES, db_index=True,
help_text=_("limit when this page is visible in the menu"))
is_home = models.BooleanField(editable=False, db_index=True)
is_home = models.BooleanField(editable=False, db_index=True, default=False)
application_urls = models.CharField(_('application'), max_length=200, blank=True, null=True, db_index=True)
application_namespace = models.CharField(_('application namespace'), max_length=200, blank=True, null=True)
level = models.PositiveIntegerField(db_index=True, editable=False)
Expand Down Expand Up @@ -373,7 +373,10 @@ def save(self, no_signals=False, commit=True, **kwargs):

if commit:
if no_signals: # ugly hack because of mptt
self.save_base(cls=self.__class__, **kwargs)
if DJANGO_1_5:
self.save_base(cls=self.__class__, **kwargs)
else:
self.save_base(**kwargs)
else:
super(Page, self).save(**kwargs)

Expand All @@ -392,6 +395,8 @@ def save_base(self, *args, **kwargs):
if keep_state:
delattr(self, '_publisher_keep_state')

if not DJANGO_1_5 and 'cls' in kwargs:
del(kwargs['cls'])
ret = super(Page, self).save_base(*args, **kwargs)
return ret

Expand Down Expand Up @@ -1106,4 +1111,4 @@ def _reversion():
)


_reversion()
_reversion()
31 changes: 18 additions & 13 deletions cms/models/pluginmodel.py
@@ -1,23 +1,25 @@
# -*- coding: utf-8 -*-
from datetime import date
from cms.utils.compat.metaclasses import with_metaclass

from django.core.urlresolvers import reverse, NoReverseMatch
from django.utils.safestring import mark_safe
import os
import warnings
import json

from cms.exceptions import DontUsePageAttributeWarning
from cms.models.placeholdermodel import Placeholder
from cms.plugin_rendering import PluginContext, render_plugin
from cms.utils import get_cms_setting
from cms.utils.compat import DJANGO_1_5
from cms.utils.compat.dj import force_unicode, python_2_unicode_compatible
from cms.utils.compat.metaclasses import with_metaclass
from cms.utils.helpers import reversion_register
from django.core.urlresolvers import reverse, NoReverseMatch
from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.db import models
from django.db.models.base import model_unpickle
from django.db.models.query_utils import DeferredAttribute
from django.utils import timezone, simplejson
from django.utils import timezone
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from cms.exceptions import DontUsePageAttributeWarning
from cms.models.placeholdermodel import Placeholder
from cms.plugin_rendering import PluginContext, render_plugin
from cms.utils.helpers import reversion_register
from cms.utils.compat.dj import force_unicode, python_2_unicode_compatible
from cms.utils import get_cms_setting
from mptt.models import MPTTModel, MPTTModelBase


Expand Down Expand Up @@ -243,7 +245,10 @@ def get_instance_icon_alt(self):

def save(self, no_signals=False, *args, **kwargs):
if no_signals: # ugly hack because of mptt
super(CMSPlugin, self).save_base(cls=self.__class__)
if DJANGO_1_5:
super(CMSPlugin, self).save_base(cls=self.__class__)
else:
super(CMSPlugin, self).save_base()
else:
super(CMSPlugin, self).save()

Expand Down Expand Up @@ -386,7 +391,7 @@ def get_breadcrumb(self):
return breadcrumb

def get_breadcrumb_json(self):
result = simplejson.dumps(self.get_breadcrumb())
result = json.dumps(self.get_breadcrumb())
result = mark_safe(result)
return result

Expand Down
16 changes: 9 additions & 7 deletions cms/plugin_base.py
@@ -1,26 +1,28 @@
# -*- coding: utf-8 -*-
from distutils.version import LooseVersion
from cms.constants import PLUGIN_MOVE_ACTION, PLUGIN_COPY_ACTION
from cms.utils.compat.metaclasses import with_metaclass
try:
from django.contrib.admin.options import (RenameBaseModelAdminMethods as
ModelAdminMetaClass)
except ImportError:
from django.forms.widgets import (MediaDefiningClass as ModelAdminMetaClass)
import re

from cms.constants import PLUGIN_MOVE_ACTION, PLUGIN_COPY_ACTION
from cms.utils import get_cms_setting
from cms.utils.compat import DJANGO_1_4
from cms.utils.compat.metaclasses import with_metaclass
from cms.utils.placeholder import get_placeholder_conf
from cms.utils.compat.dj import force_unicode, python_2_unicode_compatible
from cms.exceptions import SubClassNeededError, Deprecated
from cms.models import CMSPlugin
import django
from django import forms
from django.core.urlresolvers import reverse
from django.contrib import admin
from django.core.exceptions import ImproperlyConfigured
from django.forms.models import ModelForm
from django.utils.encoding import smart_str
from django.utils.translation import ugettext_lazy as _

DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5')

class CMSPluginBaseMetaclass(forms.MediaDefiningClass):
class CMSPluginBaseMetaclass(ModelAdminMetaClass):
"""
Ensure the CMSPlugin subclasses have sane values and set some defaults if
they're not given.
Expand Down
2 changes: 1 addition & 1 deletion cms/plugin_pool.py
Expand Up @@ -7,7 +7,7 @@
from cms.utils.compat.dj import force_unicode
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.conf.urls.defaults import url, patterns, include
from django.conf.urls import url, patterns, include
from django.contrib.formtools.wizard.views import normalize_name
from django.template.defaultfilters import slugify
from django.utils.translation import get_language, deactivate_all, activate
Expand Down
2 changes: 1 addition & 1 deletion cms/stacks/forms.py
Expand Up @@ -20,4 +20,4 @@ class StackInsertionForm(forms.Form):
class StackCreationForm(forms.ModelForm):
class Meta:
model = Stack
exclude = 'content'
exclude = ('content',)
3 changes: 2 additions & 1 deletion cms/templatetags/cms_admin.py
Expand Up @@ -188,7 +188,8 @@ def get_context(self, context):
advanced_settings = context.get('basic_info', False)
language = context['language']
return {
'onclick_attrib': (opts.get_ordered_objects() and change
# TODO check this (old code: opts.get_ordered_objects() )
'onclick_attrib': (opts and change
and 'onclick="submitOrderForm();"' or ''),
'show_delete_link': False,
'show_save_as_new': not is_popup and change and save_as,
Expand Down

0 comments on commit 590ff7e

Please sign in to comment.