Beispiel #1
0
def quit_team():
    """
    退出团队并清空相应权限
    参数
    {
        "uid":"用户ID",
        "team_id":"团队ID"
    }
    返回:
    {
        "code":0,
        "message":""
    }
    """
    if not session.get("uid"):
        return make_response(-1, message="请先登录")
    operator: User = User.by_id(session.get("uid"))
    user: User = User.by_id(request.form["uid"])
    team: Team = Team.by_id(request.form["team_id"])
    if user.id != operator.id and not permission_manager.has_permission(
            operator.id, "team.manage"
    ) and operator.id not in team.admins and operator.id != team.owner_id:
        return make_response(-1, message="你没有权限这样做")
    relation = db.session.query(TeamMember).filter_by(
        uid=user.id, team_id=team.id).one_or_none()
    if not relation:
        return make_response(-1, message="您不在此团队内")
    if user.id == team.owner_id:
        return make_response(-1, message="此用户不可被移出团队")

    # def remove_and_return(a, val):
    #     a = a.copy()
    #     a.remove(val)
    #     return a
    # # print(team.members)
    # team.members = remove_and_return(team.members, user.id)
    # user.joined_teams = remove_and_return(user.joined_teams, team.id)
    # if user.id in team.admins:
    #     team.admins = remove_and_return(team.admins, user.id)
    # print(team.members)
    db.session.delete(relation)
    db.session.commit()
    perms = set((f"contest.use.{item}" for item in team.team_contests)) | set(
        (f"problem.use.{item}" for item in team.team_problems)) | set(
            (f"problemset.use.{item}" for item in team.team_problemsets))
    user.permissions = [item for item in user.permissions if item not in perms]
    db.session.commit()
    permission_manager.refresh_user(user.id)
    return make_response(0, message="操作完成")
Beispiel #2
0
def set_admin():
    """
    此操作只可由团队主进行
    (更新:也可由具有team.manage权限的用户进行)
    参数
    {
        "team_id":"团队ID",
        "uid":"用户ID",
        "value":True/False,表示设定/取消管理员
    }
    {
        "code":-1,"message":""
    }
    """
    if not session.get("uid"):
        return make_response(-1, message="请先登录!")
    user: User = User.by_id(request.form["uid"])
    team: Team = Team.by_id(request.form["team_id"])
    operator: User = User.by_id(session.get("uid"))
    value = request.form["value"].lower() == "true"
    to_modify_relationship: TeamMember = db.session.query(
        TeamMember).filter_by(team_id=team.id, uid=user.id).one_or_none()
    operator_relationship: TeamMember = db.session.query(TeamMember).filter_by(
        team_id=team.id, uid=operator.id).one_or_none()
    if not operator_relationship:
        return make_response(-1, message="你没有权限进行此操作")
    if not to_modify_relationship:
        return make_response(-1, message="此用户不在团队中")
    if user.id == team.owner_id:
        return make_response(-1, message="无法对此用户进行此操作")
    if team.owner_id != operator.id and not operator_relationship.is_admin and not permission_manager.has_permission(
            session.get("uid", -1), "team.manage"):
        return make_response(-1, message="你没有权限执行此操作")
    to_modify_relationship.is_admin = value

    # def remove_and_return(a, val):
    #     a = a.copy()
    #     a.remove(val)
    #     return a
    # if value:
    #     if user.id not in team.admins:
    #         team.admins = [*team.admins, user.id]
    # else:
    #     if user.id in team.admins:
    #         team.admins = remove_and_return(team.admins, user.id)
    db.session.commit()
    return make_response(0, message="操作完成")
Beispiel #3
0
def team_update():
    """
    更新团队信息
    {
        "team_id":"团队ID",
        "data":{
            "id":团队ID,
            "name":"团队名",
            "description":"团队描述",
            "tasks":[
                {"name":"任务名","problems":[1,2,3]}
            ],
            "private":"是否为私有团队",
            "invite_code":"邀请码"
        }
    }

    """
    if not session.get("uid"):
        return make_response(-1, message="请先登录")
    team: Team = Team.by_id(request.form["team_id"])
    user: User = User.by_id(session.get("uid"))
    relationship = db.session.query(TeamMember).filter_by(
        uid=user.id, team_id=team.id, is_admin=True).one_or_none()
    if user.id != team.owner_id and not relationship and not permission_manager.has_permission(
            user, "team.manage"):
        return make_response(-1, message="你没有权限进行此操作")
    data: dict = decode_json(request.form["data"])
    team.name = data["name"]
    team.description = data["description"]
    team.tasks = data["tasks"]
    team.private = data["private"]
    team.invite_code = data["invite_code"]
    for task in team.tasks:
        for problem in task["problems"]:
            if not Problem.has(problem):
                return make_response(
                    -1, message=f"任务 {task['name']} 中的题目 {problem}不存在!")
    db.session.commit()
    return make_response(0, message="保存成功")
