Bladeren bron

Create, Update, Delete e Search Function seem work correctly.
In the JS Gui, the workflow stops at the Save Button, but data
area rightly managed.

antifaz 10 jaren geleden
bovenliggende
commit
83f0c79564
9 gewijzigde bestanden met toevoegingen van 530 en 215 verwijderingen
  1. 60 3
      README.md
  2. 4 1
      client/css/style.css
  3. 1 0
      client/index.html
  4. 232 109
      client/js/reclibrary.js
  5. BIN
      client/registrazioni.sqlite
  6. 38 18
      client/tempo.html
  7. 78 42
      server/server.py
  8. BIN
      server/techrec.db
  9. 117 42
      server/techrec.py

+ 60 - 3
README.md

@@ -1,4 +1,61 @@
-techrec
-=======
+==========================================
+    techrec
+==========================================
+
+
+--------
+ Client
+--------
+
+The Client is a JS script that exchange data with server via JSON
+
+--------
+ Server
+--------
+
+The Server is a python software and uses the bottle library to implements a web 
+services 
+
+
+Data Format
+===================================
+
+--------
+ Create 
+--------
+JSON = {
+        'starttime-rec-1385231288390': '2013/11/23 19:32:49', 
+        'endtime-rec-1385231288390': '2013/11/23 19:32:49', 
+        'recid': 'rec-1385231288390', 
+        'name-rec-1385231288390': 'adasd',
+        'op': 'new'
+        }
+
+--------
+Retrieve
+--------
+
+
+--------
+ Update
+-------- 
+
+JSON = {
+        'starttime-rec-1385231288390': '2013/11/23 19:32:49', 
+        'endtime-rec-1385231288390': '2013/11/23 19:32:49', 
+        'recid': 'rec-1385231288390', ### VALID REC ID 
+        'name-rec-1385231288390': 'adasd',
+        'op': 'update'
+        }
+        
+--------
+ Delete
+--------
+JSON = {
+        'recid': 'rec-1385231288390', ### VALID REC ID 
+        'op': 'delete'
+        }
+
+BUG
+Da Salva button lo stato non va. Per il resto sembra funzionare.
 
-techrec

+ 4 - 1
client/css/style.css

@@ -97,10 +97,13 @@ a{
     border-top: 1px dashed #A60000;
 }
 
-#newrec .logarea {
+/* NEW REC AREA */
+
+.logarea {
     min-width:200px;
     min-height:100px;
     border:1px solid black;
+    font-size:0.8em;
 }
 
 #newrec, #formsearchrec {

+ 1 - 0
client/index.html

@@ -18,6 +18,7 @@ $(document).ready(function(){
         rec_new();
     });
     
+    //rec_active();
     rec_new();
     
 });

+ 232 - 109
client/js/reclibrary.js

@@ -3,186 +3,309 @@ console.log("Loading...");
 function trx_startbut( code )  { return "startbutton-"+code; }
 function trx_stopbut( code )   { return "stopbutton-"+code; }
 function trx_downbut( code )   { return "downloadbutton-"+code; }
+function trx_endbut( code )		 { return "endbutton-"+code; }
 
 function trx_logarea( code )   { return "logarea-"+code; }
 
 function rs_button( code )     { return "button"+code; }
 
 function rs_trxarea( code )    { return "recarea-"+code; }
-function rs_trxname( code )    { return "trxname-"+code; }
-function rs_buttonarea( code ) { return "endtime-"+code; }
-function rs_inputstart( code ) { return "startime-"+code; }
-function rs_inputend( code )   { return "endtime-"; }
+function rs_trxname( code )    { return "name-"+code; }
+function rs_buttonarea( code ) { return "butarea-"+code; }
+function rs_inputstart( code ) { return "starttime-"+code; }
+function rs_inputend( code )   { return "endtime-"+code; }
 function rs_formid(code)       { return "form-"+code; }
-
+function rs_dellink(code)		{ return "dellink-"+code;}
 function rs_id(code)           { return code; }
 
 var txt_start       = "Inizia";
 var txt_stop        = "Ferma";
 var txt_download    = "Scarica";
 
-var srvaddr         = "http://127.0.0.1:8000/";
+var srvaddr         = "http://127.0.0.1:8000";
 
 var almostone       = false;
 var noplusbotton    = true;
-var maxrec          = 0 ; // Number of Active Record
 
 var rec_name_default = "";
 
+/*
+TODO: cambiare logica
+Quando premo il primo tasto, faccio la crazione, 
+per ogni altro pulsante, faccio solo e sempre UPDATE
+*/
 /** 
   * Perform Ajax async loading 
   **/
 
