Skip to content

Commit

Permalink
Merge 1e39e94 into b56548c
Browse files Browse the repository at this point in the history
  • Loading branch information
yakky committed Dec 3, 2015
2 parents b56548c + 1e39e94 commit cab5424
Show file tree
Hide file tree
Showing 46 changed files with 323 additions and 216 deletions.
25 changes: 17 additions & 8 deletions cms/admin/pageadmin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
from functools import wraps
import json
import sys

from django.core.urlresolvers import reverse

from cms.utils.compat import DJANGO_1_7

import django
Expand Down Expand Up @@ -36,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 All @@ -58,8 +64,12 @@
require_POST = method_decorator(require_POST)

if is_installed('reversion'):
from reversion.admin import VersionAdmin as ModelAdmin
from reversion import create_revision
try:
from reversion.admin import VersionAdmin as ModelAdmin
from reversion.revisions import create_revision
except:
from reversion.admin import VersionAdmin as ModelAdmin
from reversion import create_revision
else: # pragma: no cover
from django.contrib.admin import ModelAdmin

Expand Down Expand Up @@ -440,7 +450,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 @@ -1207,8 +1216,8 @@ def delete_translation(self, request, object_id, extra_context=None):
helpers.make_revision_with_plugins(obj, request.user, message)

if not self.has_change_permission(request, None):
return HttpResponseRedirect("../../../../")
return HttpResponseRedirect("../../")
return HttpResponseRedirect(reverse('admin:index'))
return HttpResponseRedirect(reverse('admin:cms_page_changelist'))

