Post on 18-Dec-2014
description
Desarrollar un módulo para Visuse
José Luis López Pino
http://visuse.wordpress.com
¿Qué necesitamos para trabajar?
Un editor para Python. Por ejemplo, Geany. Subversion: sistema de control de versiones. Python ~2.6.2. Elegir un buscador.
Empezamos
Instalamos Python Ubuntu: sudo apt-get install python2.6 Windows: descargar de python.org la 2.6.4.
Alta en la forja de rediris. Descargamos el proyecto:
svn checkout https://forja.rediris.es/svn/cusl4-visuse
Los módulos los tenemos en trunk/visuse/modulos Añadimos la clase a classes.py Escribimos el módulo en Modulo_Nombre.py
Lo que hace un módulo:
Obtenemos los datos del buscador (usando XML, JSON o lo que corresponda).
Creamos una instancia de la clase por cada resultado.
Creamos una lista de resultados. Mostramos la lista en pantalla para comprobar
que no hay problemas.
Creando el módulo
Creamos Modulo_NombreBuscador.py Contendrá la definición de dos clases:
Clase NombreBuscador Heredará de Result y posiblemente de otro tipo
(como ImageResult) Habrá una instancia por cada resultado. Almacena los atributos relevantes del resultado.
SearchNombreBuscador Heredará de SearchModule. Realiza todo el proceso de búsqueda.
La configuración se mantiene en config.py
Clase NombreBuscador (I)
Hereda de Result y posiblemente también de ImageResult:
class Result():def __init__(self, name, url):
self.name = nameself.url = url
def __str__(self):return self.name + "\n" + self.url + "\n"
class ImageResult():def __init__(self, name, url, thumbnail):
Result.__init__(self, name, url)self.thumbnail = thumbnail
def __str__(self):return "%s\n%s\n%s\n" % (self.name, self.url, self.thumbnail)
Clase NombreBuscador (II)
Únicamente tiene un ”constructor”, que inicializa los parámetros necesarios:
class Wikicommons(Result, ImageResult):def __init__(self, name, url, thumbnail):
ImageResult.__init__(self, name, url, thumbnail)
Clase SearchNombreBuscador (I)
Hereda de SearchModule:class SearchModule():
def __init__(self):self.resultList = []
def __str__(self):str = ""for n in range(0, len(self.resultList)):
str += "===== %d =====\n" % nstr += "%s" % self.resultList[n]
return str
def search(self, search_terms):return self.resultList
def add(self, entry):pass
Clase SearchNombreBuscador (II)
Obligatoriamente debe incluir un ”constructor”. En un principio basta con que éste llame al
”constructor” de la clase de la que hereda (ModuleSearch):
def __init__(self):SearchModule.__init__(self)
SearchNombreBuscador (III)
El método search se comunica con el buscador en el protocolo que corresponda (Json, XML, etc.) y obtiene el listado de resultados.
def search(self, search_terms):gd_client = gdata.photos.service.PhotosService()
photos = gd_client.SearchCommunityPhotos(search_terms, limit=config.picasa_limit)
for iterador in photos.entry:print "kkk"self.add(iterador)
return self.resultList
SearchNombreBuscador (IV)
El método add trata cada uno de los resultados llamando al constructor de la clase que creamos anteriormente:
def add(self, entry):
self.resultList.append(Picasa( \ entry.title.text, \
entry.content.src, \entry.media.thumbnail[-1].url \
))
Probando el módulo
En el diccionario modules_dictionary del fichero config.py debemos añadir un nuevo elemento para nuestro módulo.
Se puede ejecutar un simple test mediante: python manage.py test
Para probarlo visualmente, en el template inicial2.html añadimos la key del diccionario anterior al vector searchEngineList Acceder a http://127.0.0.1:8000/prueba/rock