def contained_within(viewlet): """ walk up the acquisition chain and verify if the any either the context of the viewlet, or any of its parents, provide the viewlet.container interface returns the nearest satisfactory container or None. however, we don't want to go outside the current 'content locus' (portal, project or person) -- that is, if we're at /openplans/projects/foo/wikipage and the viewlet's contained_within filter is IAddProjects, this function should *not* return a true value. """ from Acquisition import aq_inner, aq_parent obj = aq_inner(viewlet.context) iface = viewlet.container while obj is not None: if iface.providedBy(obj): return obj if IMemberFolder.providedBy(obj) or \ IProject.providedBy(obj) or \ IOpenSiteRoot.providedBy(obj): return None obj = aq_parent(obj) return None
def project(self): proj_in_chain = super(ProjectInfoView, self).project if proj_in_chain is not None: return proj_in_chain # Use the headerhijack stuff. maybe_project = self.context if IProject.providedBy(maybe_project): return maybe_project else: return None
def get_project(context): #XXX unused?? """Given a context, return the nearest/parent openplans project """ from opencore.interfaces import IProject chain = context.aq_chain for item in chain: if IProject.providedBy(item): return item raise LookupError( "No project could be found starting from the context %r" % context)
def notify_wikipage_deleted(page, event=None): parent = event.oldParent if not IProject.providedBy(parent): return #notify only on projects for now page_url = page.absolute_url() mtool = getToolByName(page, 'portal_membership') member = mtool.getAuthenticatedMember() username = member.getId() cabochon_utility = getUtility(ICabochonClient) cabochon_utility.notify_wikipage_deleted(page_url, username)
def project_contains_blog(f, obj, event): """decorator to verify that the project has a blog before sending the event to wordpress""" if IProject.providedBy(obj): proj_id = obj.getId() project = obj else: # it's a membership object team = obj.aq_inner.aq_parent proj_id = team.getId() portal = getToolByName(obj, 'portal_url').getPortalObject() try: project = portal.projects._getOb(proj_id) except KeyError: # cannot find project with same name as team (unit test only?) return for flet in get_featurelets(project): if flet['name'] == 'blog': break else: # no blog on project return f(obj, event)
def add_redirection_hooks(container, ignore=[]): for obj in container.objectValues(): if IProject.providedBy(obj) and obj.getId() not in ignore: redirect.activate(obj)