general: add visibility settings to pages (#6200)
This commit is contained in:
parent
8ea6b07b8e
commit
d24b54cf59
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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-]+)/$',
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue