server.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. # from bottle import hook, response, route, run, static_file, request
  2. from bottle import Bottle, hook, template, response, request,static_file
  3. import json
  4. import socket
  5. from techrec import *
  6. class RecServer:
  7. def __init__(self,host="127.0.0.1", port=8000):
  8. self._host = host
  9. self._port = port
  10. self._app = Bottle()
  11. self._route()
  12. self.db = RecDB()
  13. def start(self):
  14. self._app.run(host=self._host, port=self._port)
  15. @hook('after_request')
  16. def enable_cors(self):
  17. #These lines are needed for avoiding the "Access-Control-Allow-Origin" errors
  18. response.headers['Access-Control-Allow-Origin'] = '*'
  19. response.headers['Access-Control-Allow-Origin'] = '*'
  20. response.headers['Access-Control-Allow-Methods'] = 'PUT, GET, POST, DELETE, OPTIONS'
  21. response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
  22. def _route(self):
  23. self._app.route('/favicon.ico', callback=self.favicon)
  24. self._app.route('/help', callback=self.help)
  25. self._app.route('/help/', callback=self.help)
  26. self._app.route('/create', method="POST", callback=self.create)
  27. # self._app.post('/create', callback=self.create)
  28. self._app.route('/update', method="POST", callback=self.update)
  29. self._app.route('/search', method="POST", callback=self.search)
  30. self._app.route('/delete', method="POST", callback=self.delete)
  31. def extsearch( self, args ):
  32. print "ARG", args
  33. return self.rec_err("EXT")
  34. """
  35. CREATE HANDLER
  36. """
  37. # @route('/create', method=['OPTIONS','POST'])
  38. def create(self):
  39. self.enable_cors()
  40. req = dict( request.POST.allitems() )
  41. ret = {}
  42. print "Server:: Create request %s " % req
  43. starttime = ""
  44. if req["starttime-"+req["recid"]] != "":
  45. starttime = datetime.datetime.strptime( req["starttime-"+req["recid"]] , "%Y/%m/%d %H:%M:%S")
  46. endtime = datetime.datetime.now()
  47. if req["endtime-"+req["recid"]] != "":
  48. endtime = datetime.datetime.strptime( req["endtime-"+req["recid"]] , "%Y/%m/%d %H:%M:%S")
  49. print "Name %s RECID %s Starttime %s EndTime %s" %(req["name-"+req["recid"]],req["recid"], starttime,endtime )
  50. ret = self.db.add( Rec(name=req["name-"+req["recid"]],
  51. recid=req["recid"],
  52. starttime=starttime,
  53. endtime=endtime )
  54. )
  55. return { "msg": "Nuova registrazione aggiunta", }
  56. return self.rec_msg("Nuova registrazione creata! (id:" + ret.id *")")
  57. # @route('/active')
  58. def getactive(self):
  59. print "GetActive"
  60. """
  61. DELETE HANDLER
  62. """
  63. # @route('/delete/<recid>') # @route('/delete/<recid>/')
  64. def delete( self, recid = None ):
  65. self.enable_cors()
  66. req = dict( request.POST.allitems() )
  67. logging.info("Server: request delete %s " % ( req ) )
  68. if not req.has_key( "recid" ):
  69. return self.rec_err("No valid ID")
  70. if self.db.delete( req["recid"] ):
  71. return self.rec_msg("DELETE OK")
  72. else:
  73. return self.rec_err("DELETE error: %s" % (self.db.get_err()))
  74. """
  75. UPDATE HANDLER
  76. """
  77. # @route('/delete/<recid>') # @route('/delete/<recid>/')
  78. def update( self ):
  79. self.enable_cors()
  80. req = dict( request.POST.allitems() )
  81. ret={}
  82. ret["starttime"] = req ["starttime-"+req["recid"]]
  83. ret["endtime"] = req["endtime-"+req["recid"]]
  84. ret["name"] = req["name-"+req["recid"]]
  85. if self.db.update( req["recid"], ret ):
  86. return self.rec_msg("Aggiornamento completato!");
  87. else:
  88. return self.rec_err("Errore Aggiornamento");
  89. """
  90. JSON' RESPONDER
  91. """
  92. def rec_msg(self, msg): return self.rec_xerr("message", msg)
  93. def rec_err(self, msg): return self.rec_xerr("error", msg)
  94. def rec_xerr(self,_type,_msg): return { _type : _msg }
  95. """
  96. @route('/search') # @route('/search/') # @route('/search/<key>/<value>')
  97. """
  98. def search( self, args=None):
  99. self.enable_cors()
  100. req = dict( request.POST.allitems() )
  101. print "Search request: %s" % (req)
  102. name = "%s" % req["name"]
  103. if req["name"] == "": name = None
  104. starttime = req["starttime"]
  105. if req["starttime"] == "": starttime = None
  106. endtime = req["endtime"]
  107. if req["endtime"] == "": endtime = None
  108. recid = req["recid"]
  109. if req["recid"]== "": recid = None
  110. active = True
  111. values = self.db._search(recid=recid,name=name, starttime=starttime, endtime=endtime,active=active)
  112. print "Returned Values %s" % values
  113. ret = {}
  114. for rec in values:
  115. recid = "rec-" + str(rec.id)
  116. ret [recid] = {}
  117. ret [recid]["name"] = rec.name
  118. ret [recid]["id"] = rec.id
  119. ret [recid]["recid"] = rec.recid
  120. ret [recid]["starttime"] = rec.starttime.strftime("%Y-%m-%d-%H-%H-%s")
  121. if rec.endtime != None:
  122. ret [recid]["endtime"] = rec.endtime.strftime("%Y-%m-%d-%H-%H-%s")
  123. ret [recid]["active"] = rec.active
  124. logging.info("Return: %s" % ret);
  125. return ret
  126. # @route('/favicon.ico')
  127. def favicon(self):
  128. return static_file('icon.ico', root="./img/", mimetype="image/ico")
  129. # @route('/help')
  130. def help(self):
  131. return " <h1>help</h1><hr/>\
  132. <h2>/get, /get/, /get/<recid> </h2>\
  133. <h3>Get Info about rec identified by RECID </h3>\
  134. \
  135. <h2>/search, /search/, /search/<key>/<value></h2>\
  136. <h3>Search rec that match key/value (or get all)</h3>\
  137. \
  138. <h2>/delete/<recid> </h2>\
  139. <h3>Delete rec identified by RECID </h3>\
  140. <h2>/update </h2>\
  141. <h3>Not implemented.</h3>"
  142. """
  143. TESTs
  144. """
  145. if __name__ == "__main__":
  146. c = RecServer(host="0.0.0.0")
  147. c.start()