Exemple #1
0
def collaboration_invites_preview():
    data = current_request.get_json()
    message = data.get("message", None)
    intended_role = data.get("intended_role", "member")

    collaboration = Collaboration.query.get(int(data["collaboration_id"]))
    confirm_collaboration_admin(collaboration.id)

    user = User.query.get(current_user_id())
    invitation = munchify({
        "user": user,
        "collaboration": collaboration,
        "intended_role": intended_role,
        "message": message,
        "hash": generate_token(),
        "expiry_date": default_expiry_date(data)
    })
    html = mail_collaboration_invitation({
        "salutation": "Dear",
        "invitation": invitation,
        "base_url": current_app.app_config.base_url,
        "wiki_link": current_app.app_config.wiki_link,

    }, collaboration, [], preview=True)
    return {"html": html}, 201
Exemple #2
0
def approve_join_request():
    join_request_hash = current_request.get_json()["hash"]
    join_request = _get_join_request(join_request_hash)
    collaboration = join_request.collaboration

    confirm_collaboration_admin(collaboration.id)

    user_id = join_request.user.id
    if collaboration.is_member(user_id):
        raise Conflict(f"User {join_request.user.name} is already a member of {collaboration.name}")

    mail_accepted_declined_join_request({
        "salutation": f"Dear {join_request.user.name}",
        "base_url": current_app.app_config.base_url,
        "administrator": current_user_name(),
        "join_request": join_request,
        "user": join_request.user},
        join_request,
        True,
        [join_request.user.email])

    collaboration_membership = CollaborationMembership(user_id=user_id,
                                                       collaboration_id=collaboration.id,
                                                       role="member",
                                                       created_by=current_user_uid(),
                                                       updated_by=current_user_uid())

    join_request.status = STATUS_APPROVED
    db.session.merge(collaboration_membership)
    db.session.merge(join_request)

    res = {'collaboration_id': collaboration.id, 'user_id': user_id}
    return res, 201
Exemple #3
0
def collaboration_access_allowed(collaboration_id):
    try:
        confirm_collaboration_admin(collaboration_id)
        return {"access": "full"}, 200
    except Forbidden:
        confirm_collaboration_member(collaboration_id)
        return {"access": "lite"}, 200
Exemple #4
0
def delete_group_members(group_id, collaboration_membership_id, collaboration_id):
    confirm_collaboration_admin(collaboration_id)

    group = Group.query.get(group_id)
    group.collaboration_memberships.remove(CollaborationMembership.query.get(collaboration_membership_id))
    db.session.merge(group)

    return group, 204
Exemple #5
0
def save_group():
    data = current_request.get_json()

    collaboration_id = data["collaboration_id"]
    confirm_collaboration_admin(collaboration_id)

    res = create_group(collaboration_id, data)

    return res
Exemple #6
0
def resend_service_connection_request(service_connection_request_id):
    service_connection_request = ServiceConnectionRequest.query.get(service_connection_request_id)
    service = service_connection_request.service
    collaboration = service_connection_request.collaboration

    confirm_collaboration_admin(collaboration.id)
    user = User.query.get(current_user_id())
    _do_mail_request(collaboration, service, service_connection_request, True, user)
    return {}, 200
Exemple #7
0
def delete_all_group_members(group_id, collaboration_id):
    confirm_collaboration_admin(collaboration_id)

    group = Group.query.get(group_id)
    group.collaboration_memberships = []
    db.session.merge(group)

    group = Group.query.get(group_id)
    return group, 204
def delete_all_services(collaboration_id):
    confirm_collaboration_admin(collaboration_id)

    collaboration = Collaboration.query.get(collaboration_id)
    if collaboration.organisation.services_restricted:
        confirm_write_access()

    collaboration.services = []
    db.session.merge(collaboration)
    return None, 204
