def delete(self, request, organization, member_id, team_slug): """ Leave a team Leave a team. """ try: om = self._get_member(request, organization, member_id) except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # we need to create the row in order to handle superusers leaving a # team which they were never a member for (therefor there was never # a matching row) omt = OrganizationMemberTeam( team=team, organizationmember=om, # setting this to true ensures it gets saved below is_active=True, ) if omt.is_active: omt.is_active = False omt.save() self.create_audit_entry( request=request, organization=organization, target_object=omt.id, target_user=om.user, event=AuditLogEntryEvent.MEMBER_LEAVE_TEAM, data=omt.get_audit_log_data(), ) return Response(serialize(team, request.user, TeamWithProjectsSerializer()), status=200)
def delete(self, request, organization, member_id, team_slug): """ Leave a team Leave a team. """ try: om = self._get_member(request, organization, member_id) except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # we need to create the row in order to handle superusers leaving a # team which they were never a member for (therefor there was never # a matching row) omt = OrganizationMemberTeam( team=team, organizationmember=om, # setting this to true ensures it gets saved below is_active=True, ) if omt.is_active: omt.is_active = False omt.save() self.create_audit_entry( request=request, organization=organization, target_object=omt.id, target_user=om.user, event=AuditLogEntryEvent.MEMBER_LEAVE_TEAM, data=omt.get_audit_log_data(), ) return Response(serialize( team, request.user, TeamWithProjectsSerializer()), status=200)
def post(self, request, organization, member_id, team_slug): """ Join a team Join or request access to a team. If the user is already a member of the team, this will simply return a 204. If the user needs permission to join the team, an access request will be generated and the returned status code will be 202. """ try: om = self._get_member(request, organization, member_id) except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist if not om.has_global_access: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # TODO(dcramer): this should create a pending request and # return a 202 if not organization.flags.allow_joinleave: omt, created = OrganizationAccessRequest.objects.get_or_create( team=team, member=om, ) if created: omt.send_request_email() return Response(status=202) omt = OrganizationMemberTeam( team=team, organizationmember=om, is_active=False, ) if omt.is_active: return Response(status=204) else: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # if the relationship doesnt exist, they're already a member return Response(status=204) omt.is_active = True omt.save() self.create_audit_entry( request=request, organization=organization, target_object=omt.id, target_user=om.user, event=AuditLogEntryEvent.MEMBER_JOIN_TEAM, data=omt.get_audit_log_data(), ) return Response(serialize( team, request.user, TeamWithProjectsSerializer()), status=201)
def delete(self, request, organization, member_id, team_slug): """ Leave a team Leave a team. """ try: om = self._get_member(request, organization, member_id) except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist if not om.has_global_access: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # if the relationship doesnt exist, they're already a member return Response(serialize( team, request.user, TeamWithProjectsSerializer()), status=200) else: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, is_active=True, ) except OrganizationMemberTeam.DoesNotExist: omt = OrganizationMemberTeam( team=team, organizationmember=om, is_active=True, ) if omt.is_active: omt.is_active = False omt.save() self.create_audit_entry( request=request, organization=organization, target_object=omt.id, target_user=om.user, event=AuditLogEntryEvent.MEMBER_LEAVE_TEAM, data=omt.get_audit_log_data(), ) return Response(serialize( team, request.user, TeamWithProjectsSerializer()), status=200)
def post(self, request, organization, member_id, team_slug): """ Join a team Join or request access to a team. If the user is already a member of the team, this will simply return a 204. If the user needs permission to join the team, an access request will be generated and the returned status code will be 202. """ try: om = OrganizationMember.objects.filter( organization=organization, id=member_id, ).select_related('user').get() except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist if not om.has_global_access: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # TODO(dcramer): this should create a pending request and # return a 202 if not organization.flags.allow_joinleave: omt, created = OrganizationAccessRequest.objects.get_or_create( team=team, member=om, ) if created: omt.send_request_email() return Response(status=202) omt = OrganizationMemberTeam( team=team, organizationmember=om, is_active=False, ) if omt.is_active: return Response(status=204) else: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # if the relationship doesnt exist, they're already a member return Response(status=204) omt.is_active = True omt.save() AuditLogEntry.objects.create( organization=organization, actor=request.user, ip_address=request.META['REMOTE_ADDR'], target_object=omt.id, target_user=request.user, event=AuditLogEntryEvent.MEMBER_JOIN_TEAM, data=omt.get_audit_log_data(), ) return Response(serialize(team), status=201)
def delete(self, request, organization, member_id, team_slug): """ Leave a team Leave a team. """ try: om = OrganizationMember.objects.filter( organization=organization, id=member_id, ).select_related('user').get() except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist if not om.has_global_access: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # if the relationship doesnt exist, they're already a member return Response(status=204) else: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, is_active=True, ) except OrganizationMemberTeam.DoesNotExist: omt = OrganizationMemberTeam( team=team, organizationmember=om, is_active=True, ) if omt.is_active: omt.is_active = False omt.save() AuditLogEntry.objects.create( organization=organization, actor=request.user, ip_address=request.META['REMOTE_ADDR'], target_object=omt.id, target_user=request.user, event=AuditLogEntryEvent.MEMBER_LEAVE_TEAM, data=omt.get_audit_log_data(), ) return Response(status=204)
def delete(self, request, organization, member_id, team_slug): """ Leave a team Leave a team. """ try: om = self._get_member(request, organization, member_id) except OrganizationMember.DoesNotExist: raise ResourceDoesNotExist if not self._can_access(request, om): return Response({'detail': ERR_INSUFFICIENT_ROLE}, status=400) try: team = Team.objects.get( organization=organization, slug=team_slug, ) except Team.DoesNotExist: raise ResourceDoesNotExist if not om.has_global_access: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, ) except OrganizationMemberTeam.DoesNotExist: # if the relationship doesnt exist, they're already a member return Response(serialize(team, request.user, TeamWithProjectsSerializer()), status=200) else: try: omt = OrganizationMemberTeam.objects.get( team=team, organizationmember=om, is_active=True, ) except OrganizationMemberTeam.DoesNotExist: omt = OrganizationMemberTeam( team=team, organizationmember=om, is_active=True, ) if omt.is_active: omt.is_active = False omt.save() self.create_audit_entry( request=request, organization=organization, target_object=omt.id, target_user=om.user, event=AuditLogEntryEvent.MEMBER_LEAVE_TEAM, data=omt.get_audit_log_data(), ) return Response(serialize(team, request.user, TeamWithProjectsSerializer()), status=200)