def create_club(): current_user = User.get(request.user_id) if not current_user: return jsonify(error="invalid-token"), 401 json = request.get_json() if json is None: return jsonify(error="invalid-request"), 400 try: data = ClubSchema(only=("name",)).load(json).data except ValidationError as e: return jsonify(error="validation-failed", fields=e.messages), 422 if Club.exists(name=data.get("name")): return jsonify(error="duplicate-club-name"), 422 # create the new club club = Club(**data) club.owner_id = current_user.id db.session.add(club) db.session.flush() # assign the user to the new club current_user.club = club # create the "user joined club" event create_club_join_event(club.id, current_user) db.session.commit() return jsonify(id=club.id)
def near(flight_id): flight = get_requested_record(Flight, flight_id, joinedload=[Flight.igc_file]) current_user = User.get(request.user_id) if request.user_id else None if not flight.is_viewable(current_user): return jsonify(), 404 try: latitude = float(request.args['lat']) longitude = float(request.args['lon']) time = float(request.args['time']) except (KeyError, ValueError): abort(400) location = Location(latitude=latitude, longitude=longitude) time = from_seconds_of_day(flight.takeoff_time, time) flights = _get_near_flights(flight, location, time, 1000) def add_flight_path(flight): trace = _get_flight_path(flight, threshold=0.0001, max_points=10000) trace['additional'] = dict(registration=flight.registration, competition_id=flight.competition_id) return trace return jsonify(flights=map(add_flight_path, flights))
def update(club_id): current_user = User.get(request.user_id) if not current_user: return jsonify(error="invalid-token"), 401 club = get_requested_record(Club, club_id) if not club.is_writable(current_user): return jsonify(error="forbidden"), 403 json = request.get_json() if json is None: return jsonify(error="invalid-request"), 400 try: data = ClubSchema(partial=True).load(json).data except ValidationError as e: return jsonify(error="validation-failed", fields=e.messages), 422 if "name" in data: name = data.get("name") if name != club.name and Club.exists(name=name): return jsonify(error="duplicate-club-name"), 422 club.name = name if "website" in data: club.website = data.get("website") db.session.commit() return jsonify()
def near(flight_id): flight = get_requested_record(Flight, flight_id, joinedload=[Flight.igc_file]) current_user = User.get(request.user_id) if request.user_id else None if not flight.is_viewable(current_user): return jsonify(), 404 try: latitude = float(request.args["lat"]) longitude = float(request.args["lon"]) time = float(request.args["time"]) except (KeyError, ValueError): abort(400) location = Location(latitude=latitude, longitude=longitude) time = from_seconds_of_day(flight.takeoff_time, time) flights = _get_near_flights(flight, location, time, 1000) def add_flight_path(flight): trace = _get_flight_path(flight, threshold=0.0001, max_points=10000) trace["additional"] = dict(registration=flight.registration, competition_id=flight.competition_id) return trace return jsonify(flights=map(add_flight_path, flights))
def userNameRequestReceived(self, host, port, key, payload): """The client asks for the display name of a user account.""" if len(payload) != 8: return pilot = User.by_tracking_key(key) if pilot is None: log.err("No such pilot: %d" % key) return data = struct.unpack('!II', payload) user_id = data[0] user = User.get(user_id) if user is None: response = struct.pack('!IHHQIIIBBBBII', MAGIC, 0, TYPE_USER_NAME_RESPONSE, 0, user_id, USER_FLAG_NOT_FOUND, 0, 0, 0, 0, 0, 0, 0) response = set_crc(response) self.transport.write(response, (host, port)) return name = user.name[:64].encode('utf8', 'ignore') club_id = user.club_id or 0 response = struct.pack('!IHHQIIIBBBBII', MAGIC, 0, TYPE_USER_NAME_RESPONSE, 0, user_id, 0, club_id, len(name), 0, 0, 0, 0, 0) response += name response = set_crc(response) self.transport.write(response, (host, port))
def read(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 schema = CurrentUserSchema(exclude=('id')) return jsonify(schema.dump(current_user).data)
def follow(user_id): user = get_requested_record(User, user_id) current_user = User.get(request.user_id) Follower.follow(current_user, user) create_follower_notification(user, current_user) db.session.commit() return jsonify()
def update(club_id): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 club = get_requested_record(Club, club_id) if not club.is_writable(current_user): return jsonify(error='forbidden'), 403 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = ClubSchema(partial=True).load(json).data except ValidationError as e: return jsonify(error='validation-failed', fields=e.messages), 422 if 'name' in data: name = data.get('name') if name != club.name and Club.exists(name=name): return jsonify(error='duplicate-club-name'), 422 club.name = name if 'website' in data: club.website = data.get('website') db.session.commit() return jsonify()
def read(user_id): user = User.get(user_id) if user is None: raise NotFound() result = user_schema.dump(user) return jsonify(result.data)
def add_comment(flight_id): flight = get_requested_record(Flight, flight_id) current_user = User.get(request.user_id) if not current_user: return jsonify(), 403 json = request.get_json() if json is None: return jsonify(error="invalid-request"), 400 try: data = FlightCommentSchema().load(json).data except ValidationError as e: return jsonify(error="validation-failed", fields=e.messages), 422 comment = FlightComment() comment.user = current_user comment.flight = flight comment.text = data["text"] create_flight_comment_notifications(comment) db.session.commit() return jsonify()
def run(self, user_id): user = User.get(user_id) if not user: print 'User with id "{}" not found.'.format(user_id) sys.exit(1) i = randint(0, 100) _longitude = randint(6500, 7500) / 1000. _latitude = randint(50500, 51500) / 1000. _altitude = 500 while True: longitude = sin(i / 73.) * 0.001 + _longitude latitude = sin(i / 50.) * 0.004 + _latitude altitude = sin(i / 20.) * 300 + _altitude fix = TrackingFix() fix.pilot = user fix.set_location(longitude, latitude) fix.altitude = altitude fix.time = datetime.now() fix.time_visible = fix.time + timedelta(minutes=user.tracking_delay) db.session.add(fix) db.session.commit() print '.', sys.stdout.flush() sleep(1) i += 1
def add_comment(flight_id): flight = get_requested_record(Flight, flight_id) current_user = User.get(request.user_id) if not current_user: return jsonify(), 403 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = FlightCommentSchema().load(json).data except ValidationError as e: return jsonify(error='validation-failed', fields=e.messages), 422 comment = FlightComment() comment.user = current_user comment.flight = flight comment.text = data['text'] create_flight_comment_notifications(comment) db.session.commit() return jsonify()
def follow(user_id): user = get_requested_record(User, user_id) current_user = User.get(request.user_id) Follower.follow(current_user, user) create_follower_notification(user, current_user) db.session.commit() return jsonify()
def userNameRequestReceived(self, host, port, key, payload): """The client asks for the display name of a user account.""" if len(payload) != 8: return pilot = User.by_tracking_key(key) if pilot is None: log.err("No such pilot: %d" % key) return data = struct.unpack('!II', payload) user_id = data[0] user = User.get(user_id) if user is None: response = struct.pack('!IHHQIIIBBBBII', MAGIC, 0, TYPE_USER_NAME_RESPONSE, 0, user_id, USER_FLAG_NOT_FOUND, 0, 0, 0, 0, 0, 0, 0) response = set_crc(response) self.transport.write(response, (host, port)) return name = user.name[:64].encode('utf8', 'ignore') club_id = user.club_id or 0 response = struct.pack('!IHHQIIIBBBBII', MAGIC, 0, TYPE_USER_NAME_RESPONSE, 0, user_id, 0, club_id, len(name), 0, 0, 0, 0, 0) response += name response = set_crc(response) self.transport.write(response, (host, port))
def recover_step1_post(json): try: data = CurrentUserSchema(only=("email", )).load(json).data except ValidationError as e: return jsonify(error="validation-failed", fields=e.messages), 422 user = User.by_email_address(data["email_address"]) if not user: return jsonify(error="email-unknown"), 422 user.generate_recover_key(request.remote_addr) current_user = User.get(request.user_id) if request.user_id else None if current_user.admin: url = u"http://skylines.aero/users/recover?key=%x" % user.recover_key return jsonify(url=url) try: send_recover_mail(user) except ServiceUnavailable: return jsonify(error="mail-service-unavailable"), 503 db.session.commit() return jsonify()
def read(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 schema = CurrentUserSchema(exclude=('id')) return jsonify(schema.dump(current_user).data)
def create_club(): '''register new club''' current_user = User.get(request.user_id) if not current_user: return jsonify(error="invalid-token"), 401 json = request.get_json() if json is None: return jsonify(error="invalid-request"), 400 try: data = ClubSchema(only=("name","email","website")).load(json).data except ValidationError as e: return jsonify(error="validation-failed", fields=e.messages), 422 if Club.exists(name=data.get("name")): return jsonify(error="duplicate-club-name"), 422 # create the new club club = Club(**data) club.owner_id = current_user.id db.session.add(club) db.session.flush() # assign the user to the new club current_user.club = club # create the "user joined club" event create_club_join_event(club.id, current_user) db.session.commit() return jsonify(id=club.id)
def run(self, user_id): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) user = User.get(user_id) if not user: print('User with id "{}" not found.'.format(user_id)) sys.exit(1) start_time = datetime.utcnow() i = randint(0, 100) _time = ( start_time.hour * 60 * 60 * 1000 + start_time.minute * 60 * 1000 + start_time.second * 1000 ) _longitude = randint(6500, 7500) / 1000.0 _latitude = randint(50500, 51500) / 1000.0 _altitude = 500 while True: longitude = sin(i / 73.0) * 0.001 + _longitude latitude = sin(i / 50.0) * 0.004 + _latitude altitude = sin(i / 20.0) * 300 + _altitude flags = FLAG_LOCATION | FLAG_ALTITUDE fix = TrackingFix() fix.pilot_id = user.id fix.set_location(longitude, latitude) fix.altitude = altitude data = struct.pack( "!IHHQIIiiIHHHhhH", MAGIC, 0, TYPE_FIX, user.tracking_key, flags, _time, int(latitude * 1000000), int(longitude * 1000000), 0, 0, 0, 0, int(altitude), 0, 0, ) data = set_crc(data) sock.sendto(data, self.ADDRESS) print(".", end="") sys.stdout.flush() sleep(1) i += 1 _time += 1000
def _patch_query(q): current_user = User.get(request.user_id) if request.user_id else None return ( q.join(Flight.igc_file) .options(contains_eager(Flight.igc_file)) .filter(Flight.is_viewable(current_user)) )
def _patch_query(q): current_user = User.get(request.user_id) if request.user_id else None return ( q.join(Flight.igc_file) .options(contains_eager(Flight.igc_file)) .filter(Flight.is_viewable(current_user)) )
def mark_user_notifications_read(user): if not request.user_id: return def add_user_filter(query): return query.filter(Event.actor_id == user.id) Notification.mark_all_read(User.get(request.user_id), filter_func=add_user_filter) db.session.commit()
def tracking_generate_key(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 current_user.generate_tracking_key() db.session.commit() return jsonify(key=current_user.tracking_key_hex)
def mark_flight_notifications_read(flight): if not request.user_id: return def add_flight_filter(query): return query.filter(Event.flight_id == flight.id) Notification.mark_all_read(User.get(request.user_id), filter_func=add_flight_filter) db.session.commit()
def tracking_generate_key(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 current_user.generate_tracking_key() db.session.commit() return jsonify(key=current_user.tracking_key_hex)
def mark_user_notifications_read(pilot): if not request.user_id: return def add_flight_filter(query): return query.filter(Event.actor_id == pilot.id) Notification.mark_all_read(User.get(request.user_id), filter_func=add_flight_filter) db.session.commit()
def read(club_id): current_user = User.get(request.user_id) if request.user_id else None club = get_requested_record(Club, club_id) json = ClubSchema().dump(club).data json["isWritable"] = club.is_writable(current_user) or False return jsonify(json)
def read(club_id): current_user = User.get(request.user_id) if request.user_id else None club = get_requested_record(Club, club_id) json = ClubSchema().dump(club).data json["isWritable"] = club.is_writable(current_user) or False return jsonify(json)
def run(self, user_id): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) user = User.get(user_id) if not user: print('User with id "{}" not found.'.format(user_id)) sys.exit(1) start_time = datetime.utcnow() i = randint(0, 100) _time = (start_time.hour * 60 * 60 * 1000 + start_time.minute * 60 * 1000 + start_time.second * 1000) _longitude = randint(6500, 7500) / 1000. _latitude = randint(50500, 51500) / 1000. _altitude = 500 while True: longitude = sin(i / 73.) * 0.001 + _longitude latitude = sin(i / 50.) * 0.004 + _latitude altitude = sin(i / 20.) * 300 + _altitude flags = FLAG_LOCATION | FLAG_ALTITUDE fix = TrackingFix() fix.pilot_id = user.id fix.set_location(longitude, latitude) fix.altitude = altitude data = struct.pack( '!IHHQIIiiIHHHhhH', MAGIC, 0, TYPE_FIX, user.tracking_key, flags, _time, int(latitude * 1000000), int(longitude * 1000000), 0, 0, 0, 0, altitude, 0, 0, ) data = set_crc(data) sock.sendto(data, self.ADDRESS) print('.', end='') sys.stdout.flush() sleep(1) i += 1 _time += 1000
def check_current_password(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 json = request.get_json() if not json: return jsonify(error='invalid-request'), 400 return jsonify(result=current_user.validate_password(json.get('password', '')))
def run(self, user): self.user = User.get(user) print 'Generating logger id...', m = hashlib.md5() m.update(str(user)) self.logger_id = base36.encode(int(m.hexdigest(), 16))[0:3] print self.logger_id self.export_sessions(user)
def clear(): def filter_func(query): return _filter_query(query, request.args) current_user = User.get(request.user_id) Notification.mark_all_read(current_user, filter_func=filter_func) db.session.commit() return jsonify()
def check_current_password(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 json = request.get_json() if not json: return jsonify(error='invalid-request'), 400 return jsonify(result=current_user.validate_password(json.get('password', '')))
def clear(): def filter_func(query): return _filter_query(query, request.args) current_user = User.get(request.user_id) Notification.mark_all_read(current_user, filter_func=filter_func) db.session.commit() return jsonify()
def run(self, user): self.user = User.get(user) print 'Generating logger id...', m = hashlib.md5() m.update(str(user)) self.logger_id = base36.encode(int(m.hexdigest(), 16))[0:3] print self.logger_id self.export_sessions(user)
def json(flight_id): '''for "path" ''' flight = get_requested_record( Flight, flight_id, joinedload=(Flight.igc_file, Flight.model) ) igc_file = '/home/bret/servers/repo-skylinesC/skylinesC/htdocs/files/{}'.format(flight.igc_file.filename) create_fpl_file(igc_file) current_user = User.get(request.user_id) if request.user_id else None if not flight.is_viewable(current_user): return jsonify(), 404 # Return HTTP Status code 304 if an upstream or browser cache already # contains the response and if the igc file did not change to reduce # latency and server load # This implementation is very basic. Sadly Flask (0.10.1) does not have # this feature last_modified = flight.time_modified.strftime("%a, %d %b %Y %H:%M:%S GMT") modified_since = request.headers.get("If-Modified-Since") etag = request.headers.get("If-None-Match") if (modified_since and modified_since == last_modified) or ( etag and etag == flight.igc_file.md5 ): return ("", 304) trace = _get_flight_path(flight, threshold=0.0001, max_points=10000) if not trace: abort(404) model = AircraftModelSchema().dump(flight.model).data or None resp = make_response( jsonify( points=trace["points"], barogram_t=trace["barogram_t"], barogram_h=trace["barogram_h"], enl=trace["enl"], contests=trace["contests"], elevations_t=trace["elevations_t"], elevations_h=trace["elevations_h"], sfid=flight.id, geoid=trace["geoid"], additional=dict( registration=flight.registration, competition_id=flight.competition_id, model=model, score=flight.index_score, groupflight_id=flight.groupflight_id, ), ) ) resp.headers["Last-Modified"] = last_modified resp.headers["Etag"] = flight.igc_file.md5 return resp
def delete_user(user_id): current_user = User.get(request.user_id) if not current_user.is_manager(): return jsonify(), 403 user = get_requested_record(User, user_id) user.delete() db.session.commit() return jsonify()
def verify(): current_user = User.get(request.user_id) json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = FlightSchema(partial=True).load(json, many=True).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def verify(): current_user = User.get(request.user_id) json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = FlightSchema(partial=True).load(json, many=True).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def delete_user(user_id): current_user = User.get(request.user_id) if not current_user.is_manager(): return jsonify(), 403 user = get_requested_record(User, user_id) user.delete() db.session.commit() return jsonify()
def read(user_id): user = User.get(user_id) if user is None: raise NotFound() assert isinstance(user, User) created_at = user.created assert isinstance(created_at, datetime) result = user_schema.dump(user) return jsonify(result.data)
def test_generate(db_session, client): john = users.john() add_fixtures(db_session, john) old_key = john.tracking_key_hex res = client.post("/settings/tracking/key", headers=auth_for(john)) assert res.status_code == 200 new_key = res.json["key"] assert new_key != old_key assert User.get(john.id).tracking_key_hex == new_key
def run(self, user_id, **kwargs): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) user = User.get(user_id) if not user: print('User with id "{}" not found.'.format(user_id)) sys.exit(1) start_time = datetime.utcnow() i = randint(0, 100) _time = (start_time.hour * 60 * 60 * 1000 + start_time.minute * 60 * 1000 + start_time.second * 1000) _longitude = randint(6500, 7500) / 1000.0 _latitude = randint(50500, 51500) / 1000.0 _altitude = 500 while True: longitude = sin(i / 73.0) * 0.001 + _longitude latitude = sin(i / 50.0) * 0.004 + _latitude altitude = sin(i / 20.0) * 300 + _altitude flags = FLAG_LOCATION | FLAG_ALTITUDE data = struct.pack( "!IHHQIIiiIHHHhhH", MAGIC, 0, TYPE_FIX, user.tracking_key, flags, _time, int(latitude * 1000000), int(longitude * 1000000), 0, 0, 0, 0, int(altitude), 0, 0, ) data = set_crc(data) sock.sendto(data, (kwargs.get("host"), kwargs.get("port"))) print(".", end="") sys.stdout.flush() sleep(1) i += 1 _time += 1000
def update(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = CurrentUserSchema(partial=True).load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def delete(flight_id): flight = get_requested_record(Flight, flight_id, joinedload=[Flight.igc_file]) current_user = User.get(request.user_id) if not flight.is_writable(current_user): abort(403) files.delete_file(flight.igc_file.filename) db.session.delete(flight) db.session.delete(flight.igc_file) db.session.commit() return jsonify()
def create_club(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = ClubSchema(only=('name', )).load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def delete(flight_id): flight = get_requested_record(Flight, flight_id, joinedload=[Flight.igc_file]) current_user = User.get(request.user_id) if not flight.is_writable(current_user): abort(403) files.delete_file(flight.igc_file.filename) db.session.delete(flight) db.session.delete(flight.igc_file) db.session.commit() return jsonify()
def create_club(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = ClubSchema(only=('name',)).load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def index_post(): current_user = User.get(request.user_id) form = request.form if form.get('pilotId') == u'': form = form.copy() form.pop('pilotId') try: data = FlightSchema(only=('pilotId', 'pilotName')).load(form).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def update(): current_user = User.get(request.user_id) if not current_user: return jsonify(error='invalid-token'), 401 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = CurrentUserSchema(partial=True).load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def index_post(): current_user = User.get(request.user_id) form = request.form if form.get('pilotId') == u'': form = form.copy() form.pop('pilotId') try: data = FlightSchema(only=('pilotId', 'pilotName')).load(form).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def latest(): current_user = User.get(request.user_id) if request.user_id else None query = (db.session.query(func.max( Flight.date_local).label("date")).filter( Flight.takeoff_time < datetime.utcnow()).join( Flight.igc_file).filter(Flight.is_listable(current_user))) date_ = query.one().date if not date_: date_ = datetime.utcnow() return date(date_)
def latest(): current_user = User.get(request.user_id) if request.user_id else None query = db.session \ .query(func.max(Flight.date_local).label('date')) \ .filter(Flight.takeoff_time < datetime.utcnow()) \ .join(Flight.igc_file) \ .filter(Flight.is_listable(current_user)) date_ = query.one().date if not date_: date_ = datetime.utcnow() return date(date_)
def json(flight_id): flight = get_requested_record( Flight, flight_id, joinedload=(Flight.igc_file, Flight.model) ) current_user = User.get(request.user_id) if request.user_id else None if not flight.is_viewable(current_user): return jsonify(), 404 # Return HTTP Status code 304 if an upstream or browser cache already # contains the response and if the igc file did not change to reduce # latency and server load # This implementation is very basic. Sadly Flask (0.10.1) does not have # this feature last_modified = flight.time_modified.strftime("%a, %d %b %Y %H:%M:%S GMT") modified_since = request.headers.get("If-Modified-Since") etag = request.headers.get("If-None-Match") if (modified_since and modified_since == last_modified) or ( etag and etag == flight.igc_file.md5 ): return ("", 304) trace = _get_flight_path(flight, threshold=0.0001, max_points=10000) if not trace: abort(404) model = AircraftModelSchema().dump(flight.model).data or None resp = make_response( jsonify( points=trace["points"], barogram_t=trace["barogram_t"], barogram_h=trace["barogram_h"], enl=trace["enl"], contests=trace["contests"], elevations_t=trace["elevations_t"], elevations_h=trace["elevations_h"], sfid=flight.id, geoid=trace["geoid"], additional=dict( registration=flight.registration, competition_id=flight.competition_id, model=model, ), ) ) resp.headers["Last-Modified"] = last_modified resp.headers["Etag"] = flight.igc_file.md5 return resp
def change_pilot_post(form): pilot_id = form.pilot_id.data if form.pilot_id.data != 0 else None if g.flight.pilot_id != pilot_id: g.flight.pilot_id = pilot_id # update club if pilot changed if pilot_id: g.flight.club_id = User.get(pilot_id).club_id g.flight.co_pilot_id = form.co_pilot_id.data if form.co_pilot_id.data != 0 else None g.flight.time_modified = datetime.utcnow() db.session.commit() return redirect(url_for('.index'))
def add_comment(flight_id): flight = get_requested_record(Flight, flight_id) current_user = User.get(request.user_id) if not current_user: return jsonify(), 403 json = request.get_json() if json is None: return jsonify(error="invalid-request"), 400 try: data = FlightCommentSchema().load(json).data except ValidationError, e: return jsonify(error="validation-failed", fields=e.messages), 422
def add_comment(flight_id): flight = get_requested_record(Flight, flight_id) current_user = User.get(request.user_id) if not current_user: return jsonify(), 403 json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = FlightCommentSchema().load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422