functions.py 8.0 KB

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