Example #1
0
def datapoints(request):
	response = HttpResponse()
	response.status = 400

	if request.method == GET:
		entries = DataPoint.objects.all()
		dicts = []
		for entry in entries:
			dicts.append(entry.to_dict())
		response.body = json.dumps(dicts)
		response.status = 200
	elif request.method == POST:
		data = json.loads(getBody(request))

		try:
			entry = DataPoint(**data)
			entry.full_clean()
			entry.save()

			response.body = entry.to_json()
			response.status = 201
		except ValidationError:
			response.status = 400
		except IntegrityError:
			response.status = 400

	return response
Example #2
0
def activity_state_get(req_dict):
    # add ETag for concurrency
    state_id = req_dict['params'].get('stateId', None)
    activity_id = req_dict['params']['activityId']
    agent = req_dict['params']['agent']
    a = Agent.objects.retrieve_or_create(**agent)[0]
    registration = req_dict['params'].get('registration', None)
    actstate = ActivityStateManager(a)
    # state id means we want only 1 item
    if state_id:
        resource = actstate.get_state(activity_id, registration, state_id)
        if resource.state:
            response = HttpResponse(resource.state.read(), content_type=resource.content_type)
        else:
            response = HttpResponse(resource.json_state, content_type=resource.content_type)
        response['ETag'] = '"%s"' % resource.etag
    # no state id means we want an array of state ids
    else:
        since = req_dict['params'].get('since', None)
        resource = actstate.get_state_ids(activity_id, registration, since)
        response = HttpResponse(json.dumps([k for k in resource]), content_type="application/json")
    
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        response.body = ''

    return response
Example #3
0
def activity_profile_get(req_dict):
    # Instantiate ActivityProfile
    ap = ActivityProfileManager()
    # Get profileId and activityId
    profile_id = req_dict['params'].get('profileId', None) if 'params' in req_dict else None
    activity_id = req_dict['params'].get('activityId', None) if 'params' in req_dict else None
    
    #If the profileId exists, get the profile and return it in the response
    if profile_id:
        resource = ap.get_profile(profile_id, activity_id)
        if resource.profile:
            try:
                response = HttpResponse(resource.profile.read(), content_type=resource.content_type)
            except IOError:
                response = HttpResponseNotFound("Error reading file, could not find: %s" % profile_id)
        else:
            response = HttpResponse(resource.json_profile, content_type=resource.content_type)
        response['ETag'] = '"%s"' % resource.etag
        return response

    #Return IDs of profiles stored since profileId was not submitted
    since = req_dict['params'].get('since', None) if 'params' in req_dict else None
    resource = ap.get_profile_ids(activity_id, since)
    response = JsonResponse([k for k in resource], safe=False)
    response['since'] = since
    
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        response.body = ''
    return response
def agent_profile_get(req_dict):
    # add ETag for concurrency
    agent = req_dict['params']['agent']
    a = Agent.objects.retrieve_or_create(**agent)[0]
    ap = AgentProfileManager(a)

    profileId = req_dict['params'].get('profileId', None) if 'params' in req_dict else None
    if profileId:
        resource = ap.get_profile(profileId)
        if resource.profile:
            response = HttpResponse(resource.profile.read(), content_type=resource.content_type)
        else:
            response = HttpResponse(resource.json_profile, content_type=resource.content_type)
        response['ETag'] = '"%s"' % resource.etag
        return response

    since = req_dict['params'].get('since', None) if 'params' in req_dict else None
    resource = ap.get_profile_ids(since)
    response = HttpResponse(json.dumps([k for k in resource]), content_type="application/json")

    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        response.body = ''

    return response
Example #5
0
def statements_get(req_dict):
    stmt_result = {}
    mime_type = "application/json"
    # If statementId is in req_dict then it is a single get - can still include attachments
    # or have a different format
    if 'statementId' in req_dict:     
        if req_dict['params']['attachments']:
            resp, content_length = process_complex_get(req_dict)
        else:
            st = Statement.objects.get(statement_id=req_dict['statementId'])
            
            stmt_result = json.dumps(st.to_dict(format=req_dict['params']['format']))
            resp = HttpResponse(stmt_result, content_type=mime_type, status=200)
            content_length = len(stmt_result)
    # Complex GET
    else:
        resp, content_length = process_complex_get(req_dict)
        
    # Set consistent through and content length headers for all responses
    try:
        resp['X-Experience-API-Consistent-Through'] = str(Statement.objects.latest('stored').stored)
    except:
        resp['X-Experience-API-Consistent-Through'] = str(datetime.now())
    
    resp['Content-Length'] = str(content_length) 

    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''

    return resp
