def _group_by_driver(distances, trip_id): groups = {} for key in distances.keys(): groups[key] = {} participants = db_session().query(Participant).filter( Participant.trip_id == trip_id).all() cars = db_session().query(Car).filter( Car.participant_id == Participant.id).filter( Participant.trip_id == trip_id).all() available_seats = {} for car in cars: available_seats[car.participant_id] = car.available_seats for participant in participants: participant_dict = {} for key, value in distances.items(): participant_dict[ key] = math.inf if participant.id not in value else value[ participant.id] participant_dict = sorted(participant_dict.items(), key=lambda kv: kv[1]) __set_group(groups, participant_dict, available_seats, participant.id) return groups
def get(participant_id): try: participant = db_session().query(Participant).filter_by( id=participant_id).first() if participant: if participant.route_id: origin = participant.origin destination = participant.trip.destination route_path = participant.route.route way_points_array = [] for idx, stop in enumerate(route_path.split(',')): participant = db_session().query(Participant).filter_by( id=stop).first() if not idx: origin = participant.origin else: way_points_array.append( {'location': participant.origin}) response = dict(origin=origin, destination=destination, waypoints=way_points_array) return jsonify(error=False, response=response), 200 else: return jsonify( error=True, message='No route found for this participant.'), 400 else: return jsonify( error=True, message='No participant found with {} as id.'.format( participant_id)), 400 except Exception as e: log.error('Unexpected error in GET/route: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def edit(contact_id, name=None, last_name=None, image_url=None, address=None, phone_number=None, email=None): """ Edit a contact given its identifier and the new information. :param contact_id: Contact identifier. :param name: New contact name, if needed. :param last_name: Mew contact last name, if needed. :param image_url: New Image URL, if needed. :param address: New postal address, if needed. :param phone_number: New phone number, if needed. :param email: New email address, if needed. :return: True if the contact was edited successfully, False otherwise. """ contact = db_session().query(Contact).filter_by(id=contact_id).first() if contact: contact.name = contact.name if name is None else name contact.last_name = contact.last_name if last_name is None else last_name contact.image_url = contact.image_url if image_url is None else image_url contact.address = contact.address if address is None else address contact.phone_number = contact.phone_number if phone_number is None else phone_number contact.email = contact.email if email is None else email db_session().commit() return True else: return False
def post(): try: body = request.json required_parameters = [ 'title', 'description', 'destination', 'currency' ] if not all(x in body for x in required_parameters): return jsonify(error=True, message='{} are required parameters.'.format( required_parameters)), 400 trip = Trip(title=body['title'], description=body['description'], destination=body['destination'], currency=body['currency']) db_session().add(trip) db_session().commit() if trip.id: return jsonify(error=False, response=dict(trip_id=trip.id)), 200 else: return jsonify(error=True, message='Error while creating the new trip.'), 400 except Exception as e: log.error('Unexpected error in POST/trip: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def post(): body = request.json required_parameters = [ 'first_name', 'last_name', 'email', 'username', 'password' ] if not all(x in body for x in required_parameters): return response.build( error=True, error_message='All request body parameters are required.') user = db_session().query(User).filter_by( username=body['username']).first() if user: return response.build(error=True, error_message='The user already exists.') user = User(username=body['username'], first_name=body['first_name'], last_name=body['last_name'], email=body['email'], password=body['password']) db_session().add(user) db_session().commit() return response.build(error=False, response=user.username)
def playlist_get(participant_id): try: participant = db_session().query(Participant).filter_by( id=participant_id).first() if not participant: return jsonify( error=True, message='No participant found with {} as id.'.format( participant_id)), 400 if participant.route_id: playlist = songs.get_album([participant.music_genre]) else: genre_list = set() participants = db_session().query(Participant).filter_by( route_id=participant.route_id).all() for participant in participants: genre_list.add(participant.music_genre) playlist = songs.get_album(list(genre_list)) if playlist: return jsonify(error=False, response=playlist), 200 else: return jsonify(error=True, message='No playlist found.'), 400 except Exception as e: log.error('Unexpected error in GET/participant/playlist: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get(participant_id): try: participant = db_session().query(Participant).filter_by( id=participant_id).first() if participant: response = participant.serialize() if participant.route_id: car_mates = db_session().query(Participant).filter_by( route_id=participant.route_id).all() car_mates_name = [] for mate in car_mates: car_mates_name.append(mate.name) car = db_session().query(Car).filter( Car.participant_id == Participant.id).filter( Participant.route_id == participant.route_id).first() response['car'] = dict(passengers=car_mates_name, car_name=car.name) return jsonify(error=False, response=response), 200 else: return jsonify( error=True, message='No participant found with {} as id.'.format( participant_id)), 400 except Exception as e: log.error('Unexpected error in GET/participant: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get(user_id): try: user = db_session().query(User).filter_by(id=user_id).first() if user: user_kilometers = 0 trip_list = db_session().query(Trip).filter_by(user_id=user_id).all() for trip in trip_list: start_kilometers = trip.first_odometer_in_meters / 1000.0 end_kilometers = trip.last_odometer_in_meters / 1000.0 user_kilometers += (end_kilometers - start_kilometers) achievement_list = db_session().query(AchievementUser).filter_by(user_id=user_id).all() achievement_list = [achievement_user.achievement.serialize() for achievement_user in achievement_list] response = { 'user': user.serialize(), 'kilometers': round(user_kilometers, 2), 'trips': len(trip_list), 'average': round(user_kilometers / len(trip_list), 2), 'achievements': achievement_list } return jsonify(error=False, response=response), 200 else: return jsonify(error=True, message='No user found with {} as id.'.format(user_id)), 400 except Exception as e: log.error('Unexpected error in GET/statistics: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def _compute_distances(trip_id): drivers = db_session().query(Participant).filter( Participant.trip_id == trip_id).filter( Participant.id == Car.participant_id).all() passengers = db_session().query(Participant).filter( Participant.trip_id == trip_id).filter( not_(Participant.id.in_([driver.id for driver in drivers]))).all() distances = {} for driver in drivers: distances[driver.id] = {driver.id: 0} origin_driver = driver.origin for passenger in passengers: origin_passenger = passenger.origin simple_route = here.request_simple_route(origin_driver, origin_passenger) if simple_route: d = simple_route.get('response', {}).get('route', [{}])[0].get( 'summary', {}).get('travelTime', -1) distances[driver.id][passenger.id] = d log.info( 'Distance time (sec) between drive {} and passenger {}: {}' .format(driver.id, passenger.id, d)) else: distances[driver.id][passenger.id] = -1 return distances
def count(): try: user_query = db_session().query(User) user_query_count = user_query.statement.with_only_columns( [func.count()]).order_by(None) user_count = db_session().execute(user_query_count).scalar() return jsonify(error=False, response=user_count), 200 except Exception as e: log.error('Unexpected error in GET/user/count: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def post(): try: body = request.json required_parameters = ['user_id', 'tag_name'] if not all(x in body for x in required_parameters): return jsonify( error=True, message='All request body parameters are required.'), 400 user = db_session().query(User).filter_by(id=body['user_id']).first() if not user: return jsonify(error=True, message='No user found with {} as id.'.format( body['user_id'])), 400 tag = db_session().query(Tag).filter_by(name=body['tag_name']).first() if not tag: return jsonify(error=True, message='No tag found with {} as name.'.format( body['tag_name'])), 400 user_tag = db_session().query(UserToTag).filter_by( user_id=body['user_id'], tag_id=tag.id).first() if not user_tag: user_tag = UserToTag(user_id=body['user_id'], tag_id=tag.id) db_session().add(user_tag) db_session().flush() db_session().commit() return jsonify(error=False, response=user_tag.serialize()), 200 except Exception as e: log.error('Unexpected error in POST/user/skills: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def make(): user_list = db_session().query(User).all() for user in tqdm.tqdm(user_list, total=len(user_list)): user_friends = db_session().query(User)\ .filter(User.id != user.id)\ .order_by(func.random())\ .limit(args.friends_per_user)\ .all() for friend in user_friends: create_friendship(user, friend) db_session().commit()
def add_achievement(user_id, achievement_id, total_points): achievement_exists = db_session().query(AchievementUser)\ .filter_by(achievement_id=achievement_id, user_id=user_id).first() if not achievement_exists: achievement_user = AchievementUser( achievement_id=achievement_id, user_id=user_id ) db_session().add(achievement_user) db_session().flush() total_points[0] += achievement_user.achievement.points
def delete(contact_id): """ Delete a contact given its identifier. :param contact_id: Contact identifier. :return: True if the contact was deleted successfully, False otherwise. """ contact = db_session().query(Contact).filter_by(id=contact_id).first() if contact: db_session().delete(contact) db_session().commit() return True else: return False
def create_friendship(user, friend): friend_exists = db_session().query(Friend).filter_by( user_id_one=user.id, user_id_two=friend.id).first() if not friend_exists: friend_one = Friend(user_id_one=user.id, user_id_two=friend.id) db_session().add(friend_one) db_session().flush() friend_two = Friend(user_id_one=friend.id, user_id_two=user.id) db_session().add(friend_two) db_session().flush()
def get(user_id): try: user = db_session().query(User).filter_by(id=user_id).first() if user: trip_list = db_session().query(Trip).filter_by( user_id=user_id).all() response = [trip.serialize() for trip in trip_list] return jsonify(error=False, response=response), 200 else: return jsonify( error=True, message='No user found with {} as id.'.format(user_id)), 400 except Exception as e: log.error('Unexpected error in GET/trip: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def post(): try: body = request.json required_parameters = ['page_html', 'user_id'] if not all(x in body for x in required_parameters): return jsonify(error=True, message='All request body parameters are required.'), 400 user = db_session().query(User).filter_by(id=body['user_id']).first() if not user: return jsonify(error=True, message='No user found with {} as id.'.format(body['user_id'])), 400 soup = BeautifulSoup(body['page_html'], 'html.parser') tag_list = list(set([a.text for a in soup.find_all('a', {'class': 'post-tag'})])) skills = {} company_mates = db_session().query(User).filter_by(company=user.company).all() for mate in company_mates: if mate.id != user.id: mate_skills = db_session().query(UserToTag).filter_by(user_id=mate.id).all() mate_skills = [skill.tag.name for skill in mate_skills] skills[mate.id] = [tag for tag in tag_list if tag in mate_skills] maximum = 0 maximum_mate = None maximum_list = None for mate, skill_list in skills.items(): if len(skill_list) > maximum: maximum = len(skill_list) maximum_mate = mate maximum_list = skill_list if maximum_mate and maximum_list: mate = db_session().query(User).filter_by(id=maximum_mate).first() if len(maximum_list) == 1: maximum_list_str = maximum_list[0] else: maximum_list_str = ', '.join(maximum_list[:-1]) maximum_list_str += ' and {}'.format(maximum_list[-1]) nexmo_message = 'Hey {}! Your friend {} is having some troubles with {}. Maybe you can give a hand!'\ .format(mate.full_name, user.full_name, maximum_list_str) nexmo.send_sms(NEXMO_SENDER, mate.phone_number, nexmo_message) response = dict(user=mate.serialize(), skills=maximum_list) else: response = dict(user=None, skills=[]) return jsonify(error=False, response=response), 200 except Exception as e: log.error('Unexpected error in POST/help: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def login_post(): try: body = request.json required_parameters = ['email', 'password'] if not all(x in body for x in required_parameters): return jsonify(error=True, message='{} are required parameters.'.format( required_parameters)), 400 username, domain = body['email'].lower().split('@') company = domain.split('.')[0] user = db_session().query(User).filter_by(username=username, company=company).first() if user: password = user.password if password == body['password'].lower(): return jsonify(error=False, response=user.id), 200 else: return jsonify(error=True, message='The password is not correct'), 400 else: return jsonify(error=True, message='No user found with {} as email.'.format( body['email'])), 400 except Exception as e: log.error('Unexpected error in POST/user/login: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def delete(): try: body = request.json required_parameters = ['user_id', 'tag_id'] if not all(x in body for x in required_parameters): return jsonify( error=True, message='All request body parameters are required.'), 400 user = db_session().query(User).filter_by(id=body['user_id']).first() if not user: return jsonify(error=True, message='No user found with {} as id.'.format( body['user_id'])), 400 tag = db_session().query(Tag).filter_by(id=body['tag_id']).first() if not tag: return jsonify(error=True, message='No tag found with {} as id.'.format( body['tag_id'])), 400 user_tag = db_session().query(UserToTag).filter_by( user_id=body['user_id'], tag_id=body['tag_id']).first() if user_tag: db_session().delete(user_tag) db_session().commit() return jsonify(error=False, response='Deleted'), 200 else: return jsonify( error=True, message='No skill found for {} as user id, and {} as skill_id'. format(body['user_id'], body['tag_id'])), 400 except Exception as e: log.error('Unexpected error in POST/user/skills: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get(prefix_tag): try: tags = db_session().query(Tag).filter( Tag.name.ilike(prefix_tag + '%')).limit(10).all() return jsonify(error=False, response=[tag.serialize() for tag in tags]), 200 except Exception as e: log.error('Unexpected error in GET/tag: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get(car_id): try: car = db_session().query(Car).filter_by(id=car_id).first() if car: return jsonify(error=False, response=car.serialize()), 200 else: return jsonify(error=True, message='No car found with {} as id.'.format(car_id)), 400 except Exception as e: log.error('Unexpected error in GET/car: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get_all(): """ Get all contacts. :return: List of contacts serialized. """ contact_list = db_session().query(Contact).order_by(Contact.id).all() if contact_list: return [contact.serialize() for contact in contact_list] else: return []
def get_contact(contact_id): """ Get contact given its identifier. :param contact_id: Contact identifier. :return: Contact serialized. """ contact = db_session().query(Contact).filter_by(id=contact_id).first() if contact: return contact.serialize() else: return None
def random(): try: user = db_session().query(User).order_by(func.random()).first() if user: response = user.id return jsonify(error=False, response=response), 200 else: return jsonify(error=True, message='No users.'), 400 except Exception as e: log.error('Unexpected error in GET/user/random: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get(user_id): try: user = db_session().query(User).filter_by(id=user_id).first() if user: friend_list = db_session().query(Friend).filter_by( user_id_one=user_id).all() friend_list = [ friend.user_two.serialize() for friend in friend_list ] response = sorted(friend_list, key=lambda k: k['points'], reverse=True) return jsonify(error=False, response=response), 200 else: return jsonify( error=True, message='No user found with {} as id.'.format(user_id)), 400 except Exception as e: log.error('Unexpected error in GET/friend: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def trip_get(trip_id): try: participants = db_session().query(Participant).filter_by( trip_id=trip_id).all() return jsonify( error=False, response=[participant.serialize() for participant in participants]), 200 except Exception as e: log.error('Unexpected error in GET/participant/trip: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def add(name, last_name, image_url, address, phone_number, email): """ Add a contact given all its information. :param name: Contact name. :param last_name: Contact last name. :param image_url: Image URL. :param address: Postal address. :param phone_number: Phone number. :param email: Email address. :return: Identifier of the contact added. """ contact = Contact(name=name, last_name=last_name, image_url=image_url, address=address, phone_number=phone_number, email=email) db_session().add(contact) db_session().commit() contact_id = contact.id return contact_id
def get(user_id): try: user_skills = db_session().query(UserToTag).filter_by( user_id=user_id).all() return jsonify(error=False, response=[ user_skill.tag.serialize() for user_skill in user_skills ]), 200 except Exception as e: log.error('Unexpected error in GET/user/skills: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def get(trip_id): try: trip = db_session().query(Trip).filter_by(id=trip_id).first() if trip: return jsonify(error=False, response=trip.serialize()), 200 else: return jsonify( error=True, message='No trip found with {} as id.'.format(trip_id)), 400 except Exception as e: log.error('Unexpected error in GET/trip: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400
def search(prefix_user): try: prefix_user = str(prefix_user) users = db_session().query(User)\ .filter(cast(User.id, String).ilike(prefix_user + '%'))\ .order_by(User.id)\ .limit(10)\ .all() return jsonify(error=False, response=[user.serialize() for user in users]), 200 except Exception as e: log.error('Unexpected error in GET/user/search: {}'.format(e)) return jsonify(error=True, message='Unexpected error.'), 400