Example #1
0
def new_note(request):

    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
        organization=org,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
    )
    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data('python'),
    )
    note = Activity(
        group=event.group,
        project=event.project,
        type=Activity.NOTE,
        user=request.user,
        data={'text': 'This is an example note!'},
    )

    return MailPreview(
        html_template='sentry/emails/activity/note.html',
        text_template='sentry/emails/activity/note.txt',
        context={
            'data': note.data,
            'author': note.user,
            'date': note.datetime,
            'group': group,
            'link': group.get_absolute_url(),
        },
    ).render()
Example #2
0
def new_event(request):
    team = Team(
        id=1,
        slug='example',
        name='Example',
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
        level=logging.ERROR,
    )

    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data('python'),
        level=logging.ERROR,
    )

    interface_list = []
    for interface in event.interfaces.itervalues():
        body = interface.to_email_html(event)
        if not body:
            continue
        interface_list.append((interface.get_title(), mark_safe(body)))

    preview = MailPreview(
        html_template='sentry/emails/error.html',
        text_template='sentry/emails/error.html',
        context={
            'group': group,
            'event': event,
            'link': 'http://example.com/link',
            'interfaces': interface_list,
            'tags': event.get_tags(),
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
Example #3
0
def access_approved(request):
    org = Organization(id=1, slug="example", name="Example")
    team = Team(id=1, slug="example", name="Example", organization=org)

    return MailPreview(
        html_template="sentry/emails/access-approved.html",
        text_template="sentry/emails/access-approved.txt",
        context={
            "email": "*****@*****.**",
            "name": "George Bush",
            "organization": org,
            "team": team,
        },
    ).render(request)
    def handle(self, **options):
        from django.db.models import Q
        from sentry.constants import RESERVED_ORGANIZATION_SLUGS
        from sentry.models import Organization, Project, Team, ProjectKey
        from sentry.db.models import update
        from sentry.db.models.utils import slugify_instance
        from sentry.utils.query import RangeQuerySetWrapperWithProgressBar

        print("Correcting data on organizations")
        queryset = Organization.objects.filter(slug__isnull=True, )
        for org in RangeQuerySetWrapperWithProgressBar(queryset):
            slugify_instance(org, org.name, RESERVED_ORGANIZATION_SLUGS)
            org.save()

        # Create teams for any projects that are missing them
        print("Correcting data on projects")
        queryset = Project.objects.filter(
            Q(team__isnull=True)
            | Q(organization__isnull=True), ).select_related('owner')
        for project in RangeQuerySetWrapperWithProgressBar(queryset):
            if not project.team:
                organization = Organization(
                    name=project.name,
                    owner=project.owner,
                )
                slugify_instance(organization, organization.name,
                                 RESERVED_ORGANIZATION_SLUGS)
                organization.save()

                team = Team(
                    name=project.name,
                    owner=project.owner,
                    oprganization=organization,
                )
                slugify_instance(team, team.name, RESERVED_ORGANIZATION_SLUGS)
                team.save()

            update(project, organization=team.organization, team=team)

        # Create missing project keys
        print("Creating missing project keys")
        queryset = Team.objects.all()
        for team in RangeQuerySetWrapperWithProgressBar(queryset):
            for project in team.project_set.all():
                try:
                    ProjectKey.objects.get_or_create(project=project, )
                except ProjectKey.MultipleObjectsReturned:
                    pass
Example #5
0
def new_note(request):
    team = Team(
        id=1,
        slug='example',
        name='Example',
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
    )
    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data('python'),
    )
    note = Activity(
        group=event.group,
        event=event,
        project=event.project,
        type=Activity.NOTE,
        user=request.user,
        data={'text': 'This is an example note!'},
    )

    preview = MailPreview(
        html_template='sentry/emails/new_note.html',
        text_template='sentry/emails/new_note.txt',
        context={
            'text': note.data['text'],
            'author': note.user,
            'date': note.datetime,
            'group': group,
            'link': group.get_absolute_url(),
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
Example #6
0
def create_team_and_keys_for_project(instance, created, **kwargs):
    if not created or kwargs.get('raw'):
        return

    if not instance.owner:
        return

    if not instance.team:
        team = Team(owner=instance.owner, name=instance.name)
        slugify_instance(team, instance.slug)
        team.save()
        update(instance, team=team)

    if not ProjectKey.objects.filter(project=instance,
                                     user__isnull=True).exists():
        ProjectKey.objects.create(project=instance, )
Example #7
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        project = Project(
            id=1,
            organization=org,
            team=team,
            slug='project',
            name='My Project',
        )
        release = Release(
            project=project,
            version=sha1(uuid4().hex).hexdigest(),
        )

        release_link = absolute_uri('/{}/{}/releases/{}/'.format(
            org.slug,
            project.slug,
            release.version,
        ))

        project_link = absolute_uri(
            reverse('sentry-stream',
                    kwargs={
                        'organization_slug': org.slug,
                        'project_id': project.slug,
                    }))

        return MailPreview(
            html_template='sentry/emails/activity/release.html',
            text_template='sentry/emails/activity/release.txt',
            context={
                'release': release,
                'project': project,
                'release_link': release_link,
                'project_link': project_link,
            },
        ).render(request)
Example #8
0
def request_access(request):
    org = Organization(id=1, slug="sentry", name="Sentry org")
    team = Team(id=1, slug="example", name="Example", organization=org)

    return MailPreview(
        html_template="sentry/emails/request-team-access.html",
        text_template="sentry/emails/request-team-access.txt",
        context={
            "email": "*****@*****.**",
            "name": "George Bush",
            "organization": org,
            "team": team,
            "url": absolute_uri(
                reverse("sentry-organization-teams", kwargs={"organization_slug": org.slug})
            ),
        },
    ).render(request)
Example #9
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        project = Project(
            id=1,
            organization=org,
            team=team,
            slug='project',
            name='My Project',
        )

        group = next(
            make_group_generator(
                get_random(request),
                project,
            ),
        )

        event = Event(
            id=1,
            project=project,
            group=group,
            message=group.message,
            data=load_data('python'),
            datetime=datetime(2016, 6, 13, 3, 8, 24, tzinfo=timezone.utc),
        )

        activity = Activity(
            group=event.group, project=event.project,
            **self.get_activity(request, event)
        )

        return render_to_response('sentry/debug/mail/preview.html', {
            'preview': ActivityMailPreview(activity),
            'format': request.GET.get('format'),
        })
Example #10
0
def request_access_for_another_member(request):
    org = Organization(id=1, slug="sentry", name="Sentry org")
    team = Team(id=1, slug="example", name="Example", organization=org)

    return MailPreview(
        html_template="sentry/emails/request-team-access.html",
        text_template="sentry/emails/request-team-access.txt",
        context={
            "email": "*****@*****.**",
            "name": "Username",
            "organization": org,
            "team": team,
            "url": absolute_uri(
                reverse("sentry-organization-teams", kwargs={"organization_slug": org.slug})
            ),
            "requester": request.user.get_display_name(),
        },
    ).render(request)
Example #11
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        project = Project(
            id=1,
            organization=org,
            team=team,
            slug='project',
            name='My Project',
        )
        group = Group(
            id=1,
            project=project,
        )

        return MailPreview(
            html_template='sentry/emails/activity/new-user-feedback.html',
            text_template='sentry/emails/activity/new-user-feedback.txt',
            context={
                'group': group,
                'report': {
                    'name':
                    'Homer Simpson',
                    'email':
                    '*****@*****.**',
                    'comments':
                    'I hit a bug.\n\nI went to https://example.com, hit the any key, and then it stopped working. DOH!',
                },
            },
        ).render(request)
Example #12
0
def access_approved(request):
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )

    return MailPreview(
        html_template='sentry/emails/access-approved.html',
        text_template='sentry/emails/access-approved.txt',
        context={
            'email': '*****@*****.**',
            'name': 'George Bush',
            'organization': org,
            'team': team,
        },
    ).render(request)
Example #13
0
def request_access(request):
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )

    preview = MailPreview(
        html_template='sentry/emails/request-team-access.html',
        text_template='sentry/emails/request-team-access.txt',
        context={
            'email':
            '*****@*****.**',
            'name':
            'George Bush',
            'organization':
            org,
            'team':
            team,
            'url':
            absolute_uri(
                reverse('sentry-organization-members',
                        kwargs={
                            'organization_slug': org.slug,
                        }) + '?ref=access-requests'),
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
Example #14
0
def parse_team_value(projects, value, user):
    return Team.objects.filter(
        slug__iexact=value[1:],
        projectteam__project__in=projects).first() or Team(id=0)
Example #15
0
def new_event(request):
    platform = request.GET.get('platform', 'python')
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
        organization=org,
    )
    group = Group(
        id=1,
        project=project,
        message='This is an example event.',
        level=logging.ERROR,
    )

    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data(platform),
    )

    rule = Rule(label="An example rule")

    interface_list = []
    for interface in event.interfaces.itervalues():
        body = interface.to_email_html(event)
        if not body:
            continue
        interface_list.append((interface.get_title(), mark_safe(body)))

    return MailPreview(
        html_template='sentry/emails/error.html',
        text_template='sentry/emails/error.html',
        context={
            'rule':
            rule,
            'group':
            group,
            'event':
            event,
            'link':
            'http://example.com/link',
            'interfaces':
            interface_list,
            'tags':
            event.get_tags(),
            'project_label':
            project.name,
            'tags': [('logger', 'javascript'), ('environment', 'prod'),
                     ('level', 'error'), ('device', 'Other')]
        },
    ).render()
Example #16
0
options.set('beacon.anonymous', True)

from django.conf import settings

from sentry.models import (Team, Project, ProjectKey, User, Organization,
                           OrganizationMember, OrganizationMemberTeam)

organization = Organization.objects.first()
if not organization:
    organization = Organization()
    organization.name = 'Sentry'
    organization.save()

team = Team.objects.first()
if not team:
    team = Team()
    team.name = 'Sentry'
    team.organization = organization
    team.save()

django_project = Project.objects.filter(name='Django').first()
if not django_project:
    django_project = Project()
    django_project.team = team

    django_project.name = 'Django'
    django_project.organization = organization
    django_project.save()

    django_project.add_team(team)
    django_project.save()
    def get(self, request):
        from sentry.plugins.sentry_mail.activity.new_processing_issues import summarize_issues
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        project = Project(
            id=1,
            organization=org,
            team=team,
            slug='project',
            name='My Project',
        )

        return MailPreview(
            html_template='sentry/emails/activity/new_processing_issues.html',
            text_template='sentry/emails/activity/new_processing_issues.txt',
            context={
                'project':
                project,
                'reason':
                GroupSubscriptionReason.descriptions[GroupSubscriptionReason.processing_issue],
                'issues':
                summarize_issues(
                    [
                        {
                            'data': {
                                'image_arch':
                                'arm64',
                                'image_path':
                                '/var/containers/Bundle/Application/FB14D416-DE4E-4224-9789-6B88E9C42601/CrashProbeiOS.app/CrashProbeiOS',
                                'image_uuid':
                                'a2df1794-e0c7-371c-baa4-93eac340a78a'
                            },
                            'object': 'dsym:a2df1794-e0c7-371c-baa4-93eac340a78a',
                            'scope': 'native',
                            'type': 'native_missing_dsym'
                        },
                        {
                            'data': {
                                'image_arch':
                                'arm64',
                                'image_path':
                                '/var/containers/Bundle/Application/FB14D416-DE4E-4224-9789-6B88E9C42601/CrashProbeiOS.app/libCrashProbeiOS',
                                'image_uuid':
                                '12dc1b4c-a01b-463f-ae88-5cf0c31ae680'
                            },
                            'object': 'dsym:12dc1b4c-a01b-463f-ae88-5cf0c31ae680',
                            'scope': 'native',
                            'type': 'native_bad_dsym'
                        },
                    ]
                ),
                'reprocessing_active':
                self.reprocessing_active,
                'info_url':
                absolute_uri('/{}/{}/settings/processing-issues/'.format(
                    org.slug,
                    project.slug,
                )),
            },
        ).render(request)
Example #18
0
def report(request):
    from sentry.tasks import reports

    random = get_random(request)

    duration = 60 * 60 * 24 * 7
    timestamp = random.randint(
        to_timestamp(datetime(2016, 6, 1, 0, 0, 0, tzinfo=timezone.utc)),
        to_timestamp(datetime(2016, 7, 1, 0, 0, 0, tzinfo=timezone.utc)),
    )

    organization = Organization(
        id=1,
        slug='example',
        name='Example',
    )

    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=organization,
    )

    project = Project(
        id=1,
        organization=organization,
        team=team,
        slug='project',
        name='My Project',
    )

    start, stop = reports._to_interval(timestamp, duration)

    group_instances = {}

    def fetch_group_instances(id_list):
        results = {}
        for id in id_list:
            instance = group_instances.get(id)
            if instance is not None:
                results[id] = instance
        return results

    def make_group_id_generator():
        group_generator = make_group_generator(random, project)
        while True:
            group = next(group_generator)
            if random.random() < 0.95:
                group_instances[group.id] = group
            yield group.id

    group_id_sequence = make_group_id_generator()

    def make_release_generator():
        id_sequence = itertools.count(1)
        while True:
            dt = to_datetime(
                random.randint(
                    timestamp - (30 * 24 * 60 * 60),
                    timestamp,
                ),
            )
            yield Release(
                id=next(id_sequence),
                project=project,
                version=''.join([
                    random.choice('0123456789abcdef') for _ in range(40)
                ]),
                date_added=dt,
                date_started=dt,
            )

    release_instances = {}

    def make_release_id_generator():
        release_generator = make_release_generator()
        while True:
            release = next(release_generator)
            release_instances[release.id] = release
            yield release.id

    release_id_generator = make_release_id_generator()

    def build_issue_list():
        summaries = []
        for i in range(3):
            summaries.append(
                int(random.weibullvariate(10, 1) * random.paretovariate(0.5))
            )

        return summaries, [(
            next(group_id_sequence),
            (
                int(random.paretovariate(0.3)),
                int(random.paretovariate(0.3)),
            ),
        ) for _ in xrange(0, random.randint(1, 5))]

    def build_release_list():
        return reports.trim_release_list([
            (
                next(release_id_generator),
                max(1, int(random.weibullvariate(20, 0.15))),
            ) for _ in range(random.randint(0, 10))
        ])

    def build_report():
        daily_maximum = random.randint(1000, 10000)

        rollup = 60 * 60 * 24
        series = [(
            timestamp + (i * rollup),
            (random.randint(0, daily_maximum), random.randint(0, daily_maximum))
        ) for i in xrange(0, 7)]

        aggregates = [
            random.randint(0, daily_maximum * 7) if random.random() < 0.9 else None for _ in xrange(0, 4)
        ]

        return series, aggregates, build_issue_list(), build_release_list()

    report = reduce(
        reports.merge_reports,
        [build_report() for _ in xrange(0, random.randint(1, 3))]
    )

    if random.random() < 0.85:
        personal = {
            'resolved': random.randint(0, 100),
            'users': int(random.paretovariate(0.2)),
        }
    else:
        personal = {
            'resolved': 0,
            'users': 0,
        }

    return MailPreview(
        html_template='sentry/emails/reports/body.html',
        text_template='sentry/emails/reports/body.txt',
        context={
            'duration': reports.durations[duration],
            'interval': {
                'start': reports.date_format(start),
                'stop': reports.date_format(stop),
            },
            'report': reports.to_context(
                report,
                fetch_group_instances,
            ),
            'organization': organization,
            'personal': personal,
            'user': request.user,
        },
    ).render(request)
