def serialize_eventusers(organization, item_list, user, lookup): if not item_list: return {} # We have no reliable way to map the tag value format # back into real EventUser rows. EventUser is only unique # per-project, and this is an organization aggregate. # This means a single value maps to multiple rows. filters = reduce( or_, [ Q(hash=EventUser.hash_from_tag(tag), project_id=project) for tag, project in item_list ], ) eu_by_key = {(eu.tag_value, eu.project_id): eu for eu in EventUser.objects.filter(filters)} projects = serialize_projects(organization, {i[1] for i in item_list}, user) rv = {} for tag, project in item_list: eu = eu_by_key.get((tag, project)) if eu is None: attr, value = tag.split(":", 1) eu = EventUser(project_id=project, **{EventUser.attr_from_keyword(attr): value}) rv[(tag, project)] = { HEALTH_ID_KEY: make_health_id(lookup, [eu.tag_value, eu.project_id]), "value": { "id": str(eu.id) if eu.id else None, "project": projects.get(eu.project_id), "hash": eu.hash, "tagValue": eu.tag_value, "identifier": eu.ident, "username": eu.username, "email": eu.email, "ipAddress": eu.ip_address, "dateCreated": eu.date_added, "label": eu.get_label(), "name": eu.get_display_name(), "geo": geo_by_addr(eu.ip_address), }, } return rv
def serialize_eventusers(organization, item_list, user, lookup): if not item_list: return {} # We have no reliable way to map the tag value format # back into real EventUser rows. EventUser is only unique # per-project, and this is an organization aggregate. # This means a single value maps to multiple rows. filters = reduce(or_, [ Q(hash=EventUser.hash_from_tag(tag), project_id=project) for tag, project in item_list ]) eu_by_key = {(eu.tag_value, eu.project_id): eu for eu in EventUser.objects.filter(filters)} projects = serialize_projects(organization, {i[1] for i in item_list}, user) rv = {} for tag, project in item_list: eu = eu_by_key.get((tag, project)) if eu is None: attr, value = tag.split(':', 1) eu = EventUser(project_id=project, **{EventUser.attr_from_keyword(attr): value}) rv[(tag, project)] = { HEALTH_ID_KEY: make_health_id(lookup, [eu.tag_value, eu.project_id]), 'value': { 'id': six.text_type(eu.id) if eu.id else None, 'project': projects.get(eu.project_id), 'hash': eu.hash, 'tagValue': eu.tag_value, 'identifier': eu.ident, 'username': eu.username, 'email': eu.email, 'ipAddress': eu.ip_address, 'dateCreated': eu.date_added, 'label': eu.get_label(), 'name': eu.get_display_name(), 'geo': geo_by_addr(eu.ip_address), }, } return rv
def serialize_eventusers(organization, item_list, user, lookup): if not item_list: return {} # We have no reliable way to map the tag value format # back into real EventUser rows. EventUser is only unique # per-project, and this is an organization aggregate. # This means a single value maps to multiple rows. filters = reduce(or_, [ Q(hash=EventUser.hash_from_tag(tag), project_id=project) for tag, project in item_list ]) eu_by_key = { (eu.tag_value, eu.project_id): eu for eu in EventUser.objects.filter(filters) } projects = serialize_projects(organization, {i[1] for i in item_list}, user) rv = {} for tag, project in item_list: eu = eu_by_key.get((tag, project)) if eu is None: attr, value = tag.split(':', 1) eu = EventUser(project_id=project, **{EventUser.attr_from_keyword(attr): value}) rv[(tag, project)] = { HEALTH_ID_KEY: make_health_id(lookup, [eu.tag_value, eu.project_id]), 'value': { 'id': six.text_type(eu.id) if eu.id else None, 'project': projects.get(eu.project_id), 'hash': eu.hash, 'tagValue': eu.tag_value, 'identifier': eu.ident, 'username': eu.username, 'email': eu.email, 'ipAddress': eu.ip_address, 'dateCreated': eu.date_added, 'label': eu.get_label(), 'name': eu.get_display_name(), 'geo': geo_by_addr(eu.ip_address), }, } return rv
def test_hash_from_tag(self): assert EventUser.hash_from_tag("foo:bar:baz") == md5( b"bar:baz").hexdigest()
def test_hash_from_tag(self): assert EventUser.hash_from_tag('foo:bar:baz') == md5( 'bar:baz').hexdigest()
def test_hash_from_tag(self): assert EventUser.hash_from_tag('foo:bar:baz') == md5('bar:baz').hexdigest()