[cpif] r28 - trunk
svn at argo.es
svn at argo.es
Thu May 3 22:48:18 CEST 2007
Author: jcea
Date: Thu May 3 22:48:16 2007
New Revision: 28
Log:
Primeros pasos en una demo web.
Ejecuta "python demo_web.py" y conecta tu navegador a
127.0.0.1, puerto 8877.
Aun queda mucha tela que cortar, pero ya se puede ver
"algo".
Added:
trunk/demo_web.py (contents, props changed)
Modified:
trunk/database.py
Modified: trunk/database.py
==============================================================================
--- trunk/database.py (original)
+++ trunk/database.py Thu May 3 22:48:16 2007
@@ -1,7 +1,7 @@
# $Id$
-VERSION_DB="2007042301"
+VERSION_DB="2007050301"
def normaliza_nick(nick) :
@@ -68,6 +68,14 @@
"mensajes":BTree(),
"datos":datos})
+def usuario_get(conn,nick) :
+ root=conn.get_root()
+ usuarios=root["usuarios"]
+
+ nick_normalizado=normaliza_nick(nick)
+
+ return usuarios["usuarios"].get(nick_normalizado,None)
+
def mensaje_add(conn,texto,usuario,hilo=None,titulo=None) :
from durus.btree import BTree
from durus.persistent_dict import PersistentDict
@@ -138,5 +146,22 @@
posicion_hilos_no_leidos[hilo]=ultimo # Lo marcamos como pendiente de leer y nos vamos al ultimo que hemos leido
usuario["ultimo mensaje conocido"]=root["mensajes"]["num_mensajes"]
+def listado_hilos_personal(conn,usuario) :
+ root=conn.get_root()
+ hilos=root["hilos"]["hilos"]
+ usuario=root["usuarios"]["usuarios"][normaliza_nick(usuario)]
+
+ no_leidos=usuario["punto de lectura no leidos"].items()
+ no_leidos.sort(cmp=lambda x,y: cmp(x[1],y[1]))
+
+ resultado=[(i[0],hilos[i[0]]["titulo"],i[1],True) for i in no_leidos]
+
+ no_leidos=set((i[0] for i in no_leidos))
+
+ for last_msg,hilo in root["seguimiento_no_leidos"]["last_msg2hilo"].items_backward() :
+ if hilo in no_leidos : continue # Los ya leidos, ya los tenemos en la estructura
+ resultado.append((hilo,hilos[hilo]["titulo"],last_msg,False))
+
+ return resultado
Added: trunk/demo_web.py
==============================================================================
--- (empty file)
+++ trunk/demo_web.py Thu May 3 22:48:16 2007
@@ -0,0 +1,151 @@
+# $Id$
+
+def servidor_web() :
+ from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
+
+ class handler(BaseHTTPRequestHandler) :
+ must_stop=False
+
+ @monitor
+ def gestion_pagina_principal(conn,self,path) :
+ import database
+ usuario=path[-1]
+ database.actualiza_no_leidos(conn,usuario)
+ hilos=database.listado_hilos_personal(conn,usuario)
+ texto=[]
+ for hilo,titulo,last_msg,no_leido in hilos :
+ if no_leido :
+ texto.append("<p><a href='/hilo/%d/%s'>%s</a> - <a href='/hilo/%d/%d/%s'>No leido</a>"
+ %(hilo,usuario,titulo,hilo,last_msg,usuario))
+ else :
+ texto.append("<p><a href='/hilo/%d/%s'>%s</a>" %(hilo,usuario,titulo))
+ return(200,"text/html",
+"""
+<html><head></head><body>
+<h1>Página principal</h1>
+%s
+<hr>
+<form action="/nuevo_hilo_POST/%s" method="post" enctype="multipart/form-data">
+<table>
+<tr><td>Tí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>
+</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","\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á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á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()
+
+def main() :
+ global monitor
+
+ 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()
+
+ import threading
+ t=threading.Thread(target=servidor_web)
+ t.setDaemon(True)
+ t.start()
+
+ import time
+ while t.isAlive() :
+ time.sleep(0.1)
+
+ t.join()
+
+if __name__=="__main__" :
+ main()
+
More information about the cpif
mailing list