diff --git a/README.md b/README.md index f7dd5f7..b67d9bc 100644 --- a/README.md +++ b/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 diff --git a/client/css/style.css b/client/css/style.css index 4320185..d524faa 100644 --- a/client/css/style.css +++ b/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 { diff --git a/client/index.html b/client/index.html index 69ea470..ea81e7d 100644 --- a/client/index.html +++ b/client/index.html @@ -18,6 +18,7 @@ $(document).ready(function(){ rec_new(); }); + //rec_active(); rec_new(); }); diff --git a/client/js/reclibrary.js b/client/js/reclibrary.js index 7401121..fcd6bd3 100644 --- a/client/js/reclibrary.js +++ b/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 = "
"; + if (butflag) { + str = str + ""; + str = str + ""; + str = str + ""; + str = str + ""; + } + + str = str + ""; + str = str + ""; + str = str + ""; + str = str + ""; + + if (! butflag) { + str = str + ""; + } + /* + str = str + ""; + str = str + ""; + str = str + " "; + */ + str = str + "
"; + + 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 + "
" ); + }); + + 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( "
" ); - console.log("[rec_new] add div TRXArea "+ rs_trxarea(recid) ); - $("#"+rs_trxarea(recid)).append( "
" ); - 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 = "
"; - - str = str + ""; - - str = str + ""; - // ADD SUBITO TEXTBUTTON - str = str + ""; - - str = str + ""; - - str = str + " "; - - str = str + "
"; - + 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 "+recid+"] Form OK"); - - console.log("[rec_new] add form "+ formid ); - - - $("#"+rs_buttonarea(recid)).append( "\
cancella \" ); + $("#"+rs_buttonarea(recid)).append( "
cancella
" ); // INSERT AND POPULATE BUTTON AREA - $("#"+rs_trxarea(recid)).append( "
Nuova trasmissione
" ); - - $("#"+trx_startbut(recid)).click(function(){ - ChangeState(recid, trx_startbut(recid) , trx_stopbut(recid)); - }); + $("#"+rs_trxarea(recid)).append( "
Nuova trasmissione
" ); - $("#"+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 + "
" ); - }); + // 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: "+ tmpname +"
"); + } + else { break; } + } - console.log("Req OK: "+ data); - console.log("req"+ request); - } ); + event.preventDefault(); + + // Update data (send to server) in order to save some information + recUpdate(recid); + + recStart(recid); - request.fail(function (jqXHR, textStatus, errorThrown){ + }); // End of form SUBMIT - console.error("The following error occured: "+ - jqXHR.status, +"-"+ textStatus + "-" + errorThrown - ); - }); - */ - }); + // Bind the STOP button + $("#"+trx_stopbut(recid)).click( function(event){ - console.log("Form readyReady"); + 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."); } -function RecAjax(apipath, dataString) { +/* New Record */ +function recNew ( recid ) { + var formid = rs_formid( recid ); + var dataString = $("#"+formid).serialize(); + + console.log("New rec: "+dataString); + + 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
(recid:"+recid+")
"); + $("#"+trx_logarea(recid)).append("Inizio: "+ $("#"+rs_inputstart(recid)).val() +"
"); + } + if (key == "error") { + $("#"+trx_logarea( recid )).html("Errore: impossibile creare una nuova registrazione"+val+" "); + } + + }); + } ); + return request; +} + +/* 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 += "RecID "+ recid + "
" + str += "nome "+ $("#"+rs_trxname(recid)).val() + "
" + str += "Inizio "+ $("#"+rs_inputstart(recid)).val() + "
" + str += "Fine "+ $("#"+rs_inputend(recid)).val() + "
" + + $("#"+trx_logarea(recid)).html( str ); + // if all elements have been recorded + if ($("#"+rs_trxname(recid)).val() != "") { + $("#"+trx_logarea(recid)).append( "In Elaborazione" ); + } + } + + if (key == "error") { + $("#"+trx_logarea( recid )).append( "Error:" + val +"
" ); + } + }); // 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 + "
" ); - }); - 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("
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("
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 diff --git a/client/registrazioni.sqlite b/client/registrazioni.sqlite deleted file mode 100644 index d33de99..0000000 Binary files a/client/registrazioni.sqlite and /dev/null differ diff --git a/client/tempo.html b/client/tempo.html index ab329d0..62c254b 100644 --- a/client/tempo.html +++ b/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 = "
"; + var divstring = "
"; $("#searchresult").append( divstring ); // var str = newformstr( key ); // new form - var str = "
"+val.name+" - Scarica
"; - str += "["+val.starttime+" >>> "+val.endtime+"]" + var str = ""; + str += "
"+val.name+" - Scarica Cancella
"; + str += "
RECID: "+val.recid+" ID: "+ val.id + " Active " + val.active + "
"; + str += "
["+val.starttime+" >>> "+val.endtime+"]
" - $("#"+rs_trxarea(key)).html(str); + $("#"+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)); - // $("#"+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") {} + } + + if (del_key == "error") { + alert("Impossibile cancellare elemento"); + } + + }); + }); + } + ); // End of delete link handler + }); }); }); @@ -66,9 +85,10 @@ $(document).ready(function(){
- - - +
+
+ (timepicker http://puna.net.nz/timepicker.htm#)
+
diff --git a/server/server.py b/server/server.py index d8d7ea8..9c13e01 100644 --- a/server/server.py +++ b/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/', 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/', method="POST", callback=self.search) - # self._app.route('/oldsearch//', method="POST", callback=self.search) - # self._app.route('/search/', method="POST", callback=self.search) - self._app.route('/delete/', method="GET", callback=self.delete) - self._app.route('/delete//', 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 ) - ) - return { "msg": "Nuova registrazione aggiunta" } - + + 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 *")") + # @route('/active') def getactive(self): print "GetActive" - + + """ + DELETE HANDLER + """ # @route('/delete/') # @route('/delete//') 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") - def rec_err(self, msg): - return { "error": msg } + 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/') # @route('/delete//') + 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"); + + """ + 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 diff --git a/server/techrec.db b/server/techrec.db index fafbcc7..2288cab 100644 Binary files a/server/techrec.db and b/server/techrec.db differ diff --git a/server/techrec.py b/server/techrec.py index b132d2f..bc3c25d 100644 --- a/server/techrec.py +++ b/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 "" % (self.id, self.name, self.starttime, self.endtime, self.state) + return "" \ + % (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 _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_by_id(self,id): + def get_err(self): + print "DB error: %s" % (self.err) + t = self.err + self.err = "" + return t + + """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)