def dispatch(self, request, organization, **kwargs):
        try:
            config = self.validate_config(organization, request.DATA)
        except Exception as e:
            return self.handle_api_error(e)

        try:
            result = self.create_repository(
                organization=organization,
                data=config,
            )
        except IntegrationError as e:
            return Response(
                {
                    'errors': {
                        '__all__': e.message
                    },
                }, status=400
            )

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                    integration_id=result.get('integration_id'),
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                    integration_id=result.get('integration_id'),
                )
                self.delete_repository(repo)
            except IntegrationError:
                pass
            return Response(
                {'errors': {'__all__': 'A repository with that name already exists'}},
                status=400,
            )
        else:
            repo_linked.send_robust(repo=repo, user=request.user, sender=self.__class__)

        analytics.record(
            'integration.repo.added',
            provider=self.id,
            id=result.get('integration_id'),
            organization_id=organization.id,
        )
        return Response(serialize(repo, request.user), status=201)
    def dispatch(self, request, organization, **kwargs):
        try:
            config = self.get_repository_data(organization, request.DATA)
        except Exception as e:
            return self.handle_api_error(e)

        try:
            result = self.build_repository_config(
                organization=organization,
                data=config,
            )
        except IntegrationError as e:
            return Response(
                {
                    'errors': {
                        '__all__': e.message
                    },
                }, status=400
            )

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                    integration_id=result.get('integration_id'),
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                    integration_id=result.get('integration_id'),
                )
                self.on_delete_repository(repo)
            except IntegrationError:
                pass
            return Response(
                {'errors': {'__all__': 'A repository with that name already exists'}},
                status=400,
            )
        else:
            repo_linked.send_robust(repo=repo, user=request.user, sender=self.__class__)

        analytics.record(
            'integration.repo.added',
            provider=self.id,
            id=result.get('integration_id'),
            organization_id=organization.id,
        )
        return Response(serialize(repo, request.user), status=201)
Exemple #3
0
    def dispatch(self, request, organization, **kwargs):
        from sentry.integrations.exceptions import IntegrationError  # Django 1.9 setup issue
        from sentry.models import Repository  # Django 1.9 setup issue
        try:
            config = self.get_repository_data(organization, request.data)
            result = self.build_repository_config(
                organization=organization,
                data=config,
            )
        except Exception as e:
            return self.handle_api_error(e)

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                    integration_id=result.get('integration_id'),
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                    integration_id=result.get('integration_id'),
                )
                self.on_delete_repository(repo)
            except IntegrationError:
                pass
            return Response(
                {
                    'errors': {
                        '__all__': 'A repository with that name already exists'
                    }
                },
                status=400,
            )
        else:
            repo_linked.send_robust(repo=repo,
                                    user=request.user,
                                    sender=self.__class__)

        analytics.record(
            'integration.repo.added',
            provider=self.id,
            id=result.get('integration_id'),
            organization_id=organization.id,
        )
        from sentry.api.serializers import serialize  # Django 1.9 setup issue
        return Response(serialize(repo, request.user), status=201)
    def dispatch(self, request, organization, **kwargs):
        try:
            config = self.get_repository_data(organization, request.data)
            result = self.build_repository_config(organization=organization,
                                                  data=config)
        except Exception as e:
            return self.handle_api_error(e)

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result["name"],
                    external_id=result.get("external_id"),
                    url=result.get("url"),
                    config=result.get("config") or {},
                    provider=self.id,
                    integration_id=result.get("integration_id"),
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result["name"],
                    external_id=result.get("external_id"),
                    url=result.get("url"),
                    config=result.get("config") or {},
                    provider=self.id,
                    integration_id=result.get("integration_id"),
                )
                self.on_delete_repository(repo)
            except IntegrationError:
                pass
            return Response(
                {
                    "errors": {
                        "__all__": "A repository with that name already exists"
                    }
                },
                status=400)
        else:
            repo_linked.send_robust(repo=repo,
                                    user=request.user,
                                    sender=self.__class__)

        analytics.record(
            "integration.repo.added",
            provider=self.id,
            id=result.get("integration_id"),
            organization_id=organization.id,
        )
        return Response(serialize(repo, request.user), status=201)
    def dispatch(self, request, organization, **kwargs):
        try:
            config = self.get_repository_data(organization, request.data)
            result = self.build_repository_config(organization=organization,
                                                  data=config)
        except Exception as e:
            return self.handle_api_error(e)

        repo_update_params = {
            "external_id": result.get("external_id"),
            "url": result.get("url"),
            "config": result.get("config") or {},
            "provider": self.id,
            "integration_id": result.get("integration_id"),
        }

        # first check if there is a repository without an integration that matches
        repo = Repository.objects.filter(organization_id=organization.id,
                                         name=result["name"],
                                         integration_id=None).first()
        if repo:
            if self.logger:
                self.logger.info(
                    "repository.update",
                    extra={
                        "organization_id": organization.id,
                        "repo_name": result["name"],
                        "old_provider": repo.provider,
                    },
                )
            # update from params
            for field_name, field_value in six.iteritems(repo_update_params):
                setattr(repo, field_name, field_value)
            # also update the status if it was in a bad state
            repo.status = ObjectStatus.VISIBLE
            repo.save()
        else:
            try:
                with transaction.atomic():
                    repo = Repository.objects.create(
                        organization_id=organization.id,
                        name=result["name"],
                        **repo_update_params)
            except IntegrityError:
                # Try to delete webhook we just created
                try:
                    repo = Repository(organization_id=organization.id,
                                      name=result["name"],
                                      **repo_update_params)
                    self.on_delete_repository(repo)
                except IntegrationError:
                    pass
                return Response(
                    {
                        "errors": {
                            "__all__":
                            "A repository with that name already exists"
                        }
                    },
                    status=400,
                )
            else:
                repo_linked.send_robust(repo=repo,
                                        user=request.user,
                                        sender=self.__class__)

        analytics.record(
            "integration.repo.added",
            provider=self.id,
            id=result.get("integration_id"),
            organization_id=organization.id,
        )
        return Response(serialize(repo, request.user), status=201)
