Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRogelio Mita <rogeliomita@activitycentral.com>2013-07-18 20:27:03 (GMT)
committer Rogelio Mita <rogeliomita@activitycentral.com>2013-07-18 20:27:03 (GMT)
commitfa418b0a4c86ad5a6b1b98eeb70ac07a80c10fe9 (patch)
tree09a60ce0656592996e2dece4f7892536dbae1597
parent51856b0549f287862ba5c77e07a82bc3ad382b57 (diff)
issue 4098: Wizard validation
-rw-r--r--CeibalEncuesta/gtk2/CeibalEncuesta/Globales.py21
-rw-r--r--CeibalEncuesta/gtk2/CeibalEncuesta/Widgets.py146
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):
"""