Răsfoiți Sursa

merged with katrin

Chuan Miao 9 ani în urmă
părinte
comite
ed0fc63153

+ 23 - 12
applications/katrin/controllers/api.py

@@ -1,3 +1,4 @@
+import re
 
 def index():
     return dict(adei=session.adei_sensors, sql=session.sql_fields)
@@ -23,23 +24,21 @@ def sql_fields():
             fields = f['fields']
     return dict(server=server, table=table, fields=fields)
 
-def sql_value():
+def sql_data():
     server = request.get_vars.server
     table  = request.get_vars.table
     field  = request.get_vars.field
+    fields_in_table = sql_fields()['fields']
     sql = globals()['sql_'+server]
-    for f in session.sql_fields:
-        if f['server'] == server and f['table'] == table:
-            for ff in f['fields']:
-                if ff['name'] == field:
-                    field_type = ff['type']
     if field == 'all':
+        field_names = [f['name'] for f in fields_in_table]
         val = sql(sql[table]).select(orderby=~sql[table].id).first()
+        val = [val[f] for f in field_names if f in val.keys()]
     else:
-        val = sql(sql[table]).select(sql[table][field], orderby=sql[table].id)
-    if field_type == 'mediumblob':
-        val = 'binary blob'
-    return dict(result=val)
+        val = sql(sql[table]).select(sql[table][field], orderby=~sql[table].id).first()
+        field_names = field
+        val = val[field]
+    return dict(server=server, table=table, field=field_names, data=val)
 
 def adei_servers():
     servers = [s['server'] for s in session.adei_servers]
@@ -62,6 +61,16 @@ def adei_sensors():
                     sensors = g['sensors']
     return dict(server=server, group=group, sensors=sensors)
 
+def adei_data():
+    server = request.get_vars.server
+    group  = request.get_vars.group
+    sensor = request.get_vars.sensor
+    ar = session.adei_readers[server]
+    sensor_names, data = ar.query_data(group=group, sensor=sensor)
+    # pack results
+    sensor = re.findall(r'\d+', sensor)
+    return dict(server=server, group=group, field_mask=sensor, field=sensor_names, data=data)
+
 @request.restful()
 def sql():
     if request.extension == 'html':
@@ -83,7 +92,7 @@ def sql():
             request.get_vars.server = args[0]
             request.get_vars.table = args[1]
             request.get_vars.field = args[2]
-            return sql_value()
+            return sql_data()
     def POST(*args, **kargs):
         return dict()
     return locals()
@@ -93,6 +102,8 @@ def adei():
     if request.extension == 'html':
         request.extension = 'xml'
     response.view = 'generic.'+request.extension
+    if request.env.http_origin:
+        response.headers['Access-Control-Allow-Origin'] = '*'
     def GET(*args, **kargs):
         if len(args) == 0:
             return adei_servers()
@@ -107,7 +118,7 @@ def adei():
             request.get_vars.server = args[0]
             request.get_vars.group = args[1]
             request.get_vars.sensor = args[2]
-            return ""
+            return adei_data()
     def POST(*args, **kargs):
         return dict()
     return locals()

+ 3 - 0
applications/katrin/controllers/config.py

@@ -0,0 +1,3 @@
+
+def index():
+    return locals()

+ 0 - 0
applications/katrin/models/api/adei.py → applications/katrin/models/api/adei.py.0


+ 8 - 5
applications/katrin/models/api/sql.py

@@ -1,6 +1,7 @@
 from gluon.dal import MySQLAdapter 
 import hashlib
 import re
+import time
 
 field_types = dict(
     id='id',
@@ -28,9 +29,10 @@ for c in sql_servers:
 
     #_db = 'sql_' + hashlib.md5(server).hexdigest()
     _db = 'sql_' + server
-    globals()[_db] = DAL( "%s/%s" % (host, database), migrate=False )
+    globals()[_db] = DAL( "%s/%s" % (host, database), migrate=False, pool_size=1)
     
     for tab in tables:
+        t0 = time.time()
         # columns from mysql table
         cols = globals()[_db].executesql('show columns from %s' % tab)
 
@@ -53,14 +55,15 @@ for c in sql_servers:
                 fld_type = 'id'
             if field_long_name in fields.keys():
                 fld_type = fields[field_long_name]
-            #if fld_type == 'mediumblob':
-                #continue
-            # construct field
-            dal_fields.append(Field(fld_name, type=field_types[fld_type], length=length))
             field_names.append(dict(name=fld_name, type=fld_type))
+            if fld_type == 'mediumblob':
+                pass
+            else:
+                dal_fields.append(Field(fld_name, type=field_types[fld_type], length=length))
 
         globals()[_db].define_table(tab, *dal_fields)
         session.sql_fields.append(dict(server=server, table=tab, fields=field_names))
 
+
 #print session.sql_servers
 #print session.sql_fields

+ 1 - 1
applications/katrin/models/menu.py

@@ -27,7 +27,7 @@ response.google_analytics_id = None
 
 response.menu = [
     ('Display', _c == 'default' and _f == 'index', URL('default', 'index'), []),
-    ('Config', _c == 'data' and _f == 'index', URL('data', 'index'), [])
+    ('Config', _c == 'config' and _f == 'index', URL('config', 'index'), [])
 ]
 
 if "auth" in locals(): auth.wikimenu()

+ 5 - 4
applications/katrin/static/js/src/config.js

@@ -89,10 +89,11 @@ var TreeItem = React.createClass({
 })
 
 function render() {
-    React.render(
-            <ItemNode nodename="katrin" items={data.katrin} />, 
-            document.getElementById('server-list')
-    );
+    //React.render(
+            //<ItemNode nodename="katrin" items={data.katrin} />, 
+            //document.getElementById('server-list')
+    //);
+    //React.render(<NestedList />, document.getElementById('servers'));
 }
 
 

+ 13 - 24
applications/katrin/views/data/index.html → applications/katrin/views/config/index.html

@@ -36,36 +36,25 @@
 
 <script>
   $(document).ready(function() {
+      $.getJSON("{{=URL('api', 'adei/katrin/0/0_1_2_3.json')}}", function(s) {
+          console.log(s);
+      })
       
-    app = require('appConfig');
-    app.render();
-
-    var d = app.data;
-
-    if (d.isArray)
-
-    for (s in app.data) {
-      
-      console.log(s, app.data[s]);
-      var v =  app.data[s];
-      console.log(typeof s, typeof v);
-      for (x in v) {
-        console.log(x, typeof x);
-      }
-    }
-  });
-
-  $.when(
-    $.getJSON("{{ =URL('data', 'server.json') }}", function(s) {
-        sessionStorage.server = JSON.stringify(s);
-    })
+    var app = require('appConfig');
+        app.render();
+      });
+
+  //$.when(
+   // $.getJSON("{{ =URL('data', 'server.json') }}", function(s) {
+    //    sessionStorage.server = JSON.stringify(s);
+   // })
   //  $.getScript("{{ = URL('static', 'js/build/config.js') }}")
