data_provider.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from sqlite3.dbapi2 import IntegrityError
  2. from dateutil import parser
  3. from aiogram.types.user import User
  4. from app.dates import get_now_datetime_str, is_actual_date
  5. from app.messages import Event, Notifications
  6. from app.db import delete, fetchall, insert, select_by_keys
  7. def add_notifications2db(notification_object: Notifications, meeting_id: int):
  8. for n in [notification_object.befor_day, notification_object.befor_4hours, notification_object.befor_5mins]:
  9. insert("notifications", {
  10. "when_notify": n.date_time_srting,
  11. "meeting_id": meeting_id,
  12. "chat_id": n.chat_id,
  13. "message": n.message
  14. })
  15. def add_event2db(event: Event) -> int:
  16. return insert("meetings", {
  17. "description": event.agenda,
  18. "meeting_datetime": event.date_time,
  19. "participants": event.participants,
  20. "leader_id": event.organizer.id,
  21. "chat_id": event.chat_id,
  22. "meeting_link": event.meeting_url
  23. })
  24. def check_notifications_now() -> list:
  25. """
  26. Достает из БД все напоминания на текущую дату-время. Возвращает список со
  27. всеми напоминавниями
  28. """
  29. date_time_str = get_now_datetime_str()
  30. notifications = select_by_keys("notifications",
  31. ["id", "chat_id", "message"],
  32. {"when_notify": date_time_str})
  33. if type(notifications) == dict: notifications = [notifications]
  34. for n in notifications:
  35. delete("notifications", n["id"])
  36. return notifications
  37. def get_user_by_id(user_id: int):
  38. return select_by_keys(
  39. 'users',
  40. ["id", "firstname", "lastname", "login"],
  41. {'id': str(user_id)})
  42. def get_all_users():
  43. return fetchall("users", ["id", "firstname", "lastname", "login"])
  44. def del_user_by_id(user_id: int):
  45. delete('users', user_id)
  46. def add_user2db(user: User):
  47. try:
  48. return insert("users", {
  49. "id": user.id,
  50. "firstname": user.first_name,
  51. "lastname": user.last_name,
  52. "login": user.username
  53. })
  54. except IntegrityError:
  55. pass
  56. def delete_meeting_and_notifications(meeting_id: int, user_id: int):
  57. """
  58. Принимает айди встречи и пользователя, от которого поступил запрос на
  59. удаление, получает из БД айди пользователя создавшего встречу. Удаляет встречу
  60. если пользователь один и тот же. Также удаляет все напоминания
  61. """
  62. if user_id != 555:
  63. meeting = select_by_keys("meetings",
  64. ["leader_id"],
  65. {"id": str(meeting_id)})
  66. if not meeting:
  67. raise Exception(
  68. "Не могу найти эту встречу\. Возможно, ее уже отменили")
  69. if meeting["leader_id"] != user_id:
  70. raise Exception(
  71. "Вы не создавали эту встречу и не можете её отменить")
  72. notifications = select_by_keys("notifications",
  73. ["id"],
  74. {"meeting_id": meeting_id})
  75. if type(notifications) == dict:
  76. notifications = [notifications]
  77. for n in notifications:
  78. delete("notifications", n["id"])
  79. delete("meetings", meeting_id)
  80. def filter_actual_events(event: dict) -> bool:
  81. """Фильтрует события, оставляет те, которые еще не произошли"""
  82. return is_actual_date(event["meeting_datetime"])
  83. def get_all_users_meetings(user_id: int) -> list:
  84. """
  85. Принимает айди пользователя и возвращает все не прошедшие встречи созданные им
  86. """
  87. events = select_by_keys("meetings",
  88. ["id", "description", "meeting_datetime", "chat_id"],
  89. {"leader_id": user_id}
  90. )
  91. if type(events) != list: events = [events]
  92. for e in events:
  93. e["meeting_datetime"] = parser.parse(e["meeting_datetime"])
  94. events: list = sorted(events, key=lambda e: e["meeting_datetime"].timestamp())
  95. return list(filter(filter_actual_events, events))