Changeset 3081 in products for quintagroup.plonetabs


Ignore:
Timestamp:
Mar 28, 2011 2:27:47 PM (13 years ago)
Author:
gotcha
Message:

fix adding portal_tabs; whitespace

File:
1 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.plonetabs/branches/plone4/quintagroup/plonetabs/browser/plonetabs.py

    r874 r3081  
    4040 
    4141class PloneTabsControlPanel(PloneKSSView): 
    42      
     42 
    4343    implements(IPloneTabsControlPanel) 
    44      
     44 
    4545    template = ViewPageTemplateFile("templates/plonetabs.pt") 
    4646    actionslist_template = ViewPageTemplateFile("templates/actionslist.pt") 
     
    4848    autogenerated_list = ViewPageTemplateFile("templates/autogeneratedlist.pt") 
    4949    link_template = ViewPageTemplateFile("templates/changemodelink.pt") 
    50      
     50 
    5151    # custom templates used to update page sections 
    5252    sections_template = ViewPageTemplateFile("templates/sections.pt") 
    53      
     53 
    5454    # configuration variables 
    5555    prefix = "tabslist_" 
    5656    sufix = "" 
    57      
     57 
    5858    def __call__(self): 
    5959        """Perform the update and redirect if necessary, or render the page""" 
     
    6161        errors = {} 
    6262        context = aq_inner(self.context) 
    63          
     63 
    6464        form = self.request.form 
    6565        action = form.get("action", "") 
    6666        submitted = form.get('form.submitted', False) 
    67          
     67 
    6868        # action handler def handler(self, form) 
    6969        if submitted: 
     
    8282            else: 
    8383                postback = True 
    84          
     84 
    8585        mode = self.request.get(cookie_name, False) 
    8686        if mode in ('plain', 'rich'): 
     
    8989            self.request.response.setCookie(cookie_name, mode, path='/', 
    9090                                            expires=expires) 
    91          
     91 
    9292        if postback: 
    9393            return self.template(errors=errors) 
    94      
     94 
    9595    ######################################## 
    9696    # Methods for processing configlet posts 
    9797    ######################################## 
    98      
     98 
    9999    def manage_setAutogeneration(self, form, errors): 
    100100        """Process managing autogeneration settings""" 
    101          
     101 
    102102        # set excludeFromNav property for root objects 
    103103        portal = getMultiAdapter((aq_inner(self.context), self.request), 
     
    105105        generated_tabs = form.get("generated_tabs", '0') 
    106106        nonfolderish_tabs = form.get("nonfolderish_tabs", '0') 
    107          
     107 
    108108        for item in self.getRootTabs(): 
    109109            obj = getattr(portal, item['id'], None) 
     
    120120        else: 
    121121            self.setSiteProperties(disable_folder_sections=True) 
    122          
     122 
    123123        # set disable_nonfolderish_sections property 
    124124        if int(nonfolderish_tabs) == 1: 
     
    126126        else: 
    127127            self.setSiteProperties(disable_nonfolderish_sections=True) 
    128          
     128 
    129129        # after successfull form processing make redirect with good message 
    130130        IStatusMessage(self.request).addStatusMessage(_(u"Changes saved!"), 
     
    132132        self.redirect() 
    133133        return False 
    134      
     134 
    135135    def manage_addAction(self, form, errs): 
    136136        """Manage method to add a new action to given category, 
     
    139139        # extract posted data 
    140140        id, cat_name, data = self.parseAddForm(form) 
    141          
     141 
    142142        # validate posted data 
    143143        errors = self.validateActionFields(cat_name, data) 
    144          
     144 
    145145        # if not errors find (or create) category and set action to it 
    146146        if not errors: 
     
    156156                _(u"Please correct the indicated errors."), type="error") 
    157157            return True 
    158      
     158 
    159159    def manage_editAction(self, form, errs): 
    160160        """Manage Method to update action""" 
    161161        # extract posted data 
    162162        id, cat_name, data = self.parseEditForm(form) 
    163          
     163 
    164164        # get category and action to edit 
    165165        category = self.getActionCategory(cat_name) 
    166166        action = category[id] 
    167          
     167 
    168168        # validate posted data 
    169169        errors = self.validateActionFields(cat_name, data, 
    170170            allow_dup=(id == data['id'])) 
    171          
     171 
    172172        if not errors: 
    173173            action = self.updateAction(id, cat_name, data) 
     
    183183                _(u"Please correct the indicated errors."), type="error") 
    184184            return True 
    185      
     185 
    186186    def manage_deleteAction(self, form, errs): 
    187187        """Manage Method to delete action""" 
    188188        # extract posted data 
    189189        id, cat_name, data = self.parseEditForm(form) 
    190          
     190 
    191191        # get category and action to delete 
    192192        category = self.getActionCategory(cat_name) 
     
    203203                type="error") 
    204204            return True 
    205      
     205 
    206206    def manage_moveUpAction(self, form, errs): 
    207207        """Manage Method for moving up given action by one position""" 
    208208        # extract posted data 
    209209        id, cat_name, data = self.parseEditForm(form) 
    210          
     210 
    211211        # get category and action to move 
    212212        category = self.getActionCategory(cat_name) 
     
    222222                  mapping={'id': id, 'cat_name': cat_name}), type="error") 
    223223            return True 
    224      
     224 
    225225    def manage_moveDownAction(self, form, errs): 
    226226        """Manage Method for moving down given action by one position""" 
    227227        # extract posted data 
    228228        id, cat_name, data = self.parseEditForm(form) 
    229          
     229 
    230230        # get category and action to move 
    231231        category = self.getActionCategory(cat_name) 
     
    243243                type="error") 
    244244            return True 
    245      
     245 
    246246    def redirect(self, url="", search="", url_hash=""): 
    247247        """Redirect to @@plonetabs-controlpanel configlet""" 
     
    255255            url_hash = '#%s' % url_hash 
    256256        self.request.response.redirect("%s%s%s" % (url, search, url_hash)) 
    257      
     257 
    258258    ################################### 
    259259    # 
     
    261261    # 
    262262    ################################### 
    263      
     263 
    264264    def _charset(self): 
    265265        pp = getToolByName(self.context, 'portal_properties', None) 
     
    269269                return site_properties.getProperty('default_charset', 'utf-8') 
    270270        return 'utf-8' 
    271      
     271 
    272272    def getPageTitle(self, category="portal_tabs"): 
    273273        """See interface""" 
     
    275275        default_title = _(u"Plone '${cat_name}' Configuration", 
    276276                          mapping={'cat_name': category}) 
    277          
     277 
    278278        if not hasattr(portal_props, PROPERTY_SHEET): 
    279279            return default_title 
    280          
     280 
    281281        sheet = getattr(portal_props, PROPERTY_SHEET) 
    282282        if not hasattr(sheet, FIELD_NAME): 
    283283            return default_title 
    284          
     284 
    285285        field = sheet.getProperty(FIELD_NAME) 
    286286        dict = {} 
     
    288288            cat, title = line.split("|", 2) 
    289289            dict[cat] = title 
    290          
     290 
    291291        title = dict.get(category, None) 
    292292        if title is None: 
    293293            return default_title 
    294          
     294 
    295295        charset = self._charset() 
    296296        if not isinstance(title, unicode): 
    297297            title = title.decode(charset) 
    298          
     298 
    299299        return _(title) 
    300      
     300 
    301301    def hasActions(self, category="portal_tabs"): 
    302302        """See interface""" 
    303303        tool = getToolByName(self.context, "portal_actions") 
    304304        return len(tool.listActions(categories=[category,])) > 0 
    305      
     305 
    306306    def getPortalActions(self, category="portal_tabs"): 
    307307        """See interface""" 
    308308        portal_actions = getToolByName(self.context, "portal_actions") 
    309          
     309 
    310310        if category not in portal_actions.objectIds(): 
    311311            return [] 
    312          
     312 
    313313        actions = [] 
    314314        for item in portal_actions[category].objectValues(): 
    315315            if IAction.providedBy(item): 
    316316                actions.append(item) 
    317          
     317 
    318318        return actions 
    319      
     319 
    320320    def isGeneratedTabs(self): 
    321321        """See interface""" 
     
    323323                                        "portal_properties").site_properties 
    324324        return not site_properties.getProperty("disable_folder_sections", False) 
    325      
     325 
    326326    def isNotFoldersGenerated(self): 
    327327        """See interface""" 
     
    331331                                           False) 
    332332        return not prop 
    333      
     333 
    334334    def getActionsList(self, category="portal_tabs", errors={}, tabs=[]): 
    335335        """See interface""" 
     
    338338            kw['tabs'] = tabs 
    339339        return self.actionslist_template(**kw) 
    340      
     340 
    341341    def getAutoGenereatedSection(self, cat_name, errors={}): 
    342342        """See interface""" 
    343343        return self.autogenerated_template(category=cat_name, errors=errors) 
    344      
     344 
    345345    def getGeneratedTabs(self): 
    346346        """See interface""" 
    347347        return self.autogenerated_list() 
    348      
     348 
    349349    def getRootTabs(self): 
    350350        """See interface""" 
    351351        context = aq_inner(self.context) 
    352          
     352 
    353353        portal_catalog = getToolByName(context, 'portal_catalog') 
    354354        portal_properties = getToolByName(context, 'portal_properties') 
    355355        navtree_properties = getattr(portal_properties, 'navtree_properties') 
    356          
     356 
    357357        # Build result dict 
    358358        result = [] 
    359          
     359 
    360360        # check whether tabs autogeneration is turned on 
    361361        if not self.isGeneratedTabs(): 
    362362            return result 
    363          
     363 
    364364        query = {} 
    365365        rootPath = getNavigationRoot(context) 
    366366        query['path'] = {'query' : rootPath, 'depth' : 1} 
    367367        query['portal_type'] = utils.typesToList(context) 
    368          
     368 
    369369        sortAttribute = navtree_properties.getProperty('sortAttribute', None) 
    370370        if sortAttribute is not None: 
    371371            query['sort_on'] = sortAttribute 
    372              
     372 
    373373            sortOrder = navtree_properties.getProperty('sortOrder', None) 
    374374            if sortOrder is not None: 
    375375                query['sort_order'] = sortOrder 
    376          
     376 
    377377        if navtree_properties.getProperty('enable_wf_state_filtering', False): 
    378378            query['review_state'] = navtree_properties.getProperty( 
    379379                'wf_states_to_show', []) 
    380          
     380 
    381381        query['is_default_page'] = False 
    382382 
     
    402402                        'exclude_from_nav' : item.exclude_from_nav} 
    403403                result.append(data) 
    404          
     404 
    405405        return result 
    406      
     406 
    407407    def getCategories(self): 
    408408        """See interface""" 
    409409        portal_actions = getToolByName(self.context, "portal_actions") 
    410410        return portal_actions.objectIds() 
    411      
     411 
    412412    # 
    413413    # Methods to make this class looks like global sections viewlet 
    414414    # 
    415      
     415 
    416416    def test(self, condition, ifTrue, ifFalse): 
    417417        """See interface""" 
     
    420420        else: 
    421421            return ifFalse 
    422      
     422 
    423423    # methods for rendering global-sections viewlet via kss, 
    424424    # due to bug in macroContent when global-section list is empty, 
     
    430430        portal_tabs_view = getMultiAdapter((self.context, self.request), 
    431431            name="portal_tabs_view") 
    432          
    433         return portal_tabs_view.topLevelTabs(actions=actions) 
    434      
     432        return portal_tabs_view.topLevelTabs(actions=actions['portal_tabs']) 
     433 
    435434    def selected_portal_tab(self): 
    436435        """See global-sections viewlet""" 
     
    438437        selected_tabs = selectedTabs('index_html', self.context, 
    439438            self.portal_tabs()) 
    440          
     439 
    441440        return selected_tabs['portal'] 
    442      
     441 
    443442    ########################## 
    444443    # 
     
    446445    # 
    447446    ########################## 
    448      
     447 
    449448    @kssaction 
    450449    def kss_insertModeLink(self): 
    451450        """Insert link which allows change categories between plain and rich""" 
    452451        ksscore = self.getCommandSet('core') 
    453          
     452 
    454453        html = self.link_template() 
    455454        target = ksscore.getCssSelector('.link-parent') 
    456455        ksscore.insertHTMLAfter(target, html, withKssSetup='False') 
    457      
     456 
    458457    @kssaction 
    459458    def kss_changeCategory(self, cat_name): 
    460459        """Change action category to manage""" 
    461460        ksscore = self.getCommandSet('core') 
    462          
     461 
    463462        # update actions list 
    464463        actionslist = self.getActionsList(category=cat_name) 
    465464        ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector('tabslist'), 
    466465            actionslist) 
    467          
     466 
    468467        # update autogenerated sections 
    469468        section = self.getAutoGenereatedSection(cat_name) 
     
    475474        ksscore.replaceInnerHTML( 
    476475            ksscore.getHtmlIdSelector('plonetabs-form-title'), title) 
    477          
     476 
    478477        # update category hidden field on adding form 
    479478        ksscore.setAttribute(ksscore.getCssSelector( 
     
    481480            'value', 
    482481            cat_name) 
    483          
     482 
    484483        # update state variable 'plonetabs-category' on client 
    485484        ksscore.setStateVar('plonetabs-category', cat_name) 
    486          
     485 
    487486        # hide adding form 
    488487        self.kss_hideAddForm() 
    489          
     488 
    490489        # issue portal status message 
    491490        self.kss_issueMessage(_(u"Category changed successfully.")) 
    492      
     491 
    493492    @kssaction 
    494493    def kss_toggleGeneratedTabs(self, field, checked='0'): 
     
    506505            else: 
    507506                message = _(u"Generated tabs switched off.") 
    508          
     507 
    509508        # update client 
    510509        ksscore = self.getCommandSet("core") 
    511510        content = self.getGeneratedTabs() 
    512511        ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector('roottabs'), content) 
    513          
     512 
    514513        # update global-sections viewlet 
    515514        self.updatePortalTabsPageSection() 
    516          
     515 
    517516        # issue portal status message 
    518517        self.kss_issueMessage(message) 
    519      
     518 
    520519    @kssaction 
    521520    def kss_toggleRootsVisibility(self, id, checked='0'): 
     
    523522        portal = getMultiAdapter((aq_inner(self.context), self.request), 
    524523            name='plone_portal_state').portal() 
    525          
     524 
    526525        # remove prefix, added for making ids on configlet unique ("roottabs_") 
    527526        obj_id = id[len("roottabs_"):] 
    528          
     527 
    529528        if obj_id not in portal.objectIds(): 
    530529            raise KSSExplicitError, \ 
    531530                  _(u"Object with '${id}' id doesn't exist in portal root.", 
    532531                    mapping={'id': obj_id}) 
    533          
     532 
    534533        if checked == '1': 
    535534            checked = True 
    536535        else: 
    537536            checked = False 
    538          
     537 
    539538        portal[obj_id].update(excludeFromNav=not checked) 
    540          
     539 
    541540        # update client 
    542541        ksscore = self.getCommandSet("core") 
     
    550549            message = _(u"'${id}' object was excluded from navigation.", 
    551550                        mapping={'id':obj_id}) 
    552          
     551 
    553552        # update global-sections viewlet 
    554553        self.updatePortalTabsPageSection() 
    555          
     554 
    556555        # issue portal status message 
    557556        self.kss_issueMessage(message) 
    558      
     557 
    559558    @kssaction 
    560559    def kss_toggleActionsVisibility(self, id, checked='0', cat_name=None): 
     
    564563        self.updateAction(act_id, cat_name, 
    565564            {'id': act_id, 'visible': (checked == '1') or False}) 
    566          
     565 
    567566        # update client 
    568567        ksscore = self.getCommandSet("core") 
     
    577576                        mapping={'id':act_id}) 
    578577        self.updatePage(cat_name) 
    579      
     578 
    580579        # issue portal status message 
    581580        self.kss_issueMessage(message) 
    582      
     581 
    583582    @kssaction 
    584583    def kss_deleteAction(self, id, cat_name): 
     
    587586        act_id, category, action = self.kss_validateAction(id, cat_name) 
    588587        self.deleteAction(act_id, cat_name) 
    589          
     588 
    590589        # update client 
    591590        ksscore = self.getCommandSet("core") 
     
    593592        # we need kukit js action/command plugin 
    594593        ksscore.deleteNode(ksscore.getHtmlIdSelector(id)) 
    595          
     594 
    596595        # update different sections of page depending on actions category 
    597596        self.updatePage(cat_name) 
    598          
     597 
    599598        # issue portal status message 
    600599        self.kss_issueMessage(_(u"'${id}' action successfully removed.", 
    601600                                mapping={'id':act_id})) 
    602      
     601 
    603602    @kssaction 
    604603    def kss_addAction(self, cat_name): 
     
    606605        # extract posted data 
    607606        id, ie7bad_category, data = self.parseAddForm(self.request.form) 
    608          
     607 
    609608        # validate posted data 
    610609        errors = self.validateActionFields(cat_name, data) 
    611          
     610 
    612611        # if not errors find (or create) category and set action to it 
    613612        ksscore = self.getCommandSet('core') 
     
    615614        if not errors: 
    616615            action = self.addAction(cat_name, data) 
    617              
     616 
    618617            # update client 
    619618            # add one more action to actions list 
     
    621620            ksscore.insertHTMLAsLastChild(ksscore.getHtmlIdSelector('tabslist'), 
    622621                 content) 
    623              
     622 
    624623            # update reorder controls 
    625624            #self.kss_checkReorderControls(cat_name) 
    626              
     625 
    627626            # hide adding form 
    628627            ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'), 
     
    631630                ksscore.getCssSelector('form[name=addaction_form] ' 
    632631                                       '.headerAdvanced'), collapse='true') 
    633              
     632 
    634633            # set client state var 'plonetabs-addingTitle' to empty 
    635634            # string for correct id autogeneration functionality 
    636635            ksscore.setStateVar('plonetabs-addingTitle', '') 
    637              
     636 
    638637            # reset adding form 
    639638            self.kss_resetForm(ksscore.getHtmlIdSelector('addaction')) 
    640              
     639 
    641640            # remove focus from name input 
    642641            self.kss_blur(ksscore.getHtmlIdSelector('actname')) 
    643              
     642 
    644643            message = _(u"'${id}' action successfully added.", 
    645644                        mapping={'id':action.id}) 
    646645            msgtype = "info" 
    647              
     646 
    648647            # update page 
    649648            self.updatePage(cat_name) 
     
    654653                    ksscore.getCssSelector('form[name=addaction_form] ' 
    655654                                           '.headerAdvanced'), collapse='false') 
    656              
     655 
    657656            message = _(u"Please correct the indicated errors.") 
    658657            msgtype = "error" 
    659          
     658 
    660659        # update errors on client form 
    661660        self.kss_issueErrors(errors) 
    662          
     661 
    663662        # issue portal status message 
    664663        self.kss_issueMessage(message, msgtype) 
    665      
     664 
    666665    @kssaction 
    667666    def kss_hideAddForm(self): 
     
    669668        # no server changes, only update client 
    670669        ksscore = self.getCommandSet("core") 
    671          
     670 
    672671        # hide form itself 
    673672        ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'), 'adding') 
    674          
     673 
    675674        # collapse advanced section 
    676675        self.kss_toggleCollapsible( 
    677676            ksscore.getCssSelector('form[name=addaction_form] .headerAdvanced'), 
    678677            collapse='true') 
    679          
     678 
    680679        # reset form inputs 
    681680        self.kss_resetForm(ksscore.getHtmlIdSelector('addaction')) 
    682          
     681 
    683682        # set client state var 'plonetabs-addingTitle' to empty string for 
    684683        # correct id autogeneration functionality 
    685684        ksscore.setStateVar('plonetabs-addingTitle', '') 
    686          
     685 
    687686        # remove form errors if such exist 
    688687        self.kss_issueErrors({}) 
    689          
     688 
    690689        # issue portal status message 
    691690        self.kss_issueMessage(_(u"Adding canceled.")) 
    692      
     691 
    693692    @kssaction 
    694693    def kss_showEditForm(self, id, cat_name): 
    695694        """Show edit form for given action""" 
    696695        act_id, category, action = self.kss_validateAction(id, cat_name) 
    697          
     696 
    698697        # fetch data 
    699698        action_info = self.copyAction(action) 
    700699        action_info["editing"] = True 
    701          
     700 
    702701        # update client 
    703702        ksscore = self.getCommandSet("core") 
    704703        content = self.getActionsList(category=cat_name, tabs=[action_info,]) 
    705704        ksscore.replaceHTML(ksscore.getHtmlIdSelector(id), content) 
    706          
     705 
    707706        # focus name field 
    708707        ksscore.focus( 
    709708            ksscore.getCssSelector("#%s input[name=title_%s]" % (id, act_id))) 
    710          
     709 
    711710        # issue portal status message 
    712711        self.kss_issueMessage(_(u"Fill in required fields and click on Add.")) 
    713      
     712 
    714713    @kssaction 
    715714    def kss_hideEditForm(self, id, cat_name): 
    716715        """Hide edit form for given action""" 
    717716        act_id, category, action = self.kss_validateAction(id, cat_name) 
    718          
     717 
    719718        # update client 
    720719        ksscore = self.getCommandSet("core") 
    721720        content = self.getActionsList(category=cat_name, tabs=[action,]) 
    722721        ksscore.replaceHTML(ksscore.getHtmlIdSelector(id), content) 
    723          
     722 
    724723        # issue portal status message 
    725724        self.kss_issueMessage(_(u"Changes discarded.")) 
    726      
     725 
    727726    @kssaction 
    728727    def kss_editAction(self): 
    729728        """Update action's properties""" 
    730729        id, cat_name, data = self.parseEditForm(self.request.form) 
    731          
     730 
    732731        # get category and action to edit 
    733732        category = self.getActionCategory(cat_name) 
    734733        action = category[id] 
    735          
     734 
    736735        # validate posted data 
    737736        errors = self.validateActionFields(cat_name, data, 
    738737            allow_dup=(id == data['id'])) 
    739          
     738 
    740739        html_id = '%s%s%s' % (self.prefix, id, self.sufix) 
    741740        ksscore = self.getCommandSet('core') 
     
    743742        if not errors: 
    744743            action = self.updateAction(id, cat_name, data) 
    745              
     744 
    746745            # update client 
    747746            # replace action item with updated one 
    748747            content = self.getActionsList(category=cat_name, tabs=[action,]) 
    749748            ksscore.replaceHTML(ksscore.getHtmlIdSelector(html_id), content) 
    750              
     749 
    751750            message = _(u"'${id}' action successfully updated.", 
    752751                        mapping={'id':action.id}) 
    753752            msgtype = "info" 
    754              
     753 
    755754            # update page 
    756755            self.updatePage(cat_name) 
     
    758757            # issue error messages 
    759758            self.kss_issueErrors(errors, editform=id) 
    760              
     759 
    761760            # expand advanced section if there are errors in id, 
    762761            # action url or condition 
     
    766765                    ksscore.getCssSelector('#%s .headerAdvanced' % html_id), 
    767766                    collapse='false') 
    768              
     767 
    769768            message = _(u"Please correct the indicated errors.") 
    770769            msgtype = "error" 
    771          
     770 
    772771        # issue portal status message 
    773772        self.kss_issueMessage(message, msgtype) 
    774      
     773 
    775774    @kssaction 
    776775    def kss_orderActions(self): 
     
    779778        cat_name = form['cat_name'] 
    780779        category = self.getActionCategory(cat_name) 
    781          
     780 
    782781        # decode URI components and collect ids from request 
    783782        components = urllib.unquote(form['actions']).split('&') 
     
    787786            ids = [component[len(self.prefix):-len(self.sufix)] 
    788787                for component in components] 
    789          
     788 
    790789        # do actual sorting 
    791790        category.moveObjectsByDelta(ids, -len(category.objectIds())) 
    792          
     791 
    793792        # update client 
    794793        self.updatePage(cat_name) 
    795          
     794 
    796795        # issue portal status message 
    797796        self.kss_issueMessage(_(u"Actions successfully sorted.")) 
    798      
     797 
    799798    # 
    800799    # Utility Methods 
    801800    # 
    802      
     801 
    803802    def fixExpression(self, expr): 
    804803        """Fix expression appropriately for tal format""" 
     
    814813        else: 
    815814            return 'string:${object_url}/%s' % expr 
    816      
     815 
    817816    def copyAction(self, action): 
    818817        """Copy action to dictionary""" 
     
    821820            action_info[attr] = getattr(action, attr) 
    822821        return action_info 
    823      
     822 
    824823    def validateActionFields(self, cat_name, data, allow_dup=False): 
    825824        """Check action fields on validity""" 
    826825        errors = {} 
    827          
     826 
    828827        if allow_dup: 
    829828            # create dummy category to avoid id 
     
    833832            # get or create (if necessary) actions category 
    834833            category = self.getOrCreateCategory(cat_name) 
    835          
     834 
    836835        # validate action id 
    837836        chooser = INameChooser(category) 
     
    840839        except Exception, e: 
    841840            errors['id'] = self._formatError(e, **{'id':data['id']}) 
    842          
     841 
    843842        # validate action name 
    844843        if not data['title'].strip(): 
    845844            errors['title'] = _(u"Empty or invalid title specified") 
    846          
     845 
    847846        # validate condition expression 
    848847        if data['available_expr']: 
     
    855854                    mapping['expr_type'] = data['available_expr'][:idx] 
    856855                errors["available_expr"] = self._formatError(e, **mapping) 
    857          
     856 
    858857        # validate action expression 
    859858        if data['url_expr']: 
     
    866865                    mapping['expr_type'] = data['url_expr'][:idx] 
    867866                errors["url_expr"] = self._formatError(e, **mapping) 
    868          
     867 
    869868        return errors 
    870      
     869 
    871870    def _formatError(self, message, **kw): 
    872871        """Make error message a little bit prettier to ease translation""" 
     
    881880        message = message.strip() 
    882881        return _(unicode(message, charset), mapping=mapping) 
    883      
     882 
    884883    def processErrors(self, errors, prefix='', sufix=''): 
    885         """Add prefixes, sufixes to error ids  
     884        """Add prefixes, sufixes to error ids 
    886885        This is necessary during edit form validation, 
    887886        because every edit form on the page has it's own sufix (id) 
     
    889888        if not (prefix or sufix): 
    890889            return errors 
    891          
     890 
    892891        result = {} 
    893892        for key, value in errors.items(): 
    894893            result['%s%s%s' % (prefix, key, sufix)] = value 
    895          
     894 
    896895        return result 
    897      
     896 
    898897    def parseEditForm(self, form): 
    899898        """Extract all needed fields from edit form""" 
     
    902901        id = form['orig_id'] 
    903902        category = form['category'] 
    904          
     903 
    905904        # preprocess 'visible' field (checkbox needs special checking) 
    906905        if form.has_key('visible_%s' % id): 
     
    908907        else: 
    909908            form['visible_%s' % id] = False 
    910          
     909 
    911910        # collect all action fields 
    912911        for attr in ACTION_ATTRS: 
    913912            info[attr] = form['%s_%s' % (attr, id)] 
    914          
     913 
    915914        return (id, category, info) 
    916      
     915 
    917916    def parseAddForm(self, form): 
    918917        """Extract all needed fields from add form""" 
     
    920919        id = form['id'] 
    921920        category = form['category'] 
    922          
     921 
    923922        # preprocess 'visible' field (checkbox needs special checking) 
    924923        if form.has_key('visible') and form['visible']: 
     
    926925        else: 
    927926            form['visible'] = False 
    928          
     927 
    929928        # fix expression fields 
    930929        form['url_expr'] = self.fixExpression(form['url_expr']) 
    931          
     930 
    932931        # collect all action fields 
    933932        for attr in ACTION_ATTRS: 
    934933            info[attr] = form[attr] 
    935          
     934 
    936935        return (id, category, info) 
    937      
     936 
    938937    def getActionCategory(self, name): 
    939938        portal_actions = getToolByName(self.context, 'portal_actions') 
    940939        return portal_actions[name] 
    941      
     940 
    942941    def getOrCreateCategory(self, name): 
    943942        """Get or create (if necessary) category""" 
     
    948947            portal_actions._setObject(name, ActionCategory(name)) 
    949948        return self.getActionCategory(name) 
    950      
     949 
    951950    def setSiteProperties(self, **kw): 
    952951        """Change site_properties""" 
     
    955954        site_properties.manage_changeProperties(**kw) 
    956955        return True 
    957      
     956 
    958957    # 
    959958    # Utility methods for the kss actions management 
    960959    # 
    961      
     960 
    962961    def kss_validateAction(self, id, cat_name): 
    963962        """Check whether action with given id exists in cat_name category""" 
     
    968967                  _(u"'${cat_name}' action category does not exist.", 
    969968                    mapping={'cat_name': cat_name}) 
    970          
     969 
    971970        # extract action id from given list item id on client 
    972971        action_id = self.sufix and id[len(self.prefix):-len(self.sufix)] or \ 
     
    978977                  _(u"No '${id}' action in '${cat_name}' category.", 
    979978                    mapping={'id': action_id, 'cat_name': cat_name}) 
    980          
     979 
    981980        return (action_id, category, action) 
    982      
     981 
    983982    def kss_issueErrors(self, errors, editform=False, fields=ACTION_ATTRS): 
    984983        """Display error messages on the client""" 
     
    988987            self.kss_issueFieldError(ksscore, field, 
    989988                                     errors.get(field, False), editform, ts) 
    990      
     989 
    991990    def kss_issueFieldError(self, ksscore, name, error, editform, ts): 
    992991        """Issue this error message for the field""" 
     
    10111010            ksscore.clearChildNodes(field_error_selector) 
    10121011            ksscore.removeClass(field_selector, 'error') 
    1013      
     1012 
    10141013    def kss_toggleCollapsible(self, selector, collapsed=None, 
    10151014                              expanded=None, collapse=None): 
     
    10251024        if collapse is not None: 
    10261025            data = command.addParam('collapse', collapse) 
    1027      
     1026 
    10281027    def kss_resetForm(self, selector): 
    10291028        """KSS Server command to reset form on client""" 
    10301029        command = self.commands.addCommand('plonetabs-resetForm', selector) 
    1031      
     1030 
    10321031    def kss_blur(self, selector): 
    10331032        """KSS Server command to remove focus from input""" 
    10341033        command = self.commands.addCommand('plonetabs-blur', selector) 
    1035      
     1034 
    10361035    def kss_replaceOrInsert(self, selector, parentSelector, html, 
    10371036                            withKssSetup='True', alternativeHTML='', 
     
    10551054            data = command.addParam('positionSelectorType', 
    10561055                                    positionSelectorType) 
    1057      
     1056 
    10581057    def kss_issueMessage(self, message, msgtype="info"): 
    10591058        """"Issues portal status message and removes it afte 10 seconds""" 
     
    10651064            cmd_name='setStyle', name='display', value='none' 
    10661065        ) 
    1067      
     1066 
    10681067    def kss_timeout(self, selector, **kw): 
    10691068        """KSS Server command to execute plonetabs-timeout client action""" 
    10701069        command = self.commands.addCommand('plonetabs-timeout', selector, **kw) 
    1071      
     1070 
    10721071    def renderViewlet(self, manager, name): 
    10731072        if isinstance(manager, basestring): 
     
    10791078        renderer.update() 
    10801079        return renderer.render() 
    1081      
     1080 
    10821081    # 
    10831082    # Basic API to work with portal actions tool in a more pleasent way 
    10841083    # 
    1085      
     1084 
    10861085    def addAction(self, cat_name, data): 
    10871086        """Create and add new action to category with given name""" 
     
    10911090        category._setObject(id, action) 
    10921091        return action 
    1093      
     1092 
    10941093    def updateAction(self, id, cat_name, data): 
    10951094        """Update action with given id and category""" 
    10961095        new_id = data.pop('id') 
    10971096        category = self.getActionCategory(cat_name) 
    1098          
     1097 
    10991098        # rename action if necessary 
    11001099        if id != new_id: 
    11011100            category.manage_renameObject(id, new_id) 
    1102          
     1101 
    11031102        # get action 
    11041103        action = category[new_id] 
    1105          
     1104 
    11061105        # update action properties 
    11071106        for attr in data.keys(): 
    11081107            if data.has_key(attr): 
    11091108                action._setPropValue(attr, data[attr]) 
    1110          
     1109 
    11111110        return action 
    1112      
     1111 
    11131112    def deleteAction(self, id, cat_name): 
    11141113        """Delete action with given id from given category""" 
     
    11161115        category.manage_delObjects(ids=[id,]) 
    11171116        return True 
    1118      
     1117 
    11191118    def moveAction(self, id, cat_name, steps=0): 
    11201119        """Move action by a given steps""" 
     
    11271126            return True 
    11281127        return False 
    1129      
     1128 
    11301129    # 
    11311130    # KSS Methods that are used to update different parts of the page 
    11321131    # accordingly to category 
    11331132    # 
    1134      
     1133 
    11351134    def updatePage(self, category): 
    11361135        """Seek for according method in class and calls it if found 
     
    11421141        if hasattr(self, method_name): 
    11431142            getattr(self, method_name)() 
    1144      
     1143 
    11451144    def updatePortalTabsPageSection(self): 
    11461145        """Method for updating global-sections on client""" 
     
    11511150                                 withKssSetup='False', 
    11521151                                 selectorType='htmlid') 
    1153      
     1152 
    11541153    def updateSiteActionsPageSection(self): 
    11551154        """Method for updating site action on client""" 
     
    11641163                                 positionSelector="portal-searchbox", 
    11651164                                 positionSelectorType="htmlid") 
    1166          
     1165 
    11671166        #ksszope = self.getCommandSet("zope") 
    11681167        #ksszope.refreshViewlet( 
     
    11701169            #"plone.portalheader", 
    11711170            #"plone.site_actions") 
    1172      
     1171 
    11731172    def updateUserPageSection(self): 
    11741173        """Method for updating site action on client""" 
     
    11811180 
    11821181class PloneTabsMode(BrowserView): 
    1183      
     1182 
    11841183    def __call__(self): 
    11851184        mode = self.request.get(cookie_name, False) 
Note: See TracChangeset for help on using the changeset viewer.