def get(self, request):
        organization = Organization(slug="myorg")
        project = Project(slug="myproject", organization=organization)

        query = SnubaQuery(time_window=60,
                           query="transaction:/some/transaction",
                           aggregate="count()")
        alert_rule = AlertRule(id=1,
                               organization=organization,
                               name="My Alert",
                               snuba_query=query)
        incident = Incident(
            id=2,
            identifier=123,
            organization=organization,
            title="Something broke",
            alert_rule=alert_rule,
            status=IncidentStatus.CRITICAL,
        )
        trigger = AlertRuleTrigger(alert_rule=alert_rule)

        context = generate_incident_trigger_email_context(
            project, incident, trigger, TriggerStatus.ACTIVE)

        return MailPreview(
            text_template="sentry/emails/incidents/trigger.txt",
            html_template="sentry/emails/incidents/trigger.html",
            context=context,
        ).render(request)
Esempio n. 2
0
def invitation(request):
    org = Organization(
        id=1,
        slug='example',
        name='Example',
    )
    om = OrganizationMember(
        id=1,
        email='*****@*****.**',
        organization=org,
    )

    return MailPreview(
        html_template='sentry/emails/member-invite.html',
        text_template='sentry/emails/member-invite.txt',
        context={
            'email':
            '*****@*****.**',
            'organization':
            org,
            'url':
            absolute_uri(
                reverse('sentry-accept-invite',
                        kwargs={
                            'member_id': om.id,
                            'token': om.token,
                        })),
        },
    ).render()
Esempio n. 3
0
    def insert(self, group, event, is_new, is_sample, is_regression,
               is_new_group_environment, primary_hash, skip_consume=False):
        project = event.project
        retention_days = quotas.get_event_retention(
            organization=Organization(project.organization_id)
        )

        self._send(project.id, 'insert', extra_data=({
            'group_id': event.group_id,
            'event_id': event.event_id,
            'organization_id': project.organization_id,
            'project_id': event.project_id,
            # TODO(mitsuhiko): We do not want to send this incorrect
            # message but this is what snuba needs at the moment.
            'message': event.message,
            'platform': event.platform,
            'datetime': event.datetime,
            'data': dict(event.data.items()),
            'primary_hash': primary_hash,
            'retention_days': retention_days,
        }, {
            'is_new': is_new,
            'is_sample': is_sample,
            'is_regression': is_regression,
            'is_new_group_environment': is_new_group_environment,
            'skip_consume': skip_consume,
        },))
Esempio n. 4
0
    def get(self, request):
        org = Organization(id=1, slug="organization", name="My Company")
        project = Project(id=1, organization=org, slug="project", name="My Project")

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

        data = dict(load_data("python"))
        data["message"] = group.message
        data.pop("logentry", None)

        event_manager = EventManager(data)
        event_manager.normalize()
        data = event_manager.get_data()
        event_type = get_event_type(data)

        event = eventstore.create_event(
            event_id="a" * 32, group_id=group.id, project_id=project.id, data=data.data
        )

        group.message = event.search_message
        group.data = {"type": event_type.key, "metadata": event_type.get_metadata(data)}

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

        return render_to_response(
            "sentry/debug/mail/preview.html",
            context={
                "preview": ActivityMailPreview(request, activity),
                "format": request.GET.get("format"),
            },
        )
def access_approved(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/access-approved.html',
        text_template='sentry/emails/access-approved.txt',
        context={
            'email': '*****@*****.**',
            'name': 'George Bush',
            'organization': org,
            'team': team,
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
    def get(self, request):
        org = Organization(id=1, slug="organization", name="My Company")
        project = Project(id=1,
                          organization=org,
                          slug="project",
                          name="My Project")

        event = create_sample_event(project=project,
                                    platform="python",
                                    event_id="595",
                                    timestamp=1452683305)

        group = event.group
        link = absolute_uri("/{}/{}/issues/{}/feedback/".format(
            project.organization.slug, project.slug, group.id))

        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!",
                },
                "link": link,
                "reason": "are subscribed to this issue",
                "enhanced_privacy": False,
            },
        ).render(request)
Esempio n. 7
0
def new_event(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.',
        level=logging.ERROR,
    )

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

    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)))

    preview = 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,
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
Esempio n. 8
0
def request_access(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/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'),
        },
    ).render()
Esempio n. 9
0
    def test_by_organization(self):
        organization = Organization(id=1)
        for n in range(100):
            assert not ratelimits.for_organization_member_invite(
                organization, "{}@example.com".format(randint(0, 1000000)))

        assert ratelimits.for_organization_member_invite(
            organization, "*****@*****.**")
Esempio n. 10
0
    def test_by_email(self):
        organization = Organization(id=1)
        email = "*****@*****.**"
        for n in range(10):
            assert not ratelimits.for_organization_member_invite(
                organization, email)

        assert ratelimits.for_organization_member_invite(organization, email)