+function newformstr ( recid , butflag=false ) 
+{
+    var formid = rs_formid( recid );
+    var str = "<form id=\""+formid+"\" name=\""+formid+"\" action=\"#\">";
+    
+    if (butflag) {
+        str = str + "<input type=\"button\" name=\""+trx_startbut(recid)+"\" id=\""+trx_startbut(recid)+"\" ";
+        str = str + " class=\"recbutton\" value=\"Inizia\" />";
+        str = str + "<input type=\"button\" name=\""+trx_stopbut(recid)+"\" id=\""+trx_stopbut(recid)+"\" ";
+        str = str + " class=\"recbutton\" value=\"Stop\" />";
+        str = str + "<input type=\"submit\" name=\""+trx_downbut(recid)+"\" id=\""+trx_downbut(recid)+"\" ";
+        str = str + " class=\"recbutton\" value=\"Salva\" />";
+        str = str + "<input type=\"submit\" name=\""+trx_endbut(recid)+"\" id=\""+trx_endbut(recid)+"\" ";
+        str = str + " class=\"recbutton\" value=\"Download\" />";
+    }
+    
+    str = str + "<input type=\"hidden\" id=\"recid\" name=\"recid\" value=\""+recid+"\" />";
+    str = str + "<input type=\"text\" id=\""+rs_trxname(recid)+"\" name=\""+rs_trxname(recid)+"\" />";
+    str = str + "<input type=\"text\" id=\""+rs_inputstart(recid)+"\" name=\""+rs_inputstart(recid)+"\" />";
+    str = str + "<input type=\"text\" id=\""+rs_inputend(recid)+"\" name=\""+rs_inputend(recid)+"\" />";
 
+    if (! butflag) {
+        str = str + "<input type=\"button\" name=\""+trx_downbut(recid)+"\" id=\""+trx_downbut(recid)+"\" ";
+        str = str + " class=\"downloadbutton\" value=\"scarica\" />";
+    }
+    /*
+    str = str + "<input type=\"text\" id=\"name\" name=\"name\" />";
+    str = str + "<input type=\"text\" id=\"starttime\" name=\"starttime\" />";
+    str = str + "<input type=\"text\" id=\"endtime\" name=\"endtime\" /> ";
+    */
+    str = str + "</form>";
     
+    return str;
+}
+    
+/** 
+*  GetActive Recs
+**/
+
+function rec_active( recid ) {
+    dataString = "";
+    var request = RecAjax("search", dataString);
+
+    request.done( function(data) { 	
+        $.each(data, function(key, val) {
+            console.log("Key " + key + " > VAL " + val );
+		    $("#"+trx_logarea( recid )).append( "Key " + key + " > VAL " + val + "<br>"  );
+		});
+
+    	console.log("Req OK: "+ data); 
+	    // console.log("request"+ req);
+    	ChangeState(recid, trx_downbut(recid) , trx_endbut(recid));
+    });
+}
+
+
 /** 
   *  New record 
   **/
