Changes between Version 5 and Version 6 of Version2/Tutoriales/Consola_Web/Tutorial_2_Acciones_en_Panel_Contextual


Ignore:
Timestamp:
Mar 29, 2011, 12:07:49 PM (9 years ago)
Author:
edulix
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Version2/Tutoriales/Consola_Web/Tutorial_2_Acciones_en_Panel_Contextual

    v5 v6  
    4040        self.actions_for_url = ('navigator/(computer|ou)/(.*)', 'hello_entity')
    4141        self.urls = ('action/hello', hello.HelloView,
    42             'action/hello_entity/(computer|ou)/(.*)', hello.HelloEntityView)
     42            self.get_action_url('hello_entity'), hello.HelloEntityView)
    4343}}}
    4444
    45 De acuerdo, he de reconocer que no es totalmente intuitivo lo que está ocurriendo ahora: voy a intentar explicarlo. Hemos redefinido (por defecto en !PluginBase está definida como un array vacío) la variable self.actions_for_url. Es una lista de pares, parecida a self.urls. En esta lista definimos en qué urls vamos a insertar qué acción. Sólo definimos un par, que dice que en las urls que comiencen con 'navigator/computer/' o 'navigator/ou/' vamos a meter la acción 'hello_entity', mediante expresiones regulares.
     45Hemos redefinido (por defecto en !PluginBase está definida como un array vacío) la variable self.actions_for_url. Es una lista de pares, parecida a self.urls. En esta lista definimos en qué urls vamos a insertar qué acción. Sólo definimos un par, que dice que en las urls que comiencen con 'navigator/computer/' o 'navigator/ou/' vamos a meter la acción 'hello_entity', mediante expresiones regulares.
    4646
    47 Cuando aparece una acción en el panel contextual, necesitamos que aparezca con cierta información. Por ejemplo, tendrá un título, que será el human_name definido para esa acción en plugin.conf anteriormente. También necesita una url, que es la url que llevará acabo dicha acción. Y ¿donde definimos las urls de nuestro plugin? en self.urls. Precisamente eso es lo que hemos hecho. Hemos dicho que cuando se acceda dentro de nuestro plugin (es decir con el prefijo 'plugin/hello_world/') a la url 'action/hello_entity/ou/.*' o 'action/hello_entity/computer/.*', se maneje dicha url por la vista !HelloEntityView que está en el fichero hello.py (hello.!HelloEntityView).
     47Cuando aparece una acción en el panel contextual, necesitamos que aparezca con cierta información. Por ejemplo, tendrá un título, que será el human_name definido para esa acción en plugin.conf anteriormente. También necesita una url, que es la url que llevará acabo dicha acción. Y ¿donde definimos las urls de nuestro plugin? en self.urls. Precisamente eso es lo que hemos hecho. Hemos dicho que cuando se acceda dentro de nuestro plugin (es decir con el prefijo 'plugin/hello_world/') a la url de nuestra acción (self.get_action_url('hello_entity')) se maneje dicha url por la vista !HelloEntityView que está en el fichero hello.py (hello.!HelloEntityView).
    4848
    49 Ahora parémonos un momento más. Cuando se ejecuta una acción del Panel Contextual, queremos que dicha acción se ejecute sobre los elementos mostrados en esa página en la que estamos mostrando el panel. Queremos que la acción sea contextual. En el caso de nuestro tutorial, queremos que la vista !HelloEntityView muestre un mensaje personalizado: si la acción se muestra para el ordenador fresa, el mensaje será "Hello Computer fresa!". En el sistema de plugins de opengnsys hemos resuelto cómo pasar esa información a la vista asociada a una acción mediante un "trasvase" de información de una url a otra: de la url donde se muestra la acción a la url de la acción en sí. Y además de forma flexible: el desarrollador del plugin sigue siendo quien define la url de la acción, siempre que comience con 'action/<nombre de la acción>'.
     49Ahora parémonos un momento más. Cuando se ejecuta una acción del Panel Contextual, queremos que dicha acción se ejecute sobre los elementos mostrados en esa página en la que estamos mostrando el panel. Queremos que la acción sea contextual. En el caso de nuestro tutorial, queremos que la vista !HelloEntityView muestre un mensaje personalizado: si la acción se muestra para el ordenador fresa, el mensaje será "Hello Computer fresa!". En el sistema de plugins de opengnsys hemos resuelto cómo pasar esa información a la vista asociada a una acción mediante un "trasvase" de información de la url donde se muestra la acción a la vista que maneja la acción.
    5050
    51 ¿Cómo conseguimos esto? Fácil: cada elemento entre paréntesis en la url definida para una acción en self.actions_for_url rellena los paréntesis de la url de la acción. Suena a jeroglífico, pero en realidad es muy fácil:
     51¿Cómo conseguimos esto? Fácil: cada elemento entre paréntesis en la url definida para una acción en self.actions_for_url se le pasará como argumento a la vista asociada a dicha acción en self.urls. Los pasos claves son los siguientes:
    5252
    5353 1. La url en la que se muestra una acción por ejemplo es 'navigator/computer/fresa'.
    5454 1. La expresión regular que hemos puesto en self.actions_for_url que coincide con esa url es 'navigator/(computer|ou)/(.*)'.
    5555 1. Por tanto la lista de elementos de los paréntesis de la expresión regular es ['computer', 'fresa']
    56  1. La expresión regular que define la vista asociada a la url de la acción en self.urls es 'action/hello_entity/(computer|ou)/(.*)'
    57  1. Rellenamos los paréntesis en esa expresión regular con ['computer', 'fresa'], y obtenemos que la url de la acción es 'action/hello_entity/computer/fresa'.
     56 1. En self.urls hemos definido que la vista asociada a la acción 'hello_view' es hello.HelloEntityView.
     57 1. En hello.HelloEntityView.GET recibiremos los argumentos 'computer' y 'fresa' del paso 3.
    5858
    59 Recalcar que '''para que esto funcione es imprescindible utilizar una url en self.urls para la acción que sea del tipo 'action/<nombre de la acción>''''.
    60 
    61 Además los paréntesis en las expresiones regulares de las urls de self.urls indican los argumentos que recibirá la vista asociada, en este caso hello.!HelloEntityView. Esto es así porque es la manera en que funciona web.py. Ahora añadiremos la clase !HelloEntityView al fichero hello.py, resultando en:
     59Ahora añadiremos la clase !HelloEntityView al fichero hello.py, resultando en:
    6260
    6361{{{
     
    8785Como véis hemos hecho unos pequeños cambios. Primero, hemos importado unicode_literals del "futuro" (Python 3). Esto nos garantiza que no tendremos problemas con la codificación de las cadenas, haciendo que por defecto todas sean en UTF. También hemos modificado cómo llamamos el template: en vez de crear uno nuevo para nuestra vista, le pasamos al template la cadena que queremos mostrar y así podemos reutilizarlo. También, debido a que el plugin está internacionalizado, usamos el decorador '''pi18n''' que nos añade automáticamente la función '''_''' dentro de la función decorada (para saber más sobre la internacionalización de los plugins lee el [wiki:Version2/Tutoriales/Consola_Web/Tutorial_3_Internacionalizacion Tutorial 3: Internacionalización de plugins]).
    8886
    89 Por último, como dijimos antes, la función GET de nuestra vista ahora toma como parámetros aquellos elementos entre paréntesis en la url que apunta a nuestra vista en la variable self.urls de nuestro Plugin. Es decir, como la url que apunta a nuestra vista es 'navigator/(computer|ou)/(.*)', pues recibiremos por GET como primer argumento bien "computer" o "ou" ('(computer|ou)'), y como segundo argumento cualquier cosa ('(.*)'), que sabemos que será en nuestro caso el nombre del ordenador o unidad organizativa.
     87Por último, como dijimos antes, la función GET de nuestra vista ahora toma como parámetros aquellos elementos entre paréntesis de la url de self.actions_for_url como hemos visto antes.
    9088
    9189El template de templates/helloview.html ha sido debidamente modificado, quedando así: