from AccessControl.SecurityManagement import newSecurityManager, noSecurityManager ... user = self.context.getWrappedOwner() newSecurityManager(self.request, user) self.doProtectedMethod() noSecurityManager()
21/05/2009
newSecurityManager
createPortalObject()
def createPortalObject(self,folder,type_name,title): """ Helper per a portal object of specific type in the given folder """ objId = None try: id = self.context.plone_utils.normalizeString(title, relaxed=True) objId = folder.invokeFactory(id=id,type_name=type_name) except Exception, e: self.log(str(e)) id = folder.generateUniqueId(type_name) objId = folder.invokeFactory(id=id,type_name=type_name) self.log( 'createPortalObject(): objId = \"%s\"' % (objId) ) obj = getattr(folder,objId,None) obj.setTitle(title) obj.reindexObject() return obj
Portal Catalog samples
from Products.CMFCore.utils import getToolByName catalog = getToolByName(context, 'portal_catalog') # available indexes: print catalog.indexes() # available metadata columns: print catalog.schema() (1) basePath = '/'.join(self.getPhysicalPath()) query = filter query['sort_on'] = 'getObjPositionInParent' query['sort_order'] = 'reverse' query['path'] = {'query' : basePath, 'depth' : levels} query['portal_type'] = types brains = catalog.searchResults(query) (2) purchaseBrains = context.portal_catalog.searchResults(portal_type='Purchase',getId=id) (3) query = {} query['portal_type'] = 'Purchase' query['purchaseId'] = purchaseId purchaseBrains = context.portal_catalog.searchResults(query) (4) purchaseBrains = context.portal_catalog.searchResults( portal_type='Purchase', purchaseId = purchaseId ) (5) t = (DateTime.now() - 1).Date() folder = getattr(portal,'downloads') folderPath = urltool.getPortalPath() + '/' + urltool.getRelativeContentURL(folder) query = {} query['created'] = {'query': t, 'range': 'max'} query['path'] = {'query' : folderPath, 'depth' : 1} query['portal_type'] = ('Folder',) brains = catalog.searchResults(query)
Move items between two folders
from Products.CMFCore.utils import getToolByName catalog = getToolByName(context, 'portal_catalog') urltool = getToolByName(context, "portal_url") portal = urltool.getPortalObject() sourceFolder = getattr(portal,'italia') sourceFolderPath = urltool.getPortalPath() + '/' + urltool.getRelativeContentURL(sourceFolder) targetFolder = getattr(portal,'italia2') targetFolderPath = urltool.getPortalPath() + '/' + urltool.getRelativeContentURL(targetFolder) print str(sourceFolder) + ' ' + sourceFolderPath print str(targetFolder) + ' ' + targetFolderPath query = {} query['path'] = {'query' : sourceFolderPath, 'depth' : 2} query['portal_type'] = ('SalesArea',) brains = catalog.searchResults(query,sort_on='getId') # for reverse sorting: sort_order='reverse' for brain in brains: print brain.getId folder = brain.getObject().aq_parent print folder.getId cb = folder.manage_cutObjects(ids=[brain.getId]) targetFolder.manage_pasteObjects(cb) return printed
Retrieve and delete old items
import DateTime from Products.CMFCore.utils import getToolByName catalog = getToolByName(context, 'portal_catalog') urltool = getToolByName(context, "portal_url") portal = urltool.getPortalObject() t = (DateTime.now() - 2).Date() folder = getattr(portal,'downloads') folderPath = urltool.getPortalPath() + '/' + urltool.getRelativeContentURL(folder) print 'Deleting documents in "%s" created before %s ...' % (folderPath,t) query = {} query['path'] = {'query' : folderPath, 'depth' : 1} query['created'] = {'query': t, 'range': 'max'} query['portal_type'] = ('Folder',) brains = catalog.searchResults(query) ids=[] for brain in brains: ids.append(brain.id) print ids folder.manage_delObjects(ids=ids) return printed
Check Member Role in Context
# verifies if the member has expected roles in context def _checkMemberRole(self): authorized = False membership_tool = getToolByName(self.context, 'portal_membership') member = membership_tool.getAuthenticatedMember() if member is not None: roles = member.getRolesInContext(self.context) if 'Manager' in roles or 'UT' in roles: authorized = True return authorized
tal:on-error
<tal:dontcrash tal:on-error="structure python:context.plone_log('Error %s on %s while rendering portlet %s'%(error.type, error.value, slot[0])) or '<div class=\'error\'>Error %s on %s: %s</div>' % (error.type, slot[0], error.value)"> ... </tal:dontcrash>
Template for XML file
<?xml version="1.0" encoding="UTF-8"?> <root xmlns:tal="http://xml.zope.org/namespaces/tal" xmlns:metal="http://xml.zope.org/namespaces/metal" tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml'); dummy2 python:request.RESPONSE.setHeader('charset', 'UTF-8');"> <data>123</data> </root>
Show all forms errors
<div metal:fill-slot="main" tal:define="errors options/state/getErrors; ... <tal:trace_errors condition="python:len(errors)>0"> <tal:block define="dummy python:context.portal_debugutilities.trace('e','errors',str(errors))" /> </tal:trace_errors>