Beispiel #1
0
def add_link(request, session, ro):
    """Add a new 'use' link between this RO and another

    Args:
        request (Request):
        session (DBSession):
        ro (ResearchObject):

    Returns:
        (None|uid): None if something failed, created link
    """
    uid = request.params.get('ro_id', "")
    if len(uid) == 0:
        request.session.flash("Enter a RO id first", 'warning')
        return None

    # check whether the RO is already associated to this RO
    if uid == ro.id:
        request.session.flash("Can not create link with oneself", 'warning')
        return None

    linked = [link.target for link in ro.out_links if link.type == 'use']
    if uid in linked:
        request.session.flash("%s is already linked" % uid, 'warning')
        return None

    # check whether uid correspond to a valid RO
    tgt = ResearchObject.get(session, uid)
    if tgt is None:
        request.session.flash("%s is not a valid RO" % uid, 'warning')
        return None

    # create link
    link = ROLink.connect(session, ro.id, uid, "use")
    return link
Beispiel #2
0
def view(request):
    session = DBSession()
    uid = request.params["uid"]
    delete_recursive = json.loads(request.params["recursive"])
    ro = ResearchObject.get(session, uid)
    if ro.owner == request.unauthenticated_userid:
        ResearchObject.remove(session, ro, delete_recursive)

    return {}
Beispiel #3
0
def view(request):
    session = DBSession()
    ro, view_params = view_init_min(request, session)

    view_params['description'] = Markup(ro.html_description())
    ancestors = []
    for link in ro.in_links:
        if link.type == 'is_ancestor_of':
            ancestors.append(ResearchObject.get(session, link.source))

    view_params['ancestors'] = ancestors

    return view_params
Beispiel #4
0
def fetch_ro(request, session):
    """Retrieve RO whose id is in URL.

    Args:
        request: (Request)
        session: (DBSession)

    Returns:
        (str, ResearchObject): uid, ro
    """
    uid = request.matchdict['uid']
    ro = ResearchObject.get(session, uid)
    if ro is None:
        request.session.flash("RO %s does not exists" % uid, 'warning')
        raise HTTPFound(location=request.route_url('home'))

    return uid, ro
Beispiel #5
0
def append_ro(request, session, container):
    """Add a new RO in this container.

    Args:
        request (Request):
        session (DBSession):
        container (ROContainer):

    Returns:
        (None|uid): None if something failed, created link
    """
    uid = request.params.get('ro_id', "")
    if len(uid) == 0:
        request.session.flash("Enter a RO id first", 'warning')
        return None

    # check whether the RO is already a member of the container
    if uid == container.id:
        request.session.flash("Can not contain oneself", 'warning')
        return None

    content = [link.target for link in container.out_links if link.type == 'contains']
    if uid in content:
        request.session.flash("%s is already in this container" % uid, 'warning')
        return None

    # check whether uid correspond to a valid RO
    ro = ResearchObject.get(session, uid)
    if ro is None:
        request.session.flash("%s is not a valid RO" % uid, 'warning')
        return None

    # check whether user has 'install' rights on this RO
    role = ro.access_role(session, request.unauthenticated_userid)
    if role < Role.install:
        request.session.flash("You're not allowed to add %s to this container" % uid, 'warning')
        return None

    # create link
    link = ROLink.connect(session, container.id, uid, "contains")
    return link
Beispiel #6
0
def view(request):
    session = DBSession()
    ro, view_params = view_init_min(request, session)

    if view_params["allow_edit"] and ('new_content' in request.params or request.params.get("ro_id", "") != ""):
        if append_ro(request, session, ro) is not None:
            loc = request.current_route_url()
            return HTTPFound(location=loc)

    view_params['description'] = Markup(ro.html_description())

    content = []
    for link in ro.out_links:
        if link.type == "contains":
            ro = ResearchObject.get(session, link.target)
            content.append((ro.name.lower(), ro))

    content.sort()
    view_params['content'] = [ro for name, ro in content]

    return view_params
Beispiel #7
0
def view(request):
    session = DBSession()
    user = request.unauthenticated_userid

    if 'uid' in request.params:
        # search a RO with a specific id
        uid = request.params['uid']
        ro = ResearchObject.get(session, uid)
        if ro is None:
            return None
        else:
            # check credentials
            role = ro.access_role(session, user)
            if role == Role.denied:
                return None
            else:
                return ro.repr_json(full=True)
    else:
        ros = search(session, request.params)
        return [ro.id for ro in ros
                if ro.access_role(session, user) != Role.denied]
Beispiel #8
0
def view_init_min(request, session):
    """Common init for all 'view' parts.

    Args:
        request: (Request)
        session: (DBSession)

    Returns:
        (ResearchObject, dict of (str: any)): ro, view_params
    """
    if 'main_search' in request.params:
        loc = request.route_url('ro_list', _query=dict(request.params))
        raise HTTPFound(location=loc)

    uid, ro = fetch_ro(request, session)

    current_uid = request.unauthenticated_userid

    role = ro.access_role(session, current_uid)
    if role == Role.denied:
        request.session.flash("Access to %s not granted for you" % uid,
                              'warning')
        raise HTTPFound(location=request.route_url('home'))

    # allow edition
    allow_edit = (current_uid is not None and role == Role.edit)

    # find containers
    uids = fetch_containers(session, ro)
    containers = [(uid, ResearchObject.get(session, uid).name) for uid in uids]

    view_params = {"ro": ro,
                   "containers": containers,
                   "allow_edit": allow_edit,
                   "minimized": True}

    return ro, view_params
Beispiel #9
0
def search(session, params):
    """Perform a query for RO objects

    Args:
        session (DBSession):
        params (dict): extra parameters for search

    Returns:
        (list of str): list of ids of RO matching query
    """
    # query on RO direct common attributes
    query = session.query(ResearchObject.id)
    if "type" in params and params['type'] != 'ro':
        query = query.filter(ResearchObject.type == params["type"])

    if "owner" in params:
        query = query.filter(ResearchObject.owner == params["owner"])

    if "name" in params:
        name = params['name']
        if name[-1] == "*":
            name = name[:-1]
            query = query.filter(ResearchObject.name.like("%s%%" % name))
        else:
            query = query.filter(ResearchObject.name == name)

    # query = query.order_by(ResearchObject.name)

    uids = {uid for uid, in query.all()}

    # query on type of link
    if 'in' in params:
        # search all RO in a specific container
        uid = params['in']
        query = session.query(ROLink.target)
        query = query.filter(ROLink.source == uid, ROLink.type == 'contains')
        uids &= {uid for uid, in query.all()}

    if 'use' in params:
        # search all RO that use a specific id
        uid = params['use']
        query = session.query(ROLink.source)
        query = query.filter(ROLink.target == uid, ROLink.type == 'use')
        uids &= {uid for uid, in query.all()}

    # specific query by type
    if "type" in params:
        typ = params['type']
        if typ in search_factory:
            loc_uids = search_factory[typ](session, params)
            if loc_uids is not None:
                uids &= loc_uids

    # fetch ROs
    res = [ResearchObject.get(session, uid) for uid in uids]

    # high level python expressed query
    if "toplevel" in params:
        res = [ro for ro in res if ro.is_lonely()]

    # sort by name
    res = sorted([(ro.name, ro) for ro in res])

    return [ro for name, ro in res]