def merge_to(self, project): from sentry.models import (Group, Event) if not isinstance(project, Project): project = Project.objects.get_from_cache(pk=project) for group in Group.objects.filter(project=self): try: other = Group.objects.get(project=project, ) except Group.DoesNotExist: group.update(project=project) tagstore.update_project_for_group(group_id=group.id, old_project_id=self.id, new_project_id=project.id) else: Event.objects.filter( group_id=group.id, ).update(group_id=other.id) for obj in tagstore.get_group_tag_values(group_id=group.id): obj2, created = tagstore.get_or_create_group_tag_value( project_id=project.id, group_id=group.id, key=obj.key, value=obj.value, defaults={'times_seen': obj.times_seen}) if not created: obj2.update(times_seen=F('times_seen') + obj.times_seen) for fv in tagstore.get_tag_values(self.id): tagstore.get_or_create_tag_value(project_id=project.id, key=fv.key, value=fv.value) fv.delete() self.delete()
def merge_to(self, project): from sentry.models import (Group, Event) if not isinstance(project, Project): project = Project.objects.get_from_cache(pk=project) for group in Group.objects.filter(project=self): try: other = Group.objects.get( project=project, ) except Group.DoesNotExist: group.update(project=project) tagstore.update_project_for_group( group_id=group.id, old_project_id=self.id, new_project_id=project.id) else: Event.objects.filter( group_id=group.id, ).update(group_id=other.id) for obj in tagstore.get_group_tag_values(group_id=group.id): obj2, created = tagstore.get_or_create_group_tag_value( project_id=project.id, group_id=group.id, key=obj.key, value=obj.value, defaults={'times_seen': obj.times_seen} ) if not created: obj2.update(times_seen=F('times_seen') + obj.times_seen) for fv in tagstore.get_tag_values(self.id): tagstore.get_or_create_tag_value(project_id=project.id, key=fv.key, value=fv.value) fv.delete() self.delete()
def get_attrs(self, item_list, user, *args, **kwargs): project = kwargs.get('project') if project: project_ids = [project.id] else: project_ids = list(ReleaseProject.objects.filter(release__in=item_list).values_list( 'project_id', flat=True ).distinct()) tags = {} tvs = tagstore.get_tag_values(project_ids, 'sentry:release', [o.version for o in item_list]) for tv in tvs: val = tags.get(tv.value) tags[tv.value] = { 'first_seen': min(tv.first_seen, val['first_seen']) if val else tv.first_seen, 'last_seen': max(tv.last_seen, val['last_seen']) if val else tv.last_seen } owners = { d['id']: d for d in serialize(set(i.owner for i in item_list if i.owner_id), user) } if project: group_counts_by_release = dict( ReleaseProject.objects.filter(project=project, release__in=item_list) .values_list('release_id', 'new_groups') ) else: # assume it should be a sum across release # if no particular project specified group_counts_by_release = dict( ReleaseProject.objects.filter(release__in=item_list, new_groups__isnull=False) .values('release_id').annotate(new_groups=Sum('new_groups')) .values_list('release_id', 'new_groups') ) release_metadata_attrs = self._get_commit_metadata(item_list, user) deploy_metadata_attrs = self._get_deploy_metadata(item_list, user) release_projects = defaultdict(list) project_releases = ReleaseProject.objects.filter(release__in=item_list).values( 'release_id', 'project__slug', 'project__name' ) for pr in project_releases: release_projects[pr['release_id']].append( { 'slug': pr['project__slug'], 'name': pr['project__name'], } ) result = {} for item in item_list: result[item] = { 'tag': tags.get(item.version), 'owner': owners[six.text_type(item.owner_id)] if item.owner_id else None, 'new_groups': group_counts_by_release.get(item.id) or 0, 'projects': release_projects.get(item.id, []) } result[item].update(release_metadata_attrs[item]) result[item].update(deploy_metadata_attrs[item]) return result
def get_attrs(self, item_list, user, *args, **kwargs): project = kwargs.get('project') if project: project_ids = [project.id] else: project_ids = list( ReleaseProject.objects.filter( release__in=item_list).values_list('project_id', flat=True).distinct()) tags = {} tvs = tagstore.get_tag_values(project_ids, 'sentry:release', [o.version for o in item_list]) for tv in tvs: val = tags.get(tv.value) tags[tv.value] = { 'first_seen': min(tv.first_seen, val['first_seen']) if val else tv.first_seen, 'last_seen': max(tv.last_seen, val['last_seen']) if val else tv.last_seen } owners = { d['id']: d for d in serialize(set( i.owner for i in item_list if i.owner_id), user) } if project: group_counts_by_release = dict( ReleaseProject.objects.filter( project=project, release__in=item_list).values_list('release_id', 'new_groups')) else: # assume it should be a sum across release # if no particular project specified group_counts_by_release = dict( ReleaseProject.objects.filter( release__in=item_list, new_groups__isnull=False).values('release_id').annotate( new_groups=Sum('new_groups')).values_list( 'release_id', 'new_groups')) release_metadata_attrs = self._get_commit_metadata(item_list, user) deploy_metadata_attrs = self._get_deploy_metadata(item_list, user) release_projects = defaultdict(list) project_releases = ReleaseProject.objects.filter( release__in=item_list).values('release_id', 'project__slug', 'project__name') for pr in project_releases: release_projects[pr['release_id']].append({ 'slug': pr['project__slug'], 'name': pr['project__name'], }) result = {} for item in item_list: result[item] = { 'tag': tags.get(item.version), 'owner': owners[six.text_type(item.owner_id)] if item.owner_id else None, 'new_groups': group_counts_by_release.get(item.id) or 0, 'projects': release_projects.get(item.id, []) } result[item].update(release_metadata_attrs[item]) result[item].update(deploy_metadata_attrs[item]) return result