diff options
author | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-07-18 20:27:03 (GMT) |
---|---|---|
committer | Rogelio Mita <rogeliomita@activitycentral.com> | 2013-07-18 20:27:03 (GMT) |
commit | fa418b0a4c86ad5a6b1b98eeb70ac07a80c10fe9 (patch) | |
tree | 09a60ce0656592996e2dece4f7892536dbae1597 | |
parent | 51856b0549f287862ba5c77e07a82bc3ad382b57 (diff) |
issue 4098: Wizard validation
-rw-r--r-- | CeibalEncuesta/gtk2/CeibalEncuesta/Globales.py | 21 | ||||
-rw-r--r-- | CeibalEncuesta/gtk2/CeibalEncuesta/Widgets.py | 146 |
2 files changed, 149 insertions, 18 deletions
diff --git a/CeibalEncuesta/gtk2/CeibalEncuesta/Globales.py b/CeibalEncuesta/gtk2/CeibalEncuesta/Globales.py index 1bf8def..4e3a259 100644 --- a/CeibalEncuesta/gtk2/CeibalEncuesta/Globales.py +++ b/CeibalEncuesta/gtk2/CeibalEncuesta/Globales.py @@ -19,9 +19,30 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import csv +import os import chardet +def csv_validate(archivo): + + valido = False + + extension = os.path.splitext(os.path.split(archivo)[1])[1] + if "csv" in extension: + valido = True + + with open(archivo, 'rb') as csvfile: + encoding = chardet.detect(csvfile.read())['encoding'] + csvfile.seek(0) + reader = csv.reader(csvfile, dialect='excel', delimiter=';') + header = reader.next() + header = ";".join(header).decode(encoding) + expected_header = "RUEE;DEPARTAMENTO;NUM_ESC;GRADO;GRUPO;TIPO_GRUPO" + valido = valido and (expected_header in header) + + return valido + + def cargar_encuestados(csvfile): """ Carga y devuelve una lista a encuestar diff --git a/CeibalEncuesta/gtk2/CeibalEncuesta/Widgets.py b/CeibalEncuesta/gtk2/CeibalEncuesta/Widgets.py index 0e7ecea..0815a85 100644 --- a/CeibalEncuesta/gtk2/CeibalEncuesta/Widgets.py +++ b/CeibalEncuesta/gtk2/CeibalEncuesta/Widgets.py @@ -2182,8 +2182,21 @@ class ComboGrupos(gtk.ComboBox): class Wizard(gtk.Dialog): + __gsignals__ = { + "validate":(gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ()), + "enable_proceed":(gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ()), + "disable_proceed":(gobject.SIGNAL_RUN_FIRST, + gobject.TYPE_NONE, ()) + } + def __init__(self, parent_window = None): + self.json_file = None + self.csv_file = None + self.temp_file = None + gtk.Dialog.__init__( self, title = "Asistente", parent = parent_window, @@ -2198,13 +2211,13 @@ class Wizard(gtk.Dialog): self.set_border_width(5) - abrirencuesta = gtk.Button("Buscar . . .") - abrirlista = gtk.Button("Buscar . . .") - cargarencuesta = gtk.Button("Buscar . . .") + self.abrirencuesta = gtk.Button("Buscar . . .") + self.abrirlista = gtk.Button("Buscar . . .") + self.cargarencuesta = gtk.Button("Buscar . . .") - abrirencuesta.connect("clicked", self.__abrir_encuesta) - abrirlista.connect("clicked", self.__abrir_lista) - cargarencuesta.connect("clicked", self.__cargar_encuesta) + self.abrirencuesta.connect("clicked", self.__abrir_encuesta) + self.abrirlista.connect("clicked", self.__abrir_lista) + self.cargarencuesta.connect("clicked", self.__cargar_encuesta) self.label_1 = gtk.Label("") self.label_2 = gtk.Label("") @@ -2217,7 +2230,7 @@ class Wizard(gtk.Dialog): frame = gtk.Frame() frame.set_label("Seleccionar modelo de encuesta. (archivo *.json)") box = gtk.HBox() - box.pack_start(abrirencuesta, False, False, 10) + box.pack_start(self.abrirencuesta, False, False, 10) box.pack_start(self.label_1, False, False, 0) frame.add(box) frame.show_all() @@ -2227,7 +2240,7 @@ class Wizard(gtk.Dialog): frame = gtk.Frame() frame.set_label("Seleccionar lista a encuestar. (archivo *.csv)") box = gtk.HBox() - box.pack_start(abrirlista, False, False, 10) + box.pack_start(self.abrirlista, False, False, 10) box.pack_start(self.label_2, False, False, 0) frame.add(box) frame.show_all() @@ -2243,7 +2256,7 @@ class Wizard(gtk.Dialog): frame = gtk.Frame() frame.set_label("Seleccionar encuesta desde archivo temporal. (archivo *.encuesta)") box = gtk.HBox() - box.pack_start(cargarencuesta, False, False, 10) + box.pack_start(self.cargarencuesta, False, False, 10) box.pack_start(self.label_3, False, False, 0) frame.add(box) frame.show_all() @@ -2265,6 +2278,106 @@ class Wizard(gtk.Dialog): self.set_border_width(5) self.set_size_request(640, 480) + self.connect("validate", self.__validate) + self.connect("enable_proceed", self.__enable_proceed) + self.connect("disable_proceed", self.__disable_proceed) + + self.emit("disable_proceed") + + def validate_csv_file(self): + valido = False + + if self.csv_file: + valido = G.csv_validate(self.csv_file) + + return valido + + def validate_json_file(self): + valido = False + + if self.json_file: + extension = os.path.splitext(os.path.split(self.json_file)[1])[1] + + if "json" in extension or "slv" in extension: + valido = True + + return valido + + def validate_tmp_file(self): + valido = False + + if self.temp_file: + extension = os.path.splitext(os.path.split(self.temp_file)[1])[1] + + if "encuesta" in extension: + valido = True + + return valido + + def _get_proceder_button(self): + return self.action_area.get_children()[1] + + def __validate(self, widget): + + if self.json_file or self.csv_file: + json_valido = self.validate_json_file() + csv_valido = self.validate_csv_file() + + if json_valido: + self.label_1.set_text(self.json_file) + self.label_1.modify_fg(0, gdk.color_parse("#7EAD45")) + elif self.json_file: + msg = u"El archivo json no es válido." + self.label_1.set_text(msg) + self.label_1.modify_fg(0, gdk.color_parse("#B40404")) + + if csv_valido: + self.label_2.set_text(self.csv_file) + self.label_2.modify_fg(0, gdk.color_parse("#7EAD45")) + elif self.csv_file: + msg = u"El archivo csv no es válido." + self.label_2.set_text(msg) + self.label_2.modify_fg(0, gdk.color_parse("#B40404")) + + if self.json_file and self.csv_file and json_valido and csv_valido: + self.emit("enable_proceed") + + self.label_3.set_text("") + self.cargarencuesta.set_sensitive(False) + + return + else: + self.emit("disable_proceed") + + if self.temp_file: + tmp_valido = self.validate_tmp_file() + if tmp_valido: + self.emit("enable_proceed") + self.label_3.set_text(self.temp_file) + self.label_3.modify_fg(0, gdk.color_parse("#7EAD45")) + + self.label_1.set_text("") + self.label_2.set_text("") + self.abrirencuesta.set_sensitive(False) + self.abrirlista.set_sensitive(False) + + return + else: + self.emit("disable_proceed") + msg = u"El archivo .encuesta no es válido." + self.label_3.set_text(msg) + self.label_3.modify_fg(0, gdk.color_parse("#B40404")) + + def __enable_proceed(self, widget): + + proceder = self._get_proceder_button() + proceder.set_sensitive(True) + + def __disable_proceed(self, widget): + + proceder = self._get_proceder_button() + proceder.set_sensitive(False) + def __abrir_encuesta(self, widget): """ Recuperar encuesta parcial o @@ -2310,30 +2423,27 @@ class Wizard(gtk.Dialog): Las encuestas respondidas son *.json o *.slv. """ - extension = os.path.splitext(os.path.split(archivo)[1])[1] + self.json_file = archivo - if "json" in extension or "slv" in extension: - self.label_1.set_text(archivo) + self.emit("validate") def __set_encuestados(self, widget, archivo): """ Las listas son *.csv. """ - extension = os.path.splitext(os.path.split(archivo)[1])[1] + self.csv_file = archivo - if "csv" in extension: - self.label_2.set_text(archivo) + self.emit("validate") def __set_encuesta_respondida(self, widget, archivo): """ Las encuestas respondidas son *.encuesta. """ - extension = os.path.splitext(os.path.split(archivo)[1])[1] + self.temp_file = archivo - if "encuesta" in extension: - self.label_3.set_text(archivo) + self.emit("validate") class Password_Dialog(gtk.Dialog): """ |