Example #19
0
 def test_get_scope_team(self):
     team = Team(id=1)
     scope_type, scope_identifier = get_scope(team=team)
     assert scope_type == NotificationScopeType.TEAM
     assert scope_identifier == team.id
Example #20
0
def new_event(request):
    platform = request.GET.get('platform', 'python')
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=org,
    )
    project = Project(
        id=1,
        slug='example',
        name='Example',
        team=team,
        organization=org,
    )

    random = get_random(request)
    group = next(
        make_group_generator(random, project),
    )

    event = Event(
        id=1,
        project=project,
        group=group,
        message=group.message,
        data=load_data(platform),
        datetime=to_datetime(
            random.randint(
                to_timestamp(group.first_seen),
                to_timestamp(group.last_seen),
            ),
        ),
    )

    rule = Rule(label="An example rule")

    interface_list = []
    for interface in six.itervalues(event.interfaces):
        body = interface.to_email_html(event)
        if not body:
            continue
        interface_list.append((interface.get_title(), mark_safe(body)))

    return MailPreview(
        html_template='sentry/emails/error.html',
        text_template='sentry/emails/error.txt',
        context={
            'rule': rule,
            'group': group,
            'event': event,
            'link': 'http://example.com/link',
            'interfaces': interface_list,
            'tags': event.get_tags(),
            'project_label': project.name,
            'tags': [
                ('logger', 'javascript'),
                ('environment', 'prod'),
                ('level', 'error'),
                ('device', 'Other')
            ]
        },
    ).render(request)
