functions.py 9.7 KB

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