19 |
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 |
# |
# |
21 |
# |
# |
22 |
#Fichero: item.py |
#Fichero: item.py |
23 |
|
|
24 |
"""Clase Item.""" |
"""Clase Item.""" |
25 |
|
|
26 |
|
|
27 |
from xml.dom import minidom |
from xml.dom import minidom |
28 |
import random |
import random |
29 |
import sys |
import sys |
30 |
import string |
import string |
31 |
import os |
import os |
32 |
|
|
33 |
from utils import * |
from utils import * |
34 |
from bloquedialogo import * |
from bloquedialogo import * |
35 |
from fragmento import * |
from fragmento import * |
36 |
|
|
37 |
class Item(BloqueDialogo): |
class Item(BloqueDialogo): |
38 |
"""Secuencia de texto que se presenta al activar un tema de la conversación. |
"""Secuencia de texto que se presenta al activar un tema de la conversación. |
39 |
|
|
40 |
Contiene los siguientes atributos: |
Contiene los siguientes atributos: |
41 |
- _tema: tema en el que está contenido este item |
- _tema: tema en el que está contenido este item |
42 |
- _relacionados: diccionario con los contextos de los temas relacionados con este item, indexados por nombre del tema |
- _relacionados: diccionario con los contextos de los temas relacionados con este item, indexados por nombre del tema |
43 |
- _fragmentos: lista de bloques de texto. |
- _fragmentos: lista de bloques de texto. |
44 |
|
|
45 |
Invariantes: |
Invariantes: |
46 |
_tema != None |
_tema != None |
47 |
_relacionados != None |
_relacionados != None |
48 |
|
|
49 |
""" |
""" |
50 |
REPETICIONES_INFINITAS = -1 |
REPETICIONES_INFINITAS = -1 |
51 |
|
|
52 |
def __init__(self, item_xml, tema): |
def __init__(self, item_xml, tema): |
53 |
"""Crea un item nuevo a partir de un arbol XML de descripción de item. |
"""Crea un item nuevo a partir de un arbol XML de descripción de item. |
54 |
|
|
55 |
item_xml: corresponde con un nodo DOM de tema |
item_xml: corresponde con un nodo DOM de tema |
56 |
tema != None |
tema != None |
57 |
""" |
""" |
58 |
|
|
59 |
self._tema = tema |
self._tema = tema |
60 |
self._limpiar_comentarios(item_xml) |
self._limpiar_comentarios(item_xml) |
61 |
self._fragmentos = self._parsear_fragmentos(item_xml) |
self._fragmentos = self._parsear_fragmentos(item_xml) |
62 |
self._relacionados = self._parsear_temas_relacionados(item_xml) |
self._relacionados = self._parsear_temas_relacionados(item_xml) |
63 |
self._requisitos = self._parsear_requisitos(item_xml) |
self._requisitos = self._parsear_requisitos(item_xml) |
64 |
self._repeticiones = 0 |
self._repeticiones = 0 |
65 |
self._comando = "preguntar" |
self._comando = "preguntar" |
71 |
self._repeticiones = self.REPETICIONES_INFINITAS |
self._repeticiones = self.REPETICIONES_INFINITAS |
72 |
else: |
else: |
73 |
self._repeticiones = string.atoi(item_xml.getAttribute("repeticiones")) |
self._repeticiones = string.atoi(item_xml.getAttribute("repeticiones")) |
74 |
|
|
75 |
def tema(self): |
def tema(self): |
76 |
return self._tema |
return self._tema |
77 |
|
|
78 |
def relacionados(self): |
def relacionados(self): |
79 |
return self._relacionados |
return self._relacionados |
80 |
|
|
81 |
def relacionado(self, nombretema): |
def relacionado(self, nombretema): |
82 |
"""Devuelve el nombre del contexto que contiene el tema, si éste se encuentra relacionado con este item.""" |
"""Devuelve el nombre del contexto que contiene el tema, si éste se encuentra relacionado con este item.""" |
83 |
if self._relacionados.has_key(nombretema): |
if self._relacionados.has_key(nombretema): |
84 |
return self._relacionados[nombretema] |
return self._relacionados[nombretema] |
85 |
else: |
else: |
86 |
return "" |
return "" |
87 |
|
|
88 |
def satisfecho_en(self, visita): |
def satisfecho_en(self, visita): |
89 |
"""Determina si los requisitos de este item se cumplen en esa visita""" |
"""Determina si los requisitos de este item se cumplen en esa visita""" |
90 |
|
|
91 |
for requisito in self._requisitos: |
for requisito in self._requisitos: |
101 |
# Requisito con nodo de texto |
# Requisito con nodo de texto |
102 |
if not visita.hito(requisito) == self._requisitos[requisito].mensaje_formateado(visita): |
if not visita.hito(requisito) == self._requisitos[requisito].mensaje_formateado(visita): |
103 |
return 0 |
return 0 |
104 |
return 1 |
return 1 |
105 |
|
|
106 |
def repeticiones(self): |
def repeticiones(self): |
107 |
return self._repeticiones |
return self._repeticiones |
108 |
|
|
109 |
def __str__(self): |
def __str__(self): |
110 |
texto = "\t\t<Item -\n\t\t\tTexto:\n" |
texto = "\t\t<Item -\n\t\t\tTexto:\n" |
111 |
for fragmento in self._fragmentos: |
for fragmento in self._fragmentos: |
112 |
texto = texto + "\t\t\t" + str(fragmento) + "\n" |
texto = texto + "\t\t\t" + str(fragmento) + "\n" |
113 |
texto = texto + "\t\t\tRelacionados:\n" |
texto = texto + "\t\t\tRelacionados:\n" |
114 |
for tema in self._relacionados.keys(): |
for tema in self._relacionados.keys(): |
115 |
texto = texto + "\t\t\t" + self._relacionados[tema] + "." + tema + "\n" |
texto = texto + "\t\t\t" + self._relacionados[tema] + "." + tema + "\n" |
116 |
texto = texto + "\t\t/>\n" |
texto = texto + "\t\t/>\n" |
117 |
return texto |
return texto |
118 |
|
|
119 |
# Código para pruebas unitarias del módulo. |
# Código para pruebas unitarias del módulo. |
120 |
|
|
121 |
if (__name__ == '__main__'): |
if (__name__ == '__main__'): |
122 |
archivo = os.path.join(BloqueDialogo.DIR_DESC_DIALOGOS, "tutor", "tutor-cortesia" + BloqueDialogo.EXT_DESC_DIALOGOS) |
archivo = os.path.join(BloqueDialogo.DIR_DESC_DIALOGOS, "tutor", "tutor-cortesia" + BloqueDialogo.EXT_DESC_DIALOGOS) |
123 |
print archivo |
print archivo |
124 |
stream = open(archivo) |
stream = open(archivo) |
125 |
doc_xml = minidom.parse(stream).documentElement |
doc_xml = minidom.parse(stream).documentElement |
126 |
aux = doc_xml.getElementsByTagName("tema")[0].getElementsByTagName("item")[0] |
aux = doc_xml.getElementsByTagName("tema")[0].getElementsByTagName("item")[0] |
127 |
|
|
128 |
item = Item(aux, None) |
item = Item(aux, None) |
129 |
stream.close() |
stream.close() |
130 |
|
|
131 |
print "Item cargado correctamente.\n" + str(item) # + item._fragmentos[0].mensaje_formateado(None) |
print "Item cargado correctamente.\n" + str(item) # + item._fragmentos[0].mensaje_formateado(None) |