def add_friends(): # log usage ulog('add_friends -> page access') users = User.query.all() users = filter(lambda u: u.user_id != current_user.user_id, users) # update friends if form submitted if request.method == 'POST': friend_ids = request.form.getlist('friend_checkbox') for friend_id in friend_ids: friend = User.query.get(int(friend_id)) ulog('add_friends -> user {} added friend {}'.format( current_user, friend)) print('adding friend ', friend_id) current_user.add_friend(friend) # TODO: allow unfriending people? db.session.commit() # redirect to list return redirect(url_for('list')) return render_template( 'add_friends.html', users=users, current_friends=current_user.friends if current_user.friends else [])
def login(): form = LoginForm() if form.validate_on_submit(): # if user is already logged in if current_user.is_authenticated and current_user.username == form.username.data: print( 'User {} is already logged in. Navigating to destinations list' .format(current_user)) return redirect(url_for('list')) # log in user, if they exist user = User.query.filter_by(username=form.username.data).first() if user is None: msg = 'Could not find user with username {}'.format( form.username.data) print(msg) flash(msg) return redirect(url_for('login')) login_user(user, remember=True) # log usage ulog('login -> login by user {}'.format(user)) # redirect user either to list or to previous page next_page = request.args.get('next') if not next_page or url_parse(next_page).netloc != '': next_page = url_for('list') return redirect(next_page) return render_template('login.html', form=form)
def user(username): # log usage ulog('user -> page access for username {}'.format(username)) user = User.query.filter_by(username=username).first_or_404() destinations = sorted(user.destinations, key=attrgetter('num_visits'), reverse=True) num_friends = len(user.friends) return render_template('user.html', user=user, destinations=destinations, num_friends=num_friends)
def delete_destination(): destination_id = int(request.form['destination_id']) dest = Destination.query.get(destination_id) print('Deleting', dest) # delete any associations destination is in for assoc in dest.users: db.session.delete(assoc) # delete destination itself db.session.delete(dest) db.session.commit() ulog('delete_destination -> user {} deleting destination {}'.format( current_user.username, dest)) return {}
def signup(): form = SignupForm() if form.validate_on_submit(): # TODO: if user already exists, send them straight to list print('Attempting to sign in user with information: ', form.username.data, form.email.data, form.name.data) user = User.query.filter_by(username=form.username.data).first() if user is not None: msg = 'There is already an account with the username {}'.format( form.username.data) print(msg) flash(msg) return redirect(url_for('signup')) user = User.query.filter_by(email=form.email.data).first() if user is not None: msg = 'There is already an account with the email {}'.format( form.email.data) print(msg) flash(msg) return redirect(url_for('signup')) # register user in database new_user = User(username=form.username.data, name=form.name.data, email=form.email.data, friends=[], destinations=[]) db.session.add(new_user) print('registering user: {}'.format(new_user)) db.session.commit() # log in new user login_user(new_user, remember=True) ulog('signup -> new signup by user {}'.format(new_user)) # notify admins that new user signed up # NOTE: NOT WORKING # send_email('New User Signup', app.config['ADMIN_EMAILS'][0], ['*****@*****.**'], '', '<h2>New User Signup</h2>') # after user signs up, send them to page to select friends return redirect(url_for('add_friends')) return render_template('signup.html', form=form)
def list(): # log usage ulog('list -> page access') form = SearchForm() page_number = request.args.get('page', 1, type=int) region = request.args.get('region', current_user.region) # update user's region if they selected a different one if region != current_user.region: current_user.region = region db.session.commit() if form.validate_on_submit(): # user has searched for destination search_term = '%{}%'.format(form.dq.data) print(search_term) # get destinations by search_term destinations_paginated = Destination.query.filter( Destination.name.like(search_term)).order_by( Destination.num_visits.desc()).order_by( Destination.destination_id).paginate( page_number, app.config['DESTINATIONS_PER_PAGE'], False) print(destinations_paginated) else: # user has accessed page normally # get destinations by region destinations_paginated = Destination.query.filter_by( region=region).order_by(Destination.num_visits.desc()).order_by( Destination.destination_id).paginate( page_number, app.config['DESTINATIONS_PER_PAGE'], False) # create next and previous URLs for pagination next_url = url_for('list', page=destinations_paginated.next_num, region=region) \ if destinations_paginated.has_next else None prev_url = url_for('list', page=destinations_paginated.prev_num, region=region) \ if destinations_paginated.has_prev else None # compile visit numbers for each destination destinations = destinations_paginated.items context = [] for d in destinations: tmp = { 'num_visits_by_current_user': 0, 'friends_visited': [], 'num_visits_by_friends': 0 } for assoc in d.users: if assoc.user.user_id == current_user.user_id: tmp['num_visits_by_current_user'] = assoc.num_visits if assoc.user in current_user.friends: tmp['friends_visited'].append(assoc.user) tmp['num_visits_by_friends'] += assoc.num_visits context.append(tmp) return render_template('list.html', destinations=enumerate(destinations), context=context, region=region, current_user=current_user, next_url=next_url, prev_url=prev_url, page_number=page_number, num_dests=app.config['DESTINATIONS_PER_PAGE'], form=form, ADMINS=app.config['ADMINS'])
def internal_error(error): ulog('500 -> encounted by {}'.format(current_user)) db.session.rollback() return render_template('500.html'), 500