class StatusMapView(BrowserView): """ ZMI page for managing membrane type "active" status mappings. """ template = ZopeTwoPageTemplateFile('status_map.pt') def __init__(self, context, request): BrowserView.__init__(self, context, request) self.cat_map = ICategoryMapper(context) def __call__(self): types = self.request.get('types', []) for portal_type in types: states = self.request.get("%s_active_states" % portal_type, []) cat_set = generateCategorySetIdForType(portal_type) self.cat_map.replaceCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY, states) return self.template() def allStatesForType(self, portal_type): return getAllWFStatesForType(self.context, portal_type) def activeStatesForType(self, portal_type): cat_set = generateCategorySetIdForType(portal_type) return self.cat_map.listCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY)
def authenticateCredentials(self, credentials): """ See IAuthenticationPlugin. o We expect the credentials to be those returned by ILoginPasswordExtractionPlugin. """ login = credentials.get('login') password = credentials.get('password') if login is None or password is None: return None # We can't depend on security when authenticating the user, # or we'll get stuck in loops mbtool = getToolByName(self, TOOLNAME) member = mbtool.getUserAuthProvider(login) if member is None: return None # Check workflow state is active wftool = getToolByName(self, 'portal_workflow') review_state = wftool.getInfoFor(member, 'review_state') wfmapper = ICategoryMapper(mbtool) cat_set = generateCategorySetIdForType(member.portal_type) if not wfmapper.isInCategory(cat_set, ACTIVE_STATUS_CATEGORY, review_state): return None # Delegate to member object member = IMembraneUserAuth(member) return member.authenticateCredentials(credentials)
def removeStatusCategories(event): """ Removes the related status categories from the category mapper when a membrane type is unregistered. """ cat_map = ICategoryMapper(event.tool) cat_set = generateCategorySetIdForType(event.portal_type) cat_map.delCategorySet(cat_set)
def testStatusCategoriesGetCleared(self): mt = getattr(self.portal, TOOLNAME) pt = 'TestMember' cat_map = ICategoryMapper(mt) cat_set = generateCategorySetIdForType(pt) self.failUnless(cat_map.hasCategorySet(cat_set)) mt.unregisterMembraneType(pt) self.failIf(cat_map.hasCategorySet(cat_set))
def testMembraneActiveWorkflowMapping(self): states = { 'TrainingCenter' : ['active', 'inactive'], 'eduMember' : ['active', 'inactive'], } categoryMap = ICategoryMapper(self.portal.membrane_tool) for t, s in states.items(): categorySet = generateCategorySetIdForType(t) self.assertEquals(s, categoryMap.listCategoryValues(categorySet, ACTIVE_STATUS_CATEGORY))
def getRoles(self): """Get roles for this team-group. Return an empty list of roles if the team is in a workflow state that is not active in membrane_tool. """ mb = getToolByName(self.context, MEMBRANE_TOOL) wf = getToolByName(self.context, "portal_workflow") reviewState = wf.getInfoFor(self.context, "review_state") wfmapper = ICategoryMapper(mb) categories = generateCategorySetIdForType(self.context.portal_type) if wfmapper.isInCategory(categories, ACTIVE_STATUS_CATEGORY, reviewState): return self.context.getRoles() else: return ()
def testStatusCategoriesAreInitialized(self): mt = getattr(self.portal, TOOLNAME) cat_map = ICategoryMapper(mt) for pt in ['TestMember', 'TestGroup']: cat_set = generateCategorySetIdForType(pt) self.failUnless(cat_map.hasCategorySet(cat_set)) self.failUnless(cat_map.hasCategory(cat_set, ACTIVE_STATUS_CATEGORY)) wft = getattr(self.portal, 'portal_workflow') chain = wft.getChainForPortalType(pt) for wfid in chain: wf = getattr(wft, wfid) states = wf.states.objectIds() for state in states: self.failUnless(cat_map.isInCategory(cat_set, ACTIVE_STATUS_CATEGORY, state))
def testAuthenticateActiveStatesOnly(self): mbtool = getattr(self.portal, TOOLNAME) wftool = getattr(self.portal, 'portal_workflow') authcred = self.portal.pmm.authenticateCredentials credentials = {'login':'******', 'password':'******'} cat_map = ICategoryMapper(mbtool) cat_set = generateCategorySetIdForType(self.member.portal_type) mem_state = wftool.getInfoFor(self.member, 'review_state') right = (IMembraneUserAuth(self.member).getUserId(), self.member.getUserName()) self.failUnlessEqual(authcred(credentials), right) cat_map.removeFromCategory(cat_set, ACTIVE_STATUS_CATEGORY, mem_state) self.failUnlessEqual(authcred(credentials), None) cat_map.addToCategory(cat_set, ACTIVE_STATUS_CATEGORY, mem_state) self.failUnlessEqual(authcred(credentials), right)
def _extractMembraneTypes(self): cat_map = ICategoryMapper(self.context) fragment = self._doc.createDocumentFragment() for mtype in self.context.listMembraneTypes(): # extract the membrane types child = self._doc.createElement('membrane-type') child.setAttribute('name', mtype) # extract the "active" w/f states for the type cat_set = generateCategorySetIdForType(mtype) states = cat_map.listCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY) for state in states: sub = self._doc.createElement('active-workflow-state') sub.setAttribute('name', state) child.appendChild(sub) fragment.appendChild(child) return fragment
def _initMembraneTypes(self, node): for child in node.childNodes: if child.nodeName != 'membrane-type': continue # register membrane types mtype = str(child.getAttribute('name')) if mtype and mtype not in self.context.listMembraneTypes(): self.context.registerMembraneType(mtype) # register "active" workflow states cat_map = ICategoryMapper(self.context) states = [] for sub in child.childNodes: if sub.nodeName != 'active-workflow-state': continue state = str(sub.getAttribute('name')) if state and state not in states: states.append(state) if states: cat_set = generateCategorySetIdForType(mtype) cat_map.replaceCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY, states)
def initializeStatusCategories(event): """ Initializes the category sets and categories of a category mapper to be used to track "active" workflow states for a membrane type. Triggered when a new membrane type is registered. Defaults to all workflow states being active. """ cat_map = ICategoryMapper(event.tool) cat_set = generateCategorySetIdForType(event.portal_type) cat_map.addCategorySet(cat_set) cat_map.addCategory(cat_set, ACTIVE_STATUS_CATEGORY) states = getAllWFStatesForType(event.tool, event.portal_type) for state in states: cat_map.addToCategory(cat_set, ACTIVE_STATUS_CATEGORY, state)
class TestCategoryMapper(ZopeTestCase.ZopeTestCase): layer = ZCMLLayer def afterSetUp(self): self.obj = Foo() self.cat_map = ICategoryMapper(self.obj) def testAddCategorySet(self): cat_set = 'category_set' self.cat_map.addCategorySet(cat_set) self.failUnless(self.cat_map.hasCategorySet(cat_set)) self.failUnless(cat_set in self.cat_map.listCategorySets()) def testDelCategorySet(self): cat_set = 'category_set' self.cat_map.addCategorySet(cat_set) self.failUnless(self.cat_map.hasCategorySet(cat_set)) self.cat_map.delCategorySet(cat_set) self.failIf(self.cat_map.hasCategorySet(cat_set)) self.failUnless(len(self.cat_map.listCategorySets()) == 0) def testAddCategory(self): cat_set1 = 'category_set1' cat_set2 = 'category_set2' cat = 'category' self.cat_map.addCategorySet(cat_set1) self.cat_map.addCategorySet(cat_set2) self.cat_map.addCategory(cat_set1, cat) self.failUnless(self.cat_map.hasCategory(cat_set1, cat)) self.failIf(self.cat_map.hasCategory(cat_set2, cat)) def testMissingCatSetRaisesError(self): self.assertRaises(KeyError, self.cat_map.addToCategory, self.cat_map, 'category_set', 'category') self.assertRaises(KeyError, self.cat_map.removeFromCategory, self.cat_map, 'category_set', 'category') def testMissingCategoryRaisesError(self): cat_set = 'category_set' self.cat_map.addCategorySet(cat_set) self.assertRaises(KeyError, self.cat_map.addToCategory, self.cat_map, cat_set, 'category') self.assertRaises(KeyError, self.cat_map.removeFromCategory, self.cat_map, cat_set, 'category') def testAddToCategory(self): cat_set = 'category_set' cat1 = 'category1' cat2 = 'category2' datum1 = 'datum1' datum2 = 'datum2' self.cat_map.addCategorySet(cat_set) self.cat_map.addCategory(cat_set, cat1) self.cat_map.addCategory(cat_set, cat2) self.cat_map.addToCategory(cat_set, cat1, datum1) self.failUnless(self.cat_map.isInCategory(cat_set, cat1, datum1)) self.failIf(self.cat_map.isInCategory(cat_set, cat1, datum2)) self.failIf(self.cat_map.isInCategory(cat_set, cat2, datum1)) self.cat_map.addToCategory(cat_set, cat1, datum2) self.failUnless(self.cat_map.isInCategory(cat_set, cat1, datum1)) self.failUnless(self.cat_map.isInCategory(cat_set, cat1, datum2)) self.failUnless(set([datum1, datum2]) == \ set(self.cat_map.listCategoryValues(cat_set, cat1))) def testRemoveFromCategory(self): cat_set = 'category_set' cat = 'category' datum1 = 'datum1' datum2 = 'datum2' self.cat_map.addCategorySet(cat_set) self.cat_map.addCategory(cat_set, cat) self.cat_map.addToCategory(cat_set, cat, datum1) self.cat_map.addToCategory(cat_set, cat, datum2) self.failUnless(set([datum1, datum2]) == \ set(self.cat_map.listCategoryValues(cat_set, cat))) self.cat_map.removeFromCategory(cat_set, cat, datum1) self.failIf(self.cat_map.isInCategory(cat_set, cat, datum1)) self.failUnless(self.cat_map.isInCategory(cat_set, cat, datum2)) self.failUnless(set([datum2]) == \ set(self.cat_map.listCategoryValues(cat_set, cat)))
def afterSetUp(self): self.obj = Foo() self.cat_map = ICategoryMapper(self.obj)
def install(self): """ Do stuff that GS will do for us soon .. """ out = StringIO() # XXX: this doesn't actually work, as it steps on work done in # Install.py # # Note that we can apply profiles after adding a Plone site using # instancemanager: does it make more sense to leave it to # instancemanager? # # # Apply membrane and remember profiles (we can't QI them) # membrane_tool = getToolByName(self, 'membrane_tool') # if not membrane_tool: # setup_tool = getToolByName(self, 'portal_setup') # for p in ('membrane', 'remember', ): # setup_tool.setImportContext('profile-%s:default' % p) # out.write( 'Switched to profile: %s \n' % p) # result = setup_tool.runAllImportSteps() # print >>out, 'Steps run: %s \n' % ', '.join(result['steps']) # Change default member to MemberOfPublic plone = getToolByName(self, "portal_url").getPortalObject() adder = getAdderUtility(plone) adder.default_member_type = "MemberOfPublic" # Require approval for the adding of plain old members workflow_tool = getToolByName(self, "portal_workflow") workflow_tool.setChainForPortalTypes(["Member"], "MemberApprovalWorkflow") # Repair status_map for our new types. # TODO: setting their workflow *after* registering the types in # TODO: Install.py messes with the default active state(s) of the # TODO: members. Fix AGX to generate them after workflow # TODO: registration. membrane_tool = getToolByName(self, "membrane_tool") cat_map = ICategoryMapper(membrane_tool) for portal_type in ["MemberOfParliament", "Staff", "MemberOfPublic"]: cat_set = generateCategorySetIdForType(portal_type) # states = getAllWFStatesForType(self, portal_type) states = ACTIVE_MEMBRANE_STATES[portal_type] cat_map.replaceCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY, states) # Change the default workflow workflow_tool = getToolByName(self, "portal_workflow") workflow_tool.setDefaultChain("BungeniWorkflow") workflow_tool.setChainForPortalTypes(["Folder", "Large Plone Folder"], "BungeniWorkflow") workflow_tool.updateRoleMappings() # Enable syndication # XXX: Figure out a better way to identify the content that needs syndication syndication_tool = getToolByName(self, "portal_syndication") if not syndication_tool.isSiteSyndicationAllowed(): syndication_tool.editProperties(isAllowed=1) if not syndication_tool.isSyndicationAllowed(self.events): syndication_tool.enableSyndication(self.events) # # Change the default roles managed by teams # teams_tool = getToolByName(self, 'portal_teams') # allowed_roles = teams_tool.getDefaultAllowedRoles() # teams_tool.setDefaultAllowedRoles( # allowed_roles+['ReviewerForSpeaker', 'CurrentMP']) teams_tool = getToolByName(self, "portal_teams") teams_tool.setAllowedTeamTypes(TEAM_TYPES) # Replace the default MailHost with a MaildropHost if shasattr(plone, "MailHost") and plone.MailHost.meta_type != "Secure Maildrop Host": plone.manage_delObjects("MailHost") if not shasattr(plone, "MailHost"): plone.manage_addProduct["SecureMaildropHost"].manage_addSecureMaildropHost("MailHost") return out.getvalue()
def install(self): """ Do stuff that GS will do for us soon .. """ out = StringIO() # XXX: this doesn't actually work, as it steps on work done in # Install.py # # Note that we can apply profiles after adding a Plone site using # instancemanager: does it make more sense to leave it to # instancemanager? # # # Apply membrane and remember profiles (we can't QI them) # membrane_tool = getToolByName(self, 'membrane_tool') # if not membrane_tool: # setup_tool = getToolByName(self, 'portal_setup') # for p in ('membrane', 'remember', ): # setup_tool.setImportContext('profile-%s:default' % p) # out.write( 'Switched to profile: %s \n' % p) # result = setup_tool.runAllImportSteps() # print >>out, 'Steps run: %s \n' % ', '.join(result['steps']) # Change default member to MemberOfPublic plone = getToolByName(self, 'portal_url').getPortalObject() adder = getAdderUtility(plone) adder.default_member_type = 'MemberOfPublic' # Require approval for the adding of plain old members workflow_tool = getToolByName(self, 'portal_workflow') workflow_tool.setChainForPortalTypes(['Member'], "MemberApprovalWorkflow") # Repair status_map for our new types. # TODO: setting their workflow *after* registering the types in # TODO: Install.py messes with the default active state(s) of the # TODO: members. Fix AGX to generate them after workflow # TODO: registration. membrane_tool = getToolByName(self, 'membrane_tool') cat_map = ICategoryMapper(membrane_tool) for portal_type in ['MemberOfParliament', 'Staff', 'MemberOfPublic']: cat_set = generateCategorySetIdForType(portal_type) # states = getAllWFStatesForType(self, portal_type) states = ACTIVE_MEMBRANE_STATES[portal_type] cat_map.replaceCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY, states) # Change the default workflow workflow_tool = getToolByName(self, 'portal_workflow') workflow_tool.setDefaultChain('BungeniWorkflow') workflow_tool.setChainForPortalTypes(['Folder', 'Large Plone Folder'], "BungeniWorkflow") workflow_tool.updateRoleMappings() # Enable syndication # XXX: Figure out a better way to identify the content that needs syndication syndication_tool = getToolByName(self, 'portal_syndication') if not syndication_tool.isSiteSyndicationAllowed(): syndication_tool.editProperties(isAllowed=1) if not syndication_tool.isSyndicationAllowed(self.events): syndication_tool.enableSyndication(self.events) # # Change the default roles managed by teams # teams_tool = getToolByName(self, 'portal_teams') # allowed_roles = teams_tool.getDefaultAllowedRoles() # teams_tool.setDefaultAllowedRoles( # allowed_roles+['ReviewerForSpeaker', 'CurrentMP']) teams_tool = getToolByName(self, 'portal_teams') teams_tool.setAllowedTeamTypes(TEAM_TYPES) # Replace the default MailHost with a MaildropHost if (shasattr(plone, 'MailHost') and plone.MailHost.meta_type != 'Secure Maildrop Host'): plone.manage_delObjects('MailHost') if not shasattr(plone, 'MailHost'): plone.manage_addProduct[ 'SecureMaildropHost'].manage_addSecureMaildropHost('MailHost') return out.getvalue()
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.cat_map = ICategoryMapper(context)
def testActiveWFStates(self): cat_set = generateCategorySetIdForType(DEFAULT_MEMBER_TYPE) cat_map = ICategoryMapper(self.mbtool) states = cat_map.listCategoryValues(cat_set, ACTIVE_STATUS_CATEGORY) self.failUnless('private' in states and 'public' in states)