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 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 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 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 test_deserialization_fails_for_invalid_website(): with pytest.raises(ValidationError) as e: ClubSchema(partial=True).load(dict(website="foo")) errors = e.value.messages assert "website" in errors assert "Not a valid URL." in errors.get("website")
def test_deserialization_fails_for_empty_name(): with pytest.raises(ValidationError) as e: ClubSchema(only=('name',)).load(dict(name='')) errors = e.value.messages assert 'name' in errors assert 'Must not be empty.' in errors.get('name')
def _listInfo(): # List clubs with info data = _handle_request_flight_user_byClub() club_schema = ClubSchema(only=("email", "id", "name", "website")) club_info = [] if len(data["result"].all())>0: for club, flights, users, rank in data["result"]: row = {"club": club_schema.dump(club).data, "flights": flights, "users": users, "email": club.email_address, "website": club.website } club_info.append(row) return jsonify(club_info=club_info, total=g.paginators["result"].count)
def test_deserialization_fails_for_empty_name(): with pytest.raises(ValidationError) as e: ClubSchema(only=("name", )).load(dict(name="")) errors = e.value.messages assert "name" in errors assert "Must not be empty." in errors.get("name")
def clubs(): data = _handle_request(Club, "club_id") club_schema = ClubSchema(only=("id", "name")) json = [] for club, count, total, rank in data["result"]: row = { "rank": rank, "flights": count, "points": total, "club": club_schema.dump(club).data, } json.append(row) return jsonify(ranking=json, total=g.paginators["result"].count)
def _listClubsByName(): clubs = Club.query().order_by(func.lower(Club.name)) name_filter = request.args.get("name") if name_filter: clubs = clubs.filter_by(name=name_filter) return jsonify(clubs=ClubSchema(only=("id", "name")).dump(clubs, many=True).data)
def clubs(): data = _handle_request_rank(Club, "club_id") club_schema = ClubSchema(only=("id", "name")) json = [] for club, count, total, rank in data["result"]: row = { "rank": rank, "flights": count, "points": total, "club": club_schema.dump(club).data, } json.append(row) return jsonify(ranking=json, total=g.paginators["result"].count)
def index(): if 'application/json' not in request.headers.get('Accept', ''): return render_template('ember-page.jinja', active_page='settings') json = ClubSchema().dump(g.club).data json['isWritable'] = g.club.is_writable(g.current_user) return jsonify(**json)
def clubs(): data = _handle_request(Club, 'club_id') club_schema = ClubSchema(only=('id', 'name')) json = [] for club, count, total, rank in data['result']: row = { 'rank': rank, 'flights': count, 'points': total, 'club': club_schema.dump(club).data, } json.append(row) return jsonify(ranking=json, total=g.paginators['result'].count)
def list(): clubs = Club.query().order_by(func.lower(Club.name)) name_filter = request.args.get('name') if name_filter: clubs = clubs.filter_by(name=name_filter) return jsonify(clubs=ClubSchema(only=('id', 'name')).dump(clubs, many=True).data)
def create_club(): 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 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 edit_post(): json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = ClubSchema(partial=True).load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def update(club_id): club = get_requested_record(Club, club_id) json = request.get_json() if json is None: return jsonify(error='invalid-request'), 400 try: data = ClubSchema(partial=True).load(json).data except ValidationError, e: return jsonify(error='validation-failed', fields=e.messages), 422
def clubs(): data = _handle_request(Club, 'club_id') if 'application/json' in request.headers.get('Accept', ''): club_schema = ClubSchema(only=('id', 'name')) json = [] for club, count, total, rank in data['result']: row = { 'rank': rank, 'flights': count, 'points': total, 'club': club_schema.dump(club).data, } json.append(row) return jsonify(ranking=json, total=g.paginators['result'].count) return render_template('ember-page.jinja', active_page='ranking')
def index(): if 'application/json' not in request.headers.get('Accept', ''): return render_template('ember-page.jinja', active_page='settings') clubs = Club.query().order_by(func.lower(Club.name)) name_filter = request.args.get('name') if name_filter: clubs = clubs.filter_by(name=name_filter) return jsonify(clubs=ClubSchema(only=('id', 'name')).dump(clubs, many=True).data)
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 update(club_id): '''For editing club?''' 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") if "email_address" in data: club.email_address = data.get("email_address") 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, e: return jsonify(error='validation-failed', fields=e.messages), 422
def _create_list( date=None, pilot=None, club=None, airport=None, pinned=None, filter=None, default_sorting_column="score", default_sorting_order="desc", ): pilot_alias = aliased(User, name="pilot") owner_alias = aliased(User, name="owner") subq = ( db.session.query(FlightComment.flight_id, func.count("*").label("count")) .group_by(FlightComment.flight_id) .subquery() ) current_user = User.get(request.user_id) if request.user_id else None flights = ( db.session.query(Flight, subq.c.count) .filter(Flight.is_listable(current_user)) .join(Flight.igc_file) .options(contains_eager(Flight.igc_file)) .join(owner_alias, IGCFile.owner) .options(contains_eager(Flight.igc_file, IGCFile.owner, alias=owner_alias)) .outerjoin(pilot_alias, Flight.pilot) .options(contains_eager(Flight.pilot, alias=pilot_alias)) .options(joinedload(Flight.co_pilot)) .outerjoin(Flight.club) .options(contains_eager(Flight.club)) .outerjoin(Flight.takeoff_airport) .options(contains_eager(Flight.takeoff_airport)) .outerjoin(Flight.model) .options(contains_eager(Flight.model)) .outerjoin((subq, Flight.comments)) ) if date: flights = flights.filter(Flight.date_local == date) if pilot: flights = flights.filter(or_(Flight.pilot == pilot, Flight.co_pilot == pilot)) if club: flights = flights.filter(Flight.club == club) if airport: flights = flights.filter(Flight.takeoff_airport == airport) if pinned: flights = flights.filter(Flight.id.in_(pinned)) if filter is not None: flights = flights.filter(filter) valid_columns = { "date": getattr(Flight, "date_local"), "score": getattr(Flight, "index_score"), "pilot": getattr(pilot_alias, "name"), "distance": getattr(Flight, "olc_classic_distance"), "airport": getattr(Airport, "name"), "club": getattr(Club, "name"), "aircraft": getattr(AircraftModel, "name"), "time": getattr(Flight, "takeoff_time"), } flights_count = flights.count() flights = Sorter.sort( flights, "flights", default_sorting_column, valid_columns=valid_columns, default_order=default_sorting_order ) flights = flights.order_by(Flight.index_score.desc()) flights = Pager.paginate( flights, "flights", items_per_page=int(current_app.config.get("SKYLINES_LISTS_DISPLAY_LENGTH", 50)) ) flight_schema = FlightSchema() flights_json = [] for f, num_comments in flights: flight = flight_schema.dump(f).data flight["private"] = not f.is_rankable() flight["numComments"] = num_comments flights_json.append(flight) json = dict(flights=flights_json, count=flights_count) if date: json["date"] = date.isoformat() if pilot: user_schema = UserSchema(only=("id", "name")) json["pilot"] = user_schema.dump(pilot).data if club: club_schema = ClubSchema(only=("id", "name")) json["club"] = club_schema.dump(club).data if airport: airport_schema = AirportSchema(only=("id", "name", "countryCode")) json["airport"] = airport_schema.dump(airport).data return jsonify(json)
def test_deserialization_passes_for_valid_name(): data = ClubSchema(only=('name',)).load(dict(name=' foo ')).data assert data['name'] == 'foo'
def test_serialization_passes_for_invalid_website(): data = ClubSchema().dump(dict(website='foobar')).data assert data['website'] == 'foobar'
def _create_list(date=None, pilot=None, club=None, airport=None, pinned=None, filter=None, default_sorting_column='score', default_sorting_order='desc'): pilot_alias = aliased(User, name='pilot') owner_alias = aliased(User, name='owner') subq = db.session \ .query(FlightComment.flight_id, func.count('*').label('count')) \ .group_by(FlightComment.flight_id).subquery() current_user = User.get(request.user_id) if request.user_id else None flights = db.session.query(Flight, subq.c.count) \ .filter(Flight.is_listable(current_user)) \ .join(Flight.igc_file) \ .options(contains_eager(Flight.igc_file)) \ .join(owner_alias, IGCFile.owner) \ .options(contains_eager(Flight.igc_file, IGCFile.owner, alias=owner_alias)) \ .outerjoin(pilot_alias, Flight.pilot) \ .options(contains_eager(Flight.pilot, alias=pilot_alias)) \ .options(joinedload(Flight.co_pilot)) \ .outerjoin(Flight.club) \ .options(contains_eager(Flight.club)) \ .outerjoin(Flight.takeoff_airport) \ .options(contains_eager(Flight.takeoff_airport)) \ .outerjoin(Flight.model) \ .options(contains_eager(Flight.model)) \ .outerjoin((subq, Flight.comments)) if date: flights = flights.filter(Flight.date_local == date) if pilot: flights = flights.filter( or_(Flight.pilot == pilot, Flight.co_pilot == pilot)) if club: flights = flights.filter(Flight.club == club) if airport: flights = flights.filter(Flight.takeoff_airport == airport) if pinned: flights = flights.filter(Flight.id.in_(pinned)) if filter is not None: flights = flights.filter(filter) valid_columns = { 'date': getattr(Flight, 'date_local'), 'score': getattr(Flight, 'index_score'), 'pilot': getattr(pilot_alias, 'name'), 'distance': getattr(Flight, 'olc_classic_distance'), 'airport': getattr(Airport, 'name'), 'club': getattr(Club, 'name'), 'aircraft': getattr(AircraftModel, 'name'), 'time': getattr(Flight, 'takeoff_time'), } flights_count = flights.count() flights = Sorter.sort(flights, 'flights', default_sorting_column, valid_columns=valid_columns, default_order=default_sorting_order) flights = flights.order_by(Flight.index_score.desc()) flights = Pager.paginate(flights, 'flights', items_per_page=int( current_app.config.get( 'SKYLINES_LISTS_DISPLAY_LENGTH', 50))) flight_schema = FlightSchema() flights_json = [] for f, num_comments in flights: flight = flight_schema.dump(f).data flight['private'] = not f.is_rankable() flight['numComments'] = num_comments flights_json.append(flight) json = dict(flights=flights_json, count=flights_count) if date: json['date'] = date.isoformat() if pilot: user_schema = UserSchema(only=('id', 'name')) json['pilot'] = user_schema.dump(pilot).data if club: club_schema = ClubSchema(only=('id', 'name')) json['club'] = club_schema.dump(club).data if airport: airport_schema = AirportSchema(only=('id', 'name', 'countryCode')) json['airport'] = airport_schema.dump(airport).data return jsonify(json)
def test_deserialization_passes_for_valid_name(): data = ClubSchema(only=("name", )).load(dict(name=" foo ")).data assert data["name"] == "foo"
def test_deserialization_passes_for_valid_website(): data = ClubSchema(partial=True).load( dict(website="https://skylinescondor.com")).data assert data["website"] == "https://skylinescondor.com"
def test_deserialization_passes_for_empty_website(): data = ClubSchema(partial=True).load(dict(website="")).data assert data["website"] == ""
def test_deserialization_passes_for_null_website(): data = ClubSchema(partial=True).load(dict(website=None)).data assert data["website"] is None
def _create_list( date=None, pilot=None, club=None, airport=None, pinned=None, filter=None, default_sorting_column="score", default_sorting_order="desc", ): pilot_alias = aliased(User, name="pilot") owner_alias = aliased(User, name="owner") subq = (db.session.query(FlightComment.flight_id, func.count("*").label("count")).group_by( FlightComment.flight_id).subquery()) current_user = User.get(request.user_id) if request.user_id else None flights = (db.session.query(Flight, subq.c.count).filter( Flight.is_listable(current_user)).join(Flight.igc_file).options( contains_eager(Flight.igc_file)).join( owner_alias, IGCFile.owner).options( contains_eager(Flight.igc_file, IGCFile.owner, alias=owner_alias)).outerjoin( pilot_alias, Flight.pilot).options( contains_eager(Flight.pilot, alias=pilot_alias)). options(joinedload(Flight.co_pilot)).outerjoin( Flight.club).options(contains_eager(Flight.club)).outerjoin( Flight.takeoff_airport).options( contains_eager(Flight.takeoff_airport)).outerjoin( Flight.model).options( contains_eager(Flight.model)).outerjoin( (subq, Flight.comments))) if date: flights = flights.filter(Flight.date_local == date) if pilot: flights = flights.filter( or_(Flight.pilot == pilot, Flight.co_pilot == pilot)) if club: flights = flights.filter(Flight.club == club) if airport: flights = flights.filter(Flight.takeoff_airport == airport) if pinned: flights = flights.filter(Flight.id.in_(pinned)) if filter is not None: flights = flights.filter(filter) valid_columns = { "date": getattr(Flight, "date_local"), "score": getattr(Flight, "index_score"), "pilot": getattr(pilot_alias, "name"), "distance": getattr(Flight, "olc_classic_distance"), "airport": getattr(Airport, "name"), "club": getattr(Club, "name"), "aircraft": getattr(AircraftModel, "name"), "time": getattr(Flight, "takeoff_time"), } flights_count = flights.count() flights = Sorter.sort( flights, "flights", default_sorting_column, valid_columns=valid_columns, default_order=default_sorting_order, ) flights = flights.order_by(Flight.index_score.desc()) flights = Pager.paginate( flights, "flights", items_per_page=int( current_app.config.get("SKYLINES_LISTS_DISPLAY_LENGTH", 50)), ) flight_schema = FlightSchema() flights_json = [] for f, num_comments in flights: flight = flight_schema.dump(f).data flight["private"] = not f.is_rankable() flight["numComments"] = num_comments flights_json.append(flight) json = dict(flights=flights_json, count=flights_count) if date: json["date"] = date.isoformat() if pilot: user_schema = UserSchema(only=("id", "name")) json["pilot"] = user_schema.dump(pilot).data if club: club_schema = ClubSchema(only=("id", "name")) json["club"] = club_schema.dump(club).data if airport: airport_schema = AirportSchema(only=("id", "name", "countryCode")) json["airport"] = airport_schema.dump(airport).data return jsonify(json)
def _create_list(date=None, pilot=None, club=None, airport=None, pinned=None, filter=None, default_sorting_column='score', default_sorting_order='desc'): pilot_alias = aliased(User, name='pilot') owner_alias = aliased(User, name='owner') subq = db.session \ .query(FlightComment.flight_id, func.count('*').label('count')) \ .group_by(FlightComment.flight_id).subquery() current_user = User.get(request.user_id) if request.user_id else None flights = db.session.query(Flight, subq.c.count) \ .filter(Flight.is_listable(current_user)) \ .join(Flight.igc_file) \ .options(contains_eager(Flight.igc_file)) \ .join(owner_alias, IGCFile.owner) \ .options(contains_eager(Flight.igc_file, IGCFile.owner, alias=owner_alias)) \ .outerjoin(pilot_alias, Flight.pilot) \ .options(contains_eager(Flight.pilot, alias=pilot_alias)) \ .options(joinedload(Flight.co_pilot)) \ .outerjoin(Flight.club) \ .options(contains_eager(Flight.club)) \ .outerjoin(Flight.takeoff_airport) \ .options(contains_eager(Flight.takeoff_airport)) \ .outerjoin(Flight.model) \ .options(contains_eager(Flight.model)) \ .outerjoin((subq, Flight.comments)) if date: flights = flights.filter(Flight.date_local == date) if pilot: flights = flights.filter(or_(Flight.pilot == pilot, Flight.co_pilot == pilot)) if club: flights = flights.filter(Flight.club == club) if airport: flights = flights.filter(Flight.takeoff_airport == airport) if pinned: flights = flights.filter(Flight.id.in_(pinned)) if filter is not None: flights = flights.filter(filter) valid_columns = { 'date': getattr(Flight, 'date_local'), 'score': getattr(Flight, 'index_score'), 'pilot': getattr(pilot_alias, 'name'), 'distance': getattr(Flight, 'olc_classic_distance'), 'airport': getattr(Airport, 'name'), 'club': getattr(Club, 'name'), 'aircraft': getattr(AircraftModel, 'name'), 'time': getattr(Flight, 'takeoff_time'), } flights_count = flights.count() flights = Sorter.sort(flights, 'flights', default_sorting_column, valid_columns=valid_columns, default_order=default_sorting_order) flights = flights.order_by(Flight.index_score.desc()) flights = Pager.paginate(flights, 'flights', items_per_page=int(current_app.config.get('SKYLINES_LISTS_DISPLAY_LENGTH', 50))) flight_schema = FlightSchema() flights_json = [] for f, num_comments in flights: flight = flight_schema.dump(f).data flight['private'] = not f.is_rankable() flight['numComments'] = num_comments flights_json.append(flight) json = dict(flights=flights_json, count=flights_count) if date: json['date'] = date.isoformat() if pilot: user_schema = UserSchema(only=('id', 'name')) json['pilot'] = user_schema.dump(pilot).data if club: club_schema = ClubSchema(only=('id', 'name')) json['club'] = club_schema.dump(club).data if airport: airport_schema = AirportSchema(only=('id', 'name', 'countryCode')) json['airport'] = airport_schema.dump(airport).data return jsonify(json)
def test_serialization_passes_for_invalid_website(): data = ClubSchema().dump(dict(website="foobar")).data assert data["website"] == "foobar"
def test_deserialization_passes_for_valid_website(): data = ClubSchema(partial=True).load( dict(website='https://skylines.aero')).data assert data['website'] == 'https://skylines.aero'