main.py 9.8 KB

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