Example #21
0
def digest(request):
    random = get_random(request)

    # TODO: Refactor all of these into something more manageable.
    org = Organization(
        id=1,
        slug='example',
        name='Example Organization',
    )

    team = Team(
        id=1,
        slug='example',
        name='Example Team',
        organization=org,
    )

    project = Project(
        id=1,
        slug='example',
        name='Example Project',
        team=team,
        organization=org,
    )

    rules = {i: Rule(
        id=i,
        project=project,
        label="Rule #%s" % (i,),
    ) for i in range(1, random.randint(2, 4))}

    state = {
        'project': project,
        'groups': {},
        'rules': rules,
        'event_counts': {},
        'user_counts': {},
    }

    records = []

    event_sequence = itertools.count(1)
    group_generator = make_group_generator(random, project)

    for i in range(random.randint(1, 30)):
        group = next(group_generator)
        state['groups'][group.id] = group

        offset = timedelta(seconds=0)
        for i in range(random.randint(1, 10)):
            offset += timedelta(seconds=random.random() * 120)
            event = Event(
                id=next(event_sequence),
                event_id=uuid.uuid4().hex,
                project=project,
                group=group,
                message=group.message,
                data=load_data('python'),
                datetime=to_datetime(
                    random.randint(
                        to_timestamp(group.first_seen),
                        to_timestamp(group.last_seen),
                    ),
                )
            )

            records.append(
                Record(
                    event.event_id,
                    Notification(
                        event,
                        random.sample(state['rules'], random.randint(1, len(state['rules']))),
                    ),
                    to_timestamp(event.datetime),
                )
            )

            state['event_counts'][group.id] = random.randint(10, 1e4)
            state['user_counts'][group.id] = random.randint(10, 1e4)

    digest = build_digest(project, records, state)
    start, end, counts = get_digest_metadata(digest)

    return MailPreview(
        html_template='sentry/emails/digests/body.html',
        text_template='sentry/emails/digests/body.txt',
        context={
            'project': project,
            'counts': counts,
            'digest': digest,
            'start': start,
            'end': end,
        },
    ).render(request)