Exemple #6
0
    def dispatch(self, request, organization, **kwargs):
        if self.needs_auth(request.user):
            # TODO(dcramer): this should be a 401
            return Response(
                {
                    'error_type': 'auth',
                    'auth_url': reverse('socialauth_associate', args=[self.auth_provider]),
                },
                status=400
            )

        try:
            fields = self.get_config()
        except Exception as e:
            return self.handle_api_error(e)

        if request.method == 'GET':
            return Response(fields)

        validator = ConfigValidator(fields, request.data)
        if not validator.is_valid():
            return Response(
                {
                    'error_type': 'validation',
                    'errors': validator.errors,
                }, status=400
            )

        try:
            config = self.validate_config(organization, validator.result, actor=request.user)
        except Exception as e:
            return self.handle_api_error(e)

        try:
            result = self.create_repository(
                organization=organization,
                data=config,
                actor=request.user,
            )
        except PluginError as e:
            logger.exception('repo.create-error')
            return Response(
                {
                    'errors': {
                        '__all__': e.message
                    },
                }, status=400
            )

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                )
                self.delete_repository(repo, actor=request.user)
            except PluginError:
                pass
            return Response(
                {'errors': {'__all__': 'A repository with that name already exists'}},
                status=400,
            )
        else:
            repo_linked.send_robust(repo=repo, user=request.user, sender=self.__class__)

        return Response(serialize(repo, request.user), status=201)
Exemple #7
0
    def dispatch(self, request, organization, **kwargs):
        if self.needs_auth(request.user):
            # TODO(dcramer): this should be a 401
            return Response(
                {
                    "error_type":
                    "auth",
                    "auth_url":
                    reverse("socialauth_associate", args=[self.auth_provider]),
                },
                status=400,
            )

        try:
            fields = self.get_config()
        except Exception as e:
            return self.handle_api_error(e)

        if request.method == "GET":
            return Response(fields)

        validator = ConfigValidator(fields, request.data)
        if not validator.is_valid():
            return Response(
                {
                    "error_type": "validation",
                    "errors": validator.errors
                },
                status=400)

        try:
            config = self.validate_config(organization,
                                          validator.result,
                                          actor=request.user)
        except Exception as e:
            return self.handle_api_error(e)

        try:
            result = self.create_repository(organization=organization,
                                            data=config,
                                            actor=request.user)
        except PluginError as e:
            logger.exception("repo.create-error")
            return Response({"errors": {"__all__": str(e)}}, status=400)

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result["name"],
                    external_id=result.get("external_id"),
                    url=result.get("url"),
                    config=result.get("config") or {},
                    provider=self.id,
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result["name"],
                    external_id=result.get("external_id"),
                    url=result.get("url"),
                    config=result.get("config") or {},
                    provider=self.id,
                )
                self.delete_repository(repo, actor=request.user)
            except PluginError:
                pass
            return Response(
                {
                    "errors": {
                        "__all__": "A repository with that name already exists"
                    }
                },
                status=400)
        else:
            repo_linked.send_robust(repo=repo,
                                    user=request.user,
                                    sender=self.__class__)

        return Response(serialize(repo, request.user), status=201)
Exemple #8
0
    def dispatch(self, request, organization, **kwargs):
        if self.needs_auth(request.user):
            # TODO(dcramer): this should be a 401
            return Response(
                {
                    'error_type': 'auth',
                    'auth_url': reverse('socialauth_associate', args=[self.auth_provider]),
                },
                status=400
            )

        try:
            fields = self.get_config()
        except Exception as e:
            return self.handle_api_error(e)

        if request.method == 'GET':
            return Response(fields)

        validator = ConfigValidator(fields, request.DATA)
        if not validator.is_valid():
            return Response(
                {
                    'error_type': 'validation',
                    'errors': validator.errors,
                }, status=400
            )

        try:
            config = self.validate_config(organization, validator.result, actor=request.user)
        except Exception as e:
            return self.handle_api_error(e)

        try:
            result = self.create_repository(
                organization=organization,
                data=config,
                actor=request.user,
            )
        except PluginError as e:
            logger.exception('repo.create-error')
            return Response(
                {
                    'errors': {
                        '__all__': e.message
                    },
                }, status=400
            )

        try:
            with transaction.atomic():
                repo = Repository.objects.create(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                )
        except IntegrityError:
            # Try to delete webhook we just created
            try:
                repo = Repository(
                    organization_id=organization.id,
                    name=result['name'],
                    external_id=result.get('external_id'),
                    url=result.get('url'),
                    config=result.get('config') or {},
                    provider=self.id,
                )
                self.delete_repository(repo, actor=request.user)
            except PluginError:
                pass
            return Response(
                {'errors': {'__all__': 'A repository with that name already exists'}},
                status=400,
            )
        else:
            repo_linked.send_robust(repo=repo, user=request.user, sender=self.__class__)

        return Response(serialize(repo, request.user), status=201)