def get(self, request, provider=None):
        social_token = get_integration_token(request.user,
                                             provider,
                                             task=request.GET.get('task'))
        if not social_token:
            return Response({'status': 'Unauthorized'},
                            status.HTTP_401_UNAUTHORIZED)

        if provider == GitHubProvider.id:
            r = github.api(endpoint='/user/issues',
                           method='get',
                           params={'filter': 'all'},
                           access_token=social_token.token)
            if r.status_code == 200:
                issues = []
                for issue in r.json():
                    if 'pull_request' in issue:
                        continue  # Github returns both issues and pull requests from this endpoint
                    issue_info = {}
                    for key in github.ISSUE_FIELDS:
                        if key == 'repository':
                            issue_info[key] = github.extract_repo_info(
                                issue[key])
                        else:
                            issue_info[key] = issue[key]
                    issues.append(issue_info)
                return Response(issues)
            return Response(r.json(), r.status_code)
        return Response({'status': 'Not implemented'},
                        status.HTTP_501_NOT_IMPLEMENTED)
    def get(self, request, resource=None):
        app_integration = get_integration_token(request.user,
                                                APP_INTEGRATION_PROVIDER_SLACK,
                                                task=request.GET.get('task'))
        if app_integration and app_integration.extra:
            extra = json.loads(app_integration.extra)
            slack_client = Slacker(app_integration.token)
            response = None
            if resource == 'channels':
                channel_response = slack_client.channels.list(
                    exclude_archived=True)
                if channel_response.successful:
                    response = channel_response.body.get(
                        slack_utils.KEY_CHANNELS, None)
            else:
                response = {
                    'team': {
                        'name': extra.get('team_name'),
                        'id': extra.get('team_id', None)
                    },
                    # 'incoming_webhook': {'channel': extra.get('incoming_webhook').get('channel')}
                }
            if response:
                return Response(response, status.HTTP_200_OK)
            return Response({'status': 'Failed'}, status.HTTP_400_BAD_REQUEST)

        return Response({'status': 'Not implemented'},
                        status.HTTP_501_NOT_IMPLEMENTED)
Exemple #3
0
    def post(self, request, resource=None):
        app_integration = get_integration_token(
            request.user,
            APP_INTEGRATION_PROVIDER_HARVEST,
            task=request.GET.get('task'))
        if app_integration and app_integration.extra:
            token = json.loads(app_integration.extra)
            response = None
            harvest_client = harvest_utils.get_api_client(token,
                                                          user=request.user)

            if resource == 'users':
                harvest_client.create_user(request.data)
            elif resource == 'entries':
                harvest_client.add(request.data)
            elif resource == 'projects':
                harvest_client.create_project(**request.data)
            elif resource == 'tasks':
                project_id = request.query_params.get('project', None)
                if project_id:
                    harvest_client.create_task_to_project(
                        project_id, **request.data)
                else:
                    harvest_client.create_task(**request.data)

                    return Response(
                        response and response.json() or {'status': 'Failed'},
                        response and response.status_code
                        or status.HTTP_400_BAD_REQUEST)

        return Response({'status': 'Not implemented'},
                        status.HTTP_501_NOT_IMPLEMENTED)
Exemple #4
0
    def get(self, request, resource=None):
        app_integration = get_integration_token(
            request.user,
            APP_INTEGRATION_PROVIDER_HARVEST,
            task=request.GET.get('task'))
        if app_integration and app_integration.extra:
            token = json.loads(app_integration.extra)

            response = None
            harvest_client = harvest_utils.get_api_client(token,
                                                          user=request.user)

            if resource == 'projects':
                response = harvest_client.projects()
            elif resource == 'tasks':
                project_id = request.query_params.get('project', None)
                if project_id:
                    response = harvest_client.get_all_tasks_from_project(
                        project_id)
                else:
                    response = harvest_client.tasks()
            elif resource == 'task_assignments':
                project_id = request.query_params.get('project', None)
                if project_id:
                    response = harvest_client.get_all_tasks_from_project(
                        project_id)
            return Response(
                response and response.json() or {'status': 'Failed'},
                response and response.status_code
                or status.HTTP_400_BAD_REQUEST)

        return Response({'status': 'Not implemented'},
                        status.HTTP_501_NOT_IMPLEMENTED)
Exemple #5
0
    def get(self, request, provider=None):
        social_token = get_integration_token(request.user, provider, task=request.GET.get('task'))
        if not social_token:
            return Response({'status': 'Unauthorized'}, status.HTTP_401_UNAUTHORIZED)

        if provider == GitHubProvider.id:
            r = github.api(endpoint='/user/repos', method='get', access_token=social_token.token)
            if r.status_code == 200:
                repos = [github.extract_repo_info(repo) for repo in r.json()]
                return Response(repos)
            return Response(r.json(), r.status_code)
        return Response({'status': 'Not implemented'}, status.HTTP_501_NOT_IMPLEMENTED)
Exemple #6
0
    def get(self, request, provider=None):
        social_token = get_integration_token(request.user, provider, task=request.GET.get('task'))
        if not social_token:
            return Response({'status': 'Unauthorized'}, status.HTTP_401_UNAUTHORIZED)

        if provider == GitHubProvider.id:
            r = github.api(endpoint='/user/repos', method='get', access_token=social_token.token)
            if r.status_code == 200:
                repos = [github.extract_repo_info(repo) for repo in r.json()]
                return Response(repos)
            return Response(r.json(), r.status_code)
        return Response({'status': 'Not implemented'}, status.HTTP_501_NOT_IMPLEMENTED)
