Beispiel #1
0
    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
Beispiel #2
0
    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"])