示例#1
0
def handle_assignee_change(integration, data):
    assignee_changed = any(
        item for item in data['changelog']['items'] if item['field'] == 'assignee'
    )
    if not assignee_changed:
        return

    fields = data['issue']['fields']

    # if no assignee, assume it was unassigned
    assignee = fields.get('assignee')
    issue_key = data['issue']['key']

    if assignee is None:
        sync_group_assignee_inbound(
            integration, None, issue_key, assign=False,
        )
        return

    if not assignee.get('emailAddress'):
        logger.info(
            'missing-assignee-email', extra={
                'issue_key': issue_key,
                'integration_id': integration.id,
            }
        )
        return

    sync_group_assignee_inbound(
        integration, assignee['emailAddress'], issue_key, assign=True
    )
示例#2
0
    def handle_assign_to(self, integration, external_issue_key, assigned_to):
        if not assigned_to:
            return
        new_value = assigned_to.get("newValue")
        if new_value is not None:
            try:
                email = self.parse_email(new_value)
            except AttributeError as e:
                logger.info(
                    "vsts.failed-to-parse-email-in-handle-assign-to",
                    extra={
                        "error": str(e),
                        "integration_id": integration.id,
                        "assigned_to_values": assigned_to,
                        "external_issue_key": external_issue_key,
                    },
                )
                return  # TODO(lb): return if cannot parse email?
            assign = True
        else:
            email = None
            assign = False

        sync_group_assignee_inbound(
            integration=integration,
            email=email,
            external_issue_key=external_issue_key,
            assign=assign,
        )
示例#3
0
    def handle_assign_to(self, integration, external_issue_key, assigned_to):
        if not assigned_to:
            return
        new_value = assigned_to.get('newValue')
        if new_value is not None:
            try:
                email = self.parse_email(new_value)
            except AttributeError as e:
                logger.info(
                    'vsts.failed-to-parse-email-in-handle-assign-to',
                    extra={
                        'error': six.text_type(e),
                        'integration_id': integration.id,
                        'assigned_to_values': assigned_to,
                        'external_issue_key': external_issue_key,
                    }
                )
                return  # TODO(lb): return if cannot parse email?
            assign = True
        else:
            email = None
            assign = False

        sync_group_assignee_inbound(
            integration=integration,
            email=email,
            external_issue_key=external_issue_key,
            assign=assign,
        )
示例#4
0
    def handle_assignee_change(self, integration, data):
        assignee = data['issue']['fields']['assignee']
        issue_key = data['issue']['key']

        if assignee is None:
            sync_group_assignee_inbound(
                integration,
                None,
                issue_key,
                assign=False,
            )
        else:
            if not assignee.get('emailAddress'):
                logger.info('missing-assignee-email',
                            extra={
                                'issue_key': issue_key,
                                'integration_id': integration.id,
                            })
                return

            sync_group_assignee_inbound(
                integration,
                assignee['emailAddress'],
                issue_key,
                assign=True,
            )
示例#5
0
def handle_assignee_change(integration, data):
    assignee_changed = any(
        item for item in data['changelog']['items'] if item['field'] == 'assignee'
    )
    if not assignee_changed:
        return

    fields = data['issue']['fields']

    # if no assignee, assume it was unassigned
    assignee = fields.get('assignee')
    issue_key = data['issue']['key']

    if assignee is None:
        sync_group_assignee_inbound(
            integration, None, issue_key, assign=False,
        )
        return

    if not assignee.get('emailAddress'):
        logger.info(
            'missing-assignee-email', extra={
                'issue_key': issue_key,
                'integration_id': integration.id,
            }
        )
        return

    sync_group_assignee_inbound(
        integration, assignee['emailAddress'], issue_key, assign=True
    )
示例#6
0
    def handle_assign_to(self, integration, external_issue_key, assigned_to):
        if not assigned_to:
            return
        new_value = assigned_to.get('newValue')
        if new_value is not None:
            try:
                email = self.parse_email(new_value)
            except AttributeError as e:
                logger.info('vsts.failed-to-parse-email-in-handle-assign-to',
                            extra={
                                'error': six.text_type(e),
                                'integration_id': integration.id,
                                'assigned_to_values': assigned_to,
                                'external_issue_key': external_issue_key,
                            })
                return  # TODO(lb): return if cannot parse email?
            assign = True
        else:
            email = None
            assign = False

        sync_group_assignee_inbound(
            integration=integration,
            email=email,
            external_issue_key=external_issue_key,
            assign=assign,
        )