Esempio n. 11
0
 def test_name_hasnt_changed_after_save(self):
     inst = Organization(id=1, name="bar")
     update_tracked_data(inst)
     inst.name = "baz"
     self.assertTrue(has_changed(inst, "name"))
     self.assertEqual(old_value(inst, "name"), "bar")
     update_tracked_data(inst)
     models.signals.post_save.send(instance=inst, sender=type(inst), created=False)
     self.assertFalse(has_changed(inst, "name"))
def sentry_create_organization(name):
    model = sentry_find_organization(name)
    existing = model is not None
    if not existing:
        model = Organization()
        model.name = name
        model.save()

    return model, existing
Esempio n. 13
0
def get_context(request):
    org = Organization(name='My Company')
    provider = DummyProvider('dummy')

    return {
        'organization': org,
        'actor': request.user,
        'provider': provider,
    }
Esempio n. 14
0
    def test_by_email(self):
        organization = Organization(id=1)
        email = "*****@*****.**"
        for n in range(2):
            assert not ratelimits.for_organization_member_invite(
                organization, email, config=RELAXED_CONFIG)

        assert ratelimits.for_organization_member_invite(organization,
                                                         email,
                                                         config=RELAXED_CONFIG)
Esempio n. 15
0
    def test_by_organization(self):
        organization = Organization(id=1)
        for n in range(5):
            assert not ratelimits.for_organization_member_invite(
                organization,
                f"{randint(0, 1000000)}@example.com",
                config=RELAXED_CONFIG)

        assert ratelimits.for_organization_member_invite(
            organization, "*****@*****.**", config=RELAXED_CONFIG)
    def get(self, request):
        org = Organization(slug="myorg")
        release = Release(version="abcdef", organization=org)
        repo = Repository(name="repo_name")

        email = generate_fetch_commits_error_email(
            release, repo, "An internal server error occurred")
        return MailPreview(html_template=email.html_template,
                           text_template=email.template,
                           context=email.context).render(request)
Esempio n. 17
0
 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')
     project = Project(
         id=1,
         organization=org,
         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/{}/projects/{}/processing-issues/'.format(
                     org.slug,
                     project.slug,
                 )),
         },
     ).render(request)
Esempio n. 18
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,
        event=event,
        project=event.project,
        type=Activity.NOTE,
        user=request.user,
        data={'text': 'This is an example note!'},
    )

    preview = 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(),
        },
    )

    return render_to_response('sentry/debug/mail/preview.html', {
        'preview': preview,
    })
Esempio n. 19
0
    def get(self, request):
        org = Organization(
            id=1,
            slug='organization',
            name='My Company',
        )
        project = Project(
            id=1,
            organization=org,
            slug='project',
            name='My Project',
        )

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

        data = dict(load_data('python'))
        data['message'] = group.message
        data.pop('logentry', None)

        event_manager = EventManager(data)
        event_manager.normalize()
        data = event_manager.get_data()
        event_type = event_manager.get_event_type()

        group.message = event_manager.get_search_message()
        group.data = {
            'type': event_type.key,
            'metadata': event_type.get_metadata(data),
        }

        event = Event(id=1,
                      project=project,
                      message=event_manager.get_search_message(),
                      group=group,
                      datetime=datetime(2016,
                                        6,
                                        13,
                                        3,
                                        8,
                                        24,
                                        tzinfo=timezone.utc),
                      data=event_manager.get_data())

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

        return render_to_response(
            'sentry/debug/mail/preview.html', {
                'preview': ActivityMailPreview(request, activity),
                'format': request.GET.get('format'),
            })
Esempio n. 20
0
    def get(self, request: Request) -> Response:
        org = Organization(id=1, slug="petal", name="Petal")
        project = Project(id=1,
                          slug="nodejs",
                          name="Node.js",
                          organization=org)
        user = User(name="Nisanthan")
        OrganizationMember(organization=org, user=user, role="admin")
        notification = AutoSyncNotification(project)

        return render_preview_email_for_notification(notification, user)
Esempio n. 21
0
 def get(self, request):
     org = Organization(id=1, slug="organization", name="sentry corp")
     member = OrganizationMember(id=1,
                                 organization=org,
                                 email="*****@*****.**")
     context = {"url": member.get_invite_link(), "organization": org}
     return MailPreview(
         html_template="sentry/emails/setup_2fa.html",
         text_template="sentry/emails/setup_2fa.txt",
         context=context,
     ).render(request)
