def aqfeed_list(request): """ List all data points for the last two days or create a new datapoint. """ if request.method == 'GET': ed = datetime.datetime.now() sd = ed - datetime.timedelta(days=2) aqfeeds = AQFeed.objects.raw_query( { "created_on": { '$gte': sd, '$lte': ed }, } ).order_by("-created_on") serializer = AQFeedSerializer(aqfeeds, many=True) return Response(serializer.data) elif request.method == 'POST': serializer = AQFeedSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def aqfeed_detail(request, imei): """ Retrieve, update or delete a feed instance. """ try: ed = datetime.datetime.now() sd = ed - datetime.timedelta(days=7) aqfeed = AQFeed.objects.raw_query( { "created_on": { '$gte': sd, '$lte': ed }, "imei":imei } ).order_by("-created_on") except AQFeed.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': serializer = AQFeedSerializer(aqfeed, data=request.data, many=True) if serializer.is_valid(): #serializer.save() return Response(serializer.data) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) #serializer = AQFeedSerializer(aqfeed) #return Response(serializer.data) elif request.method == 'PUT': serializer = AQFeedSerializer(aqfeed, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE': aqfeed.delete() return Response(status=status.HTTP_204_NO_CONTENT)
def aqdatapoint(request): """ Add a AQ data point via GET """ deviceip = get_client_ip(request) f = open('/tmp/aqrequest.log', 'a+') f.write("\n" + str(deviceip)) if request.method == "GET": d={} d['imei'] = request.GET['i'] d['humidity'] = request.GET['h'] d['temperature'] = request.GET['t'] d['pm10'] = request.GET['10'] d['pm25'] = request.GET['25'] d['count_large'] = request.GET['l'] d['count_small'] = request.GET['s'] d['created_on'] = datetime.datetime.now() d['ip'] = deviceip #import pdb; pdb.set_trace() if float(d['pm25']) > 1500 or float(d['pm10']) > 1500: f.write("\nInvalid data: " + str(d)) f.close() return Response({"Feed not parsed!":"Values too large"}, status=status.HTTP_400_BAD_REQUEST) try: #import pdb; pdb.set_trace() try: deviceip = request.GET['ip'] except: pass #1. check the device IP and load lat, lon from there, if changed, update location aqd = AQDevice.objects.get(imei=d['imei']) if aqd.ip != deviceip: #2. if not matching , ask for new geo loc. #even if call fails, fail silently since device streams every 5 min. ipdetails = requests.get("http://ip-api.com/json/"+ deviceip ).json() aqd.ip = deviceip #aqd.lat = ipdetails['lat'] #aqd.lon = ipdetails['lon'] # Until GPS coarse loc is available, turn off overwriting #aqd.geom = {u'type': u'Point', u'coordinates': [ipdetails['lon'], ipdetails['lat']} # 3. Update state, city details if device changes locations try: # 4. Check and get state in incoming IP s = getState(ipdetails) c = create_or_getCity(ipdetails['city'], s, ipdetails['lat'], ipdetails['lon']) # update status as live. s.live="true" s.save() c.live="true" c.save() except: import sys f.write("\nERROR: " + str(sys.exc_info())) #after ascertaining city and state objects, save aqd aqd.city = c.name aqd.state = s.name # Until GPS coarse loc is available, turn off overwriting #aqd.save() #f.write("\nAQD:" + str(aqd.__dict__)) #write to log if loc of AQD changed. d['lat']=ipdetails['lat'] d['lat']=ipdetails['lat'] else: d['lat'] = aqd.geom['coordinates'][1] d['lon'] = aqd.geom['coordinates'][0] except: import sys f.write("\nERROR: " + str(sys.exc_info())) f.write("\nAQFeed:" + str(d)) f.close() serializer = AQFeedSerializer(data=d) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def aqdatapoint(request): """ Add a AQ data point via GET """ #import pdb; pdb.set_trace() deviceip = get_client_ip(request) f = open('aqrequest.log', 'a+') f.write("\n" + str(deviceip)) if request.method == "GET": d={} try: try: d['imei'] = request.GET['i'] d['humidity'] = request.GET['h'] d['temperature'] = request.GET['t'] d['pm10'] = request.GET['10'] d['pm25'] = request.GET['25'] d['count_large'] = request.GET['l'] d['count_small'] = request.GET['s'] d['ip'] = deviceip except: d['imei'] = request.GET['imei'] d['lon'] = request.GET['lon'] d['lat'] = request.GET['lat'] d['pm10conc'] = request.GET['pm10conc'] d['pm25conc'] = request.GET['pm25conc'] d['pm10count'] = request.GET['pm10count'] d['pm25count'] = request.GET['pm25count'] d['humidity'] = request.GET['humidity'] d['temperature'] = request.GET['temp'] d['pm10avg'] = request.GET['pm10avg'] d['pm25avg'] = request.GET['pm25avg'] d['pm10countavg'] = request.GET['pm10countavg'] d['pm25countavg'] = request.GET['pm25countavg'] try: # new fields from 2nd gen devices d['aqi'] = request.GET['aqi'] d['aqi10'] = request.GET['aqi10'] d['aqi25'] = request.GET['aqi25'] except: pass try: #legacy fields d['count_large'] = request.GET['pm10conc'] d['count_small'] = request.GET['pm25conc'] d['pm10'] = request.GET['pm10count'] d['pm25'] = request.GET['pm25count'] except: pass except: import sys f.write("\nERROR: " + str(sys.exc_info())) d['created_on'] = request.GET.get('created_on', datetime.datetime.now()) # try: # if float(d['pm25']) > 1500 or float(d['pm10']) > 1500: # f.write("\nInvalid data: " + str(d)) # f.close() # return Response({"Feed not parsed!":"Values too large"}, status=status.HTTP_400_BAD_REQUEST) # except: # pass try: #1. check the device IP and load lat, lon from there, if changed, update location aqd = AQDevice.objects.get(imei=d['imei']) try: if not (d['lat'] == aqd.geom['coordinates'][1] and d['lon'] == aqd.geom['coordinates'][0]): try: aqd.geom = {u'type': u'Point', u'coordinates': [d['lon'], d['lat']]} aqd.save() except: import sys f.write("\nERROR updating location: " + str(sys.exc_info())) except: pass #if aqd.geom != deviceip: #if not (d['lat'] = aqd.geom['coordinates'][1] and d['lon'] = aqd.geom['coordinates'][0]) : #2. if not matching , ask for new geo loc. #even if call fails, fail silently since device streams every 5 min. #ipdetails = requests.get("http://ip-api.com/json/"+ deviceip ).json() #aqd.ip = deviceip #aqd.lat = ipdetails['lat'] #aqd.lon = ipdetails['lon'] # Until GPS coarse loc is available, turn off overwriting #aqd.geom = {u'type': u'Point', u'coordinates': [d['lon'], d['lat']]} #aqd.save() # 3. Update state, city details if device changes locations #try: # # 4. Check and get state in incoming IP # s = getState(ipdetails) # //jj needs geo lookup # c = create_or_getCity(ipdetails['city'], s, ipdetails['lat'], ipdetails['lon']) # # update status as live. # s.live="true" # s.save() # c.live="true" # c.save() #except: # import sys # f.write("\nERROR: " + str(sys.exc_info())) #after ascertaining city and state objects, save aqd #aqd.city = c.name #aqd.state = s.name # Until GPS coarse loc is available, turn off overwriting #aqd.save() #f.write("\nAQD:" + str(aqd.__dict__)) #write to log if loc of AQD changed. #d['lat']=ipdetails['lat'] #d['lat']=ipdetails['lat'] #else: #d['lat'] = aqd.geom['coordinates'][1] #d['lon'] = aqd.geom['coordinates'][0] except: import sys f.write("\nERROR: " + str(sys.exc_info())) f.write("\nAQFeed:" + str(d)) f.close() try: serLatest = AQFeedLatest.objects.get(imei=d['imei']) try: serLatest.humidity = d['humidity'] serLatest.temperature = d['temperature'] serLatest.pm10 = d['pm10'] serLatest.pm25 = d['pm25'] serLatest.count_large = d['count_large'] serLatest.count_small = d['count_small'] except: pass try: serLatest.pm25 = d['pm25'] serLatest.pm10conc = d['pm10conc'] serLatest.pm25conc = d['pm25conc'] serLatest.pm10count = d['pm10count'] serLatest.pm25count = d['pm25count'] serLatest.pm10avg = d['pm10avg'] serLatest.pm25avg = d['pm25avg'] serLatest.pm10countavg = d['pm10countavg'] serLatest.pm25countavg = d['pm25countavg'] serLatest.created_on = d['created_on'] serLatest.aqi = d['aqi'] serLatest.aqi10 = d['aqi10'] serLatest.aqi25 = d['aqi25'] serLatest.lon = d['lon'].replace(",", "") serLatest.lat = d['lat'].replace(",", "") except: pass serLatest.save() except AQFeedLatest.DoesNotExist: serLatest = AQFeedLatestSerializer(data=d) if serLatest.is_valid(): serLatest.save() else: pass serializer = AQFeedSerializer(data=d) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)