# -*- coding: utf-8 -*-
"""
Sistema Automatizado de Planificación Integral Comunal SAPIC
Copyleft (@) 2017 CENDITEL nodo Mérida - Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/WikiStart#a5.-SistemaAutomatizadodePlanificaciónIntegralComunalSAPIC
"""
## @package explicacion_situacional.views.genericEncuestasViews
#
# Vistas correspondientes a la explicacion situacional
# @author Ing. Leonel Paolo Hernandez Macchiarulo (lhernandez at cenditel.gob.ve)
# @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
# (CENDITEL) nodo Mérida - Venezuela
# @copyright GNU Public License versión 2 (GPLv2)
# @version 1.0
from django.contrib import messages
from django.contrib.auth.models import (
User
)
from django.shortcuts import render
from django.views.generic.edit import (
FormView, UpdateView
)
from django.views.generic import (
TemplateView, ListView
)
from django.http import JsonResponse
from explicacion_situacional.forms import (
ExplicacionForms, UbicacionForms
)
from explicacion_situacional.modelsEncuestas.modelsConsultas import (
Pregunta, Consulta, Opcion
)
from explicacion_situacional.modelsEncuestas.modelsParticipacion import (
RespuestaSino, RespuestaOpciones,
RespuestaAbierta, RespuestaUbicacion
)
from explicacion_situacional.constantes import (
TIPOS_PREGUNTAS
)
from utils.views import LoginRequeridoPerAuth
class EncuestasParticiparView(LoginRequeridoPerAuth, TemplateView):
"""!
Clase que gestiona la vista principal de la encuesta a la que va a participar
@author Ing. Leonel Paolo Hernandez Macchiarulo (lhernandez at cenditel.gob.ve)
@copyright GNU Public License versión 2 (GPLv2)
@date 20-09-2017
@version 1.0.0
"""
template_name = "encuesta.participar.html"
#template_name = "caracterizacion.social.html"
group_required = [u"Administradores", u"Voceros", u"Integrantes"]
def get_context_data(self, **kwargs):
"""!
Metodo que permite cargar de nuevo valores en los datos de contexto de la vista
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 23-02-2017
@param self {object} Objeto que instancia la clase
@param kwargs {object} Objeto que contiene los datos de contexto
@return Retorna los datos de contexto
"""
valores = {}
try:
consulta = Consulta.objects.select_related().get(pk=kwargs['pk'])
except:
consulta = ''
for pregunta in Pregunta.objects.filter(consulta_id=kwargs['pk']).all():
label = ''
campo = ''
if pregunta.tipo_pregunta.id == TIPOS_PREGUNTAS['SELECT_SIMPLE']:
campo = ''
for opcion in Opcion.objects.filter(pregunta_id=pregunta.id).all():
campo += ''
elif pregunta.tipo_pregunta.id == TIPOS_PREGUNTAS['SELECT_MULTIP']:
campo = ''
for opcion in Opcion.objects.filter(pregunta_id=pregunta.id).all():
campo += ''
elif pregunta.tipo_pregunta.id > TIPOS_PREGUNTAS['SELECT_MULTIP'] and pregunta.tipo_pregunta.id < TIPOS_PREGUNTAS['ABIERTA']:
campo += ''
if(pregunta.tipo_pregunta.id == TIPOS_PREGUNTAS['SI_NO']):
campo += ''
else:
campo += ''
campo += '
'
campo += '
'
elif pregunta.tipo_pregunta.id == TIPOS_PREGUNTAS['UBICACION']:
campo += '
'
else:
campo = ''
valores[pregunta.id] = {'label':label,'field':campo}
print (valores)
kwargs['preguntas'] = valores
kwargs['consulta'] = consulta
return super(EncuestasParticiparView, self).get_context_data(**kwargs)
def post(self, request, pk):
"""!
Metodo que sobreescribe el post del formulario
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 20-03-2017
@param self {object} Objeto que instancia la clase
@param request {object} Objeto que instancia la petición
@param pk {int} Recibe el id de la consulta
@return Retorna los datos de contexto
"""
data = dict(request.POST)
del data['csrfmiddlewaretoken']
if self.request.is_ajax():
for key in data.keys():
parent_id = key.split("_")[-1]
if 'sino' in key:
value = True if data[key][0] == 'Si' else False
justify_id = 'consulta_respuesta_justificar_'+str(parent_id)
self.crear_respuesta_sino(parent_id,value, self.request.user.id)
if(not value and justify_id in data.keys()):
respuesta = data[justify_id][0]
self.crear_respuesta_abierta(parent_id, respuesta,self.request.user.id,True)
elif 'radio' in key or 'check' in key:
for value in data[key]:
self.crear_respuesta_opciones(value, self.request.user.id)
elif 'abierta' in key:
value = data[key][0]
self.crear_respuesta_abierta(parent_id, value, self.request.user.id)
return JsonResponse({"code":True})
return redirect(reverse_lazy('explicacions:condicion_suelos',kwargs={'pk':pk}))
def crear_respuesta_sino(self, parent_id, value, user_id):
"""!
Metodo para crear una respuesta de si/no
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 27-03-2017
@param self {object} Objeto que instancia la clase
@param parent_id {int} Recibe el número del id del padre
@param value {bool} Recibe el valor de la respuesta
@param user_id {int} Recibe el id del user
@return Retorna los datos de contexto
"""
user = User.objects.get(id=user_id)
parent = Pregunta.objects.get(pk=parent_id)
respuesta = RespuestaSino()
respuesta.pregunta = parent
respuesta.respuesta = value
respuesta.user = user
respuesta.save()
def crear_respuesta_opciones(self, parent_id, user_id):
"""!
Metodo para crear una respuesta de selección simple y múltiple
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 28-03-2017
@param self {object} Objeto que instancia la clase
@param parent_id {int} Recibe el número del id del padre
@param user_id {int} Recibe el id del user
@return Retorna los datos de contexto
"""
user = User.objects.get(id=user_id)
parent = Opcion.objects.get(pk=parent_id)
respuesta = RespuestaOpciones()
respuesta.opcion = parent
respuesta.user = user
respuesta.save()
def crear_respuesta_abierta(self, parent_id, value,
user_id, es_justificacion=False):
"""!
Metodo para crear una respuesta abierta
@author Rodrigo Boet (rboet at cenditel.gob.ve)
@copyright GNU/GPLv2
@date 28-03-2017
@param self {object} Objeto que instancia la clase
@param parent_id {int} Recibe el número del id del padre
@param value {str} Recibe el valor de la respuesta
@param user_id {int} Recibe el id del user
@param es_justificacion {bool} Recibe el párametro que indica si es una justifiación
@return Retorna los datos de contexto
"""
user = User.objects.get(id=user_id)
parent = Pregunta.objects.get(pk=parent_id)
respuesta = RespuestaAbierta()
respuesta.pregunta = parent
respuesta.texto_respuesta = value
respuesta.user = user
respuesta.es_justificacion = es_justificacion
respuesta.save()