Пример #1
0
def auth_details(request):
    """
        RESTful endpoint to pass authentication details
    """

    try:

        request_data = json.loads(request.body)

        # Check for all required fields
        if 'org_id' not in request_data or 'access_token' not in request_data or 'instance_url' not in request_data:

            response_data = {
                'status': 'Error',
                'success':  False,
                'error_text': 'Not all required fields were found in the message. Please ensure org_id, access_token and instance_url are all passed in the payload'
            }

        # All fields exist. Start job and send response
        else:

            # create the schema record to store results
            schema = Schema()
            schema.random_id = uuid.uuid4()
            schema.created_date = datetime.datetime.now()
            schema.org_id = request_data['org_id']
            schema.access_token = request_data['access_token']
            schema.instance_url = request_data['instance_url']
            schema.status = 'Running'

            # get the org name of the authenticated user
            r = requests.get(schema.instance_url + '/services/data/v' + str(settings.SALESFORCE_API_VERSION) + '.0/sobjects/Organization/' + schema.org_id + '?fields=Name', headers={'Authorization': 'OAuth ' + schema.access_token})
            schema.org_name = json.loads(r.text)['Name']

            # Save the schema
            schema.save()

            # Run job
            get_objects_and_fields.delay(schema)

            # Build response 
            response_data = {
                'job_url': 'https://testschemalister.herokuapp.com/loading/' + str(schema.random_id) + '/?noheader=1',
                'status': 'Success',
                'success': True
            }

    except Exception as error:

        # If there is an error, raise exception and return
        response_data = {
            'status': 'Error',
            'success':  False,
            'error_text': str(error)
        }
    
    return HttpResponse(json.dumps(response_data), content_type = 'application/json')
Пример #2
0
def oauth_response(request):

    error_exists = False
    error_message = ''
    username = ''
    org_name = ''

    # On page load
    if request.GET:

        oauth_code = request.GET.get('code')
        environment = request.GET.get('state')
        access_token = ''
        instance_url = ''
        org_id = ''

        if 'Production' in environment:
            login_url = 'https://login.salesforce.com'
        else:
            login_url = 'https://test.salesforce.com'

        r = requests.post(
            login_url + '/services/oauth2/token',
            headers={'content-type': 'application/x-www-form-urlencoded'},
            data={
                'grant_type': 'authorization_code',
                'client_id': settings.SALESFORCE_CONSUMER_KEY,
                'client_secret': settings.SALESFORCE_CONSUMER_SECRET,
                'redirect_uri': settings.SALESFORCE_REDIRECT_URI,
                'code': oauth_code
            })
        auth_response = json.loads(r.text)

        if 'error_description' in auth_response:
            error_exists = True
            error_message = auth_response['error'] + ' - ' + auth_response[
                'error_description']
        else:
            access_token = auth_response['access_token']
            instance_url = auth_response['instance_url']
            user_id = auth_response['id'][-18:]
            org_id = auth_response['id'][:-19]
            org_id = org_id[-18:]

            # get username of the authenticated user
            r = requests.get(
                instance_url + '/services/data/v' +
                str(settings.SALESFORCE_API_VERSION) + '.0/sobjects/User/' +
                user_id + '?fields=Username',
                headers={'Authorization': 'OAuth ' + access_token})
            query_response = json.loads(r.text)
            username = query_response['Username']

            # get the org name of the authenticated user
            r = requests.get(
                instance_url + '/services/data/v' +
                str(settings.SALESFORCE_API_VERSION) +
                '.0/sobjects/Organization/' + org_id + '?fields=Name',
                headers={'Authorization': 'OAuth ' + access_token})
            org_name = json.loads(r.text)['Name']

        login_form = LoginForm(
            initial={
                'environment': environment,
                'access_token': access_token,
                'instance_url': instance_url,
                'org_id': org_id
            })

    # Run after user selects logout or get schema
    if request.POST:

        login_form = LoginForm(request.POST)

        if login_form.is_valid():

            environment = login_form.cleaned_data['environment']
            access_token = login_form.cleaned_data['access_token']
            instance_url = login_form.cleaned_data['instance_url']
            org_id = login_form.cleaned_data['org_id']

            if 'logout' in request.POST:

                r = requests.post(instance_url + '/services/oauth2/revoke',
                                  headers={
                                      'content-type':
                                      'application/x-www-form-urlencoded'
                                  },
                                  data={'token': access_token})
                return HttpResponseRedirect(
                    '/logout?instance_prefix=' + instance_url.replace(
                        'https://', '').replace('.salesforce.com', ''))

            if 'get_schema' in request.POST:

                # Create schema record
                schema = Schema()
                schema.random_id = uuid.uuid4()
                schema.created_date = datetime.datetime.now()
                schema.org_id = org_id
                schema.org_name = org_name
                schema.access_token = access_token
                schema.instance_url = instance_url
                schema.include_field_usage = login_form.cleaned_data[
                    'include_field_usage']
                schema.include_managed_objects = login_form.cleaned_data[
                    'include_managed_objects']
                schema.status = 'Running'
                schema.save()

                # Queue job to run async
                try:
                    get_objects_and_fields.delay(schema)
                except:
                    # If fail above, wait 5 seconds and try again. Not ideal but should work for now
                    sleep(5)
                    try:
                        get_objects_and_fields.delay(schema)
                    except Exception as error:
                        schema.status = 'Error'
                        schema.error = error
                        schema.save()

                return HttpResponseRedirect('/loading/' +
                                            str(schema.random_id))

    return render_to_response(
        'oauth_response.html',
        RequestContext(
            request, {
                'error': error_exists,
                'error_message': error_message,
                'username': username,
                'org_name': org_name,
                'login_form': login_form
            }))