[cpif] r114 - in trunk: . backend frontend-web

svn at argo.es svn at argo.es
Tue Jun 5 18:04:50 CEST 2007


Author: jcea
Date: Tue Jun  5 18:04:45 2007
New Revision: 114

Log:
Primeros pasos en la visualizacion de "metatags" (subforos).



Modified:
   trunk/TODO
   trunk/backend/database.py
   trunk/backend/upgrade.py
   trunk/frontend-web/init.py
   trunk/frontend-web/url_.py

Modified: trunk/TODO
==============================================================================
--- trunk/TODO	(original)
+++ trunk/TODO	Tue Jun  5 18:04:45 2007
@@ -70,3 +70,9 @@
   hayan leido ese hilo. Ojito con esto. No se puede
   usar como la posicion de lectura mas comun para
   los usuarios, por ejemplo.
+
+- 20070605: La estructura "punto de lectura no leido"
+  local a cada usuario se usara tambien como
+  mecanismo de control de acceso. Es decir, ahi
+  apareceran los metatags a los que tenemos acceso.
+

Modified: trunk/backend/database.py
==============================================================================
--- trunk/backend/database.py	(original)
+++ trunk/backend/database.py	Tue Jun  5 18:04:45 2007
@@ -1,7 +1,7 @@
 # $Id$
 
 
-VERSION_DB="2007052401"
+VERSION_DB="2007060504"
 
 from globales import thread_len
 
@@ -33,9 +33,13 @@
     usuarios["num_usuarios"]=0
     root["usuarios"]=usuarios
 
+    metatags=PersistentDict()
+    metatags["metatags"]=BTree()
+    metatags["num_metatags"]=0
+    root["metatags"]=metatags
+
     hilos=PersistentDict()
     hilos["hilos"]=BTree()
-    hilos["TS2hilo"]=BTree()
     hilos["num_hilos"]=0
     root["hilos"]=hilos
 
@@ -99,9 +103,12 @@
     import random,sys
     clave=str(random.randint(0,sys.maxint))
 