Example #6
0
def agent_profile_get(req_dict):
    # add ETag for concurrency
    agent = req_dict['params']['agent']
    a = Agent.objects.retrieve_or_create(**agent)[0]
    ap = AgentProfileManager(a)

    profileId = req_dict['params'].get('profileId',
                                       None) if 'params' in req_dict else None
    if profileId:
        resource = ap.get_profile(profileId)
        if resource.profile:
            response = HttpResponse(resource.profile.read(),
                                    content_type=resource.content_type)
        else:
            response = HttpResponse(resource.json_profile,
                                    content_type=resource.content_type)
        response['ETag'] = '"%s"' % resource.etag
        return response

    since = req_dict['params'].get('since',
                                   None) if 'params' in req_dict else None
    resource = ap.get_profile_ids(since)
    response = HttpResponse(json.dumps([k for k in resource]),
                            content_type="application/json")

    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        response.body = ''

    return response
Example #7
0
def activity_state_get(req_dict):
    # add ETag for concurrency
    state_id = req_dict['params'].get('stateId', None)
    activity_id = req_dict['params']['activityId']
    agent = req_dict['params']['agent']
    a = Agent.objects.retrieve_or_create(**agent)[0]
    registration = req_dict['params'].get('registration', None)
    actstate = ActivityStateManager(a)
    # state id means we want only 1 item
    if state_id:
        resource = actstate.get_state(activity_id, registration, state_id)
        if resource.state:
            response = HttpResponse(resource.state.read(),
                                    content_type=resource.content_type)
        else:
            response = HttpResponse(resource.json_state,
                                    content_type=resource.content_type)
        response['ETag'] = '"%s"' % resource.etag
    # no state id means we want an array of state ids
    else:
        since = req_dict['params'].get('since', None)
        resource = actstate.get_state_ids(activity_id, registration, since)
        response = HttpResponse(json.dumps([k for k in resource]),
                                content_type="application/json")

    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        response.body = ''

    return response
Example #8
0
def statements_get(req_dict):
    stmt_result = {}
    mime_type = "application/json"
    # If statementId is in req_dict then it is a single get - can still include attachments
    # or have a different format
    if 'statementId' in req_dict:
        if req_dict['params']['attachments']:
            resp, content_length = process_complex_get(req_dict)
        else:
            st = Statement.objects.get(statement_id=req_dict['statementId'])

            stmt_result = json.dumps(
                st.to_dict(format=req_dict['params']['format']))
            resp = HttpResponse(stmt_result,
                                content_type=mime_type,
                                status=200)
            content_length = len(stmt_result)
    # Complex GET
    else:
        resp, content_length = process_complex_get(req_dict)

    # Set consistent through and content length headers for all responses
    try:
        resp['X-Experience-API-Consistent-Through'] = str(
            Statement.objects.latest('stored').stored)
    except:
        resp['X-Experience-API-Consistent-Through'] = str(datetime.now())

    resp['Content-Length'] = str(content_length)

    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''

    return resp
Example #9
0
def statements_more_get(req_dict):
    stmt_result, attachments = get_more_statement_request(req_dict['more_id'])     

    if isinstance(stmt_result, dict):
        content_length = len(json.dumps(stmt_result))
    else:
        content_length = len(stmt_result)
    mime_type = "application/json"

    # If there are attachments, include them in the payload
    if attachments:
        stmt_result, mime_type, content_length = build_response(stmt_result)
        resp = HttpResponse(stmt_result, content_type=mime_type, status=200)
    # If not, just dump the stmt_result
    else:
        if isinstance(stmt_result, basestring):
            resp = HttpResponse(stmt_result, content_type=mime_type, status=200)
        else:
            resp = HttpResponse(json.dumps(stmt_result), content_type=mime_type, status=200)
    
    # Add consistent header and set content-length
    try:
        resp['X-Experience-API-Consistent-Through'] = str(Statement.objects.latest('stored').stored)
    except:
        resp['X-Experience-API-Consistent-Through'] = str(datetime.now())
    resp['Content-Length'] = str(content_length)
    
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''

    return resp
Example #10
0
def activity_profile_get(req_dict):
    # Instantiate ActivityProfile
    ap = ActivityProfileManager()
    # Get profileId and activityId
    profile_id = req_dict['params'].get('profileId', None) if 'params' in req_dict else None
    activity_id = req_dict['params'].get('activityId', None) if 'params' in req_dict else None
    
    #If the profileId exists, get the profile and return it in the response
    if profile_id:
        resource = ap.get_profile(profile_id, activity_id)
        if resource.profile:
            try:
                response = HttpResponse(resource.profile.read(), content_type=resource.content_type)
            except IOError:
                response = HttpResponseNotFound("Error reading file, could not find: %s" % profile_id)
        else:
            response = HttpResponse(resource.json_profile, content_type=resource.content_type)
        response['ETag'] = '"%s"' % resource.etag
        return response

    #Return IDs of profiles stored since profileId was not submitted
    since = req_dict['params'].get('since', None) if 'params' in req_dict else None
    resource = ap.get_profile_ids(activity_id, since)
    response = JsonResponse([k for k in resource], safe=False)
    response['since'] = since
    
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        response.body = ''
    return response