示例#7
0
def handle_assignee_change(integration, data):
    assignee_changed = any(item for item in data["changelog"]["items"]
                           if item["field"] == "assignee")
    if not assignee_changed:
        return

    fields = data["issue"]["fields"]

    # if no assignee, assume it was unassigned
    assignee = fields.get("assignee")
    issue_key = data["issue"]["key"]

    if assignee is None:
        sync_group_assignee_inbound(integration, None, issue_key, assign=False)
        return

    if not assignee.get("emailAddress"):
        logger.info(
            "missing-assignee-email",
            extra={
                "issue_key": issue_key,
                "integration_id": integration.id
            },
        )
        return

    sync_group_assignee_inbound(integration,
                                assignee["emailAddress"],
                                issue_key,
                                assign=True)
    def test_assignee_sync_inbound_assign(self):
        group = self.group
        user_no_access = self.create_user()
        user_w_access = self.user
        integration = Integration.objects.create(
            provider='example',
            external_id='123456',
        )
        integration.add_organization(group.organization, user_no_access)

        OrganizationIntegration.objects.filter(
            integration_id=integration.id,
            organization_id=group.organization.id,
        ).update(
            config={
                'sync_comments': True,
                'sync_status_outbound': True,
                'sync_status_inbound': True,
                'sync_assignee_outbound': True,
                'sync_assignee_inbound': True,
            }
        )

        external_issue = ExternalIssue.objects.create(
            organization_id=group.organization.id,
            integration_id=integration.id,
            key='APP-123',
        )

        GroupLink.objects.create(
            group_id=group.id,
            project_id=group.project_id,
            linked_type=GroupLink.LinkedType.issue,
            linked_id=external_issue.id,
            relationship=GroupLink.Relationship.references,
        )

        with self.feature('organizations:integrations-issue-sync'):
            # no permissions
            groups_updated = sync_group_assignee_inbound(
                integration, user_no_access.email, 'APP-123'
            )

            assert not groups_updated

            # w permissions
            groups_updated = sync_group_assignee_inbound(
                integration, user_w_access.email, 'APP-123'
            )

            assert groups_updated[0] == group
            assert GroupAssignee.objects.filter(
                project=group.project,
                group=group,
                user=user_w_access,
                team__isnull=True,
            ).exists()
示例#9
0
    def handle_assignee_change(self, integration, data):
        assignee = data['issue']['fields']['assignee']
        issue_key = data['issue']['key']

        if assignee is None:
            sync_group_assignee_inbound(
                integration, None, issue_key, assign=False,
            )
        else:
            sync_group_assignee_inbound(
                integration, assignee['emailAddress'], issue_key, assign=True,
            )
示例#10
0
 def handle_assign_to(self, integration, external_issue_key, assigned_to):
     if not assigned_to:
         return
     new_value = assigned_to.get('newValue')
     if new_value is not None:
         email = self.parse_email(new_value)
         assign = True
     else:
         email = None
         assign = False
     sync_group_assignee_inbound(
         integration=integration,
         email=email,
         external_issue_key=external_issue_key,
         assign=assign,
     )
示例#11
0
 def handle_assign_to(self, integration, external_issue_key, assigned_to):
     if not assigned_to:
         return
     new_value = assigned_to.get('newValue')
     if new_value is not None:
         email = self.parse_email(new_value)
         assign = True
     else:
         email = None
         assign = False
     sync_group_assignee_inbound(
         integration=integration,
         email=email,
         external_issue_key=external_issue_key,
         assign=assign,
     )
示例#12
0
    def handle_assignee_change(self, integration, data):
        assignee = data['issue']['fields']['assignee']
        issue_key = data['issue']['key']

        if assignee is None:
            sync_group_assignee_inbound(
                integration,
                None,
                issue_key,
                assign=False,
            )
        else:
            sync_group_assignee_inbound(
                integration,
                assignee['emailAddress'],
                issue_key,
                assign=True,
            )
示例#13
0
    def post(self, request, *args, **kwargs):
        try:
            token = request.META['HTTP_AUTHORIZATION'].split(' ', 1)[1]
        except (KeyError, IndexError):
            return self.respond(status=400)

        data = request.DATA

        assignee_changed = any(item for item in data['changelog']['items']
                               if item['field'] == 'assignee')

        if not assignee_changed:
            return self.respond()

        try:
            integration = get_integration_from_jwt(token,
                                                   request.path,
                                                   request.GET,
                                                   method='POST')
        except AtlassianConnectValidationError:
            return self.respond(status=400)

        assignee = data['issue']['fields']['assignee']
        issue_key = data['issue']['key']

        if assignee is None:
            sync_group_assignee_inbound(
                integration,
                None,
                issue_key,
                assign=False,
            )
        else:
            sync_group_assignee_inbound(
                integration,
                assignee['emailAddress'],
                issue_key,
                assign=True,
            )

        return self.respond()
示例#14
0
    def handle_assignee_change(self, integration, data):
        assignee = data['issue']['fields']['assignee']
        issue_key = data['issue']['key']

        if assignee is None:
            sync_group_assignee_inbound(
                integration, None, issue_key, assign=False,
            )
        else:
            if not assignee.get('emailAddress'):
                logger.info(
                    'missing-assignee-email', extra={
                        'issue_key': issue_key,
                        'integration_id': integration.id,
                    }
                )
                return

            sync_group_assignee_inbound(
                integration, assignee['emailAddress'], issue_key, assign=True,
            )
