general: add visibility settings to cells (#6201)
This commit is contained in:
parent
d96caac307
commit
f703a6799b
|
@ -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):
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 %}
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue