[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&iacute;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&oacute;n de correo electr&oacute;nico, y est&aacute; pendiente de confirmaci&oacute;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&iacute;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&oacute;n de correo electr&oacute;nico, y est&aacute; pendiente de confirmaci&oacute;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>&iexcl;&iexcl;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