Exemple #7
0
    def get(self, request, resource=None):
        app_integration = get_integration_token(
            request.user, APP_INTEGRATION_PROVIDER_SLACK, task=request.GET.get('task')
        )
        if app_integration and app_integration.extra:
            extra = json.loads(app_integration.extra)
            slack_client = Slacker(app_integration.token)
            response = None
            if resource == 'channels':
                channel_response = slack_client.channels.list(exclude_archived=True)
                if channel_response.successful:
                    response = channel_response.body.get(slack_utils.KEY_CHANNELS, None)
            else:
                response = {
                    'team': {'name': extra.get('team_name'), 'id': extra.get('team_id', None)},
                    # 'incoming_webhook': {'channel': extra.get('incoming_webhook').get('channel')}
                }
            if response:
                return Response(response, status.HTTP_200_OK)
            return Response({'status': 'Failed'}, status.HTTP_400_BAD_REQUEST)

        return Response({'status': 'Not implemented'}, status.HTTP_501_NOT_IMPLEMENTED)
Exemple #8
0
    def get(self, request, provider=None):
        social_token = get_integration_token(request.user, provider, task=request.GET.get('task'))
        if not social_token:
            return Response({'status': 'Unauthorized'}, status.HTTP_401_UNAUTHORIZED)

        if provider == GitHubProvider.id:
            r = github.api(endpoint='/user/issues', method='get', params={'filter': 'all'},
                           access_token=social_token.token)
            if r.status_code == 200:
                issues = []
                for issue in r.json():
                    if 'pull_request' in issue:
                        continue  # Github returns both issues and pull requests from this endpoint
                    issue_info = {}
                    for key in github.ISSUE_FIELDS:
                        if key == 'repository':
                            issue_info[key] = github.extract_repo_info(issue[key])
                        else:
                            issue_info[key] = issue[key]
                    issues.append(issue_info)
                return Response(issues)
            return Response(r.json(), r.status_code)
        return Response({'status': 'Not implemented'}, status.HTTP_501_NOT_IMPLEMENTED)
Exemple #9
0
    def integration(self, request, pk=None, provider=None):
        """
        Manage Task Integrations
        ---
        serializer: IntegrationSerializer
        omit_parameters:
            - query
        """
        get_object_or_404(self.queryset, pk=pk)
        queryset = Integration.objects.filter(task_id=pk, provider=provider)
        if request.method == 'GET':
            instance = get_object_or_404(queryset)
            self.check_object_permissions(request, instance)
            serializer = self.get_serializer(instance, context={'request': request})
            return Response(serializer.data)
        elif request.method == 'POST':
            request_data = dict(request.data)
            request_data['provider'] = provider
            request_data['task'] = pk

            try:
                instance = queryset.latest('created_at')
            except Integration.DoesNotExist:
                instance = None

            if instance:
                self.check_object_permissions(request, instance)
            else:
                self.check_permissions(request)
            serializer = self.get_serializer(instance, data=request_data, context={'request': request})
            serializer.is_valid(raise_exception=True)

            if provider == GitHubProvider.id:
                secret = get_random_string()
                if instance:
                    secret = instance.secret or secret

                data = {
                    'name': 'web',
                    'config': {
                        'url': '%s://%s/task/%s/hook/%s/' % (request.scheme, request.get_host(), pk, provider),
                        'content_type': 'json',
                        'secret': secret
                    },
                    'events': github.transform_to_github_events(request_data['events']),
                    'active': True
                }

                repo_full_name = None
                repo = request_data.get('repo', None)
                if repo:
                    repo_full_name = repo.get('full_name', None)
                if not repo_full_name and instance:
                    repo_full_name = instance.repo_full_name

                if not repo_full_name:
                    return Response({'status': 'Bad Request'}, status.HTTP_400_BAD_REQUEST)

                web_hook_endpoint = '/repos/%s/hooks' % repo_full_name
                hook_method = 'post'

                if instance and instance.hook_id:
                    web_hook_endpoint += '/%s' % instance.hook_id
                    hook_method = 'patch'

                social_token = get_integration_token(request.user, provider, task=pk)
                if not social_token:
                    return Response({'status': 'Unauthorized'}, status.HTTP_401_UNAUTHORIZED)

                r = github.api(endpoint=web_hook_endpoint, method=hook_method, data=data, access_token=social_token.token)
                if r.status_code in [200, 201]:
                    hook = r.json()
                    integration = serializer.save(secret=secret)
                    if 'id' in hook:
                        IntegrationMeta.objects.update_or_create(
                                integration=integration, meta_key='hook_id', defaults={'meta_value': hook['id']}
                        )
                    if not integration.token:
                        save_integration_tokens(request.user, pk, provider)
                    return Response(serializer.data)
                return Response(r.json(), r.status_code)
            else:
                integration = serializer.save()
                if not integration.token:
                    save_integration_tokens(request.user, pk, provider)
                return Response(serializer.data)
        else:
            return Response({'status': 'Method not allowed'}, status.HTTP_405_METHOD_NOT_ALLOWED)