def handle_action_submitted(self, request): # pull out parameters data = request.data channel_data = data["channelData"] tenant_id = channel_data["tenant"]["id"] payload = data["value"]["payload"] group_id = payload["groupId"] integration_id = payload["integrationId"] user_id = data["from"]["id"] activity_id = data["replyToId"] conversation = data["conversation"] if conversation["conversationType"] == "personal": conversation_id = conversation["id"] else: conversation_id = channel_data["channel"]["id"] try: integration = Integration.objects.get(id=integration_id) except Integration.DoesNotExist: logger.info( "msteams.action.missing-integration", extra={"integration_id": integration_id} ) return self.respond(status=404) team_id = integration.external_id client = MsTeamsClient(integration) try: group = Group.objects.select_related("project__organization").get( project__in=Project.objects.filter( organization__in=integration.organizations.all() ), id=group_id, ) except Group.DoesNotExist: logger.info( "msteams.action.invalid-issue", extra={"team_id": team_id, "integration_id": integration.id}, ) return self.respond(status=404) try: idp = IdentityProvider.objects.get(type="msteams", external_id=team_id) except IdentityProvider.DoesNotExist: logger.info( "msteams.action.invalid-team-id", extra={ "team_id": team_id, "integration_id": integration.id, "organization_id": group.organization.id, }, ) return self.respond(status=404) try: identity = Identity.objects.get(idp=idp, external_id=user_id) except Identity.DoesNotExist: associate_url = build_linking_url( integration, group.organization, user_id, team_id, tenant_id ) card = build_linking_card(associate_url) user_conversation_id = client.get_user_conversation_id(user_id, tenant_id) client.send_card(user_conversation_id, card) return self.respond(status=201) # update the state of the issue issue_change_response = self.issue_state_change(group, identity, data["value"]) # get the rules from the payload rules = Rule.objects.filter(id__in=payload["rules"]) # pull the event based off our payload event = eventstore.get_event_by_id(group.project_id, payload["eventId"]) if event is None: logger.info( "msteams.action.event-missing", extra={ "team_id": team_id, "integration_id": integration.id, "organization_id": group.organization.id, "event_id": payload["eventId"], "project_id": group.project_id, }, ) return self.respond(status=404) # refresh issue and update card group.refresh_from_db() card = build_group_card(group, event, rules, integration) client.update_card(conversation_id, activity_id, card) return issue_change_response
def handle_action_submitted(self, request): data = request.data channel_data = data["channelData"] team_id = channel_data["team"]["id"] tenant_id = channel_data["tenant"]["id"] group_id = data["value"]["groupId"] user_id = data["from"]["id"] try: integration = Integration.objects.get(provider=self.provider, external_id=team_id) except Integration.DoesNotExist: logger.info("msteams.action.missing-integration", extra={"team_id": team_id}) return self.respond(status=404) try: group = Group.objects.select_related("project__organization").get( project__in=Project.objects.filter( organization__in=integration.organizations.all()), id=group_id, ) except Group.DoesNotExist: logger.info( "msteams.action.invalid-issue", extra={ "team_id": team_id, "integration_id": integration.id }, ) return self.respond(status=404) try: idp = IdentityProvider.objects.get(type="msteams", external_id=team_id) except IdentityProvider.DoesNotExist: logger.info( "msteams.action.invalid-team-id", extra={ "team_id": team_id, "integration_id": integration.id, "organization_id": group.organization.id, }, ) return self.respond(status=404) try: identity = Identity.objects.get(idp=idp, external_id=user_id) except Identity.DoesNotExist: associate_url = build_linking_url(integration, group.organization, user_id, team_id, tenant_id) client = MsTeamsClient(integration) card = build_linking_card(associate_url) user_conversation_id = client.get_user_conversation_id( user_id, tenant_id) client.send_card(user_conversation_id, card) return self.respond(status=201) return self.issue_state_change(group, identity, data["value"])