Exemple #9
0
def unsuspend():
    data = current_request.get_json()
    collaboration_id = data["collaboration_id"]
    confirm_collaboration_admin(collaboration_id)
    collaboration = Collaboration.query.get(collaboration_id)
    collaboration.last_activity_date = datetime.now()
    collaboration.status = STATUS_ACTIVE
    db.session.merge(collaboration)
    db.session.commit()
    return {}, 201
def delete_collaborations_services(collaboration_id, service_id):
    confirm_collaboration_admin(collaboration_id)

    collaboration = Collaboration.query.get(collaboration_id)
    if collaboration.organisation.services_restricted:
        confirm_write_access()

    collaboration.services.remove(Service.query.get(service_id))
    db.session.merge(collaboration)

    return {'collaboration_id': collaboration_id, 'service_id': service_id}, 204
def add_collaborations_services():
    data = current_request.get_json()
    collaboration_id = int(data["collaboration_id"])

    confirm_collaboration_admin(collaboration_id)

    service_id = int(data["service_id"])

    count = connect_service_collaboration(service_id, collaboration_id)
    res = {'collaboration_id': collaboration_id, 'service_id': service_id}

    return (res, 201) if count > 0 else (None, 404)
Exemple #12
0
def do_add_group_members(data, assert_collaboration_admin):
    group_id = data["group_id"]
    collaboration_id = data["collaboration_id"]
    if assert_collaboration_admin:
        confirm_collaboration_admin(collaboration_id)

    group = Group.query.get(group_id)
    members_ids = data["members_ids"]
    for members_id in members_ids:
        group.collaboration_memberships.append(CollaborationMembership.query.get(members_id))

    db.session.merge(group)
    return len(members_ids)
Exemple #13
0
    def test_collaboration_admin(self):
        admin_collaboration_membership = CollaborationMembership.query \
            .join(CollaborationMembership.collaboration) \
            .join(CollaborationMembership.user) \
            .filter(Collaboration.name == ai_computing_name) \
            .filter(User.name == the_boss_name) \
            .one()
        self.assertEqual("admin", admin_collaboration_membership.role)
        with self.app.app_context():
            session["user"] = {"uid": "urn:john", "admin": False, "id": admin_collaboration_membership.user_id}
            request_context.is_authorized_api_call = False

            confirm_collaboration_admin(admin_collaboration_membership.collaboration_id)
Exemple #14
0
def do_add_group_invitations(data):
    group_id = data["group_id"]
    collaboration_id = data["collaboration_id"]
    confirm_collaboration_admin(collaboration_id)

    group = Group.query.get(group_id)

    invitations_ids = data["invitations_ids"]
    for invitation_id in invitations_ids:
        group.invitations.append(Invitation.query.get(invitation_id))

    db.session.merge(group)
    return len(invitations_ids)
Exemple #15
0
def update_group():
    data = current_request.get_json()

    collaboration_id = int(data["collaboration_id"])
    confirm_collaboration_admin(collaboration_id)
    collaboration = Collaboration.query.get(collaboration_id)
    _assign_global_urn(collaboration, data)
    cleanse_short_name(data)

    res = update(Group, custom_json=data, allow_child_cascades=False)

    auto_provision_all_members_and_invites(res[0])

    return res
Exemple #16
0
def do_resend(invitation_id):
    invitation = _invitation_query() \
        .filter(Invitation.id == invitation_id) \
        .one()
    confirm_collaboration_admin(invitation.collaboration_id)
    invitation.expiry_date = default_expiry_date()
    invitation.created_at = datetime.date.today(),
    db.session.merge(invitation)
    mail_collaboration_invitation({
        "salutation": "Dear",
        "invitation": invitation,
        "base_url": current_app.app_config.base_url,
        "wiki_link": current_app.app_config.wiki_link,
        "recipient": invitation.invitee_email
    }, invitation.collaboration, [invitation.invitee_email])
