functions.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import datetime
  2. import os
  3. import smtplib
  4. from json import loads
  5. from email.message import EmailMessage
  6. from data.roles import Roles
  7. from data.users import User
  8. from data.staff_projects import StaffProjects
  9. from data.answer import Answer
  10. from data.files import Files
  11. from data import db_session
  12. import uuid
  13. import pymorphy2
  14. def check_password(password=''):
  15. smb = 'qwertyuiopasdfghjklzxcvbnm'
  16. if len(password) < 6:
  17. return 'Пароль должен быть длиннее 6 символов'
  18. elif False in [True if i.isalpha() and i.lower() in smb or i.isdigit() else False for i in password]:
  19. return 'Пароль может содержать только буквы латинского алфавита и цифры'
  20. elif True not in [True if i.isdigit() else False for i in password]:
  21. return 'Пароль должен содержать буквы разного регистра и цифры'
  22. elif False not in [True if i.islower() and i.isalpha() else False for i in password]:
  23. return 'Пароль должен содержать буквы разного регистра и цифры'
  24. else:
  25. return 'OK'
  26. def mail(msg, to, topic='Подтверждение почты'):
  27. with open('incepted.config', 'r', encoding='utf-8').read() as file:
  28. file = loads(file)
  29. login, password = file["mail_login"], file["mail_password"]
  30. email_server = "smtp.yandex.ru"
  31. sender = "incepted@yandex.ru"
  32. em = EmailMessage()
  33. em.set_content(msg)
  34. em['To'] = to
  35. em['From'] = sender
  36. em['Subject'] = topic
  37. mailServer = smtplib.SMTP(email_server)
  38. mailServer.set_debuglevel(1)
  39. mailServer.ehlo()
  40. mailServer.starttls()
  41. mailServer.ehlo()
  42. mailServer.login(login, password)
  43. mailServer.ehlo()
  44. mailServer.send_message(em)
  45. mailServer.quit()
  46. def init_db_default():
  47. data_session = db_session.create_session()
  48. roles = [['admin', 2], ['moderator', 1], ['user', 0]]
  49. for i in roles:
  50. role = Roles(
  51. name=i[0],
  52. rights=i[1]
  53. )
  54. data_session.add(role)
  55. data_session.commit()
  56. data_session.close()
  57. def get_user_data(user):
  58. resp = {
  59. 'id': user.id,
  60. 'name': user.name,
  61. 'surname': user.surname,
  62. 'login': user.login,
  63. 'email': user.email,
  64. 'photo': user.photo,
  65. 'role': user.role
  66. }
  67. return resp
  68. def get_projects_data(project):
  69. data_session = db_session.create_session()
  70. staff = data_session.query(StaffProjects.user).filter(StaffProjects.project == project.id).all()
  71. resp = {
  72. 'id': project.id,
  73. 'name': project.name,
  74. 'logo': project.photo,
  75. 'description': project.description,
  76. 'staff': list(map(lambda x: get_user_data(x), data_session.query(User).filter(
  77. User.id.in_(list(map(lambda x: x[0], staff)))).all())) if staff else []
  78. }
  79. resp['staff'].insert(0, get_user_data(data_session.query(User).filter(User.id == project.creator).first()))
  80. return resp
  81. def save_project_logo(photo):
  82. filename = f'static/app_files/project_logo/{uuid.uuid4()}.png'
  83. with open(filename, 'wb') as f:
  84. photo.save(f)
  85. return filename
  86. def overdue_quest_project(quest):
  87. if quest.deadline is None:
  88. quest.overdue = ''
  89. elif str(quest.deadline.date()) == str(datetime.datetime.now().date()):
  90. quest.overdue = 'today'
  91. elif quest.deadline < datetime.datetime.now():
  92. quest.overdue = 'yes'
  93. quest.time_left = 'Просрочено на' + round_date(quest.deadline)
  94. elif quest.deadline > datetime.datetime.now():
  95. quest.overdue = 'no'
  96. quest.time_left = 'Еще есть: ' + round_date(quest.deadline)
  97. return quest
  98. def round_date(date_time):
  99. morph = pymorphy2.MorphAnalyzer()
  100. difference = abs(date_time - datetime.datetime.now()).days
  101. resp = ''
  102. if difference // 365:
  103. resp += f'{difference // 365} {morph.parse("год")[0].make_agree_with_number(difference // 365).word}'
  104. difference -= 365 * (difference // 365)
  105. if difference // 30:
  106. resp += ', ' if resp else ' ' + f'{difference // 30}' \
  107. f' {morph.parse("месяц")[0].make_agree_with_number(difference // 30).word}'
  108. difference -= 30 * (difference // 30)
  109. if difference:
  110. resp += ', ' if resp else ' ' + f'{difference} {morph.parse("день")[0].make_agree_with_number(difference).word}'
  111. return f'{resp}'
  112. def save_proof_quest(project, file, user_id):
  113. data_session = db_session.create_session()
  114. path = f'static/app_files/all_projects/{str(project.id)}/{str(file.filename)}'
  115. file_check = data_session.query(Files).filter(Files.path == path).first()
  116. file.save(path)
  117. if file_check:
  118. return file_check.id
  119. file = Files(
  120. path=path,
  121. user=user_id,
  122. up_date=datetime.datetime.now()
  123. )
  124. data_session.add(file)
  125. data_session.flush()
  126. data_session.refresh(file)
  127. file_id = file.id
  128. data_session.commit()
  129. data_session.close()
  130. return file_id
  131. def find_files_answer(file_id):
  132. data_session = db_session.create_session()
  133. file = data_session.query(Files).filter(Files.id == file_id).first()
  134. return {'id': file.id, 'path': file.path, 'user': file.user, 'up_date': file.up_date,
  135. 'current_path': file.path[str(file.path).find('all_projects') + 13:].split('/')}