示例#15
0
def handle_assignee_change(integration, data, use_email_scope=False):
    assignee_changed = any(item for item in data["changelog"]["items"]
                           if item["field"] == "assignee")
    if not assignee_changed:
        return

    fields = data["issue"]["fields"]

    # if no assignee, assume it was unassigned
    assignee = fields.get("assignee")
    issue_key = data["issue"]["key"]

    if assignee is None:
        sync_group_assignee_inbound(integration, None, issue_key, assign=False)
        return
    email = assignee.get("emailAddress")
    # pull email from API if we can use it
    if not email and use_email_scope:
        account_id = assignee.get("accountId")
        client = JiraApiClient(
            integration.metadata["base_url"],
            JiraCloud(integration.metadata["shared_secret"]),
            verify_ssl=True,
        )
        email = client.get_email(account_id)

    # TODO(steve) check display name
    if not email:
        logger.info(
            "missing-assignee-email",
            extra={
                "issue_key": issue_key,
                "integration_id": integration.id
            },
        )
        return

    sync_group_assignee_inbound(integration, email, issue_key, assign=True)
示例#16
0
    def test_assignee_sync_inbound_deassign(self):
        group = self.group
        integration = Integration.objects.create(
            provider='example',
            external_id='123456',
        )
        integration.add_organization(group.organization.id)

        OrganizationIntegration.objects.filter(
            integration_id=integration.id,
            organization_id=group.organization.id,
        ).update(
            config={
                'sync_comments': True,
                'sync_status_outbound': True,
                'sync_status_inbound': True,
                'sync_assignee_outbound': True,
                'sync_assignee_inbound': True,
            }
        )

        external_issue = ExternalIssue.objects.create(
            organization_id=group.organization.id,
            integration_id=integration.id,
            key='APP-123',
        )

        GroupLink.objects.create(
            group_id=group.id,
            project_id=group.project_id,
            linked_type=GroupLink.LinkedType.issue,
            linked_id=external_issue.id,
            relationship=GroupLink.Relationship.references,
        )

        GroupAssignee.objects.assign(group, self.user)

        groups_updated = sync_group_assignee_inbound(
            integration, self.user.email, 'APP-123', assign=False,
        )

        assert groups_updated[0] == group
        assert not GroupAssignee.objects.filter(
            project=group.project,
            group=group,
            user=self.user,
            team__isnull=True,
        ).exists()
示例#17
0
    def test_assignee_sync_inbound_deassign(self):
        group = self.group
        integration = Integration.objects.create(provider="example",
                                                 external_id="123456")
        integration.add_organization(group.organization, self.user)

        OrganizationIntegration.objects.filter(
            integration_id=integration.id,
            organization_id=group.organization.id).update(
                config={
                    "sync_comments": True,
                    "sync_status_outbound": True,
                    "sync_status_inbound": True,
                    "sync_assignee_outbound": True,
                    "sync_assignee_inbound": True,
                })

        external_issue = ExternalIssue.objects.create(
            organization_id=group.organization.id,
            integration_id=integration.id,
            key="APP-123")

        GroupLink.objects.create(
            group_id=group.id,
            project_id=group.project_id,
            linked_type=GroupLink.LinkedType.issue,
            linked_id=external_issue.id,
            relationship=GroupLink.Relationship.references,
        )

        GroupAssignee.objects.assign(group, self.user)

        with self.feature("organizations:integrations-issue-sync"):
            groups_updated = sync_group_assignee_inbound(integration,
                                                         self.user.email,
                                                         "APP-123",
                                                         assign=False)

            assert groups_updated[0] == group
            assert not GroupAssignee.objects.filter(
                project=group.project,
                group=group,
                user=self.user,
                team__isnull=True).exists()
示例#18
0
    def test_assignee_sync_inbound_deassign(self):
        group = self.group
        integration = Integration.objects.create(
            provider='example',
            external_id='123456',
        )
        integration.add_organization(group.organization.id)

        external_issue = ExternalIssue.objects.create(
            organization_id=group.organization.id,
            integration_id=integration.id,
            key='APP-123',
        )

        GroupLink.objects.create(
            group_id=group.id,
            project_id=group.project_id,
            linked_type=GroupLink.LinkedType.issue,
            linked_id=external_issue.id,
            relationship=GroupLink.Relationship.references,
        )

        GroupAssignee.objects.assign(group, self.user)

        groups_updated = sync_group_assignee_inbound(
            integration,
            self.user.email,
            'APP-123',
            assign=False,
        )

        assert groups_updated[0] == group
        assert not GroupAssignee.objects.filter(
            project=group.project,
            group=group,
            user=self.user,
            team__isnull=True,
        ).exists()