general: add visibility settings to pages (#6200)

This commit is contained in:
Frédéric Péters 2015-01-07 10:48:06 +01:00
parent 8ea6b07b8e
commit d24b54cf59
7 changed files with 51 additions and 2 deletions

View File

@ -17,6 +17,7 @@
import inspect
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
@ -40,6 +41,9 @@ class Page(models.Model):
parent = models.ForeignKey('self', null=True, blank=True)
order = models.PositiveIntegerField()
public = models.BooleanField(_('Public'), default=True)
groups = models.ManyToManyField(Group, blank=True)
_level = None
_children = None
@ -121,6 +125,23 @@ class Page(models.Model):
locked_placeholders = set(lockable_placeholders) - set(unlocked_placeholders)
return list(locked_placeholders)
def visibility(self):
if self.public:
return _('Public')
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
class CellBase(models.Model):
page = models.ForeignKey(Page)

View File

@ -22,10 +22,16 @@ from combo.data.models import Page
class PageForm(forms.ModelForm):
class Meta:
model = Page
exclude = ('order', )
exclude = ('order', 'public', 'groups')
def __init__(self, *args, **kwargs):
super(PageForm, self).__init__(*args, **kwargs)
templates = [(x[0], x[1]['name']) for x in settings.COMBO_PUBLIC_TEMPLATES.items()]
templates.sort(lambda x, y: cmp(x[1], y[1]))
self.fields['template_name'].widget = forms.Select(choices=templates)
class PageVisibilityForm(forms.ModelForm):
class Meta:
model = Page
fields = ('public', 'groups')

View File

@ -17,6 +17,9 @@
<div id="meta">
<label>Current template: </label> {{ object.template_name }}
/
<label>Visibility: </label> {{ object.visibility }}
(<a rel="popup" href="{% url 'combo-manager-page-visibility' pk=object.id %}">change</a>)
</div>
<div id="sidebar">

View File

@ -27,6 +27,8 @@ urlpatterns = patterns('combo.views',
name='combo-manager-page-view'),
url(r'^pages/(?P<pk>\w+)/edit$', views.page_edit,
name='combo-manager-page-edit'),
url(r'^pages/(?P<pk>\w+)/visibility$', views.page_visibility,
name='combo-manager-page-visibility'),
url(r'^pages/(?P<pk>\w+)/export$', views.page_export,
name='combo-manager-page-export'),
url(r'^pages/(?P<page_pk>\w+)/add-cell-to-(?P<ph_key>\w+)/(?P<cell_type>\w+)/(?P<variant>[\w-]+)/$',

View File

@ -30,7 +30,7 @@ from django.views.generic import (TemplateView, RedirectView, DetailView,
from combo.data.models import Page, CellBase, UnlockMarkerCell
from .forms import PageForm
from .forms import PageForm, PageVisibilityForm
class HomepageView(TemplateView):
@ -73,6 +73,16 @@ class PageEditView(UpdateView):
page_edit = PageEditView.as_view()
class PageVisibilityView(PageEditView):
model = Page
template_name = 'combo/page_add.html'
form_class = PageVisibilityForm
def get_success_url(self):
return reverse('combo-manager-page-view', kwargs={'pk': self.object.id})
page_visibility = PageVisibilityView.as_view()
class PageView(DetailView):
model = Page

View File

@ -37,6 +37,8 @@ def show_menu(context, level=0):
return context
menuitems = []
for sibling in page_of_level.get_siblings():
if not sibling.is_visible(context['request'].user):
continue
menuitem = {'page': sibling}
if sibling == page_of_level:
menuitem['selected'] = True

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.shortcuts import get_object_or_404, render
@ -30,6 +31,10 @@ def page(request):
raise Http404()
page = pages[-1]
if not page.is_visible(request.user):
raise PermissionDenied()
combo_template = settings.COMBO_PUBLIC_TEMPLATES[page.template_name]
cells = CellBase.get_cells(page_id=page.id)