def get_context(self) -> MutableMapping[str, Any]: environment = self.event.get_tag("environment") enhanced_privacy = self.organization.flags.enhanced_privacy context = { "project_label": self.project.get_full_name(), "group": self.group, "event": self.event, "link": get_link(self.group, environment), "rules": get_rules(self.rules, self.organization, self.project), "has_integrations": has_integrations(self.organization, self.project), "enhanced_privacy": enhanced_privacy, "commits": get_commits(self.project, self.event), "environment": environment, "slack_link": get_integration_link(self.organization, "slack"), "has_alert_integration": has_alert_integration(self.project), } # if the organization has enabled enhanced privacy controls we don't send # data which may show PII or source code if not enhanced_privacy: context.update({ "tags": self.event.tags, "interfaces": get_interface_list(self.event) }) return context
def get_context(self) -> MutableMapping[str, Any]: alert_status_page_enabled = features.has( "organizations:alert-rule-status-page", self.project.organization) rules_details = { rule.id: rule for rule in get_rules(list(self.digest.keys()), self.project.organization, self.project) } return { **get_digest_as_context(self.digest), "has_alert_integration": has_alert_integration(self.project), "project": self.project, "slack_link": get_integration_link(self.organization, "slack"), "alert_status_page_enabled": alert_status_page_enabled, "rules_details": rules_details, }
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") project = Project(id=1, slug="example", name="Example Project", organization=org) rules = { i: Rule(id=i, project=project, label=f"Rule #{i}") for i in range(1, random.randint(2, 4)) } state = { "project": project, "groups": {}, "rules": rules, "event_counts": {}, "user_counts": {}, } records = [] 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) 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() data["timestamp"] = random.randint(to_timestamp(group.first_seen), to_timestamp(group.last_seen)) event = eventstore.create_event(event_id=uuid.uuid4().hex, group_id=group.id, project_id=project.id, data=data.data) records.append( Record( event.event_id, Notification( event, random.sample(list(state["rules"].keys()), 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)[0] start, end, counts = get_digest_metadata(digest) context = { "project": project, "counts": counts, "digest": digest, "start": start, "end": end, "referrer": "digest_email", "alert_status_page_enabled": features.has("organizations:alert-rule-status-page", org), "rules_details": {rule.id: rule for rule in get_rules(rules.values(), org, project)}, } add_unsubscribe_link(context) return MailPreview( html_template="sentry/emails/digests/body.html", text_template="sentry/emails/digests/body.txt", context=context, ).render(request)
def alert(request): platform = request.GET.get("platform", "python") org = Organization(id=1, slug="example", name="Example") project = Project(id=1, slug="example", name="Example", organization=org) random = get_random(request) group = next(make_group_generator(random, project)) data = dict(load_data(platform)) data["message"] = group.message data["event_id"] = "44f1419e73884cd2b45c79918f4b6dc4" data.pop("logentry", None) data["environment"] = "prod" data["tags"] = [ ("logger", "javascript"), ("environment", "prod"), ("level", "error"), ("device", "Other"), ] event_manager = EventManager(data) event_manager.normalize() data = event_manager.get_data() event = event_manager.save(project.id) # Prevent CI screenshot from constantly changing event.data["timestamp"] = 1504656000.0 # datetime(2017, 9, 6, 0, 0) event_type = get_event_type(event.data) group.message = event.search_message group.data = { "type": event_type.key, "metadata": event_type.get_metadata(data) } rule = Rule(id=1, label="An example rule") # XXX: this interface_list code needs to be the same as in # src/sentry/mail/adapter.py interface_list = [] for interface in event.interfaces.values(): body = interface.to_email_html(event) if not body: continue text_body = interface.to_string(event) interface_list.append( (interface.get_title(), mark_safe(body), text_body)) return MailPreview( html_template="sentry/emails/error.html", text_template="sentry/emails/error.txt", context={ "rule": rule, "rules": get_rules([rule], org, project), "group": group, "event": event, "timezone": pytz.timezone("Europe/Vienna"), # http://testserver/organizations/example/issues/<issue-id>/?referrer=alert_email # &alert_type=email&alert_timestamp=<ts>&alert_rule_id=1 "link": get_group_settings_link(group, None, get_rules([rule], org, project), 1337), "interfaces": interface_list, "tags": event.tags, "project_label": project.slug, "alert_status_page_enabled": features.has("organizations:alert-rule-status-page", org), "commits": [{ # TODO(dcramer): change to use serializer "repository": { "status": "active", "name": "Example Repo", "url": "https://github.com/example/example", "dateCreated": "2018-02-28T23:39:22.402Z", "provider": { "id": "github", "name": "GitHub" }, "id": "1", }, "score": 2, "subject": "feat: Do something to raven/base.py", "message": "feat: Do something to raven/base.py\naptent vivamus vehicula tempus volutpat hac tortor", "id": "1b17483ffc4a10609e7921ee21a8567bfe0ed006", "shortId": "1b17483", "author": { "username": "******", "isManaged": False, "lastActive": "2018-03-01T18:25:28.149Z", "id": "1", "isActive": True, "has2fa": False, "name": "*****@*****.**", "avatarUrl": "https://secure.gravatar.com/avatar/51567a4f786cd8a2c41c513b592de9f9?s=32&d=mm", "dateJoined": "2018-02-27T22:04:32.847Z", "emails": [{ "is_verified": False, "id": "1", "email": "*****@*****.**" }], "avatar": { "avatarUuid": None, "avatarType": "letter_avatar" }, "lastLogin": "******", "email": "*****@*****.**", }, }], }, ).render(request)