def _get_computed_events(self, events, add_usernames=True, include_events=False): """ Get events for use in extended resource computed attribute @retval ComputedListValue with value list of 4-tuple with Event objects """ events = events or [] ret = IonObject(OT.ComputedEventListValue) ret.value = events ret.computed_list = [get_event_computed_attributes(event, include_event=include_events) for event in events] ret.status = ComputedValueAvailability.PROVIDED if add_usernames: try: actor_ids = {evt.actor_id for evt in events if evt.actor_id} log.debug("Looking up UserInfo for actors: %s" % actor_ids) if actor_ids: userinfo_list, assoc_list = self.clients.resource_registry.find_objects_mult(actor_ids, predicate=PRED.hasInfo, id_only=False) actor_map = {assoc.s: uinfo for uinfo, assoc in zip(userinfo_list, assoc_list)} for evt, evt_cmp in zip(events, ret.computed_list): ui = actor_map.get(evt.actor_id, None) if ui: evt_cmp["event_summary"] += " [%s %s]" % (ui.contact.individual_names_given, ui.contact.individual_name_family) except Exception as ex: log.exception("Cannot find user names for event actor_ids") return ret
def get_recent_events(self, resource_id='', limit=100): """ Get recent events for use in extended resource computed attribute @param resource_id str @param limit int @retval ComputedListValue with value list of 4-tuple with Event objects """ now = get_ion_ts() events = self.find_events(origin=resource_id, limit=limit, max_datetime=now, descending=True) ret = IonObject(OT.ComputedEventListValue) if events: ret.value = events ret.computed_list = [ get_event_computed_attributes(event) for event in events ] ret.status = ComputedValueAvailability.PROVIDED else: ret.status = ComputedValueAvailability.NOTAVAILABLE return ret
def get_events(self, resource_id='', limit=10, offset=0): """ Get events for use in extended resource computed attribute @param resource_id str @param limit int @param offset int @retval ComputedListValue with value list of 4-tuple with Event objects """ now = get_ion_ts() events = self.find_events(origin=resource_id, limit=limit, max_datetime=now, descending=True, offset=offset) ret = IonObject(OT.ComputedEventListValue) if events: ret.value = events ret.computed_list = [get_event_computed_attributes(event) for event in events] ret.status = ComputedValueAvailability.PROVIDED else: ret.status = ComputedValueAvailability.NOTAVAILABLE return ret
def get_events(self, resource_id='', limit=10, offset=0): """ Get events for use in extended resource computed attribute @param resource_id str @param limit int @param offset int @retval ComputedListValue with value list of 4-tuple with Event objects """ now = get_ion_ts() events = self.find_events(origin=resource_id, limit=limit, max_datetime=now, descending=True, offset=offset) ret = IonObject(OT.ComputedEventListValue) if events: ret.value = events ret.computed_list = [get_event_computed_attributes(event) for event in events] ret.status = ComputedValueAvailability.PROVIDED try: actor_ids = {evt.actor_id for evt in events if evt.actor_id} log.debug("Looking up UserInfo for actors: %s" % actor_ids) if actor_ids: #userinfo_list, assoc_list = self.clients.resource_registry.find_objects_mult(actor_ids, id_only=False) actor_map = {} for actor_id in actor_ids: # NOTE: This is an O(n) algorithm. Cannot use find_subjects_mult because it does not support # filter by predicate. Would get too many results uinfo_list, _ = self.clients.resource_registry.find_objects(actor_id, predicate=PRED.hasInfo, id_only=False) if uinfo_list: actor_map[actor_id] = uinfo_list[0] for evt, evt_cmp in zip(events, ret.computed_list): ui = actor_map.get(evt.actor_id, None) if ui: evt_cmp["event_summary"] += " [%s %s]" % (ui.contact.individual_names_given, ui.contact.individual_name_family) except Exception as ex: log.exception("Cannot find user names for event actor_ids") else: ret.status = ComputedValueAvailability.NOTAVAILABLE return ret