app.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. """
  2. Authentication module
  3. """
  4. import hashlib
  5. import hmac
  6. from datetime import datetime
  7. from flask_login import login_required, current_user
  8. from flask_menu import Menu, register_menu
  9. from flask import render_template, request, flash, Blueprint, redirect, url_for
  10. from app.models import User, Page, Ballot, Priority, Question, Option, Vote, Code
  11. from app import db
  12. BLUEPRINT = Blueprint(
  13. 'vote',
  14. __name__,
  15. template_folder='templates'
  16. )
  17. @register_menu(BLUEPRINT, 'vote', 'Vote')
  18. @login_required
  19. @BLUEPRINT.route("/")
  20. def main():
  21. """Ballots overview"""
  22. ballots = Ballot.query.all()
  23. return render_template(
  24. 'main.j2',
  25. ballots=ballots,
  26. )
  27. @BLUEPRINT.route('/create', methods=["GET", "POST"])
  28. @login_required
  29. def create():
  30. """Creating ballot"""
  31. if request.method == 'POST':
  32. ballot = Ballot()
  33. print(request.form)
  34. ballot.name = request.form['name']
  35. ballot.description = request.form['description']
  36. ballot.user_id = current_user.id
  37. start_at = "%s %s" % (request.form['start_at_date'], request.form['start_at_time'])
  38. ballot.start_at = datetime.strptime(start_at, "%Y-%m-%d %H:%M")
  39. end_at = "%s %s" % (request.form['end_at_date'], request.form['end_at_time'])
  40. ballot.end_at = datetime.strptime(end_at, "%Y-%m-%d %H:%M")
  41. db.session.add(ballot)
  42. db.session.commit()
  43. flash('Page "%s" successfully created' % ballot.name, 'success')
  44. return redirect(url_for('vote.view', ballot_id=ballot.id))
  45. priorities = Priority.query.all()
  46. return render_template(
  47. 'vote/create.j2',
  48. priorities=priorities
  49. )
  50. @BLUEPRINT.route('/<int:ballot_id>', methods=["GET", "POST"])
  51. @login_required
  52. def view(ballot_id):
  53. """View ballot"""
  54. ballot = Ballot.query.get(ballot_id)
  55. if request.method == 'POST':
  56. option = Option()
  57. option.question_id = request.form['question_id']
  58. option.name = request.form['name']
  59. db.session.add(option)
  60. db.session.commit()
  61. return render_template(
  62. 'vote/view.j2',
  63. ballot=ballot,
  64. )
  65. @BLUEPRINT.route('/<int:ballot_id>/add_question', methods=["GET", "POST"])
  66. @login_required
  67. def add_question(ballot_id):
  68. """Add question to ballot"""
  69. ballot = Ballot.query.get(ballot_id)
  70. if request.method == 'POST':
  71. question = Question()
  72. question.ballot_id = ballot.id
  73. question.name = request.form['name']
  74. question.description = request.form['description']
  75. question.combined_approval_voting = 'combined_approval_voting' in request.form
  76. db.session.add(question)
  77. db.session.commit()
  78. if question.combined_approval_voting:
  79. options = ['Voor', 'Tegen', 'Onthouden']
  80. for option_name in options:
  81. option = Option()
  82. option.question_id = question.id
  83. option.name = option_name
  84. db.session.add(option)
  85. db.session.commit()
  86. return redirect(url_for('vote.view', ballot_id=ballot.id))
  87. return render_template(
  88. 'vote/add_question.j2',
  89. ballot=ballot,
  90. )
  91. @BLUEPRINT.route('/public/<int:ballot_id>', methods=["GET", "POST"])
  92. def public(ballot_id):
  93. """Vote and view results of ballot"""
  94. ballot = Ballot.query.get(ballot_id)
  95. # code = Code()
  96. # code.secret = "test"
  97. # db.session.add(code)
  98. # db.session.commit()
  99. if request.method == 'POST':
  100. security_code = request.form['security_code']
  101. code = Code.query.order_by(Code.expire_date.desc()).first()
  102. print(code.get_digest(code))
  103. user_id = None
  104. for user in User.all():
  105. if security_code == code.get_digest(str(user.id)):
  106. user_id = user.id
  107. if user_id is not None:
  108. for question_id, option_id in request.form.items():
  109. if question_id == 'code':
  110. continue
  111. question = Question.query.get(question_id)
  112. option = question.options.filter(Option.id == option_id).first()
  113. vote = Vote()
  114. vote.option_id = option.id
  115. vote.user_id = user_id
  116. db.session.add(vote)
  117. db.session.commit()
  118. flash('Succesvol gestemd', 'success')
  119. else:
  120. flash('Fout in veiligheids code', 'warning')
  121. return render_template(
  122. 'vote/public.j2',
  123. ballot=ballot,
  124. )