diff --git a/addons/survey/controllers/main.py b/addons/survey/controllers/main.py index 8988b12ae1f..e75c0f441d7 100644 --- a/addons/survey/controllers/main.py +++ b/addons/survey/controllers/main.py @@ -106,11 +106,9 @@ class WebsiteSurvey(http.Controller): return request.redirect('/survey/fill/%s/%s' % (survey.id, user_input.token)) - - # Survey displaying @website.route(['/survey/fill//'], - type='http', auth='public', multilang=True) + type='http', auth='public', multilang=True) def fill_survey(self, survey, token, **post): '''Display and validates a survey''' cr, uid, context = request.cr, request.uid, request.context @@ -173,28 +171,43 @@ class WebsiteSurvey(http.Controller): return request.website.render('survey.finished', {'survey': survey}) elif user_input.state == 'skip': page, page_nr, last = self.find_next_page(survey, user_input) + data = {'survey': survey, 'page': page, 'page_nr': page_nr, 'token': user_input.token} if last: data.update({'last': True}) - data = {'survey': survey, 'page': page, 'page_nr': page_nr, 'token': user_input.token} else: return request.website.render("website.403") # @website.route(['/survey/prefill/'], type='json', auth='public', multilang=True): # @website.route(['/survey/validate/'], - # type='json', auth='public', multilang=True) + # type='http', auth='public', multilang=True) + # def validate(self, survey, **post): + # _logger.debug('Incoming data: %s', post) + # page_id = int(post['page_id']) + # cr, uid, context = request.cr, request.uid, request.context + # questions_obj = request.registry['survey.question'] + # questions_ids = questions_obj.search(cr, uid, [('page_id', '=', page_id)], context=context) + # questions = questions_obj.browse(cr, uid, questions_ids, context=context) + # errors = {} + # for question in questions: + # answer_tag = "%s_%s_%s" % (survey.id, page_id, question.id) + # errors.update(self.validate_question(question, post, answer_tag)) + # ret = {} + # if (len(errors) != 0): + # ret['errors'] = errors + # return json.dumps(ret) @website.route(['/survey/submit/'], - type='http', auth='public', multilang=True) + type='http', auth='public', multilang=True) def submit(self, survey, **post): _logger.debug('Incoming data: %s', post) page_id = int(post['page_id']) cr, uid, context = request.cr, request.uid, request.context questions_obj = request.registry['survey.question'] - questions_ids = questions_obj.search(cr, uid, [('page_id', '=', page_id)], - context=context) + questions_ids = questions_obj.search(cr, uid, [('page_id', '=', page_id)], context=context) questions = questions_obj.browse(cr, uid, questions_ids, context=context) + # Answer validation errors = {} for question in questions: answer_tag = "%s_%s_%s" % (survey.id, page_id, question.id) @@ -202,33 +215,43 @@ class WebsiteSurvey(http.Controller): ret = {} if (len(errors) != 0): + # Return errors messages to webpage ret['errors'] = errors else: - cr, uid, context = request.cr, request.uid, request.context + # Store answers into database user_input_obj = request.registry['survey.user_input'] + user_input_line_obj = request.registry['survey.user_input_line'] try: - user_input_id = user_input_obj.search(cr, uid, [('token', '=', post['token'])])[0] + user_input_id = user_input_obj.search(cr, uid, [('token', '=', post['token'])], context=context)[0] except KeyError: # Invalid token return request.website.render("website.403") - - - - # TODO - # Store here data if allowed - - - + user_input_obj.write(cr, uid, [user_input_id], {'state': 'skip'}, context=context) + for question in questions: + answer_tag = "%s_%s_%s" % (survey.id, page_id, question.id) + vals = { + 'user_input_id': user_input_id, + 'question_id': question.id, + 'page_id': page_id, + 'survey_id': survey.id, + } + if answer_tag in post: + if question.type == 'textbox': + vals.update({'answer_type': 'text', 'value_text': post[answer_tag]}) + pass + else: + vals.update({'skipped': True}) + user_input_line_obj.create(cr, uid, vals, context=context) ret['redirect'] = '/survey/fill/%s/%s' % (survey.id, post['token']) return json.dumps(ret) # Printing routes @website.route(['/survey/print//'], - type='http', auth='user', multilang=True) + type='http', auth='user', multilang=True) def print_empty_survey(self, survey=None, **post): '''Display an empty survey in printable view''' return request.website.render('survey.survey_print', - {'survey': survey, 'page_nr': 0}) + {'survey': survey, 'page_nr': 0}) # Pagination @@ -243,12 +266,12 @@ class WebsiteSurvey(http.Controller): last = False page_nr = 0 nextpage = None - for page in survey.pages_ids: + for page in survey.page_ids: if page in filled_pages: page_nr = page_nr + 1 else: nextpage = page - if page_nr == len(survey.pages_ids): + if page_nr == len(survey.page_ids): last = True return nextpage, page_nr, last diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 4d798303e03..1e6cbd44da4 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -597,7 +597,7 @@ class survey_user_input(osv.osv): 'email': fields.char("E-mail", readonly=1), # The answers ! - 'user_input_line_ids': fields.one2many('survey.user_input.line', + 'user_input_line_ids': fields.one2many('survey.user_input_line', 'user_input_id', 'Answers'), } _defaults = { @@ -729,26 +729,26 @@ class survey_user_input(osv.osv): class survey_user_input_line(osv.osv): - _name = 'survey.user_input.line' + _name = 'survey.user_input_line' _description = 'Survey User Input Line' _rec_name = 'date_create' _columns = { 'user_input_id': fields.many2one('survey.user_input', 'User Input', ondelete='cascade', required=1), - 'survey_id': fields.related('user_input_id', 'survey_id', - type="many2one", relation="survey.survey", string='Survey'), 'question_id': fields.many2one('survey.question', 'Question', ondelete='restrict'), 'page_id': fields.related('question_id', 'page_id', type='many2one', relation='survey.page', string="Page"), + 'survey_id': fields.related('user_input_id', 'survey_id', + type="many2one", relation="survey.survey", string='Survey'), 'date_create': fields.datetime('Create Date', required=1), # drop 'skipped': fields.boolean('Skipped'), - 'answer_type': fields.selection([('textbox', 'Text box'), - ('numerical_box', 'Numerical box'), + 'answer_type': fields.selection([('text', 'Text'), + ('number', 'Number'), + ('date', 'Date'), ('free_text', 'Free Text'), - ('datetime', 'Date and Time'), - ('checkbox', 'Checkbox')], - 'Answer Type', required=1), + ('suggestion', 'Suggestion')], + 'Answer Type'), 'value_text': fields.char("Text answer"), 'value_number': fields.float("Numerical answer"), 'value_date': fields.datetime("Date answer"), diff --git a/addons/survey/views/survey_views.xml b/addons/survey/views/survey_views.xml index cd28b19996f..56ce1cf28c1 100644 --- a/addons/survey/views/survey_views.xml +++ b/addons/survey/views/survey_views.xml @@ -37,8 +37,8 @@
-