diff --git a/.travis.yml b/.travis.yml index 756a55371b6..8cb4ac7e89f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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" @@ -38,7 +44,6 @@ notifications: - "irc.freenode.org#django-cms" - "irc.freenode.org#django-cms-sprint" - matrix: exclude: - python: 3.3 @@ -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' diff --git a/cms/admin/change_list.py b/cms/admin/change_list.py index a5707c7232e..5ddfadbe5f2 100644 --- a/cms/admin/change_list.py +++ b/cms/admin/change_list.py @@ -51,7 +51,7 @@ 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) @@ -59,7 +59,7 @@ def __init__(self, request, *args, **kwargs): 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] diff --git a/cms/admin/pageadmin.py b/cms/admin/pageadmin.py index 59f0ed89881..f6170cb8e30 100644 --- a/cms/admin/pageadmin.py +++ b/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 @@ -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: @@ -85,6 +83,7 @@ def create_revision(): return ReversionContext() PUBLISH_COMMENT = "Publish" +INITIAL_COMMENT = "Initial version." class PageAdmin(PlaceholderAdmin, ModelAdmin): @@ -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} @@ -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() diff --git a/cms/admin/permissionadmin.py b/cms/admin/permissionadmin.py index 11961d13197..19e9642c9a0 100644 --- a/cms/admin/permissionadmin.py +++ b/cms/admin/permissionadmin.py @@ -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) diff --git a/cms/admin/placeholderadmin.py b/cms/admin/placeholderadmin.py index 198a09e4910..60f524a1dc5 100644 --- a/cms/admin/placeholderadmin.py +++ b/cms/admin/placeholderadmin.py @@ -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 @@ -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 @@ -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 @@ -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): @@ -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): diff --git a/cms/models/pagemodel.py b/cms/models/pagemodel.py index 5e1c108632c..9ed9224fd89 100644 --- a/cms/models/pagemodel.py +++ b/cms/models/pagemodel.py @@ -1,11 +1,8 @@ # -*- 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 @@ -13,10 +10,14 @@ 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 @@ -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 @@ -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.'), @@ -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) @@ -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) @@ -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 @@ -1106,4 +1111,4 @@ def _reversion(): ) -_reversion() +_reversion() \ No newline at end of file diff --git a/cms/models/pluginmodel.py b/cms/models/pluginmodel.py index d8053c09922..0c425675e05 100644 --- a/cms/models/pluginmodel.py +++ b/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 @@ -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() @@ -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 diff --git a/cms/plugin_base.py b/cms/plugin_base.py index 7b823b3c563..005612bbeb9 100644 --- a/cms/plugin_base.py +++ b/cms/plugin_base.py @@ -1,16 +1,19 @@ # -*- 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 @@ -18,9 +21,8 @@ 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. diff --git a/cms/plugin_pool.py b/cms/plugin_pool.py index e1509e4ab2e..00d0cd9424c 100644 --- a/cms/plugin_pool.py +++ b/cms/plugin_pool.py @@ -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 diff --git a/cms/stacks/forms.py b/cms/stacks/forms.py index 820b1ff7477..9deaf8ad2a5 100644 --- a/cms/stacks/forms.py +++ b/cms/stacks/forms.py @@ -20,4 +20,4 @@ class StackInsertionForm(forms.Form): class StackCreationForm(forms.ModelForm): class Meta: model = Stack - exclude = 'content' + exclude = ('content',) diff --git a/cms/templatetags/cms_admin.py b/cms/templatetags/cms_admin.py index e5a8010bf3d..b1c05e7d584 100644 --- a/cms/templatetags/cms_admin.py +++ b/cms/templatetags/cms_admin.py @@ -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, diff --git a/cms/templatetags/cms_js_tags.py b/cms/templatetags/cms_js_tags.py index 198e7ef8427..9072e466bba 100644 --- a/cms/templatetags/cms_js_tags.py +++ b/cms/templatetags/cms_js_tags.py @@ -1,25 +1,21 @@ # -*- coding: utf-8 -*- -from distutils.version import LooseVersion - from classytags.core import Tag, Options -import django +from cms.utils.compat import DJANGO_1_4 from django import template from django.core.serializers.json import DjangoJSONEncoder from django.utils.text import javascript_quote - -DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5') - if DJANGO_1_4: from django.utils import simplejson as json else: import json - register = template.Library() + @register.filter def js(value): return json.dumps(value, cls=DjangoJSONEncoder) + @register.filter def bool(value): if value: @@ -40,4 +36,4 @@ class JavascriptString(Tag): def render_tag(self, context, **kwargs): rendered = self.nodelist.render(context) return u"'%s'" % javascript_quote(rendered.strip()) -register.tag(JavascriptString) +register.tag(JavascriptString) \ No newline at end of file diff --git a/cms/test_utils/cli.py b/cms/test_utils/cli.py index 8378157356d..b7fc238fcf7 100644 --- a/cms/test_utils/cli.py +++ b/cms/test_utils/cli.py @@ -2,6 +2,7 @@ from __future__ import with_statement import os import dj_database_url +from cms.utils.compat import DJANGO_1_5 gettext = lambda s: s @@ -63,7 +64,6 @@ def configure(db_url, **extra): 'django.middleware.locale.LocaleMiddleware', 'django.middleware.doc.XViewMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.transaction.TransactionMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', 'cms.middleware.language.LanguageCookieMiddleware', 'cms.middleware.user.CurrentUserMiddleware', @@ -297,12 +297,14 @@ def configure(db_url, **extra): ) from django.utils.functional import empty + if DJANGO_1_5: + defaults['MIDDLEWARE_CLASSES'].append('django.middleware.transaction.TransactionMiddleware') settings._wrapped = empty defaults.update(extra) # add data from env extra_settings = os.environ.get("DJANGO_EXTRA_SETTINGS", None) if extra_settings: - from django.utils.simplejson import load, loads + from json import load, loads if os.path.exists(extra_settings): with open(extra_settings) as fobj: diff --git a/cms/test_utils/project/cms_urls_for_apphook_tests.py b/cms/test_utils/project/cms_urls_for_apphook_tests.py index ca18106e529..c2879b9c066 100644 --- a/cms/test_utils/project/cms_urls_for_apphook_tests.py +++ b/cms/test_utils/project/cms_urls_for_apphook_tests.py @@ -1,7 +1,7 @@ from cms.apphook_pool import apphook_pool from cms.views import details from django.conf import settings -from django.conf.urls.defaults import url, patterns +from django.conf.urls import url, patterns if settings.APPEND_SLASH: reg = url(r'^(?P[0-9A-Za-z-_.//]+)/$', details, name='pages-details-by-slug') diff --git a/cms/test_utils/project/noadmin_urls.py b/cms/test_utils/project/noadmin_urls.py index 40a82eead74..618e3e9626e 100644 --- a/cms/test_utils/project/noadmin_urls.py +++ b/cms/test_utils/project/noadmin_urls.py @@ -1,7 +1,6 @@ from cms.utils.conf import get_cms_setting from django.conf import settings -from django.conf.urls.defaults import handler500, handler404, patterns, include, \ - url +from django.conf.urls import handler500, handler404, patterns, include, url urlpatterns = patterns('', diff --git a/cms/test_utils/project/nonroot_urls.py b/cms/test_utils/project/nonroot_urls.py index 23cb0d78169..fbd9586e8ef 100644 --- a/cms/test_utils/project/nonroot_urls.py +++ b/cms/test_utils/project/nonroot_urls.py @@ -1,6 +1,6 @@ from cms.utils import get_cms_setting from django.conf import settings -from django.conf.urls.defaults import handler500, handler404, patterns, include, \ +from django.conf.urls import handler500, handler404, patterns, include, \ url try: from django.conf.urls.i18n import i18n_patterns diff --git a/cms/test_utils/project/placeholderapp_urls.py b/cms/test_utils/project/placeholderapp_urls.py index 7311240592a..05000539101 100644 --- a/cms/test_utils/project/placeholderapp_urls.py +++ b/cms/test_utils/project/placeholderapp_urls.py @@ -1,7 +1,6 @@ from cms.utils.conf import get_cms_setting from django.conf import settings -from django.conf.urls.defaults import handler500, handler404, patterns, include, \ - url +from django.conf.urls import patterns, include, url try: from django.conf.urls.i18n import i18n_patterns except ImportError: diff --git a/cms/test_utils/project/second_urls_for_apphook_tests.py b/cms/test_utils/project/second_urls_for_apphook_tests.py index aefcd206eeb..e35130dfefb 100644 --- a/cms/test_utils/project/second_urls_for_apphook_tests.py +++ b/cms/test_utils/project/second_urls_for_apphook_tests.py @@ -1,6 +1,6 @@ from cms.utils.conf import get_cms_setting from django.conf import settings -from django.conf.urls.defaults import handler500, handler404, patterns, include, \ +from django.conf.urls import handler500, handler404, patterns, include, \ url try: from django.conf.urls.i18n import i18n_patterns diff --git a/cms/test_utils/project/third_cms_urls_for_apphook_tests.py b/cms/test_utils/project/third_cms_urls_for_apphook_tests.py index ca18106e529..c2879b9c066 100644 --- a/cms/test_utils/project/third_cms_urls_for_apphook_tests.py +++ b/cms/test_utils/project/third_cms_urls_for_apphook_tests.py @@ -1,7 +1,7 @@ from cms.apphook_pool import apphook_pool from cms.views import details from django.conf import settings -from django.conf.urls.defaults import url, patterns +from django.conf.urls import url, patterns if settings.APPEND_SLASH: reg = url(r'^(?P[0-9A-Za-z-_.//]+)/$', details, name='pages-details-by-slug') diff --git a/cms/test_utils/project/third_urls_for_apphook_tests.py b/cms/test_utils/project/third_urls_for_apphook_tests.py index 2bda8495ccf..130ade1926b 100644 --- a/cms/test_utils/project/third_urls_for_apphook_tests.py +++ b/cms/test_utils/project/third_urls_for_apphook_tests.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.conf.urls.defaults import handler500, handler404, patterns, include, \ +from django.conf.urls import handler500, handler404, patterns, include, \ url try: from django.conf.urls.i18n import i18n_patterns diff --git a/cms/test_utils/project/urls_for_apphook_tests.py b/cms/test_utils/project/urls_for_apphook_tests.py index 1d8448e9156..abd0eb42756 100644 --- a/cms/test_utils/project/urls_for_apphook_tests.py +++ b/cms/test_utils/project/urls_for_apphook_tests.py @@ -1,6 +1,6 @@ from cms.utils.conf import get_cms_setting from django.conf import settings -from django.conf.urls.defaults import handler500, handler404, patterns, include, \ +from django.conf.urls import handler500, handler404, patterns, include, \ url try: from django.conf.urls.i18n import i18n_patterns diff --git a/cms/test_utils/project/urls_no18n.py b/cms/test_utils/project/urls_no18n.py index 45f9537f0d4..232d667ea52 100644 --- a/cms/test_utils/project/urls_no18n.py +++ b/cms/test_utils/project/urls_no18n.py @@ -1,6 +1,6 @@ from cms.utils.conf import get_cms_setting from django.conf import settings -from django.conf.urls.defaults import patterns, include, \ +from django.conf.urls import patterns, include, \ url from django.contrib import admin diff --git a/cms/test_utils/testcases.py b/cms/test_utils/testcases.py index 6e41a4f24c3..20db6573a40 100644 --- a/cms/test_utils/testcases.py +++ b/cms/test_utils/testcases.py @@ -77,11 +77,11 @@ def showWarning(message, category, filename, lineno, file=None, line=None): return result -class CMSTestCase(testcases.TestCase): +class BaseCMSTestCase(object): counter = 1 def _fixture_setup(self): - super(CMSTestCase, self)._fixture_setup() + super(BaseCMSTestCase, self)._fixture_setup() self.create_fixtures() activate("en") @@ -92,7 +92,7 @@ def create_fixtures(self): def _post_teardown(self): # Needed to clean the menu keys cache, see menu.menu_pool.clear() menu_pool.clear() - super(CMSTestCase, self)._post_teardown() + super(BaseCMSTestCase, self)._post_teardown() set_current_user(None) def login_user_context(self, user): @@ -362,6 +362,14 @@ def failUnlessWarns(self, category, message, f, *args, **kwargs): assertWarns = failUnlessWarns +class CMSTestCase(BaseCMSTestCase, testcases.TestCase): + pass + + +class TransactionCMSTestCase(BaseCMSTestCase, testcases.TransactionTestCase): + pass + + class SettingsOverrideTestCase(CMSTestCase): settings_overrides = {} diff --git a/cms/tests/admin.py b/cms/tests/admin.py index 22fcb904aed..fcdae8d7c88 100644 --- a/cms/tests/admin.py +++ b/cms/tests/admin.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from __future__ import with_statement -from distutils.version import LooseVersion import json from cms.admin.change_list import CMSChangeList from cms.admin.forms import PageForm, AdvancedSettingsForm @@ -18,7 +17,7 @@ from cms.test_utils.testcases import CMSTestCase, URL_CMS_PAGE_DELETE, URL_CMS_PAGE, URL_CMS_TRANSLATION_DELETE from cms.test_utils.util.context_managers import SettingsOverride from cms.utils import get_cms_setting -import django +from cms.utils.compat import DJANGO_1_4 from django.contrib import admin from django.contrib.admin.models import LogEntry from django.contrib.admin.sites import site @@ -29,8 +28,6 @@ from django.utils.datastructures import MultiValueDictKeyError from django.utils.encoding import smart_str -DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5') - class AdminTestsBase(CMSTestCase): @property diff --git a/cms/tests/menu.py b/cms/tests/menu.py index 1e98478a02e..840a52bfd09 100644 --- a/cms/tests/menu.py +++ b/cms/tests/menu.py @@ -13,6 +13,7 @@ LanguageOverride) from cms.test_utils.util.mock import AttributeObject from cms.utils import get_cms_setting +from cms.utils.compat import DJANGO_1_5 from cms.utils.i18n import force_language from django.conf import settings from django.contrib.auth.models import AnonymousUser, User, Permission, Group @@ -180,14 +181,16 @@ def test_show_menu(self): def test_show_menu_num_queries(self): context = self.get_context() # test standard show_menu - with self.assertNumQueries(5): + with self.assertNumQueries(5 if DJANGO_1_5 else 7): """ The queries should be: get all pages get all page permissions get all titles get the menu cache key + create a savepoint (in django>=1.6) set the menu cache key + release the savepoint (in django>=1.6) """ tpl = Template("{% load menu_tags %}{% show_menu %}") tpl.render(context) @@ -797,15 +800,18 @@ def test_show_submenu(self): def test_show_submenu_num_queries(self): page = self.get_page(6) context = self.get_context(page.get_absolute_url()) + # test standard show_menu - with self.assertNumQueries(5): + with self.assertNumQueries(5 if DJANGO_1_5 else 7): """ The queries should be: get all pages get all page permissions get all titles get the menu cache key + create a savepoint (in django>=1.6) set the menu cache key + release the savepoint (in django>=1.6) """ tpl = Template("{% load menu_tags %}{% show_sub_menu %}") tpl.render(context) @@ -865,14 +871,16 @@ def test_not_in_navigation_num_queries(self): with LanguageOverride('en'): context = self.get_context(a.get_absolute_url()) - with self.assertNumQueries(5): + with self.assertNumQueries(5 if DJANGO_1_5 else 7): """ The queries should be: get all pages get all page permissions get all titles get the menu cache key + create a savepoint (in django>=1.6) set the menu cache key + release the savepoint (in django>=1.6) """ # Actually seems to run: tpl = Template("{% load menu_tags %}{% show_menu_below_id 'a' 0 100 100 100 %}") diff --git a/cms/tests/permmod.py b/cms/tests/permmod.py index 122916c189c..7f54e98042a 100644 --- a/cms/tests/permmod.py +++ b/cms/tests/permmod.py @@ -812,6 +812,7 @@ def test_public_for_all_num_queries(self): request = self.get_request(user) site = Site() site.pk = 1 + site.save() page = Page() page.pk = 1 page.level = 0 @@ -866,6 +867,7 @@ def test_authed_basic_perm(self): def test_authed_basic_perm_num_queries(self): site = Site() site.pk = 1 + site.save() with SettingsOverride(CMS_PUBLIC_FOR='staff'): user = User.objects.create_user('user', 'user@domain.com', 'user') user.user_permissions.add(Permission.objects.get(codename='view_page')) diff --git a/cms/tests/plugins.py b/cms/tests/plugins.py index 97d2623ee34..616956f5a13 100644 --- a/cms/tests/plugins.py +++ b/cms/tests/plugins.py @@ -60,7 +60,7 @@ def _test_view(self, request): return http.HttpResponse("It works") def get_plugin_urls(self): - from django.conf.urls.defaults import patterns, url + from django.conf.urls import patterns, url return patterns('', url(r'^testview/$', admin.site.admin_view(self._test_view), name='dumbfixtureplugin'), ) diff --git a/cms/tests/reversion_tests.py b/cms/tests/reversion_tests.py index 9c49ebec99f..3d278745544 100644 --- a/cms/tests/reversion_tests.py +++ b/cms/tests/reversion_tests.py @@ -7,7 +7,7 @@ from cms.models.pluginmodel import CMSPlugin from djangocms_text_ckeditor.models import Text from cms.test_utils.project.fileapp.models import FileModel -from cms.test_utils.testcases import CMSTestCase, URL_CMS_PAGE, URL_CMS_PAGE_CHANGE, URL_CMS_PAGE_ADD, \ +from cms.test_utils.testcases import CMSTestCase, TransactionCMSTestCase, URL_CMS_PAGE, URL_CMS_PAGE_CHANGE, URL_CMS_PAGE_ADD, \ URL_CMS_PLUGIN_ADD, URL_CMS_PLUGIN_EDIT from cms.test_utils.util.context_managers import SettingsOverride from django.conf import settings @@ -17,7 +17,9 @@ from django.core.urlresolvers import reverse from os.path import join import reversion -from reversion.models import Revision, Version, VERSION_CHANGE +from reversion.models import Revision, Version +if hasattr(reversion.models, 'VERSION_CHANGE'): + from reversion.models import VERSION_CHANGE class BasicReversionTestCase(CMSTestCase): @@ -40,7 +42,7 @@ def test_number_revisions(self): self.assertEquals(Revision.objects.all().count(), 1) -class ReversionTestCase(CMSTestCase): +class ReversionTestCase(TransactionCMSTestCase): def setUp(self): u = User(username="test", is_staff=True, is_active=True, is_superuser=True) @@ -246,9 +248,14 @@ def test_file_persistence(self): # manually add a revision because we use the explicit way # django-cms uses too. adapter = reversion.get_adapter(FileModel) - reversion.revision_context_manager.add_to_context( - reversion.default_revision_manager, file1, - adapter.get_version_data(file1, VERSION_CHANGE)) + if hasattr(reversion.models, 'VERSION_CHANGE'): + reversion.revision_context_manager.add_to_context( + reversion.default_revision_manager, file1, + adapter.get_version_data(file1, VERSION_CHANGE)) + else: + reversion.revision_context_manager.add_to_context( + reversion.default_revision_manager, file1, + adapter.get_version_data(file1)) # reload the instance from db file2 = FileModel.objects.all()[0] # delete the instance. diff --git a/cms/utils/admin.py b/cms/utils/admin.py index e30331a4982..5fdeedb57cc 100644 --- a/cms/utils/admin.py +++ b/cms/utils/admin.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- +from distutils.version import LooseVersion import json +import django from django.http import HttpResponse from django.shortcuts import render_to_response from django.template.context import RequestContext @@ -12,7 +14,7 @@ from django.utils.encoding import smart_str NOT_FOUND_RESPONSE = "NotFound" - +DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5') def jsonify_request(response): """ Turn any response in a 200 response to let jQuery code handle it nicely. @@ -112,4 +114,7 @@ def render_admin_menu_item(request, page, template=None): filtered = 'filtered' in request.REQUEST context.update(get_admin_menu_item_context(request, page, filtered)) # add mimetype to help out IE - return render_to_response(template, context, mimetype="text/html; charset=utf-8") + if DJANGO_1_4: + return render_to_response(template, context, mimetype="text/html; charset=utf-8") + else: + return render_to_response(template, context, content_type="text/html; charset=utf-8") diff --git a/cms/utils/compat/__init__.py b/cms/utils/compat/__init__.py index 4cbebd5ea8e..d4504589bbf 100644 --- a/cms/utils/compat/__init__.py +++ b/cms/utils/compat/__init__.py @@ -1,3 +1,8 @@ import sys +from distutils.version import LooseVersion +import django + +DJANGO_1_4 = LooseVersion(django.get_version()) < LooseVersion('1.5') +DJANGO_1_5 = LooseVersion(django.get_version()) < LooseVersion('1.6') PY2 = sys.version_info[0] == 2 \ No newline at end of file diff --git a/cms/utils/conf.py b/cms/utils/conf.py index 2a46b3a1765..82c10c1ee15 100644 --- a/cms/utils/conf.py +++ b/cms/utils/conf.py @@ -4,7 +4,6 @@ from cms.utils.compat.urls import urljoin from cms import constants from cms.exceptions import CMSDeprecationWarning -from django.contrib.sites.models import Site from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.utils.translation import ugettext_lazy as _ @@ -228,6 +227,7 @@ def get_cms_setting(name): def get_site_id(site): + from django.contrib.sites.models import Site if isinstance(site, Site): return site.id try: diff --git a/cms/utils/helpers.py b/cms/utils/helpers.py index 21a2f2d9c08..445bafafb30 100644 --- a/cms/utils/helpers.py +++ b/cms/utils/helpers.py @@ -16,7 +16,6 @@ def reversion_register(model_class, fields=None, follow=(), format="json", exclu if not 'reversion' in settings.INSTALLED_APPS: return - from reversion.models import VERSION_CHANGE if fields and exclude_fields: raise ValueError("Just one of fields, exclude_fields arguments can be passed.") @@ -38,7 +37,8 @@ def make_revision_with_plugins(obj, user=None, message=None): # we can safely import reversion - calls here always check for # reversion in installed_applications first import reversion - from reversion.models import VERSION_CHANGE + if hasattr(reversion.models, 'VERSION_CHANGE'): + from reversion.models import VERSION_CHANGE """ Only add to revision if it is a draft. """ @@ -58,16 +58,25 @@ def make_revision_with_plugins(obj, user=None, message=None): revision_context.set_comment(message) # add toplevel object to the revision adapter = revision_manager.get_adapter(obj.__class__) - revision_context.add_to_context(revision_manager, obj, adapter.get_version_data(obj, VERSION_CHANGE)) + if hasattr(reversion.models, 'VERSION_CHANGE'): + revision_context.add_to_context(revision_manager, obj, adapter.get_version_data(obj, VERSION_CHANGE)) + else: + revision_context.add_to_context(revision_manager, obj, adapter.get_version_data(obj)) # add plugins and subclasses to the revision filters = {'placeholder__%s' % placeholder_relation: obj} for plugin in CMSPlugin.objects.filter(**filters): plugin_instance, admin = plugin.get_plugin_instance() if plugin_instance: padapter = revision_manager.get_adapter(plugin_instance.__class__) - revision_context.add_to_context(revision_manager, plugin_instance, padapter.get_version_data(plugin_instance, VERSION_CHANGE)) + if hasattr(reversion.models, 'VERSION_CHANGE'): + revision_context.add_to_context(revision_manager, plugin_instance, padapter.get_version_data(plugin_instance, VERSION_CHANGE)) + else: + revision_context.add_to_context(revision_manager, plugin_instance, padapter.get_version_data(plugin_instance)) bpadapter = revision_manager.get_adapter(plugin.__class__) - revision_context.add_to_context(revision_manager, plugin, bpadapter.get_version_data(plugin, VERSION_CHANGE)) + if hasattr(reversion.models, 'VERSION_CHANGE'): + revision_context.add_to_context(revision_manager, plugin, bpadapter.get_version_data(plugin, VERSION_CHANGE)) + else: + revision_context.add_to_context(revision_manager, plugin, bpadapter.get_version_data(plugin)) def find_placeholder_relation(obj): return 'page' diff --git a/test_requirements/django-1.4.txt b/test_requirements/django-1.4.txt index 3fc3ca0aecc..92a8af06593 100644 --- a/test_requirements/django-1.4.txt +++ b/test_requirements/django-1.4.txt @@ -1,3 +1,3 @@ -r requirements_base.txt Django>=1.4.5,<1.5 -django-reversion>=1.6.6,<1.7 \ No newline at end of file +django-reversion>=1.6.6,<1.7 diff --git a/test_requirements/django-1.5.txt b/test_requirements/django-1.5.txt index 47ee73c8cd3..2607ecb0c2f 100644 --- a/test_requirements/django-1.5.txt +++ b/test_requirements/django-1.5.txt @@ -1,3 +1,3 @@ -r requirements_base.txt Django>=1.5,<1.6 -django-reversion>=1.7,<1.8 \ No newline at end of file +django-reversion>=1.7,<1.8 diff --git a/test_requirements/django-1.6.txt b/test_requirements/django-1.6.txt new file mode 100644 index 00000000000..a283154df74 --- /dev/null +++ b/test_requirements/django-1.6.txt @@ -0,0 +1,3 @@ +-r requirements_base.txt +django>=1.6 +django-reversion>=1.8 diff --git a/test_requirements/django-trunk.txt b/test_requirements/django-trunk.txt index ddbcdf2ffac..012cc09ab96 100644 --- a/test_requirements/django-trunk.txt +++ b/test_requirements/django-trunk.txt @@ -1,4 +1,4 @@ -r requirements_base.txt https://github.com/django/django/tarball/master/django.tar.gz#egg=django -django-reversion==1.6.2 +django-reversion>=1.8 diff --git a/test_requirements/requirements_base.txt b/test_requirements/requirements_base.txt index 001bbebef58..acf77d1cc92 100644 --- a/test_requirements/requirements_base.txt +++ b/test_requirements/requirements_base.txt @@ -7,12 +7,12 @@ Pillow==2.0 django-classy-tags>=0.3.4.1 South>=0.7.2 html5lib>=0.90 --e git+git://github.com/django-mptt/django-mptt.git#egg=django-mptt +django-mptt>=0.6 django-sekizai>=0.7 argparse dj-database-url --e git+https://github.com/divio/djangocms-admin-style.git#egg=djangocms-admin-style +https://github.com/KristianOellegaard/django-hvad/archive/master.zip#egg=hvad +-e git+git://github.com/divio/djangocms-admin-style.git#egg=djangocms-admin-style -e git+git://github.com/divio/djangocms-text-ckeditor.git#egg=djangocms-text-ckeditor --e git+git://github.com/KristianOellegaard/django-hvad.git#egg=hvad -e git+git://github.com/divio/djangocms-column.git#egg=djangocms-column -e git+git://github.com/divio/djangocms-style.git#egg=djangocms-style diff --git a/test_requirements/selenium-1.6.txt b/test_requirements/selenium-1.6.txt new file mode 100644 index 00000000000..3e364948cd3 --- /dev/null +++ b/test_requirements/selenium-1.6.txt @@ -0,0 +1,2 @@ +-r django-1.6.txt +selenium