Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorflavio <fdanesse@gmail.com>2013-02-28 20:56:22 (GMT)
committer flavio <fdanesse@gmail.com>2013-02-28 21:01:02 (GMT)
commit018d49375f440bd9062578e296a1e040ae9b42a3 (patch)
tree33041f3a15b64a9c1485ed8b8449d6c89bdf9798
parent024456abd4d72a947aa5216662c5c710eed89999 (diff)
Polls Open in json format and shelve
-rw-r--r--CeibalEncuesta/CeibalEncuesta.py54
-rw-r--r--CeibalEncuesta/Widgets.py196
2 files changed, 202 insertions, 48 deletions
diff --git a/CeibalEncuesta/CeibalEncuesta.py b/CeibalEncuesta/CeibalEncuesta.py
index dd2cbb0..1e637a4 100644
--- a/CeibalEncuesta/CeibalEncuesta.py
+++ b/CeibalEncuesta/CeibalEncuesta.py
@@ -66,11 +66,6 @@ class CeibalEncuesta(Gtk.Window):
self.out_dict = None
- # Carga Automática solo para probar
- #self.__load_alumnos(None,
- # os.path.join(PATH,
- # 'Archivo de entrada_1903.csv'))
-
def __change(self, widget, new_dict):
"""Recibe los cambios en la encuesta."""
@@ -84,18 +79,9 @@ class CeibalEncuesta(Gtk.Window):
def __new_selection(self, widget, data):
"""Cuando el usuario cambia de Encuestado."""
- # leer out_dict
- # actualizar interfaz
-
if self.out_dict != None:
if data in self.out_dict.keys():
- print data
- print self.out_dict[data]
-
- else:
- # No ha llenado nada en la encuesta.
- #self.panel.reset()
- pass
+ self.panel.update(self.out_dict[data])
def get_menu(self):
"""Crea y devuelve el menú de la aplicación."""
@@ -116,7 +102,7 @@ class CeibalEncuesta(Gtk.Window):
file_menu.append(salir)
alumnos.connect_object ("activate", self.__cargar_alumnos, '')
- #encuesta.connect_object ("activate", self.__cargar_encuesta, '')
+ encuesta.connect_object ("activate", self.__cargar_encuesta, '')
#guardar.connect_object ("activate", self.__guardar, '')
salir.connect_object ("activate", self.__salir, '')
@@ -150,7 +136,7 @@ class CeibalEncuesta(Gtk.Window):
self.out_dict = None
alumnos = G.cargar_alumnos(os.path.join(archivo))
- self.panel._load_alumnos(alumnos)
+ self.panel.load_alumnos(alumnos)
def __cargar_encuesta(self, widget = None, senial = None):
"""Abre Filechooser para cargar el
@@ -159,13 +145,37 @@ class CeibalEncuesta(Gtk.Window):
filechooser = My_FileChooser(
parent_window = self,
action_type = Gtk.FileChooserAction.OPEN,
- filter_type = 'text/csv')
+ filter_type = None)
- #filechooser.connect('load', self.__load_encuesta)
+ filechooser.connect('load', self.__load_encuesta)
- def load_encuesta(self, encuesta):
+ def __load_encuesta(self, widget, archivo):
+ """Carga una encuesta almacenada en
+ un archivo json o en un archivo shelve."""
self.out_dict = None
+ encuesta = {}
+
+ extension = os.path.splitext(os.path.split(archivo)[1])[1]
+
+ if 'json' in extension:
+ import json
+ import codecs
+
+ archivo = codecs.open(archivo, "r", "utf-8")
+ encuesta = json.JSONDecoder("utf-8").decode(archivo.read())
+
+ elif 'slv' in extension:
+
+ import shelve
+
+ archivo = shelve.open(archivo)
+
+ for key in archivo.keys():
+ encuesta[key] = archivo[key]
+
+ archivo.close()
+
self.panel.load_encuesta(encuesta)
def __guardar(self, widget = None, senial = None):
@@ -185,10 +195,6 @@ class CeibalEncuesta(Gtk.Window):
if __name__ == "__main__":
- encuesta = G.Encuesta
-
ceibalencuesta = CeibalEncuesta()
- ceibalencuesta.load_encuesta( encuesta )
-
Gtk.main()
\ No newline at end of file
diff --git a/CeibalEncuesta/Widgets.py b/CeibalEncuesta/Widgets.py
index 8026a12..43741a3 100644
--- a/CeibalEncuesta/Widgets.py
+++ b/CeibalEncuesta/Widgets.py
@@ -22,7 +22,9 @@ import os
import gi
from gi.repository import Gtk
+from gi.repository import Gdk
from gi.repository import GObject
+from gi.repository import Pango
class Panel(Gtk.Paned):
@@ -62,11 +64,11 @@ class Panel(Gtk.Paned):
self.show_all()
- def _load_alumnos(self, alumnos):
+ def load_alumnos(self, alumnos):
"""Carga una lista de alumnos."""
if not alumnos: return
-
+
self.out_dict = None
if self.lista: self.lista.destroy()
@@ -83,7 +85,8 @@ class Panel(Gtk.Paned):
self.set_sensitive(True)
def load_encuesta(self, encuesta):
- """Carga una nueva Encuesta eliminando la anterior."""
+ """Carga una nueva Encuesta eliminando la anterior.
+ Encuesta es un diccionario."""
if not encuesta: return
@@ -180,6 +183,21 @@ class Panel(Gtk.Paned):
pregunta.set_sensitive(False)
+ def update(self, dict):
+ """Cuando se selecciona un usuario que ha
+ contestado al menos parte de la encuesta, se
+ actualiza la interfaz gráfica de la misma con
+ esos valores."""
+
+ keys = dict.keys()
+ keys.sort()
+
+ grupos = self.box_encuesta.get_children()
+
+ for key in keys:
+
+ grupos[int(keys.index(key))].update(dict[key])
+
class My_FileChooser(Gtk.FileChooserDialog):
"""
Selector de Archivos para poder cargar archivos
@@ -203,10 +221,11 @@ class My_FileChooser(Gtk.FileChooserDialog):
self.set_select_multiple(False)
self.set_current_folder_uri("file:///%s" % os.path.dirname(__file__))
- filter = Gtk.FileFilter()
- filter.set_name(filter_type)
- filter.add_mime_type(filter_type)
- self.add_filter(filter)
+ if filter_type != None:
+ filter = Gtk.FileFilter()
+ filter.set_name(filter_type)
+ filter.add_mime_type(filter_type)
+ self.add_filter(filter)
hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)
@@ -369,8 +388,8 @@ class Grupo(Gtk.Frame):
self.set_label(self.grupo['name'])
- box = Gtk.VBox()
- self.add(box)
+ self.box_preguntas = Gtk.VBox()
+ self.add(self.box_preguntas)
preguntas = self.grupo['fields']
dependencies = []
@@ -379,11 +398,12 @@ class Grupo(Gtk.Frame):
for indice in keys:
pregunta = Pregunta(indice, preguntas[indice])
- box.pack_start(pregunta, False, True, 3)
+ self.box_preguntas.pack_start(pregunta, False, True, 3)
pregunta.connect('new', self.change)
pregunta.connect('check_dependence', self.emit_check_dependence)
- if pregunta.pregunta['dependence']:
+ if pregunta.pregunta.get('dependence', ''):
+ #if pregunta.pregunta['dependence']:
dependencies.append(pregunta)
self.show_all()
@@ -423,6 +443,21 @@ class Grupo(Gtk.Frame):
self.emit('check_dependence', dict)
+ def update(self, dict):
+ """Cuando se selecciona un usuario que ha
+ contestado al menos parte de la encuesta, se
+ actualiza la interfaz gráfica de la misma con
+ esos valores."""
+
+ keys = dict['fields'].keys()
+ keys.sort()
+
+ preguntas = self.box_preguntas.get_children()
+
+ for key in keys:
+
+ preguntas[int(keys.index(key))].update(dict['fields'][key])
+
class Pregunta(Gtk.HBox):
"""
Box con Pregunta.
@@ -467,9 +502,14 @@ class Pregunta(Gtk.HBox):
self.widget_obtions = Widget_RadioButon(self.pregunta['options'])
else:
- print "Widget no Considerado"
+ print "Widget no Considerado", widget
+
+ label = Gtk.Label(self.pregunta['name'])
+ pangoFont = Pango.FontDescription("10")
+ label.modify_font(pangoFont)
+ label.modify_fg(0, Gdk.Color(0, 0, 65000))
- self.pack_start(Gtk.Label(self.pregunta['name']), False, True, 5)
+ self.pack_start(label, False, True, 5)
self.pack_start(self.widget_obtions, False, True, 0)
self.show_all()
@@ -483,7 +523,7 @@ class Pregunta(Gtk.HBox):
Emite 'check_dependence' con {opcion: valor, opcion:valor, . . .}
para activar o desactivar otras preguntas.
"""
-
+
new_dict = {
'name': self.pregunta['name'],
'options': new_dict}
@@ -491,12 +531,21 @@ class Pregunta(Gtk.HBox):
self.emit('new', new_dict)
check_dependence = {}
+
for key in new_dict['options'].keys():
for k in new_dict['options'][key].keys():
check_dependence[key] = new_dict['options'][key][k]
self.emit('check_dependence', check_dependence)
+ def update(self, dict):
+ """Cuando se selecciona un usuario que ha
+ contestado al menos parte de la encuesta, se
+ actualiza la interfaz gráfica de la misma con
+ esos valores."""
+
+ self.widget_obtions.update(dict)
+
class Widget_DropDownList(Gtk.ComboBoxText):
"""
Contenedor de opciones para respuestas posibles en una pregunta.
@@ -523,6 +572,69 @@ class Widget_DropDownList(Gtk.ComboBoxText):
self.append_text(self.options[key]['text'])
self.show_all()
+
+ def do_changed(self):
+ """
+ Cuando el usuario hace click sobre una opción,
+ se emite la señal new con los datos para todas las opciones.
+
+ Traduce opciones de:
+
+ 'options': {
+ '00001': {'text': 'opcion 1'},
+ '00002': {'text': 'opcion 2'}
+ }
+
+ a:
+
+ 'options': {
+ '00001': {Opcion: valor},
+ '00002': {Opcion: valor}
+ }
+ """
+
+ new_dict = {}
+
+ for key in self.options.keys():
+
+ if self.options[key]['text'] == self.get_active_text():
+ new_dict[key] = {self.get_active_text(): True}
+
+ else:
+ new_dict[key] = {self.options[key]['text']: False}
+
+ self.emit('new', new_dict)
+
+ def update(self, dict):
+ """Cuando se selecciona un usuario que ha
+ contestado al menos parte de la encuesta, se
+ actualiza la interfaz gráfica de la misma con
+ esos valores."""
+
+ pass
+ #print "Widget_DropDownList", dict
+ '''
+ keys = dict['options'].keys()
+ keys.sort()
+
+ for key in keys:
+ if dict['options'][key][dict['options'][key].keys()[0]]:
+
+ model = self.get_model()
+ item = model.get_iter_first()
+ count = 0
+
+ while item:
+
+ if model.get_value(item, 0) == dict['options'][key].keys()[0]:
+ self.set_active(count)
+ item = None
+
+ else:
+ item = model.iter_next(item)
+ count += 1
+
+ print "Widget_DropDownList", key'''
class Widget_TextInput(Gtk.Entry):
"""
@@ -537,7 +649,7 @@ class Widget_TextInput(Gtk.Entry):
__gsignals__ = {
"new":(GObject.SIGNAL_RUN_FIRST,
- GObject.TYPE_NONE, (GObject.TYPE_STRING, ))}
+ GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT, ))}
def __init__(self, options):
@@ -565,7 +677,19 @@ class Widget_TextInput(Gtk.Entry):
'00001':{Pregunta: Respuesta}
}
"""
+
+ new_dict = {}
+
+ for key in self.options.keys():
+ new_dict[key] = {
+ self.get_parent().pregunta['name']: self.get_text()}
+
+ self.emit('new', new_dict)
+
+ def update(self, dict):
+
pass
+ #print "Widget_TextInput", dict
class Widget_RadioButon(Gtk.ButtonBox):
"""
@@ -590,17 +714,22 @@ class Widget_RadioButon(Gtk.ButtonBox):
self.options = options
grupo = None
- for key in self.options.keys():
+
+ keys = self.options.keys()
+ keys.sort()
+
+ for key in keys:
radio = Gtk.RadioButton.new_with_label(
None, self.options[key]['text'])
if grupo == None: grupo = radio
- radio.join_group(grupo)
+ if keys.index(key) != 0:
+ radio.join_group(grupo)
- radio.connect('toggled', self.change)
+ self.pack_start(radio, False, False, 3)
- self.pack_start(radio, False, True, 3)
+ radio.connect('toggled', self.change)
self.show_all()
@@ -630,12 +759,20 @@ class Widget_RadioButon(Gtk.ButtonBox):
new_dict = {}
options = self.get_children()
+
for child in options:
indice = options.index(child)
- new_dict[keys[indice]] = {child.get_label(): child.get_active()}
+
+ new_dict[keys[indice]] = {
+ child.get_label(): child.get_active()}
self.emit('new', new_dict)
+ def update(self, dict):
+
+ pass
+ # print "Widget_RadioButon", dict
+
class Widget_MultipleCheckBox(Gtk.ButtonBox):
"""
Contenedor de opciones para respuestas posibles en una pregunta.
@@ -660,10 +797,14 @@ class Widget_MultipleCheckBox(Gtk.ButtonBox):
keys = self.options.keys()
keys.sort()
+
for key in keys:
- check = Gtk.CheckButton.new_with_label(self.options[key]['text'])
+ check = Gtk.CheckButton.new_with_label(
+ self.options[key]['text'])
+
+ self.pack_start(check, False, False, 3)
+
check.connect('toggled', self.change)
- self.pack_start(check, False, True, 3)
self.show_all()
@@ -693,9 +834,16 @@ class Widget_MultipleCheckBox(Gtk.ButtonBox):
new_dict = {}
options = self.get_children()
+
for child in options:
indice = options.index(child)
- new_dict[keys[indice]] = {child.get_label(): child.get_active()}
+
+ new_dict[keys[indice]] = {
+ child.get_label(): child.get_active()}
self.emit('new', new_dict)
- \ No newline at end of file
+
+ def update(self, dict):
+
+ pass
+ # print "Widget_MultipleCheckBox", dict \ No newline at end of file