-function rec_new( ) {
-    var recid = "rec-"+maxrec;
-    maxrec += 1;  
+function rec_new( ) 
+{
+
+    var myDate = new Date()
+	console.log("New ID "+ myDate.getTime());	
+    var recid = "rec-"+ myDate.getTime();
     
     console.log("[rec_new] New Rec " + recid);
 
     $("#buttonscontainer").append( "<div id=\""+rs_trxarea(recid)+"\" class=\"recarea\"> </div>" );
-    console.log("[rec_new] add div TRXArea "+ rs_trxarea(recid) );
-    
     $("#"+rs_trxarea(recid)).append( "<div id=\""+rs_buttonarea(recid)+"\" class=\"buttonarea\"> </div>" );
-    console.log("[rec_new] add div ButtonArea "+ rs_buttonarea(recid) );
+    console.log("[rec_new"+recid+"] add div (TRXArea, ButtonArea) ok " );
     
     var formid = rs_formid( recid );
-
-    var str = "<form id=\""+formid+"\" name=\""+formid+"\" action=\"#\">";
-
-    str = str + "<input type=\"button\" name=\""+trx_startbut(recid)+"\" id=\""+trx_startbut(recid)+"\" ";
-    str = str + " class=\"recbutton\" value=\"Inizia\" />";
-
-    str = str + "<input type=\"button\" name=\""+trx_stopbut(recid)+"\" id=\""+trx_stopbut(recid)+"\" ";
-    str = str + " class=\"recbutton\" value=\"Stop\" />";
-    // ADD SUBITO TEXTBUTTON
-    str = str + "<input type=\"submit\" name=\""+trx_downbut(recid)+"\" id=\""+trx_downbut(recid)+"\" ";
-    str = str + " class=\"recbutton\" value=\"Scarica\" />";
-    
-    str = str + "<input type=\"text\" id=\""+rs_inputstart(recid)+"\" name=\""+rs_inputstart(recid)+"\"/>";
-    
-    str = str + "<input type=\"text\" id=\""+rs_inputend(recid)+"\" name=\""+rs_inputend(recid)+"\"/> ";
-    
-    str = str + "</form>";
-
     
+    var str = newformstr(recid, butflag=true); 
     $("#"+rs_buttonarea(recid)).append( str );
     
     $("#"+trx_stopbut(recid)).hide();
     $("#"+trx_downbut(recid)).hide();
+    $("#"+trx_endbut(recid)).hide();
     
-    console.log("[rec_new] Hide Start Button");
-    //$("#"+trx_startbut(recid)).css("display","none");
-    
-    
-    console.log("[rec_new] add form "+ formid );
+    console.log("[rec_new "+recid+"] Form OK");
     
-    
-    $("#"+rs_buttonarea(recid)).append( "\<div class=\"dellink\" \> <a href=\"#\"> cancella</a> \</div\>" );
+    $("#"+rs_buttonarea(recid)).append( "<div class=\"dellinkarea\" > <a href=\"#\" id="+rs_dellink(recid)+"> cancella</a> </div>" );
 
     // INSERT AND POPULATE BUTTON AREA
-    $("#"+rs_trxarea(recid)).append( "<div id=\""+trx_logarea(recid)+"\" class=\"logarea\">Nuova trasmissione </div>" );
-    
-    $("#"+trx_startbut(recid)).click(function(){
-        ChangeState(recid, trx_startbut(recid) , trx_stopbut(recid));
-    });
+    $("#"+rs_trxarea(recid)).append( "<div id=\""+trx_logarea(recid)+"\" class=\"logarea\"> Nuova trasmissione </div>" );
 
-    $("#"+trx_stopbut(recid)).click(function(){
-        ChangeState(recid, trx_stopbut(recid) , trx_downbut(recid));
+    // Bind the Delete Links
+	$("#"+rs_dellink(recid)).click(function(){
+		console.log("Remove " + rs_trxarea(recid) + "[ID"+recid+"]");
+		$("#"+rs_trxarea(recid)).remove();
+		alert("Premuto del link. Invio al server ?");
     });
     
-    // $("#"+trx_downbut(recid)).submit(function(e){
+    // FORM SUBMIT: THE REC IS STOPPEND AND MUST BE PROCESSED
     $("#"+formid).submit(function(event){
-      
-        event.preventDefault();
-        dataString = $(this).serialize();
-        alert("Mando:" + dataString);
-        RecAjax("/create", dataString);
-        /* 
-        var request = $.ajax({
-          type: "POST",
-		  cache: false,
-          url: "http://127.0.0.1:8000/create",
-          data: dataString,
-          dataType: "json"
-          });
+ 		// Immediately, mark the end time (stop action)
+		ChangeState(recid, trx_stopbut(recid) , trx_downbut(recid)); 
         
-        request.done( function(data) { 	
-						 $.each(data, function(key, val) {
-								console.log("Key " + key + " > VAL " + val );
-								$("#"+trx_logarea( recid )).append( "Key " + key + " > VAL " + val + "<br>"  );
-						});
-
-						console.log("Req OK: "+ data); 
-						console.log("req"+ request);
-					} );
-
-		request.fail(function (jqXHR, textStatus, errorThrown){
-
-	       console.error("The following error occured: "+
-		      jqXHR.status, +"-"+ textStatus + "-" + errorThrown
-    	   );
-        });
-    */
-    });
+        // Force a Name
+		while (true) {
+	    	if ( $("#"+rs_trxname(recid)).val() == "" ) 	
+			{
+				var tmpname = prompt("Nessun nome di trasmissione!!!");
+				$("#"+rs_trxname(recid)).val(tmpname);
+				$("#"+trx_logarea(recid)).append("Titolo: <b>"+ tmpname +"</b> <br/>");
+			}
+    		else { break; } 
+		}
+
+        event.preventDefault(); 
+       
+        // Update data (send to server) in order to save some information
+        recUpdate(recid); 
+        
+        recStart(recid); 
+
+    }); // End of form SUBMIT
+
+    // Bind the STOP button
+    $("#"+trx_stopbut(recid)).click( function(event){ 
+    
+        event.preventDefault(); 
+        ChangeState(recid, trx_stopbut(recid) , trx_downbut(recid));  
+        recUpdate(recid);
+        
+    }); // End of STOP button
+    
+    // Bind the START button
+    $("#"+trx_startbut(recid)).click( function(event){ 
+    
+        // Immediately, mark the start time (start action) and send it to Server 
+		ChangeState(recid, trx_startbut(recid) , trx_stopbut(recid));
+        event.preventDefault(); 
+        recNew( recid );
+
+    }); // End of START button
+    
+    console.log("New form has been built.");
+}
+
+/* New Record */
+function recNew ( recid ) {
+    var formid = rs_formid( recid );
+    var dataString = $("#"+formid).serialize();
+
+    console.log("New rec: "+dataString);
+    
     
-    console.log("Form readyReady");
+    var request = RecAjax("create", dataString);
+
+    request.done( function(data) { 	
+    	$.each(data, function(key, val) {
+      	    console.log("Received (K:V) ("+key+":"+val+")") ;
+      	    if (key == "msg") {
+    			$("#"+trx_logarea(recid)).html("Nuova Registrazione </br> (recid:"+recid+") </br>");
+    			$("#"+trx_logarea(recid)).append("Inizio: "+ $("#"+rs_inputstart(recid)).val() +"<br/>");
+      	    }
+			if (key == "error") {
+    			$("#"+trx_logarea( recid )).html("Errore: impossibile creare una nuova registrazione"+val+" </ br>");
+      	    }
+
+		});
+    } );
+    return request;
 }
 
-function RecAjax(apipath, dataString) {
+/* Update Record */
+function recUpdate( recid  ) {
+    var formid = rs_formid( recid );
+    var dataString = $("#"+formid).serialize();
+    console.log("Sending Ajax Update request: "+ dataString);
     
+    //event.preventDefault();
+    var request = RecAjax("update", dataString );
+    request.done( function(data) { 	
+    	$.each(data, function(key, val) {
+          	console.log("recUpdate receive (k:v) ("+key+":"+val+")" );
+          	
+          	if (key == "message") {
+          	    var str = "";
+          	    str += "<b>RecID</b> "+ recid + "</br>"
+          	    str += "<b>nome</b> "+ $("#"+rs_trxname(recid)).val() + "</br>"
+          	    str += "<b>Inizio</b> "+ $("#"+rs_inputstart(recid)).val() + "</br>"
+          	    str += "<b>Fine</b> "+ $("#"+rs_inputend(recid)).val() + "</br>"
+
+			    $("#"+trx_logarea(recid)).html( str );
+                // if all elements have been recorded
+                if ($("#"+rs_trxname(recid)).val() != "") {
+                    $("#"+trx_logarea(recid)).append( "<b>In Elaborazione</b>" );
+                }
+        	}
+        	
+          	if (key == "error") {
+        		$("#"+trx_logarea( recid )).append( "Error:" + val +"<br>"  );
+		    }
+    	}); // end of each 
+    }); // end of request.done
+}
+
+/*
+ * 
+ * 	AJAX REQUEST
+ * 
+ */
+function RecAjax(apipath, dataString ) {
+
+   	var srv = srvaddr + "/" + apipath ;
+
     var request = $.ajax({
         type: "POST",
 		cache: false,
-        url:  srvaddr + "/" + apipath,
+        url: srv,
         data: dataString,
         dataType: "json"
     });
-        
-    request.done( function(data) { 	
-        $.each(data, function(key, val) {
-            console.log("Key " + key + " > VAL " + val );
-    		$("#"+trx_logarea( recid )).append( "Key " + key + " > VAL " + val + "<br>"  );
-        });
-        console.log("Req OK: "+ data); 
-        console.log("req"+ request);
-    } );
 
     request.fail(function (jqXHR, textStatus, errorThrown){
-        console.error("The following error occured: "+
-            jqXHR.status, +"-"+ textStatus + "-" + errorThrown );
-    });
+        console.error("The following error occured: "+ jqXHR.status +"-"+ textStatus + "-" + errorThrown );
+        if (jqXHR.status == 0 && jqXHR.readyState === 4) 
+		{
+			alert("Errore di connessione, impossibile inviare i dati al server "+ srv);
+		} else {
+    	    alert("Error: "+jqXHR.status +"\nTextStatus: "+ textStatus + "\n Ready State "+jqXHR.readyState+"\n" + errorThrown );
+		}
+	});
+        
+    return request;
 }
 
