functions.py 6.4 KB

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