Beispiel #4
0
def join_team():
    """
    参数
    {
        "uid":"用户ID",
        "team_id":"团队ID"
        "invite_code":"邀请码"
    }
    返回:
    {
        "code":0,
        "message":""
    }
    """
    if not session.get("uid"):
        return make_response(-1, message="请先登录")
    owner: User = User.by_id(session.get("uid"))
    if int(owner.id) != int(request.form["uid"]):
        return make_response(-1, message="此操作只能由用户本人进行")
    team: Team = Team.by_id(request.form["team_id"])
    if db.session.query(TeamMember).filter_by(
            uid=session.get("uid"), team_id=request.form["team_id"]).count():
        return make_response(-1, message="您已经在本团队内")
    if team.private and not permission_manager.has_permission(
            session.get("uid"), f"team.use.{team.id}"):
        if team.invite_code != request.form.get("invite_code", ""):
            return make_response(-1, message="邀请码错误")
        else:
            permission_manager.add_permission(session.get("uid"),
                                              f"team.use.{team.id}")
    # team.members = [*team.members, owner.id]
    # owner.joined_teams = [*owner.joined_teams, team.id]

    db.session.add(
        TeamMember(uid=session.get("uid"), team_id=team.id, is_admin=False))
    db.session.commit()
    return make_response(0, message="加入成功")
Beispiel #5
0
def show_team():
    """
    参数
    {
        "team_id":"团队ID"
    }
    返回:
    {
        "code":0,
        "data":{
            "canManage":"是否可以管理",
            "id":"团队ID",
            "name":"团队名",
            "description":"团队描述",
            "owner_id":"所有者ID",
            "owner_username":"******",
            "admins":[],//管理员列表[1,2,3]
            "members":[],//用户列表{"username":"******","uid":xxx}
            "create_time":"创建时间",
            "hasPermission":"是否有权限查看详情",
            "problems":[ // 团队题目列表
                {"id":"题目ID","title":"题目名"}
            ],
            "contests":[ // 团队题目列表
                {"id":"比赛ID","name":"比赛名"}
            ],
            "problemsets":[ // 团队题目列表
                {"id":"习题集ID","name":"习题集名"}
            ],
            "tasks":[
                {
                    "name":"任务名",
                    "problems":[
                        {
                            "name":"题目名",
                            "id":"题目ID",
                            scores:[
                                {
                                    "uid":"用户ID",
                                    "username":"******"
                                    "score":"题目得分",
                                    "status":"题目状态",
                                    "submit_id":"提交ID"
                                },
                            ]
                        }
                    ]
                }
            ]
        }
    }
    """
    if not session.get("uid"):
        return make_response(-1, message="请先登录")
    user: User = User.by_id(session.get("uid"))
    team: Team = Team.by_id(request.form["team_id"])
    user_relationship: TeamMember = db.session.query(TeamMember).filter_by(
        uid=user.id, team_id=team.id).one_or_none()
    has_permission = permission_manager.has_permission(
        user.id, f"team.use.{team.id}"
    ) or (not team.private) or user.id == team.owner_id or (user_relationship)
    # result = team.as_dict()
    members = db.session.query(TeamMember.uid, TeamMember.is_admin,
                               User.username).join(User).filter(
                                   TeamMember.team_id == team.id).order_by(
                                       TeamMember.is_admin.desc()).order_by(
                                           User.username.asc()).all()
    result = {
        "id":
        team.id,
        "name":
        team.name,
        "description":
        team.description,
        "owner_id":
        team.owner_id,
        "tasks":
        team.tasks,
        "create_time":
        str(team.create_time),
        "private":
        bool(team.private),
        "team_problems":
        team.team_problems,
        "team_contests":
        team.team_contests,
        "team_problemsets":
        team.team_problemsets,
        "canManage":
        permission_manager.has_permission(session.get("uid", -1),
                                          "team.manage")
    }
    result["owner_username"] = User.by_id(result["owner_id"]).username
    result["hasPermission"] = has_permission
    result["team_problems"] = [{
        "id":
        item,
        "title":
        db.session.query(Problem.title).filter_by(id=item).one().title
    } for item in result["team_problems"]]
    result["team_contests"] = [{
        "id":
        item,
        "name":
        db.session.query(Contest.name).filter_by(id=item).one().name
    } for item in result["team_contests"]]
    result["team_problemsets"] = [{
        "id":
        item,
        "name":
        db.session.query(ProblemSet.name).filter_by(id=item).one().name
    } for item in result["team_problemsets"]]

    if has_permission:
        for item in result["tasks"]:
            problems = []
            for problem in item["problems"]:
                current: Problem = Problem.by_id(problem)
                last = {"id": current.id, "name": current.title, "scores": []}
                for user_ in members:
                    user = user_.uid
                    submit: Submission = db.session.query(Submission).filter(
                        Submission.uid == user).filter(
                            Submission.problem_id == current.id).order_by(
                                Submission.status.asc()).order_by(
                                    Submission.submit_time.desc())
                    if submit.count() == 0:
                        submit = None
                    else:
                        submit = submit.first()
                    if submit:
                        last["scores"].append({
                            "uid": user,
                            "username": User.by_id(user).username,
                            "score": submit.get_total_score(),
                            "status": submit.status,
                            "submit_id": submit.id
                        })
                    else:
                        last["scores"].append({
                            "uid": user,
                            "username": User.by_id(user).username,
                            "score": 0,
                            "status": "unsubmitted"
                        })

                problems.append(last)
            item["problems"] = problems

        result["create_time"] = str(result["create_time"])

        result["admins"] = []
        result["members"] = []
        for x in members:
            result["members"].append({"username": x.username, "uid": x.uid})
            if x.is_admin:
                result["admins"].append(x.uid)
        # result["members"] = list(map(lambda x: {"username": User.by_id(
        #     x).username, "uid": x}, result["members"]))
    else:
        result["description"] = ""
        result["admins"] = []
        result["members"] = []
        result["create_time"] = ""
        result["tasks"] = []

    return make_response(0, message="操作完成", data=result)