Skip to content

Commit

Permalink
Merge branch 'develop' into yakky-feature/multidb_test
Browse files Browse the repository at this point in the history
Conflicts:
	cms/test_utils/cli.py
	runtests.py
  • Loading branch information
digi604 committed Nov 14, 2012
2 parents 873ac1f + c9b232a commit 8bfcd6f
Show file tree
Hide file tree
Showing 211 changed files with 17,482 additions and 13,184 deletions.
5 changes: 5 additions & 0 deletions AUTHORS
Expand Up @@ -33,10 +33,12 @@ Contributors (in alphabetical order):
* Andrew Cassidy
* Andrew Schoen
* angular_circle
* Anton Parkhomenko
* Antoni Aloy López
* Arne Gellhaus
* Artem Skoretskiy
* Arthur Debert
* Aymeric Augustin
* Batiste Bieler
* behrooz
* Behrooz Nobakht
Expand Down Expand Up @@ -68,6 +70,7 @@ Contributors (in alphabetical order):
* eged
* Egor V. Nazarkin
* Ekrem Seren
* Erlend Dalen
* Eric Eldredge
* Erik Allik
* Eugen MechanisM
Expand Down Expand Up @@ -170,6 +173,7 @@ Contributors (in alphabetical order):
* Rebecca Breu
* Remco Wendt
* Restless Being
* Richard Barran
* Robert Buchholz
* Robert Clark
* Robert Pogorzelski
Expand Down Expand Up @@ -204,6 +208,7 @@ Contributors (in alphabetical order):
* tiret
* Ulrich Petri
* Vasil Vangelovski
* Viliam Segeda
* wangJunjie
* Wayne Moore
* wid
Expand Down
12 changes: 8 additions & 4 deletions CHANGELOG.txt
Expand Up @@ -110,6 +110,14 @@

- fixed an incompatibility with Python 2.5

==== 2.3.4 (2012-11-09) ====

- Fixed WymEditor
- Fixed Norwegian translations
- Fixed a bug that could lead to slug clashes
- Fixed page change form (jQuery and permissions)
- Fixed placeholder field permission checks

==== 2.4.0 ===-

- CMS_LANGUAGE setting has changed
Expand All @@ -122,7 +130,3 @@
- CMS_FLAT_URLS has been removed






2 changes: 1 addition & 1 deletion cms/__init__.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
__version__ = '2.3.3.post0'
__version__ = '2.3.4.post0'

# patch settings
try:
Expand Down
61 changes: 17 additions & 44 deletions cms/admin/change_list.py
@@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
from collections import defaultdict
from cms.exceptions import NoHomeFound
from cms.models import Title, Page, PageModerator
from cms.models.moderatormodels import MASK_PAGE, MASK_CHILDREN, \
MASK_DESCENDANTS, PageModeratorState
from cms.models import Title, Page, PageModeratorState
from cms.utils.permissions import get_user_sites_queryset
from django.conf import settings
from django.contrib.admin.views.main import ChangeList, ALL_VAR, IS_POPUP_VAR, \
Expand Down Expand Up @@ -120,27 +119,7 @@ def set_items(self, request):
if perm_edit_ids and perm_edit_ids != Page.permissions.GRANT_ALL:
pages = pages.filter(pk__in=perm_edit_ids)
#pages = pages.filter(pk__in=perm_change_list_ids)

if settings.CMS_MODERATOR:
# get all ids of public instances, so we can cache them
# TODO: add some filtering here, so the set is the same like page set...
published_public_page_id_set = Page.objects.public().filter(published=True).values_list('id', flat=True)

# get all moderations for current user and all pages
pages_moderator_set = PageModerator.objects \
.filter(user=request.user, page__site=self._current_site) \
.values_list('page', 'moderate_page', 'moderate_children', 'moderate_descendants')
# put page / moderations into singe dictionary, where key is page.id
# and value is sum of moderations, so if he can moderate page and descendants
# value will be MASK_PAGE + MASK_DESCENDANTS
page_moderator = map(lambda item: (item[0], item[1] * MASK_PAGE + item[2] * MASK_CHILDREN + item[3] * MASK_DESCENDANTS), pages_moderator_set)
page_moderator = dict(page_moderator)

# page moderator states
pm_qs = PageModeratorState.objects.filter(page__site=self._current_site)
pm_qs.query.group_by = ['page_id']
pagemoderator_states_id_set = pm_qs.values_list('page', flat=True)


ids = []
root_pages = []
pages = list(pages)
Expand All @@ -149,14 +128,22 @@ def set_items(self, request):
home_pk = Page.objects.drafts().get_home(self.current_site()).pk
except NoHomeFound:
home_pk = 0


# page moderator states
pm_qs = PageModeratorState.objects.filter(page__in=pages).order_by('page')
pm_states = defaultdict(list)
for state in pm_qs:
pm_states[state.page_id].append(state)

public_page_id_set = Page.objects.public().filter(
published=True, publisher_public__in=pages).values_list('id', flat=True)

# Unfortunately we cannot use the MPTT builtin code for pre-caching
# the children here, because MPTT expects the tree to be 'complete'
# and otherwise complaints about 'invalid item order'
cache_tree_children(pages)

for page in pages:


children = list(page.get_children())