context = {
"title": _("Are you sure?"),
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
10 changes: 7 additions & 3 deletions cms/cms_toolbars.py
Original file line number Diff line number Diff line change
Expand Up @@ -548,10 +548,14 @@ def add_history_menu(self):
history_menu = self.toolbar.get_or_create_menu(HISTORY_MENU_IDENTIFIER, _('History'), position=2)

if is_installed('reversion'):
import reversion
from reversion.models import Revision
try:
from reversion import revisions
versions = revisions.get_for_object(self.page)
except AttributeError:
import reversion
versions = reversion.get_for_object(self.page)

versions = reversion.get_for_object(self.page)
from reversion.models import Revision
if self.page.revision_id:
current_revision = Revision.objects.get(pk=self.page.revision_id)
has_undo = versions.filter(revision__pk__lt=current_revision.pk).exists()
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 @@ -20,8 +20,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 @@ -98,7 +96,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 @@ -278,6 +276,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 @@ -340,6 +339,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 @@ -1248,6 +1248,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 @@ -1344,7 +1345,9 @@ def _apply_revision(self, target_revision):
"""
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
6 changes: 4 additions & 2 deletions cms/models/placeholdermodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,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 +52,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 @@ -99,7 +99,7 @@ def _get_permission(self, request, key):
Generic method to check the permissions for a request for a given key,
the key can be: 'add', 'change' or 'delete'. For each attached object
permission has to be granted either on attached model or on attached object.
* 'add' and 'change' permissions on placeholder need either on add or change
* 'add' and 'change' permissions on placeholder need either on add or change
permission on attached object to be granted.
* 'delete' need either on add, change or delete
"""
Expand Down Expand Up @@ -288,6 +288,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
13 changes: 9 additions & 4 deletions cms/plugin_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
from cms.exceptions import SubClassNeededError, Deprecated
from cms.models import CMSPlugin
from cms.utils import get_cms_setting
from cms.utils.placeholder import get_placeholder_conf


class CMSPluginBaseMetaclass(ModelAdminMetaClass):
Expand Down Expand Up @@ -168,6 +167,8 @@ def render(self, context, instance, placeholder):

@classmethod
def get_require_parent(cls, slot, page):
from cms.utils.placeholder import get_placeholder_conf

template = page and page.get_template() or None

# config overrides..
Expand Down Expand Up @@ -247,13 +248,13 @@ def response_add(self, request, obj, **kwargs):
kwargs.setdefault('post_url_continue', post_url_continue)
return super(CMSPluginBase, self).response_add(request, obj, **kwargs)

def log_addition(self, request, obj):
def log_addition(self, request, obj, bypass=None):
pass

def log_change(self, request, obj, message):
def log_change(self, request, obj, message, bypass=None):
pass

def log_deletion(self, request, obj, object_repr):
def log_deletion(self, request, obj, object_repr, bypass=None):
pass

def icon_src(self, instance):
Expand Down Expand Up @@ -294,6 +295,8 @@ def get_fieldsets(self, request, obj=None):
return fieldsets

def get_child_classes(self, slot, page):
from cms.utils.placeholder import get_placeholder_conf

template = page and page.get_template() or None

# config overrides..
Expand All @@ -306,6 +309,8 @@ def get_child_classes(self, slot, page):
return [cls.__name__ for cls in installed_plugins]

def get_parent_classes(self, slot, page):
from cms.utils.placeholder import get_placeholder_conf

template = page and page.get_template() or None

# config overrides..
Expand Down
3 changes: 2 additions & 1 deletion cms/plugin_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
from cms.models import CMSPlugin
from cms.utils.django_load import load
from cms.utils.helpers import reversion_register, normalize_name
from cms.utils.placeholder import get_placeholder_conf
from cms.utils.compat.dj import is_installed


Expand Down Expand Up @@ -148,6 +147,8 @@ def set_plugin_meta(self):
self.patched = True

def get_all_plugins(self, placeholder=None, page=None, setting_key="plugins", include_page_only=True):
from cms.utils.placeholder import get_placeholder_conf

self.discover_plugins()
self.set_plugin_meta()
plugins = sorted(self.plugins.values(), key=attrgetter('name'))
Expand Down
12 changes: 6 additions & 6 deletions cms/plugin_rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,8 @@
from cms.utils import get_language_from_request
from cms.utils.conf import get_cms_setting
from cms.utils.django_load import iterload_objects
from cms.utils.placeholder import get_placeholder_conf, restore_sekizai_context


# these are always called before all other plugin context processors
from sekizai.helpers import Watcher

DEFAULT_PLUGIN_CONTEXT_PROCESSORS = (
plugin_meta_context_processor,
)
Expand Down Expand Up @@ -104,9 +100,13 @@ def render_placeholder(placeholder, context_to_copy, name_fallback="Placeholder"
during rendering. This is primarily used for the "as" variant of the
render_placeholder tag.
"""
from cms.utils.placeholder import get_placeholder_conf, restore_sekizai_context
from cms.utils.plugins import get_plugins
# these are always called before all other plugin context processors
from sekizai.helpers import Watcher

if not placeholder:
return
from cms.utils.plugins import get_plugins
context = context_to_copy.new(context_to_copy)
context.push()
request = context['request']
Expand Down Expand Up @@ -139,7 +139,7 @@ def render_placeholder(placeholder, context_to_copy, name_fallback="Placeholder"
if get_cms_setting('PLACEHOLDER_CACHE') and use_cache:
if not edit and placeholder and not hasattr(placeholder, 'cache_checked'):
cached_value = get_placeholder_cache(placeholder, lang)
if not cached_value is None:
if cached_value is not None:
restore_sekizai_context(context, cached_value['sekizai'])
return mark_safe(cached_value['content'])
if page:
Expand Down
5 changes: 4 additions & 1 deletion cms/signals/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@
###################### reversion #########################

if is_installed('reversion'):
from reversion.models import post_revision_commit
try:
from reversion.signals import post_revision_commit
except ImportError:
from reversion.models import post_revision_commit

post_revision_commit.connect(post_revision, dispatch_uid='cms_post_revision')
7 changes: 5 additions & 2 deletions cms/templatetags/cms_js_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from classytags.core import Tag, Options
from cms.utils.encoder import SafeJSONEncoder
from django import template
from django.utils.text import javascript_quote
from django.utils.safestring import mark_safe

register = template.Library()
Expand Down Expand Up @@ -35,6 +34,10 @@ class JavascriptString(Tag):
)

def render_tag(self, context, **kwargs):
try:
from django.utils.html import escapejs
except ImportError:
from django.utils.text import javascript_quote as escapejs
rendered = self.nodelist.render(context)
return u"'%s'" % javascript_quote(rendered.strip())
return u"'%s'" % escapejs(rendered.strip())
register.tag(JavascriptString)

0 comments on commit cab5424

Please sign in to comment.