USGS   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 6
c 4
b 0
f 0
dl 0
loc 49
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A get_multiple_samples() 0 14 3
A get_sample() 0 12 1
A dt_value() 0 10 1
A site_code() 0 7 1
1
"""
2
Retrieving samples from the USGS Instantaneous Values service
3
"""
4
import requests
5
import arrow
6
from flask import current_app
7
8
from app.models import Sensor
9
from .base import add_new_sample, RemoteGage
10
11
URLBASE = 'http://waterservices.usgs.gov/nwis/iv/?format=json,1.1'
12
13
14
class USGS(RemoteGage):
15
    URLBASE = 'http://waterservices.usgs.gov/nwis/iv/?format=json,1.1'
16
17
    @staticmethod
18
    def site_code(site_json):
19
        """
20
        From a USGS array item within ['value']['timeSeries']
21
        get the code back for the site
22
        """
23
        return str(site_json['sourceInfo']['siteCode'][0]['value'])
24
25
    @staticmethod
26
    def dt_value(site_json):
27
        """
28
        From a USGS array item within ['value']['timeSeries']
29
        return datetime, float value of sample
30
        """
31
        value = site_json['values'][0]['value'][0]
32
        dt = arrow.get(value['dateTime']).datetime
33
        v = float(value['value'])
34
        return dt, v
35
36
    def get_sample(self, sensor_id):
37
        """
38
        Takes a sensor id, tries to ge thte latest sample from the site
39
        """
40
        sensor = self.sensor(sensor_id)
41
        parameter = (sensor.remote_parameter or '00065')
42
        url = (self.URLBASE +
43
               '&sites=' + sensor.remote_id +
44
               '&parameterCD=' + parameter)
45
        site = requests.get(url).json()['value']['timeSeries'][0]
46
        dt, v = self.dt_value(site)
47
        add_new_sample(sensor.id, dt, v)
48
49
    def get_multiple_samples(self, sensor_ids):
50
        parameter = (self.sensor(sensor_ids[0]).remote_parameter or '00065')
51
        remote_sensors = Sensor.query.filter(Sensor.id.in_(sensor_ids))\
52
                                     .with_entities(Sensor.remote_id)\
53
                                     .all()
54
        remote_ids = [sensor[0] for sensor in remote_sensors]
55
        url = (URLBASE + '&sites=' + ','.join(remote_ids) +
56
               '&parameterCD=' + str(parameter))
57
        r = requests.get(url).json()
58
        for site in r['value']['timeSeries']:
59
            sc = self.site_code(site)
60
            dt, v = self.dt_value(site)
61
            sensor = Sensor.query.filter(Sensor.remote_id == sc).first()
62
            add_new_sample(sensor.id, dt, v)
63