Expand All @@ -176,23 +163,9 @@ def set_items(self, request):
page.permission_publish_cache = perm_publish_ids == Page.permissions.GRANT_ALL or page.pk in perm_publish_ids
page.permission_advanced_settings_cache = perm_advanced_settings_ids == Page.permissions.GRANT_ALL or page.pk in perm_advanced_settings_ids
page.permission_user_cache = request.user

if settings.CMS_MODERATOR:
# set public instance existence state
page.public_published_cache = page.publisher_public_id in published_public_page_id_set

# moderation for current user
moderation_value = 0
try:
moderation_value = page_moderator[page.pk]
except:
pass
page._moderation_value_cache = moderation_value
page._moderation_value_cache_for_user_id = request.user.pk

#moderation states
page._has_moderator_state_cache = page.pk in pagemoderator_states_id_set


page._moderator_state_cache = pm_states[page.pk]
page._public_published_cache = page.publisher_public_id in public_page_id_set
if page.root_node or self.is_filtered():
page.last = True
if len(children):
Expand Down Expand Up @@ -222,7 +195,7 @@ def set_items(self, request):
page.childrens = []
else:
page.childrens = children

# TODO: OPTIMIZE!!
titles = Title.objects.filter(page__in=ids)
for page in all_pages:# add the title and slugs and some meta data
Expand Down
13 changes: 0 additions & 13 deletions cms/admin/dialog/forms.py
Expand Up @@ -9,16 +9,3 @@ class PermissionForm(forms.Form):
copy_permissions = forms.BooleanField(label=_('Copy permissions'),
required=False, initial=True)

class ModeratorForm(forms.Form):
'''
Holds the specific field for moderator
'''
copy_moderation = forms.BooleanField(label=_('Copy moderation'),
required=False, initial=True)

class PermissionAndModeratorForm(PermissionForm, ModeratorForm):
'''
Subclass of both ModeratorForm AND PermissionForm, thus it inherits both
fields
'''
pass
22 changes: 4 additions & 18 deletions cms/admin/dialog/views.py
@@ -1,40 +1,26 @@
# -*- coding: utf-8 -*-
from cms.admin.dialog.forms import PermissionAndModeratorForm, PermissionForm, ModeratorForm
from cms.admin.dialog.forms import PermissionForm
from cms.models import Page
from django.conf import settings
from django.contrib.admin.views.decorators import staff_member_required
from django.http import Http404, HttpResponse
from django.shortcuts import render_to_response, get_object_or_404

def _form_class_selector():
'''
This replaces the magic that used to happen in forms, where a dynamic
class was generated at runtime. Now it's a bit cleaner...
'''
form_class = None
if settings.CMS_PERMISSION and settings.CMS_MODERATOR:
form_class = PermissionAndModeratorForm
elif settings.CMS_PERMISSION:
form_class = PermissionForm
elif settings.CMS_MODERATOR:
form_class = ModeratorForm
return form_class

@staff_member_required
def get_copy_dialog(request, page_id):
if not (settings.CMS_PERMISSION or settings.CMS_MODERATOR):
if not settings.CMS_PERMISSION:
return HttpResponse('')

page = get_object_or_404(Page, pk=page_id)
target = get_object_or_404(Page, pk=request.REQUEST['target'])

if not page.has_change_permission(request) or \
not target.has_add_permission(request): # pragma: no cover
not target.has_add_permission(request):
raise Http404

context = {
'dialog_id': 'dialog-copy',
'form': _form_class_selector()(), # class needs to be instanciated
'form': PermissionForm(), # class needs to be instantiated
'callback': request.REQUEST['callback'],
}
return render_to_response("admin/cms/page/dialog/copy.html", context)
13 changes: 5 additions & 8 deletions cms/admin/forms.py
Expand Up @@ -113,7 +113,7 @@ def clean(self):
#AdminFormsTests.test_clean_overwrite_url validates the form with when no page instance available
#Looks like just a theoretical corner case
title = page.get_title_obj(lang)
if title:
if title and slug:
oldslug = title.slug
title.slug = slug
title.save()
Expand All @@ -122,8 +122,9 @@ def clean(self):
except ValidationError,e:
title.slug = oldslug
title.save()
del cleaned_data['published']
self._errors['published'] = ErrorList(e.messages)
if 'slug' in cleaned_data:
del cleaned_data['slug']
self._errors['slug'] = ErrorList(e.messages)
return cleaned_data

def clean_slug(self):
Expand All @@ -149,11 +150,7 @@ class PageForm(PageAddForm):
help_text=_('Hook application to this page.'))
overwrite_url = forms.CharField(label=_('Overwrite URL'), max_length=255, required=False,
help_text=_('Keep this field empty if standard path should be used.'))
# moderation state
moderator_state = forms.IntegerField(widget=forms.HiddenInput, required=False, initial=Page.MODERATOR_CHANGED)
# moderation - message is a fake field
moderator_message = forms.CharField(max_length=1000, widget=forms.HiddenInput, required=False)


redirect = forms.CharField(label=_('Redirect'), max_length=255, required=False,
help_text=_('Redirects to this URL.'))
meta_description = forms.CharField(label='Description meta tag', required=False, widget=forms.Textarea,
Expand Down

0 comments on commit 8bfcd6f

Please sign in to comment.