DotaNoobs main site.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
6.3 KiB

  1. from flask import render_template, flash, redirect, g, request, url_for, session
  2. from datetime import datetime
  3. from functools import wraps
  4. from app import app, db, oid
  5. from models import User, Event
  6. from utils import get_steam_userinfo
  7. from board import registerUserForumId
  8. from teamspeak import registerUserTeamspeakId
  9. from forms import SettingsForm, EventForm, EnableStatsForm
  10. @app.before_request
  11. def before_request():
  12. g.user = None
  13. if 'user_id' in session:
  14. g.user = User.query.get(session['user_id'])
  15. if g.user:
  16. g.user.last_seen = datetime.utcnow()
  17. db.session.commit()
  18. def login_required(f):
  19. @wraps(f)
  20. def decorated_function(*args, **kwargs):
  21. if g.user is None:
  22. return redirect(url_for('login', next=request.url))
  23. return f(*args, **kwargs)
  24. return decorated_function
  25. def flash_form_errors(form):
  26. for field, errors in form.errors.items():
  27. for error in errors:
  28. flash(u"Error in the %s field - %s" % (getattr(form,field).label.text, error), 'danger')
  29. #
  30. # Application routes
  31. #
  32. @app.route('/')
  33. def index():
  34. active = Event.query.filter(Event.start_time <= datetime.utcnow(), Event.end_time > datetime.utcnow()).all()
  35. upcoming = Event.query.filter(Event.start_time > datetime.utcnow()).limit(2).all()
  36. channels = User.get_streaming_users()
  37. return render_template("index.html", active_events=active, upcoming_events=upcoming, streamers=channels)
  38. @app.route('/login')
  39. @oid.loginhandler
  40. def login():
  41. if g.user is not None:
  42. return redirect(oid.get_next_url())
  43. return oid.try_login('http://steamcommunity.com/openid')
  44. @oid.after_login
  45. def create_or_login(resp):
  46. match = app.config['STEAM_ID_RE'].search(resp.identity_url)
  47. g.user = User.get_or_create(match.group(1))
  48. steamdata = get_steam_userinfo(g.user.steam_id)
  49. g.user.nickname = steamdata['personaname']
  50. g.user.avatar = steamdata['avatar']
  51. db.session.commit()
  52. session['user_id'] = g.user.id
  53. flash("You are logged in as {}".format(g.user.nickname), 'success')
  54. return redirect(oid.get_next_url())
  55. @app.route('/logout')
  56. def logout():
  57. session.pop('user_id', None)
  58. g.user = None
  59. flash("You have been logged out.", 'success')
  60. return redirect(url_for('index'))
  61. # Teamspeak statistics page
  62. @app.route('/teamspeak')
  63. def teamspeak():
  64. return render_template('teamspeak.html')
  65. # Friends of doobs page
  66. @app.route('/friends')
  67. def friends():
  68. return render_template('friends.html')
  69. # Stream pages
  70. @app.route('/shaneomad')
  71. def twitch_shaneomad():
  72. return render_template('potatr.html', twitch_id=app.config.TWITCH_CLIENT_ID)
  73. # User profile page
  74. @app.route('/user/<int:userid>')
  75. def user_profile(userid):
  76. user = User.query.filter_by(id=userid).first_or_404()
  77. return render_template('profile.html', user=user)
  78. # User random a-z challenge progress page
  79. @app.route('/user/<int:userid>/random', methods=['POST', 'GET'])
  80. def user_random_hero(userid):
  81. user = User.query.filter_by(id=userid).first_or_404()
  82. if request.method == 'POST':
  83. if request.form.get('skip', False):
  84. user.random_skip()
  85. elif request.form.get('completed', False):
  86. user.random_success()
  87. return render_template('hero_random.html', user=user)
  88. # User settings page
  89. @app.route('/settings', methods=['POST', 'GET'])
  90. @login_required
  91. def user_settings():
  92. user = User.query.filter_by(id=g.user.id).first_or_404()
  93. form = SettingsForm(obj=user)
  94. if form.validate_on_submit():
  95. form.populate_obj(user)
  96. if user.bio_text == '':
  97. user.bio_text = None
  98. db.session.commit()
  99. flash('Settings updated!', 'success')
  100. return render_template('settings.html', form=form)
  101. # Enable user statistics page
  102. @app.route('/settings/enable_stats', methods=['POST', 'GET'])
  103. @login_required
  104. def enable_statistics():
  105. # TODO: update user_settings to use g.user, avoid extra queries
  106. form = EnableStatsForm(obj=g.user)
  107. if form.validate_on_submit():
  108. forum_data = registerUserForumId(g.user, form.forum_username.data, form.forum_password.data)
  109. if forum_data:
  110. flash('Forum account \''+forum_data['forum_name']+'\' linked!', 'success')
  111. else:
  112. flash('Forum account credentials invalid', 'danger')
  113. if registerUserTeamspeakId(g.user, form.teamspeak_id.data):
  114. flash('Teamspeak account linked successfully!', 'success')
  115. else:
  116. flash('Teamspeak ID not found in client history', 'danger')
  117. return render_template('enable_stats.html', form=form)
  118. # Events list
  119. @app.route('/events', methods=['GET'])
  120. def list_events():
  121. now = datetime.utcnow()
  122. active = Event.query.filter(Event.start_time <= now, Event.end_time > now).all()
  123. upcoming = Event.query.filter(Event.start_time > now).all()
  124. expired = Event.query.filter(Event.end_time < now).all()
  125. return render_template('list_events.html', active=active, upcoming=upcoming, expired=expired)
  126. # Show event info
  127. @app.route('/event/<int:eventid>', methods=['GET'])
  128. def show_event(eventid):
  129. event = Event.query.filter_by(id=eventid).first_or_404()
  130. return render_template('show_event.html', event=event)
  131. # Event creation page
  132. @app.route('/event/edit', methods=['POST', 'GET'])
  133. @login_required
  134. def event_edit():
  135. if not g.user.admin:
  136. flash('Access Denied: You cannot create/edit events.', 'danger')
  137. return redirect(url_for('index'))
  138. eventid = request.args.get('eventid')
  139. event = Event.get_or_create(eventid)
  140. form = EventForm(obj=event)
  141. if form.validate_on_submit():
  142. form.populate_obj(event)
  143. db.session.add(event)
  144. db.session.commit()
  145. flash('New event created!', 'success') if eventid is None else flash('Event updated successfully!', 'success')
  146. return redirect(url_for('show_event', eventid=event.id))
  147. else:
  148. flash_form_errors(form)
  149. return render_template('edit_event.html', event=event, form=form)
  150. # Event deletion call
  151. @app.route('/event/<int:eventid>/delete', methods=['GET'])
  152. @login_required
  153. def event_delete(eventid):
  154. if g.user.admin:
  155. event = Event.query.filter_by(id=eventid).first_or_404()
  156. flash('Info: Event "{}" deleted successfully.'.format(event.name), 'success')
  157. db.session.delete(event)
  158. db.session.commit()
  159. else:
  160. flash('Access Denied: You cannot delete events.', 'danger')
  161. return redirect(url_for('index'))