from flask import request, Response, abort from flask_restful import reqparse def require_args(*args): parser = reqparse.RequestParser() for arg in args: parser.add_argument(arg, required=True, help="{} required".format(arg)) return parser.parse_args() class Challenge(object): """ A sample challenge -- inherit this and overwrite accordingly """ points = 0 provides = [] requires = [] description = "This description should be overriden" dependencies_provided_by = {} def __init__(self, wrapper): self.db = wrapper def game(self): if request.method == 'GET': return self.describe() if request.method == 'HEAD': return self.describe() if request.method == 'POST': return self.solve() def describe(self): """ Describe what to do to solve this challenge""" return self.description def save_points(self, user): """ should be called when the challenge was solved successfully""" key = "points/{}".format(user, type(self).__name__) self.db.set_user_key(user, key, self.points) def solve(self): """ Needs to be implemented per challenge """ pass def error(self, msg=""): """ Abort with an error """ return Response(status=400, response=msg) def get_args(self, *args): res = {} f = request.form for arg in args: if arg not in f: abort(Response("Missing argument: {}\n".format(arg))) res[arg] = f[arg] return res