def test_member_joined(self):
     member = self.create_member(organization=self.organization, teams=[self.team], user=self.create_user())
     member_joined.send(member=member, sender=type(self.project))
     feature_complete = FeatureAdoption.objects.get_by_slug(
         organization=self.organization,
         slug="invite_team")
     assert feature_complete
Example #2
0
    def test_member_joined(self):
        user = self.create_user(email='*****@*****.**')
        member = self.create_member(organization=self.organization,
                                    teams=[self.team],
                                    user=user)
        member_joined.send(member=member, sender=type(member))

        task = OrganizationOnboardingTask.objects.get(
            organization=self.organization,
            task=OnboardingTask.INVITE_MEMBER,
            status=OnboardingTaskStatus.COMPLETE,
        )
        assert task is not None

        user2 = self.create_user(email='*****@*****.**')
        member2 = self.create_member(organization=self.organization,
                                     teams=[self.team],
                                     user=user2)
        member_joined.send(member=member2, sender=type(member2))

        task = OrganizationOnboardingTask.objects.get(
            organization=self.organization,
            task=OnboardingTask.INVITE_MEMBER,
            status=OnboardingTaskStatus.COMPLETE,
        )
        assert task.data['invited_member_id'] == member.id
Example #3
0
 def test_member_joined(self):
     member = self.create_member(
         organization=self.organization, teams=[self.team], user=self.create_user()
     )
     member_joined.send(member=member, organization=self.organization, sender=type(self.project))
     feature_complete = FeatureAdoption.objects.get_by_slug(
         organization=self.organization, slug="invite_team"
     )
     assert feature_complete
Example #4
0
    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.create_event(project=second_project,
                                         platform="python",
                                         message="python error message")
        event = self.create_full_event(project=project)
        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),
        )
        plugin_enabled.send(plugin=NotificationPlugin(),
                            project=project,
                            user=user,
                            sender=type(NotificationPlugin))

        assert (OrganizationOption.objects.filter(
            organization=self.organization,
            key="onboarding:complete").count() == 1)
