Skip to content

Commit

Permalink
Merge 5a3cd79 into ad51df7
Browse files Browse the repository at this point in the history
  • Loading branch information
yakky committed Jan 15, 2016
2 parents ad51df7 + 5a3cd79 commit dc6e54e
Show file tree
Hide file tree
Showing 55 changed files with 396 additions and 241 deletions.
56 changes: 37 additions & 19 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,20 @@ env:
global:
- secure: NWiSBCHFB6LbTMget2qLIdqZlx0zeu3j+Y7Lsqb8kuYXyT2IUBGFVedcGWuGv/9Mzypb80EQWtVTokA3/3QIbesqr29uG95pMPHiYWLdnTO6UHcLMcNXiSzhBGdRDZ40iHSVv2dDHs4GNwGOH5+UCA0z3j7SWmChuFbNXh+Vsqw=
matrix:
- DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'
- DJANGO=1.9 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 MIGRATE_OPTION='--migrate'
- DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
- DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 AUTH_USER_MODEL='customuserapp.User'
- DJANGO=1.8 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- DJANGO=1.8 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 MIGRATE_OPTION='--migrate'
- DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
- DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 AUTH_USER_MODEL='emailuserapp.EmailUser'
- DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'
- DJANGO=1.7 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0
- DJANGO=1.7 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- DJANGO=1.7 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0
- DJANGO=1.7 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
- DJANGO=1.6 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- DJANGO=1.6 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- DJANGO=1.6 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 MIGRATE_OPTION='--migrate'
- DJANGO=1.6 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
- DJANGO=1.6 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'

before_script:
Expand Down Expand Up @@ -95,10 +95,21 @@ matrix:
- python: 2.6
env: DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 2.6
env: DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
env: DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 AUTH_USER_MODEL='emailuserapp.EmailUser'
- python: 2.6
env: DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'

- python: 2.6
env: DJANGO=1.9 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 2.6
env: DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 2.6
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 2.6
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
- python: 2.6
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 AUTH_USER_MODEL='customuserapp.User'

- python: 2.7
env: DJANGO=1.6 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 2.7
Expand Down Expand Up @@ -136,6 +147,17 @@ matrix:
- python: 3.3
env: DJANGO=1.8 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'

- python: 3.3
env: DJANGO=1.9 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 3.3
env: DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.3
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 3.3
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'
- python: 3.3
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=0 AUTH_USER_MODEL='customuserapp.User'

- python: 3.5
env: DJANGO=1.6 DATABASE_URL='sqlite://localhost/:memory:' SELENIUM=0 MIGRATE_OPTION='--migrate'
- python: 3.5
Expand All @@ -156,39 +178,35 @@ matrix:
- python: 3.5
env: DJANGO=1.7 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='emailuserapp.EmailUser'

- python: 2.6
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'
- python: 2.7
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'
- python: 3.3
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'
- python: 3.5
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'

allow_failures:
- python: 2.7
env: DJANGO=1.7 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 2.7
env: DJANGO=1.8 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 2.7
env: DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0

- python: 3.3
env: DJANGO=1.6 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.3
env: DJANGO=1.7 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.3
env: DJANGO=1.8 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.3
env: DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0

- python: 3.4
env: DJANGO=1.6 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.4
env: DJANGO=1.7 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.4
env: DJANGO=1.8 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0
- python: 3.4
env: DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0

- python: 3.5
env: DJANGO=1.8 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0

- python: 3.4
env: DJANGO=1.9 DATABASE_URL='postgres://postgres@127.0.0.1/djangocms_test' SELENIUM=1 AUTH_USER_MODEL='customuserapp.User'
- python: 3.5
env: DJANGO=1.9 DATABASE_URL='mysql://root@127.0.0.1/djangocms_test' SELENIUM=0

fast_finish: true
1 change: 1 addition & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
=== 3.2.1 (Unreleased) ===

- Add support for Django 1.9 (with some deprecation warnings)
- Add support for django-reversion 1.10+
- Fixed an issue with refreshing the UI when switching CMS language
- Fixed an issue with sideframe urls not being remembered after reload
Expand Down
22 changes: 14 additions & 8 deletions cms/admin/pageadmin.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,12 @@

from cms.admin.change_list import CMSChangeList
from cms.admin.dialog.views import get_copy_dialog
from cms.admin.forms import (PageForm, AdvancedSettingsForm, PagePermissionForm,
PublicationDatesForm)
from cms.admin.permissionadmin import (PERMISSION_ADMIN_INLINES, PagePermissionInlineAdmin, ViewRestrictionInlineAdmin)
from cms.admin.forms import (
PageForm, AdvancedSettingsForm, PagePermissionForm, PublicationDatesForm
)
from cms.admin.permissionadmin import (
PERMISSION_ADMIN_INLINES, PagePermissionInlineAdmin, ViewRestrictionInlineAdmin
)
from cms.admin.placeholderadmin import PlaceholderAdminMixin
from cms.admin.views import revert_plugins
from cms.constants import PAGE_TYPES_ID, PUBLISHER_STATE_PENDING
Expand Down Expand Up @@ -442,7 +445,6 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = self.update_language_tab_context(request, obj, context)

