예제 #1
0
    def __call__(self):
        postback = True

        form = self.request.form
        submitted = form.get('form.submitted', False)
        cancel_button = form.get('form.button.Cancel', None) is not None

        if submitted and not cancel_button:

            if not self.request.get('REQUEST_METHOD', 'GET') == 'POST':
                raise Forbidden

            authenticator = \
                    self.context.restrictedTraverse('@@authenticator', None)
            if not authenticator.verify():
                raise Forbidden

            inherit = bool(form.get('inherit', False))

            reindex = {}
            reindex.update( \
                dict([(v.context.getId(), v) for v in self.views
                    if v.update_inherit(inherit, reindex=False)]))

            entries = form.get('entries', [])
            roles = [r['id'] for r in self.roles()]
            settings = []
            for entry in entries:
                settings.append(dict(id = entry['id'],
                                     type = entry['type'],
                                     roles = [r for r in roles
                                              if entry.get('role_%s' % r,
                                                           False)]))
            if settings:
                reindex.update( \
                    dict([(v.context.getId(), v) for v in self.views
                        if v.update_role_settings(settings, reindex=False)]))

            if reindex:
                for context_id, view in reindex.items():
                    view.context.reindexObjectSecurity()
            IStatusMessage(self.request).addStatusMessage(_(u"Changes saved."),
                                                          type='info')

        if cancel_button:
            postback = False

        if postback:
            return self.template()
        else:
            context_state = \
                self.context.restrictedTraverse("@@plone_context_state")
            url = context_state.view_url()
            self.request.response.redirect(url)
        return self.template()
예제 #2
0
    def role_settings(self):
        available_roles = [(r['id'], False )for r in self.roles()]
        default_settings = [dict(id = STICKY[0],
                                 type = 'group',
                                 title = _(u'Logged-in users'),
                                 disabled = False,
                                 roles = dict(available_roles))]
        if self.views:
            settings = [view.role_settings() for view in self.views]
            principal_settings_map = (dict([(p_settings['id'], p_settings)
                                             for p_settings in view_settings])
                                             for view_settings in settings)

            try:
                first = next(principal_settings_map)
                if all(self._is_role_settings_equal(first, rest)
                        for rest in principal_settings_map):
                    return settings[0]
                else:
                    return default_settings
            except StopIteration:
                return settings[0]
        return default_settings