def test_notification_added(self): plugin_enabled.send(plugin=NotificationPlugin(), project=self.project, user=self.user, sender=type(NotificationPlugin)) task = OrganizationOnboardingTask.objects.get( organization=self.organization, task=OnboardingTask.NOTIFICATION_SERVICE, status=OnboardingTaskStatus.COMPLETE, ) assert task is not None
def _handle_enable_plugin(self, request, project): plugin = plugins.get(request.POST['plugin']) plugin.enable(project) plugin_enabled.send(plugin=plugin, project=project, user=request.user, sender=self) messages.add_message( request, messages.SUCCESS, constants.OK_PLUGIN_ENABLED.format(name=plugin.get_title()), )
def test_notification_plugin(self): plugin_enabled.send( plugin=NotificationPlugin(), project=self.project, user=self.owner, sender=type(self.project) ) feature_complete = FeatureAdoption.objects.get_by_slug( organization=self.organization, slug="notification_integration" ) assert feature_complete
def test_issue_tracker_plugin(self): plugin_enabled.send( plugin=IssueTrackingPlugin2(), project=self.project, user=self.owner, sender=type(self.project) ) feature_complete = FeatureAdoption.objects.get_by_slug( organization=self.organization, slug="issue_tracker_integration" ) assert feature_complete
def post(self, request, organization, team, project, slug): try: plugin = plugins.get(slug) except KeyError: return self.redirect(reverse('sentry-configure-project-plugin', args=[project.organization.slug, project.slug, slug])) if plugin.is_enabled(project): return self.redirect(reverse('sentry-configure-project-plugin', args=[project.organization.slug, project.slug, slug])) plugin.enable(project=project) plugin_enabled.send(plugin=plugin, project=project, user=request.user, sender=self) return self.redirect(reverse('sentry-configure-project-plugin', args=[project.organization.slug, project.slug, slug]))
def test_issue_tracker_onboarding(self): plugin_enabled.send(plugin=IssueTrackingPlugin(), project=self.project, user=self.user, sender=type(IssueTrackingPlugin)) task = OrganizationOnboardingTask.objects.get( organization=self.organization, task=OnboardingTask.ISSUE_TRACKER, status=OnboardingTaskStatus.PENDING, ) assert task is not None issue_tracker_used.send(plugin=IssueTrackingPlugin(), project=self.project, user=self.user, sender=type(IssueTrackingPlugin)) task = OrganizationOnboardingTask.objects.get( organization=self.organization, task=OnboardingTask.ISSUE_TRACKER, status=OnboardingTaskStatus.COMPLETE, ) assert task is not None
def test_onboarding_complete(self): user = self.create_user(email='*****@*****.**') project = self.create_project(first_event=timezone.now()) second_project = self.create_project(first_event=timezone.now()) second_group = self.create_group(project=second_project, platform='python', message='python error message') event = self.create_full_event() member = self.create_member(organization=self.organization, teams=[self.team], user=user) event_processed.send(project=project, group=self.group, event=event, sender=type(project)) project_created.send(project=project, user=user, sender=type(project)) project_created.send(project=second_project, user=user, sender=type(second_project)) first_event_received.send(project=project, group=self.group, sender=type(project)) first_event_received.send(project=second_project, group=second_group, sender=type(second_project)) member_joined.send(member=member, sender=type(member)) plugin_enabled.send(plugin=IssueTrackingPlugin(), project=project, user=user, sender=type(IssueTrackingPlugin)) issue_tracker_used.send(plugin=IssueTrackingPlugin(), project=project, user=user, sender=type(IssueTrackingPlugin)) plugin_enabled.send(plugin=NotificationPlugin(), project=project, user=user, sender=type(NotificationPlugin)) assert OrganizationOption.objects.filter(organization=self.organization, key="onboarding:complete").count() == 1
def put(self, request, project, plugin_id): plugin = self._get_plugin(plugin_id) config = [ serialize_field(project, plugin, c) for c in plugin.get_config( project=project, user=request.user, ) ] cleaned = {} errors = {} for field in config: key = field['name'] value = request.DATA.get(key) if field.get('required') and not value: errors[key] = ERR_FIELD_REQUIRED try: value = plugin.validate_config_field( project=project, name=key, value=value, actor=request.user, ) except (forms.ValidationError, serializers.ValidationError, PluginError) as e: errors[key] = e.message if not errors.get(key): cleaned[key] = value if not errors: try: cleaned = plugin.validate_config( project=project, config=cleaned, actor=request.user, ) except PluginError as e: errors['__all__'] = e.message if errors: return Response({ 'errors': errors, }, status=400) for key, value in six.iteritems(cleaned): if value is None: plugin.unset_option( project=project, key=key, ) else: plugin.set_option( project=project, key=key, value=value, ) context = serialize(plugin, request.user, PluginWithConfigSerializer(project)) plugin_enabled.send(plugin=plugin, project=project, user=request.user, sender=self) return Response(context)
def put(self, request, project, plugin_id): plugin = self._get_plugin(plugin_id) config = [ serialize_field(project, plugin, c) for c in plugin.get_config( project=project, user=request.user, initial=request.DATA, ) ] cleaned = {} errors = {} for field in config: key = field['name'] value = request.DATA.get(key) if field.get('required') and not value: errors[key] = ERR_FIELD_REQUIRED try: value = plugin.validate_config_field( project=project, name=key, value=value, actor=request.user, ) except (forms.ValidationError, serializers.ValidationError, InvalidIdentity, PluginError) as e: errors[key] = e.message if not errors.get(key): cleaned[key] = value if not errors: try: cleaned = plugin.validate_config( project=project, config=cleaned, actor=request.user, ) except (InvalidIdentity, PluginError) as e: errors['__all__'] = e.message if errors: return Response( { 'errors': errors, }, status=400 ) for key, value in six.iteritems(cleaned): if value is None: plugin.unset_option( project=project, key=key, ) else: plugin.set_option( project=project, key=key, value=value, ) context = serialize(plugin, request.user, PluginWithConfigSerializer(project)) plugin_enabled.send(plugin=plugin, project=project, user=request.user, sender=self) self.create_audit_entry( request=request, organization=project.organization, target_object=project.id, event=AuditLogEntryEvent.INTEGRATION_EDIT, data={'integration': plugin_id, 'project': project.slug} ) return Response(context)
def put(self, request, project, plugin_id): plugin = self._get_plugin(plugin_id) config = [ serialize_field(project, plugin, c) for c in plugin.get_config(project=project, user=request.user, initial=request.data) ] cleaned = {} errors = {} for field in config: key = field["name"] value = request.data.get(key) if field.get("required") and not value: errors[key] = ERR_FIELD_REQUIRED try: value = plugin.validate_config_field( project=project, name=key, value=value, actor=request.user ) except ( forms.ValidationError, serializers.ValidationError, InvalidIdentity, PluginError, ) as e: errors[key] = six.text_type(e) if not errors.get(key): cleaned[key] = value if not errors: try: cleaned = plugin.validate_config( project=project, config=cleaned, actor=request.user ) except (InvalidIdentity, PluginError) as e: errors["__all__"] = six.text_type(e) if errors: return Response({"errors": errors}, status=400) for key, value in six.iteritems(cleaned): if value is None: plugin.unset_option(project=project, key=key) else: plugin.set_option(project=project, key=key, value=value) context = serialize(plugin, request.user, PluginWithConfigSerializer(project)) plugin_enabled.send(plugin=plugin, project=project, user=request.user, sender=self) self.create_audit_entry( request=request, organization=project.organization, target_object=project.id, event=AuditLogEntryEvent.INTEGRATION_EDIT, data={"integration": plugin_id, "project": project.slug}, ) return Response(context)
def test_onboarding_complete(self): now = timezone.now() user = self.create_user(email="*****@*****.**") project = self.create_project(first_event=now) second_project = self.create_project(first_event=now) second_event = self.store_event( data={ "platform": "python", "message": "python error message" }, project_id=second_project.id, ) event = self.store_event( data={ "event_id": "a" * 32, "platform": "javascript", "timestamp": iso_format(before_now(minutes=1)), "tags": { "sentry:release": "e1b5d1900526feaf20fe2bc9cad83d392136030a", "sentry:user": "******", }, "user": { "ip_address": "0.0.0.0", "id": "41656", "email": "*****@*****.**" }, "exception": { "values": [{ "stacktrace": { "frames": [{ "data": { "sourcemap": "https://media.sentry.io/_static/29e365f8b0d923bc123e8afa38d890c3/sentry/dist/vendor.js.map" } }] }, "type": "TypeError", }] }, }, project_id=project.id, ) member = self.create_member(organization=self.organization, teams=[self.team], user=user) event_processed.send(project=project, event=event, sender=type(project)) project_created.send(project=project, user=user, sender=type(project)) project_created.send(project=second_project, user=user, sender=type(second_project)) first_event_received.send(project=project, event=event, sender=type(project)) first_event_received.send(project=second_project, event=second_event, sender=type(second_project)) member_joined.send(member=member, organization=self.organization, sender=type(member)) plugin_enabled.send( plugin=IssueTrackingPlugin(), project=project, user=user, sender=type(IssueTrackingPlugin), ) issue_tracker_used.send( plugin=IssueTrackingPlugin(), project=project, user=user, sender=type(IssueTrackingPlugin), ) alert_rule_created.send( rule=Rule(id=1), project=self.project, user=self.user, rule_type="issue", sender=type(Rule), ) assert (OrganizationOption.objects.filter( organization=self.organization, key="onboarding:complete").count() == 1)
def put(self, request, project, plugin_id): plugin = self._get_plugin(plugin_id) config = [ serialize_field(project, plugin, c) for c in plugin.get_config( project=project, user=request.user, ) ] cleaned = {} errors = {} for field in config: key = field['name'] value = request.DATA.get(key) if field.get('required') and not value: errors[key] = ERR_FIELD_REQUIRED try: value = plugin.validate_config_field( project=project, name=key, value=value, actor=request.user, ) except (forms.ValidationError, serializers.ValidationError, PluginError) as e: errors[key] = e.message if not errors.get(key): cleaned[key] = value if not errors: try: cleaned = plugin.validate_config( project=project, config=cleaned, actor=request.user, ) except PluginError as e: errors['__all__'] = e.message if errors: return Response({ 'errors': errors, }, status=400) for key, value in six.iteritems(cleaned): if value is None: plugin.unset_option( project=project, key=key, ) else: plugin.set_option( project=project, key=key, value=value, ) context = serialize( plugin, request.user, PluginWithConfigSerializer(project)) plugin_enabled.send(plugin=plugin, project=project, user=request.user, sender=self) return Response(context)