Esempio n. 22
0
def assigned(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'),
    )
    assigned = Activity(
        group=event.group,
        project=event.project,
        type=Activity.ASSIGNED,
        user=request.user,
        data={
            'text': 'This is an example note!',
            'assignee': '*****@*****.**'
        },
    )

    return MailPreview(
        html_template='sentry/emails/activity/assigned.html',
        text_template='sentry/emails/activity/assigned.txt',
        context={
            'data': assigned.data,
            'author': assigned.user,
            'date': assigned.datetime,
            'group': group,
            'link': group.get_absolute_url(),
        },
    ).render()
    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(
            reverse('sentry-release-details',
                    kwargs={
                        'organization_slug': org.slug,
                        'project_id': project.slug,
                        'version': release.version,
                    }))

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

        preview = 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,
            },
        )

        return render_to_response('sentry/debug/mail/preview.html', {
            'preview': preview,
        })
Esempio n. 24
0
    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 member in team.member_set.select_related('user'):
                for project in team.project_set.all():
                    try:
                        created = ProjectKey.objects.get_or_create(
                            project=project,
                            user=member.user,
                        )[1]
                    except ProjectKey.MultipleObjectsReturned:
                        pass
Esempio n. 25
0
    def get(self, request):
        from sentry.notifications.activity.new_processing_issues import summarize_issues

        org = Organization(id=1, slug="organization", name="My Company")
        project = Project(id=1,
                          organization=org,
                          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(
                    f"/settings/{org.slug}/projects/{project.slug}/processing-issues/"
                ),
            },
        ).render(request)
Esempio n. 26
0
    def get(self, request: Request) -> Response:
        requester_name = request.GET.get("requester_name", "Requester")
        recipient_name = request.GET.get("recipient_name", "Recipient")

        org = Organization(id=1, slug="petal", name="Petal")
        project = Project(id=1, slug="nodejs", name="Node.js", organization=org)
        user = User(name=recipient_name)
        member = OrganizationMember(organization=org, user=user, role="admin")
        preview = MailPreviewAdapter(
            **get_codeowners_request_builder_args(project, member, requester_name)
        )

        return render_to_response("sentry/debug/mail/preview.html", {"preview": preview})
Esempio n. 27
0
    def publish(self,
                group,
                event,
                is_new,
                is_sample,
                is_regression,
                is_new_group_environment,
                primary_hash,
                skip_consume=False):
        project = event.project
        retention_days = quotas.get_event_retention(
            organization=Organization(project.organization_id))

        # Polling the producer is required to ensure callbacks are fired. This
        # means that the latency between a message being delivered (or failing
        # to be delivered) and the corresponding callback being fired is
        # roughly the same as the duration of time that passes between publish
        # calls. If this ends up being too high, the publisher should be moved
        # into a background thread that can poll more frequently without
        # interfering with request handling. (This does `poll` does not act as
        # a heartbeat for the purposes of any sort of session expiration.)
        self.producer.poll(0.0)

        try:
            key = '%s:%s' % (event.project_id, event.event_id)
            value = (EVENT_PROTOCOL_VERSION, 'insert', {
                'group_id': event.group_id,
                'event_id': event.event_id,
                'organization_id': project.organization_id,
                'project_id': event.project_id,
                'message': event.message,
                'platform': event.platform,
                'datetime': event.datetime,
                'data': event.data.data,
                'primary_hash': primary_hash,
                'retention_days': retention_days,
            }, {
                'is_new': is_new,
                'is_sample': is_sample,
                'is_regression': is_regression,
                'is_new_group_environment': is_new_group_environment,
            })
            self.producer.produce(
                self.publish_topic,
                key=key.encode('utf-8'),
                value=json.dumps(value),
                on_delivery=self.delivery_callback,
            )
        except Exception as error:
            logger.warning('Could not publish event: %s', error, exc_info=True)
            raise
Esempio n. 28
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)
Esempio n. 29
0
def invitation(request):
    org = Organization(id=1, slug="example", name="Example")
    om = OrganizationMember(id=1, email="*****@*****.**", organization=org)

    return MailPreview(
        html_template="sentry/emails/member-invite.html",
        text_template="sentry/emails/member-invite.txt",
        context={
            "email": "*****@*****.**",
            "organization": org,
            "url": absolute_uri(
                reverse("sentry-accept-invite", kwargs={"member_id": om.id, "token": om.token})
            ),
        },
    ).render(request)
    def get(self, request: Request) -> Response:
        org = Organization(id=1, slug="default", name="Default")
        requester = User(name="Rick Swan")
        pending_member = OrganizationMember(email="*****@*****.**",
                                            organization=org,
                                            inviter=requester)
        recipient = User(name="James Bond")
        recipient_member = OrganizationMember(user=recipient, organization=org)

        notification = InviteRequestNotification(pending_member, requester)

        # hack to avoid a query
        notification.role_based_recipient_strategy.set_member_in_cache(
            recipient_member)
        return render_preview_email_for_notification(notification, recipient)