Skip to content

Commit dd9dbb1

Browse files
committed
(CON-328-story): add organizer_email and room_id
- ensure the returned url is comprised with the organizer_email and room_id [Delivers CON-328]
1 parent 57ea920 commit dd9dbb1

File tree

12 files changed

+145
-47
lines changed

12 files changed

+145
-47
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""add organizer email field
2+
3+
Revision ID: 859f31384fe2
4+
Revises: c058d462a21d
5+
Create Date: 2019-11-18 09:26:07.682060
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = '859f31384fe2'
14+
down_revision = 'c058d462a21d'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
op.add_column('events', sa.Column(
21+
'organizer_email', sa.String(), nullable=True))
22+
23+
24+
def downgrade():
25+
op.drop_column('events', 'organizer_email')

api/events/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Events(Base, Utility):
2929
meeting_end_time = Column(String, nullable=True)
3030
auto_cancelled = Column(Boolean, nullable=True, default=False)
3131
app_booking = Column(Boolean, nullable=True, default=False)
32+
organizer_email = Column(String, nullable=True)
3233

3334

3435
def filter_event(start_date, end_date, room_id=None):

api/events/schema.py

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ class Meta:
4242
model = EventsModel
4343

4444

45+
class EventArguments(graphene.ObjectType):
46+
47+
"""
48+
returns common event arguments
49+
"""
50+
51+
calendar_id = graphene.String(required=True)
52+
event_id = graphene.String(required=True)
53+
start_time = graphene.String(required=True)
54+
end_time = graphene.String(required=True)
55+
56+
4557
class BookEvent(graphene.Mutation):
4658
"""
4759
Book Calendar events
@@ -57,6 +69,7 @@ class Arguments:
5769
organizer = graphene.String(required=False)
5870
description = graphene.String(required=False)
5971
room = graphene.String(required=True)
72+
room_id = graphene.Int(required=True)
6073
time_zone = graphene.String(required=True)
6174

6275
@Auth.user_roles('Admin', 'Default User', 'Super Admin')
@@ -72,9 +85,11 @@ def mutate(self, info, **kwargs):
7285
attendees: A string of emails of the event guests
7386
description: Any additional information about the event
7487
room: The meeting room where the even will be held [required]
88+
room_id: The id of the meeting room where the even will
89+
be held [required]
7590
time_zone: The timezone of the event location eg. 'Africa/Kigali'
76-
organizer: The email of the co-organizer, the converge email is
77-
the default
91+
organizer: The email of the organizer. it should be gotten
92+
from the user token.
7893
7994
Returns:
8095
A string that communicates a successfully created event.
@@ -87,12 +102,14 @@ def mutate(self, info, **kwargs):
87102
organizer = kwargs.get('organizer', None)
88103

89104
event_title = kwargs['event_title']
105+
room_id = kwargs['room_id']
90106
empty_string_checker(event_title)
91107
empty_string_checker(room)
108+
empty_string_checker(room_id)
92109
empty_string_checker(time_zone)
93110

94111
start_date, end_date = calendar_dates_format(
95-
kwargs['start_date'], kwargs['start_time'], duration)
112+
kwargs['start_date'], kwargs['start_time'], duration, time_zone)
96113

97114
attendees = attendees.replace(" ", "").split(",")
98115
guests = []
@@ -118,8 +135,23 @@ def mutate(self, info, **kwargs):
118135
}
119136
}
120137
service = credentials.set_api_credentials()
121-
service.events().insert(calendarId='primary', body=event,
122-
sendNotifications=True).execute()
138+
event_created = service.events() \
139+
.insert(calendarId='primary',
140+
body=event,
141+
sendNotifications=True).execute()
142+
new_event = EventsModel(
143+
event_id=event_created['id'],
144+
event_title=kwargs['event_title'],
145+
start_time=start_date,
146+
end_time=end_date,
147+
number_of_participants=len(guests),
148+
app_booking=True,
149+
checked_in=False,
150+
room_id=room_id,
151+
cancelled=False,
152+
organizer_email=organizer
153+
)
154+
new_event.save()
123155
return BookEvent(response='Event created successfully')
124156

125157

@@ -128,11 +160,11 @@ class EventCheckin(graphene.Mutation):
128160
Returns the eventcheckin payload
129161
"""
130162
class Arguments:
131-
calendar_id = graphene.String(required=True)
132-
event_id = graphene.String(required=True)
163+
calendar_id = EventArguments.calendar_id
164+
event_id = EventArguments.event_id
133165
event_title = graphene.String(required=True)
134-
start_time = graphene.String(required=True)
135-
end_time = graphene.String(required=True)
166+
start_time = EventArguments.start_time
167+
end_time = EventArguments.end_time
136168
number_of_participants = graphene.Int(required=True)
137169
check_in_time = graphene.String(required=False)
138170
event = graphene.Field(Events)
@@ -161,11 +193,11 @@ class CancelEvent(graphene.Mutation):
161193
Returns the payload on event cancelation
162194
"""
163195
class Arguments:
164-
calendar_id = graphene.String(required=True)
165-
event_id = graphene.String(required=True)
196+
calendar_id = EventArguments.calendar_id
197+
event_id = EventArguments.event_id
166198
event_title = graphene.String(required=True)
167-
start_time = graphene.String(required=True)
168-
end_time = graphene.String(required=True)
199+
start_time = EventArguments.start_time
200+
end_time = EventArguments.end_time
169201
number_of_participants = graphene.Int()
170202
event = graphene.Field(Events)
171203

@@ -211,14 +243,32 @@ class EndEvent(graphene.Mutation):
211243
Returns event payload on ending the event
212244
"""
213245
class Arguments:
214-
calendar_id = graphene.String(required=True)
215-
event_id = graphene.String(required=True)
216-
start_time = graphene.String(required=True)
217-
end_time = graphene.String(required=True)
246+
calendar_id = EventArguments.calendar_id
247+
event_id = EventArguments.event_id
248+
organizer_email = graphene.String(required=True)
249+
room_id = graphene.Int(required=True)
250+
start_time = EventArguments.start_time
251+
end_time = EventArguments.end_time
218252
meeting_end_time = graphene.String(required=True)
219253
event = graphene.Field(Events)
220254

