diff options
author | flavio <fdanesse@gmail.com> | 2013-02-28 20:56:22 (GMT) |
---|---|---|
committer | flavio <fdanesse@gmail.com> | 2013-02-28 21:01:02 (GMT) |
commit | 018d49375f440bd9062578e296a1e040ae9b42a3 (patch) | |
tree | 33041f3a15b64a9c1485ed8b8449d6c89bdf9798 | |
parent | 024456abd4d72a947aa5216662c5c710eed89999 (diff) |
Polls Open in json format and shelve
-rw-r--r-- | CeibalEncuesta/CeibalEncuesta.py | 54 | ||||
-rw-r--r-- | CeibalEncuesta/Widgets.py | 196 |
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 |