wiki:Version2/Tutoriales/Consola_Web/Tutorial_5_Acciones_avanzadas_en_Panel_Contextual

Version 2 (modified by edulix, 9 years ago) (diff)

--

Introducción

Este es el segundo tutorial de la saga de tutoriales sobre Opengnsys 5 referentes a cómo implementar plugins para la Consola Web. Puedes acceder a la página que lista todos los tutoriales o al tutorial anterior: Tutorial 4: Envío de trabajos a los clientes.

Este quinto tutorial se basa en el Tutorial 2, por tanto es preciso haberlo comprendido para poder continuar. En ese tutorial conseguimos que una acción se mostrase en panel contextual del navegador de la consola cuando se muestra un ordenador o una unidad organizativa.

En este quinto tutorial modificaremos el código del tutorial 2 para que la lista de acciones del plugin para cada url se genere dinámicamente, mostrando sólo la acción cuando el ordenador esté encendido.

Devolviendo acciones

El código de nuestro plugin va a variar un poco. Primeramente, hemos eliminado la acción hello, y hemos cambiado la acción hello_entity por hello_computer. Además en vez de definir self.actions_for_urls, vamos a definir una función llamada get_action_instances_for_url. Esa función recibe la url que se está visitando actualmente, y en función de lo que queramos que haga el plugin, devolverá una lista de acciones para esa url (que puede estar vacía).

'''
Hello World! plugin example
'''

from ..pluginbase import PluginBase
from main.model import Computer
from ..action import ActionInstance
import views
import web

class ComputerNotFoundError(Exception):
    pass

class Plugin(PluginBase):
    '''
    '''
    def enable(self):
        self.urls = ('hello_computer/(.*)', views.HelloComputerView)

    def get_action_instances_for_url(self, url):
        if url.startswith("/navigator/computer"):
            # Getting the computer
            name = url.split('/').pop()
            orm = web.ctx.orm
            computer = orm.query(Computer).filter(Computer.name == name).first()

            if not computer:
                raise ComputerNotFoundError()

            # Show the action only if computer is online
            if not computer.online:
                return []
            else:
                return [ActionInstance(self.actions['hello_computer'],
                    self.fill_url(views.HelloComputerView, name))]
        else:
            return []

Las acciones de dicha lista como podemos ver en el código de arriba son instancias de la clase ActionInstance, que define todo lo que necesita Opengnsys para mostrar la el text, el icono y la url del enlace. Para generar la url hemos usado la función fill_url que genera una url a partir de self.urls, la vista asociada a dicha url y los parámetros que queremos que reciba.

El código de la vista (view.py) es muy similar a la del tutorial 2, pues sólo se ha eliminado la vista HelloView que se introdujo en el segundo tutorial y se ha modificado la vista HelloEntityView para se llame HelloComputerView y poco más:

'''
Hello views
'''
from __future__ import unicode_literals
from decorators import pi18n
import web

class HelloComputerView:
    @pi18n
    def GET(self, name):
        message = _("Hello Online Computer %s!") % name
        return web.ctx.render.plugins.hello.hello(message)

También se ha actualizado el plugin.conf:

[plugin]
human_name = Hello World! Tutorial 5
version = 1.0.0

[action/hello_computer]
description = Displays the text Hello online computer!
human_name = Say hello to this
appear_in_main_panel = No

Usando el plugin

Para usar el plugin, tenemos que arrancar el servidor de opengnsys si no lo tenías ya arrancado, y activarlo pinchando en "Enable" al lado del plugin, en la pestaña "Plugins" con un usuario que tenga permisos de administración. Luego, al mostrar en el navegador un ordenador que esté online verás que aparece nuestra acción, "Hello", y al hacer clic te aparecerá una página con el mismo look que el resto de la página donde aparece el mensaje "Hello Online Computer!".

Puedes descargar el código de este quinto tutorial aquí.

Attachments (1)

Download all attachments as: .zip