class MatchManipulator(ManipulatorBase): """ Handle Match database writes. """ @classmethod def getCacheKeysAndControllers(cls, affected_refs): return CacheClearer.get_match_cache_keys_and_controllers(affected_refs) @classmethod def postDeleteHook(cls, matches): ''' To run after the match has been deleted. ''' for match in matches: try: FirebasePusher.delete_match(match) except Exception: logging.warning("Enqueuing Firebase delete failed!") @classmethod def postUpdateHook(cls, matches, updated_attr_list, is_new_list): ''' To run after the match has been updated. Send push notifications to subscribed users Only if the match is part of an active event ''' unplayed_match_events = [] for (match, updated_attrs, is_new) in zip(matches, updated_attr_list, is_new_list): event = match.event.get() # Only continue if the event is currently happening if event.within_a_day: if match.has_been_played: if is_new or 'alliances_json' in updated_attrs: # There is a score update for this match, push a notification logging.info("Sending push notifications for {}".format(match.key_name)) try: NotificationHelper.send_match_score_update(match) except Exception, exception: logging.error("Error sending match updates: {}".format(exception)) logging.error(traceback.format_exc()) else: if is_new or (set(['alliances_json', 'time', 'time_string']).intersection(set(updated_attrs)) != set()): # The match has not been played and we're changing a property that affects the event's schedule # So send a schedule update notification for the parent event if event not in unplayed_match_events: unplayed_match_events.append(event) ''' If we have an unplayed match during an event within a day, send out a schedule update notification ''' for event in unplayed_match_events: try: logging.info("Sending schedule updates for: {}".format(event.key_name)) NotificationHelper.send_schedule_update(event) except Exception, exception: logging.error("Eror sending schedule updates for: {}".format(event.key_name))
if '_video_added' in updated_attrs: try: NotificationHelper.send_match_video(match) except Exception, exception: logging.error( "Error sending match video updates: {}".format( exception)) logging.error(traceback.format_exc()) ''' If we have an unplayed match during an event within a day, send out a schedule update notification ''' for event in unplayed_match_events: try: logging.info("Sending schedule updates for: {}".format( event.key_name)) NotificationHelper.send_schedule_update(event) except Exception, exception: logging.error("Eror sending schedule updates for: {}".format( event.key_name)) ''' Enqueue firebase push ''' affected_stats_event_keys = set() for (match, updated_attrs, is_new) in zip(matches, updated_attr_list, is_new_list): # Only attrs that affect stats if is_new or set(['alliances_json', 'score_breakdown_json' ]).intersection(set(updated_attrs)) != set(): affected_stats_event_keys.add(match.event.id()) try: FirebasePusher.update_match(match)
# Try to send video notifications if '_video_added' in updated_attrs: try: NotificationHelper.send_match_video(match) except Exception, exception: logging.error("Error sending match video updates: {}".format(exception)) logging.error(traceback.format_exc()) ''' If we have an unplayed match during an event within a day, send out a schedule update notification ''' for event in unplayed_match_events: try: logging.info("Sending schedule updates for: {}".format(event.key_name)) NotificationHelper.send_schedule_update(event) except Exception, exception: logging.error("Eror sending schedule updates for: {}".format(event.key_name)) ''' Enqueue firebase push ''' affected_stats_event_keys = set() for (match, updated_attrs, is_new) in zip(matches, updated_attr_list, is_new_list): # Only attrs that affect stats if is_new or set(['alliances_json', 'score_breakdown_json']).intersection(set(updated_attrs)) != set(): affected_stats_event_keys.add(match.event.id()) try: FirebasePusher.update_match(match) except Exception: logging.warning("Firebase update_match failed!")