[cpif] r381 - in trunk: . backend frontend-web frontend-web/skins/default
svn at argo.es
svn at argo.es
Thu Oct 11 17:39:19 CEST 2007
Author: jcea
Date: Thu Oct 11 17:39:16 2007
New Revision: 381
Log:
Implementamos el correo privado entre usuarios.
Added:
trunk/frontend-web/url_nuevo_hilo_privado_POST.py
- copied, changed from r378, /trunk/frontend-web/url_nuevo_hilo_POST.py
Modified:
trunk/TODO
trunk/backend/database.py
trunk/frontend-web/skins/default/body_show_thread_entry.html
trunk/frontend-web/skins/default/body_show_thread_entry_anonymous.html
trunk/frontend-web/skins/default/body_show_thread_entry_ro.html
trunk/frontend-web/url_hilo.py
trunk/frontend-web/url_nuevo_hilo_POST.py
trunk/frontend-web/url_perfil.py
Modified: trunk/TODO
==============================================================================
--- trunk/TODO (original)
+++ trunk/TODO Thu Oct 11 17:39:16 2007
@@ -419,3 +419,14 @@
Error code explanation: 400 = Bad request syntax or unsupported method.
+- 20071011: FRONTAL WEB: Cuando se publica un mensaje en varios metatags,
+ quien monitorice varios de ellos recibira varias notificaciones por email.
+
+- 20071011: Ahora que tenemos hilos en varios metatags, se penaliza la velocidad
+ cuando calculamos los hilos no leidos de los usuarios. Revisarlo.
+
+- 20071011: FRONTAL WEB: Cuando mostramos un hilo, tenemos que revisar
+ los metatags del hilo para mostrar exclusivamente el enlace al metatag al que
+ tenemos acceso. Eso es lento. Revisarlo.
+
+
Modified: trunk/backend/database.py
==============================================================================
--- trunk/backend/database.py (original)
+++ trunk/backend/database.py Thu Oct 11 17:39:16 2007
@@ -447,7 +447,7 @@
if not msg : return None,None
return (msg["autor"],msg["texto"][0])
-def mensaje_add(conn,texto_bruto,texto_procesado,nick,hilo=None,titulo=None,metatag=None) :
+def mensaje_add(conn,texto_bruto,texto_procesado,nick,hilo=None,titulo=None,metatags=None) :
from durus.btree import BTree
from durus.persistent_dict import PersistentDict
import time
@@ -458,7 +458,7 @@
hilos=root["hilos"]
mensajes=root["mensajes"]
seguimiento_no_leidos=root["seguimiento_no_leidos"]
- metatags=root["metatags"]["metatags"]
+ metatags2=root["metatags"]["metatags"]
ts=time.time()
mensaje=PersistentDict(
@@ -471,28 +471,32 @@
mensajes["mensajes"][num_msg]=mensaje
if hilo!=None :
+ valor_retorno=(hilo,num_msg)
h=hilo
mensaje["hilo"]=hilo
hilo=hilos["hilos"][hilo]
- mon=hilo["monitor"]
+ mon=[hilo["monitor"]]
last=hilo["mensajes"].get_max_item()[0]
del seguimiento_no_leidos["last_msg2hilo"][last]
TS=hilo["TS"]
for metatag in hilo["metatags"] :
- del metatags[metatag]["TS2hilo"][TS]
+ del metatags2[metatag]["TS2hilo"][TS]
else : # Empezamos un hilo nuevo
from durus.persistent_set import PersistentSet
hilos["num_hilos"]+=1
h=hilos["num_hilos"]
+ valor_retorno=(h,num_msg)
root["punto_de_lectura_global"][h]=0
- mon=root["metatags"]["metatags"][metatag]["monitor"]
+ mon=[]
+ for metatag in metatags :
+ mon.append(root["metatags"]["metatags"][metatag]["monitor"])
hilo=PersistentDict()
assert titulo
hilo=PersistentDict(
{"creador":nick,
"TS creacion":ts,
"titulo":titulo,
- "metatags":PersistentSet([metatag]),
+ "metatags":PersistentSet(metatags),
"monitor":BTree(),
"num_mensajes":0,
"mensajes":BTree(),
@@ -510,42 +514,51 @@
hilo["numeros"][num_mensajes]=num_msg
hilo["TS"]=ts
for metatag in hilo["metatags"] :
- metatags[metatag]["TS2hilo"][ts]=(h,hilo)
+ metatags2[metatag]["TS2hilo"][ts]=(h,hilo)
usuario=root["usuarios"]["usuarios"][usuario]
usuario["num mensajes"]+=1
usuario["mensajes"][num_msg]=mensaje
meta_u=root["usuarios"]["usuarios"]
- destinations=[]
- for i in mon.iterkeys() :
- u=meta_u[normaliza_nick(i)]
- umc=u["ultimo mensaje conocido"]
- if umc<last : continue # Already notified
- if h in u["punto de lectura no leidos"][list(hilo["metatags"])[0]] :
- continue # Already notified
- email=u["email"]
- if email : destinations.append(email)
- if len(destinations) :
- from email.header import Header
- import smtp
- texto=["From: %s" %globales.smtp_email_sender]
- texto.append("To: %s" %globales.smtp_email_sender)
-
- if last : # Thread
- texto.append("Subject: Nuevo mensaje en el hilo %s"
- %Header("'%s'" %hilo["titulo"],"utf-8",76,"Subject: Nuevo mensaje en el hilo ").encode())
- texto.append("")
- texto.append("Nuevo mensaje")
- texto.append("%s/hilo/%d/%d#m%d" %(globales.base_url,h,1+globales.thread_len*((num_mensajes-1)/globales.thread_len),num_msg))
- else : # Metatag
- texto.append("Subject: Nuevo hilo %s"
- %Header("'%s'" %hilo["titulo"],"utf-8",76,"Subject: Nuevo hilo ").encode())
- texto.append("")
- texto.append("Nuevo hilo")
- texto.append("%s/hilo/%d" %(globales.base_url,h))
+ for mon in mon :
+ destinations=[]
+ for i in mon.iterkeys() :
+ u=meta_u[normaliza_nick(i)]
+ umc=u["ultimo mensaje conocido"]
+ if umc<last : continue # Already notified
+ plnl=u["punto de lectura no leidos"]
+ already_notified=False
+ for metatag in hilo["metatags"] :
+ if metatag not in plnl : continue # No tenemos acceso a ese metatag
+ if h in plnl[metatag] :
+ already_notified=True
+ break # Already notified
+ if already_notified : continue
+ email=u["email"]
+ if email : destinations.append(email)
+ if len(destinations) :
+ from email.header import Header
+ import smtp
+ texto=["From: %s" %globales.smtp_email_sender]
+ texto.append("To: %s" %globales.smtp_email_sender)
+
+ if last : # Thread
+ texto.append("Subject: Nuevo mensaje en el hilo %s"
+ %Header("'%s'" %hilo["titulo"],"utf-8",76,"Subject: Nuevo mensaje en el hilo ").encode())
+ texto.append("")
+ texto.append("Nuevo mensaje")
+ texto.append("%s/hilo/%d/%d#m%d" %(globales.base_url,h,1+globales.thread_len*((num_mensajes-1)/globales.thread_len),num_msg))
+ else : # Metatag
+ texto.append("Subject: Nuevo hilo %s"
+ %Header("'%s'" %hilo["titulo"],"utf-8",76,"Subject: Nuevo hilo ").encode())
+ texto.append("")
+ texto.append("Nuevo hilo")
+ texto.append("%s/hilo/%d" %(globales.base_url,h))
- smtp.enqueue(conn,destinations,"\r\n".join(texto))
+ smtp.enqueue(conn,destinations,"\r\n".join(texto))
+
+ return valor_retorno
def actualiza_no_leidos(conn,usuario) :
root=conn.get_root()
@@ -576,7 +589,9 @@
h=hilos[hilo]
ultimo=h["mensajes"].items_from(ultimo,closed=False).next()[0]
for metatag in h["metatags"] :
- posicion_hilos_no_leidos[metatag][hilo]=ultimo
+ mt=posicion_hilos_no_leidos.get(metatag)
+ print metatag,mt
+ if mt!=None : mt[hilo]=ultimo
usuario["ultimo mensaje conocido"]=global_last
def listado_stickies_personal(conn,usuario,metatag) :
@@ -664,7 +679,8 @@
u["punto de lectura"][hilo_num]=msg_num
pnl=0
for metatag in metatags :
- plnl=u["punto de lectura no leidos"][metatag]
+ plnl=u["punto de lectura no leidos"].get(metatag)
+ if not plnl : continue # No tenemos acceso a ese metatag
nl=plnl.get(hilo_num)
if nl and (nl<=msg_num) :
if finished : del plnl[hilo_num]
@@ -734,8 +750,12 @@
u=root["usuarios"]["usuarios"][nick_norm]
if thread in u["monitor hilos"] :
+ thr=root["hilos"]["hilos"][thread]
+ if u["metatag_privado"] in thr["metatags"] :
+ return None,True
+
del u["monitor hilos"][thread]
- del root["hilos"]["hilos"][thread]["monitor"][nick_norm]
+ del thr["monitor"][nick_norm]
return None,False
thr=root["hilos"]["hilos"].get(thread)
Modified: trunk/frontend-web/skins/default/body_show_thread_entry.html
==============================================================================
--- trunk/frontend-web/skins/default/body_show_thread_entry.html (original)
+++ trunk/frontend-web/skins/default/body_show_thread_entry.html Thu Oct 11 17:39:16 2007
@@ -1,6 +1,6 @@
<div class="%(format)s" id="m%(msg_num)s">
<a name="m%(msg_num)s"></a>
- <div class="autor">Autor: %(author)s<br />
+ <div class="autor">Autor: <a href="/perfil/%(author)s">%(author)s</a><br />
%(avatar)s
</div>
<div class="texto">
Modified: trunk/frontend-web/skins/default/body_show_thread_entry_anonymous.html
==============================================================================
--- trunk/frontend-web/skins/default/body_show_thread_entry_anonymous.html (original)
+++ trunk/frontend-web/skins/default/body_show_thread_entry_anonymous.html Thu Oct 11 17:39:16 2007
@@ -1,6 +1,6 @@
<div class="%(format)s" id="m%(msg_num)s">
<a name="m%(msg_num)s"></a>
- <div class="autor">Autor: %(author)s<br />
+ <div class="autor">Autor: <a href="/perfil/%(author)s">%(author)s</a><br />
%(avatar)s
</div>
<div class="texto">
Modified: trunk/frontend-web/skins/default/body_show_thread_entry_ro.html
==============================================================================
--- trunk/frontend-web/skins/default/body_show_thread_entry_ro.html (original)
+++ trunk/frontend-web/skins/default/body_show_thread_entry_ro.html Thu Oct 11 17:39:16 2007
@@ -1,6 +1,6 @@
<div class="%(format)s" id="m%(msg_num)s">
<a name="m%(msg_num)s"></a>
- <div class="autor">Autor: %(author)s<br />
+ <div class="autor">Autor: <a href="/perfil/%(author)s">%(author)s</a><br />
%(avatar)s
</div>
<div class="texto">
Modified: trunk/frontend-web/url_hilo.py
==============================================================================
--- trunk/frontend-web/url_hilo.py (original)
+++ trunk/frontend-web/url_hilo.py Thu Oct 11 17:39:16 2007
@@ -24,8 +24,13 @@
meta,mensajes,num_mensajes,finished,metatags,mon=database.listado_hilo(conn,usuario,hilo_num,first_post)
if not meta : return None
- assert len(metatags)==1 # De momento no permitimos multiples metatags para un hilo
- metatag=metatags[0]
+ if len(metatags)==1 :
+ metatag=metatags[0]
+ else :
+ mts=conn.get_root()["usuarios"]["usuarios"][database.normaliza_nick(usuario)]["punto de lectura no leidos"]
+ for metatag in metatags :
+ if metatag in mts : break # Siempre hay al menos uno
+
import skins
pagina = skins.Skin(path,usuario,handler.headers)
Modified: trunk/frontend-web/url_nuevo_hilo_POST.py
==============================================================================
--- trunk/frontend-web/url_nuevo_hilo_POST.py (original)
+++ trunk/frontend-web/url_nuevo_hilo_POST.py Thu Oct 11 17:39:16 2007
@@ -39,6 +39,6 @@
error,texto2=parsers.convert_to_html(texto)
if error :
return (200,{"Content-Type":"text/plain; charset=utf-8"},error)
- database.mensaje_add(conn,texto,texto2,usuario,titulo=titulo,metatag=metatag)
+ database.mensaje_add(conn,texto,texto2,usuario,titulo=titulo,metatags=(metatag,))
return (302,{"Location":"/indice/%d" %metatag},"")
Copied: trunk/frontend-web/url_nuevo_hilo_privado_POST.py (from r378, /trunk/frontend-web/url_nuevo_hilo_POST.py)
==============================================================================
--- /trunk/frontend-web/url_nuevo_hilo_POST.py (original)
+++ trunk/frontend-web/url_nuevo_hilo_privado_POST.py Thu Oct 11 17:39:16 2007
@@ -14,31 +14,35 @@
@monitor
def gestiona_url(conn,handler,path,usuario) :
+ from globales import allow_private_messages
+ if not allow_private_messages : return None
import database
- if len(path)!=2 : return None
- try :
- metatag=int(path[1])
- except :
- return None
- if not usuario : # Acceso anonimo
- return (302,{"Location":"/LOGIN/indice/%d" % metatag},"")
- if not database.user_has_metatag_access(conn,usuario,metatag,write=True) :
- return None
+ if len(path)!=1 : return None
+ if not usuario : return None # Acceso anonimo
import cgi
ctype,pdict=cgi.parse_header(handler.headers.getheader('content-type'))
cuerpo=cgi.FieldStorage(fp=handler.rfile,headers=handler.headers,environ={'REQUEST_METHOD':'POST'},keep_blank_values=1)
titulo=cuerpo.getfirst("titulo")
texto=cuerpo.getfirst("texto")
- if not (titulo and texto) : # Incluye tanto el caso de vacios como de inexistentes
+ usuario_pedido_normalizado=cuerpo.getfirst("usuario_pedido_normalizado")
+ if not (titulo and texto and usuario_pedido_normalizado) : # Incluye tanto el caso de vacios como de inexistentes
return pagina_error(path,usuario,"El Título y el Texto no pueden estar vacios")
+ root=conn.get_root()
+ usuarios=root["usuarios"]["usuarios"]
+ u=usuarios.get(usuario_pedido_normalizado)
+ if not u :
+ return None
+ u2=usuarios.get(database.normaliza_nick(usuario))
+
titulo=cgi.escape(titulo)
error,texto2=parsers.convert_to_html(texto)
if error :
return (200,{"Content-Type":"text/plain; charset=utf-8"},error)
- database.mensaje_add(conn,texto,texto2,usuario,titulo=titulo,metatag=metatag)
- return (302,{"Location":"/indice/%d" %metatag},"")
+ num_thread,dummy=database.mensaje_add(conn,texto,texto2,usuario,titulo=titulo,metatags=(u2["metatag_privado"],u["metatag_privado"]))
+ database.toggle_monitor_thread(conn,usuario,num_thread)
+ return (302,{"Location":"/indice/%s" %u2["metatag_privado"]},"")
Modified: trunk/frontend-web/url_perfil.py
==============================================================================
--- trunk/frontend-web/url_perfil.py (original)
+++ trunk/frontend-web/url_perfil.py Thu Oct 11 17:39:16 2007
@@ -7,6 +7,8 @@
if not usuario : # Acceso anonimo
return None
+ limited_profile=False
+
l=len(path)
if l==1 :
usuario_pedido=usuario
@@ -19,27 +21,44 @@
usuario_pedido_normalizado=database.normaliza_nick(usuario_pedido)
if usuario!="master" :
if database.normaliza_nick(usuario)!=usuario_pedido_normalizado :
- return None
+ limited_profile=True
root=conn.get_root()
u=root["usuarios"]["usuarios"].get(usuario_pedido_normalizado)
if not u :
return None
- import skins
- pagina = skins.Skin(path,usuario)
- advise = "(Se ha solicitado un cambio de dirección de correo electrónico, y está pendiente de confirmación)" if "new email" in u else ""
- OpenIDs=list(u["OpenID"])+["","","","",""] # Padding
- d = {
+ if limited_profile :
+ return (200, {"Content-Type":"text/html; charset=utf-8"},
+"""
+<html>
+<title>Enviar mensaje a %(usuario_pedido)s</title>
+<body>
+<h1>Enviar mensaje a %(usuario_pedido)s</h1>
+<form action="/nuevo_hilo_privado_POST" method="post" enctype="multipart/form-data">
+ <label for="titulo">Título:</label> <input type="text" name="titulo" id="titulo" size="60" value="" /><br />
+ <label for="texto">Texto:</label><textarea name="texto" id="texto" rows="10" cols="60"></textarea><br />
+ <input type="hidden" name="usuario_pedido_normalizado" value="%(usuario_pedido_normalizado)s"/>
+ <input class="form-element" type="submit" name="submit" value="Publicar nuevo hilo privado"/>
+</form>
+</body>
+</html>
+""" % {"usuario_pedido":usuario_pedido,"usuario_pedido_normalizado":usuario_pedido_normalizado})
+ else :
+ import skins
+ pagina = skins.Skin(path,usuario)
+ advise = "(Se ha solicitado un cambio de dirección de correo electrónico, y está pendiente de confirmación)" if "new email" in u else ""
+ OpenIDs=list(u["OpenID"])+["","","","",""] # Padding
+ d = {
"page_title": "cpif - perfil %s" % usuario,
"profile user": "%s %s" % (usuario_pedido, "<b><i>¡¡NO LOGIN!!</i></b>" if "no_login" in u else ""),
"profile email": "%s %s" % (u["email"], advise),
"profile openid1": "%s" % OpenIDs[0],
"profile openid2": "%s" % OpenIDs[1],
"avatar": u["avatar"],
- }
- for i,j in zip([3,4,5],OpenIDs[2:]):
- d["profile openid%d" % i] = "%s" % j
- pagina.load_dict(d)
+ }
+ for i,j in zip([3,4,5],OpenIDs[2:]):
+ d["profile openid%d" % i] = "%s" % j
+ pagina.load_dict(d)
- return (pagina.web())
+ return (pagina.web())
More information about the cpif
mailing list