Example #5
0
    def test_onboarding_complete(self):
        # Drop microsecond value for MySQL
        now = timezone.now().replace(microsecond=0)
        user = self.create_user(email='*****@*****.**')
        project = self.create_project(first_event=now)
        second_project = self.create_project(first_event=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
Example #6
0
    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 test_member_joined(self):
        user = self.create_user(email='*****@*****.**')
        member = self.create_member(organization=self.organization, teams=[self.team], user=user)
        member_joined.send(member=member, sender=type(member))

        task = OrganizationOnboardingTask.objects.get(
            organization=self.organization,
            task=OnboardingTask.INVITE_MEMBER,
            status=OnboardingTaskStatus.COMPLETE,
        )
        assert task is not None

        user2 = self.create_user(email='*****@*****.**')
        member2 = self.create_member(organization=self.organization, teams=[self.team], user=user2)
        member_joined.send(member=member2, sender=type(member2))

        task = OrganizationOnboardingTask.objects.get(
            organization=self.organization,
            task=OnboardingTask.INVITE_MEMBER,
            status=OnboardingTaskStatus.COMPLETE,
        )
        assert task.data['invited_member_id'] == member.id
    def handle(self, request, member_id, token):
        assert request.method in ['POST', 'GET']

        try:
            om = OrganizationMember.objects.get(pk=member_id)
        except OrganizationMember.DoesNotExist:
            messages.add_message(
                request,
                messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if not om.is_pending:
            messages.add_message(
                request,
                messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if om.token != token:
            messages.add_message(
                request,
                messages.ERROR,
                ERR_INVITE_INVALID,
            )
            return self.redirect(reverse('sentry'))

        organization = om.organization

        qs = Project.objects.filter(organization=organization, )
        project_list = list(qs.select_related('team')[:25])
        project_count = qs.count()

        context = {
            'organization': om.organization,
            'project_list': project_list,
            'project_count': project_count,
            'needs_authentication': not request.user.is_authenticated(),
        }

        if not request.user.is_authenticated():
            # Show login or register form
            request.session['_next'] = request.get_full_path()
            request.session['can_register'] = True

            return self.respond('sentry/accept-organization-invite.html',
                                context)

        form = self.get_form(request)
        if form.is_valid():
            if OrganizationMember.objects.filter(organization=organization,
                                                 user=request.user).exists():
                messages.add_message(
                    request, messages.SUCCESS,
                    _('You are already a member of the %r organization.') %
                    (organization.name.encode('utf-8'), ))

                om.delete()
            else:
                om.user = request.user
                om.email = None
                om.save()

                AuditLogEntry.objects.create(
                    organization=organization,
                    actor=request.user,
                    ip_address=request.META['REMOTE_ADDR'],
                    target_object=om.id,
                    target_user=request.user,
                    event=AuditLogEntryEvent.MEMBER_ACCEPT,
                    data=om.get_audit_log_data(),
                )

                messages.add_message(
                    request, messages.SUCCESS,
                    _('You have been added to the %r organization.') %
                    (organization.name.encode('utf-8'), ))

                member_joined.send(member=om, sender=self)

            request.session.pop('can_register', None)

            return self.redirect(
                reverse('sentry-organization-home', args=[organization.slug]))

        context['form'] = form

        return self.respond('sentry/accept-organization-invite.html', context)
    def handle(self, request, member_id, token):
        assert request.method in ('POST', 'GET')

        try:
            om = OrganizationMember.objects.get(pk=member_id)
        except OrganizationMember.DoesNotExist:
            messages.add_message(
                request, messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if not om.is_pending:
            messages.add_message(
                request, messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if not constant_time_compare(om.token or om.legacy_token, token):
            messages.add_message(
                request, messages.ERROR,
                ERR_INVITE_INVALID,
            )
            return self.redirect(reverse('sentry'))

        organization = om.organization

        qs = Project.objects.filter(
            organization=organization,
        )
        project_list = list(qs.select_related('team')[:25])
        project_count = qs.count()

        context = {
            'organization': om.organization,
            'project_list': project_list,
            'project_count': project_count,
            'needs_authentication': not request.user.is_authenticated(),
            'logout_url': '{}?next={}'.format(
                reverse('sentry-logout'),
                request.path,
            ),
            'login_url': '{}?next={}'.format(
                reverse('sentry-login'),
                request.path,
            ),
            'register_url': '{}?next={}'.format(
                reverse('sentry-register'),
                request.path,
            ),
        }

        if not request.user.is_authenticated():
            # Show login or register form
            auth.initiate_login(request, next_url=request.get_full_path())
            request.session['can_register'] = True
            request.session['invite_email'] = om.email

            return self.respond('sentry/accept-organization-invite.html', context)

        # if they're already a member of the organization its likely they're
        # using a shared account and either previewing this invite or
        # are incorrectly expecting this to create a new account for them
        context['existing_member'] = OrganizationMember.objects.filter(
            user=request.user.id,
            organization=om.organization_id,
        ).exists()

        form = self.get_form(request)
        if form.is_valid():
            if OrganizationMember.objects.filter(organization=organization, user=request.user).exists():
                messages.add_message(
                    request, messages.SUCCESS,
                    _('You are already a member of the %r organization.') % (
                        organization.name.encode('utf-8'),
                    )
                )

                om.delete()
            else:
                om.user = request.user
                om.email = None
                om.save()

                self.create_audit_entry(
                    request,
                    organization=organization,
                    target_object=om.id,
                    target_user=request.user,
                    event=AuditLogEntryEvent.MEMBER_ACCEPT,
                    data=om.get_audit_log_data(),
                )

                messages.add_message(
                    request, messages.SUCCESS,
                    _('You have been added to the %r organization.') % (
                        organization.name.encode('utf-8'),
                    )
                )

                member_joined.send(member=om, sender=self)

            request.session.pop('can_register', None)

            return self.redirect(reverse('sentry-organization-home', args=[organization.slug]))

        context['form'] = form

        return self.respond('sentry/accept-organization-invite.html', context)
Example #10
0
    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,
        )

        event_data = load_data("transaction")
        min_ago = iso_format(before_now(minutes=1))
        event_data.update({"start_timestamp": min_ago, "timestamp": min_ago})

        transaction = self.store_event(data=event_data, project_id=project.id)

        first_event_received.send(project=project,
                                  event=transaction,
                                  sender=type(project))
        first_transaction_received.send(project=project,
                                        event=transaction,
                                        sender=type(project))

        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),
            is_api_token=False,
        )

        assert (OrganizationOption.objects.filter(
            organization=self.organization,
            key="onboarding:complete").count() == 1)
Example #11
0
    def handle(self, request, member_id, token):
        assert request.method in ('POST', 'GET')

        try:
            om = OrganizationMember.objects.get(pk=member_id)
        except OrganizationMember.DoesNotExist:
            messages.add_message(
                request,
                messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if not om.is_pending:
            messages.add_message(
                request,
                messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if not constant_time_compare(om.token or om.legacy_token, token):
            messages.add_message(
                request,
                messages.ERROR,
                ERR_INVITE_INVALID,
            )
            return self.redirect(reverse('sentry'))

        organization = om.organization

        qs = Project.objects.filter(organization=organization, )
        project_list = list(qs[:25])
        project_count = qs.count()

        context = {
            'organization':
            om.organization,
            'project_list':
            project_list,
            'project_count':
            project_count,
            'needs_authentication':
            not request.user.is_authenticated(),
            'logout_url':
            '{}?next={}'.format(
                reverse('sentry-logout'),
                request.path,
            ),
            'login_url':
            '{}?next={}'.format(
                reverse('sentry-login'),
                request.path,
            ),
            'register_url':
            '{}?next={}'.format(
                reverse('sentry-register'),
                request.path,
            ),
        }

        if not request.user.is_authenticated():
            # Show login or register form
            auth.initiate_login(request, next_url=request.get_full_path())
            request.session['can_register'] = True
            request.session['invite_email'] = om.email

            return self.respond('sentry/accept-organization-invite.html',
                                context)

        # if they're already a member of the organization its likely they're
        # using a shared account and either previewing this invite or
        # are incorrectly expecting this to create a new account for them
        context['existing_member'] = OrganizationMember.objects.filter(
            user=request.user.id,
            organization=om.organization_id,
        ).exists()

        form = self.get_form(request)
        if form.is_valid():
            if OrganizationMember.objects.filter(organization=organization,
                                                 user=request.user).exists():
                messages.add_message(
                    request, messages.SUCCESS,
                    _('You are already a member of the %r organization.') %
                    (organization.name.encode('utf-8'), ))

                om.delete()
            else:
                om.user = request.user
                om.email = None
                om.save()

                self.create_audit_entry(
                    request,
                    organization=organization,
                    target_object=om.id,
                    target_user=request.user,
                    event=AuditLogEntryEvent.MEMBER_ACCEPT,
                    data=om.get_audit_log_data(),
                )

                messages.add_message(
                    request, messages.SUCCESS,
                    _('You have been added to the %r organization.') %
                    (organization.name.encode('utf-8'), ))

                member_joined.send(member=om, sender=self)

            request.session.pop('can_register', None)

            return self.redirect(
                reverse('sentry-organization-home', args=[organization.slug]))

        context['form'] = form

        return self.respond('sentry/accept-organization-invite.html', context)
    def handle(self, request, member_id, token):
        assert request.method in ["POST", "GET"]

        try:
            om = OrganizationMember.objects.get(pk=member_id)
        except OrganizationMember.DoesNotExist:
            messages.add_message(request, messages.ERROR, ERR_INVITE_INVALID)

            return self.redirect(reverse("sentry"))

        if not om.is_pending:
            messages.add_message(request, messages.ERROR, ERR_INVITE_INVALID)

            return self.redirect(reverse("sentry"))

        if om.token != token:
            messages.add_message(request, messages.ERROR, ERR_INVITE_INVALID)
            return self.redirect(reverse("sentry"))

        organization = om.organization

        qs = Project.objects.filter(organization=organization)
        project_list = list(qs.select_related("team")[:25])
        project_count = qs.count()

        context = {
            "organization": om.organization,
            "project_list": project_list,
            "project_count": project_count,
            "needs_authentication": not request.user.is_authenticated(),
        }

        if not request.user.is_authenticated():
            # Show login or register form
            request.session["_next"] = request.get_full_path()
            request.session["can_register"] = True

            return self.respond("sentry/accept-organization-invite.html", context)

        form = self.get_form(request)
        if form.is_valid():
            if OrganizationMember.objects.filter(organization=organization, user=request.user).exists():
                messages.add_message(
                    request,
                    messages.SUCCESS,
                    _("You are already a member of the %r organization.") % (organization.name.encode("utf-8"),),
                )

                om.delete()
            else:
                om.user = request.user
                om.email = None
                om.save()

                self.create_audit_entry(
                    request,
                    organization=organization,
                    target_object=om.id,
                    target_user=request.user,
                    event=AuditLogEntryEvent.MEMBER_ACCEPT,
                    data=om.get_audit_log_data(),
                )

                messages.add_message(
                    request,
                    messages.SUCCESS,
                    _("You have been added to the %r organization.") % (organization.name.encode("utf-8"),),
                )

                member_joined.send(member=om, sender=self)

            request.session.pop("can_register", None)

            return self.redirect(reverse("sentry-organization-home", args=[organization.slug]))

        context["form"] = form

        return self.respond("sentry/accept-organization-invite.html", context)
    def handle(self, request, member_id, token):
        assert request.method in ['POST', 'GET']

        try:
            om = OrganizationMember.objects.get(pk=member_id)
        except OrganizationMember.DoesNotExist:
            messages.add_message(
                request, messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if not om.is_pending:
            messages.add_message(
                request, messages.ERROR,
                ERR_INVITE_INVALID,
            )

            return self.redirect(reverse('sentry'))

        if om.token != token:
            messages.add_message(
                request, messages.ERROR,
                ERR_INVITE_INVALID,
            )
            return self.redirect(reverse('sentry'))

        organization = om.organization

        qs = Project.objects.filter(
            organization=organization,
        )
        project_list = list(qs.select_related('team')[:25])
        project_count = qs.count()

        context = {
            'organization': om.organization,
            'project_list': project_list,
            'project_count': project_count,
            'needs_authentication': not request.user.is_authenticated(),
        }

        if not request.user.is_authenticated():
            # Show login or register form
            request.session['_next'] = request.get_full_path()
            request.session['can_register'] = True

            return self.respond('sentry/accept-organization-invite.html', context)

        form = self.get_form(request)
        if form.is_valid():
            if OrganizationMember.objects.filter(organization=organization, user=request.user).exists():
                messages.add_message(
                    request, messages.SUCCESS,
                    _('You are already a member of the %r organization.') % (
                        organization.name.encode('utf-8'),
                    )
                )

                om.delete()
            else:
                om.user = request.user
                om.email = None
                om.save()

                AuditLogEntry.objects.create(
                    organization=organization,
                    actor=request.user,
                    ip_address=request.META['REMOTE_ADDR'],
                    target_object=om.id,
                    target_user=request.user,
                    event=AuditLogEntryEvent.MEMBER_ACCEPT,
                    data=om.get_audit_log_data(),
                )

                messages.add_message(
                    request, messages.SUCCESS,
                    _('You have been added to the %r organization.') % (
                        organization.name.encode('utf-8'),
                    )
                )

                member_joined.send(member=om, sender=self)

            request.session.pop('can_register', None)

            return self.redirect(reverse('sentry-organization-home', args=[organization.slug]))

        context['form'] = form

        return self.respond('sentry/accept-organization-invite.html', context)