Example #22
0
def parse_team_value(projects, value, user):
    from sentry.models import Team  # Django 1.9 setup issue
    return Team.objects.filter(
        slug__iexact=value[1:],
        projectteam__project__in=projects,
    ).first() or Team(id=0)
Example #23
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        project = Project(
            id=1,
            organization=org,
            team=team,
            slug='project',
            name='My Project',
        )
        release = Release(project=project,
                          organization_id=project.organization_id,
                          version='6c998f755f304593a4713abd123eaf8833a2de5e',
                          date_added=datetime(2016,
                                              10,
                                              12,
                                              15,
                                              39,
                                              tzinfo=pytz.utc))

        release_link = absolute_uri('/{}/{}/releases/{}/'.format(
            org.slug,
            project.slug,
            release.version,
        ))

        project_link = absolute_uri('/{}/{}/'.format(
            org.slug,
            project.slug,
        ))

        commit_list = [
            Commit(key='48b86fcd677da3dba5679d7a738240ce6fb74b20'),
            Commit(key='a53a2756bb8d111b43196210b34df90b87ed336b',
                   message='Update README.rst',
                   author=CommitAuthor(
                       name='David Cramer',
                       email='*****@*****.**',
                   )),
        ]

        return MailPreview(
            html_template='sentry/emails/activity/release.html',
            text_template='sentry/emails/activity/release.txt',
            context={
                'release':
                release,
                'project':
                project,
                'release_link':
                release_link,
                'project_link':
                project_link,
                'commit_list':
                commit_list,
                'reason':
                GroupSubscriptionReason.descriptions[
                    GroupSubscriptionReason.committed],
            },
        ).render(request)
