general: add visibility settings to cells (#6201)

This commit is contained in:
Frédéric Péters 2015-01-13 10:41:46 +01:00
parent d96caac307
commit f703a6799b
6 changed files with 67 additions and 13 deletions

View File

@ -34,6 +34,20 @@ import cmsplugin_blurp.utils
from .library import register_cell_class, get_cell_classes, get_cell_class
def element_is_visible(element, user=None):
if element.public:
return True
if user is None:
return False
if user.is_anonymous():
return False
page_groups = element.groups.all()
if not page_groups:
# user is logged in, no group restriction in place
return True
return len(set(page_groups).intersection(user.groups.all())) > 0
class Page(models.Model):
title = models.CharField(_('Title'), max_length=50)
slug = models.SlugField()
@ -133,23 +147,17 @@ class Page(models.Model):
return _('Private (%s)') % ', '.join([x.name for x in self.groups.all()])
def is_visible(self, user=None):
if self.public:
return True
if user is None:
return False
if user.is_anonymous():
return False
page_groups = self.groups.all()
if not page_groups:
# user is logged in, no group restriction in place
return True
return len(set(page_groups).intersection(user.groups.all())) > 0
return element_is_visible(self, user=user)
class CellBase(models.Model):
page = models.ForeignKey(Page)
placeholder = models.CharField(max_length=20)
order = models.PositiveIntegerField()
public = models.BooleanField(_('Public'), default=True)
groups = models.ManyToManyField(Group, blank=True)
default_form_class = None
visible = True
@ -215,12 +223,20 @@ class CellBase(models.Model):
return self.default_form_class
fields = [x.name for x in self._meta.local_concrete_fields
if x.name not in ('id', 'page', 'placeholder', 'order')]
if x.name not in ('id', 'page', 'placeholder', 'order',
'public', 'groups')]
if not fields:
return None
return model_forms.modelform_factory(self.__class__, fields=fields)
def get_visibility_form_class(self):
return model_forms.modelform_factory(self.__class__,
fields=['public', 'groups'])
def is_visible(self, user=None):
return element_is_visible(self, user=user)
@register_cell_class
class TextCell(CellBase):

View File

@ -6,7 +6,9 @@
<p>There are no options for this cell</p>
{% endif %}
<div class="buttons">
<a rel="popup" href="{% url 'combo-manager-page-delete-cell' page_pk=page.id cell_reference=cell.get_reference %}">Delete</a> | <a class="close-button" href="#">Close</a>
<a rel="popup" href="{% url 'combo-manager-page-delete-cell' page_pk=page.id cell_reference=cell.get_reference %}">Delete</a> |
<a rel="popup" href="{% url 'combo-manager-page-visibility-cell' page_pk=page.id cell_reference=cell.get_reference %}">Visibility</a> |
<a class="close-button" href="#">Close</a>
{% if form %}
<button class="save">Save</button>
{% endif %}

View File

@ -0,0 +1,22 @@
{% extends "combo/manager_base.html" %}
{% load i18n %}
{% block appbar %}
<h2>Cell Visibility</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button>{% trans "Save" %}</button>
{% if object.id %}
<a class="cancel" href="{{ object.get_absolute_url }}">{% trans 'Cancel' %}</a>
{% else %}
<a class="cancel" href="{% url 'combo-manager-homepage' %}">{% trans 'Cancel' %}</a>
{% endif %}
</div>
</form>
{% endblock %}

View File

@ -39,6 +39,9 @@ urlpatterns = patterns('combo.views',
name='combo-manager-page-edit-cell'),
url(r'^pages/(?P<page_pk>\w+)/cell/(?P<cell_reference>[\w-]+)/delete$', views.page_delete_cell,
name='combo-manager-page-delete-cell'),
url(r'^pages/(?P<page_pk>\w+)/cell/(?P<cell_reference>[\w-]+)/visibility$',
views.page_cell_visibility,
name='combo-manager-page-visibility-cell'),
url(r'^pages/(?P<page_pk>\w+)/order$', views.cell_order,
name='combo-manager-cell-order'),
url(r'^pages/order$', views.page_order,

View File

@ -193,6 +193,15 @@ class PageDeleteCellView(DeleteView):
page_delete_cell = PageDeleteCellView.as_view()
class PageCellVisibilityView(PageEditCellView):
template_name = 'combo/cell_visibility.html'
def get_form_class(self):
return self.object.get_visibility_form_class()
page_cell_visibility = PageCellVisibilityView.as_view()
def cell_order(request, page_pk):
for cell in CellBase.get_cells(page_id=page_pk):
old_order = cell.order

View File

@ -76,6 +76,8 @@ def page(request):
cells.extend([x for x in unlocker_cells if x.page_id == page_id and
x.placeholder == placeholder_key])
cells = [x for x in cells if x.is_visible(user=request.user)]
ctx = {
'page': page,
'page_cells': cells,