[cpif] r37 - trunk/frontend-web

svn at argo.es svn at argo.es
Fri May 11 16:02:16 CEST 2007


Author: jcea
Date: Fri May 11 16:02:14 2007
New Revision: 37

Log:
Primeros pasos en el frontal web

Added:
   trunk/frontend-web/
   trunk/frontend-web/global.py   (contents, props changed)
   trunk/frontend-web/init.py   (contents, props changed)
   trunk/frontend-web/servidor_web.py   (contents, props changed)

Added: trunk/frontend-web/global.py
==============================================================================
--- (empty file)
+++ trunk/frontend-web/global.py	Fri May 11 16:02:14 2007
@@ -0,0 +1,11 @@
+# $Id$
+
+"""Este modulo se utiliza para el intercambio
+de datos globales entre modulos. Su uso deberia
+limitarse al minimo posible.
+"""
+
+# 'monitor' sera un decorador utilizado para
+# sincronizar el acceso al storage.
+monitor=None
+

Added: trunk/frontend-web/init.py
==============================================================================
--- (empty file)
+++ trunk/frontend-web/init.py	Fri May 11 16:02:14 2007
@@ -0,0 +1,41 @@
+# $Id$
+
+def main() :
+  from globales import monitor
+  from servidor_web import servidor_web
+
+  import os.path,sys
+  sys.path.append("backend")
+
+  import storage
+  dummy,dummy,monitor=storage.storage_and_monitor("db")
+
+  import database
+
+  database.init_database(monitor)
+
+  @monitor
+  def inicializa(conn) :
+    for i in ("Usuario1","Usuario2") :
+      if not database.usuario_get(conn,i) :
+        database.usuario_add(conn,i,None)
+
+  inicializa()
+
+# Lanzamos el servidor web en un hilo separado
+  import threading
+  t=threading.Thread(target=servidor_web)
+  t.setDaemon(True)
+  t.start()
+
+# Permanecemos web mientras el
+# servidor web siga vivo.
+  import time
+  while t.isAlive() :
+    time.sleep(0.1)
+
+  t.join()
+
+if __name__=="__main__" :
+  main()
+