221255
def mutate(self, info, **kwargs):
256+
calendar_id = kwargs['calendar_id']
257+
event_id = kwargs['event_id']
258+
organizer_email = kwargs['organizer_email']
259+
room_id = kwargs['room_id']
260+
start_time = kwargs['start_time']
261+
end_time = kwargs['end_time']
262+
meeting_end_time = kwargs['meeting_end_time']
263+
264+
empty_string_checker(calendar_id)
265+
empty_string_checker(event_id)
266+
empty_string_checker(organizer_email)
267+
empty_string_checker(room_id)
268+
empty_string_checker(start_time)
269+
empty_string_checker(end_time)
270+
empty_string_checker(meeting_end_time)
271+
222272
room_id, event = check_event_in_db(self, info, "ended", **kwargs)
223273
if kwargs.get('meeting_end_time'):
224274
update_device_last_activity(
@@ -229,8 +279,8 @@ def mutate(self, info, **kwargs):
229279
meeting_end_time=kwargs['meeting_end_time']
230280
)
231281
event.save()
232-
event_id = kwargs['event_id']
233-
notify_slack.delay(event_id)
282+
283+
notify_slack.delay(event_id, organizer_email, room_id)
234284
return EndEvent(event=event)
235285

236286

fixtures/events/book_event_fixtures.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
duration:60
77
88
timeZone: "Africa/Kigali",
9-
room:"Yankara"
9+
room:"Yankara",
10+
roomId:1
1011
){
1112
response
1213
}
@@ -21,7 +22,8 @@
2122
duration:60
2223
2324
timeZone: "Africa/Kigali",
24-
room:"Yankara"
25+
room:"Yankara",
26+
roomId:1
2527
){
2628
response
2729
}
@@ -36,7 +38,8 @@
3638
duration:60
3739
3840
timeZone: "Africa/Kigali",
39-
room:""
41+
room:"",
42+
roomId:1
4043
){
4144
response
4245
}
@@ -51,7 +54,8 @@
5154
duration:60
5255
5356
timeZone: "Africa/Kigali",
54-
room:"Yankara"
57+
room:"Yankara",
58+
roomId:1
5559
){
5660
response
5761
}
@@ -66,7 +70,8 @@
6670
duration:60
6771
6872
timeZone: "Africa/Kigali",
69-
room:"Yankara"
73+
room:"Yankara",
74+
roomId:1
7075
){
7176
response
7277
}
@@ -81,7 +86,8 @@
8186
duration:60
8287
8388
timeZone: "",
84-
room:"Yankara"
89+
room:"Yankara",
90+
roomId:1
8591
){
8692
response
8793
}

