def postUpdateHook(cls, events, updated_attr_list, is_new_list):
        """
        To run after models have been updated
        """
        for (event, updated_attrs) in zip(events, updated_attr_list):
            # Disabled due to unreliability. 2017-01-24 -fangeugene
            # try:
            #     LocationHelper.update_event_location(event)
            # except Exception, e:
            #     logging.error("update_event_location for {} errored!".format(event.key.id()))
            #     logging.exception(e)

            try:
                if event.normalized_location and event.normalized_location.lat_lng:
                    timezone_id = LocationHelper.get_timezone_id(
                        None, lat_lng=event.normalized_location.lat_lng)
                    if not timezone_id:
                        logging.warning("Timezone update for event {} failed!".format(event.key_name))
                    else:
                        event.timezone_id = timezone_id
                else:
                    logging.warning("No Lat/Lng to update timezone_id for event {}!".format(event.key_name))
            except Exception, e:
                logging.error("Timezone update for {} errored!".format(event.key.id()))
                logging.exception(e)

            try:
                SearchHelper.update_event_location_index(event)
            except Exception, e:
                logging.error("update_event_location_index for {} errored!".format(event.key.id()))
                logging.exception(e)
    def postUpdateHook(cls, events, updated_attr_list, is_new_list):
        """
        To run after models have been updated
        """
        for (event, updated_attrs) in zip(events, updated_attr_list):
            # Disabled due to unreliability. 2017-01-24 -fangeugene
            # try:
            #     LocationHelper.update_event_location(event)
            # except Exception, e:
            #     logging.error("update_event_location for {} errored!".format(event.key.id()))
            #     logging.exception(e)

            try:
                if event.normalized_location and event.normalized_location.lat_lng:
                    timezone_id = LocationHelper.get_timezone_id(
                        None, lat_lng=event.normalized_location.lat_lng)
                    if not timezone_id:
                        logging.warning("Timezone update for event {} failed!".format(event.key_name))
                    else:
                        event.timezone_id = timezone_id
                else:
                    logging.warning("No Lat/Lng to update timezone_id for event {}!".format(event.key_name))
            except Exception, e:
                logging.error("Timezone update for {} errored!".format(event.key.id()))
                logging.exception(e)

            try:
                SearchHelper.update_event_location_index(event)
            except Exception, e:
                logging.error("update_event_location_index for {} errored!".format(event.key.id()))
                logging.exception(e)
class EventManipulator(ManipulatorBase):
    """
    Handle Event database writes.
    """
    @classmethod
    def getCacheKeysAndControllers(cls, affected_refs):
        return CacheClearer.get_event_cache_keys_and_controllers(affected_refs)

    @classmethod
    def postDeleteHook(cls, events):
        '''
        To run after the event has been deleted.
        '''
        for event in events:
            SearchHelper.remove_event_location_index(event)

    @classmethod
    def postUpdateHook(cls, events, updated_attr_list, is_new_list):
        """
        To run after models have been updated
        """
        for (event, updated_attrs) in zip(events, updated_attr_list):
            try:
                LocationHelper.update_event_location(event)
            except Exception, e:
                logging.error("update_event_location for {} errored!".format(
                    event.key.id()))
                logging.exception(e)

            try:
                if event.normalized_location and event.normalized_location.lat_lng:
                    timezone_id = LocationHelper.get_timezone_id(
                        None, lat_lng=event.normalized_location.lat_lng)
                    if not timezone_id:
                        logging.warning(
                            "Timezone update for event {} failed!".format(
                                event.key_name))
                    else:
                        event.timezone_id = timezone_id
                else:
                    logging.warning(
                        "No Lat/Lng to update timezone_id for event {}!".
                        format(event.key_name))
            except Exception, e:
                logging.error("Timezone update for {} errored!".format(
                    event.key.id()))
                logging.exception(e)

            try:
                SearchHelper.update_event_location_index(event)
            except Exception, e:
                logging.error(
                    "update_event_location_index for {} errored!".format(
                        event.key.id()))
                logging.exception(e)