Ejemplo n.º 1
0
def apply_request_layer_by_url(event):
    """Apply a request layer by URL.

    This subscriber applies a request-layer on the ``request`` object
    based on the request to allow layer-based component registration
    of user interface elements.
    
    NOTE: only one layer is applied -- the first one to match.
    """
    request = event.request
    #path = "/".join(reversed(request.getTraversalStack()))
    path = url.get_destination_url_path(request)
    path_info = request.get("PATH_INFO")
    log.debug(" [apply_request_layer_by_url] path=%s path_info=%s" % (
                                                            path, path_info))
    for condition, layer in mapping_on_path:
        if condition.match(path) is not None:
            log.debug("Adding %s layer to request for path <%s>" % (layer, path))
            interface.alsoProvides(request, layer)
            break # only apply first matching layer
    else: # there was no break, no mapping_on_path layer added
        # !+IResourceNonLayer(mr, nov-2010) almost never passes thru here
        for condition, layer in mapping_on_path_info:
            if condition.match(path_info) is not None:
                log.debug("Adding %s layer to request for path_info <%s>" % (
                                                            layer, path_info))
                interface.alsoProvides(request, layer)
                break
Ejemplo n.º 2
0
def apply_request_layer_by_url(event):
    """Apply a request layer by URL.

    This subscriber applies a request-layer on the ``request`` object
    based on the request to allow layer-based component registration
    of user interface elements.
    
    NOTE: only one layer is applied -- the first one to match.
    """
    request = event.request
    #path = "/".join(reversed(request.getTraversalStack()))
    path = url.get_destination_url_path(request)
    path_info = request.get("PATH_INFO")
    log.debug(" [apply_request_layer_by_url] path=%s path_info=%s" % (
                                                            path, path_info))
    for condition, layer in mapping_on_path:
        if condition.match(path) is not None:
            log.debug("Adding %s layer to request for path <%s>" % (layer, path))
            interface.alsoProvides(request, layer)
            break # only apply first matching layer
    else: # there was no break, no mapping_on_path layer added
        # !+IResourceNonLayer(mr, nov-2010) almost never passes thru here
        for condition, layer in mapping_on_path_info:
            if condition.match(path_info) is not None:
                log.debug("Adding %s layer to request for path_info <%s>" % (
                                                            layer, path_info))
                interface.alsoProvides(request, layer)
                break
Ejemplo n.º 3
0
 def __call__(self):
     request = self.request
     try: 
         first_workspace = IAnnotations(request)["layer_data"].workspaces[0]
         to_url = "/workspace/obj-%s/pi" % first_workspace.group_id
     except:
         to_url = "/workspace"
     # !+TRAILING_SLASH(mr, sep-2010) this is still needed?
     to_url = url.set_url_context(to_url)
     if url.get_destination_url_path(request) != to_url:
         # never redirect to same destination!
         log.warn("WorkspaceRootRedirect %s -> %s" % (request.getURL(), to_url))
         request.response.redirect(to_url)
     else:
         # !+
         # user has no workspaces and is requesting /workspace view
         # return the "no workspace" *rendered* view for /workspace
         return component.getMultiAdapter(
                     (self.context, request), name="no-workspace-index")()
Ejemplo n.º 4
0
 def __call__(self):
     request = self.request
     try: 
         first_workspace = IAnnotations(request)["layer_data"].workspaces[0]
         # !+ deliverance issue: "pi" url path needs to end with a "/", as
         # otherwise the url for other child items will have "pi/" omitted
         to_url = "/workspace/obj-%s/pi/" % first_workspace.group_id
     except:
         to_url = "/workspace"
     if url.get_destination_url_path(request)!=to_url:
         # never redirect to same destination!
         log.warn("WorkspaceRootRedirect %s -> %s" % (request.getURL(), to_url))
         request.response.redirect(to_url)
     else:
         # !+
         # user has no workspaces and is requesting /workspace view
         # return the "no workspace" *rendered* view for /workspace
         return component.getMultiAdapter(
                     (self.context, request), name="no-workspace-index")()
Ejemplo n.º 5
0
 def __call__(self):
     request = self.request
     try: 
         first_workspace = IAnnotations(request)["layer_data"].workspaces[0]
         # !+ deliverance issue: "pi" url path needs to end with a "/", as
         # otherwise the url for other child items will have "pi/" omitted
         to_url = "/workspace/obj-%s/pi/" % first_workspace.group_id
     except:
         to_url = "/workspace"
     if url.get_destination_url_path(request)!=to_url:
         # never redirect to same destination!
         log.warn("WorkspaceRootRedirect %s -> %s" % (request.getURL(), to_url))
         request.response.redirect(to_url)
     else:
         # !+
         # user has no workspaces and is requesting /workspace view
         # return the "no workspace" *rendered* view for /workspace
         return component.getMultiAdapter(
                     (self.context, request), name="no-workspace-index")()