def main():
    parser = build_parser()
    options, _args = parser.parse_args()

    os.environ['SENTRY_CONF'] = options.sentry_path

    from sentry.utils.runner import configure
    configure()

    from django.conf import settings
    # Add in the sentry object models
    from sentry.models import Organization, Project, ProjectKey, Team, User

    admin_email = settings.SENTRY_OPTIONS['system.admin-email']

    if not options.project:
        parser.error("Project name required")
    if not options.platform:
        parser.error("Platform is required")

    try:
        o = Organization.objects.get(name=options.org)
    except Organization.DoesNotExist:
        print "Organization not found: %s" % options.org
        sys.exit(1)

    try:
        u = User.objects.get(email=admin_email)
    except User.DoesNotExist:
        print "Admin user not found: %s" % admin_email
        sys.exit(1)

    # try to load the requested team
    try:
        t = Team.objects.get(name=options.team, organization_id=o.id)
    except Team.DoesNotExist:
        # this team does not yet exist.    Create it.
        t = Team()
        t.name = options.team
        t.organization_id = o.id
        t.owner_id = u.id
        t.save()
        # reload the object
        t = Team.objects.get(name=options.team, organization_id=o.id)

    try:
        p = Project.objects.get(name=options.project, team_id=t.id)
    except:
        # the project doesn't exist.    Create it!
        p = Project()
        # ensure all project names are in lowercase
        p.name = options.project.lower()
        p.team_id = t.id
        p.organization_id = o.id
        p.platform = options.platform

        try:
            p.save()
        except:
            print "Project save failed for %s" % (options.project)
            sys.exit(1)

    # create a static file containing this application's DSN
    k = ProjectKey.objects.get(project_id=p.id).get_dsn()
    prefix = quote(o.name.lower() + "-" + t.name.lower() + "-")
    dsn_path = "%s/dsn/%s%s" % (options.sentry_path, prefix, p.name)
    dsn = open(dsn_path, 'w')
    dsn.write(k)
    dsn.close()

    if options.verbose:
        print "Project %s created in team %s." % (options.project, t.name)
