def task_by_id(challenge_slug, task_id): "Either displays a task (assigning it) or else posts the commit" # make sure we're authenticated challenge = get_challenge_or_404(challenge_slug, True) task = get_task_or_404(challenge, task_id) osmid = session.get('osm_id') if request.method == 'GET': try: assign = int(request.args.get('assign', 1)) except ValueError: abort(400) if assign: action = Action(task.id, "assigned", osmid) task.current_state = action db.session.add(action) db.session.add(task) return jsonify(marshal(task, task_fields)) elif request.method == 'POST': valid_actions = [button.action for button in challenge.dlg['buttons']] action = None for key in valid_actions: if request.form.get(key): action = Action(task.id, key, osmid) task.current_action = action db.session.add(action) break if not action: abort(400) new_state = challenge.task_status(task) action = Action(task.id, new_state, osmid) task.current_action = action db.session.add(action) db.session.add(task) db.commit()
def post(self, challenge_slug, task_id): challenge = get_challenge_or_404(challenge_slug, instance_type=False, abort_if_inactive=False) task = get_task_or_404(challenge, task_id) if request.form.get('run'): task['run'] = request.form['run'] if request.form.get('text'): task['instruction'] = request.form['text'] if request.form.get('location'): # WILL THIS WORK??? task['location'] = request.form['location'] if request.form.get('manifest'): task['manifest'] = request.form['manifest'] db.session.add(task) db.commit() return task
def put(self, challenge_slug, task_id): challenge = get_challenge_or_404(challenge_slug, instance_type=False, abort_if_inactive=False) task = Task.query(Task.identifier == task_id). \ filter(Task.challenge_slug == challenge.slug).first() if task: action = Action(task.id, "modified") db.session.add(action) else: task = Task(challenge.slug, task_id) db.session.add(task) db.session.flush() action = Action(task.id, "created") db.session.add(action) action = Action(task.id, "available") db.session.add(action) parser = reqparse.RequestParser() parser.add_argument('run', required=True, help="New tasks must include a Run ID") parser.add_argument('text', dest='instruction') parser.add_argument('location', type=GeoPoint, help="Location must be in the form lon|lat") parser.add_argument('manifest', type=JsonData, help="Manifest must be valid JSON") args = parser.parse_args() if request.form.get('run'): task['run'] = request.form['run'] if request.form.get('text'): task['instruction'] = request.form['text'] if request.form.get('location'): # WILL THIS WORK??? task['location'] = request.form['location'] if request.form.get('manifest'): task['manifest'] = request.form['manifest'] # LET'S HOPE ADDING IT TWICE DOESN'T BREAK ANYTHING db.session.add(task) db.commit() return task