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)
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()
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, },))
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)
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, })
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()
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, "*****@*****.**")
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)
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
def get_context(request): org = Organization(name='My Company') provider = DummyProvider('dummy') return { 'organization': org, 'actor': request.user, 'provider': provider, }
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)
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)
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)
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, })
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'), })
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)
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)
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, })
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
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)
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})
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
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 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)