Skip to content

Commit

Permalink
have new_groups count only apply on a project level for less confusion (
Browse files Browse the repository at this point in the history
getsentry#4794)

* have new_groups count only apply on a project level for less confusion

* update tests

* remove data migration from transaction

* fix migrations and release serializer

* wip - get buffer incrementing nulls for postgres

* fix a few of the tests that relied on ScoreClause

* set null new_groups in release project migration to 0

* revert buffer changes

* update changes

* fix buffer test for mysql

* regenerate migration

* regenerate migration, add optimizations
  • Loading branch information
macqueen authored Jan 26, 2017
1 parent 885438e commit f6bd382
Show file tree
Hide file tree
Showing 12 changed files with 826 additions and 22 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Version 8.13 (Unreleased)
- Show Images Loaded section for cocoa events with version number.
- Fixed bug where workflow notification subject may not include a custom email prefix.
- Added configurable subject templates for individual alert emails (`mail:subject_template` option).
- Added data migration to populate ReleaseProject.new_groups

Schema Changes
~~~~~~~~~~~~~~
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/project_releases.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def get(self, request, project):
queryset=queryset,
order_by='-sort',
paginator_cls=OffsetPaginator,
on_results=lambda x: serialize(x, request.user),
on_results=lambda x: serialize(x, request.user, project=project),
)

@attach_scenarios([create_new_release_scenario])
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/release_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def get(self, request, project, version):
except Release.DoesNotExist:
raise ResourceDoesNotExist

return Response(serialize(release, request.user))
return Response(serialize(release, request.user, project=project))

@attach_scenarios([update_release_scenario])
def put(self, request, project, version):
Expand Down
16 changes: 9 additions & 7 deletions src/sentry/api/serializers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
registry = {}


def serialize(objects, user=None, serializer=None):
def serialize(objects, user=None, serializer=None, *args, **kwargs):
if user is None:
user = AnonymousUser()

Expand All @@ -15,7 +15,7 @@ def serialize(objects, user=None, serializer=None):
# sets aren't predictable, so generally you should use a list, but it's
# supported out of convenience
elif not isinstance(objects, (list, tuple, set, frozenset)):
return serialize([objects], user=user, serializer=serializer)[0]
return serialize([objects], user=user, serializer=serializer, *args, **kwargs)[0]

# elif isinstance(obj, dict):
# return dict((k, serialize(v, request=request)) for k, v in six.iteritems(obj))
Expand All @@ -36,9 +36,11 @@ def serialize(objects, user=None, serializer=None):
# filtered out of serialize()
item_list=[o for o in objects if o is not None],
user=user,
*args,
**kwargs
)

return [serializer(o, attrs=attrs.get(o, {}), user=user) for o in objects]
return [serializer(o, attrs=attrs.get(o, {}), user=user, *args, **kwargs) for o in objects]


def register(type):
Expand All @@ -49,13 +51,13 @@ def wrapped(cls):


class Serializer(object):
def __call__(self, obj, attrs, user):
def __call__(self, obj, attrs, user, *args, **kwargs):
if obj is None:
return
return self.serialize(obj, attrs, user)
return self.serialize(obj, attrs, user, *args, **kwargs)

def get_attrs(self, item_list, user):
def get_attrs(self, item_list, user, *args, **kwargs):
return {}

def serialize(self, obj, attrs, user):
def serialize(self, obj, attrs, user, *args, **kwargs):
return {}
24 changes: 21 additions & 3 deletions src/sentry/api/serializers/models/release.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import six

from django.db.models import Sum

from sentry.api.serializers import Serializer, register, serialize
from sentry.models import Release, ReleaseProject, TagValue


@register(Release)
class ReleaseSerializer(Serializer):
def get_attrs(self, item_list, user):
def get_attrs(self, item_list, user, *args, **kwargs):
tags = {
tk.value: tk
for tk in TagValue.objects.filter(
Expand All @@ -24,15 +26,31 @@ def get_attrs(self, item_list, user):
for d in serialize(set(i.owner for i in item_list if i.owner_id), user)
}

if kwargs.get('project'):
group_counts_by_release = dict(ReleaseProject.objects.filter(
project=kwargs.get('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')
)

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
}
return result

def serialize(self, obj, attrs, user):
def serialize(self, obj, attrs, user, *args, **kwargs):
d = {
'version': obj.version,
'shortVersion': obj.short_version,
Expand All @@ -42,7 +60,7 @@ def serialize(self, obj, attrs, user):
'dateReleased': obj.date_released,
'dateCreated': obj.date_added,
'data': obj.data,
'newGroups': obj.new_groups,
'newGroups': attrs['new_groups'],
'owner': attrs['owner'],
}
if attrs['tag']:
Expand Down
7 changes: 4 additions & 3 deletions src/sentry/event_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from sentry.models import (
Activity, Environment, Event, EventMapping, EventUser, Group, GroupHash,
GroupRelease, GroupResolution, GroupStatus, Project, Release,
ReleaseEnvironment, TagKey, UserReport
ReleaseEnvironment, ReleaseProject, TagKey, UserReport
)
from sentry.plugins import plugins
from sentry.signals import first_event_received, regression_signal
Expand Down Expand Up @@ -691,8 +691,9 @@ def save(self, project, raw=False):
), timestamp=event.datetime)

if is_new and release:
buffer.incr(Release, {'new_groups': 1}, {
'id': release.id,
buffer.incr(ReleaseProject, {'new_groups': 1}, {
'release_id': release.id,
'project_id': project.id
})

safe_execute(Group.objects.add_tags, group, tags,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -702,4 +702,4 @@ def backwards(self, orm):
}
}

complete_apps = ['sentry']
complete_apps = ['sentry']
Loading

0 comments on commit f6bd382

Please sign in to comment.