[IMP] Anwser storage (part)

bzr revid: rim@openerp.com-20131128074418-gwdavf4iq47jlh2q
This commit is contained in:
Richard Mathot (OpenERP)
2013-11-28 08:44:18 +01:00
parent 7f81685798
commit a2ed06f6be
3 changed files with 56 additions and 33 deletions
+45 -22
View File
@@ -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/<model("survey.survey"):survey>/<string:token>'],
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/<model("survey.survey"):survey>'], type='json', auth='public', multilang=True):
# @website.route(['/survey/validate/<model("survey.survey"):survey>'],
# 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/<model("survey.survey"):survey>'],
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/<model("survey.survey"):survey>/'],
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
+9 -9
View File
@@ -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"),
+2 -2
View File
@@ -37,8 +37,8 @@
</header>
<sheet>
<div class="oe_right oe_button_box" name="button_box">
<button name="action_survey_resent" states="new,skip" string="Resent the invitation" type="object" icon="gtk-redo"/><br/>
<button name="action_preview" states="done,skip" string="Preview" type="object" icon="gtk-zoom-fit"/>
<button name="action_survey_resent" states="new,skip" string="Resent invitation" type="object" icon="gtk-redo"/><br/>
<!-- <button name="action_preview" states="done,skip" string="Preview" type="object" icon="gtk-zoom-fit"/> -->
<button name="action_print_response" states="done,skip" string="Print response" type="object" icon="gtk-print"/>
</div>
<group col="2">