Ejemplo n.º 6
0
 def __call__(self):
     request = self.request
     try:
         first_workspace = IAnnotations(request)["layer_data"].workspaces[0]
         to_url = "/workspace/obj-%s/pi" % first_workspace.group_id
     except:
         to_url = "/workspace"
     # !+TRAILING_SLASH(mr, sep-2010) this is still needed?
     to_url = url.set_url_context(to_url)
     if url.get_destination_url_path(request) != to_url:
         # never redirect to same destination!
         log.warn("WorkspaceRootRedirect %s -> %s" %
                  (request.getURL(), to_url))
         request.response.redirect(to_url)
     else:
         # !+
         # user has no workspaces and is requesting /workspace view
         # return the "no workspace" *rendered* view for /workspace
         return component.getMultiAdapter((self.context, request),
                                          name="no-workspace-index")()
Ejemplo n.º 7
0
def prepare_user_workspaces(event):
    """Determine the current principal's workspaces, depending on roles and
    group memberships. 
    
    "bungeni.Clerk", "bungeni.Speaker", "bungeni.MP"
        these roles get a parliament-level workspace
    
    "bungeni.Minister"
        "implied" role (by being a member of a ministry group) 
        gets a ministry-level workspace (for each ministry)
    
    "zope.Manager", "bungeni.Admin", "bungeni.Owner", "bungeni.Everybody", 
    "bungeni.Anybody"
        not relevant for user workspaces, no workspaces
        !+ should these get an owner-level (user) workspace?
    
    """
    request = event.request
    application = event.object # is bungeni.core.app.BungeniApp
    destination_url_path = url.get_destination_url_path(request)
    def need_to_prepare_workspaces(obj, req):
        return (
            # need only to do it when traversing "/", 
            # obj should be the BungeniApplication
            model_interfaces.IBungeniApplication.providedBy(obj)
            and
            # user is logged in
            interfaces.IBungeniAuthenticatedSkin.providedBy(req)
            and (
                # either the request should be for a view within /workspace
                # note: IWorkspaceSectionLayer is applied to the request by 
                # publication.apply_request_layer_by_url() that therefore must 
                # have already been called
                interfaces.IWorkspaceSectionLayer.providedBy(req)
                or 
                interfaces.IWorkspaceSchedulingSectionLayer.providedBy(req)
                or
                # or the request is for *the* Home Page (as in this case
                # we still need to know the user workspaces to be able to 
                # redirect appropriately)
                interfaces.IHomePageLayer.providedBy(req)
            )
        )
    if not need_to_prepare_workspaces(application, request):
        return
    
    # initialize a layer data object, for the views in the layer
    LD = IAnnotations(request)["layer_data"] = misc.bunch(
        workspaces=[], # workspace containers !+ unique?
        # !+ role-based workspaces: (role|group, workspace_container)
        # these are needed by the views, as we need them also here, we just
        # remember them to not need to calculate them again
        user_id=None,
        user_group_ids=None,
        government_id=None,
        ministries=None, # list of ministries (that are also workspaces)
    )
    
    LD.user_id = get_db_user_id()
    try:
        parliament = get_current_parliament(None)
        assert parliament is not None # force exception
        # we do get_roles under the current parliament as context, but we 
        # must also ensure that the BungeniApp is present somewhere along 
        # the __parent__ stack:
        parliament.__parent__ = application
        roles = get_roles(parliament)
        # "bungeni.Clerk", "bungeni.Speaker", "bungeni.MP"
        for role_id in roles:
            if role_id in ("bungeni.Clerk", "bungeni.Speaker", "bungeni.MP"):
                log.debug("adding parliament workspace %s (for role %s)" % (
                                                        parliament, role_id))
                LD.workspaces.append(parliament)
    
        # "bungeni.Minister"
        # need to check for ministry groups to which the principal belongs, and 
        # for each such ministry assign a ministry workspace
        LD.user_group_ids = get_group_ids_for_user_in_parliament(
                                    LD.user_id, parliament.group_id)
        LD.government_id = get_current_parliament_governments(
                                    parliament)[0].group_id # IndexError
        LD.ministries = get_ministries_for_user_in_government(
                                            LD.user_id, LD.government_id)
        log.debug(""" [prepare_user_workspaces]
            user_id:%s
            roles:%s
            parliament:(%s, %s) 
            government_id:%s
            ministries:%s""" % (
                LD.user_id,
                roles,
                parliament.full_name, parliament.group_id, 
                LD.government_id, 
                [(m.full_name, m.group_id) for m in LD.ministries] ))
        for ministry in LD.ministries:
            log.debug("adding ministry workspace %s" % ministry)
            LD.workspaces.append(ministry)
    except (Exception,):
        debug.log_exc_info(sys.exc_info(), log_handler=log.info)
    
    # ensure unique workspaces, preserving order, retaining same list obj ref
    LD.workspaces[:] = [ workspace for i,workspace in enumerate(LD.workspaces) 
                         if LD.workspaces.index(workspace)==i ]
    
    # mark each workspace container with IWorkspaceContainer
    for workspace in LD.workspaces:
        interface.alsoProvides(workspace, interfaces.IWorkspaceContainer)
        log.debug(debug.interfaces(workspace))
    
    log.debug(" [prepare_user_workspaces] %s" % debug.interfaces(request))
    log.info(""" [prepare_user_workspaces] DONE:
        for: [request=%s][path=%s][path_info=%s]
        request.layer_data: %s""" % (
            id(request), destination_url_path, request.get("PATH_INFO"),
            IAnnotations(request).get("layer_data", None)))