def report(request):
    from sentry.tasks import reports

    random = get_random(request)

    duration = 60 * 60 * 24 * 7
    timestamp = to_timestamp(
        reports.floor_to_utc_day(
            to_datetime(
                random.randint(
                    to_timestamp(
                        datetime(2015, 6, 1, 0, 0, 0, tzinfo=timezone.utc)),
                    to_timestamp(
                        datetime(2016, 7, 1, 0, 0, 0, tzinfo=timezone.utc)),
                ))))

    start, stop = interval = reports._to_interval(timestamp, duration)

    organization = Organization(
        id=1,
        slug='example',
        name='Example',
    )

    team = Team(
        id=1,
        slug='example',
        name='Example',
        organization=organization,
    )

    projects = []
    for i in xrange(0, random.randint(1, 8)):
        name = ' '.join(random.sample(loremipsum.words, random.randint(1, 4)))
        projects.append(
            Project(
                id=i,
                organization=organization,
                team=team,
                slug=slugify(name),
                name=name,
                date_added=start - timedelta(days=random.randint(0, 120)),
            ))

    def make_release_generator():
        id_sequence = itertools.count(1)
        while True:
            dt = to_datetime(
                random.randint(
                    timestamp - (30 * 24 * 60 * 60),
                    timestamp,
                ), )
            p = random.choice(projects)
            yield Release(
                id=next(id_sequence),
                project=p,
                organization_id=p.organization_id,
                version=''.join(
                    [random.choice('0123456789abcdef') for _ in range(40)]),
                date_added=dt,
            )

    def build_issue_summaries():
        summaries = []
        for i in range(3):
            summaries.append(
                int(random.weibullvariate(10, 1) * random.paretovariate(0.5)))
        return summaries

    def build_usage_summary():
        return (
            int(random.weibullvariate(3, 1) * random.paretovariate(0.2)),
            int(random.weibullvariate(5, 1) * random.paretovariate(0.2)),
        )

    def build_calendar_data(project):
        start, stop = reports.get_calendar_query_range(interval, 3)
        rollup = 60 * 60 * 24
        series = []

        weekend = frozenset((5, 6))
        value = int(random.weibullvariate(5000, 3))
        for timestamp in tsdb.get_optimal_rollup_series(start, stop,
                                                        rollup)[1]:
            damping = random.uniform(
                0.2, 0.6) if to_datetime(timestamp).weekday in weekend else 1
            jitter = random.paretovariate(1.2)
            series.append((timestamp, int(value * damping * jitter)))
            value = value * random.uniform(0.25, 2)

        return reports.clean_calendar_data(project, series, start, stop,
                                           rollup, stop)

    def build_report(project):
        daily_maximum = random.randint(1000, 10000)

        rollup = 60 * 60 * 24
        series = [(timestamp + (i * rollup), (random.randint(0, daily_maximum),
                                              random.randint(0,
                                                             daily_maximum)))
                  for i in xrange(0, 7)]

        aggregates = [
            random.randint(0, daily_maximum *
                           7) if random.random() < 0.9 else None
            for _ in xrange(0, 4)
        ]

        return reports.Report(
            series,
            aggregates,
            build_issue_summaries(),
            build_usage_summary(),
            build_calendar_data(project),
        )

    if random.random() < 0.85:
        personal = {
            'resolved': random.randint(0, 100),
            'users': int(random.paretovariate(0.2)),
        }
    else:
        personal = {
            'resolved': 0,
            'users': 0,
        }

    return MailPreview(
        html_template='sentry/emails/reports/body.html',
        text_template='sentry/emails/reports/body.txt',
        context={
            'duration':
            reports.durations[duration],
            'interval': {
                'start': reports.date_format(start),
                'stop': reports.date_format(stop),
            },
            'report':
            reports.to_context(
                organization, interval,
                {project: build_report(project)
                 for project in projects}),
            'organization':
            organization,
            'personal':
            personal,
            'user':
            request.user,
        },
    ).render(request)
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        team = Team(
            id=1,
            slug='team',
            name='My Team',
            organization=org,
        )
        projects = [
            Project(
                id=1,
                organization=org,
                team=team,
                slug='project',
                name='My Project',
            ),
            Project(
                id=2,
                organization=org,
                team=team,
                slug='another-project',
                name='Another Project',
            ),
            Project(
                id=3,
                organization=org,
                team=team,
                slug='yet-another-project',
                name='Yet Another Project',
            ),
        ]
        release = Release(
            organization_id=org.id,
            version='6c998f755f304593a4713abd123eaf8833a2de5e',
            date_added=datetime.datetime(2016, 10, 12, 15, 39, tzinfo=pytz.utc)
        )

        deploy = Deploy(
            release=release,
            organization_id=org.id,
            environment_id=1,
            date_finished=datetime.datetime(2016, 10, 12, 15, 39, tzinfo=pytz.utc),
        )

        release_links = [
            absolute_uri('/{}/{}/releases/{}/'.format(
                org.slug,
                p.slug,
                release.version,
            )) for p in projects
        ]

        repos = [
            {
                'name':
                'getsentry/getsentry',
                'commits': [
                    (
                        Commit(
                            key='48b86fcd677da3dba5679d7a738240ce6fb74b20',
                            date_added=datetime.datetime(2016, 10, 11, 15, 39, tzinfo=pytz.utc),
                        ), None
                    ),
                    (
                        Commit(
                            key='a53a2756bb8d111b43196210b34df90b87ed336b',
                            message='Fix billing',
                            author=CommitAuthor(
                                name='David Cramer',
                                email='*****@*****.**',
                            ),
                            date_added=datetime.datetime(2016, 10, 11, 16, 45, tzinfo=pytz.utc),
                        ), User(email='*****@*****.**', name='David Cramer')
                    ),
                ],
            }, {
                'name':
                'getsentry/sentry',
                'commits': [
                    (
                        Commit(
                            key='3c8eb3b4af6ee2a29c68daa188fc730c8e4b39fd',
                            date_added=datetime.datetime(2016, 10, 10, 15, 39, tzinfo=pytz.utc),
                        ), None
                    ),
                    (
                        Commit(
                            key='373562702009df1692da6eb80a933139f29e094b',
                            message='Fix padding',
                            author=CommitAuthor(
                                name='Chris Jennings',
                                email='*****@*****.**',
                            ),
                            date_added=datetime.datetime(2016, 10, 10, 16, 39, tzinfo=pytz.utc),
                        ), None
                    ),
                    (
                        Commit(
                            key='631cd9096bd9811a046a472bb0aa8b573e86e1f1',
                            message='Update README.rst',
                            author=CommitAuthor(
                                name='David Cramer',
                                email='*****@*****.**',
                            ),
                            date_added=datetime.datetime(2016, 10, 11, 10, 39, tzinfo=pytz.utc),
                        ), User(email='*****@*****.**', name='David Cramer')
                    ),
                ],
            }
        ]

        return MailPreview(
            html_template='sentry/emails/activity/release.html',
            text_template='sentry/emails/activity/release.txt',
            context={
                'release': release,
                'projects': zip(projects, release_links, [6, 1, 0]),
                'repos': repos,
                'reason': GroupSubscriptionReason.descriptions[GroupSubscriptionReason.committed],
                'project_count': len(projects),
                'commit_count': 4,
                'author_count': 1,
                'file_count': 5,
                'environment': 'production',
                'deploy': deploy,
                'setup_repo_link': absolute_uri('/organizations/{}/repos/'.format(
                    org.slug,
                )),
            },
        ).render(request)
