[Usuarios-plone] Ayuda con una interfaz

Carlos de la Guardia carlos.delaguardia at gmail.com
Mon Jan 26 04:01:48 UTC 2009


Hola,

tienes que usar adaptadores.

Vamos a suponer que tenemos un directorio de usuarios y queremos que
diferentes paquetes puedan proveer distintas fuentes de usuarios para un
directorio.

En ese caso, tienes una interfaz general que es para marcar directorios de
usuarios:

from zope.interface import Interface

class IUserDirectory(Interface):
    pass

Asímismo, hay una clase que la implementa:

from zope.interface import implements

class UserDirectory(object):
    implements(IUserDirectory)

Supongamos que tu interfaz es IListUsers y que la definiste más o menos así:

from zope.interface import Interface

class IListUsers(Interface):
    def getAllUsers():
        """regresa lista de usuarios"""

Luego, para crear un adaptador que pueda listar usuarios para un directorio,
otra clase en cualquier lugar puede hacer:

from zope.interface import implements
from zope.component import adapts
from tupaquete.interfaces import IListUsers,IUserDirectory

class ListUsers(object):
    implements(IListUsers)
    adapts(IUserDirectory)

    def __init__(self,context):
        self.context = context
    def getAllUsers(self):
        return 'all users'

Eso es todo lo que se necesita para definirla. Luego hay que configurarla
con ZCML, por ejemplo:

<adapter factory="nuevopaquete.ListUsers" />

Para probarlo en código sin usar ZCML puedes usar:

from zope.component import provideAdapter

provideAdapter(ListUsers)

Con este paso ya estás listo para utilizar el adaptador:

from tupaquete.intefaces import IListUsers

directory = UserDirectory()
user_lister = IListUsers(directory)
user_lister.getAllUsers()

La llamada a IListUsers() te devuelve la última función registrada, así que
una nueva implementación puede reemplazar a la original.

Espero esto sea de ayuda.

Carlos de la Guardia

2009/1/25 Iván Cervantes <lord.icervantes at gmail.com>

> Un saludo a todos,
>
> Les pido su ayuda técnica en lo siguiente: Tengo una interfaz con una
> función que se llama getAllUsers(). El contrato de interfaz dice que esta
> función debe regresar una lista de objetos de la clase Usuario. Bueno ya
> tengo la interfaz y la clase, y tengo otra clase UsaUsuario que manda a
> llamar a la función getAllUsers. Mi pregunta es como le hago para que mande
> a llamar a la implementación NO de una clase en especifico si no que
> dinamicamente mande a llamar a la implementación adecuada.
>
> Por ejemplo, si el que va a utilizar mi producto tiene la administración de
> usuarios mediante Remember, entonces el se encargara de implementar la
> interfaz que yo declaré haciendo uso de Remember y si alguien mas que quiere
> usar mi producto tiene FacultyStaff entonces el se encargara de implementar
> la interfaz sacando la información de facultyStaff.
>
> El objetivo es que no me importa que esten usando para administrar sus
> usuarios a mi lo que me interesa es que me regresen una lista de objetos de
> la clase Usuario, la cual tienen que llenar con la información de su
> respectivo facultyStaff, Remember o lo que sea.
>
> Gracias.
>
> Iván Cervantes
>
> --
> Those who find they're touched by madness, sit down next to me. -JAMES-
>
> _______________________________________________
> Usuarios-plone mailing list
> Usuarios-plone at lists.plone.org
> http://lists.plone.org/mailman/listinfo/usuarios-plone
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.plone.org/pipermail/plone-usuarios-plone/attachments/20090125/a885d69c/attachment.html>


More information about the Usuarios-Plone mailing list