Ejemplo n.º 8
0
def prepare_user_workspaces(event):
    """Determine the current principal's workspaces, depending on roles and
    group memberships. 
    
    "bungeni.Clerk", "bungeni.Speaker", "bungeni.MP"
        these roles get a parliament-level workspace
    
    "bungeni.Minister"
        "implied" role (by being a member of a ministry group) 
        gets a ministry-level workspace (for each ministry)
    
    "zope.Manager", "bungeni.Admin", "bungeni.Owner", "bungeni.Authenticated", 
    "bungeni.Anonymous"
        not relevant for user workspaces, no workspaces
        !+ should these get an owner-level (user) workspace?
    
    """
    request = event.request
    application = event.object  # is bungeni.core.app.BungeniApp
    destination_url_path = url.get_destination_url_path(request)

    def need_to_prepare_workspaces(obj, req):
        return (
            # need only to do it when traversing "/",
            # obj should be the BungeniApplication
            model_interfaces.IBungeniApplication.providedBy(obj) and
            # user is logged in
            interfaces.IBungeniAuthenticatedSkin.providedBy(req) and (
                # either the request should be for a view within /workspace
                # note: IWorkspaceSectionLayer is applied to the request by
                # publication.apply_request_layer_by_url() that therefore must
                # have already been called
                interfaces.IWorkspaceSectionLayer.providedBy(req) or
                interfaces.IWorkspaceSchedulingSectionLayer.providedBy(req) or
                # or the request is for *the* Home Page (as in this case
                # we still need to know the user workspaces to be able to
                # redirect appropriately)
                interfaces.IHomePageLayer.providedBy(req)))

    if not need_to_prepare_workspaces(application, request):
        return

    # initialize a layer data object, for the views in the layer
    LD = IAnnotations(request)["layer_data"] = misc.bunch(
        workspaces=[],  # workspace containers !+ unique?
        # !+ role-based workspaces: (role|group, workspace_container)
        # these are needed by the views, as we need them also here, we just
        # remember them to not need to calculate them again
        user_id=None,
        user_group_ids=None,
        government_id=None,
        ministries=None,  # list of ministries (that are also workspaces)
    )

    LD.user_id = get_db_user_id()
    try:
        parliament = get_current_parliament(None)
        assert parliament is not None  # force exception
        # we do get_context_roles under the current parliament as context, but
        # we must also ensure that the BungeniApp is present somewhere along
        # the __parent__ stack:
        parliament.__parent__ = application
        roles = common.get_context_roles(parliament)
        # "bungeni.Clerk", "bungeni.Speaker", "bungeni.MP"
        for role_id in roles:
            if role_id in ("bungeni.Clerk", "bungeni.Speaker", "bungeni.MP"):
                log.debug("adding parliament workspace %s (for role %s)" %
                          (parliament, role_id))
                LD.workspaces.append(parliament)

        # "bungeni.Minister"
        # need to check for ministry groups to which the principal belongs, and
        # for each such ministry assign a ministry workspace
        LD.user_group_ids = get_group_ids_for_user_in_parliament(
            LD.user_id, parliament.group_id)
        LD.government_id = get_current_parliament_governments(
            parliament)[0].group_id  # IndexError
        LD.ministries = get_ministries_for_user_in_government(
            LD.user_id, LD.government_id)
        log.debug(
            """ [prepare_user_workspaces]
            user_id:%s
            roles:%s
            parliament:(%s, %s) 
            government_id:%s
            ministries:%s""" %
            (LD.user_id, roles, parliament.full_name, parliament.group_id,
             LD.government_id, [(m.full_name, m.group_id)
                                for m in LD.ministries]))
        for ministry in LD.ministries:
            log.debug("adding ministry workspace %s" % ministry)
            LD.workspaces.append(ministry)
    except (Exception, ):
        debug.log_exc_info(sys.exc_info(), log_handler=log.info)

    # ensure unique workspaces, preserving order, retaining same list obj ref
    LD.workspaces[:] = [
        workspace for i, workspace in enumerate(LD.workspaces)
        if LD.workspaces.index(workspace) == i
    ]

    # mark each workspace container with IWorkspaceContainer
    for workspace in LD.workspaces:
        interface.alsoProvides(workspace, interfaces.IWorkspaceContainer)
        log.debug(debug.interfaces(workspace))

    log.debug(" [prepare_user_workspaces] %s" % debug.interfaces(request))
    log.info(""" [prepare_user_workspaces] DONE:
        for: [request=%s][path=%s][path_info=%s]
        request.layer_data: %s""" %
             (id(request), destination_url_path, request.get("PATH_INFO"),
              IAnnotations(request).get("layer_data", None)))