def _validateInput(self, form):
        """
        Validate possible form input
        """
        errors = {}
        if not form.get('title'):
            errors['title'] = _(u'Title field is required, please provide it.')
        url = form.get('url')
        if not url:
            errors['url'] = _(u'URL field is required, please provide it.')
        else:
            context = aq_inner(self.context)
            portal_state = getMultiAdapter((context, self.request), name=u'plone_portal_state')
            member = portal_state.member()
            if (url.startswith('tal:') or url.startswith('python:')) and \
                    not member.has_permission("collective.portaltabs: Use advanced expressions", portal_state.portal()):
                errors['url'] = _('adv_expression_permission_denied_msg',
                                  default=u'You have no permission to handle expressions like "tal:" or "python:".')
            if url.find('$')>-1 and not \
                    member.has_permission("collective.portaltabs: Use advanced expressions", portal_state.portal()):
                errors['url'] = _('tales_expression_permission_denied_msg',
                                  default=u'You have no permission to handle TALES expressions in static links.')


        return errors
    def form_save(self):
        form = self.request.form
        visible = form.get('visible')
        size = len(form.get('id', []))

        params = zip(form.get('id', []),
                     form.get('title', []),
                     form.get('url', []),
                     form.get('condition', []) or (' ' * (size-1)).split(' '), 
                    )

        stop = False
        for x in params:
            errors = self._validateInput({'id': x[0], 'title': x[1], 'url': x[2], 'condition': x[3]})
            if errors:
                self.errs[x[0]] = errors 
                stop = True
        if stop:
            return None
        
        for cat_action_id, title, url, condition in params:
            category_id, action_id = cat_action_id.split('|')
            action = self.portal_actions[category_id][action_id]

            if condition.strip():
                sm = getSecurityManager()
                if not sm.checkPermission(config.PERMISSION_MANAGE_TAB_CONDITION, self.context):
                    raise(Unauthorized("You user can't manage tab visibility expression"))

            action.manage_changeProperties(title = title,
                                           url_expr = _tallify(url),
                                           visible = cat_action_id in visible,
                                           available_expr=condition)
        return _(u'Changes saved')
 def handleSave(self, action):
     data, errors = self.extractData()
     if errors:
         self.status = self.formErrorsMessage
         return
     self.applyChanges(data)
     IStatusMessage(self.request).addStatusMessage(_(u"Changes saved"),
                                                   "info")
     self.request.response.redirect("@@manage-portaltabs")
    def form_upload(self):
        """Upload an action.xml compatible file"""
        fin = self.request.form['file']
        tree = ElementTree.parse(fin)

        managed_categories = set(x[0] for x in self.iter_categories())

        for el in tree.findall('object'):
            if el.get('meta_type') != 'CMF Action Category':
                continue

            category_id = el.get('name')
            if category_id not in managed_categories:
                continue

            existing_category = self.portal_actions[category_id]

            for action in el.findall('object'):
                if action.get('meta_type') != 'CMF Action':
                    continue

                action_id = action.get('name')

                props = {}
                permissions = []
                for prop_el in action:
                    name = prop_el.get('name')
                    if name == 'permissions':
                        permissions = [perm.get('value') for perm in prop_el.findall('element')]
                    else:
                        props[name] = prop_el.text or ''

                if action_id in existing_category:
                    action = self.portal_actions[category_id][action_id]
                    action.manage_changeProperties(title=props['title'],
                                                   description=props['description'],
                                                   url_expr=props['url_expr'],
                                                   icon_expr=props['icon_expr'],
                                                   available_expr=props['available_expr'],
                                                   permissions=permissions,
                                                   visible=(props['visible']=='True'),
                                                   )
                else:
                    action = Action(action_id,
                                    title=props['title'],
                                    description=props['description'],
                                    url_expr=props['url_expr'],
                                    icon_expr=props['icon_expr'],
                                    available_expr=props['available_expr'],
                                    permissions=permissions,
                                    visible=(props['visible']=='True'))
                    self.portal_actions[category_id]._setObject(action_id, action)
        return _(u'File uploaded')
    def form_move(self):
        """Move a tab up or down (means left or right commonly)"""
        action_id = self.request.get('move')
        where = self.request.get('where')
        category_id = self.request.get('action')
        category = self.portal_actions[category_id]

        if where == 'top':
            category.moveObjectsToTop(ids=[action_id])
        elif where == 'up':
            category.moveObjectsUp(ids=[action_id])
        elif where == 'down':
            category.moveObjectsDown(ids=[action_id])
        elif where == 'bottom':
            category.moveObjectsToBottom(ids=[action_id])
        else:
            raise ValueError('Bad arguments for moveTab')

        return _(u'Tab moved')
    def form_add(self):
        form = self.request.form
        errors = self._validateInput(form)
        if errors:
            self.errs['__add__'] = errors 
            return None

        category_id = form.get('action')
        title = form.get('title')
        action_id = form.get('id') or self.plone_utils.normalizeString(title)
        
        if form.get('condition', '').strip():
            sm = getSecurityManager()
            if not sm.checkPermission(config.PERMISSION_MANAGE_TAB_CONDITION, self.context):
                raise(Unauthorized("You user can't manage tab visibility expression"))
        
        action = Action(action_id,
                        title=title,
                        url_expr=_tallify(form.get('url')),
                        available_expr=form.get('condition'),
                        permissions=(permissions.View,))
        self.portal_actions[category_id]._setObject(action_id, action)
        return _(u'Tab added')
 def handleCancel(self, action):
     IStatusMessage(self.request).addStatusMessage(_(u"Edit cancelled"),
                                                   "info")
     self.request.response.redirect("%s/%s" % (self.context.absolute_url(),
                                               "@@manage-portaltabs"))
 def form_delete(self):
     ids = [self.request.get('Delete')]
     category_id = self.request.get('action')
     self.portal_actions[category_id].manage_delObjects(ids=ids)
     return _(u'Tab deleted')
 def confirm_message(self):
     if not self.confirmMessage:
         _ = self.translate
         self.confirmMessage = _(u'confirm_message', default=u'Confirm deletion?')
     return self.confirmMessage