-function ChangeState(eid, from, to) {
-  
+/*
+ * 	GetNow (data parser)
+ */
+function getnow()
+{
+    var myDate = new Date()
+    var displayDate = myDate.getFullYear() + '/' + (myDate.getMonth()+1) + '/' + myDate.getDate();
+    displayDate = displayDate +' '+ myDate.getHours()+':'+myDate.getMinutes()+':'+myDate.getSeconds();
+	return displayDate;
+}
+
+/*
+FUNCTION: CHANGE STATE (gui)
+*/
+function ChangeState(recid, from, to) {
+
   console.log("ChangeState: " + from + " --> " + to );
   
   $("#"+from).css("display", "none");
   $("#"+to).css("display", "inline");
 
   // take the date
-  var myDate = new Date()
-  var displayDate = (myDate.getMonth()+1) + '/' + (myDate.getDate()) + '/' + myDate.getFullYear();
-  displayDate = displayDate +' '+ myDate.getHours()+':'+myDate.getMinutes()+':'+myDate.getSeconds();
-  
-  var formid = rs_formid( eid );
-  var logdiv = trx_logarea( eid );
-  
-  if ( from == trx_startbut(eid) ) {
-    $("#"+logdiv).append("<br/>Inizio: "+ displayDate);
-    $("#"+rs_inputstart(eid)).val( displayDate);
-    console.log("set "+rs_inputstart(eid)+ " to "+ displayDate )
+  var displayDate = getnow();
+
+  if ( from == trx_startbut(recid) ) {
+    $("#"+rs_inputstart(recid)).val( displayDate );
+	
+    console.log("ChangeState: set "+rs_inputstart(recid)+ " to "+ displayDate )
   }
   
-  if ( from == trx_stopbut(eid) ) {
-    $("#"+logdiv).append("<br/>Fine: "+ displayDate);
-    $("#"+rs_inputend(eid)).val( displayDate);
-    console.log("set "+rs_inputend(eid)+ " to "+ displayDate )
+  if ( from == trx_stopbut(recid) ) {
+    $("#"+rs_inputend(recid)).val( displayDate );  
+    console.log("ChangeState: set '"+rs_inputend(recid)+ "' to "+ displayDate )
   }
 
+  if ( from == trx_downbut(recid) ) {
+	$("input[type=submit]").attr("disabled", "disabled");
+    console.log("ChangeState: set '"+rs_inputend(recid)+ "' to "+ displayDate );
+  }
 } // End function ChangeState

BIN
client/registrazioni.sqlite


+ 38 - 18
client/tempo.html

@@ -21,31 +21,50 @@ $(document).ready(function(){
         function (event) {
             event.preventDefault();
             dataString = $(this).serialize();
-            var request = RecAjax("search", dataString, "dads");
+            var request = RecAjax("search", dataString);
 
           	$("#searchresult").html(" ");
             request.done( function(data) {
-                console.log("Ricevuto data", data); 	
+
                 $.each(data, function(key, val) {
                     console.log("Extract " + key );
 										
-										var divstring = "<div class=\"searchresult\" id=\""+ rs_trxarea(key) +"\"> </div>";
+					var divstring = "<div class=\"searchresult\" id=\""+ rs_trxarea(key) +"\"> </div>";
 
                     $("#searchresult").append( divstring );
                     // var str = newformstr( key ); // new form
 
-										var str = "<div class=\"namevalues\">"+val.name+" - <a href=\"\">Scarica</a></div>"; 
-										str += "<span class=\"timevalues\">["+val.starttime+"  >>> "+val.endtime+"]</span>"
-
-										$("#"+rs_trxarea(key)).html(str);
-
-                    // $("#"+rs_trxname(key)).val( val.name );
-                    // $("#"+rs_inputstart(key)).val( val.starttime );
-                    // $("#"+rs_inputend(key)).val( val.endtime );
-
-                    if (val.state == "CODA") {}
-                    if (val.state == "RUN") {}
-                    if (val.state == "DONE") {}
+					var str = "";
+					str += "<div class=\"namevalues\">"+val.name+" - <a href=\"\">Scarica</a> <a href=\"\" id=\"delete-"+val.id+"\">Cancella</a></div>"; 
+					str += "<div class=\"namevalues\">RECID: "+val.recid+" ID: "+ val.id + " Active " + val.active + "</div>"; 
+					str += "<div class=\"timevalues\">["+val.starttime+"  >>> "+val.endtime+"]</div>"
+
+					$("#"+rs_trxarea(key)).html(str);
+                    $("#delete-"+val.id).click(function(evt) {
+                            evt.preventDefault();
+                            console.log("Delete request for ID "+ val.id);
+                            var dataString = "id="+val.id
+                            var req_del = RecAjax("delete", dataString);
+                            
+                            req_del.done (function(data) {
+                                $.each(data, function(del_key, del_val) {
+                                    console.log("K:V " + del_key +":"+del_val ); 
+                            
+                                    if (del_key == "message") {
+                                        $("#"+rs_trxarea(key)).fadeOut( 500, function() { $(this).remove(); });
+                                        console.log("delete area "+rs_trxarea(key));    
+
+                                    } 
+                                    
+                                    if (del_key == "error") {
+                                        alert("Impossibile cancellare elemento");
+                                    }
+                                    
+                                });
+                            });
+                        }
+                    ); // End of delete link handler 
+                    
                 });
             });
         });
@@ -66,9 +85,10 @@ $(document).ready(function(){
         
   <div id="buttonscontainer"> 
     <form action="#" method="POST" id="searchform">
-        <input type="text" id="name"        name="name"         placeholder="name"  />    
-        <input type="text" id="starttime"   name="starttime"    placeholder="Start: 2014-05-01-44-55-01" />
-        <input type="text" id="endtime"     name="endtime"      placeholder="End: 2014-05-01-44-55-01" />
+        <input type="text" id="recid"       name="recid"        placeholder="Codice Registrazione" /> <br />
+        <input type="text" id="name"        name="name"         placeholder="name"  />      <br />
+        <input type="text" id="starttime"   name="starttime"    placeholder="Start: 2012/11/24 22:37:361" />(timepicker http://puna.net.nz/timepicker.htm#) <br />
+        <input type="text" id="endtime"     name="endtime"      placeholder="End: 2012/11/24 22:37:36" /> <br />
         <input type="submit" value="Cerca" />
     </form>
   </div>

+ 78 - 42
server/server.py

@@ -32,60 +32,92 @@ class RecServer:
         self._app.route('/help/', callback=self.help)
 
         self._app.route('/create', method="POST", callback=self.create)        
-        self._app.post('/create', callback=self.create)        
+        # self._app.post('/create', callback=self.create)        
+                
+        self._app.route('/update', method="POST", callback=self.update)
                 
-        # self._app.route('/get', method="GET", callback=self.getrec)        
-        # self._app.route('/get/', method="GET", callback=self.getrec)        
-        # self._app.route('/get/<recid>', method="GET", callback=self.getrec)        
-        
         self._app.route('/search', method="POST", callback=self.search)        
-        # self._app.route('/search/', method="POST", callback=self.search)        
-        # self._app.route('/search/<recid>', method="POST", callback=self.search)        
-        # self._app.route('/oldsearch/<key>/<value>', method="POST", callback=self.search)        
-        # self._app.route('/search/<args:path>', method="POST", callback=self.search)
 
-        self._app.route('/delete/<recid>', method="GET", callback=self.delete)
-        self._app.route('/delete/<recid>/', method="GET", callback=self.delete)
+        self._app.route('/delete', method="POST", callback=self.delete)
+
         
     def extsearch( self, args ):
         print "ARG", args
         return self.rec_err("EXT")
         
+    """
+        CREATE HANDLER
+    """
     # @route('/create', method=['OPTIONS','POST'])
     def create(self):
         self.enable_cors()
         req = dict( request.POST.allitems() )
         ret = {}
-        print "REQ", req
+        print "Server:: Create request %s " % req
+
+        starttime = ""
         if req["starttime-"+req["recid"]] != "":
             starttime = datetime.datetime.strptime( req["starttime-"+req["recid"]] , "%Y/%m/%d %H:%M:%S")
-        else:
-            starttime = ""
 
+        endtime =  datetime.datetime.now()
         if req["endtime-"+req["recid"]] != "":
             endtime = datetime.datetime.strptime( req["endtime-"+req["recid"]] , "%Y/%m/%d %H:%M:%S")
-        else:
-            endtime = ""
+
             
-        self.db.add( Rec(name=req["name-"+req["recid"]], 
-            starttime=starttime,
-            endtime=endtime ) 
-            )
+        print "Name %s RECID %s Starttime %s EndTime %s" %(req["name-"+req["recid"]],req["recid"], starttime,endtime )
+        ret = self.db.add( Rec(name=req["name-"+req["recid"]], 
+                        recid=req["recid"], 
+                        starttime=starttime,
+                        endtime=endtime ) 
+                    )
+
+        return { "msg": "Nuova registrazione aggiunta", }
+        return self.rec_msg("Nuova registrazione creata! (id:" + ret.id *")")
 
-        return { "msg": "Nuova registrazione aggiunta" }
-   
     # @route('/active')
     def getactive(self):
         print "GetActive"
-
+            
+    """
+        DELETE HANDLER
+    """
     # @route('/delete/<recid>') # @route('/delete/<recid>/')
     def delete( self, recid = None ):
-        if not recid:
-            self.rec_err("No recid!")
-        self.rec_err("Delete")
+        self.enable_cors()
+        req = dict( request.POST.allitems() )
+        if not req.has_key( "id" ):
+            return self.rec_err("No valid ID")
+        
+        print "Server request delete for id %s " % ( req["id"] )
+        if self.db.delete( req["id"] ):
+            return self.rec_msg("DELETE OK")
+        else:
+            return self.rec_err("DELETE error: %s" % (self.db.get_err()))
+
+    """
+        UPDATE HANDLER
+    """
+    # @route('/delete/<recid>') # @route('/delete/<recid>/')
+    def update( self ):
+        self.enable_cors()
+        req  = dict( request.POST.allitems() )
+
+        ret={}
+        ret["starttime"]    = req ["starttime-"+req["recid"]]
+        ret["endtime"]      = req["endtime-"+req["recid"]]
+        ret["name"]         = req["name-"+req["recid"]]
+        
+        if self.db.update( req["recid"], ret ):
+            return self.rec_msg("Aggiornamento completato!");
+        else:
+            return self.rec_err("Errore Aggiornamento");
         
-    def rec_err(self, msg):
-        return { "error": msg }
+    """
+        JSON' RESPONDER
+    """
+    def rec_msg(self, msg): return self.rec_xerr("message", msg)
+    def rec_err(self, msg): return self.rec_xerr("error", msg)
+    def rec_xerr(self,_type,_msg): return { _type : _msg }
 
 
     """
@@ -95,34 +127,38 @@ class RecServer:
         self.enable_cors()
 
         req  = dict( request.POST.allitems() )
-
-        name = req["name"]
+        print "Search request: %s" % (req)
+        
+        name = "%s" % req["name"]
         if req["name"] == "": name = None
+       
         starttime = req["starttime"]
-        if req["starttime"] == "": name = None
+        if req["starttime"] == "": starttime = None
+        
         endtime = req["endtime"]
         if req["endtime"] == "": endtime = None
-            
-        values =  self.db._search(name=name, starttime=starttime, endtime=endtime)
+        
+        recid = req["recid"] 
+        if req["recid"]== "": recid = None
+        
+        active = True
+        
+        values =  self.db._search(recid=recid,name=name, starttime=starttime, endtime=endtime,active=active)
+        print "Returned Values %s" % values
         ret = {}
         for rec in values:
             recid = "rec-" + str(rec.id) 
             
             ret [recid] = {}
             ret [recid]["name"] = rec.name
+            ret [recid]["id"] = rec.id
+            ret [recid]["recid"] = rec.recid
             ret [recid]["starttime"] = rec.starttime.strftime("%Y-%m-%d-%H-%H-%s")
             if rec.endtime != None:
                 ret [recid]["endtime"] = rec.endtime.strftime("%Y-%m-%d-%H-%H-%s")
-            else:
-                rec.endtime = ""
                 
-            ret [recid]["state"] =  rec.state
-            
-        # print "RET ", ret 
-        """
-        print "VALUES ", values
-        print type(self.rec_err("sdiaso")), " - " , type(values)
-        print "ERR" , self.rec_err("sdiaso")"""
+            ret [recid]["active"] =  rec.active
+
         logging.info("Return: %s" % ret);
         return ret
                 

BIN
server/techrec.db


+ 117 - 42
server/techrec.py

@@ -7,7 +7,7 @@ import json
 import yaml
 
 try:
-  from sqlalchemy import create_engine, Column, Integer, String, DateTime
+  from sqlalchemy import create_engine, Column, Integer, String, DateTime, Boolean
   from sqlalchemy.orm import sessionmaker
   from sqlalchemy.ext.declarative import declarative_base
 except:
@@ -16,27 +16,32 @@ except:
 
 logging.basicConfig(level=logging.INFO)
 
+STATE_ACTIVE    = 0 
+STATE_RUN       = 1 
+STATE_DOWN      = 2 
+
+PAGESIZE = 10
 
 """
 This class describe a single Record (Rec() class) and the 
 records manager (RecDB() class) 
 """
-
 Base = declarative_base()
 
-PAGESIZE = 10
-
-    
+"""
+ Rec entry
+"""    
 class Rec(Base):
   
     __tablename__ = 'rec'
-    id = Column(Integer, primary_key=True)
-    name = Column(String)
-    starttime = Column(DateTime, nullable = True)
-    endtime = Column(DateTime, nullable = True)
-    state   = Column(String)
+    id          = Column(Integer, primary_key=True)
+    recid       = Column(String)
+    name        = Column(String, nullable = True)
+    starttime   = Column(DateTime, nullable = True)
+    endtime     = Column(DateTime, nullable = True)
+    active      = Column(Boolean, default = True)
 
-    def __init__(self, name="", starttime=None, endtime=None, asjson=""):
+    def __init__(self, recid="", name="", starttime=None, endtime=None, asjson=""):
         self.error = 0 
         self.job = None    
     
@@ -44,6 +49,7 @@ class Rec(Base):
           self.name = name
           self.starttime = starttime
           self.endtime = endtime
+          self.recid = recid
         else:
             #try:
                 # dec = json.loads( unicode(asjson) )
@@ -54,36 +60,40 @@ class Rec(Base):
             print("dec %s %s" % (dec,type(dec))) 
             print("asjson %s %s" % (asjson,type(asjson))) 
           
+            self.recid = asjson[0]['recid']
             self.name = asjson[0]['name'] 
             self.starttime = asjson[0]['starttime']
-            selfendtime = asjson[0]['endtime']
+            self.endtime = asjson[0]['endtime']
     
-        self.state = "CODA"
+        self.state = STATE_ACTIVE
 
 
     # launch the job for processing files
     def start(self):
         self.job = RecJob( self )
 
+    """
     def getvalues(self,val=None):
         return { "id":self.id,
+                "recid":self.recid,
                 "name":self.name,
                 "starttime":self.starttime, 
                 "endtime":self.endtime,
-                "state": self.state
+                "active": self.active
                 }
-      
+    """
     def err(self): 
         return self.error
 
     def set_run(self):
-        self.state = "RUN"
+        self.active = STATE_RUN
 
     def set_done(self):
-        self.state = "DONE"
+        self.active = STATE_DOWN
 
     def __repr__(self):
-        return "<Rec('%s','%s','%s', '%s', '%s')>" % (self.id, self.name, self.starttime, self.endtime, self.state)
+        return "<Rec(id:'%s',recid:'%s',name:'%s',Start: '%s',End: '%s',Active: '%s')>" \
+                % (self.id, self.recid, self.name, self.starttime, self.endtime, self.active)
 
 """ ************ 
 RecDB
@@ -105,50 +115,115 @@ class RecDB:
         
         Session = sessionmaker(bind=self.engine)
         self.session = Session()    
+
+        self.err = ""
+        self.recordtimeformat = "%Y/%m/%d %H:%M:%S"
         
     def add(self, simplerecord):
-        logging.debug("New Record: %s" % simplerecord)
-        self.session.add( simplerecord )
+        print self.session.add( simplerecord )
         self.commit()
+        logging.info("New Record: %s" % simplerecord)
         return ( simplerecord )
 
-    def delete(self,id):
-        _r = self.get_by_id(id)
+
+    """" 
+        UPDATE RECORD 
+    """
+    def update(self, recid, rec):
+
+        _rlist = self._search(recid=recid)
+        if not len(_rlist) == 1:
+            return False
+
+        logging.info("DB:: Update request %s:%s " % (recid, rec))
+        logging.info("DB:: Update: data before %s" % _rlist[0])
+
+        # 2013-11-24 22:22:42
+        _rlist[0].starttime = datetime.datetime.strptime(rec["starttime"], self.recordtimeformat)
+        _rlist[0].endtime = datetime.datetime.strptime(rec["endtime"], self.recordtimeformat)
+        _rlist[0].name = rec["name"]
+        logging.info("DB:: Update: data AFTER %s" % _rlist[0])
+
+        self.commit()
+        logging.info("DB:: Update complete")
+        return True
+
+    """" 
+        DELETE RECORD 
+    """
+    def delete(self,_id):
         
-        if _r:
-            self.session.delete( _r )
-            self.commit()
-            return
-        logging.info("Delete error: ID %s not found!", id)
+        _rlist = self._search(_id=_id)
+        
+        if len(_rlist) == 0: 
+            logging.info("DB: Delete: no record found!")
+            self.err = "No rec found"
+            return False
+            
+        if len(_rlist) > 1: 
+            logging.info("DB: Delete: multilpe records found!")
+            self.err = "multiple ID Found %s" % (_rlist)
+            return False
+
+        self.session.delete( _rlist[0] )
+        logging.info("DB: Delete: delete complete")
+        self.commit()
+        return True
         
     def commit(self):
+        logging.info("DB: Commit!!")
         self.session.commit()
 
     def get_all(self, page=0, page_size=PAGESIZE):
         return self._search(page=page, page_size=page_size)
     
-    def _search(self, _id=None, name=None, starttime=None, endtime=None, state=None, page=0, page_size=PAGESIZE):
+    def _search(self, _id=None, name=None, recid=None, starttime=None, endtime=None, active=None, page=0, page_size=PAGESIZE):
+    
+        logging.info("DB: Search => id:%s recid:%s name:%s starttime:%s endtime=%s active=%s" % (_id,recid,name,starttime,endtime,active))
+        
         query = self.session.query(Rec)
-        if _id:         query = query.filter_by(id=_id)
-        if name:        query = query.filter_by(name=name)
-        if starttime:   query = query.filter(Rec.starttime>starttime)
-        if endtime:     query = query.filter(Rec.endtime<endtime)
-        if state:       query = query.filter(state=state)
+        
+        if not _id == None:         query = query.filter_by(id=_id)
+        if not recid == None:       query = query.filter_by(recid=recid)
+        if not name == None:        query = query.filter(Rec.name.like("%"+name+"%"))
+        try:
+            if not starttime == None:   
+                _st = datetime.datetime.strptime(starttime, self.recordtimeformat)
+                query = query.filter(Rec.starttime > _st )
+        except:
+                logging.info("DB: search : no valid starttime")    
+        try:
+            if not endtime == None:     
+                _et = datetime.datetime.strptime(endtime, self.recordtimeformat)
+                query = query.filter(Rec.endtime < _et )
+        except ValueError:
+            logging.info("DB: search : no valid endtime")    
+
+        if not active == None:      query = query.filter(Rec.active==active)
+        
         if page_size:   query = query.limit(page_size)
         if page:        query = query.offset(page*page_size)
-
-        return query.all()
+        print query
+        ret = query.all()
+        # print "Sending: %s" % ret
+        return ret
+        
+    def get_err(self): 
+        print "DB error: %s" % (self.err)
+        t = self.err
+        self.err = ""
+        return t
         
-    def get_by_id(self,id):
+    """def get_by_id(self,id):
         try:
             return self._search( _id=id )[0]
         except:
             return None
-        
+    """  
+    
 # Just for debug
 def printall( queryres ):
-    for record in queryres:
-        print "R: %s" % record
+    for record in queryres: print "Record: %s" % record
 
 
 # Job in thread
@@ -161,7 +236,7 @@ class RecJob():
         self.starttime = rec.starttime
         self.endtime = rec.endtime
         
-    def run(self):
+    def extract(self):
 
         if type(self.starttime) != type(datetime.datetime.now()):
             logging.info("Starttime format error")
@@ -218,8 +293,8 @@ if __name__ == "__main__":
     a = Rec(name="Mimmo1", starttime=_mytime, endtime=_endtime)
     j = RecJob( a )
     # print (j)
-    j.run()
-    
+    # j.extract()
+    printall( db._search() )
     sys.exit("End test job")
       
     # a = Rec(name="Mimmo1", starttime=_mytime, endtime=None)