Changeset 3244 in products


Ignore:
Timestamp:
Jun 21, 2011 9:00:59 AM (13 years ago)
Author:
chervol
Message:

merged plone4 branch

Location:
quintagroup.plonetabs/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.plonetabs/trunk

    • Property svn:mergeinfo set to /quintagroup.plonetabs/branches/plone4:3076-3243
  • quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py

    r874 r3244  
    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        if 'portal_tabs' in actions: 
     433            actions_tabs = actions['portal_tabs'] 
     434        else: 
     435            actions_tabs = [] 
     436        return portal_tabs_view.topLevelTabs(actions=actions_tabs) 
     437 
    435438    def selected_portal_tab(self): 
    436439        """See global-sections viewlet""" 
     
    438441        selected_tabs = selectedTabs('index_html', self.context, 
    439442            self.portal_tabs()) 
    440          
     443 
    441444        return selected_tabs['portal'] 
    442      
     445 
    443446    ########################## 
    444447    # 
     
    446449    # 
    447450    ########################## 
    448      
     451 
    449452    @kssaction 
    450453    def kss_insertModeLink(self): 
    451454        """Insert link which allows change categories between plain and rich""" 
    452455        ksscore = self.getCommandSet('core') 
    453          
     456 
    454457        html = self.link_template() 
    455458        target = ksscore.getCssSelector('.link-parent') 
    456459        ksscore.insertHTMLAfter(target, html, withKssSetup='False') 
    457      
     460 
    458461    @kssaction 
    459462    def kss_changeCategory(self, cat_name): 
    460463        """Change action category to manage""" 
    461464        ksscore = self.getCommandSet('core') 
    462          
     465 
    463466        # update actions list 
    464467        actionslist = self.getActionsList(category=cat_name) 
    465468        ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector('tabslist'), 
    466469            actionslist) 
    467          
     470 
    468471        # update autogenerated sections 
    469472        section = self.getAutoGenereatedSection(cat_name) 
     
    475478        ksscore.replaceInnerHTML( 
    476479            ksscore.getHtmlIdSelector('plonetabs-form-title'), title) 
    477          
     480 
    478481        # update category hidden field on adding form 
    479482        ksscore.setAttribute(ksscore.getCssSelector( 
     
    481484            'value', 
    482485            cat_name) 
    483          
     486 
    484487        # update state variable 'plonetabs-category' on client 
    485488        ksscore.setStateVar('plonetabs-category', cat_name) 
    486          
     489 
    487490        # hide adding form 
    488491        self.kss_hideAddForm() 
    489          
     492 
    490493        # issue portal status message 
    491494        self.kss_issueMessage(_(u"Category changed successfully.")) 
    492      
     495 
    493496    @kssaction 
    494497    def kss_toggleGeneratedTabs(self, field, checked='0'): 
     
    506509            else: 
    507510                message = _(u"Generated tabs switched off.") 
    508          
     511 
    509512        # update client 
    510513        ksscore = self.getCommandSet("core") 
    511514        content = self.getGeneratedTabs() 
    512515        ksscore.replaceInnerHTML(ksscore.getHtmlIdSelector('roottabs'), content) 
    513          
     516 
    514517        # update global-sections viewlet 
    515518        self.updatePortalTabsPageSection() 
    516          
     519 
    517520        # issue portal status message 
    518521        self.kss_issueMessage(message) 
    519      
     522 
    520523    @kssaction 
    521524    def kss_toggleRootsVisibility(self, id, checked='0'): 
     
    523526        portal = getMultiAdapter((aq_inner(self.context), self.request), 
    524527            name='plone_portal_state').portal() 
    525          
     528 
    526529        # remove prefix, added for making ids on configlet unique ("roottabs_") 
    527530        obj_id = id[len("roottabs_"):] 
    528          
     531 
    529532        if obj_id not in portal.objectIds(): 
    530533            raise KSSExplicitError, \ 
    531534                  _(u"Object with '${id}' id doesn't exist in portal root.", 
    532535                    mapping={'id': obj_id}) 
    533          
     536 
    534537        if checked == '1': 
    535538            checked = True 
    536539        else: 
    537540            checked = False 
    538          
     541 
    539542        portal[obj_id].update(excludeFromNav=not checked) 
    540          
     543 
    541544        # update client 
    542545        ksscore = self.getCommandSet("core") 
     
    550553            message = _(u"'${id}' object was excluded from navigation.", 
    551554                        mapping={'id':obj_id}) 
    552          
     555 
    553556        # update global-sections viewlet 
    554557        self.updatePortalTabsPageSection() 
    555          
     558 
    556559        # issue portal status message 
    557560        self.kss_issueMessage(message) 
    558      
     561 
    559562    @kssaction 
    560563    def kss_toggleActionsVisibility(self, id, checked='0', cat_name=None): 
     
    564567        self.updateAction(act_id, cat_name, 
    565568            {'id': act_id, 'visible': (checked == '1') or False}) 
    566          
     569 
    567570        # update client 
    568571        ksscore = self.getCommandSet("core") 
     
    577580                        mapping={'id':act_id}) 
    578581        self.updatePage(cat_name) 
    579      
     582 
    580583        # issue portal status message 
    581584        self.kss_issueMessage(message) 
    582      
     585 
    583586    @kssaction 
    584587    def kss_deleteAction(self, id, cat_name): 
     
    587590        act_id, category, action = self.kss_validateAction(id, cat_name) 
    588591        self.deleteAction(act_id, cat_name) 
    589          
     592 
    590593        # update client 
    591594        ksscore = self.getCommandSet("core") 
     
    593596        # we need kukit js action/command plugin 
    594597        ksscore.deleteNode(ksscore.getHtmlIdSelector(id)) 
    595          
     598 
    596599        # update different sections of page depending on actions category 
    597600        self.updatePage(cat_name) 
    598          
     601 
    599602        # issue portal status message 
    600603        self.kss_issueMessage(_(u"'${id}' action successfully removed.", 
    601604                                mapping={'id':act_id})) 
    602      
     605 
    603606    @kssaction 
    604607    def kss_addAction(self, cat_name): 
     
    606609        # extract posted data 
    607610        id, ie7bad_category, data = self.parseAddForm(self.request.form) 
    608          
     611 
    609612        # validate posted data 
    610613        errors = self.validateActionFields(cat_name, data) 
    611          
     614 
    612615        # if not errors find (or create) category and set action to it 
    613616        ksscore = self.getCommandSet('core') 
     
    615618        if not errors: 
    616619            action = self.addAction(cat_name, data) 
    617              
     620 
    618621            # update client 
    619622            # add one more action to actions list 
     
    621624            ksscore.insertHTMLAsLastChild(ksscore.getHtmlIdSelector('tabslist'), 
    622625                 content) 
    623              
     626 
    624627            # update reorder controls 
    625628            #self.kss_checkReorderControls(cat_name) 
    626              
     629 
    627630            # hide adding form 
    628631            ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'), 
     
    631634                ksscore.getCssSelector('form[name=addaction_form] ' 
    632635                                       '.headerAdvanced'), collapse='true') 
    633              
     636 
    634637            # set client state var 'plonetabs-addingTitle' to empty 
    635638            # string for correct id autogeneration functionality 
    636639            ksscore.setStateVar('plonetabs-addingTitle', '') 
    637              
     640 
    638641            # reset adding form 
    639642            self.kss_resetForm(ksscore.getHtmlIdSelector('addaction')) 
    640              
     643 
    641644            # remove focus from name input 
    642645            self.kss_blur(ksscore.getHtmlIdSelector('actname')) 
    643              
     646 
    644647            message = _(u"'${id}' action successfully added.", 
    645648                        mapping={'id':action.id}) 
    646649            msgtype = "info" 
    647              
     650 
    648651            # update page 
    649652            self.updatePage(cat_name) 
     
    654657                    ksscore.getCssSelector('form[name=addaction_form] ' 
    655658                                           '.headerAdvanced'), collapse='false') 
    656              
     659 
    657660            message = _(u"Please correct the indicated errors.") 
    658661            msgtype = "error" 
    659          
     662 
    660663        # update errors on client form 
    661664        self.kss_issueErrors(errors) 
    662          
     665 
    663666        # issue portal status message 
    664667        self.kss_issueMessage(message, msgtype) 
    665      
     668 
    666669    @kssaction 
    667670    def kss_hideAddForm(self): 
     
    669672        # no server changes, only update client 
    670673        ksscore = self.getCommandSet("core") 
    671          
     674 
    672675        # hide form itself 
    673676        ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'), 'adding') 
    674          
     677 
    675678        # collapse advanced section 
    676679        self.kss_toggleCollapsible( 
    677680            ksscore.getCssSelector('form[name=addaction_form] .headerAdvanced'), 
    678681            collapse='true') 
    679          
     682 
    680683        # reset form inputs 
    681684        self.kss_resetForm(ksscore.getHtmlIdSelector('addaction')) 
    682          
     685 
    683686        # set client state var 'plonetabs-addingTitle' to empty string for 
    684687        # correct id autogeneration functionality 
    685688        ksscore.setStateVar('plonetabs-addingTitle', '') 
    686          
     689 
    687690        # remove form errors if such exist 
    688691        self.kss_issueErrors({}) 
    689          
     692 
    690693        # issue portal status message 
    691694        self.kss_issueMessage(_(u"Adding canceled.")) 
    692      
     695 
    693696    @kssaction 
    694697    def kss_showEditForm(self, id, cat_name): 
    695698        """Show edit form for given action""" 
    696699        act_id, category, action = self.kss_validateAction(id, cat_name) 
    697          
     700 
    698701        # fetch data 
    699702        action_info = self.copyAction(action) 
    700703        action_info["editing"] = True 
    701          
     704 
    702705        # update client 
    703706        ksscore = self.getCommandSet("core") 
    704707        content = self.getActionsList(category=cat_name, tabs=[action_info,]) 
    705708        ksscore.replaceHTML(ksscore.getHtmlIdSelector(id), content) 
    706          
     709 
    707710        # focus name field 
    708711        ksscore.focus( 
    709712            ksscore.getCssSelector("#%s input[name=title_%s]" % (id, act_id))) 
    710          
     713 
    711714        # issue portal status message 
    712715        self.kss_issueMessage(_(u"Fill in required fields and click on Add.")) 
    713      
     716 
    714717    @kssaction 
    715718    def kss_hideEditForm(self, id, cat_name): 
    716719        """Hide edit form for given action""" 
    717720        act_id, category, action = self.kss_validateAction(id, cat_name) 
    718          
     721 
    719722        # update client 
    720723        ksscore = self.getCommandSet("core") 
    721724        content = self.getActionsList(category=cat_name, tabs=[action,]) 
    722725        ksscore.replaceHTML(ksscore.getHtmlIdSelector(id), content) 
    723          
     726 
    724727        # issue portal status message 
    725728        self.kss_issueMessage(_(u"Changes discarded.")) 
    726      
     729 
    727730    @kssaction 
    728731    def kss_editAction(self): 
    729732        """Update action's properties""" 
    730733        id, cat_name, data = self.parseEditForm(self.request.form) 
    731          
     734 
    732735        # get category and action to edit 
    733736        category = self.getActionCategory(cat_name) 
    734737        action = category[id] 
    735          
     738 
    736739        # validate posted data 
    737740        errors = self.validateActionFields(cat_name, data, 
    738741            allow_dup=(id == data['id'])) 
    739          
     742 
    740743        html_id = '%s%s%s' % (self.prefix, id, self.sufix) 
    741744        ksscore = self.getCommandSet('core') 
     
    743746        if not errors: 
    744747            action = self.updateAction(id, cat_name, data) 
    745              
     748 
    746749            # update client 
    747750            # replace action item with updated one 
    748751            content = self.getActionsList(category=cat_name, tabs=[action,]) 
    749752            ksscore.replaceHTML(ksscore.getHtmlIdSelector(html_id), content) 
    750              
     753 
    751754            message = _(u"'${id}' action successfully updated.", 
    752755                        mapping={'id':action.id}) 
    753756            msgtype = "info" 
    754              
     757 
    755758            # update page 
    756759            self.updatePage(cat_name) 
     
    758761            # issue error messages 
    759762            self.kss_issueErrors(errors, editform=id) 
    760              
     763 
    761764            # expand advanced section if there are errors in id, 
    762765            # action url or condition 
     
    766769                    ksscore.getCssSelector('#%s .headerAdvanced' % html_id), 
    767770                    collapse='false') 
    768              
     771 
    769772            message = _(u"Please correct the indicated errors.") 
    770773            msgtype = "error" 
    771          
     774 
    772775        # issue portal status message 
    773776        self.kss_issueMessage(message, msgtype) 
    774      
     777 
    775778    @kssaction 
    776779    def kss_orderActions(self): 
     
    779782        cat_name = form['cat_name'] 
    780783        category = self.getActionCategory(cat_name) 
    781          
     784 
    782785        # decode URI components and collect ids from request 
    783786        components = urllib.unquote(form['actions']).split('&') 
     
    787790            ids = [component[len(self.prefix):-len(self.sufix)] 
    788791                for component in components] 
    789          
     792 
    790793        # do actual sorting 
    791794        category.moveObjectsByDelta(ids, -len(category.objectIds())) 
    792          
     795 
    793796        # update client 
    794797        self.updatePage(cat_name) 
    795          
     798 
    796799        # issue portal status message 
    797800        self.kss_issueMessage(_(u"Actions successfully sorted.")) 
    798      
     801 
    799802    # 
    800803    # Utility Methods 
    801804    # 
    802      
     805 
    803806    def fixExpression(self, expr): 
    804807        """Fix expression appropriately for tal format""" 
     
    814817        else: 
    815818            return 'string:${object_url}/%s' % expr 
    816      
     819 
    817820    def copyAction(self, action): 
    818821        """Copy action to dictionary""" 
     
    821824            action_info[attr] = getattr(action, attr) 
    822825        return action_info 
    823      
     826 
    824827    def validateActionFields(self, cat_name, data, allow_dup=False): 
    825828        """Check action fields on validity""" 
    826829        errors = {} 
    827          
     830 
    828831        if allow_dup: 
    829832            # create dummy category to avoid id 
     
    833836            # get or create (if necessary) actions category 
    834837            category = self.getOrCreateCategory(cat_name) 
    835          
     838 
    836839        # validate action id 
    837840        chooser = INameChooser(category) 
     
    840843        except Exception, e: 
    841844            errors['id'] = self._formatError(e, **{'id':data['id']}) 
    842          
     845 
    843846        # validate action name 
    844847        if not data['title'].strip(): 
    845848            errors['title'] = _(u"Empty or invalid title specified") 
    846          
     849 
    847850        # validate condition expression 
    848851        if data['available_expr']: 
     
    855858                    mapping['expr_type'] = data['available_expr'][:idx] 
    856859                errors["available_expr"] = self._formatError(e, **mapping) 
    857          
     860 
    858861        # validate action expression 
    859862        if data['url_expr']: 
     
    866869                    mapping['expr_type'] = data['url_expr'][:idx] 
    867870                errors["url_expr"] = self._formatError(e, **mapping) 
    868          
     871 
    869872        return errors 
    870      
     873 
    871874    def _formatError(self, message, **kw): 
    872875        """Make error message a little bit prettier to ease translation""" 
     
    881884        message = message.strip() 
    882885        return _(unicode(message, charset), mapping=mapping) 
    883      
     886 
    884887    def processErrors(self, errors, prefix='', sufix=''): 
    885         """Add prefixes, sufixes to error ids  
     888        """Add prefixes, sufixes to error ids 
    886889        This is necessary during edit form validation, 
    887890        because every edit form on the page has it's own sufix (id) 
     
    889892        if not (prefix or sufix): 
    890893            return errors 
    891          
     894 
    892895        result = {} 
    893896        for key, value in errors.items(): 
    894897            result['%s%s%s' % (prefix, key, sufix)] = value 
    895          
     898 
    896899        return result 
    897      
     900 
    898901    def parseEditForm(self, form): 
    899902        """Extract all needed fields from edit form""" 
     
    902905        id = form['orig_id'] 
    903906        category = form['category'] 
    904          
     907 
    905908        # preprocess 'visible' field (checkbox needs special checking) 
    906909        if form.has_key('visible_%s' % id): 
     
    908911        else: 
    909912            form['visible_%s' % id] = False 
    910          
     913 
    911914        # collect all action fields 
    912915        for attr in ACTION_ATTRS: 
    913916            info[attr] = form['%s_%s' % (attr, id)] 
    914          
     917 
    915918        return (id, category, info) 
    916      
     919 
    917920    def parseAddForm(self, form): 
    918921        """Extract all needed fields from add form""" 
     
    920923        id = form['id'] 
    921924        category = form['category'] 
    922          
     925 
    923926        # preprocess 'visible' field (checkbox needs special checking) 
    924927        if form.has_key('visible') and form['visible']: 
     
    926929        else: 
    927930            form['visible'] = False 
    928          
     931 
    929932        # fix expression fields 
    930933        form['url_expr'] = self.fixExpression(form['url_expr']) 
    931          
     934 
    932935        # collect all action fields 
    933936        for attr in ACTION_ATTRS: 
    934937            info[attr] = form[attr] 
    935          
     938 
    936939        return (id, category, info) 
    937      
     940 
    938941    def getActionCategory(self, name): 
    939942        portal_actions = getToolByName(self.context, 'portal_actions') 
    940943        return portal_actions[name] 
    941      
     944 
    942945    def getOrCreateCategory(self, name): 
    943946        """Get or create (if necessary) category""" 
     
    948951            portal_actions._setObject(name, ActionCategory(name)) 
    949952        return self.getActionCategory(name) 
    950      
     953 
    951954    def setSiteProperties(self, **kw): 
    952955        """Change site_properties""" 
     
    955958        site_properties.manage_changeProperties(**kw) 
    956959        return True 
    957      
     960 
    958961    # 
    959962    # Utility methods for the kss actions management 
    960963    # 
    961      
     964 
    962965    def kss_validateAction(self, id, cat_name): 
    963966        """Check whether action with given id exists in cat_name category""" 
     
    968971                  _(u"'${cat_name}' action category does not exist.", 
    969972                    mapping={'cat_name': cat_name}) 
    970          
     973 
    971974        # extract action id from given list item id on client 
    972975        action_id = self.sufix and id[len(self.prefix):-len(self.sufix)] or \ 
     
    978981                  _(u"No '${id}' action in '${cat_name}' category.", 
    979982                    mapping={'id': action_id, 'cat_name': cat_name}) 
    980          
     983 
    981984        return (action_id, category, action) 
    982      
     985 
    983986    def kss_issueErrors(self, errors, editform=False, fields=ACTION_ATTRS): 
    984987        """Display error messages on the client""" 
     
    988991            self.kss_issueFieldError(ksscore, field, 
    989992                                     errors.get(field, False), editform, ts) 
    990      
     993 
    991994    def kss_issueFieldError(self, ksscore, name, error, editform, ts): 
    992995        """Issue this error message for the field""" 
     
    10111014            ksscore.clearChildNodes(field_error_selector) 
    10121015            ksscore.removeClass(field_selector, 'error') 
    1013      
     1016 
    10141017    def kss_toggleCollapsible(self, selector, collapsed=None, 
    10151018                              expanded=None, collapse=None): 
     
    10251028        if collapse is not None: 
    10261029            data = command.addParam('collapse', collapse) 
    1027      
     1030 
    10281031    def kss_resetForm(self, selector): 
    10291032        """KSS Server command to reset form on client""" 
    10301033        command = self.commands.addCommand('plonetabs-resetForm', selector) 
    1031      
     1034 
    10321035    def kss_blur(self, selector): 
    10331036        """KSS Server command to remove focus from input""" 
    10341037        command = self.commands.addCommand('plonetabs-blur', selector) 
    1035      
     1038 
    10361039    def kss_replaceOrInsert(self, selector, parentSelector, html, 
    10371040                            withKssSetup='True', alternativeHTML='', 
     
    10551058            data = command.addParam('positionSelectorType', 
    10561059                                    positionSelectorType) 
    1057      
     1060 
    10581061    def kss_issueMessage(self, message, msgtype="info"): 
    10591062        """"Issues portal status message and removes it afte 10 seconds""" 
     
    10651068            cmd_name='setStyle', name='display', value='none' 
    10661069        ) 
    1067      
     1070 
    10681071    def kss_timeout(self, selector, **kw): 
    10691072        """KSS Server command to execute plonetabs-timeout client action""" 
    10701073        command = self.commands.addCommand('plonetabs-timeout', selector, **kw) 
    1071      
     1074 
    10721075    def renderViewlet(self, manager, name): 
    10731076        if isinstance(manager, basestring): 
     
    10791082        renderer.update() 
    10801083        return renderer.render() 
    1081      
     1084 
    10821085    # 
    10831086    # Basic API to work with portal actions tool in a more pleasent way 
    10841087    # 
    1085      
     1088 
    10861089    def addAction(self, cat_name, data): 
    10871090        """Create and add new action to category with given name""" 
     
    10911094        category._setObject(id, action) 
    10921095        return action 
    1093      
     1096 
    10941097    def updateAction(self, id, cat_name, data): 
    10951098        """Update action with given id and category""" 
    10961099        new_id = data.pop('id') 
    10971100        category = self.getActionCategory(cat_name) 
    1098          
     1101 
    10991102        # rename action if necessary 
    11001103        if id != new_id: 
    11011104            category.manage_renameObject(id, new_id) 
    1102          
     1105 
    11031106        # get action 
    11041107        action = category[new_id] 
    1105          
     1108 
    11061109        # update action properties 
    11071110        for attr in data.keys(): 
    11081111            if data.has_key(attr): 
    11091112                action._setPropValue(attr, data[attr]) 
    1110          
     1113 
    11111114        return action 
    1112      
     1115 
    11131116    def deleteAction(self, id, cat_name): 
    11141117        """Delete action with given id from given category""" 
     
    11161119        category.manage_delObjects(ids=[id,]) 
    11171120        return True 
    1118      
     1121 
    11191122    def moveAction(self, id, cat_name, steps=0): 
    11201123        """Move action by a given steps""" 
     
    11271130            return True 
    11281131        return False 
    1129      
     1132 
    11301133    # 
    11311134    # KSS Methods that are used to update different parts of the page 
    11321135    # accordingly to category 
    11331136    # 
    1134      
     1137 
    11351138    def updatePage(self, category): 
    11361139        """Seek for according method in class and calls it if found 
     
    11421145        if hasattr(self, method_name): 
    11431146            getattr(self, method_name)() 
    1144      
     1147 
    11451148    def updatePortalTabsPageSection(self): 
    11461149        """Method for updating global-sections on client""" 
     
    11511154                                 withKssSetup='False', 
    11521155                                 selectorType='htmlid') 
    1153      
     1156 
    11541157    def updateSiteActionsPageSection(self): 
    11551158        """Method for updating site action on client""" 
     
    11641167                                 positionSelector="portal-searchbox", 
    11651168                                 positionSelectorType="htmlid") 
    1166          
     1169 
    11671170        #ksszope = self.getCommandSet("zope") 
    11681171        #ksszope.refreshViewlet( 
     
    11701173            #"plone.portalheader", 
    11711174            #"plone.site_actions") 
    1172      
     1175 
    11731176    def updateUserPageSection(self): 
    11741177        """Method for updating site action on client""" 
     
    11811184 
    11821185class PloneTabsMode(BrowserView): 
    1183      
     1186 
    11841187    def __call__(self): 
    11851188        mode = self.request.get(cookie_name, False) 
Note: See TracChangeset for help on using the changeset viewer.