Example #27
0
def digest(request):
    seed = request.GET.get('seed', str(time.time()))
    logger.debug('Using random seed value: %s')
    random = Random(seed)

    now = datetime.utcnow().replace(tzinfo=pytz.utc)

    # TODO: Refactor all of these into something more manageable.
    org = Organization(
        id=1,
        slug='example',
        name='Example Organization',
    )

    team = Team(
        id=1,
        slug='example',
        name='Example Team',
        organization=org,
    )

    project = Project(
        id=1,
        slug='example',
        name='Example Project',
        team=team,
        organization=org,
    )

    rules = {i: Rule(
        id=i,
        project=project,
        label="Rule #%s" % (i,),
    ) for i in xrange(1, random.randint(2, 4))}

    state = {
        'project': project,
        'groups': {},
        'rules': rules,
        'event_counts': {},
        'user_counts': {},
    }

    records = []

    group_sequence = itertools.count(1)
    event_sequence = itertools.count(1)

    for i in xrange(random.randint(1, 30)):
        group_id = next(group_sequence)

        culprit = '{module} in {function}'.format(
            module='.'.join(
                ''.join(random.sample(WORDS, random.randint(1, int(random.paretovariate(2.2))))) for word in xrange(1, 4)
            ),
            function=random.choice(WORDS)
        )
        group = state['groups'][group_id] = Group(
            id=group_id,
            project=project,
            message=words(int(random.weibullvariate(8, 4)), common=False),
            culprit=culprit,
            level=random.choice(LOG_LEVELS.keys()),
        )

        offset = timedelta(seconds=0)
        for i in xrange(random.randint(1, 10)):
            offset += timedelta(seconds=random.random() * 120)
            event = Event(
                id=next(event_sequence),
                event_id=uuid.uuid4().hex,
                project=project,
                group=group,
                message=group.message,
                data=load_data('python'),
                datetime=now - offset,
            )

            records.append(
                Record(
                    event.event_id,
                    Notification(
                        event,
                        random.sample(state['rules'], random.randint(1, len(state['rules']))),
                    ),
                    to_timestamp(event.datetime),
                )
            )

            state['event_counts'][group_id] = random.randint(10, 1e4)
            state['user_counts'][group_id] = random.randint(10, 1e4)

    digest = build_digest(project, records, state)
    start, end, counts = get_digest_metadata(digest)

    return MailPreview(
        html_template='sentry/emails/digests/body.html',
        text_template='sentry/emails/digests/body.txt',
        context={
            'project': project,
            'counts': counts,
            'digest': digest,
            'start': start,
            'end': end,
        },
    ).render()
