Welcome | Members | News | Search | Documentacion | Foros |
You are here: Home » Miembros » Garito's Home » COMO: Detectar el entorno de ejecucion (pesquisas para montar soft-links)
 
You are not logged in
Link icon Log in Link icon Join
Log in
Name
Password

COMO: Detectar el entorno de ejecucion (pesquisas para montar soft-links)

Crear un sistema de soft-link's
Hola

Estos 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