|
15 | 15 | from helpers.remote_rooms.remote_rooms_location import (
|
16 | 16 | map_remote_room_location_to_filter
|
17 | 17 | )
|
18 |
| -from helpers.calendar.credentials import get_google_api_calendar_list |
| 18 | +from helpers.calendar.credentials import (get_google_api_calendar_list, |
| 19 | + credentials |
| 20 | + ) |
| 21 | +from helpers.events_filter.events_filter import (convert_date, |
| 22 | + validate_date_input, |
| 23 | + format_range_dates, |
| 24 | + format_range_time, |
| 25 | + empty_string_checker |
| 26 | + ) |
19 | 27 | from api.room.schema import (RatioOfCheckinsAndCancellations,
|
20 | 28 | BookingsAnalyticsCount)
|
21 | 29 |
|
@@ -109,6 +117,15 @@ class PaginatedEvents(graphene.ObjectType):
|
109 | 117 | pages = graphene.Int()
|
110 | 118 |
|
111 | 119 |
|
| 120 | +class AvailableRooms(graphene.ObjectType): |
| 121 | + id = graphene.String() |
| 122 | + name = graphene.String() |
| 123 | + |
| 124 | + |
| 125 | +class AllAvailableRooms(graphene.ObjectType): |
| 126 | + availableRoom = graphene.List(AvailableRooms) |
| 127 | + |
| 128 | + |
112 | 129 | class Query(graphene.ObjectType):
|
113 | 130 | """
|
114 | 131 | Returns paginated rooms
|
@@ -308,6 +325,90 @@ def resolve_all_remote_rooms(self, info, return_all=None):
|
308 | 325 | if not re.search(match, room.name)]
|
309 | 326 | return AllRemoteRooms(rooms=actual_rooms)
|
310 | 327 |
|
| 328 | + all_available_rooms = graphene.Field( |
| 329 | + AllAvailableRooms, |
| 330 | + start_date=graphene.String(required=True), |
| 331 | + start_time=graphene.String(required=True), |
| 332 | + end_date=graphene.String(required=True), |
| 333 | + end_time=graphene.String(required=True), |
| 334 | + time_zone=graphene.String(required=True), |
| 335 | + description="Returns available rooms in a given period \ |
| 336 | + \n- start_time: Start time and date when you want to book room from\ |
| 337 | + [required]\n- end_time: time and date you want to book room upto\ |
| 338 | + [required]\n time_zone: The time zone of the location\ |
| 339 | + [required]\n location: The location of the office's \ |
| 340 | + room you want to book" |
| 341 | + ) |
| 342 | + |
| 343 | + @Auth.user_roles('Admin', 'Super Admin') |
| 344 | + def resolve_all_available_rooms(self, info, **kwargs): |
| 345 | + |
| 346 | + time_zone = kwargs['time_zone'] |
| 347 | + empty_string_checker(time_zone) |
| 348 | + validate_date_input(kwargs['start_date'], kwargs['end_date']) |
| 349 | + validate_date_input(kwargs['start_time'], kwargs['end_time']) |
| 350 | + format_range_dates(kwargs['start_date'], kwargs['end_date']) |
| 351 | + format_range_time(kwargs['start_time'], kwargs['end_time']) |
| 352 | + |
| 353 | + start_time = convert_date(kwargs['start_date'], |
| 354 | + kwargs['start_time'], |
| 355 | + time_zone |
| 356 | + ) |
| 357 | + end_time = convert_date(kwargs['end_date'], |
| 358 | + kwargs['end_time'], |
| 359 | + time_zone |
| 360 | + ) |
| 361 | + |
| 362 | + # list of all remote rooms in a user's location |
| 363 | + locational_remote_rooms = Query.resolve_all_remote_rooms( |
| 364 | + self, info, return_all=False) |
| 365 | + all_rooms = [] |
| 366 | + for room in locational_remote_rooms.rooms: |
| 367 | + all_rooms.append({ |
| 368 | + "id": room.calendar_id, |
| 369 | + "name": room.name |
| 370 | + }) |
| 371 | + |
| 372 | + # list of all remote rooms and |
| 373 | + # for each room shows whether it is free or busy in a given period. |
| 374 | + service = credentials.set_api_credentials() |
| 375 | + all_calendars = get_google_api_calendar_list()['items'] |
| 376 | + all_remote_rooms = [] |
| 377 | + for room in all_calendars: |
| 378 | + free_busy_rooms_request_object = { |
| 379 | + "timeMin": start_time, |
| 380 | + "timeMax": end_time, |
| 381 | + "timeZone": time_zone, |
| 382 | + "items": [ |
| 383 | + { |
| 384 | + "id": room['id'] |
| 385 | + } |
| 386 | + ] |
| 387 | + } |
| 388 | + res = service.freebusy().query( |
| 389 | + body=free_busy_rooms_request_object |
| 390 | + ).execute() |
| 391 | + all_remote_rooms.append(res[u'calendars']) |
| 392 | + |
| 393 | + # all busy remote rooms in a given period |
| 394 | + busy_rooms = [key for element in all_remote_rooms for key, |
| 395 | + value in element.items() if len(value["busy"]) != 0] |
| 396 | + |
| 397 | + # all available rooms in a user's location in a given period |
| 398 | + available_rooms = [room for room in all_rooms if room[ |
| 399 | + 'id' |
| 400 | + ] not in busy_rooms] |
| 401 | + all_available_rooms = [AvailableRooms(room['id'], |
| 402 | + room['name'] |
| 403 | + ) for room in available_rooms] |
| 404 | + |
| 405 | + def raise_no_available_rooms(): |
| 406 | + raise GraphQLError("No available rooms at the moment") |
| 407 | + |
| 408 | + return AllAvailableRooms( |
| 409 | + availableRoom=all_available_rooms |
| 410 | + ) if available_rooms else raise_no_available_rooms() |
| 411 | + |
311 | 412 | @Auth.user_roles('Admin', 'Super Admin')
|
312 | 413 | def resolve_filter_rooms_by_tag(self, info, tagId):
|
313 | 414 | rooms = Room.get_query(info).join(tags).join(
|
|
0 commit comments