-  ).then(function() {
+ // ).then(function() {
     //var app = require('appConfig');
     //app.render();
     //var adei = sessionStorage.server()
     //var NestedList = require('server');
-  });
+ // });
  
 </script>
 

+ 16 - 34
site-packages/adeireader.py

@@ -6,6 +6,7 @@ import calendar
 import urllib2 as urllib
 from helper import csvparser, xmlparser, print_exc
 import time
+import re
 
 DEBUG = 1
 
@@ -21,45 +22,28 @@ def adei_timestamp(adeitimestr):
     timestamp = calendar.timegm(timestamp.timetuple())
     return timestamp
 
-#def f(x):
-    #x = str(x)
-    #result = []
-    #try:
-        #for part in x.split(','):
-            #if '-' in part:
-                #a, b = part.split('-')
-                #a, b = int(a), int(b)
-                #result.extend(range(a, b + 1))
-            #else:
-                #a = int(part)
-                #result.append(a)
-    #except:
-        #pass
-    #return map(str, result )
-
 def transpose_list(l):
     return map(list, zip(*l))
 
-
 class ADEIError(Exception):
+    'To be done'
     pass
 
-
 class ADEIReader:
     def __init__(self, host, db_server, db_name):
         self.host = host + '/services'
         self.server = db_server
         self.name = db_name
         return
-    def build_url(self, qtype, db_group='', sensor_ids='', window=0, resample=0):
+    def build_url(self, qtype, db_group='', sensor_masks='', window=0, resample=0):
         'build query url'
         url = 'http://'
-        if qtype == 'get':
+        if qtype == 'data':
             url += self.host
             url += '/getdata.php?db_server={server}&db_name={db}'\
                    .format(server=self.server, db=self.name)
             url += '&db_group=' + db_group
-            url += '&db_sensor=' + ','.join(map(str, sensor_ids))
+            url += '&db_mask=' + sensor_masks
             if window == 0:
                 url += '&window=-1'
             else:
@@ -87,30 +71,28 @@ class ADEIReader:
         fp = urllib.urlopen(url)
         res = xmlparser(fp)
         return res
-    def query_get(self, **postdata):
+    def query_data(self, **postdata):
+        def formatSensorMask(mask):
+            return ','.join(re.findall(r'\d+', mask))
         # parse args
-        group = str(postdata.get( 'group' )) or ''
-        sensor = postdata.get( 'sensor' ) or []
-        window = postdata.get( 'window' ) or 0
-        resample = postdata.get( 'resample' ) or 0
-        #sensorMask = f(sensor)
-
-        # build query url
-        url = self.build_url('sensor', group, sensors, window, resample)
-
+        group     = str(postdata.get( 'group' )) or ''
+        sensors   = postdata.get( 'sensor' ) or []
+        window    = postdata.get( 'window' ) or 0
+        resample  = postdata.get( 'resample' ) or 0
+        sensor_mask = formatSensorMask(sensors)
+        url = self.build_url('data', group, sensor_mask, window, resample)
         # fetch data
         if DEBUG:
             startTime = time.time()
         fp = urllib.urlopen(url)
         if DEBUG:
             elapsedTime = time.time() - startTime
- 
         # parse data
         data = csvparser(fp)
-
         # pack data
         sname = [d[0] for d in data]
         svalue = [list( d[1:] ) for d in data]
+        sname[0] = 'Timestamp'
         svalue[0]  = map(adei_timestamp, svalue[0])
         svalue = transpose_list(svalue)
         # resample data
@@ -134,7 +116,7 @@ class ADEIReader:
             #print 'sensor values', svalue, len(svalue[0])
             #print 'sensor', len(sensor)
             print
-        return svalue
+        return (sname, svalue)
 
 def __adeireader_doctest():
     '''