+  bt=BTree()
+  for i in root["metatags"].iterkeys() :
+    bt[i]=BTree()
   usuarios["usuarios"][nick_normalizado]=PersistentDict(
                        {"ultimo mensaje conocido":root["mensajes"]["num_mensajes"],
-                        "punto de lectura no leidos":BTree(),
+                        "punto de lectura no leidos":bt,
                         "punto de lectura":BTree(),
                         "TS creacion":time.time(),
                         "TS ultima entrada":0,
@@ -125,7 +132,21 @@
 
   return usuarios["usuarios"].get(nick_normalizado,None)
 
-def mensaje_add(conn,texto,nick,hilo=None,titulo=None) :
+def metatag_add(conn,nombre) :
+  from durus.btree import BTree
+
+  root=conn.get_root()
+  metatags=root["metatags"]
+  num_mt=metatags["num_metatags"]
+  metatags["num_metatags"]+=1
+  metatags["metatags"][num_mt]=PersistentDict({"nombre":nombre,"num_hilos":0,"TS2hilo":BTree()})
+
+  for usuario in root["usuarios"]["usuarios"].itervalues() :
+    usuarios["punto de lectura no leidos"][num_mt]=BTree()
+
+  return num_mt
+  
+def mensaje_add(conn,texto,nick,hilo=None,titulo=None,metatag=None) :
   from durus.btree import BTree
   from durus.persistent_dict import PersistentDict
   import time
@@ -136,6 +157,7 @@
   hilos=root["hilos"]
   mensajes=root["mensajes"]
   seguimiento_no_leidos=root["seguimiento_no_leidos"]
+  metatags=root["metatags"]["metatags"]
 
   ts=time.time()
   mensaje=PersistentDict(
@@ -153,8 +175,11 @@
     hilo=hilos["hilos"][hilo]
     last=hilo["mensajes"].get_max_item()[0]
     del seguimiento_no_leidos["last_msg2hilo"][last]
-    del hilos["TS2hilo"][hilo["TS"]]
+    TS=hilo["TS"]
+    for metatag in hilo["metatags"] :
+      del metatags[metatag]["TS2hilo"][TS]
   else : # Empezamos un hilo nuevo
+    from durus.persistent_set import PersistentSet
     hilos["num_hilos"]+=1
     h=hilos["num_hilos"]
     root["punto_de_lectura_global"][h]=0
@@ -164,6 +189,7 @@
          {"creador":nick,
           "TS creacion":ts,
           "titulo":titulo,
+          "metatags":PersistentSet([metatag]),
           "num_mensajes":0,
           "mensajes":BTree(),
           "numeros":BTree()})
@@ -178,7 +204,8 @@
   hilo["mensajes"][num_msg]=(num_mensajes,mensaje)
   hilo["numeros"][num_mensajes]=num_msg
   hilo["TS"]=ts
-  hilos["TS2hilo"][ts]=(h,hilo)
+  for metatag in hilo["metatags"] :
+    metatags[metatag]["TS2hilo"][ts]=(h,hilo)
 
   usuario=root["usuarios"]["usuarios"][usuario]
   usuario["num mensajes"]+=1
@@ -189,7 +216,7 @@
   punto_de_lectura_global=root["punto_de_lectura_global"]
   usuario=root["usuarios"]["usuarios"][normaliza_nick(usuario)]
   l=usuario["ultimo mensaje conocido"]
-  posicion_hilos_no_leidos=usuario["punto de lectura no leidos"]
+  posicion_hilos_no_leidos=dict(usuario["punto de lectura no leidos"])
   posicion_hilos=usuario["punto de lectura"]
 
   last_msg2hilo=root["seguimiento_no_leidos"]["last_msg2hilo"]
@@ -201,19 +228,22 @@
     if not ultimo : ultimo=punto_de_lectura_global[hilo]
     if ultimo < last : # Este hilo tiene mensajes nuevos...
       # Lo marcamos como pendiente de leer y nos vamos al primero no leido
-      posicion_hilos_no_leidos[hilo]=hilos[hilo]["mensajes"].items_from(ultimo,closed=False).next()[0]
+      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
   usuario["ultimo mensaje conocido"]=root["mensajes"]["num_mensajes"]
 
-def listado_hilos_personal(conn,usuario,ts,ts2) :
+def listado_hilos_personal(conn,usuario,ts,ts2,metatag=0) :
   root=conn.get_root()
   hilos=root["hilos"]["hilos"]
   usuario=root["usuarios"]["usuarios"][normaliza_nick(usuario)]
 
-  no_leidos=usuario["punto de lectura no leidos"]
+  no_leidos=usuario["punto de lectura no leidos"][metatag]
 
   resultado=[]
 
-  for ts,hilo in root["hilos"]["TS2hilo"].items_range(ts,ts2) :
+  for ts,hilo in root["metatags"]["metatags"][metatag]["TS2hilo"].items_range(ts,ts2) :
     hilo_num,hilo=hilo
     if hilo_num in no_leidos :
       resultado.append((hilo_num,hilo["titulo"],True))
@@ -247,12 +277,19 @@
   pl=u["punto de lectura"].get(hilo_num,0)
   if not pl : # Nunca hemos visitado ese hilo, o hace mucho que no cambia
     pl=root["punto_de_lectura_global"][hilo_num]
+  metatags=hilo["metatags"]
   if pl<msg_num :
     u["punto de lectura"][hilo_num]=msg_num
-    nl=u["punto de lectura no leidos"].get(hilo_num)
-    if nl and (nl<=msg_num) :
-      if finished : del u["punto de lectura no leidos"][hilo_num]
-      else : u["punto de lectura no leidos"][hilo_num]=iterador_mensajes.next()[0] # El primer no leido
+    pnl=0
+    for metatag in metatags :
+      plnl=u["punto de lectura no leidos"][metatag]
+      nl=plnl.get(hilo_num)
+      if nl and (nl<=msg_num) :
+        if finished : del plnl[hilo_num]
+        else :
+          if not pnl :
+            pnl=iterador_mensajes.next()[0] # El primer no leido
+          plnl[hilo_num]=pnl
 
   return (meta,mensajes,finished)
 
@@ -260,9 +297,9 @@
 # viendo en pantalla. Si hay mensajes adicionales
 # que todavia no hemos visualizado en el indice,
 # los mantenemos como "no leidos".
-def marca_todo_leido(conn,usuario) :
+def marca_todo_leido(conn,usuario,metatag=0) :
   usuario=conn.get_root()["usuarios"]["usuarios"][normaliza_nick(usuario)]
-  posicion_hilos_no_leidos=usuario["punto de lectura no leidos"]
+  posicion_hilos_no_leidos=usuario["punto de lectura no leidos"][metatag]
   posicion_hilos=usuario["punto de lectura"]
  
   for hilo,last_msg in posicion_hilos_no_leidos.items() :

Modified: trunk/backend/upgrade.py
==============================================================================
--- trunk/backend/upgrade.py	(original)
+++ trunk/backend/upgrade.py	Tue Jun  5 18:04:45 2007
@@ -2,6 +2,8 @@
 
 def do(conn) :
   from durus.btree import BTree
+  from durus.persistent_dict import PersistentDict
+  from durus.persistent_set import PersistentSet
 
   root=conn.get_root()
 
@@ -16,4 +18,44 @@
         i["mensajes"][j]=(n,k)
         n+=1
     conn.commit()
+
+  if root["version del foro"]=="2007052401" :
+    print "Actualizando la base de datos: 2007052401 -> 2007060501"
+    root["version del foro"]="2007060501"
+    # Migracion interna...
+    conn.commit()
+
+  if root["version del foro"]=="2007060501" :
+    print "Actualizando la base de datos: 2007060501 -> 2007060502"
+    root["version del foro"]="2007060502"
+    metatags=PersistentDict()
+    bt=BTree()
+    bt[0]=PersistentDict({"nombre":"Varios","num_hilos":root["hilos"]["num_hilos"],"TS2hilo":root["hilos"]["TS2hilo"]})
+    del root["hilos"]["TS2hilo"]
+    metatags["metatags"]=bt
+    metatags["num_metatags"]=1
+    root["metatags"]=metatags
+    for usuario in root["usuarios"]["usuarios"].itervalues() :
+      bt=BTree()
+      bt[0]=usuario["punto de lectura no leidos"]
+      usuario["punto de lectura no leidos"]=bt
+    for hilo in root["hilos"]["hilos"].itervalues() :
+      hilo["metatags"]=PersistentSet([0])
+    conn.commit()
+
+  if root["version del foro"]=="2007060502" :
+    print "Actualizando la base de datos: 2007060502 -> 2007060503"
+    root["version del foro"]="2007060503"
+    # Migracion interna...
+    conn.commit()
+
+  if root["version del foro"]=="2007060503" :
+    print "Actualizando la base de datos: 2007060503 -> 2007060504"
+    root["version del foro"]="2007060504"
+    for usuario in root["usuarios"]["usuarios"].itervalues() :
+      for mt in usuario["punto de lectura no leidos"].itervalues() :
+        for i in mt.keys() : # Se cargan todas de un golpe, asi que podemos modificar el diccionario
+          if not isinstance(i,int) : del mt[i]
+    conn.commit()
+
 

Modified: trunk/frontend-web/init.py
==============================================================================
--- trunk/frontend-web/init.py	(original)
+++ trunk/frontend-web/init.py	Tue Jun  5 18:04:45 2007
@@ -59,6 +59,10 @@
       if not database.usuario_get(conn,i) :
         database.usuario_add(conn,i,None)
 
+    if not conn.get_root()["metatags"]["num_metatags"] :
+      v=database.metatag_add(conn,"Varios")
+      assert v==0
+
     num_hilos=conn.get_root()["hilos"]["num_hilos"]
     if not num_hilos :
       import time,random

Modified: trunk/frontend-web/url_.py
==============================================================================
--- trunk/frontend-web/url_.py	(original)
+++ trunk/frontend-web/url_.py	Tue Jun  5 18:04:45 2007
@@ -54,7 +54,8 @@
   database.actualiza_no_leidos(conn,usuario)
   texto=[]
   num_hilos=0
-  punto_no_leido=root["usuarios"]["usuarios"][database.normaliza_nick(usuario)]["punto de lectura no leidos"]
+  punto_no_leido=root["usuarios"]["usuarios"][database.normaliza_nick(usuario)]["punto de lectura no leidos"][0]
+  print punto_no_leido.items()
 
   while (num_hilos<50) and (fecha>=fecha_min) :
     ts2=timegm(fecha)
@@ -77,12 +78,13 @@
 
 @monitor
 def init(conn) :
-  import datetime
+  import datetime,sys,time
   global fecha_min
 
-  TS2hilo=conn.get_root()["hilos"]["TS2hilo"]
-  try :
-    fecha_min=datetime.date.fromtimestamp(TS2hilo.get_min_item()[0])
-  except :
-    fecha_min=datetime.date.today()
+  fecha_min=time.time()
+  root=conn.get_root()
+  for metatag in root["metatags"]["metatags"].itervalues() :
+    fecha_min=min(fecha_min,metatag["TS2hilo"].get_min_item()[0])
+
+  fecha_min=datetime.date.fromtimestamp(fecha_min)
 



More information about the cpif mailing list