Example #11
0
def statements_more_get(req_dict):
    stmt_result, attachments = parse_more_request(req_dict['more_id'])     

    if isinstance(stmt_result, dict):
        content_length = len(json.dumps(stmt_result))
    else:
        content_length = len(stmt_result)
    mime_type = "application/json"

    # If there are attachments, include them in the payload
    if attachments:
        stmt_result, mime_type, content_length = build_response(stmt_result)
        resp = HttpResponse(stmt_result, content_type=mime_type, status=200)
    # If not, just dump the stmt_result
    else:
        if isinstance(stmt_result, basestring):
            resp = HttpResponse(stmt_result, content_type=mime_type, status=200)
        else:
            resp = HttpResponse(json.dumps(stmt_result), content_type=mime_type, status=200)
    
    # Add consistent header and set content-length
    try:
        resp['X-Experience-API-Consistent-Through'] = str(Statement.objects.latest('stored').stored)
    except:
        resp['X-Experience-API-Consistent-Through'] = str(datetime.now())
    resp['Content-Length'] = str(content_length)
    
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''

    return resp
Example #12
0
def agents_get(req_dict):
    a = Agent.objects.get(**req_dict['agent_ifp'])    
    agent_data = json.dumps(a.to_dict_person(), sort_keys=False)
    resp = HttpResponse(agent_data, content_type="application/json", status=200)
    resp['Content-Length'] = str(len(agent_data))
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''
    return resp
Example #13
0
def agents_get(req_dict):
    a = Agent.objects.get(**req_dict['agent_ifp'])
    agent_data = json.dumps(a.to_dict_person())
    resp = HttpResponse(agent_data, mimetype="application/json")
    resp['Content-Length'] = str(len(agent_data))
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''
    return resp
Example #14
0
def activities_get(req_dict):
    activity_id = req_dict['params']['activityId']
    act = Activity.objects.get(activity_id=activity_id, authority__isnull=False)
    return_act = json.dumps(act.return_activity_with_lang_format('all'), sort_keys=False)    
    resp = HttpResponse(return_act, content_type="application/json", status=200)
    resp['Content-Length'] = str(len(return_act))
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''
    return resp
Example #15
0
def activities_get(req_dict):
    activity_id = req_dict['params']['activityId']
    act = Activity.objects.get(activity_id=activity_id, authority__isnull=False)
    return_act = json.dumps(act.return_activity_with_lang_format('all'), sort_keys=False)    
    resp = HttpResponse(return_act, content_type="application/json", status=200)
    resp['Content-Length'] = str(len(return_act))
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''
    return resp
Example #16
0
def datapoint(request, id):
	response = HttpResponse()
	response.status = 400

	try:
		if request.method == GET:
			response.body = DataPoint.objects.get(pk=id).to_json()
			response.status = 200
		elif request.method == PUT:
			data = json.loads(getBody(request))
			DataPoint.objects.filter(pk=id).update(**data)
			response.body = DataPoint.objects.get(pk=id).to_json()
			response.status = 200
		elif request.method == DELETE:
			DataPoint.objects.get(pk=id).delete()
			response.status = 200
	except ObjectDoesNotExist:
			response.status = 404

	return response
Example #17
0
def activities_get(req_dict):
    activityId = req_dict['params']['activityId']
    act = Activity.objects.get(activity_id=activityId, canonical_version=True)
    return_act = json.dumps(act.to_dict())
    resp = HttpResponse(return_act, mimetype="application/json", status=200)
    resp['Content-Length'] = str(len(return_act))

    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''

    return resp
Example #18
0
def activities_get(req_dict):
    activityId = req_dict['params']['activityId']
    act = Activity.objects.get(activity_id=activityId, canonical_version=True)    
    return_act = json.dumps(act.to_dict())    
    resp = HttpResponse(return_act, mimetype="application/json", status=200)
    resp['Content-Length'] = str(len(return_act))
    
    # If it's a HEAD request
    if req_dict['method'].lower() != 'get':
        resp.body = ''

    return resp
Example #19
0
def measurements(request, datapoint_id):
	response = HttpResponse()
	response.status = 400

	if request.method == GET:
		try:
			datapoint = DataPoint.objects.get(pk=datapoint_id)
			entries = datapoint.measurement_set.all()
			dicts = []
			for entry in entries:
				dicts.append(entry.to_dict())
			response.body = json.dumps(dicts)
			response.status = 200
				
		except ObjectDoesNotExist:
			response.status = 404
	elif request.method == POST:
		data = json.loads(getBody(request))

		try:
			datapoint = DataPoint.objects.get(pk=datapoint_id)
			entry = Measurement()
			entry.datapoint = datapoint
			entry.setData(**data)
			entry.full_clean()
			entry.save()

			response.body = entry.to_json()
			response.status = 201
		except ValidationError:
			response.status = 400
		except IntegrityError:
			response.status = 400
		except KeyError:
			response.status = 400
		except ObjectDoesNotExist:
			response.status = 404

	return response
