Changeset 1094
- Timestamp:
- 03/20/08 10:15:51
- Files:
-
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py (modified) (10 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.css (modified) (2 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/actionslist.pt (modified) (5 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/plonetabs.pt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py
r1093 r1094 1 import copy 1 import copy, sys 2 2 3 3 from Acquisition import aq_inner … … 9 9 from zope.exceptions import UserError 10 10 11 from OFS.CopySupport import CopyError 12 11 13 from Products.CMFCore.utils import getToolByName 12 14 from Products.CMFCore.interfaces import IAction, IActionCategory 13 15 from Products.CMFCore.ActionInformation import Action, ActionCategory 16 from Products.CMFCore.Expression import Expression 14 17 from Products.CMFEditions.setuphandlers import DEFAULT_POLICIES 15 18 from Products.CMFPlone import PloneMessageFactory as _ … … 30 33 from interfaces import IPloneTabsControlPanel 31 34 32 ACTION_ATTRS = ["id", "visible", " description", "url_expr", "title", "available_expr"]35 ACTION_ATTRS = ["id", "visible", "url_expr", "title", "available_expr"] 33 36 34 37 class PloneTabsControlPanel(PloneKSSView): … … 57 60 elif action == "edit_action": 58 61 if submitted: 59 p ass62 postback = self.manage_editAction(form, errors) 60 63 elif action == "delete_action": 61 64 postback = self.manage_deleteAction(self.request, errors) … … 69 72 if submitted: 70 73 postback = self.manage_setAutogeneration(form, errors) 74 else: 75 postback = True 71 76 72 77 if postback: … … 141 146 action._setPropValue(prop, value) 142 147 except Exception, e: 143 errors[prop] = _(u"%s" % str(e))148 errors[prop] = "%s" % str(e) 144 149 145 150 # if not errors find (or create) category and set action to it … … 152 157 portal_actions._setObject(category, ActionCategory(category)) 153 158 except Exception, e: 154 errors["select_category"] = _(u"%s" % str(e))159 errors["select_category"] = "%s" % str(e) 155 160 else: 156 161 cat_container = portal_actions[category] … … 162 167 cat_container._setObject(id, action) 163 168 except Exception, e: 164 errors["id"] = _(u"%s" % str(e))169 errors["id"] = "%s" % str(e) 165 170 166 171 if not errors: … … 171 176 IStatusMessage(self.request).addStatusMessage(_(u"Please correct the indicated errors."), type="error") 172 177 return True 178 179 def manage_editAction(self, form, errors): 180 """ Add a new action to given category, if category doesn't exist, create it """ 181 portal_actions = getToolByName(self.context, "portal_actions") 182 183 # extract data from request's form 184 orig_id = form.get("orig_id") 185 new_id = form.get("id_%s" % orig_id) 186 category = form.get("category") 187 188 # before updating action we validate action id/category 189 if category not in portal_actions.objectIds(): 190 IStatusMessage(self.request).addStatusMessage(_(u"Unexistent root portal actions category '%s'" % category), type="error") 191 else: 192 cat_container = portal_actions[category] 193 if orig_id not in map(lambda x: x.id, filter(lambda x: IAction.providedBy(x), cat_container.objectValues())): 194 IStatusMessage(self.request).addStatusMessage(_(u"'%s' action does not exist in '%s' category" % (orig_id, category)), type="error") 195 else: 196 # validate input 197 # id is required 198 if not new_id: 199 errors["id_%s" % orig_id] = _(u"Id field is required") 200 201 # title is required 202 if not form.get("title_%s" % orig_id): 203 errors["title_%s" % orig_id] = _(u"Title field is required") 204 205 # check action for valid tal expression 206 try: 207 Expression(form.get("url_expr_%s" % orig_id)) 208 except Exception, e: 209 errors["url_expr_%s" % orig_id] = "%s" % str(e) 210 211 # check condition for valid tal expression 212 try: 213 Expression(form.get("available_expr_%s" % orig_id)) 214 except Exception, e: 215 errors["available_expr_%s" % orig_id] = "%s" % str(e) 216 217 # check visible for integer 218 try: 219 int(form.get("visible_%s" % orig_id, '0')) 220 except Exception, e: 221 errors["visible_%s" % orig_id] = "%s" % str(e) 222 223 # rename action if needed 224 if not errors: 225 if new_id != orig_id: 226 try: 227 cat_container.manage_renameObject(orig_id, new_id) 228 except CopyError, e: 229 errors["id_%s" % orig_id] = _(u"Invalid id") 230 except: 231 exctype, v = sys.exc_info()[:2] 232 errors["id_%s" % orig_id] = "%s" % str(v) 233 234 if not errors: 235 action = cat_container[new_id] 236 237 for prop in ACTION_ATTRS: 238 if prop != "id": 239 if prop == "visible": 240 value = int(form.get("%s_%s" % (prop, orig_id), '0')) 241 else: 242 value = form.get("%s_%s" % (prop, orig_id)) 243 action._setPropValue(prop, value) 244 245 IStatusMessage(self.request).addStatusMessage(_(u"'%s' action saved." % new_id), type="info") 246 self.redirect(search="category=%s" % category) 247 248 return False 249 250 IStatusMessage(self.request).addStatusMessage(_(u"Please correct the indicated errors."), type="error") 251 return True 173 252 174 253 def manage_deleteAction(self, request, errors): … … 300 379 return not site_properties.getProperty("disable_nonfolderish_sections", False) 301 380 302 def getActionsList(self, category="portal_tabs" ):303 """ See interface """ 304 return self.actionslist_template(category=category )381 def getActionsList(self, category="portal_tabs", errors={}): 382 """ See interface """ 383 return self.actionslist_template(category=category, errors=errors) 305 384 306 385 def getGeneratedTabs(self): qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.css
r1093 r1094 40 40 #app #addaction.adding .add-controls, 41 41 .kssTabsActive #app.viewing #tabslist li .url-helper, 42 .kssTabsActive #app.viewing #tabslist li .tab-title { 42 .kssTabsActive #app.viewing #tabslist li .tab-title, 43 .kssTabsActive #app .editcancel { 43 44 display: block; 44 45 } … … 69 70 .kssTabsActive #app .change-button, 70 71 .kssTabsActive #app .up-arrow, 71 .kssTabsActive #app .down-arrow { 72 .kssTabsActive #app .down-arrow, 73 #app .editcancel { 72 74 display: none; 73 75 } qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/actionslist.pt
r1093 r1094 1 1 <tal:tabs tal:define="test nocall:view/test; 2 2 dummy python:request.RESPONSE.setHeader('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT'); 3 category python:options.get('category', None) or 'portal_tabs'" 3 category python:options.get('category', None) or 'portal_tabs'; 4 errors options/errors|nothing" 4 5 tal:repeat="tab options/tabs|python:view.getPortalActions(category)"> 5 6 <li tal:define="id tab/id; … … 13 14 14 15 <img class="drag-handle" src="++resource++drag.gif" alt="" height="11" width="25" /> 15 16 <div class="bridge">17 <input type="checkbox" class="visibility" value="1" name="visible" title="visibility"18 tal:attributes="checked python:test(visible, 'checked', None);19 name string:${attrs/name}_${id}" />20 </div>21 16 22 17 <a class="delete" href="#" … … 43 38 name string:${attrs/name}_${id}"> 44 39 40 <input type="hidden" name="orig_id" value="orig_id" tal:attributes="value id" /> 45 41 <input type="hidden" name="action" value="edit_action" /> 42 <input type="hidden" name="category" value="current_category" tal:attributes="value category" /> 46 43 <input type="hidden" name="form.submitted:boolean" value="True" /> 47 44 48 <dl> 45 <div class="bridge"> 46 <input type="checkbox" class="visibility" value="1" name="visible" title="visibility" 47 tal:define="name string:${attrs/name}_${id}; 48 submitted request/form.submitted|nothing; 49 checked python:test(submitted, test(request.get(name, []) != [], 'checked', None), test(visible, 'checked', None))" 50 tal:attributes="checked checked; 51 name name" /> 52 </div> 53 54 <dl tal:define="name string:title_${id}; 55 error python:errors.get(name, ''); 56 tab_title tab/title" 57 tal:attributes="class python:test(error, 'error', '')"> 49 58 <dt><label>Name</label></dt> 50 <dd><input type="text" value="" name="title" 51 tal:attributes="value tab/title; 52 name string:${attrs/name}_${id}" /></dd> 59 <dd> 60 <span tal:content="error">Validation error output</span> 61 <input type="text" value="" name="title" 62 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_title); 63 name name" /></dd> 53 64 </dl> 54 65 … … 56 67 <dt class="headerAdvanced">Advanced</dt> 57 68 <dd class="contentAdvanced"> 58 <dl> 69 <dl tal:define="name string:url_expr_${id}; 70 error python:errors.get(name, ''); 71 tab_url tab/url_expr" 72 tal:attributes="class python:test(error, 'error', '')"> 59 73 <dt><label>URL (Expression)</label></dt> 60 <dd><input type="text" value="" name="url_expr" size="30" 61 tal:attributes="value tab/url_expr; 62 name string:${attrs/name}_${id}" /></dd> 74 <dd> 75 <span tal:content="error">Validation error output</span> 76 <input type="text" value="" name="url_expr" size="30" 77 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_url); 78 name name" /></dd> 63 79 </dl> 64 <dl> 80 <dl tal:define="name string:id_${id}; 81 error python:errors.get(name, ''); 82 tab_id tab/id" 83 tal:attributes="class python:test(error, 'error', '')"> 65 84 <dt><label>Id</label></dt> 66 <dd><input type="text" value="" name="id" 67 tal:attributes="value tab/id; 68 name string:${attrs/name}_${id}" /></dd> 85 <dd> 86 <span tal:content="error">Validation error output</span> 87 <input type="text" value="" name="id" 88 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_id); 89 name name" /></dd> 69 90 </dl> 70 <dl> 91 <dl tal:define="name string:available_expr_${id}; 92 error python:errors.get(name, ''); 93 tab_cond tab/available_expr" 94 tal:attributes="class python:test(error, 'error', '')"> 71 95 <dt><label>Condition (Expression)</label></dt> 72 <dd><input type="text" value="" name="condition" size="30" 73 tal:attributes="value tab/available_expr; 74 name string:${attrs/name}_${id}" /></dd> 96 <dd> 97 <span tal:content="error">Validation error output</span> 98 <input type="text" value="" name="available_expr" size="30" 99 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_cond); 100 name name" /></dd> 75 101 </dl> 76 102 <div class="visualClear"><!-- --></div> … … 81 107 <input type="submit" class="editsave" i18n:attributes="value" value="Save" /> 82 108 <input type="submit" class="editcancel" i18n:attributes="value" value="Cancel" /> 109 <input type="reset" class="editreset" i18n:attributes="value" value="Reset" /> 83 110 </div> 84 111 qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/plonetabs.pt
r1092 r1094 81 81 <ul class="csshover" 82 82 id="tabslist" 83 tal:content="structure python:view.getActionsList(category=category )" />83 tal:content="structure python:view.getActionsList(category=category, errors=errors)" /> 84 84 85 85 <form id="addaction"
