def retrieve_cancellations_and_checkins_for_room(self, calendar_id, start_date, day_after_end_date, checkins, cancellations, events_list): # noqa """ Retrieve cancellations and checkins for a room :params - calendar_id, start_date, day_after_end_date, checkins,cancellations, output """ calendar_events = CommonAnalytics.get_all_events_in_a_room( self, calendar_id, start_date, day_after_end_date) if calendar_events: for event in calendar_events: if event.get('attendees'): event_details = CommonAnalytics.get_event_details( self, event, calendar_id) events_list.append(event_details) room_id = RoomModel.query.filter_by( calendar_id=calendar_id, ).first().id # noqa checkins += (Events.query.filter( Events.room_id == room_id, Events.checked_in == True, Events.start_time >= start_date, Events.end_time < day_after_end_date)).count() # noqa cancellations += (Events.query.filter( Events.room_id == room_id, Events.cancelled == True, Events.start_time >= start_date, Events.end_time < day_after_end_date)).count() # noqa return checkins, cancellations, events_list
def get_events_number_meetings_room_analytics(self, query, start_date, end_date): # noqa: E501 """ Get events in rooms and number of meetings per room :params - query - start_date, end_date(Time range) """ start_date, end_date = CommonAnalytics.convert_dates( self, start_date, end_date) rooms_available = CommonAnalytics.get_calendar_id_name( self, query) result, number_of_meetings = [], [] for room in rooms_available: calendar_events = CommonAnalytics.get_all_events_in_a_room( self, room['calendar_id'], start_date, end_date) output = [] if not calendar_events: output.append({'RoomName': room['name'], 'has_events': False}) number_of_meetings.append(0) else: for event in calendar_events: if event.get('attendees'): event_details = CommonAnalytics.get_event_details(self, event, room['calendar_id']) # noqa: E501 output.append(event_details) number_of_meetings.append(len(output)) result.append(output) return (result, number_of_meetings)
def get_booked_rooms(self, query, start_date, end_date): # noqa: E501 """ Get booked room per given period of time and their percentages :params - query - start_date, end_date(Time range) """ start_date, end_date = CommonAnalytics.convert_dates( self, start_date, end_date) rooms_available = CommonAnalytics.get_room_details( self, query) result = [] bookings = 0 for room in rooms_available: all_events_in_all_rooms = CommonAnalytics.get_all_events_in_a_room( self, room['room_id'], start_date, end_date) if all_events_in_all_rooms: bookings += len(all_events_in_all_rooms) for room in rooms_available: all_events = CommonAnalytics.get_all_events_in_a_room( self, room['room_id'], start_date, end_date) if all_events: room_details = RoomStatistics( room_name=room["name"], meetings=len(all_events), percentage=(len(all_events))/bookings*100) result.append(room_details) result.sort(key=lambda x: x.meetings, reverse=True) else: return result return result
def get_analytics_ratios_per_room(self, query, start, end): """ Get ratios of checkings/cancellations to bookings per room. :params - start_date, end_date """ start_date, day_after_end_date = CommonAnalytics.convert_dates( self, start, end) rooms = CommonAnalytics.get_calendar_id_name(self, query) response = [] for room in rooms: events_list = [] checkins = 0 cancellations = 0 checkins, cancellations, events_list = RoomAnalyticsRatios.retrieve_cancellations_and_checkins_for_room( self, # noqa room['calendar_id'], start_date, day_after_end_date, checkins, cancellations, events_list) ratio_object = RoomAnalyticsRatios.map_results_to_ratio_class( self, # noqa checkins, cancellations, events_list, room['name']) response.append(ratio_object) return response
def get_events_number_meetings_room_analytics(self, query, start_date, end_date): # noqa: E501 """ Get events in rooms and number of meetings per room :params - query - start_date, end_date(Time range) """ start_date, end_date = CommonAnalytics.convert_dates( self, start_date, end_date) rooms_available = CommonAnalytics.get_room_details( self, query) result, number_of_meetings = [], [] for room in rooms_available: all_events = CommonAnalytics.get_all_events_in_a_room( self, room['room_id'], start_date, end_date) output = [] if not all_events: output.append({'roomName': room['name']}) number_of_meetings.append(0) else: for event in all_events: if event['participants']: event_details = CommonAnalytics.get_event_details( self, query, event, room['room_id']) output.append(event_details) number_of_meetings.append(len(output)) result.append(output) return (result, number_of_meetings)
def get_bookings_analytics_count(self, query, start, end, room_id=None): results = [] start_date, day_after_end_date = CommonAnalytics.convert_dates( self, start, end) start_dt = dateutil.parser.parse(start_date) end_dt = dateutil.parser.parse(day_after_end_date) number_of_days = (end_dt - start_dt).days room_name = get_room_name(room_id) if number_of_days <= 30: dates = CommonAnalytics.get_list_of_dates( start, number_of_days) for date in dates: bookings = CommonAnalytics.get_total_bookings( self, query, date[0], date[1], room_id=room_id) string_date = dateutil.parser.parse( date[0]).strftime("%b %d %Y") output = BookingsAnalyticsCount( period=string_date, bookings=bookings, room_name=room_name) results.append(output) else: dates = CommonAnalytics.get_list_of_month_dates( start_date, start_dt, day_after_end_date, end_dt) for date in dates: bookings = CommonAnalytics.get_total_bookings( self, query, date[0], date[1], room_id=room_id) string_month = dateutil.parser.parse(date[0]).strftime("%B") output = BookingsAnalyticsCount( period=string_month, bookings=bookings, room_name=room_name) results.append(output) return results
def get_analytics_ratios(self, query, start, end): """ Get ratios of checkings/cancellations to bookings for all rooms. :params - start_date, end_date """ start_date, day_after_end_date = CommonAnalytics.validate_current_date( self, start, end) rooms = CommonAnalytics.get_room_details( self, query) checkins = 0 cancellations = 0 calendar_events_list = [] app_events_list = [] for room in rooms: checkins, cancellations, calendar_events_list, app_events_list = RoomAnalyticsRatios().retrieve_cancellations_and_checkins_for_room(room['room_id'], # noqa start_date, day_after_end_date, checkins, cancellations, calendar_events_list, app_events_list) ratio_object = RoomAnalyticsRatios().map_results_to_ratio_class( checkins=checkins, cancellations=cancellations, calendar_events_list=calendar_events_list, app_events_list=app_events_list) return ratio_object
def meetings_duration_statistics(self, query, start_date, end_date): # noqa: E501 """ Get meeting durations statistics """ rooms = CommonAnalytics.get_calendar_id_name(self, query) result = [] for room in rooms: events = CommonAnalytics.get_all_events_in_a_room( self, room['calendar_id'], start_date, end_date) # noqa: E501 events_duration = [] for event in events: start = event['start'].get( 'dateTime', event['start'].get('date')) # noqa: E501 end = event['end'].get('dateTime', event['end'].get('date')) duration = CommonAnalytics.get_time_duration_for_event( self, start, end) # noqa: E501 events_duration.append(duration) events_count = Counter(events_duration) events_in_minutes = [ EventsDuration( duration_in_minutes=events_duration, number_of_meetings=events_count[events_duration]) for index, events_duration in enumerate(events_count) ] output = RoomStatistics(room_name=room["name"], count=len(events_duration), total_duration=sum(events_duration), events=events_in_minutes) result.append(output) return result
def get_monthly_rooms_events(self, query, month, year): """ Get event stats for all rooms in a specified month :params - month, year """ date = month + ' 1 ' + str(year) startdate = CommonAnalytics.convert_date(self, date) date_after_month = ( datetime.strptime(date, '%b %d %Y') + relativedelta(months=1)).isoformat() + 'Z' # noqa: E501 rooms_available = CommonAnalytics.get_calendar_id_name(self, query) room_events_count = [] events_in_all_rooms = [] for room in rooms_available: calendar_events = CommonAnalytics.get_all_events_in_a_room( self, room['calendar_id'], startdate, date_after_month) output = [] if not calendar_events: output.append({'RoomName': room['name'], 'has_events': False}) room_with_no_events = 0 room_events_count.append(room_with_no_events) else: for event in calendar_events: if event.get('attendees'): event_details = CommonAnalytics.get_event_details( self, event, room['calendar_id']) output.append(event_details) room_events_count.append(len(output)) events_in_all_rooms.append(output) return dict(events_in_all_rooms=events_in_all_rooms, room_events_count=room_events_count)
def resolve_all_events(self, info, **kwargs): page = kwargs.get('page') per_page = kwargs.get('per_page') if page is not None and page < 1: raise GraphQLError("page must be at least 1") if per_page is not None and per_page < 1: raise GraphQLError("perPage must be at least 1") if page and not per_page: raise GraphQLError("perPage argument missing") if per_page and not page: raise GraphQLError("page argument missing") user = get_user_from_db() start_date, end_date = CommonAnalytics.all_analytics_date_validation( self, kwargs['start_date'], kwargs['end_date'] ) query = Events.get_query(info) all_events, all_dates = CommonAnalytics.get_all_events_and_dates( query, start_date, end_date ) events_in_location = CalendarEvents().get_events_in_location( user, all_events) all_days_events = [] for date in set(all_dates): daily_events = [] for event in events_in_location: CommonAnalytics.format_date(event.start_time) event_start_date = parser.parse( event.start_time).astimezone(pytz.utc) day_of_event = event_start_date.strftime("%a %b %d %Y") if date == day_of_event: daily_events.append(event) all_days_events.append( DailyRoomEvents( day=date, events=daily_events ) ) all_days_events.sort(key=lambda x: datetime.strptime(x.day, "%a %b %d %Y"), reverse=True) # noqa if page and per_page: paginated_events = ListPaginate( iterable=all_days_events, per_page=per_page, page=page) has_previous = paginated_events.has_previous has_next = paginated_events.has_next current_page = paginated_events.current_page pages = paginated_events.pages query_total = paginated_events.query_total return PaginatedDailyRoomEvents( DailyRoomEvents=current_page, has_previous=has_previous, has_next=has_next, query_total=query_total, pages=pages) return PaginatedDailyRoomEvents(DailyRoomEvents=all_days_events)
def get_least_used_room_day(self, query, day): """ Get event stats for all rooms in a specified day :params - day """ day_start, day_end = CommonAnalytics.get_start_end_day_dates(self, day) rooms_available = CommonAnalytics.get_calendar_id_name(self, query) return RoomAnalytics.get_least_used_rooms(self, rooms_available, day_start, day_end) # noqa: E501
def get_weekly_meetings_details(self, query, week_start, week_end): # noqa: E501 """ Get weekly meeting durations details """ week_start = CommonAnalytics.convert_date(self, week_start) week_end, day_after = CommonAnalytics.get_start_end_day_dates( self, week_end) # noqa: E501 weekly_analytics = RoomAnalytics.meetings_duration_statistics( self, query, week_start, day_after) # noqa: E501 return weekly_analytics
def get_meetings_per_room(self, query, timeMin, timeMax): day_start = CommonAnalytics.convert_date(self, timeMin) day_end = CommonAnalytics.convert_date(self, timeMax) rooms_available = CommonAnalytics.get_calendar_id_name(self, query) res = [] for room in rooms_available: calendar_events = CommonAnalytics.get_all_events_in_a_room( self, room['calendar_id'], day_start, day_end) room_details = RoomStatistics( room_name=room["name"], count=len(calendar_events)) # noqa: E501 res.append(room_details) return res
def get_least_used_room_week(self, query, week_start, week_end): # noqa: E501 """ Get analytics for least used room per week :params - calendar_id - week_start, week_end(Time range) """ week_start = CommonAnalytics.convert_date(self, week_start) week_end = CommonAnalytics.convert_date(self, week_end) rooms_available = CommonAnalytics.get_calendar_id_name(self, query) return RoomAnalytics.get_least_used_rooms(self, rooms_available, week_start, week_end) # noqa: E501
def write_analytics_to_html(self, query, start_date, end_date): report_data_frame = AnalyticsReport.generate_combined_analytics_report( self, query, start_date, end_date) start_date_formatted = CommonAnalytics.format_date(start_date) end_date_formatted = CommonAnalytics.format_date(end_date) WriteFile.write_to_html_file( report_data_frame['Most Used Rooms'], report_data_frame['Least Used Rooms'], '<h1>Room Analytics Report Summary</h1><p> <h2>Report Period: From ' + start_date_formatted + ' to ' + end_date_formatted + '</h2>', # noqa 'templates/analytics_report.html' ) rendered = render_template('analytics_report.html') return rendered
def get_all_rooms_summary(self, query, start_date, end_date): ''' Get a summarry data for all rooms in a dataframe ''' rooms_available = CommonAnalytics.get_room_details(self, query) all_rooms_data_df = AnalyticsReport.get_dataframe( self, rooms_available, start_date, end_date) rooms_no_meetings_df = all_rooms_data_df.loc[ lambda all_rooms_data_df: all_rooms_data_df[ 'minutes'] == 0].rename(columns={ 'roomName': 'Room' }).assign(Meetings=0) rooms_no_meetings_df = rooms_no_meetings_df[['Room', 'Meetings']] rooms_with_meeting_df = all_rooms_data_df[ all_rooms_data_df['minutes'] != 0]['roomName'].value_counts( ).rename_axis('Room').reset_index(name='Meetings') rooms_summary_df = pd.concat( [rooms_no_meetings_df, rooms_with_meeting_df]) rooms_summary_df['% Share of All Meetings'] = round( rooms_summary_df['Meetings'] / rooms_summary_df['Meetings'].sum() * 100) return rooms_summary_df
def retrieve_cancellations_and_checkins_for_room(self, room_id, start_date, day_after_end_date, checkins, cancellations, calendar_events_list, app_events_list): """ Retrieve cancellations and checkins for a room :params - room_id, start_date, day_after_end_date, checkins,cancellations, output """ all_events = CommonAnalytics.get_all_events_in_a_room( self, room_id, start_date, day_after_end_date) if all_events: for event in all_events: if event.number_of_participants: calendar_events_list.append(event) room_id = RoomModel.query.filter_by(id=room_id).first().id checkins += (Events.query.filter(Events.room_id == room_id, Events.checked_in == True, Events.start_time >= start_date, Events.end_time < day_after_end_date)).count() # noqa cancellations += (Events.query.filter(Events.room_id == room_id, Events.cancelled == True, Events.start_time >= start_date, Events.end_time < day_after_end_date)).count() # noqa return checkins, cancellations, calendar_events_list, app_events_list
def get_meetings_per_room_analytics(self, query, start_date, end_date): """ Get analytics for meetings per room :params - query - start_date, end_date(Time range) """ start_date, end_date = CommonAnalytics.convert_dates( self, start_date, end_date) rooms_available = CommonAnalytics.get_room_details( self, query) res = [] for room in rooms_available: all_events = CommonAnalytics.get_all_events_in_a_room( self, room['room_id'], start_date, end_date) room_details = RoomStatistics(room_name=room["name"], count=len(all_events)) # noqa: E501 res.append(room_details) return res
def get_daily_meetings_details(self, query, day): # noqa: E501 """ Get daily meetings durations details """ start_date, day_after = CommonAnalytics.get_start_end_day_dates( self, day) # noqa daily_analytics = RoomAnalytics.meetings_duration_statistics( self, query, start_date, day_after) # noqa: E501 return daily_analytics
def bookings_count(self, unconverted_dates, events): """ Get bookings count and period in a given room """ start_date = unconverted_dates['start'] day_after_end_date = unconverted_dates['end'] parsed_start_date = dateutil.parser.parse(start_date) parsed_end_date = dateutil.parser.parse(day_after_end_date) parsed_day_after_end_date = parsed_end_date + relativedelta(days=1) number_of_days = (parsed_day_after_end_date - parsed_start_date).days bookings_count = [] user_time_zone = CommonAnalytics.get_user_time_zone() if number_of_days <= 30: dates = CommonAnalytics.get_list_of_dates(start_date, number_of_days) for date in dates: bookings = 0 string_date = dateutil.parser.parse( date[0]).strftime("%b %d %Y") for event in events: start_timez = dateutil.parser.parse( event.start_time).astimezone( pytz.timezone(user_time_zone)) # noqa if start_timez.strftime("%b %d %Y") == string_date: bookings += 1 output = BookingsCount(period=string_date, total_bookings=bookings) bookings_count.append(output) else: dates = CommonAnalytics.get_list_of_month_dates( start_date, parsed_start_date, day_after_end_date, parsed_day_after_end_date) for date in dates: string_month = dateutil.parser.parse(date[0]).strftime("%b %Y") output = BookingsCount(period=string_month, total_bookings=0) for event in events: start_timez = dateutil.parser.parse( event.start_time).astimezone( pytz.timezone(user_time_zone)) # noqa if start_timez.strftime("%b %Y") == string_month: output.total_bookings += 1 bookings_count.append(output) return bookings_count
def resolve_all_analytics(self, info, **kwargs): start_date = kwargs.get('start_date') end_date = kwargs.get('end_date') location_id = admin_roles.user_location_for_analytics_view() admin_details = get_user_from_db() query = Role.get_query(info) admin_role = query.filter_by(id=admin_details.roles[0].id).first() # check that id is valid verify_location_id(kwargs) if admin_role.role == 'Super Admin' and kwargs.get( 'location_id', None): location_id = kwargs.get('location_id') unconverted_dates = { 'start': start_date, 'end': end_date, } start_date, end_date = CommonAnalytics.all_analytics_date_validation( self, start_date, end_date) query = Room.get_query(info) room_analytics, bookings, percentages_dict, bookings_count = AllAnalyticsHelper.get_all_analytics( # noqa self, query, start_date, end_date, location_id, unconverted_dates) analytics = [] for analytic in room_analytics: current_analytic = ConsolidatedAnalytics( room_name=analytic['room_name'], cancellations=analytic['cancellations'], cancellations_percentage=analytic['cancellations_percentage'], auto_cancellations=analytic['auto_cancellations'], number_of_bookings=analytic['number_of_meetings'], checkins=analytic['checkins'], checkins_percentage=analytic['checkins_percentage'], bookings_percentage_share=percentage_formater( analytic['num_of_events'], bookings), app_bookings=analytic['app_bookings'], app_bookings_percentage=analytic['app_bookings_percentage'], events=analytic['room_events'], ) analytics.append(current_analytic) return AllAnalytics(bookings=bookings, checkins_percentage=percentage_formater( percentages_dict['total_checkins'], bookings), auto_cancellations_percentage=percentage_formater( percentages_dict['total_auto_cancellations'], bookings), cancellations_percentage=percentage_formater( percentages_dict['total_cancellations'], bookings), app_bookings_percentage=percentage_formater( percentages_dict['total_app_bookings'], bookings), bookings_count=bookings_count, analytics=analytics)
def get_most_used_rooms_analytics(self, query, start_date, end_date): # noqa: E501 """ Get analytics for most used room :params - query - start_date, end_date(Time range) """ events_in_rooms, number_of_meetings = RoomAnalytics.get_events_number_meetings_room_analytics( # noqa: E501 self, query, start_date, end_date) analytics = CommonAnalytics.get_room_statistics( self, max(number_of_meetings), events_in_rooms) return analytics
def get_meeting_duration_of_room_per_month(self, query, month, year): # noqa """ Get analytics for thetotal meeting duration of room(s) per morth in a location :params - month, year """ start_date, day_after = CommonAnalytics.get_start_end_month_dates( self, month, year) # noqa monthly_analytics = RoomAnalytics.meetings_duration_statistics( self, query, start_date, day_after) # noqa: E501 return monthly_analytics
def get_analytics_ratios_per_room(self, query, start, end, **kwargs): """ Get ratios of checkings/cancellations to bookings per room. :params - start_date, end_date, room_id """ room_id = kwargs.get('room_id') start_date, day_after_end_date = CommonAnalytics.validate_current_date( self, start, end) rooms = CommonAnalytics.get_room_details( self, query) response = [] for room in rooms: checkins = 0 cancellations = 0 calendar_events_list = [] app_events_list = [] checkins, cancellations, calendar_events_list, app_events_list = RoomAnalyticsRatios().retrieve_cancellations_and_checkins_for_room(room['room_id'], # noqa start_date, day_after_end_date, checkins, cancellations, calendar_events_list, app_events_list) ratio_object = RoomAnalyticsRatios().map_results_to_ratio_class( checkins=checkins, cancellations=cancellations, calendar_events_list=calendar_events_list, app_events_list=app_events_list, room_name=room['name'], room_id=room['room_id']) if room_id == ratio_object.room_id: return ratio_object response.append(ratio_object) return response
def get_most_used_room_week(self, query, week_start, week_end): # noqa: E501 """ Get analytics for most used room per week :params - calendar_id - week_start, week_end(Time range) """ week_start = CommonAnalytics.convert_date(self, week_start) week_end = CommonAnalytics.convert_date(self, week_end) rooms_available = CommonAnalytics.get_calendar_id_name(self, query) res = [] number_of_most_events = 0 for room in rooms_available: calendar_events = CommonAnalytics.get_all_events_in_a_room( self, room['calendar_id'], week_start, week_end) output = [] if not calendar_events: output.append({'RoomName': room['name'], 'has_events': False}) number_of_most_events = 0 else: for event in calendar_events: event_details = CommonAnalytics.get_event_details( self, event, room['calendar_id']) output.append(event_details) if len(output) > number_of_most_events: number_of_most_events = len(output) res.append(output) analytics = CommonAnalytics.get_room_statistics( self, number_of_most_events, res) return analytics
def get_most_used_room_per_month(self, query, month, year): """ Get analytics for the MOST used room(s) per morth in a location :params - month, year """ get_monthly_events = RoomAnalytics.get_monthly_rooms_events( self, query, month, year) rooms_with_max_events = max(get_monthly_events['room_events_count']) res = get_monthly_events['events_in_all_rooms'] analytics = CommonAnalytics.get_room_statistics( self, rooms_with_max_events, res) return analytics
def validate_date(self, request_data): ''' Validate date params ''' if 'end_date' not in request_data: request_data['end_date'] = None try: start_date, end_date = CommonAnalytics.convert_dates( self, request_data['start_date'], request_data['end_date']) # noqa: E501 return (start_date, end_date) except ValueError as err: raise JsonError(error=str(err), example='Sep 15 2018')
def get_least_used_rooms(self, rooms_available, time_start, time_end): res = [] number_of_least_events = float('inf') for room in rooms_available: calendar_events = CommonAnalytics.get_all_events_in_a_room( self, room['calendar_id'], time_start, time_end) output = [] if not calendar_events: output.append({'RoomName': room['name'], 'has_events': False}) number_of_least_events = 0 for event in calendar_events: if event.get('attendees'): event_details = CommonAnalytics.get_event_details( self, event, room['calendar_id']) # noqa: E501 output.append(event_details) if len(output) < number_of_least_events: number_of_least_events = len(output) res.append(output) analytics = CommonAnalytics.get_room_statistics( self, number_of_least_events, res) return analytics
def get_meetings_duration_analytics(self, query, start_date, end_date): # noqa: E501 """ Get analytics for meetings durations in rooms :params - query - start_date, end_date(Time range) """ start_date, end_date = CommonAnalytics.validate_current_date( self, start_date, end_date) rooms = CommonAnalytics.get_room_details( self, query) result = [] for room in rooms: events = CommonAnalytics.get_all_events_in_a_room( self, room['room_id'], start_date, end_date) events_duration = [] for event in events: start = event['event_start_time'] end = event['event_end_time'] duration = CommonAnalytics.get_time_duration_for_event(self, start, end) # noqa: E501 events_duration.append(duration) events_count = Counter(events_duration) events_in_minutes = [ EventsDuration( duration_in_minutes=events_duration, number_of_meetings=events_count[events_duration]) for index, events_duration in enumerate(events_count) ] output = RoomStatistics( room_name=room["name"], count=len(events_duration), total_duration=sum(events_duration), events=events_in_minutes ) result.append(output) return result
def get_all_rooms_summary(self, query, start_date, end_date): ''' Get a summarry data for all rooms in a dataframe ''' rooms_available = CommonAnalytics.get_calendar_id_name(self, query) all_rooms_data_df = AnalyticsReport.get_dataframe( self, rooms_available, start_date, end_date) rooms_summary_df = all_rooms_data_df['roomName'].value_counts( ).rename_axis( # noqa: E501 'Room').reset_index(name='Meetings') rooms_summary_df['% Share of All Meetings'] = round( rooms_summary_df['Meetings'] / rooms_summary_df['Meetings'].sum() * 100) # noqa: E501 return rooms_summary_df