コード例 #1
0
ファイル: views.py プロジェクト: tejas101/airquality
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)
コード例 #2
0
ファイル: views.py プロジェクト: tejas101/airquality
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)
コード例 #3
0
ファイル: views.py プロジェクト: tejas101/airquality
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)
コード例 #4
0
ファイル: views.py プロジェクト: johnsonc/airquality
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)