COMO: Detectar el entorno de ejecucion (pesquisas para montar soft-links)
Crear un sistema de soft-link's
HolaEstos dias atras andaba yo buscando una forma de crear un mecanismo de soft links al mas puro estilo de los soft links de unix
Lo que pretendia es simple: crear un sistema de herencia distinto a la acquisition pero a la vez complementario
Despues de mucho deambular entre los entresijos de __bobo_traverse__ y de __of__ (gracias de nuevo y como siempre Santi Camps) me encontre con que la unica forma de ejecutar el sistema sugerido por Santi era detectando el contexto de ejecucion de __bobo_traverse__
Santi sugirio este codigo:
def __bobo_traverse__(self, Request, Name):
Maestro = getattr(self, 'Maestro', None)
if Maestro is not None:
obj = self.unrestrictedTraverse(Maestro.contenido)
Acquirido = obj.__of__(self)
return getattr(Acquirido, Name)
return getattr(self, Name)
Este codigo recogia un path indicado en contenido de una propiedad Maestro e intentaba acquirir (utilizo el termino original castellanizado, ya lo se ;) ) la propiedad pedida y si no la encontraba devolvia el valor local sobre esta propiedad
Este metodo erea suficiente pero no era recursivo como yo queria
Finalmente entre Santi y yo llegamos a crear una funcion como esta:
def Propiedad(self, Name):
"""Propiedad"""
Obj = self
Maestro = getattr(Obj, 'Maestro', None)
Paso = 1
while Maestro is not None:
Obj = self.restrictedTraverse(Maestro.contenido).__of__(self)
Maestro = getattr(Obj, 'Maestro', None)
Paso += 1
if Paso == 15: break
if hasattr(Obj, Name):
return getattr(Obj, Name)
return getattr(self, Name)
Esta funcion funciona (redundacia) perfectamente pero tenia un "efecto colateral" que consistia en falsear la informacion cuando se ejecutaba el ZMI. El efecto curiso consistia en que el objeto en vez de retornar su contenido original, retornaba el contenido real del objeto al que apuntaba el soft link. Eso si siempre que renombrase la funcion a __bobo_traverse__ (para los que anden perdidos: __bobo_traverse__ es la funcion que hay que sobrecargar para cambiar el mecanismo de acquisition de Zope)
De modo que me puse a mirar como saber cuando se esta ejecutando ZMI o cualquier otra cosa
Tres Seaver de la lista oficial de Zope me respondio a una consulta diciendo que esta funcion:
import sys
sys._getframe(1).f_code.co_name
devuelve una cadena indicando quien llama a la funcion donde se evalua el contenido de la sentencia
De modo que con la funcion Propiedad antes descrita y con este contenido de __bobo_traverse__:
def __bobo_traverse__(self, Request, Name):
import sys
if sys._getframe(1).f_code.co_name == "traverse":
return getattr(self, Name)
else:
return self.Propiedad(Name)
he podido resolver el problema
Fijaos que la sentencia sys._getframe(1).f_code.co_name devuelve "traverse" cuando se esta ejecutando el ZMI
Si probais la ejecucion de esta funcion en distintos entornos encontrareis los contextos de ejecucion de Zope
Jesus Cea Avion mando un mensaje a la lista diciendo que esta solucion es bastante poco robusta y muy acoplada con el sistema a lo que yo no tengo mas que estar totalmente deacuerdo. De todos modos pienso que, a falta de una solucion mas robusta, esta es suficiente para el problema que yo tenia
Finalmente el sistema de soft links esta montado en mi servidor y funcionando
Espero que esta receta os sirva!!!
Saludos