main.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import datetime
  2. import os
  3. from flask import Flask, render_template, request, url_for
  4. from flask_login import login_user, current_user, LoginManager, logout_user, login_required
  5. from werkzeug.datastructures import CombinedMultiDict
  6. from werkzeug.utils import redirect
  7. from itsdangerous import URLSafeTimedSerializer, SignatureExpired
  8. from functions import check_password, mail
  9. from forms.edit_profile import EditProfileForm
  10. from forms.login import LoginForm
  11. from forms.register import RegisterForm
  12. from data.users import User
  13. from data.files import Files
  14. from waitress import serve
  15. from data import db_session
  16. app = Flask(__name__)
  17. key = 'test_secret_key'
  18. app.config['SECRET_KEY'] = key
  19. s = URLSafeTimedSerializer(key)
  20. login_manager = LoginManager()
  21. login_manager.init_app(app)
  22. @app.route('/')
  23. def base():
  24. if not current_user.is_authenticated:
  25. return render_template('main.html', title='Главная')
  26. else:
  27. return redirect('/projects')
  28. @app.route('/projects')
  29. def project():
  30. if current_user.is_authenticated:
  31. return render_template('projects.html', title='Проекты')
  32. else:
  33. return redirect('/login')
  34. @app.route('/profile', methods=['GET', 'POST'])
  35. def profile():
  36. if current_user.is_authenticated:
  37. form = EditProfileForm(
  38. CombinedMultiDict((request.files, request.form)),
  39. email=current_user.email,
  40. name=current_user.name,
  41. surname=current_user.surname,
  42. about=current_user.about,
  43. birthday=current_user.birthday
  44. )
  45. if form.del_photo.data:
  46. data_session = db_session.create_session()
  47. user = data_session.query(User).filter(User.id == current_user.id).first()
  48. if not user:
  49. return render_template('profile.html', title='Профиль', form=form,
  50. message='Ошибка, пользователь ненайден')
  51. os.remove(current_user.photo)
  52. user.photo = 'static/images/none_logo.png'
  53. data_session.commit()
  54. data_session.close()
  55. if form.validate_on_submit():
  56. data_session = db_session.create_session()
  57. user = data_session.query(User).filter(User.id == current_user.id).first()
  58. if not user:
  59. return render_template('profile.html', title='Профиль', form=form,
  60. message='Ошибка, пользователь ненайден')
  61. if form.email.data != current_user.email:
  62. pass
  63. if form.photo.data:
  64. with open(f'static/app_files/user_logo/{current_user.login}.png', 'wb') as file:
  65. form.photo.data.save(file)
  66. user.photo = f'static/app_files/user_logo/{current_user.login}.png'
  67. user.name = form.name.data
  68. user.surname = form.surname.data
  69. user.about = form.about.data
  70. user.birthday = form.birthday.data
  71. data_session.commit()
  72. data_session.close()
  73. return redirect('/profile')
  74. return render_template('profile.html', title='Профиль', form=form, message='')
  75. else:
  76. return redirect('/login')
  77. @login_manager.user_loader
  78. def load_user(user_id):
  79. db_sess = db_session.create_session()
  80. return db_sess.query(User).get(user_id)
  81. @app.route('/login', methods=['GET', 'POST'])
  82. def login():
  83. if not current_user.is_authenticated:
  84. message = request.args.get('message') if request.args.get('message') else ''
  85. danger = request.args.get('danger') if request.args.get('danger') else False
  86. form = LoginForm()
  87. if form.validate_on_submit():
  88. data_session = db_session.create_session()
  89. user = data_session.query(User).filter(User.email == form.login.data).first()
  90. if not user:
  91. user = data_session.query(User).filter(User.login == form.login.data).first()
  92. data_session.close()
  93. if user and user.check_password(form.password.data):
  94. if user.activated:
  95. login_user(user, remember=form.remember_me.data)
  96. return redirect('/projects')
  97. else:
  98. return render_template('login.html',
  99. message="Ваша почта не подтверждена",
  100. danger=True,
  101. form=form)
  102. return render_template('login.html',
  103. message="Неправильный логин или пароль",
  104. danger=True,
  105. form=form)
  106. return render_template('login.html', title='Авторизация', form=form, message=message,
  107. danger=danger)
  108. else:
  109. return redirect('/projects')
  110. @app.route('/logout')
  111. @login_required
  112. def logout():
  113. logout_user()
  114. return redirect("/")
  115. @app.route('/register', methods=['GET', 'POST'])
  116. def register():
  117. if not current_user.is_authenticated:
  118. form = RegisterForm()
  119. if form.validate_on_submit():
  120. data_session = db_session.create_session()
  121. if data_session.query(User).filter(User.login == form.login.data).first():
  122. return render_template('register.html', form=form, message="Такой пользователь уже есть",
  123. title='Регистрация')
  124. if data_session.query(User).filter(User.email == form.email.data).first():
  125. return render_template('register.html', form=form, message="Такая почта уже есть", title='Регистрация')
  126. status_password = check_password(form.password.data)
  127. if status_password != 'OK':
  128. return render_template('register.html', form=form, message=status_password, title='Регистрация')
  129. user = User(
  130. email=form.email.data,
  131. name=form.name.data,
  132. login=form.login.data,
  133. activity=datetime.datetime.now(),
  134. data_reg=datetime.date.today(),
  135. photo='static/images/none_logo.png',
  136. role=1
  137. )
  138. user.set_password(form.password.data)
  139. data_session.add(user)
  140. data_session.commit()
  141. data_session.close()
  142. token = s.dumps(form.email.data)
  143. link_conf = url_for('confirmation', token=token, _external=True)
  144. mail(f'Для завершения регистрации пройдите по ссылке: {link_conf}', form.email.data,
  145. 'Подтверждение регистрации')
  146. return redirect('/login?message=Мы выслали ссылку для подтверждения почты')
  147. return render_template('register.html', form=form, message='', title='Регистрация')
  148. else:
  149. return redirect('/projects')
  150. @app.route('/confirmation/<token>')
  151. def confirmation(token):
  152. try:
  153. user_email = s.loads(token, max_age=86400)
  154. data_session = db_session.create_session()
  155. user = data_session.query(User).filter(User.email == user_email).first()
  156. if user:
  157. user.activated = True
  158. data_session.commit()
  159. data_session.close()
  160. return redirect('/login?message=Почта успешно подтверждена')
  161. else:
  162. return redirect('/login?message=Пользователь не найден&danger=True')
  163. except SignatureExpired:
  164. data_session = db_session.create_session()
  165. users = data_session.query(User).filter(
  166. User.activated == 0 and User.activated < datetime.datetime.now() - datetime.timedelta(days=1)).all()
  167. if users:
  168. list(map(lambda x: data_session.delete(x), users))
  169. data_session.commit()
  170. data_session.close()
  171. return redirect('/login?message=Срок действия ссылки истек, данные удалены&danger=True')
  172. def main():
  173. db_session.global_init("db/incepted.db")
  174. serve(app, host='0.0.0.0', port=5000)
  175. if __name__ == '__main__':
  176. main()