Exemple #17
0
def update_collaboration():
    data = current_request.get_json()
    confirm_collaboration_admin(data["id"])

    organisation = Organisation.query.get(data["organisation_id"])
    _validate_collaboration(data, organisation, new_collaboration=False)

    collaboration = Collaboration.query.get(data["id"])
    if collaboration.short_name != data["short_name"]:
        for group in collaboration.groups:
            group.global_urn = f"{organisation.short_name}:{data['short_name']}:{group.short_name}"
            db.session.merge(group)

    # For updating references like services, groups, memberships there are more fine-grained API methods
    return update(Collaboration, custom_json=data, allow_child_cascades=False)
Exemple #18
0
def update_collaboration_membership_role():
    client_data = current_request.get_json()
    collaboration_id = client_data["collaborationId"]
    user_id = client_data["userId"]
    role = client_data["role"]

    confirm_collaboration_admin(collaboration_id)

    collaboration_membership = CollaborationMembership.query \
        .filter(CollaborationMembership.collaboration_id == collaboration_id) \
        .filter(CollaborationMembership.user_id == user_id) \
        .one()
    collaboration_membership.role = role

    db.session.merge(collaboration_membership)
    return collaboration_membership, 201
Exemple #19
0
def delete_collaboration_membership(collaboration_id, user_id):
    if current_user_id() != int(user_id):
        confirm_collaboration_admin(collaboration_id)

    logger = ctx_logger("collaboration_membership_api")

    memberships = CollaborationMembership.query \
        .filter(CollaborationMembership.collaboration_id == collaboration_id) \
        .filter(CollaborationMembership.user_id == user_id) \
        .all()
    for membership in memberships:
        db.session.delete(membership)

    logger.info(f"Deleted {len(memberships)} collaboration memberships of {user_id}")

    res = {'collaboration_id': collaboration_id, 'user_id': user_id}

    return (res, 204) if len(memberships) > 0 else (None, 404)
Exemple #20
0
def update_collaboration_membership_expiry_date():
    client_data = current_request.get_json()
    collaboration_id = client_data["collaboration_id"]
    membership_id = client_data["membership_id"]
    membership_expiry_date = client_data.get("expiry_date")
    if membership_expiry_date:
        membership_expiry_date = datetime.fromtimestamp(client_data["expiry_date"])

    confirm_collaboration_admin(collaboration_id)

    collaboration_membership = CollaborationMembership.query \
        .filter(CollaborationMembership.collaboration_id == collaboration_id) \
        .filter(CollaborationMembership.id == membership_id) \
        .one()
    collaboration_membership.expiry_date = membership_expiry_date
    collaboration_membership.status = STATUS_ACTIVE

    db.session.merge(collaboration_membership)
    return collaboration_membership, 201
Exemple #21
0
def activate():
    body = current_request.get_json()
    if "collaboration_id" in body:
        confirm_collaboration_admin(body["collaboration_id"], org_manager_allowed=False)
    elif "organisation_id" in body:
        confirm_organisation_admin(body["organisation_id"])
    else:
        confirm_write_access()

    user = User.query.get(body["user_id"])

    user.suspended = False
    retention = current_app.app_config.retention
    user.last_login_date = datetime.datetime.now() - datetime.timedelta(days=retention.allowed_inactive_period_days)
    user.suspend_notifications = []
    db.session.merge(user)

    create_suspend_notification(user, retention, current_app, True)
    return {}, 201
Exemple #22
0
def deny_join_request():
    join_request_hash = current_request.get_json()["hash"]
    rejection_reason = current_request.get_json()["rejection_reason"]
    join_request = _get_join_request(join_request_hash)

    confirm_collaboration_admin(join_request.collaboration.id)

    mail_accepted_declined_join_request({"salutation": f"Dear {join_request.user.name}",
                                         "base_url": current_app.app_config.base_url,
                                         "rejection_reason": rejection_reason,
                                         "administrator": current_user_name(),
                                         "join_request": join_request,
                                         "user": join_request.user},
                                        join_request,
                                        False,
                                        [join_request.user.email])
    join_request.status = STATUS_DENIED
    join_request.rejection_reason = rejection_reason
    db.session.merge(join_request)

    return None, 201