tab_language = get_language_from_request(request)

extra_context.update(self.get_unihandecode_context(tab_language))

response = super(PageAdmin, self).change_view(
Expand Down Expand Up @@ -818,13 +820,17 @@ def _reset_parent_during_reversion(self, obj, version, revert=False, recover=Fal

# Reversion 1.9+ no longer uses these two methods to save revision, but we still need them
# as we do not use signals
def log_addition(self, request, object):
def log_addition(self, request, object, message=None):
"""Sets the version meta information."""
if is_installed('reversion') and not hasattr(self, 'get_revision_data'):
adapter = self.revision_manager.get_adapter(object.__class__)
self.revision_context_manager.add_to_context(self.revision_manager, object, adapter.get_version_data(object))
self.revision_context_manager.set_comment(_("Initial version."))
super(PageAdmin, self).log_addition(request, object)
self.revision_context_manager.set_comment(INITIAL_COMMENT)
# Same code as reversion 1.9
try:
super(PageAdmin, self).log_addition(request, object, INITIAL_COMMENT)
except TypeError: # Django < 1.9 pragma: no cover
super(PageAdmin, self).log_addition(request, object)

def log_change(self, request, object, message):
"""Sets the version meta information."""
Expand Down Expand Up @@ -1135,7 +1141,7 @@ def cleanup_history(self, page, publish=False):
revision = version.revision
revision.delete()
deleted.append(revision.pk)
# delete all publish revisions that are more then MAX_PAGE_PUBLISH_REVERSIONS
# delete all publish revisions that are more then MAX_PAGE_PUBLISH_REVERSIONS
publish_limit = get_cms_setting("MAX_PAGE_PUBLISH_REVERSIONS")
if publish_limit and publish:
deleted = []
Expand Down
21 changes: 15 additions & 6 deletions cms/appresolver.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import with_statement

from cms.utils.compat import DJANGO_1_8

try:
from collections import OrderedDict
except ImportError:
Expand Down Expand Up @@ -119,16 +121,23 @@ def recurse_patterns(path, pattern_list, page_id, default_args=None, nested=Fals
path = path.lstrip('^')
regex = r'^%s%s' % (path, app_pat) if not nested else r'^%s' % (app_pat)
if isinstance(pattern, RegexURLResolver):
# this is an 'include', recurse!
resolver = RegexURLResolver(regex, 'cms_appresolver',
pattern.default_kwargs, pattern.app_name, pattern.namespace)
resolver.page_id = page_id
# include default_args
args = pattern.default_kwargs
if default_args:
args.update(default_args)
# see lines 243 and 236 of urlresolvers.py to understand the next line
resolver._urlconf_module = recurse_patterns(regex, pattern.url_patterns, page_id, args, nested=True)
if DJANGO_1_8:
# this is an 'include', recurse!
resolver = RegexURLResolver(regex, 'cms_appresolver',
pattern.default_kwargs, pattern.app_name, pattern.namespace)
# see lines 243 and 236 of urlresolvers.py to understand the next line
resolver._urlconf_module = recurse_patterns(regex, pattern.url_patterns, page_id, args, nested=True)
else:
# see lines 243 and 236 of urlresolvers.py to understand the next line
urlconf_module = recurse_patterns(regex, pattern.url_patterns, page_id, args, nested=True)
# this is an 'include', recurse!
resolver = RegexURLResolver(regex, urlconf_module,
pattern.default_kwargs, pattern.app_name, pattern.namespace)
resolver.page_id = page_id
else:
# Re-do the RegexURLPattern with the new regular expression
args = pattern.default_args
Expand Down
1 change: 1 addition & 0 deletions cms/cms_toolbars.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ def render_addons(self, context):
context.pop()
return [clipboard]


@toolbar_pool.register
class PageToolbar(CMSToolbar):
_changed_admin_menu = None
Expand Down
10 changes: 8 additions & 2 deletions cms/models/fields.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
# -*- coding: utf-8 -*-
from cms.forms.fields import PageSelectFormField
from cms.models.placeholdermodel import Placeholder
from cms.utils.placeholder import PlaceholderNoAction, validate_placeholder_name
from django.db import models


class PlaceholderField(models.ForeignKey):

def __init__(self, slotname, default_width=None, actions=PlaceholderNoAction, **kwargs):
def __init__(self, slotname, default_width=None, actions=None, **kwargs):
from cms.utils.placeholder import PlaceholderNoAction, validate_placeholder_name

if not actions:
actions = PlaceholderNoAction

if kwargs.get('related_name', None) == '+':
raise ValueError("PlaceholderField does not support disabling of related names via '+'.")
if not callable(slotname):
Expand All @@ -31,6 +35,8 @@ def _get_new_placeholder(self, instance):
return Placeholder.objects.create(slot=self._get_placeholder_slot(instance), default_width=self.default_width)

def _get_placeholder_slot(self, model_instance):
from cms.utils.placeholder import validate_placeholder_name

if callable(self.slotname):
slotname = self.slotname(model_instance)
validate_placeholder_name(slotname)
Expand Down
9 changes: 6 additions & 3 deletions cms/models/pagemodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
from cms.exceptions import PublicIsUnmodifiable, LanguageError, PublicVersionNeeded
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 PublisherCantPublish
from cms.utils import i18n, page as page_utils
from cms.utils.conf import get_cms_setting
Expand Down Expand Up @@ -97,7 +95,7 @@ class Page(six.with_metaclass(PageMetaClass, MP_Node)):
application_namespace = models.CharField(_('application instance name'), max_length=200, blank=True, null=True)

# Placeholders (plugins)
placeholders = models.ManyToManyField(Placeholder, editable=False)
placeholders = models.ManyToManyField('cms.Placeholder', editable=False)

# Publisher fields
publisher_is_draft = models.BooleanField(default=True, editable=False, db_index=True)
Expand Down Expand Up @@ -277,6 +275,7 @@ def _copy_contents(self, target, language):
"""
# TODO: Make this into a "graceful" copy instead of deleting and overwriting
# copy the placeholders (and plugins on those placeholders!)
from cms.models.pluginmodel import CMSPlugin
from cms.plugin_pool import plugin_pool

plugin_pool.set_plugin_meta()
Expand Down Expand Up @@ -339,6 +338,7 @@ def copy_page(self, target, site, position='first-child',
conflicting URLs as pages are copied unpublished.
"""
from cms.extensions import extension_pool
from cms.models import Placeholder

if not self.publisher_is_draft:
raise PublicIsUnmodifiable("copy page is not allowed for public pages")
Expand Down Expand Up @@ -1251,6 +1251,7 @@ def rescan_placeholders(self):
Rescan and if necessary create placeholders in the current template.
"""
# inline import to prevent circular imports
from cms.models.placeholdermodel import Placeholder
from cms.utils.placeholder import get_placeholders

placeholders = get_placeholders(self.get_template())
Expand Down Expand Up @@ -1347,7 +1348,9 @@ def _apply_revision(self, target_revision, set_dirty=False):
"""
Revert to a specific revision
"""
from cms.models.pluginmodel import CMSPlugin
from cms.utils.page_resolver import is_valid_url

# Get current titles
old_titles = list(self.title_set.all())

Expand Down
23 changes: 19 additions & 4 deletions cms/models/placeholdermodel.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
from django.db.models import ManyToManyField

from cms.utils.compat import DJANGO_1_7
from django.contrib import admin
from django.contrib.auth import get_permission_codename
Expand All @@ -10,7 +12,6 @@
from cms.exceptions import LanguageError
from cms.utils.helpers import reversion_register
from cms.utils.i18n import get_language_object
from cms.utils.placeholder import PlaceholderNoAction, get_placeholder_conf
from cms.utils.urlutils import admin_reverse


Expand Down Expand Up @@ -53,6 +54,7 @@ def clear(self, language=None):
plugin.delete(no_mp=True)

def get_label(self):
from cms.utils.placeholder import get_placeholder_conf
name = get_placeholder_conf("name", self.slot, default=title(self.slot))
name = _(name)
return name
Expand Down Expand Up @@ -154,14 +156,26 @@ def render(self, context, width, lang=None, editable=True, use_cache=True):
return render_placeholder(self, context, lang=lang, editable=editable,
use_cache=use_cache)

def _get_related_objects(self):
if DJANGO_1_7:
return list(self._meta.get_all_related_objects())
else:
fields = self._meta._get_fields(
forward=False, reverse=True,
include_parents=True,
include_hidden=False,
)
return list(obj for obj in fields if not isinstance(obj.field, ManyToManyField))

def _get_attached_fields(self):
"""
Returns an ITERATOR of all non-cmsplugin reverse foreign key related fields.
"""
from cms.models import CMSPlugin
if not hasattr(self, '_attached_fields_cache'):
self._attached_fields_cache = []
for rel in self._meta.get_all_related_objects():
relations = self._get_related_objects()
for rel in relations:
if issubclass(rel.model, CMSPlugin):
continue
from cms.admin.placeholderadmin import PlaceholderAdminMixin
Expand All @@ -182,8 +196,7 @@ def _get_attached_field(self):
from cms.models import CMSPlugin, StaticPlaceholder, Page
if not hasattr(self, '_attached_field_cache'):
self._attached_field_cache = None
relations = self._meta.get_all_related_objects()

relations = self._get_related_objects()
for rel in relations:
if DJANGO_1_7:
parent = rel.model
Expand Down Expand Up @@ -288,6 +301,8 @@ def get_cached_plugins(self):

@property
def actions(self):
from cms.utils.placeholder import PlaceholderNoAction

if not hasattr(self, '_actions_cache'):
field = self._get_attached_field()
self._actions_cache = getattr(field, 'actions', PlaceholderNoAction())
Expand Down
Loading

0 comments on commit dc6e54e

Please sign in to comment.