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