Exemple #23
0
def collaboration_invites():
    data = current_request.get_json()
    collaboration_id = data["collaboration_id"]
    confirm_collaboration_admin(collaboration_id)

    administrators = data.get("administrators", [])
    message = data.get("message", None)
    intended_role = data.get("intended_role")
    intended_role = "member" if intended_role not in ["admin", "member"] else intended_role

    group_ids = data.get("groups", [])

    groups = Group.query \
        .filter(Group.collaboration_id == collaboration_id) \
        .filter(Group.id.in_(group_ids)) \
        .all()

    collaboration = Collaboration.query.get(collaboration_id)
    user = User.query.get(current_user_id())

    membership_expiry_date = data.get("membership_expiry_date")
    if membership_expiry_date:
        membership_expiry_date = datetime.fromtimestamp(data.get("membership_expiry_date"))
    for administrator in administrators:
        invitation = Invitation(hash=generate_token(), message=message, invitee_email=administrator,
                                collaboration=collaboration, user=user, status="open",
                                intended_role=intended_role, expiry_date=default_expiry_date(json_dict=data),
                                membership_expiry_date=membership_expiry_date, created_by=user.uid)
        invitation = db.session.merge(invitation)
        invitation.groups.extend(groups)
        db.session.commit()
        mail_collaboration_invitation({
            "salutation": "Dear",
            "invitation": invitation,
            "base_url": current_app.app_config.base_url,
            "wiki_link": current_app.app_config.wiki_link,
            "recipient": administrator
        }, collaboration, [administrator])
    return None, 201
Exemple #24
0
def collaboration_by_id(collaboration_id):
    confirm_collaboration_admin(collaboration_id)

    collaboration = Collaboration.query \
        .options(selectinload(Collaboration.organisation).selectinload(Organisation.services)) \
        .options(selectinload(Collaboration.collaboration_memberships).selectinload(CollaborationMembership.user)) \
        .options(selectinload(Collaboration.groups).selectinload(Group.collaboration_memberships)
                 .selectinload(CollaborationMembership.user)) \
        .options(selectinload(Collaboration.groups).selectinload(Group.invitations)) \
        .options(selectinload(Collaboration.invitations).selectinload(Invitation.user)) \
        .options(selectinload(Collaboration.join_requests).selectinload(JoinRequest.user)) \
        .options(selectinload(Collaboration.services)) \
        .options(selectinload(Collaboration.service_connection_requests)
                 .selectinload(ServiceConnectionRequest.service)) \
        .options(selectinload(Collaboration.service_connection_requests)
                 .selectinload(ServiceConnectionRequest.requester)) \
        .filter(Collaboration.id == collaboration_id).one()

    collaboration_json = jsonify(collaboration).json
    collaboration_json["invitations"] = [invitation for invitation in collaboration_json["invitations"] if
                                         invitation["status"] == "open"]

    return collaboration_json, 200
Exemple #25
0
def delete_join_request(join_request_id):
    join_request = JoinRequest.query.get(join_request_id)
    confirm_collaboration_admin(join_request.collaboration_id)
    if join_request.status == STATUS_OPEN:
        raise BadRequest("Join request with status 'open' can not be deleted")
    return delete(JoinRequest, join_request_id)
Exemple #26
0
def delete_collaboration(id):
    confirm_collaboration_admin(id)
    return delete(Collaboration, id)
Exemple #27
0
def delete_service_request_connection(service_connection_request_id):
    service_connection_request = ServiceConnectionRequest.query.get(service_connection_request_id)

    confirm_collaboration_admin(service_connection_request.collaboration_id)

    return delete(ServiceConnectionRequest, service_connection_request_id)
Exemple #28
0
def delete_invitation(invitation_id):
    invitation = Invitation.query.filter(Invitation.id == invitation_id).one()
    confirm_collaboration_admin(invitation.collaboration_id)
    return delete(Invitation, invitation_id)
Exemple #29
0
def delete_group(group_id):
    group = Group.query.filter(Group.id == group_id).one()

    confirm_collaboration_admin(group.collaboration_id)
    return delete(Group, group_id)