Example #28
0
def digest(request):
    seed = request.GET.get('seed', str(time.time()))
    logger.debug('Using random seed value: %s')
    random = Random(seed)

    now = datetime.utcnow().replace(tzinfo=pytz.utc)

    # TODO: Refactor all of these into something more manageable.
    org = Organization(
        id=1,
        slug='example',
        name='Example Organization',
    )

    team = Team(
        id=1,
        slug='example',
        name='Example Team',
        organization=org,
    )

    project = Project(
        id=1,
        slug='example',
        name='Example Project',
        team=team,
        organization=org,
    )

    rules = {i: Rule(
        id=i,
        project=project,
        label="Rule #%s" % (i,),
    ) for i in xrange(1, random.randint(2, 4))}

    state = {
        'project': project,
        'groups': {},
        'rules': rules,
        'event_counts': {},
        'user_counts': {},
    }

    records = []

    group_sequence = itertools.count(1)
    event_sequence = itertools.count(1)

    for i in xrange(random.randint(1, 30)):
        group_id = next(group_sequence)

        group = state['groups'][group_id] = Group(
            id=group_id,
            project=project,
            message='This is example event #%s' % (group_id,),
            culprit='widget.foo in bar',
        )

        offset = timedelta(seconds=0)
        for i in xrange(random.randint(1, 10)):
            offset += timedelta(seconds=random.random() * 120)
            event = Event(
                id=next(event_sequence),
                event_id=uuid.uuid4().hex,
                project=project,
                group=group,
                message=group.message,
                data=load_data('python'),
                datetime=now - offset,
            )

            records.append(
                Record(
                    event.event_id,
                    Notification(
                        event,
                        random.sample(state['rules'], random.randint(1, len(state['rules']))),
                    ),
                    to_timestamp(event.datetime),
                )
            )

            state['event_counts'][group_id] = random.randint(10, 1e4)
            state['user_counts'][group_id] = random.randint(10, 1e4)

    digest = build_digest(project, records, state)

    # TODO(tkaemming): This duplication from ``MailPlugin.notify_digest`` is a code smell
    counts = Counter()
    for rule, groups in digest.iteritems():
        counts.update(groups.keys())

    return MailPreview(
        html_template='sentry/emails/digests/body.html',
        text_template='sentry/emails/digests/body.txt',
        context={
            'project': project,
            'counts': counts,
            'digest': digest,
        },
    ).render()