Example #20
0
def measurement(request, datapoint_id, measurement_id):
	response = HttpResponse()
	response.status = 400

	try:
		if request.method == GET:
			response.body = Measurement.objects.get(pk=measurement_id).to_json()
			response.status = 200
		elif request.method == PUT:
			data = json.loads(getBody(request))
			measurement = Measurement.objects.get(pk=measurement_id)
			measurement.setData(**data)
			measurement.save()
			response.body = Measurement.objects.get(pk=measurement_id).to_json()
			response.status = 200
		elif request.method == DELETE:
			Measurement.objects.get(pk=measurement_id).delete()
			response.status = 200
	except ObjectDoesNotExist:
			response.status = 404

	return response
Example #21
0
def assignObservable(request, datapoint_id, observable_id):
	response = HttpResponse()
	response.status = 400

	try:
		if request.method == PUT:
			datapoint = DataPoint.objects.get(pk=datapoint_id)
			datapoint.observable_id = observable_id
			datapoint.save()
			response.body = DataPoint.objects.get(pk=datapoint_id).to_json()
			response.status = 200
	except ObjectDoesNotExist:
			response.status = 404

	return response
Example #22
0
def submitRequest(request):
    context = RequestContext(request)

    fieldsWithValues = dict()

    # Parse the parameters
    for key, vallist in request.GET.iterlists():
        fieldsWithValues[key] = vallist

    print fieldsWithValues

    # Grab list of field names requested by the user
    # This comes as a GET parameter "fieldName". There will be many parameters
    # with the same key and hence a list
    fieldNamesList = fieldsWithValues['fieldName'] if fieldsWithValues.has_key(
        'fieldName') else None
    toPhoneNumberList = fieldsWithValues['phone'] if fieldsWithValues.has_key(
        'phone') else None
    toEmailList = fieldsWithValues['email'] if fieldsWithValues.has_key(
        'email') else None

    # There should be at least one email or phone.
    if ((toPhoneNumberList is not None and len(toPhoneNumberList) == 0)
            or (toEmailList is not None and len(toEmailList) == 0)
            or (toPhoneNumberList is None and toEmailList is None)):
        response = HttpResponse(status=400)
        response.body("Please enter at least one email or phone number"
                      )  # FIXME: Fixthis
        return response

    toPhoneNumber = toPhoneNumberList[
        0] if toPhoneNumberList is not None and len(
            toPhoneNumberList) > 0 else None
    toEmail = toEmailList[0] if toEmailList is not None and len(
        toEmailList) > 0 else None

    # Create an object to store the field names and save it in JSON format
    requestData = {'fields': fieldNamesList}
    requestDataJson = json.dumps(requestData)
    requestObj = Request(phone=toPhoneNumber,
                         email=toEmail,
                         requestData=requestDataJson)
    requestObj.save()  # Save it to generate an ID

    # Get absolute base URL for this service and build response Url
    # Ex: http://www.example.com/response
    baseUrl = request.build_absolute_uri()
    responseUrlBase = urlparse.urljoin(baseUrl, RESPONSE_LOCATION)

    # Generate a URL with requestObj Id to post the Response
    # Ex: http://www.example.com/response?id=1
    params = urllib.urlencode({'id': requestObj.id})
    responseUrl = responseUrlBase + "?" + params

    # Save url in obj (don't save it yet)
    requestObj.url_short = shorten(responseUrl)
    requestObj.url_full = responseUrl

    print responseUrl

    # Now send the URLs out
    notificationSuccess = False
    notificationError = "Unable to send email or sms. Please try again later. "

    if toPhoneNumber is not None:
        print "Trying to send sms"
        smsClient = SmsClient()
        result = None
        try:
            result = smsClient.send(toPhoneNumber, requestObj.url_short)
            notificationSuccess = True
        except twilio.TwilioRestException as e:
            print e
            notificationError = notificationError + "\r\n" + str(e)
            notificationSuccess = False

    if toEmail is not None:
        # FIXME: Send out emails
        print "Trying to send email"
        notificationSuccess = notificationSuccess or False

    viewContextDict = {'error': None}
    if not notificationSuccess:  # We did not notify the user about this request. No use in storing request obj
        requestObj.delete()
        viewContextDict['error'] = notificationError
    else:
        # Successful notification. Go ahead and save the urls in db
        requestObj.save()
        viewContextDict['id'] = requestObj.id

    return render_to_response('main/request.html', viewContextDict, context)