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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)