def competition_leaderboard(event_name): """Landing page for the competition leaderboard for all users. Parameters ---------- event_name : str The event name. """ event = get_event(db.session, event_name) if not is_accessible_event(db.session, event_name, flask_login.current_user.name): return redirect_to_user('{}: no event named "{}"'.format( flask_login.current_user.firstname, event_name)) if app.config['TRACK_USER_INTERACTION']: add_user_interaction(db.session, interaction='looking at leaderboard', user=flask_login.current_user, event=event) admin = is_admin(db.session, event_name, flask_login.current_user.name) approved = is_user_signed_up(db.session, event_name, flask_login.current_user.name) asked = approved leaderboard_html = event.public_competition_leaderboard_html leaderboard_kwargs = dict(leaderboard=leaderboard_html, leaderboard_title='Leaderboard', sorting_column_index=0, sorting_direction='asc', event=event, admin=admin, asked=asked, approved=approved) return render_template('leaderboard.html', **leaderboard_kwargs)
def user_event(event_name): """Landing page for a given event. Parameters ---------- event_name : str The event name. """ if flask_login.current_user.access_level == 'asked': msg = 'Your account has not been approved yet by the administrator' logger.error(msg) return redirect_to_user(msg) if not is_accessible_event(db.session, event_name, flask_login.current_user.name): return redirect_to_user('{}: no event named "{}"'.format( flask_login.current_user.firstname, event_name)) event = get_event(db.session, event_name) if event: if app.config['TRACK_USER_INTERACTION']: add_user_interaction(db.session, interaction='looking at event', event=event, user=flask_login.current_user) admin = is_admin(db.session, event_name, flask_login.current_user.name) approved = is_user_signed_up(db.session, event_name, flask_login.current_user.name) asked = is_user_sign_up_requested(db.session, event_name, flask_login.current_user.name) return render_template('event.html', event=event, admin=admin, approved=approved, asked=asked) return redirect_to_user('Event {} does not exist.'.format(event_name), is_error=True)
def dashboard_submissions(event_name): """Show information about all submissions for a given event. Parameters ---------- event_name : str The name of the event. """ if not is_admin(db.session, event_name, flask_login.current_user.name): return redirect_to_user( 'Sorry {}, you do not have admin rights' .format(flask_login.current_user.firstname), is_error=True ) event = get_event(db.session, event_name) # Get dates and number of submissions submissions = \ (Submission.query .filter(Event.name == event.name) .filter(Event.id == EventTeam.event_id) .filter(EventTeam.id == Submission.event_team_id) .order_by(Submission.submission_timestamp) .all()) submissions = [sub for sub in submissions if sub.is_not_sandbox] timestamp_submissions = [ sub.submission_timestamp.strftime('%Y-%m-%d %H:%M:%S') for sub in submissions] name_submissions = [sub.name for sub in submissions] cumulated_submissions = list(range(1, 1 + len(submissions))) training_sec = [ ( sub.training_timestamp - sub.submission_timestamp ).total_seconds() / 60. if sub.training_timestamp is not None else 0 for sub in submissions ] dashboard_kwargs = {'event': event, 'timestamp_submissions': timestamp_submissions, 'training_sec': training_sec, 'cumulated_submissions': cumulated_submissions, 'name_submissions': name_submissions} failed_leaderboard_html = event.failed_leaderboard_html new_leaderboard_html = event.new_leaderboard_html approved = is_user_signed_up( db.session, event_name, flask_login.current_user.name ) asked = is_user_sign_up_requested( db.session, event_name, flask_login.current_user.name ) return render_template( 'dashboard_submissions.html', failed_leaderboard=failed_leaderboard_html, new_leaderboard=new_leaderboard_html, admin=True, approved=approved, asked=asked, **dashboard_kwargs)
def private_leaderboard(event_name): """Landing page for the private leaderboard. Parameters ---------- event_name : str The event name. """ if not flask_login.current_user.is_authenticated: return redirect(url_for('auth.login')) event = get_event(db.session, event_name) if not is_accessible_event(db.session, event_name, flask_login.current_user.name): return redirect_to_user( '{}: no event named "{}"' .format(flask_login.current_user.firstname, event_name) ) if (not is_admin(db.session, event_name, flask_login.current_user.name) and (event.closing_timestamp is None or event.closing_timestamp > datetime.datetime.utcnow())): return redirect(url_for('ramp.problems')) if app.config['TRACK_USER_INTERACTION']: add_user_interaction( db.session, interaction='looking at private leaderboard', user=flask_login.current_user, event=event ) leaderboard_html = event.private_leaderboard_html admin = is_admin(db.session, event_name, flask_login.current_user.name) if event.official_score_type.is_lower_the_better: sorting_direction = 'asc' else: sorting_direction = 'desc' approved = is_user_signed_up( db.session, event_name, flask_login.current_user.name ) asked = approved template = render_template( 'leaderboard.html', leaderboard_title='Leaderboard', leaderboard=leaderboard_html, sorting_column_index=5, sorting_direction=sorting_direction, event=event, private=True, admin=admin, asked=asked, approved=approved ) return template
def private_competition_leaderboard(event_name): """Landing page for the private competition leaderboard. Parameters ---------- event_name : str The event name. """ if not flask_login.current_user.is_authenticated: return redirect(url_for('auth.login')) event = get_event(db.session, event_name) if not is_accessible_event(db.session, event_name, flask_login.current_user.name): return redirect_to_user(u'{}: no event named "{}"'.format( flask_login.current_user.firstname, event_name)) if (not is_admin(db.session, event_name, flask_login.current_user.name) and (event.closing_timestamp is None or event.closing_timestamp > datetime.datetime.utcnow())): return redirect(url_for('ramp.problems')) if app.config['TRACK_USER_INTERACTION']: add_user_interaction(db.session, interaction='looking at private leaderboard', user=flask_login.current_user, event=event) admin = is_admin(db.session, event_name, flask_login.current_user.name) approved = is_user_signed_up(db.session, event_name, flask_login.current_user.name) asked = approved leaderboard_html = event.private_competition_leaderboard_html leaderboard_kwargs = dict(leaderboard=leaderboard_html, leaderboard_title='Leaderboard', sorting_column_index=0, sorting_direction='asc', event=event, admin=admin, asked=asked, approved=approved) return render_template('leaderboard.html', **leaderboard_kwargs)
def user_event(event_name): """Landing page for a given event. Parameters ---------- event_name : str The event name. """ if flask_login.current_user.access_level == 'asked': msg = 'Your account has not been approved yet by the administrator' logger.error(msg) return redirect_to_user(msg) if not is_accessible_event(db.session, event_name, flask_login.current_user.name): return redirect_to_user('{}: no event named "{}"' .format(flask_login.current_user.firstname, event_name)) event = get_event(db.session, event_name) if event: if app.config['TRACK_USER_INTERACTION']: add_user_interaction(db.session, interaction='looking at event', event=event, user=flask_login.current_user) description_f_name = os.path.join( event.problem.path_ramp_kit, '{}_starting_kit.html'.format(event.problem.name) ) with codecs.open(description_f_name, 'r', 'utf-8') as description_file: description = description_file.read() admin = is_admin(db.session, event_name, flask_login.current_user.name) approved = is_user_signed_up( db.session, event_name, flask_login.current_user.name ) asked = approved return render_template('event.html', description=description, event=event, admin=admin, approved=approved, asked=asked) return redirect_to_user('Event {} does not exist.' .format(event_name), is_error=True)
def update_event(event_name): """Update the parameters of an event. Parameters ---------- event_name : str The name of the event. """ if not is_admin(db.session, event_name, flask_login.current_user.name): return redirect_to_user( 'Sorry {}, you do not have admin rights' .format(flask_login.current_user.firstname), is_error=True ) event = get_event(db.session, event_name) if not is_accessible_event(db.session, event_name, flask_login.current_user.name): return redirect_to_user( '{}: no event named "{}"' .format(flask_login.current_user.firstname, event_name) ) logger.info('{} is updating event {}' .format(flask_login.current_user.name, event.name)) admin = is_admin(db.session, event_name, flask_login.current_user.name) # We assume here that event name has the syntax <problem_name>_<suffix> suffix = event.name[len(event.problem.name) + 1:] h = event.min_duration_between_submissions // 3600 m = event.min_duration_between_submissions // 60 % 60 s = event.min_duration_between_submissions % 60 form = EventUpdateProfileForm( suffix=suffix, title=event.title, is_send_trained_mails=event.is_send_trained_mails, is_send_submitted_mails=event.is_send_submitted_mails, is_public=event.is_public, is_controled_signup=event.is_controled_signup, is_competitive=event.is_competitive, min_duration_between_submissions_hour=h, min_duration_between_submissions_minute=m, min_duration_between_submissions_second=s, opening_timestamp=event.opening_timestamp, closing_timestamp=event.closing_timestamp, public_opening_timestamp=event.public_opening_timestamp, ) if form.validate_on_submit(): try: if form.suffix.data == '': event.name = event.problem.name else: event.name = event.problem.name + '_' + form.suffix.data event.title = form.title.data event.is_send_trained_mails = form.is_send_trained_mails.data event.is_send_submitted_mails = form.is_send_submitted_mails.data event.is_public = form.is_public.data event.is_controled_signup = form.is_controled_signup.data event.is_competitive = form.is_competitive.data event.min_duration_between_submissions = ( form.min_duration_between_submissions_hour.data * 3600 + form.min_duration_between_submissions_minute.data * 60 + form.min_duration_between_submissions_second.data) event.opening_timestamp = form.opening_timestamp.data event.closing_timestamp = form.closing_timestamp.data event.public_opening_timestamp = form.public_opening_timestamp.data db.session.commit() except IntegrityError as e: db.session.rollback() message = '' existing_event = get_event(db.session, event.name) if existing_event is not None: message += 'event name is already in use' # # try: # # User.query.filter_by(email=email).one() # # if len(message) > 0: # # message += ' and ' # # message += 'email is already in use' # except NoResultFound: # pass if message: e = NameClashError(message) flash('{}'.format(e), category='Update event error') return redirect(url_for('update_event', event_name=event.name)) return redirect(url_for('ramp.problems')) approved = is_user_signed_up( db.session, event_name, flask_login.current_user.name ) asked = approved return render_template( 'update_event.html', form=form, event=event, admin=admin, asked=asked, approved=approved )
def test_user_signed_up(session_toy_db, event_name, user_name, is_accessible): assert is_user_signed_up(session_toy_db, event_name, user_name) is is_accessible