fixtures/events/end_event_fixtures.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
end_event_mutation = '''mutation {
22
endEvent(calendarId:"[email protected]",
33
eventId:"test_id5",
4+
organizerEmail:"[email protected]",
5+
roomId:1,
46
startTime:"2018-07-10T09:00:00Z",
57
endTime:"2018-07-10T09:45:00Z",
68
meetingEndTime: "2018-07-10T09:45:00Z"){
@@ -43,6 +45,8 @@
4345
endEvent(calendarId:"[email protected]",
4446
eventId:"test_id5",
4547
startTime:"2018-07-11T09:00:00Z",
48+
organizerEmail:"[email protected]",
49+
roomId:1,
4650
endTime:"2018-07-11T09:45:00Z",
4751
meetingEndTime: "2018-07-11T09:45:00Z"){
4852
event{
@@ -69,6 +73,8 @@
6973
endEvent(calendarId:"invalid_calendar_id",
7074
eventId:"test_id5",
7175
startTime:"2018-08-11T09:00:00Z",
76+
organizerEmail:"[email protected]",
77+
roomId:1,
7278
endTime:"2018-08-11T09:45:00Z",
7379
meetingEndTime: "2018-08-11T09:45:00Z"){
7480
event{

helpers/calendar/events.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ def sync_single_room_events(self, room):
189189
recurring_event_id=event.get("recurringEventId"),
190190
room_id=room.id,
191191
event_title=event.get("summary"),
192+
organizer_email=organizer.get('email'),
192193
start_time=event["start"].get(
193194
"dateTime") or event["start"].get("date"),
194195
end_time=event["end"].get(

helpers/event/slack_notifier.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22
import celery
33
from config import Config
44

5-
"""
6-
This function call slack bot url
7-
"""
8-
95

106
@celery.task(name="notify-slack")
11-
def notify_slack(event_id):
12-
responce = requests.get(url=Config.NOTIFY_URL + event_id)
13-
return(responce.status_code)
7+
def notify_slack(event_id, organizer_email, room_id):
8+
"""
9+
This function calls the slack BOT URL
10+
and notifies the organizer.
11+
"""
12+
params_data = {
13+
"event_id": event_id,
14+
"organizer_email": organizer_email,
15+
"room_id": room_id
16+
}
17+
response = requests.get(url=Config.NOTIFY_URL, params=params_data)
18+
return(response.status_code)

helpers/events_filter/events_filter.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77

88
utc = pytz.utc
9+
timezone = pytz.timezone
910

1011

1112
def validate_date_input(start_date, end_date):
@@ -97,14 +98,15 @@ def date_time_format_validator(date_text, time_text):
9798
raise ValueError("start time should be in this format: 'HH:MM'")
9899

99100

100-
def calendar_dates_format(start_date, start_time, duration):
101+
def calendar_dates_format(start_date, start_time, duration, time_zone):
101102
"""Converts user date, time and duration input into start_date
102103
and end_date format that is acceptable by the Google Calendar API
103104
104105
Args:
105106
start_date: Date string of the day of the event
106107
start_time: Time sting of the time of the event
107108
duration: A float of the duration of the event
109+
time_zone: The timezone of the event location eg. 'Africa/Kigali'
108110
109111
Returns:
110112
start_date and end_date in this format "%Y-%m-%dT%H:%M:%S".
@@ -121,7 +123,7 @@ def calendar_dates_format(start_date, start_time, duration):
121123

122124
end_date = start_date + timedelta(minutes=duration)
123125

124-
start_date = start_date.strftime('%Y-%m-%dT%H:%M:%S')
125-
end_date = end_date.strftime('%Y-%m-%dT%H:%M:%S')
126+
start_date = start_date.replace(tzinfo=timezone(time_zone)).isoformat()
127+
end_date = end_date.replace(tzinfo=timezone(time_zone)).isoformat()
126128

127129
return (start_date, end_date)

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,4 @@ coveralls==1.8.2
4040
validators==0.12.4
4141
graphql-core==2.2.1
4242
requests==2.22.0
43+
graphql-core==2.2.1

tests/base.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ def setUp(self, mock_verify_calendar_id):
142142
event_id="test_id5",
143143
room_id=1,
144144
event_title="Onboarding",
145+
organizer_email="[email protected]",
145146
start_time="2018-07-11T09:00:00Z",
146147
end_time="2018-07-11T09:45:00Z",
147148
number_of_participants=4,
@@ -211,18 +212,18 @@ def setUp(self, mock_verify_calendar_id):
211212
)
212213
structure.save()
213214
parent_node = OfficeStructure(
214-
id='C56A4180-65AA-42EC-A945-5FD21DEC0518',
215-
name='Epic Tower',
216-
tag='Lagos Building',
217-
location_id=1
215+
id='C56A4180-65AA-42EC-A945-5FD21DEC0518',
216+
name='Epic Tower',
217+
tag='Lagos Building',
218+
location_id=1
218219
)
219220
parent_node.save()
220221
child_node = OfficeStructure(
221-
id='C56A4180-65AA-42EC-A945-5FD21DEC0519',
222-
name='Gold Coast',
223-
tag='First Floor',
224-
parent_id='C56A4180-65AA-42EC-A945-5FD21DEC0518',
225-
location_id=1
222+
id='C56A4180-65AA-42EC-A945-5FD21DEC0519',
223+
name='Gold Coast',
224+
tag='First Floor',
225+
parent_id='C56A4180-65AA-42EC-A945-5FD21DEC0518',
226+
location_id=1
226227
)
227228
child_node.save()
228229
db_session.commit()

0 commit comments

Comments
 (0)