forked from mariosajdini/MeetingToolProject
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScheduler.py
125 lines (113 loc) · 5.15 KB
/
Scheduler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import time
from Channel import Channel
import DataBaseConnection
import RedisConnection
import MeetingInstance
import datetime
import RedisFunctions
def add_meeting_details(meetingInstance):
"""Add meeting details to redis
:param meetingInstance: MeetingInstance object
:return: None
"""
redis = RedisConnection.connect_to_redis()
meetingId = meetingInstance.meetingId
con = DataBaseConnection.check_connection()
if con is None:
con = DataBaseConnection.connect_to_database()
cursor = con.cursor()
cursor.execute("SELECT isPublic, audience FROM meetings WHERE meetingID = %s", (meetingId,))
isPublic, audience = cursor.fetchone()
audience = audience.split(',')
cursor.close()
if isPublic == 1:
redis.set(f'{meetingId}:public', 'true')
else:
redis.set(f'{meetingId}:public', 'false')
# Add audience to redis, for now it is hardcoded
redis.sadd(f'{meetingId}:audience', *audience)
class Scheduler:
meeting_instances = []
channels = {}
redis = RedisConnection.connect_to_redis()
con = DataBaseConnection.connect_to_database()
def get_last_minute_updated_meetings(self, ):
con = DataBaseConnection.check_connection()
if con is None:
con = DataBaseConnection.connect_to_database()
cursor = con.cursor()
cursor.execute(
"SELECT meetingID, orderID, fromdatetime, todatetime FROM meeting_instances "
"WHERE created_at >= NOW() - INTERVAL 1 MINUTE AND created_at < NOW()")
meetings = cursor.fetchall()
cursor.close()
meetingInstaces = []
for meeting in meetings:
meetingID, orderID, fromdatetime, todatetime = meeting
meet = MeetingInstance.MeetingInstance(meetingID, orderID, fromdatetime, todatetime)
meetingInstaces.append(meet)
if self.redis.get(f'{meetingID}:{orderID}:status') is None:
self.redis.set(f'{meetingID}:{orderID}:status', 'inactive')
add_meeting_details(meet)
return meetingInstaces
def activate_meetings(self):
# get all meeting instances with start time less than or equal to current time
current_time = datetime.datetime.now()
meetingsInstances = self.meeting_instances
for meetingInstance in meetingsInstances:
meetingID, orderID = meetingInstance.meetingId, meetingInstance.orderId
# set meeting instance status to "active"
if meetingInstance.fromdatatime <= current_time <= meetingInstance.todatetime:
status = self.redis.get(f'{meetingID}:{orderID}:status')
RedisFunctions.create_channel(f'{meetingID}:{orderID}:channel')
if status.decode('utf-8') != "active":
self.redis.set(f'{meetingID}:{orderID}:status', 'active')
def deactivate_meetings(self):
# get all meeting instances with end time less than or equal to current time
current_time = datetime.datetime.now()
meetingsInstances = self.meeting_instances
redis = RedisConnection.connect_to_redis()
for meetingInstance in meetingsInstances:
meetingID, orderID = meetingInstance.meetingId, meetingInstance.orderId
# set meeting instance status to "inactive"
if meetingInstance.todatetime <= current_time:
status = redis.get(f'{meetingID}:{orderID}:status')
if status.decode('utf-8') != "inactive":
redis.set(f'{meetingID}:{orderID}:status', 'inactive')
RedisFunctions.delete_current_users_at_meeting_end(meetingInstance)
def run(self):
"""Run the scheduler"""
# Add all meetings to redis when the scheduler starts
self.meeting_instances = self.get_all_meetings_instances()
self.activate_meetings()
self.deactivate_meetings()
# run the scheduler every 1 minute to check for new meetings
while True:
self.meeting_instances = self.get_last_minute_updated_meetings()
self.activate_meetings()
self.deactivate_meetings()
time.sleep(2)
def get_all_meetings_instances(self):
"""Get all meeting instances from database
:return: list of MeetingInstance objects
"""
con = DataBaseConnection.check_connection()
if con is None:
con = DataBaseConnection.connect_to_database()
cursor = con.cursor()
cursor.execute(
"SELECT meetingID, orderID, fromdatetime, todatetime FROM meeting_instances")
meetings = cursor.fetchall()
cursor.close()
meetingInstaces = []
for meeting in meetings:
meetingID, orderID, fromdatetime, todatetime = meeting
meet = MeetingInstance.MeetingInstance(meetingID, orderID, fromdatetime, todatetime)
meetingInstaces.append(meet)
if self.redis.get(f'{meetingID}:{orderID}:status') is None:
self.redis.set(f'{meetingID}:{orderID}:status', 'inactive')
add_meeting_details(meet)
return meetingInstaces
if __name__ == '__main__':
scheduler = Scheduler()
scheduler.run()