logic.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. # Site Back-End Logic
  2. from hmac import new
  3. from flask import Blueprint, render_template, request, flash, redirect, url_for, make_response
  4. from flask_login import login_user, login_required, logout_user, current_user
  5. from werkzeug.security import generate_password_hash, check_password_hash
  6. from .models import User, Message
  7. from . import db
  8. import string, secrets
  9. from flask_wtf import FlaskForm
  10. from wtforms import StringField, SubmitField, PasswordField, FileField, IntegerField, RadioField, TextAreaField
  11. from wtforms.validators import DataRequired
  12. logic = Blueprint('logic', __name__)
  13. # WTForm Classes
  14. class DescForm(FlaskForm):
  15. # declare form field, required input, placeholder and validate data
  16. description = TextAreaField(validators=[DataRequired()])
  17. submit = SubmitField('Update your Description')
  18. class PasswdForm(FlaskForm):
  19. passwd_1 = PasswordField('Edit Password', validators=[DataRequired()])
  20. passwd_2 = PasswordField('Confirm Password', validators=[DataRequired()])
  21. submit = SubmitField('Update Password')
  22. class MsgForm(FlaskForm):
  23. msg = TextAreaField(validators=[DataRequired()])
  24. submit = SubmitField('Send')
  25. class LoginForm(FlaskForm):
  26. email = StringField(validators=[DataRequired()])
  27. passwd = PasswordField(validators=[DataRequired()])
  28. submit = SubmitField('Login')
  29. class RegForm(FlaskForm):
  30. email = StringField(validators=[DataRequired()])
  31. passwd_1 = PasswordField(validators=[DataRequired()])
  32. passwd_2 = PasswordField(validators=[DataRequired()])
  33. firstname = StringField(validators=[DataRequired()])
  34. lastname = StringField(validators=[DataRequired()])
  35. age = IntegerField(validators=[DataRequired()])
  36. gender = RadioField('Gender', choices=[('M', 'Male'),('F', 'Female')], validators=[DataRequired()])
  37. submit = SubmitField('Register')
  38. @logic.route('/', methods=['GET', 'POST'])
  39. @login_required
  40. def profile():
  41. form_1 = DescForm()
  42. form_2 = PasswdForm()
  43. # WTForm Validation Checks
  44. if form_1.validate_on_submit():
  45. new_desc = form_1.description.data
  46. form_1.description.data = ''
  47. new_desc_dbcall = User.query.filter_by(id=current_user.id).first()
  48. new_desc_dbcall.description = new_desc
  49. db.session.commit()
  50. flash('Hooray! A new description!', category='success')
  51. elif form_2.validate_on_submit():
  52. passwd_1 = form_2.passwd_1.data
  53. passwd_2 = form_2.passwd_2.data
  54. form_2.passwd_1.data = ''
  55. form_2.passwd_2.data = ''
  56. if passwd_1 == passwd_2:
  57. new_passwd_dbcall = User.query.filter_by(id=current_user.id).first()
  58. new_passwd_dbcall.password = generate_password_hash(passwd_2, method='sha256')
  59. db.session.commit()
  60. flash('Nice! Updated your password!', category='success')
  61. else:
  62. flash('Oh no! Your passwords must match!', category='error')
  63. # DB Insertions
  64. if request.method == "POST":
  65. new_pic = request.files.get('profilepic_upload')
  66. if new_pic:
  67. # generate random filename for uploaded file
  68. alphanumeric = string.ascii_letters + string.digits
  69. ralphanum = ''.join(secrets.choice(alphanumeric) for i in range(16))
  70. new_pic_dbcall = User.query.filter_by(id=current_user.id).first()
  71. if '.png' in new_pic.filename:
  72. new_pic.save(f'app/static/uploads/{ralphanum}.png')
  73. new_pic_dbcall.profile_image = f'{ralphanum}.png'
  74. elif '.jpg' in new_pic.filename or 'jpeg' in new_pic.filename:
  75. new_pic.save(f'app/static/uploads/{ralphanum}.jpeg')
  76. new_pic_dbcall.profile_image = f'{ralphanum}.jpeg'
  77. db.session.commit()
  78. response = make_response(render_template("profile.html", user = current_user, form1 = form_1, form2= form_2))
  79. response.headers['Content-Security-Policy'] = "default-src 'self'"
  80. return response
  81. @logic.route('/matchbook', methods=['GET', 'POST'])
  82. @login_required
  83. def matchbook():
  84. all_users = User.query.all()
  85. if request.method == 'POST':
  86. recipient_id = request.form.get('message_recipient')
  87. fdbcall = User.query.filter_by(id=current_user.id).first()
  88. fdbcall.focus = recipient_id
  89. db.session.commit()
  90. response = make_response(redirect(url_for('logic.messaging')))
  91. response.headers['Content-Security-Policy'] = "default-src 'self'"
  92. return response
  93. response = make_response(render_template("matchbook.html", user=current_user, userlist=all_users))
  94. response.headers['Content-Security-Policy'] = "default-src 'self'"
  95. return response
  96. @logic.route('/messaging', methods=['GET', 'POST'])
  97. @login_required
  98. def messaging():
  99. recipient_id = current_user.focus
  100. recipient = User.query.filter_by(id=recipient_id).first()
  101. sent_history = Message.query.filter_by(sender=current_user.id, recipient=recipient.id).all()
  102. recv_history = Message.query.filter_by(sender=recipient.id, recipient=current_user.id).all()
  103. joint_history = sent_history + recv_history
  104. joint_history.sort(key=lambda x: x.id) # add reverse=True for descending
  105. form = MsgForm()
  106. if form.validate_on_submit():
  107. message = form.msg.data
  108. form.msg.data = ''
  109. new_msg_dbcall = Message(sender=current_user.id, recipient=recipient.id, message=message)
  110. db.session.add(new_msg_dbcall)
  111. db.session.commit()
  112. response = make_response(redirect(url_for('logic.messaging')))
  113. response.headers['Content-Security-Policy'] = "default-src 'self'"
  114. return response
  115. response = make_response(render_template(
  116. "messaging.html",
  117. user = current_user,
  118. recipient = recipient,
  119. msg_hist = joint_history,
  120. form = form
  121. ))
  122. response.headers['Content-Security-Policy'] = "default-src 'self'"
  123. return response
  124. @logic.route('/login', methods=['GET', 'POST'])
  125. def login():
  126. form = LoginForm()
  127. if form.validate_on_submit():
  128. email = form.email.data
  129. form.email.data = ''
  130. challenge_passwd = form.passwd.data
  131. form.passwd.data = ''
  132. user = User.query.filter_by(email=email).first()
  133. if user:
  134. if check_password_hash(user.password, challenge_passwd):
  135. flash('Successful Login!', category='success')
  136. login_user(user, remember=True)
  137. return redirect(url_for('logic.profile'))
  138. else:
  139. flash('Unsucessful Login!', category='error')
  140. else:
  141. flash('Unsucessful Login!', category='error')
  142. return render_template(
  143. "login.html",
  144. user = current_user,
  145. form = form
  146. )
  147. @logic.route('/logout')
  148. @login_required
  149. def logout():
  150. logout_user()
  151. response = make_response(redirect(url_for('logic.login')))
  152. response.headers['Content-Security-Policy'] = "default-src 'self'"
  153. return response
  154. # Signup Route
  155. @logic.route('/register', methods=['GET', 'POST'])
  156. def register():
  157. pass_list = list()
  158. form = RegForm()
  159. if form.validate_on_submit():
  160. email = form.email.data
  161. firstname = form.firstname.data
  162. lastname = form.lastname.data
  163. age = form.age.data
  164. gender = form.gender.data
  165. passwd_1 = form.passwd_1.data
  166. passwd_2 = form.passwd_2.data
  167. # Basic User Input Checks
  168. email_check = User.query.filter_by(email=email).first()
  169. if len(email) < 1:
  170. flash('Your Email must be longer than 0 characters.', category='error')
  171. elif email_check:
  172. flash('This Email is already taken', category='error')
  173. else:
  174. pass_list.append('p')
  175. if len(firstname) < 1:
  176. flash('First name must be something', category='error')
  177. else:
  178. pass_list.append('p')
  179. if len(lastname) < 1:
  180. flash('Last name must be something', category='error')
  181. else:
  182. pass_list.append('p')
  183. if gender == 'M' or gender == 'F':
  184. pass_list.append('p')
  185. else:
  186. flash('Gender must be either M or F!', category='error')
  187. if len(passwd_1) < 8 or len(passwd_2) < 8:
  188. flash('Your Password must be longer than or equal to 8 characters.', category='error')
  189. else:
  190. if passwd_1 != passwd_2:
  191. flash('Your Passwords must match!', category='error')
  192. else:
  193. if len(pass_list) == 4:
  194. new_user = User(email=email, firstname=firstname, lastname=lastname, age=age, gender=gender, password=generate_password_hash(passwd_2, method='sha256'))
  195. db.session.add(new_user)
  196. db.session.commit()
  197. flash('Account Registration Successful!', category='success')
  198. response = make_response(redirect(url_for('logic.profile')))
  199. response.headers['Content-Security-Policy'] = "default-src 'self'"
  200. return response
  201. else:
  202. flash('Registration Failed', category='error')
  203. return render_template("register.html", user = current_user, form = form)