95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
|
from flask import Blueprint, request
|
||
|
from flask import current_app as app
|
||
|
from voluptuous import Schema, Length, Required
|
||
|
|
||
|
from models import db, Teams, Users
|
||
|
from decorators import api_wrapper, login_required, WebException
|
||
|
from user import in_team, get_user, is_logged_in
|
||
|
from schemas import verify_to_schema, check
|
||
|
|
||
|
import utils
|
||
|
|
||
|
blueprint = Blueprint("team", __name__)
|
||
|
|
||
|
###############
|
||
|
# TEAM ROUTES #
|
||
|
###############
|
||
|
|
||
|
@blueprint.route("/create", methods=["POST"])
|
||
|
@api_wrapper
|
||
|
@login_required
|
||
|
def team_create():
|
||
|
params = utils.flat_multi(request.form)
|
||
|
user = get_user().first()
|
||
|
if user.tid is not None or user.tid >= 0 or get_team(owner=user.uid).first() is not None:
|
||
|
raise WebException("You're already in a team!")
|
||
|
|
||
|
verify_to_schema(TeamSchema, params)
|
||
|
teamname = params.get("teamname")
|
||
|
|
||
|
team = Teams(teamname, user.uid)
|
||
|
with app.app_context():
|
||
|
db.session.add(team)
|
||
|
db.session.commit()
|
||
|
Users.query.filter_by(uid=user.uid).update({ "tid": team.tid })
|
||
|
db.session.commit()
|
||
|
|
||
|
return { "success": 1, "message": "Success!" }
|
||
|
|
||
|
@blueprint.route("/info", methods=["GET"])
|
||
|
@api_wrapper
|
||
|
def team_info():
|
||
|
logged_in = is_logged_in()
|
||
|
me = False
|
||
|
teamname = utils.flat_multi(request.args).get("teamname")
|
||
|
if logged_in:
|
||
|
my_team = get_team().first()
|
||
|
if my_team is not None:
|
||
|
if teamname is None:
|
||
|
teamname = my_team.teamname
|
||
|
me = True
|
||
|
elif teamname.lower() == my_team.teamname.lower():
|
||
|
me = True
|
||
|
if teamname is None:
|
||
|
raise WebException("No team specified.")
|
||
|
team = get_team(teamname_lower=teamname.lower()).first()
|
||
|
if team is None:
|
||
|
raise WebException("Team not found.")
|
||
|
|
||
|
teamdata = {
|
||
|
"teamname": team.teamname
|
||
|
}
|
||
|
teamdata["in_team"] = me
|
||
|
return { "success": 1, "team": teamdata }
|
||
|
|
||
|
##################
|
||
|
# TEAM FUNCTIONS #
|
||
|
##################
|
||
|
|
||
|
__check_teamname = lambda teamname: get_team(teamname_lower=teamname.lower()).first() is None
|
||
|
|
||
|
TeamSchema = Schema({
|
||
|
Required("teamname"): check(
|
||
|
([str, Length(min=4, max=32)], "Your teamname should be between 4 and 32 characters long."),
|
||
|
([utils.__check_ascii], "Please only use ASCII characters in your teamname."),
|
||
|
([__check_teamname], "This teamname is taken, did you forget your password?")
|
||
|
),
|
||
|
}, extra=True)
|
||
|
|
||
|
def get_team(tid=None, teamname=None, teamname_lower=None, owner=None):
|
||
|
match = {}
|
||
|
if teamname != None:
|
||
|
match.update({ "teamname": teamname })
|
||
|
elif teamname_lower != None:
|
||
|
match.update({ "teamname_lower": teamname_lower })
|
||
|
elif tid != None:
|
||
|
match.update({ "tid": tid })
|
||
|
elif owner != None:
|
||
|
match.update({ "owner": owner })
|
||
|
elif is_logged_in():
|
||
|
user = get_user().first()
|
||
|
if user.tid is not None:
|
||
|
match.update({ "tid": user.tid })
|
||
|
with app.app_context():
|
||
|
result = Teams.query.filter_by(**match)
|
||
|
return result
|