Added: trunk/frontend-web/servidor_web.py
==============================================================================
--- (empty file)
+++ trunk/frontend-web/servidor_web.py	Fri May 11 16:02:14 2007
@@ -0,0 +1,199 @@
+# $Id$
+
+from globales import monitor
+
+def servidor_web() :
+  from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
+
+  class handler(BaseHTTPRequestHandler) :
+    must_stop=False
+
+    @monitor
+    def gestion_nuevo_post_POST(conn,self,path) :
+      import database
+      usuario=path[-1]
+      hilo=int(path[-2])
+      import cgi
+      ctype,pdict=cgi.parse_header(self.headers.getheader('content-type'))
+      cuerpo=cgi.FieldStorage(fp=self.rfile,headers=self.headers,environ={'REQUEST_METHOD':'POST'},keep_blank_values=1)
+      texto=cuerpo.getfirst("texto")
+      texto=texto.replace("\r","").replace("\n","<br>\r\n")
+      import database
+      database.mensaje_add(conn,texto,usuario,hilo=hilo)
+      return (200,"text/html",
+"""
+<html><head></head><body>
+<h1>Mensaje publicado</h1>
+<p><a href="/pagina_principal/%s">P&aacute;gina principal</a>
+<p><a href="/stop">Parar la demo</a>
+</body></html>""" %(usuario))
+
+    @monitor
+    def gestion_hilo(conn,self,path) :
+      import time,database
+      usuario=path[-1]
+      root=conn.get_root()
+      hilo_num=int(path[-2])
+      hilo=root["hilos"]["hilos"][hilo_num]
+      texto=["<h2>Hilo: %s (%s)</h2>" %(hilo["titulo"],hilo["creador"])]
+      texto.extend(["<font size=-2>%s</font>" %time.ctime(hilo["TS creacion"]),"<hr>"])
+
+      u=root["usuarios"]["usuarios"][database.normaliza_nick(usuario)]
+      if hilo_num in u["punto de lectura no leidos"] :
+        del u["punto de lectura no leidos"][hilo_num]
+
+      estilos=["par","impar"]
+      for msg_num,msg in hilo["mensajes"].items() :
+        estilo=estilos.pop(0)
+        estilos.append(estilo)
+        texto.append("<div class='%s'><a name='%s'><p>Autor: %s - fecha: %s</a>" %(estilo,msg_num,msg["autor"],time.ctime(msg["TS"])))
+        texto.append("<p>%s</div>" %msg["texto"])
+
+      u["punto de lectura"][hilo_num]=hilo["mensajes"].get_max_item()[0]
+
+      return(200,"text/html",
+"""
+<html><head></head><body>
+<style>
+.par   {background-color: efe}
+.impar {background-color: eef}
+</style>
+
+%s
+<hr>
+<p><a href="/pagina_principal/%s">P&aacute;gina principal</a>
+<p><form action="/nuevo_post_POST/%s/%s" method="post" enctype="multipart/form-data">
+<table>
+<tr><td>Texto:</td><td><br><textarea name="texto" rows="10" cols="60"></textarea></td></tr>
+<tr><td colspan=2 align=right><input class="form-element" type="submit" name="submit" value="Publicar nuevo mensaje"/></td></tr>
+</table>
+</form>
+<p><a href="/stop">Parar la demo</a>
+</body></html>""" %("\r\n".join(texto),usuario,hilo_num,usuario))
+
+      
+    @monitor
+    def gestion_pagina_principal(conn,self,path) :
+      import time,database
+      root=conn.get_root()
+      hilos=root["hilos"]["hilos"]
+      usuario=path[-1]
+      database.actualiza_no_leidos(conn,usuario)
+      h=database.listado_hilos_personal(conn,usuario)
+      texto=[]
+      estilos=["impar","par"]
+      punto_no_leido=root["usuarios"]["usuarios"][database.normaliza_nick(usuario)]["punto de lectura no leidos"]
+      for hilo,titulo,last_msg,no_leido in h :
+        estilo=estilos.pop(0)
+        estilos.append(estilo)
+        ts_creacion=time.ctime(hilos[hilo]["TS"])
+        if no_leido :
+          texto.append("<div class='%s'><a href='/hilo/%d/%s'>%s</a> <font size=-2>(%s)</font> - <a href='/hilo/%d/%s#%d'>No leido</a></div>"
+                       %(estilo,hilo,usuario,titulo,ts_creacion,hilo,usuario,punto_no_leido[hilo]))
+        else :
+          texto.append("<div class='%s'><a href='/hilo/%d/%s'>%s</a> <font size=-2>(%s)</font></div>" %(estilo,hilo,usuario,titulo,ts_creacion))
+      return(200,"text/html",
+"""
+<html><head></head><body>
+<style>
+.par   {background-color: efe}
+.impar {background-color: eef}
+</style>
+
+<h1>P&aacute;gina principal</h1>
+%s
+<hr>
+<form action="/nuevo_hilo_POST/%s" method="post" enctype="multipart/form-data">
+<table>
+<tr><td>T&iacute;tulo:</td><td><input type="text" name="titulo" size="60" value="" /></td></tr>
+<tr><td>Texto:</td><td><br><textarea name="texto" rows="10" cols="60"></textarea></td></tr>
+<tr><td colspan=2 align=right><input class="form-element" type="submit" name="submit" value="Publicar nuevo hilo"/></td></tr>
+</table>
+</form>
+<p><a href="/stop">Parar la demo</a>
+</body></html>""" %("\r\n".join(texto),usuario))
+
+    @monitor
+    def gestion_nuevo_hilo_POST(conn,self,path) :
+      usuario=path[-1]
+      import cgi
+      ctype,pdict=cgi.parse_header(self.headers.getheader('content-type'))
+      cuerpo=cgi.FieldStorage(fp=self.rfile,headers=self.headers,environ={'REQUEST_METHOD':'POST'},keep_blank_values=1)
+      titulo=cuerpo.getfirst("titulo")
+      texto=cuerpo.getfirst("texto")
+      texto=texto.replace("\r","").replace("\n","<br>\r\n")
+      import database
+      database.mensaje_add(conn,texto,usuario,titulo=titulo)
+      return (200,"text/html",
+"""
+<html><head></head><body>
+<h1>Hilo publicado</h1>
+<p><a href="/pagina_principal/%s">P&aacute;gina principal</a>
+<p><a href="/stop">Parar la demo</a>
+</body></html>""" %(usuario))
+
+      
+    def gestion_stop(self,path) :
+      self.must_stop=True
+      return (200,"text/html",
+"""
+<html><head></head><body>
+<h1>PARAMOS EL SERVICIO!!</h1>
+</body></html>""")
+
+    def gestion_(self,path) :
+      return (200,"text/html",
+"""
+<html><head></head>
+<body><h1>Elige el usuario</h1>
+<ul>
+<p><li><a href="/elige/Usuario1">Usuario 1</a>
+<p><li><a href="/elige/Usuario2">Usuario 2</a>
+</ul>
+<p><a href="/stop">Parar la demo</a>
+</body></html>""")
+
+    def gestion_elige(self,path) :
+      usuario=path[1]
+      return (200,"text/html",
+"""
+<html><head></head>
+<body>Hemos elegido al usuario '%s'.
+<p><a href="/pagina_principal/%s">P&aacute;gina principal</a>
+<p><a href="/stop">Parar la demo</a>
+</body></html>""" %(usuario,usuario))
+
+    def do_GET(self) :
+      try :
+        path=self.path.split("/")[1:]
+        resultado=getattr(self,"gestion_"+path[0],None)
+        if resultado :
+          resultado=resultado(path)
+        else :
+          resultado=(401,"text/html","La URL introducida es incorrecta")
+      except :
+        self.send_response(500)
+        self.send_header("Content-Type","text/plain")
+        self.end_headers()
+        import traceback
+        self.wfile.write(traceback.format_exc())
+        import sys,time
+        print >>sys.stderr,"EXCEPCION:",time.ctime()
+        raise
+
+      self.send_response(resultado[0])
+      self.send_header("Content-Type",resultado[1])
+      self.end_headers()
+      self.wfile.write(resultado[2])
+
+      if self.must_stop :
+        import os
+        os._exit(os.EX_OK)
+
+    def do_POST(self) :
+      return self.do_GET()
+
+  httpd=HTTPServer(("",8877),handler)
+  httpd.serve_forever()
+
+



More information about the cpif mailing list