示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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)
示例#6
0
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
示例#7
0
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
示例#8
0
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
示例#9
0
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
示例#10
0
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
示例#11
0
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
示例#12
0
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
示例#14
0
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
示例#15
0
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()
示例#16
0
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
示例#17
0
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
示例#18
0
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
示例#19
0
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
示例#20
0
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
示例#21
0
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
示例#22
0
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 []
示例#23
0
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
示例#24
0
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
示例#25
0
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
示例#26
0
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
示例#27
0
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
示例#28
0
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
示例#29
0
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
示例#30
0
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