Ejemplo n.º 1
0
class PreviewController(BaseController):
    def __init__(self):
        self.URL_GETDATAQUESTION = "/preview/getDataPreview?idProject={0}"

        self.utility = Utility()

        dh = LogDBHandler(config=config, request=request)
        log.addHandler(dh)

    @expose("pollandsurvey.templates.view.multiquestion")
    def index(self, id=0, ready="no", came_from=lurl("/")):

        reload(sys).setdefaultencoding("utf8")

        if not request.identity:
            login_counter = request.environ.get("repoze.who.logins", 0) + 1
            redirect("/login", params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity["repoze.who.userid"]

        log.info("preview id : " + str(id))
        log.info("ready : " + str(ready))

        self.header = ""
        self.footer = ""
        self.nextQuestion = ""
        self.template = ""
        self.questionOption = model.QuestionOption.getId(id)
        if self.questionOption:
            log.info("expire date : " + str(self.questionOption.expire_date))
            log.info("current : " + str(datetime.now()))

            if datetime.now() <= self.questionOption.expire_date:
                log.info("not expire")
            else:
                log.info("expire")

            if str(ready).lower() == "no":
                # check have welcome page
                if not self.utility.isEmpty(self.questionOption.welcome_message):
                    redirect(request.path_info + "/welcome?id=" + str(self.questionOption.id_question_option))
                else:
                    self.template = self.questionOption.theme.template
                    override_template(PreviewController.index, self.template)

            elif str(ready).lower() == "yes":
                self.header = self.questionOption.header_message
                self.footer = self.questionOption.footer_message
                self.urlName = self.utility.spritValue(request.path_info, "/")
                self.template = self.questionOption.theme.template
                if len(self.urlName) >= 1:
                    self.nextQuestion = (
                        "/" + self.urlName[0] + "/saveQuestion" + "?id=" + str(self.questionOption.id_question_option)
                    )

                if self.template is not None and len(self.template) > 0:
                    log.info("template used : %s", self.template)
                    override_template(PreviewController.index, self.template)

        # print 'idproject : ', id;
        return dict(
            page="view",
            header=self.header,
            footer=self.footer,
            action=self.nextQuestion,
            template=self.template,
            urldata=self.URL_GETDATAQUESTION.format(id),
            idproject=id,
            shownavigator=bool(self.questionOption.show_navigator),
            idresp="",
        )

    @expose("genshi:pollandsurvey.templates.view.firstTemplate")
    def sampleTemplate(self, id=0, **kw):
        # print id;
        if str(id) == str(2):
            # print id;
            override_template(PreviewController.sampleTemplate, "genshi:pollandsurvey.templates.view.changeTemplate")
        return dict(
            title="Foobar", mybool=False, someval="foo"
        )  # ,tg_template="pollandsurvey.templates.view.changeTemplate"

    @expose("pollandsurvey.templates.view.welcome")
    def welcome(self, id=0, came_from=lurl("/")):
        reload(sys).setdefaultencoding("utf8")

        if not request.identity:
            login_counter = request.environ.get("repoze.who.logins", 0) + 1
            redirect("/login", params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity["repoze.who.userid"]

        log.info("preview id : " + str(id))

        self.welcome_message = ""
        self.questionOption = model.QuestionOption.getId(id)
        if self.questionOption:
            if datetime.now() <= self.questionOption.expire_date:
                log.info("not expire")
            else:
                log.info("expire")

            self.welcome_message = self.questionOption.welcome_message
            self.nextQuestion = ""

            self.urlName = self.utility.spritValue(request.path_info, "/")

            if len(self.urlName) >= 1:
                self.nextQuestion = "/" + self.urlName[0] + "?id=" + str(self.questionOption.id_question_option)

        return dict(page="view", ready="yes", welcome_message=self.welcome_message, nextQuestion=self.nextQuestion)

    @expose("pollandsurvey.templates.view.singlequestion")
    def show(self, id=0, came_from=lurl("/")):
        reload(sys).setdefaultencoding("utf8")

        if not request.identity:
            login_counter = request.environ.get("repoze.who.logins", 0) + 1
            redirect("/login", params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity["repoze.who.userid"]
        # flash(_('Welcome back, %s!') % userid)

        log.info("preview id : " + str(id))

        self.questionOption = model.QuestionOption.getId(id)

        log.info("expire date : " + str(self.questionOption.expire_date))
        log.info("current : " + str(datetime.now()))

        if datetime.now() <= self.questionOption.expire_date:
            log.info("not expire")
        else:
            log.info("expire")

        return dict(page="view")

    @expose("json")
    def getDataPreview(self, came_from=lurl("/"), *args, **kw):
        reload(sys).setdefaultencoding("utf-8")

        idProject = kw.get("idProject")
        idRespondet = None

        if "." in idProject:
            self.data = self.utility.spritValue(idProject, ".")

            idProject = self.data[0]
            if len(self.data) == 2:
                idRespondet = self.data[1]

        # print args;
        # print kw ;

        questions = []

        question = []
        if idRespondet:
            log.info("Query with respondent")

            self.listReply = model.RespondentReply.listQuestionForUser(self.data[1])

            for re in self.listReply:

                result = model.RespondentReply.getResultByRespondemtAndQuestion(idRespondet, re.question.id_question)

                question.append(re.question.to_json(randomAnswer=False, showResult=result))

        else:
            log.info("Query with question")

            self.questionOption = model.QuestionOption.getId(idProject)

            if self.questionOption:
                self.listQuestions = model.Question.getByProjectId(self.questionOption.id_question_project)

                question = []
                for self.question in self.listQuestions:
                    # print self.question.id_question;
                    # print self.question.question;
                    # print self.question.question_type.type;
                    # print self.question.order;
                    question.append(self.question.to_json(randomAnswer=self.questionOption.random_answer))

        questions.append({"id": idProject, "question": question})

        return dict(questions=questions)

    @expose("pollandsurvey.templates.view.goodbye")
    def saveQuestion(self, id=0, came_from=lurl("/"), *args, **kw):
        reload(sys).setdefaultencoding("utf-8")

        if not request.identity:
            login_counter = request.environ.get("repoze.who.logins", 0) + 1
            redirect("/login", params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity["repoze.who.userid"]

        self.success = True
        self.message = "success"
        self.goodbye_message = ""
        self.nextQuestion = ""

        self.questionOption = model.QuestionOption.getId(id)
        if self.questionOption:
            self.goodbye_message = self.questionOption.end_message
            self.urlRedirect = self.questionOption.redirect_url

        return dict(
            page="goodbye",
            success=self.success,
            message=self.message,
            goodbye=self.goodbye_message,
            nextQuestion=self.nextQuestion,
            urlRedirect=self.urlRedirect,
        )

    @expose("pollandsurvey.templates.view.multiquestion")
    def showResult(self, id=0, ready="yes", came_from=lurl("/"), *args, **kw):

        reload(sys).setdefaultencoding("utf-8")

        if not request.identity:
            login_counter = request.environ.get("repoze.who.logins", 0) + 1
            redirect("/login", params=dict(came_from=came_from, __logins=login_counter))
        # userid = request.identity['repoze.who.userid']

        self.data = self.utility.spritValue(id, ".")

        if len(self.data) != 2:
            return dict(questions=[])

        log.info("preview id : " + str(id) + "  ready : " + str(ready))

        self.header = ""
        self.footer = ""
        self.nextQuestion = ""
        self.template = ""
        self.questionOption = model.QuestionOption.getId(self.data[0])
        if self.questionOption:
            # log.info('expire date : ' + str(self.questionOption.expire_date) + ', current date : ' +  str(datetime.now()));

            # if datetime.now() <= self.questionOption.expire_date:
            #    log.info('not expire');
            # else :
            #    log.info('expire');

            if str(ready).lower() == "no":
                # check have welcome page
                if not self.utility.isEmpty(self.questionOption.welcome_message):
                    redirect(request.path_info + "/welcome?id=" + str(self.questionOption.id_question_option))
                else:
                    self.template = self.questionOption.theme.template
                    override_template(PreviewController.index, self.template)

            elif str(ready).lower() == "yes":
                self.header = self.questionOption.header_message
                self.footer = self.questionOption.footer_message
                self.urlName = self.utility.spritValue(request.path_info, "/")
                self.template = self.questionOption.theme.template
                if len(self.urlName) >= 1:
                    self.nextQuestion = (
                        "/" + self.urlName[0] + "/saveQuestion" + "?id=" + str(self.questionOption.id_question_option)
                    )

                if self.template is not None and len(self.template) > 0:
                    log.info("template used : %s", self.template)
                    override_template(PreviewController.index, self.template)

        return dict(
            page="view",
            header=self.header,
            footer=self.footer,
            action=self.nextQuestion,
            template=self.template,
            urldata=self.URL_GETDATAQUESTION.format(id),
            idproject=id,
            shownavigator=bool(self.questionOption.show_navigator),
            idresp="",
        )
class AnswerQuestionController(BaseController):#RestController): #
    
    def __init__(self):
        self.utility = Utility();
        self.urlUtility = URLUtility();
         
        
        
        self.sourceHtml = model.SystemEnvironment.getScoreViewHtml();
        self.answerQuestionService = AnswerQuestionService(mymodel = model)
        
        dh = LogDBHandler( config=config,request=request);        
        log.addHandler(dh)
        
       
    
    @expose()
    def _default(self, *args, **kw):
        return 'This page is not ready'
    
    def _before(self, *args, **kw):
        tmpl_context.project_name = 'pollandsurvey'
    
            
    @expose('pollandsurvey.templates.view.multiquestion')
    def questionnaire(self,key=0,ready='no',**kw):
        reload(sys).setdefaultencoding('utf8')
        log.info("key %s , ready %s" %( key,ready) );
        print ("key %s , ready %s" %( key,ready) );
        self.header = '';
        self.footer = '';
        self.nextQuestion ='';
        self.template ='';
        self.userName='';
        
        
        self.respondents = model.Respondents.getByKey(keyGen=key);
        if self.respondents :
            
            self.urlReply = self.urlUtility.URL_REPLY.format( model.SystemEnvironment.getServerUrl() , str(self.respondents.id_question_project), str(self.respondents.id_question_option), str(self.respondents.id_voter))  ; #request.application_url
            log.info("iframe url to %s" %self.urlReply);
            
            #check finish
            self.isRedirect ,self.redirect  = self.answerQuestionService.checkFinish(respondent = self.respondents, urlUtility = self.urlUtility)
            if self.isRedirect:
                redirect(self.redirect) ;
            
            #check Expire
            self.questionOption,self.redirect = self.__checkOptionExpired(self.respondents.id_question_option);    
            
            
            if str(ready).lower() == 'no':    
                #check have welcome page
                if( not self.utility.isEmpty(self.questionOption.welcome_message) ) :
                    #redirect('/ans' + '/welcome?id='+ str(self.questionOption.id_question_option) );
                    log.info("show message welcome : ");
                    redirect( self.urlUtility.URL_WELCOME.format(key = str(key)) )#   self.URL_WELCOME_NEW.format(str(key))  );
                else:
                    log.info("show questionnaire : ");
                    self.template =  self.questionOption.theme.template;
                    override_template(AnswerQuestionController.questionnaire, self.template) ;    
                    
            elif str(ready).lower() == 'yes':
                self.header = self.questionOption.header_message;
                self.footer = self.questionOption.footer_message;
                self.urlName = self.utility.spritValue(request.path_info,'/');
                self.template =  self.questionOption.theme.template
                if(len(self.urlName) >= 1 ) :
                    self.nextQuestion = '/' + self.urlName[0] + '/saveQuestion' + '?id='+ str(self.questionOption.id_question_option);
                
                
                if(self.template is not None and len(self.template) > 0):    
                    log.info("template used : %s"   %self.template );     
                    
                    override_template(AnswerQuestionController.questionnaire, self.template) 
                    
                self.ip=request.environ.get("X_FORWARDED_FOR", request.environ["REMOTE_ADDR"]);
                self.browser = request.environ.get('HTTP_USER_AGENT');
                
            self.header = self.questionOption.header_message;
            self.footer = self.questionOption.footer_message;
            self.urlName = self.utility.spritValue(request.path_info,'/');
            self.template =  self.questionOption.theme.template 
            if self.respondents.voter:
                self.userName =  "******"%(self.respondents.voter.firstname,self.respondents.voter.lastname);            
        else:
            log.warning("find not found key %s" %str(key));
            redirect(self.urlUtility.URL_EXPIRED) ;       
        
        print "header : %s" %self.header
        return dict(page='view', header = Markdown(self.header).convert() , 
                        footer = Markdown(self.footer).convert()  , 
                        action = self.nextQuestion, template= self.template,
                        #urldata = self.URL_GETDATAQUESTION.format(self.idPublic),
                        urldata =  self.urlUtility.URL_GETDATAQUESTION.format(key=str(key)),#  self.URL_GETDATAQUESTION.format(key),  
                        idproject = self.questionOption.id_question_option ,
                        idresp = self.respondents.id_respondents,
                        username = self.userName,
                        shownavigator = bool(self.questionOption.show_navigator) ); 
    
     
    
    @expose('pollandsurvey.templates.view.welcome')
    def welcome(self,key=0,came_from=lurl('/')):
        reload(sys).setdefaultencoding("utf-8");
         
        
        log.info('preview id : ' + str(key));
        
        self.respondents = model.Respondents.getByKey(key);
        #self.idProject,self.idPublic,self.idVoter,self.redirect = self.__checkExpire(id);
        if (self.respondents):
        
            self.welcome_message = '';
            
            self.questionOption,self.redirect = self.__checkOptionExpired(self.respondents.id_question_option);
                    
            self.welcome_message= self.questionOption.welcome_message;
            self.nextQuestion  = '';
             
            self.urlName = self.utility.spritValue(request.path_info,'/');
             
            if(len(self.urlName) >= 1 ) :
                #self.nextQuestion = '/' + self.urlName[0]+ '?id='+ str(self.questionOption.id_question_option);
                #self.nextQuestion = '/' + 'ans/reply/'+  str(self.questionOption.id_question_option);
                #self.nextQuestion = self.URL_REPLY.format(id)
                self.nextQuestion = self.urlUtility.URL_REPLY_QUESTIONNAIRE.format(key=str(key)); 
        else:
            log.error("find not found respondent with key %s ", str(key));
            redirect(self.urlUtility.URL_EXPIRED) ;       
            
               
            
        #self.welcome_message
        return dict(page='view', ready = 'yes',welcome_message = Markdown(self.welcome_message).convert(), nextQuestion= self.nextQuestion);
    
            
     
    
    @expose('pollandsurvey.templates.view.goodbye')
    def thankyou(self,key=0,came_from=lurl('/')):
        reload(sys).setdefaultencoding("utf-8");
        
        log.info('thankyou preview id : %s' %str(key));
        self.isRedirect = True
        self.goodbye = '';
        self.nextQuestion  = '';
        self.urlRedirect = ''; 
        self.showScore = False
        self.respondents = model.Respondents.getByKey(keyGen=key);
        if(self.respondents):
            self.urlName = self.utility.spritValue(request.path_info,'/');
            log.info( "path %s" %self.urlName)
            self.questionOption = self.respondents.question_option
            if self.questionOption :
                self.goodbye= self.questionOption.end_message
                self.showScore = self.utility.convertToBool(self.questionOption.show_score)
                self.urlRedirect = self.questionOption.redirect_url
                if self.utility.convertToBool(self.respondents.redirect_other_url):
                    self.urlRedirect = self.questionOption.redirect_other_url
                
                self.isRedirect = False
            
            self.projectType = self.respondents.question_project.id_question_project_type
            del self.questionOption
        
        if self.isRedirect :
            log.error("find not found respondent with key %s " % str(key));
            redirect(self.urlUtility.URL_EXPIRED) ;  
            
    
        return dict(page='goodbye', ready = 'yes',goodbye = Markdown(self.goodbye).convert(),nextQuestion = self.nextQuestion ,urlRedirect= self.urlRedirect,
                    showScore = self.showScore  ,projectType = self.projectType,imageId = self.respondents.id_respondents);
    
    
    
    @expose('json')
    def getDataPreview(self, key=0,   *args, **kw):   
            
        reload(sys).setdefaultencoding("utf-8");
        log.info("function getDataPreview");
        
        self.respondents = model.Respondents.getByKey(key);
        
        if(self.respondents is None):
            return dict(questions = [],timer = 0);
        
        
        self.idProject=self.respondents.id_question_project;
        self.idPublic=self.respondents.id_question_option;
        self.questionOption = model.QuestionOption.getId(self.idPublic);
        
        log.info("idProject : %s,  idPublic : %s, idVoter : %s, id_respondents : %s"  %( str(self.idProject), str(self.idPublic), str(self.respondents.id_voter) , str(self.respondents.id_respondents) ) );
        
               
        #get old question
        self.answerQuestionService.renewQuestionForUser( respondents = self.respondents, id_close_type = self.questionOption.id_close_type)
        
        self.listReply = model.RespondentReply.listQuestionForUser(self.respondents.id_respondents); #questionobject by id_respondents
        self.respondents.respondent_data = datetime.now();
        
        question = [];
        self.listquestion = [];
        self.order =1
        log.info("Random Question And Answer : " );
        
        if( len(self.listReply) > 0 ):
            
            log.info("Random new");
            self.listquestion = self.answerQuestionService.getQuestionGroupWithReply(listReply= self.listReply)
        else:
          
            log.info( "Get New Question")             
            self.listquestion = self.answerQuestionService.getQuestionGroupWithQuestionOption(self.questionOption)
            self.answerQuestionService.createQuestionForUser(listQuestion=self.listquestion, id_close_type= self.questionOption.id_close_type)
            
        self.listquestion, self.order = self.answerQuestionService.genSeq(listQuestion = self.listquestion)
                 
        
        #question = self.__randomQuestionAndAnswer(question,self.questionOption);    
        #self.__setSequenceQuestion(question); 
        
         
        questions = [];
        questions.append({'id': self.idProject, 'question' : self.listquestion, 'total': self.order});
        
        return dict(questions = questions,timer = self.questionOption.duration_time);
    
    
    @expose('json')
    def saveQuestion(self, *args, **kw):
        reload(sys).setdefaultencoding("utf-8");
        log.info( "function save Question answer");
        log.info( request.body);
        
        self.saveQuests = JsontoObject(json.loads(request.body, encoding=request.charset))        
        self.finished = self.saveQuests.finished
        self.idresp = None
        self.redirect = ''
        
        if (len(self.saveQuests.value) >0):
            for item in self.saveQuests.value:
                if(item):
                    self.idresp = item.idresp
                    self.questionOption,self.redirect = self.__checkOptionExpired(item.idproject,False);#check Expired
                    self.respondent,self.redirect = self.__checkRespondentFinished( None,  None,item.idresp,False);#check finished
                    if(self.respondent):
                        self.respondent.finished = self.finished;
                        self.respondent.finished_date = datetime.now();
        
                        self.question = model.Question.getById(item.id);#getQuestion                         
                        if(self.question):
                            self.respondentreply = model.RespondentReply.getByRespondentAndQuestion(item.idresp,item.id);
                            
                            
                            if (self.respondentreply is None):
                                self.respondentreply = model.RespondentReply(id_respondents = item.idresp,id_question = item.id);                                
                                self.respondentreply.save();
                                
                                log.info("save answer respondentreply : " +str( self.respondentreply.id_respondents ) + " and " + str( self.respondentreply.id_question ) + " success");
                            
                            if (len(self.respondentreply.childenAnswer) == 0):
                                #save
                                for v in item.value:                                    
                                    self.replyquestion = model.ReplyBasicQuestion(id_resp_reply = self.respondentreply.id_resp_reply,
                                                                                  id_basic_data = v.id,
                                                                                  answer_text = v.value
                                                                                  ); 
                                    self.replyquestion.save();
                                    v = None
                                    del v
                                    log.info("save answer replyquestion : " +str( self.respondentreply.id_resp_reply ) + " and " + str( self.replyquestion.id_basic_data ) + " success");
                            else:
                                log.info('user %s do this question : %s Already'%(item.idresp,item.id));
                        else:
                            log.info('find not found question id : : %s' %(item.id));
                    else:
                        log.info('find not found respondent id : : %s' %(item.idresp));
                    
                    item = None
            
            model.DBSession.flush()
            #calculate score        
            if(self.finished):  
                log.info('finished : calculate score ')
                
                model.Respondents.updateScoreByIdRespondents(self.idresp)
                model.Respondents.updatePersonalityScoreByIdRespondents(self.idresp)
                transaction.commit()
                self.answerQuestionService.createScoreFileImage(self.idresp)
                #self.__createScoreFile(self.idresp);
                self.redirect = self.urlUtility.URL_GOODBYE.format( key=  self.utility.splitNameWithOutExtention(basename(request.environ.get("HTTP_REFERER" )))  );
        
        return dict(success = True,redirect = self.redirect, finished = self.finished  );
    
    
    @expose('json')
    def getresult(self, *args, **kw):
        reload(sys).setdefaultencoding("utf-8");
        self.result = model.Respondents.getResultPersonality(id_respondents=124)
        #for r in self.result:
        print   self.result
     
    
    
    @expose('pollandsurvey.templates.certificate.index')   
    def viewCertScore(self,key=0,**kw):
        reload(sys).setdefaultencoding('utf8')
        certificateUser = dict(
                               title='Certificate Of Jobsmatcher',
                               label_score='scored', 
                               label_date='Date', 
                               name='', 
                               score='0/0', 
                               type='', 
                               finishDate=''
                               )
        self.respondents = model.Respondents.getId(key)
        
        if self.respondents:
            self.result = model.Respondents.getScoreByIdRespondents(id_respondents=key)
            certificateUser['name'] =   (' ').join([self.respondents.voter.prefix, self.respondents.voter.firstname, self.respondents.voter.lastname])
            certificateUser['finishDate']  =  self.utility.getDateByFormat(date = self.respondents.finished_date)  
            certificateUser['score'] = self.result
            certificateUser['type'] = self.respondents.question_project.name
            log.info( "respondents %s , score %s" %(key, self.result))
        
        return dict(page = 'certificate',certificateUser = certificateUser)
    
    def __checkExpire(self,id):
        #sprint 10.2.1.0.html     idproject.idpublic.idvoter.
        self.value = self.utility.spritValue(id,'.');
         
        self.idProject =0;
        self.idPublic = 0;
        self.idVoter = 0;
        
        self.redirect = '';
        
        
        
        if(len(self.value)  == 4):
            self.idProject =self.value[0];
            self.idPublic = self.value[1];
            self.idVoter = self.value[2];
        else:
            self.idProject =None;
            self.idPublic = None;
            self.idVoter = None;
            
            log.info('parameter not have 4 parameter : %s', ','.join(self.value));
            self.redirect = self.urlUtility.URL_EXPIRED;
            redirect(self.urlUtility.URL_EXPIRED) ;
        
        self.voter = model.Voter.getId(self.idVoter);
        if(self.voter is None):
            log.info('find not voter in id : %s',self.idVoter);
            self.redirect = self.urlUtility.URL_HOME;
            redirect(self.urlUtility.URL_HOME) ;
        
        self.project = model.QuestionProject.getId(self.idProject);
        if(self.project is None):
            log.info('find not project in id project : %s',self.idProject);
            self.redirect = self.urlUtility.URL_HOME;
            redirect(self.urlUtility.URL_HOME) ;
            
        return self.idProject,self.idPublic,self.idVoter, self.redirect;
            
    def __checkOptionExpired(self,idPublic,isRedirect = True):
        #print 'public option id ',idPublic;
        self.questionOption = model.QuestionOption.getId( idPublic);           
        self.redirect = '';
        if  self.questionOption is None or ( not self.utility.isActiveFromDate(None,self.questionOption.activate_date,self.questionOption.expire_date) ):
            self.redirect = self.urlUtility.URL_EXPIRED;
            if (isRedirect):
                #print 'redirect ',self.URL_EXPIRED; 
                redirect(self.urlUtility.URL_EXPIRED) ;
      
                
        #print 'id option : ', self.questionOption.welcome_message;
        
        return self.questionOption,self.redirect;    
            
    def __checkRespondentFinished(self,idVoter,idPublic,idResp,isRedirect = True): 
        self.respondent = None;
        self.redirect = '';
        if(idVoter and idPublic):           
            self.respondent = model.Respondents.getByVoterAndPublicId(idVoter,idPublic);
        elif (idResp):           
            self.respondent = model.Respondents.getId(idResp);            
        if(self.respondent  is not None and self.respondent.finished == CheckFinish.finished.value): #finished = 1            
            log.info('voter finished in id public : %s',idPublic);
            self.redirect = self.urlUtility.URL_THANKYOU;
            if (isRedirect):
                redirect(self.urlUtility.URL_THANKYOU) ;
        elif (self.respondent is None):           
            log.error("System can not find idVoter : %s , idPublic : %s" , idVoter, idPublic);
            
            redirect(self.urlUtility.URL_THANKYOU) ;
        
        return self.respondent,self.redirect;
    
    def __getQuestion(self,idPublic,questionOption):
        
        question = [];
        #get Project Option
        
        if self.questionOption :
            #get Question 
            self.listQuestions = model.Question.getByProjectId(questionOption.id_question_project);
            
            
            #get to object json
            for self.question in self.listQuestions:
                question.append(self.question.to_json(randomAnswer = questionOption.random_answer));
            
            
            
            #clear sequence 
               
        return question ;
    
    def __getQuestionFromReply(self,reply,questionOption):
        question = [];
        for re in reply:
            #re.question
            question.append(re.question.to_json(randomAnswer= questionOption.random_answer));
        
        return question;
    
    def __randomQuestionAndAnswer(self,question,questionOption):       
        #option Randon Question       
        if( questionOption.id_fix_random_type == RandomType.simple_random.value):   #id_fix_random_type == 2          
            question = random.sample(question,len(question));#,self.questionOption.use_question_no );
        
        
        question = question[0:questionOption.use_question_no];
            
        return question;
    
    def __setSequenceQuestion(self,question):
        row = 1;
        for q in question:
            q['seq'] = row;
            row = row +1; 
        row =None;
        
        return question;
Ejemplo n.º 3
0
class RegisterService(object):

    def __init__(self):
        print "init RegisterService"
        self.urlServer =  model.SystemEnvironment.getServerUrl();
        self.utility = Utility();
        pass;
    
    def insertOrUpdateUserWithFacebook(self,user,fuser,accessToken):
        self.fullname = fuser['first_name']
        self.fulllastname = fuser['last_name']
        self.email =fuser['email']
        self.tnc = 1
        self.id_gender =  model.Gender.getIdGender(fuser['gender'])
        self.displayname  =  fuser['name']
        self.provider_user_id = fuser['id']
        self.access_token = accessToken['accessToken']
        self.profile_url =fuser['link']  
        self.expiresin = str(accessToken['expiresIn']) 
        self.singed_request = accessToken['signedRequest'] 
        
        locale = self.utility.spritValue(fuser['locale'], '_')
        self.language =  locale[0]
        self.country =  locale[1]
        
        self.insert = False;
        if(user is None):
            user = model.User()
            self.insert= True;
        user.user_name  = self.email
        user.email_address =  self.email
        user.display_name = self.displayname
        
        if(self.insert ):    
            user.save()
        
        self.user_id = user.user_id
        
        
        self.userservice = model.UserService.getByUserId(self.user_id)
        self.usersocial = model.UserSocialNetwork.getByUserIdAndSocialId(self.user_id, '1');  
        
        if(self.userservice is None):
            self.userservice = model.UserService();
            self.insert= True;
            
        self.userservice.user_name = self.email;
        self.userservice.email_address = self.email;
        self.userservice.display_name =  self.displayname ;
        #self.user._set_password(self.password); 
        self.userservice.first_name = self.fullname
        self.userservice.last_name = self.fulllastname
        #self.user.address =self.address
        #self.user.city =self.city
        #self.user.country = self.country
        self.userservice.id_gender = self.id_gender
        self.userservice.accept_tnc = self.tnc
        self.userservice.language = self.language
        self.userservice.country = self.country
        self.userservice.user_id = self.user_id
        
        if(self.insert ):
            self.userservice.save();
            self.userservice.updateGroupUserVoter();
        
        
        if (self.usersocial is None):
            self.usersocial = model.UserSocialNetwork();        
            self.insert= True;
            
               
        self.usersocial.user_id = self.user_id
        self.usersocial.id_social_type = 1
        self.usersocial.provider_user_id = self.provider_user_id
        self.usersocial.access_token = self.access_token
        
        self.usersocial.display_name = self.displayname 
        self.usersocial.profile_url =self.profile_url
        
        self.usersocial.expiresin =  self.expiresin 
        self.usersocial.singed_request = self.singed_request
        
        if(self.insert ):
            self.usersocial.save()
        
        
        return user;
        
    def createUserWithFacebook(self,fuser,accessToken):
        
        self.fullname = fuser['first_name']
        self.fulllastname = fuser['last_name']
        self.email =fuser['email']
        self.tnc = 1
        self.id_gender =  model.Gender.getIdGender(fuser['gender'])
        
        
        locale = self.utility.spritValue(fuser['locale'], '_')
        
        
        user = model.User()
        user.user_name  = self.email
        user.email_address =  self.email
        user.display_name = fuser['name']
        user.save()
        
        
        self.userservice = model.UserService();
        self.userservice.user_name = self.email;
        self.userservice.email_address = self.email;
        self.userservice.display_name =  fuser['name'];
        #self.user._set_password(self.password); 
        self.userservice.first_name = self.fullname
        self.userservice.last_name = self.fulllastname
        #self.user.address =self.address
        #self.user.city =self.city
        #self.user.country = self.country
        self.userservice.id_gender = self.id_gender;
        self.userservice.accept_tnc = self.tnc
        self.userservice.language = locale[0]
        self.userservice.country = locale[1]
        self.userservice.user_id = user.user_id        
        self.userservice.save();
        self.userservice.updateGroupUserVoter();
        
        
        self.usersocial = model.UserSocialNetwork();        
        self.usersocial.user_id = user.user_id
        self.usersocial.id_social_type = 1
        self.usersocial.provider_user_id = fuser['id']
        self.usersocial.access_token = accessToken['accessToken']
        
        self.usersocial.display_name = fuser['name']
        self.usersocial.profile_url =fuser['link']  
        
        self.usersocial.expiresin =  str(accessToken['expiresIn'])  
        self.usersocial.singed_request = accessToken['signedRequest']
        self.usersocial.save()
        
        
         
    
    def createUser(self, kw):
        
        self.registerObject = RegisterObject(**kw);
        
        self.user = self.registerObject.getUser()
        self.user.save(); 
        
        self.userservice = self.registerObject.getUserService();
        self.userservice.user_id = self.user.user_id
        self.userservice.accept_tnc = self.utility.convertToBit(self.userservice.accept_tnc);
        self.userservice.save();
        
        self.userservice.updateGroupUserVoter()
        self.userservice.updateGroupUserCreator()
        
        self.userGenCode = self.createUserGenCode(self.user);
        
        return self.user,self.userGenCode;
    
    def createUserGenCode(self,user):
        self.userGenCode = model.UserGenCode();
        self.userGenCode.user_id =  user.user_id;
        self.userGenCode.id_gen_code_type = 2 ;# register
        self.userGenCode.code = str(self.userGenCode.user_id)+ self.utility.my_random_string(15);
        self.userGenCode.expire_date =  self.utility.plusDate(datetime.today(),30);
        self.userGenCode.save();
        
        return self.userGenCode;
    
    def reActivateUserGenCode(self,userGenCode,user):
        if(userGenCode):
            self.userGenCode = userGenCode;
            
            self.userGenCode.code = str(self.userGenCode.user_id)+ self.utility.my_random_string(15);
            self.userGenCode.expire_date =  self.utility.plusDate(datetime.today(),30);
            self.userGenCode.create_date = datetime.today();
            self.userGenCode.count = self.userGenCode.count +1;
            self.userGenCode.success = 0;
            return self.userGenCode;
        
        return userGenCode;
    
    def deActivateUserGenCode(self,user):
        self.userGenCode = model.UserGenCode()
        self.userGenCode.user_id =  user.user_id
        self.userGenCode.id_gen_code_type = 6 ;# deactivate
        self.userGenCode.code = str(self.userGenCode.user_id)+ self.utility.my_random_string(15)
        self.userGenCode.expire_date =  self.utility.plusDate(datetime.today(),30)
        self.userGenCode.success = 1
        self.userGenCode.save()
        
        return self.userGenCode;
    def reActivateUser(self,user):
        self.userGenCode = None
        self.user = user
        if(self.user):
            self.userGenCode = self.createUserGenCode(self.user)
            
            self.emailValues={};
            self.emailValues['user_name'] = self.user.display_name;
            self.emailValues['email'] = self.user.email_address;
            self.emailValues['password'] = '';
            self.emailValues['activate_url'] =  request.scheme   + '://' + self.urlServer + "/activate/" + str(self.userGenCode.code);  #request.application_url
            
            self.sendMailService = SendMailService();
            self.sendMailService.sendreActivate(self.emailValues);
            self.sendMailService.start();
        return self.user, self.userGenCode
Ejemplo n.º 4
0
class PreviewController(BaseController):
   
    def __init__(self):
        self.URL_GETDATAQUESTION = '/preview/getDataPreview?idProject={0}';   
       
        self.utility = Utility();
        
        dh = LogDBHandler( config=config,request=request);        
        log.addHandler(dh)
        
    
    @expose('pollandsurvey.templates.view.multiquestion')
    @require(predicates.in_any_group('creator','managers', msg=l_('Only for creator')))
    def index(self ,id=0,ready='no' , came_from=lurl('/')):
        reload(sys).setdefaultencoding('utf8')
        
        userid = request.identity['repoze.who.userid']
        
       
        self.header = '';
        self.footer = '';
        self.nextQuestion ='';
        self.template =''; 
        self.questionOption = model.QuestionOption.getId(id);
        
        if self.questionOption : 
            print str(ready).lower()
            if str(ready).lower() == 'no':    
                #check have welcome page
                if( not self.utility.isEmpty(self.questionOption.welcome_message) ) :
                    redirect(request.path_info + '/welcome?id='+ str(self.questionOption.id_question_option) );
                else:
                    self.template = self.questionOption.theme.template;
                    override_template(PreviewController.index, self.template) ;    
                    
            elif str(ready).lower() == 'yes':
                self.header = self.questionOption.header_message;
                self.footer = self.questionOption.footer_message;
                self.urlName = self.utility.spritValue(request.path_info,'/');
                self.template = self.questionOption.theme.template
                if(len(self.urlName) >= 1 ) :
                    self.nextQuestion = '/' + self.urlName[0] + '/saveQuestion' + '?id='+ str(self.questionOption.id_question_option);
                
                
                if(self.template is not None and len(self.template) > 0):    
                    log.info("template used : %s",  self.template );                     
                    override_template(PreviewController.index, self.template) 
        
        #kw = {'idProject': str(id)}
        #self.dataView = self.getDataPreview(came_from,**kw)

        print "self.template " + self.template            
                
        #print 'idproject : ', id;     
        return dict(page='view',header = self.header, 
                    footer = self.footer, 
                    action = self.nextQuestion,
                    template= self.template,
                    urldata = self.URL_GETDATAQUESTION.format(id) , 
                    idproject = id , 
                    shownavigator = bool(self.questionOption.show_navigator),
                    idresp = "",
                    username=""); 
         
        
    
    @expose ("genshi:pollandsurvey.templates.view.firstTemplate")
    def sampleTemplate(self,id=0, **kw):        
        #print id;
        if(str(id) == str(2)):
            #print id;
            override_template(PreviewController.sampleTemplate, 'genshi:pollandsurvey.templates.view.changeTemplate') 
        return dict(title="Foobar", mybool=False, someval="foo"  ) #,tg_template="pollandsurvey.templates.view.changeTemplate"
        
   
    @expose('pollandsurvey.templates.view.welcome')
    def welcome(self,id=0,came_from=lurl('/')):
        reload(sys).setdefaultencoding('utf8')
        
        if not request.identity:
            login_counter = request.environ.get('repoze.who.logins', 0) + 1
            redirect('/login',   params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity['repoze.who.userid']
       
        
        log.info('preview id : ' + str(id));
        
        
        self.welcome_message = '';
        self.questionOption = model.QuestionOption.getId(id);
        if self.questionOption : 
            if datetime.now() <= self.questionOption.expire_date:
                log.info('not expire');
            else :
                log.info('expire');
                
            self.welcome_message= self.questionOption.welcome_message;
            self.nextQuestion  = '';
             
            self.urlName = self.utility.spritValue(request.path_info,'/');
             
            if(len(self.urlName) >= 1 ) :
                self.nextQuestion = '/' + self.urlName[0]+ '?id='+ str(self.questionOption.id_question_option);
        
            
                
            
        
        return dict(page='view', ready = 'yes',welcome_message = self.welcome_message, nextQuestion= self.nextQuestion);
    
    @expose('pollandsurvey.templates.view.singlequestion')
    def show(self ,id=0 , came_from=lurl('/')):
        reload(sys).setdefaultencoding('utf8')
        
        if not request.identity:
            login_counter = request.environ.get('repoze.who.logins', 0) + 1
            redirect('/login',   params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity['repoze.who.userid']
        #flash(_('Welcome back, %s!') % userid)
        
        log.info('preview id : ' + str(id));
        
        self.questionOption = model.QuestionOption.getId(id);
        
        log.info('expire date : ' + str(self.questionOption.expire_date));
        log.info('current : ' + str(datetime.now()) );
        
        if datetime.now() <= self.questionOption.expire_date:
            log.info('not expire');
        else :
            log.info('expire');
        
        return dict(page='view')
    
    @expose('json')
    def getDataPreview(self, came_from=lurl('/'),   *args, **kw): 
        reload(sys).setdefaultencoding("utf-8");
        
        idProject = kw.get('idProject');
        idRespondet = None;
        
        if( '.' in idProject):
            self.data =  self.utility.spritValue(idProject,".")
             
            idProject = self.data[0];
            if len(self.data) == 2:
                idRespondet = self.data[1];
            
        #print args;
        #print kw ;
        
        questions = [];
        question = [];
        self.order = 1;
        self.listquestion = []
        
        self.listquestion = [];
        if idRespondet :
            log.info("Query with respondent");
            self.listReply = model.RespondentReply.listQuestionForUser(self.data[1]);
            self.order = 1
            for re in self.listReply:                
                result = model.RespondentReply.getResultByRespondemtAndQuestion(idRespondet,re.question.id_question);
                self.listquestion.append(re.question.to_json(randomAnswer=False, showResult = result,initOrder =self.order ));
                self.order = self.order + 1
         
        else :
            log.info("Query with question");
            
            self.questionOption = model.QuestionOption.getId(idProject);
             
            if self.questionOption :
                self.questionGroups = model.QuestionGroup.getByProject(self.questionOption.id_question_project )
                for self.group in self.questionGroups:
                    self.group, self.order = self.group.tojsonview(randomAnswer = self.questionOption.random_answer,initOrder= self.order)
                    self.listquestion.append(self.group)
                
            self.order = self.order -1;
            
        
        questions.append({'id': idProject, 'question' : self.listquestion, 'total': self.order });
       
        
        return dict(questions = questions);
    
    
    @expose('pollandsurvey.templates.view.goodbye')
    def saveQuestion(self,id=0 , came_from=lurl('/'),   *args, **kw): 
        reload(sys).setdefaultencoding("utf-8");
        
        if not request.identity:
            login_counter = request.environ.get('repoze.who.logins', 0) + 1
            redirect('/login',   params=dict(came_from=came_from, __logins=login_counter))
        userid = request.identity['repoze.who.userid']
        
        
        self.success = True;
        self.message = "success";
        self.goodbye_message = '';
        self.nextQuestion = '';
         
        
        self.questionOption = model.QuestionOption.getId(id);
        if(self.questionOption):
            self.goodbye_message = self.questionOption.end_message;
            self.urlRedirect = self.questionOption.redirect_url;
        
        return dict(page='goodbye',success=self.success, message = self.message,goodbye = self.goodbye_message,nextQuestion = self.nextQuestion,urlRedirect = self.urlRedirect);
    
    
    @expose('pollandsurvey.templates.view.resultquestion')
    def showResult(self,id=0  ,ready='yes' , came_from=lurl('/'),   *args, **kw): 
        
        reload(sys).setdefaultencoding("utf-8");
        
        if not request.identity:
            login_counter = request.environ.get('repoze.who.logins', 0) + 1
            redirect('/login',   params=dict(came_from=came_from, __logins=login_counter))
        #userid = request.identity['repoze.who.userid']
        
        print id;
        self.data = self.utility.spritValue(id,".")
        
        if len(self.data) != 2:
            return dict(questions = []);
        
        log.info('preview id : ' + str(id) + '  ready : ' + str(ready));
         
        
        
        self.header = '';
        self.footer = '';
        self.nextQuestion ='';
        self.template ='';
        self.questionOption = model.QuestionOption.getId(self.data[0]);
        if self.questionOption : 
            #log.info('expire date : ' + str(self.questionOption.expire_date) + ', current date : ' +  str(datetime.now()));
            
            
            #if datetime.now() <= self.questionOption.expire_date:
            #    log.info('not expire');
            #else :
            #    log.info('expire');
            
            
            if str(ready).lower() == 'no':    
                #check have welcome page
                if( not self.utility.isEmpty(self.questionOption.welcome_message) ) :
                    redirect(request.path_info + '/welcome?id='+ str(self.questionOption.id_question_option) );
                else:
                    self.template =   self.questionOption.theme.template;
                    #override_template(PreviewController.index, self.template) ;    
                    
            elif str(ready).lower() == 'yes':
                self.header = self.questionOption.header_message;
                self.footer = self.questionOption.footer_message;
                self.urlName = self.utility.spritValue(request.path_info,'/');
                self.template =   self.questionOption.theme.template
                if(len(self.urlName) >= 1 ) :
                    self.nextQuestion = '/' + self.urlName[0] + '/saveQuestion' + '?id='+ str(self.questionOption.id_question_option);
                
                
                """if(self.template is not None and len(self.template) > 0):    
                    log.info("template used : %s",  self.template );                     
                    override_template(PreviewController.index, self.template) 
                """    
            print "return values";       
                            
        
        return dict(page='view',header = self.header, 
                    footer = self.footer, 
                    action = self.nextQuestion,
                    template= self.template,
                    urldata = self.URL_GETDATAQUESTION.format(id) , 
                    idproject = id ,
                    shownavigator = bool(self.questionOption.show_navigator),
                    idresp = ""); 
Ejemplo n.º 5
0
class AnswerController(BaseController):#RestController): #
    
    def __init__(self):
        self.utility = Utility();
        self.urlUtility = URLUtility();
         
        self.UPLOAD_DIR = config['path_upload_file'] ;
        self.CONVERT_DIR = config['path_convert_file'] ;
        
        self.utility.createPathFile(self.CONVERT_DIR);
        self.utility.createPathFile(self.UPLOAD_DIR);
        self.sourceHtml = model.SystemEnvironment.getScoreViewHtml();
        
        dh = LogDBHandler( config=config,request=request);        
        log.addHandler(dh)
        
       
    
    @expose()
    def _default(self, *args, **kw):
        return 'This page is not ready'
    
    def _before(self, *args, **kw):
        tmpl_context.project_name = 'pollandsurvey'
    
        

    
    @expose('pollandsurvey.templates.view.multiquestion')
    def questionnaire(self,key=0,ready='no',**kw):
        reload(sys).setdefaultencoding('utf8')
        log.info("key %s",key);
        
        self.header = '';
        self.footer = '';
        self.nextQuestion ='';
        self.template ='';
        
        
        self.respondents = model.Respondents.getByKey(key);
        if self.respondents :
            log.info("find key %s",key);
            self.urlServer =  model.SystemEnvironment.getServerUrl();
            
            self.urlReply = self.urlUtility.URL_REPLY.format(self.urlServer, str(self.respondents.id_question_project), str(self.respondents.id_question_option), str(self.respondents.id_voter))  ; #request.application_url
            log.info("iframe url to %s",self.urlReply);
            
            #check finish
            isRedirect = True
            if(self.respondents  is not None and self.respondents.finished == 1):
                log.info('voter finished in id public : %s', str(self.respondents.id_question_option) );
                self.redirect = self.urlUtility.URL_THANKYOU;
                if (isRedirect):
                    redirect(self.urlUtility.URL_THANKYOU) ;
            elif (self.respondents is None):
                log.error("System can not find idVoter : %s , idPublic : %s" , str(self.respondents.id_voter), str(self.respondents.id_question_option));
                redirect(self.urlUtility.URL_THANKYOU) ;
            
            #check Expire
            self.questionOption,self.redirect = self.__checkOptionExpired(self.respondents.id_question_option);    
                
            
            log.info("id_question_option : %s ", str(self.questionOption.id_question_option));
            log.info("ready : %s ", str(ready));
            
            if str(ready).lower() == 'no':    
                #check have welcome page
                if( not self.utility.isEmpty(self.questionOption.welcome_message) ) :
                    #redirect('/ans' + '/welcome?id='+ str(self.questionOption.id_question_option) );
                    log.info("show message welcome : ");
                    redirect( self.urlUtility.URL_WELCOME.format(key = str(key)) )#   self.URL_WELCOME_NEW.format(str(key))  );
                else:
                    log.info("show questionnaire : ");
                    self.template = self.questionOption.theme.template;
                    override_template(AnswerController.questionnaire, self.template) ;    
                    
            elif str(ready).lower() == 'yes':
                self.header = self.questionOption.header_message;
                self.footer = self.questionOption.footer_message;
                self.urlName = self.utility.spritValue(request.path_info,'/');
                self.template = self.questionOption.theme.template
                if(len(self.urlName) >= 1 ) :
                    self.nextQuestion = '/' + self.urlName[0] + '/saveQuestion' + '?id='+ str(self.questionOption.id_question_option);
                
                
                if(self.template is not None and len(self.template) > 0):    
                    log.info("template used : %s",  self.template );     
                    
                    override_template(AnswerController.questionnaire, self.template) 
                    
                self.ip=request.environ.get("X_FORWARDED_FOR", request.environ["REMOTE_ADDR"]);
                self.browser = request.environ.get('HTTP_USER_AGENT');
                
               
            
        else:
            log.warning("find not found key %s",str(key));
            redirect(self.urlUtility.URL_EXPIRED) ;       
        
        return dict(page='view',header = Markdown(self.header).convert() , 
                        footer = Markdown(self.footer).convert()  , 
                        action = self.nextQuestion,template= self.template,
                        #urldata = self.URL_GETDATAQUESTION.format(self.idPublic),
                        urldata =  self.urlUtility.URL_GETDATAQUESTION.format(key=str(key)),#  self.URL_GETDATAQUESTION.format(key),  
                        idproject = self.questionOption.id_question_option ,
                        idresp = self.respondents.id_respondents,
                        shownavigator = bool(self.questionOption.show_navigator) ); 
    
     
    
    @expose('pollandsurvey.templates.view.welcome')
    def welcome(self,key=0,came_from=lurl('/')):
        reload(sys).setdefaultencoding("utf-8");
         
        
        log.info('preview id : ' + str(key));
        
        self.respondents = model.Respondents.getByKey(key);
        #self.idProject,self.idPublic,self.idVoter,self.redirect = self.__checkExpire(id);
        if (self.respondents):
        
            self.welcome_message = '';
            
            self.questionOption,self.redirect = self.__checkOptionExpired(self.respondents.id_question_option);
                    
            self.welcome_message= self.questionOption.welcome_message;
            self.nextQuestion  = '';
             
            self.urlName = self.utility.spritValue(request.path_info,'/');
             
            if(len(self.urlName) >= 1 ) :
                #self.nextQuestion = '/' + self.urlName[0]+ '?id='+ str(self.questionOption.id_question_option);
                #self.nextQuestion = '/' + 'ans/reply/'+  str(self.questionOption.id_question_option);
                #self.nextQuestion = self.URL_REPLY.format(id)
                self.nextQuestion = self.urlUtility.URL_REPLY_QUESTIONNAIRE.format(key=str(key)); 
        else:
            log.error("find not found respondent with key %s ", str(key));
            redirect(self.urlUtility.URL_EXPIRED) ;       
            
               
            
        #self.welcome_message
        return dict(page='view', ready = 'yes',welcome_message = Markdown(self.welcome_message).convert(), nextQuestion= self.nextQuestion);
    
            
     
    
    @expose('pollandsurvey.templates.view.goodbye')
    def thankyou(self,key=0,came_from=lurl('/')):
        reload(sys).setdefaultencoding("utf-8");
        
        log.info('preview id : ' + str(key));
        
        
        #self.idProject,self.idPublic,self.idVoter,self.redirect = self.__checkExpire(key);
        self.respondents = model.Respondents.getByKey(key);
        if(self.respondents):
            self.idProject=self.respondents.id_question_project;
            self.idPublic=self.respondents.id_question_option;
            self.idVoter=self.respondents.id_voter;
            
            
            self.goodbye = '';
            
            self.questionOption,self.redirect = self.__checkOptionExpired(self.idPublic);
                    
            self.goodbye= self.questionOption.end_message;
            self.nextQuestion  = '';
            self.urlRedirect = ''; 
            self.urlName = self.utility.spritValue(request.path_info,'/');
            
            #self.respondents  = model.Respondents.getByVoterIdAndPublicId(self.idVoter,self.idPublic); 
            
            self.project = model.QuestionProject.getId(self.idProject) 
            
            self.projectType = self.project.id_question_project_type;
            
            if(len(self.urlName) >= 1 ) :
              
                self.urlRedirect = self.questionOption.redirect_url
        else:
            log.error("find not found respondent with key %s ", str(key));
            redirect(self.urlUtility.URL_EXPIRED) ;  
            
    
        return dict(page='goodbye', ready = 'yes',goodbye = Markdown(self.goodbye).convert(),nextQuestion = self.nextQuestion ,urlRedirect= self.urlRedirect,
                    option=self.questionOption,projectType = self.projectType,imageId = self.respondents.id_respondents);
    
    
    @expose('json')
    def getDataPreview(self, key=0,   *args, **kw): 
        reload(sys).setdefaultencoding("utf-8");
        log.info("function getDataPreview");
        
        log.info("key = %s", str(key));
        
        self.respondents = model.Respondents.getByKey(key);
        #idProject = kw.get('idProject');
        
        self.idProject=self.respondents.id_question_project;
        self.idPublic=self.respondents.id_question_option;
        self.idVoter=self.respondents.id_voter;
        self.redirect=None;
        
        #self.idProject,self.idPublic,self.idVoter,self.redirect = self.__checkExpire(self.respondents.id_question_project);
        
        log.info("idProject : %s,  idPublic : %s, idVoter : %s, redirect : %s  ", str(self.idProject), str(self.idPublic), str(self.idVoter), str(self.redirect));
       
        
        #self.respondents  = model.Respondents.getByVoterIdAndPublicId(self.idVoter,self.idPublic);    
        self.questionOption = model.QuestionOption.getId(self.idPublic);
        
        
        #get old question
        self.listReply = model.RespondentReply.listQuestionForUser(self.respondents.id_respondents);
        
        self.respondents.respondent_data = datetime.now();
        
        question = [];
        log.info("Random Question And Answer : " );
        if( len(self.listReply) >0 ):
            log.info("Random new");
            question = self.__getQuestionFromReply(self.listReply,self.questionOption);
            question = self.__randomQuestionAndAnswer(question,self.questionOption); #add 
        else:
             
            question = self.__getQuestion(self.idPublic,self.questionOption);
            log.info("get new Question and Random new, len question : %s", str(len(question)));
            #save to database
            question = self.__randomQuestionAndAnswer(question,self.questionOption);   #add
            model.RespondentReply.createQuestionForUser(question,self.respondents.id_respondents);
            log.info("Create Question And Answer to user : "******"utf-8");
        log.info( "function save Question answer");
        log.info( request.body);
        self.df = json.loads(request.body, encoding=request.charset);
        
        self.listAnswer = self.df.get('value');
        self.finished =self.df.get('finished');
        self.redirect = '';
        
         
        
        #from urlparse import urlparse;
        #parsed = urlparse(request.environ.get("HTTP_REFERER" ))
        #print 'path url : ', parsed.path
        if (len(self.listAnswer) >0):
            for value in self.listAnswer:
                 
                if(value):
                    self.idPublic =  value.get('idproject');
                    self.idResp =  value.get('idresp');
                    self.idQuestion = value.get('id');
                    self.values = value.get('value');
                    
                    print value.get('type');
                    
                    self.questionOption,self.redirect = self.__checkOptionExpired(self.idPublic,False);#check Expired
            
                    self.respondent,self.redirect = self.__checkRespondentFinished( None,  None,self.idResp,False);#check finished
                    
                    if(self.respondent):
                        self.question = model.Question.getById(self.idQuestion);#getQuestion
                         
                        self.respondent.finished = self.finished;
                        self.respondent.finished_date = datetime.now();
                        if(self.question):
                            self.respondentreply = model.RespondentReply.getByRespondentAndQuestion(self.idResp,self.idQuestion);
                            
                            if (self.respondentreply is None):
                                self.respondentreply = model.RespondentReply();
                                self.respondentreply.id_respondents = self.idResp;
                                self.respondentreply.id_question = self.idQuestion;
                                self.respondentreply.save();
                                log.info("save answer respondentreply : " +str( self.respondentreply.id_respondents ) + " and " + str( self.respondentreply.id_question ) + " success");
                                
                            
                            if (len(self.respondentreply.childenAnswer) == 0):
                                #save
                                for v in self.values:
                                    self.replyquestion = model.ReplyBasicQuestion(); 
                                    self.replyquestion.id_resp_reply = self.respondentreply.id_resp_reply; #error
                                    self.replyquestion.id_basic_data = v.get('id')
                                    self.replyquestion.answer_text = v.get('value')
                                    self.replyquestion.save();
                                 
                                    log.info("save answer replyquestion : " +str( self.respondentreply.id_resp_reply ) + " and " + str( self.replyquestion.id_basic_data ) + " success");
                                
                                
                            else:
                                log.info('user %s do this question : %s',self.idResp,self.idQuestion);
                                
                        else:
                            log.info('find not found question id : : %s',self.idQuestion);
                            
                    else:
                        log.info('find not found respondent id : : %s',self.idResp);
                    
            #calculate score        
            if(self.finished):  
                log.info('finished : calculate score ');
                model.Respondents.updateScoreByIdRespondents(self.idResp);
                self.__createScoreFile(self.idResp);
                
                self.redirect = self.urlUtility.URL_GOODBYE.format( key=  self.utility.splitNameWithOutExtention(basename(request.environ.get("HTTP_REFERER" )))  );
               
                    
                    
      
        return dict(success = True,redirect = self.redirect, finished = self.finished  );
    
     
    
    def __checkExpire(self,id):
        #sprint 10.2.1.0.html     idproject.idpublic.idvoter.
        self.value = self.utility.spritValue(id,'.');
         
        self.idProject =0;
        self.idPublic = 0;
        self.idVoter = 0;
        
        self.redirect = '';
        
        
        
        if(len(self.value)  == 4):
            self.idProject =self.value[0];
            self.idPublic = self.value[1];
            self.idVoter = self.value[2];
        else:
            self.idProject =None;
            self.idPublic = None;
            self.idVoter = None;
            
            log.info('parameter not have 4 parameter : %s', ','.join(self.value));
            self.redirect = self.urlUtility.URL_EXPIRED;
            redirect(self.urlUtility.URL_EXPIRED) ;
        
        self.voter = model.Voter.getId(self.idVoter);
        if(self.voter is None):
            log.info('find not voter in id : %s',self.idVoter);
            self.redirect = self.urlUtility.URL_HOME;
            redirect(self.urlUtility.URL_HOME) ;
        
        self.project = model.QuestionProject.getId(self.idProject);
        if(self.project is None):
            log.info('find not project in id project : %s',self.idProject);
            self.redirect = self.urlUtility.URL_HOME;
            redirect(self.urlUtility.URL_HOME) ;
            
        return self.idProject,self.idPublic,self.idVoter, self.redirect;
            
    def __checkOptionExpired(self,idPublic,isRedirect = True):
        #print 'public option id ',idPublic;
        self.questionOption = model.QuestionOption.getId( idPublic);           
        self.redirect = '';
        if  self.questionOption is None or ( not self.utility.isActiveFromDate(None,self.questionOption.activate_date,self.questionOption.expire_date) ):
            self.redirect = self.urlUtility.URL_EXPIRED;
            if (isRedirect):
                #print 'redirect ',self.URL_EXPIRED; 
                redirect(self.urlUtility.URL_EXPIRED) ;
      
                
        #print 'id option : ', self.questionOption.welcome_message;
        
        return self.questionOption,self.redirect;    
            
    def __checkRespondentFinished(self,idVoter,idPublic,idResp,isRedirect = True):
        self.respondent = None;
        self.redirect = '';
        if(idVoter and idPublic):
            self.respondent = model.Respondents.getByVoterAndPublicId(idVoter,idPublic);
        elif (idResp):
            self.respondent = model.Respondents.getId(idResp);
            
        if(self.respondent  is not None and self.respondent.finished == 1):
            log.info('voter finished in id public : %s',self.idPublic);
            self.redirect = self.urlUtility.URL_THANKYOU;
            if (isRedirect):
                redirect(self.urlUtility.URL_THANKYOU) ;
        elif (self.respondent is None):
            log.error("System can not find idVoter : %s , idPublic : %s" , idVoter, idPublic);
            
            redirect(self.urlUtility.URL_THANKYOU) ;
        
        return self.respondent,self.redirect;
    
    def __getQuestion(self,idPublic,questionOption):
        
        question = [];
        #get Project Option
        
        if self.questionOption :
            #get Question 
            self.listQuestions = model.Question.getByProjectId(questionOption.id_question_project);
            
            
            #get to object json
            for self.question in self.listQuestions:
                question.append(self.question.to_json(randomAnswer = questionOption.random_answer));
            
            
            
            #clear sequence 
               
        return question ;
    
    def __getQuestionFromReply(self,reply,questionOption):
        question = [];
        for re in reply:
            #re.question
            question.append(re.question.to_json(randomAnswer= questionOption.random_answer));
        
        return question;
    
    def __randomQuestionAndAnswer(self,question,questionOption):
        #option Randon Question
        if( questionOption.id_fix_random_type == 2):
            question = random.sample(question,len(question));#,self.questionOption.use_question_no );
        
        
        question = question[0:questionOption.use_question_no];
            
        return question;
    
    def __setSequenceQuestion(self,question):
        row = 1;
        for q in question:
            q['seq'] = row;
            row = row +1; 
        row =None;
        
        return question;
    
    def __createScoreFile(self,idResp):
        
        self.respondent = model.Respondents.getId(idResp);
        self.score = model.Respondents.getScoreByIdRespondents(self.idResp);
        self.voter = self.respondent.voter;
        
        self.convertHtml = ConvertHtml2Pdf();
        self.convertPNG = ConvertPdf2image();
        
        self.sourceHtml = model.SystemEnvironment.getScoreViewHtml();

        values = {};
        values['name'] = str(self.voter.prefix + ' ' + self.voter.firstname + ' ' + self.voter.lastname);
        values['score'] = str(self.score);
        
        self.outputPDFFilename = ("{0}\{1}-{2}-{3}-{4}.pdf").format(str(self.CONVERT_DIR), str(self.respondent.id_respondents), str(self.respondent.id_voter), str(self.respondent.id_question_project), str(self.respondent.id_question_option))  ;
        self.outputPNGFilename = ("{0}\{1}-{2}-{3}-{4}.png").format(str(self.CONVERT_DIR), str(self.respondent.id_respondents), str(self.respondent.id_voter), str(self.respondent.id_question_project), str(self.respondent.id_question_option))  ;
        
        self.result = self.convertHtml.convertHtmlToPdf(values, self.sourceHtml, self.outputPDFFilename);
        log.info("convert file %s is %s" %(self.outputPDFFilename, self.result));
        if(self.result == 0):
            self.result = self.convertPNG.convert(self.outputPDFFilename, self.outputPNGFilename)
            log.info("convert file %s is %s" %(self.outputPNGFilename, self.result));
            if(self.result):
                log.info("save image file %s is %s" %(self.outputPNGFilename, self.result));
                with open(self.outputPNGFilename,"rb") as f:
                    self.respondent.image_file = f.read(); 
        else:
            log.error("convert html to pdf error with id_resp=%s" %idResp)