diff options
| author | Thibault Delavallée <tde@odoo.com> | 2018-11-30 11:08:45 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2019-01-14 15:22:18 +0000 |
| commit | ee2631cd514d8339d40dbab38b714371c428ff7b (patch) | |
| tree | d39d43437d2153d256f8b60bc26a049a9be94074 | |
| parent | 08a9391a84ab372e54cbffc0ecf7abc8dad9d2aa (diff) | |
[REF] survey: clean survey routes definitions
Purpose of this commit is to ease understanding or routes. In this commit
we make token a parameter where it is optional and force is where it is
not; we remove unnecessary list on routes; we rename some controller methods
to ease understanding;
Code calling those URLs is adapted accordingly. No functional change should
occur with this commit.
Some routes are json-http-mixed as a result of old implementation. Those
will be updated in future tasks when cleaning the templates and routes.
This commit is linked to task ID 1911586 and PR #28986.
| -rw-r--r-- | addons/survey/controllers/main.py | 89 | ||||
| -rw-r--r-- | addons/survey/models/survey_survey.py | 4 | ||||
| -rw-r--r-- | addons/survey/models/survey_user.py | 2 | ||||
| -rw-r--r-- | addons/survey/tests/test_survey_flow.py | 8 | ||||
| -rw-r--r-- | addons/survey/views/survey_templates.xml | 24 |
5 files changed, 60 insertions, 67 deletions
diff --git a/addons/survey/controllers/main.py b/addons/survey/controllers/main.py index 80ee03d0dcf..28a5ff721a7 100644 --- a/addons/survey/controllers/main.py +++ b/addons/survey/controllers/main.py @@ -58,13 +58,11 @@ class Survey(http.Controller): 'survey_id': survey.id, 'test_entry': True }) - return request.redirect('/survey/start/%s/%s' % (survey.id, user_input.token)) + return request.redirect('/survey/start/%s?token=%s' % (survey.id, user_input.token)) return werkzeug.utils.redirect('/') - @http.route(['/survey/start/<model("survey.survey"):survey>', - '/survey/start/<model("survey.survey"):survey>/<string:token>'], - type='http', auth='public', website=True) - def survey_start(self, survey, token=None, **post): + @http.route('/survey/start/<model("survey.survey"):survey>', type='http', auth='public', website=True) + def survey_start(self, survey, token=None): """ Start a survey by providing a token linked to an answer or generate a new token if access is allowed """ UserInput = request.env['survey.user_input'] @@ -97,12 +95,8 @@ class Survey(http.Controller): else: return request.redirect('/survey/fill/%s/%s' % (survey.id, user_input.token)) - # Survey displaying - @http.route(['/survey/fill/<model("survey.survey"):survey>/<string:token>', - '/survey/fill/<model("survey.survey"):survey>/<string:token>/<string:prev>'], - type='http', auth='public', website=True) - def fill_survey(self, survey, token, prev=None, **post): - '''Display and validates a survey''' + @http.route('/survey/fill/<model("survey.survey"):survey>/<string:token>', type='http', auth='public', website=True) + def survey_display_page(self, survey, token, prev=None): Survey = request.env['survey.survey'] UserInput = request.env['survey.user_input'] @@ -131,8 +125,8 @@ class Survey(http.Controller): return request.render('survey.survey', data) elif user_input.state == 'done': # Display success message return request.render('survey.sfinished', {'survey': survey, - 'token': token, - 'user_input': user_input}) + 'token': token, + 'user_input': user_input}) elif user_input.state == 'skip': flag = (True if prev and prev == 'prev' else False) page, page_nr, last = Survey.next_page(user_input, user_input.last_displayed_page_id.id, go_back=flag) @@ -148,17 +142,15 @@ class Survey(http.Controller): else: return request.render("survey.403", {'survey': survey}) - # AJAX prefilling of a survey - @http.route(['/survey/prefill/<model("survey.survey"):survey>/<string:token>', - '/survey/prefill/<model("survey.survey"):survey>/<string:token>/<model("survey.page"):page>'], - type='http', auth='public', website=True) - def prefill(self, survey, token, page=None, **post): + @http.route('/survey/prefill/<model("survey.survey"):survey>/<string:token>', type='http', auth='public', website=True) + def survey_get_answers(self, survey, token, page_id=None): + """ TDE NOTE: original comment: # AJAX prefilling of a survey -> AJAX / http ?? """ UserInputLine = request.env['survey.user_input_line'] ret = {} # Fetch previous answers - if page: - previous_answers = UserInputLine.sudo().search([('user_input_id.token', '=', token), ('page_id', '=', page.id)]) + if page_id: + previous_answers = UserInputLine.sudo().search([('user_input_id.token', '=', token), ('page_id', '=', page_id)]) else: previous_answers = UserInputLine.sudo().search([('user_input_id.token', '=', token)]) @@ -190,10 +182,9 @@ class Survey(http.Controller): _logger.warning("[survey] No answer has been found for question %s marked as non skipped" % answer_tag) return json.dumps(ret, default=str) - # AJAX scores loading for quiz correction mode - @http.route(['/survey/scores/<model("survey.survey"):survey>/<string:token>'], - type='http', auth='public', website=True) - def get_scores(self, survey, token, page=None, **post): + @http.route('/survey/scores/<model("survey.survey"):survey>/<string:token>', type='http', auth='public', website=True) + def survey_get_scores(self, survey, token, page_id=None): + """ TDE NOTE: original comment: # AJAX scores loading for quiz correction mode -> AJAX / http ?? """ ret = {} # Fetch answers @@ -205,9 +196,9 @@ class Survey(http.Controller): ret.update({answer.question_id.id: tmp_score + answer.quizz_mark}) return json.dumps(ret) - # AJAX submission of a page - @http.route(['/survey/submit/<model("survey.survey"):survey>'], type='http', methods=['POST'], auth='public', website=True) - def submit(self, survey, **post): + @http.route('/survey/submit/<model("survey.survey"):survey>/<string:token>', type='http', methods=['POST'], auth='public', website=True) + def survey_submit(self, survey, token, **post): + """ TDE NOTE: original comment: # AJAX submission of a page -> AJAX / http ?? """ _logger.debug('Incoming data: %s', post) page_id = int(post['page_id']) questions = request.env['survey.question'].search([('page_id', '=', page_id)]) @@ -225,7 +216,7 @@ class Survey(http.Controller): else: # Store answers into database try: - user_input = request.env['survey.user_input'].sudo().search([('token', '=', post['token'])], limit=1) + user_input = request.env['survey.user_input'].sudo().search([('token', '=', token)], limit=1) except KeyError: # Invalid token return request.render("survey.403", {'survey': survey}) user_id = request.env.user.id if user_input.input_type != 'link' else SUPERUSER_ID @@ -242,27 +233,23 @@ class Survey(http.Controller): else: vals.update({'state': 'skip'}) user_input.sudo(user=user_id).write(vals) - ret['redirect'] = '/survey/fill/%s/%s' % (survey.id, post['token']) + ret['redirect'] = '/survey/fill/%s/%s' % (survey.id, token) if go_back: - ret['redirect'] += '/prev' + ret['redirect'] += '?prev=prev' return json.dumps(ret) - # Printing routes - @http.route(['/survey/print/<model("survey.survey"):survey>', - '/survey/print/<model("survey.survey"):survey>/<string:token>'], - type='http', auth='public', website=True) - def print_survey(self, survey, token=None, **post): + @http.route('/survey/print/<model("survey.survey"):survey>', type='http', auth='public', website=True) + def survey_print(self, survey, token=None, **post): '''Display an survey in printable view; if <token> is set, it will grab the answers of the user_input_id that has <token>.''' - return request.render('survey.survey_print', - {'survey': survey, - 'token': token, - 'page_nr': 0, - 'quizz_correction': True if survey.quizz_mode and token else False}) - - @http.route(['/survey/results/<model("survey.survey"):survey>'], - type='http', auth='user', website=True) - def survey_reporting(self, survey, token=None, **post): + return request.render('survey.survey_print', { + 'survey': survey, + 'token': token, + 'page_nr': 0, + 'quizz_correction': True if survey.quizz_mode and token else False}) + + @http.route('/survey/results/<model("survey.survey"):survey>', type='http', auth='user', website=True) + def survey_report(self, survey, token=None, **post): '''Display survey Results & Statistics for given survey.''' result_template = 'survey.result' current_filters = [] @@ -275,12 +262,12 @@ class Survey(http.Controller): post.pop('finished') filter_finish = True if post or filter_finish: - filter_data = self.get_filter_data(post) + filter_data = self._get_filter_data(post) current_filters = survey.filter_input_ids(filter_data, filter_finish) filter_display_data = survey.get_filter_display_data(filter_data) return request.render(result_template, {'survey': survey, - 'survey_dict': self.prepare_result_dict(survey, current_filters), + 'survey_dict': self._prepare_result_dict(survey, current_filters), 'page_range': self.page_range, 'current_filters': current_filters, 'filter_display_data': filter_display_data, @@ -324,7 +311,7 @@ class Survey(http.Controller): # filter_finish: boolean => only finished surveys or not # - def prepare_result_dict(self, survey, current_filters=None): + def _prepare_result_dict(self, survey, current_filters=None): """Returns dictionary having values for rendering template""" current_filters = current_filters if current_filters else [] Survey = request.env['survey.survey'] @@ -336,14 +323,14 @@ class Survey(http.Controller): 'question': question, 'input_summary': Survey.get_input_summary(question, current_filters), 'prepare_result': Survey.prepare_result(question, current_filters), - 'graph_data': self.get_graph_data(question, current_filters), + 'graph_data': self._get_graph_data(question, current_filters), } page_dict['question_ids'].append(question_dict) result['page_ids'].append(page_dict) return result - def get_filter_data(self, post): + def _get_filter_data(self, post): """Returns data used for filtering the result""" filters = [] for ids in post: @@ -360,9 +347,9 @@ class Survey(http.Controller): total = ceil(total_record / float(limit)) return range(1, int(total + 1)) - def get_graph_data(self, question, current_filters=None): + def _get_graph_data(self, question, current_filters=None): '''Returns formatted data required by graph library on basis of filter''' - # TODO refactor this terrible method and merge it with prepare_result_dict + # TODO refactor this terrible method and merge it with _prepare_result_dict current_filters = current_filters if current_filters else [] Survey = request.env['survey.survey'] result = [] diff --git a/addons/survey/models/survey_survey.py b/addons/survey/models/survey_survey.py index 01e0b7b8eec..2e8e90b48fa 100644 --- a/addons/survey/models/survey_survey.py +++ b/addons/survey/models/survey_survey.py @@ -268,7 +268,7 @@ class Survey(models.Model): """ Open the website page with the survey form """ self.ensure_one() token = self.env.context.get('survey_token') - trail = "/%s" % token if token else "" + trail = "?token=%s" % token if token else "" return { 'type': 'ir.actions.act_url', 'name': "Start Survey", @@ -312,7 +312,7 @@ class Survey(models.Model): """ Open the website page with the survey printable view """ self.ensure_one() token = self.env.context.get('survey_token') - trail = "/" + token if token else "" + trail = "?token=%s" % token if token else "" return { 'type': 'ir.actions.act_url', 'name': "Print Survey", diff --git a/addons/survey/models/survey_user.py b/addons/survey/models/survey_user.py index 32250825bd3..4efe74a9c43 100644 --- a/addons/survey/models/survey_user.py +++ b/addons/survey/models/survey_user.py @@ -92,7 +92,7 @@ class SurveyUserInput(models.Model): 'type': 'ir.actions.act_url', 'name': "View Answers", 'target': 'self', - 'url': '%s/%s' % (self.print_url, self.token) + 'url': '%s?token=%s' % (self.print_url, self.token) } @api.multi diff --git a/addons/survey/tests/test_survey_flow.py b/addons/survey/tests/test_survey_flow.py index 12230d49194..537ab1d46d4 100644 --- a/addons/survey/tests/test_survey_flow.py +++ b/addons/survey/tests/test_survey_flow.py @@ -17,8 +17,8 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): def _access_page(self, survey, token): return self.url_open('/survey/fill/%s/%s' % (survey.id, token)) - def _access_submit(self, survey, post_data): - return self.url_open('/survey/submit/%s' % survey.id, data=post_data) + def _access_submit(self, survey, token, post_data): + return self.url_open('/survey/submit/%s/%s' % (survey.id, token), data=post_data) def _find_csrf_token(self, text): csrf_token_re = re.compile("(input.+csrf_token.+value=\")([_a-zA-Z0-9]{51})", re.MULTILINE) @@ -108,7 +108,7 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): page0_q1.id: {'value': [44.0]}, } post_data = self._format_submission_data(page_0, answer_data, {'csrf_token': csrf_token, 'token': answer_token, 'button_submit': 'next'}) - r = self._access_submit(survey, post_data) + r = self._access_submit(survey, answer_token, post_data) self.assertResponse(r, 200) answers.invalidate_cache() # TDE note: necessary as lots of sudo in controllers messing with cache @@ -127,7 +127,7 @@ class TestSurveyFlow(common.SurveyCase, HttpCase): page1_q0.id: {'value': [page1_q0.labels_ids.ids[0], page1_q0.labels_ids.ids[1]]}, } post_data = self._format_submission_data(page_1, answer_data, {'csrf_token': csrf_token, 'token': answer_token, 'button_submit': 'next'}) - r = self._access_submit(survey, post_data) + r = self._access_submit(survey, answer_token, post_data) self.assertResponse(r, 200) answers.invalidate_cache() # TDE note: necessary as lots of sudo in controllers messing with cache diff --git a/addons/survey/views/survey_templates.xml b/addons/survey/views/survey_templates.xml index 203c7f77d3b..2b8149d37f0 100644 --- a/addons/survey/views/survey_templates.xml +++ b/addons/survey/views/survey_templates.xml @@ -26,7 +26,7 @@ <h1>Thank you!</h1> <div t-field="survey.thank_you_message" class="oe_no_empty" /> <div t-if='survey.quizz_mode'>You scored <t t-esc="user_input.quizz_score" /> points.</div> - <div>If you wish, you can <a t-att-href="'/survey/print/%s/%s' % (slug(survey), token)">review your answers</a>.</div> + <div>If you wish, you can <a t-att-href="'/survey/print/%s?token=%s' % (slug(survey), token)">review your answers</a>.</div> </div> </div> </div> @@ -54,7 +54,9 @@ <div class="container"> <div class="jumbotron mt32"> <h1>Login required</h1> - <p>This survey is open only to registered people. Please <a t-attf-href="/web/login?redirect=%2Fsurvey%2Fstart%2F#{ slug(survey) }%2F#{token}">log in</a>.</p> + <p>This survey is open only to registered people. Please + <a t-att-href="'/web/login?redirect=%s' % ('/survey/start/%s?token=%s' % (survey, token))">log in</a>. + </p> </div> </div> </div> @@ -167,7 +169,11 @@ <div t-field='page.description' class="oe_no_empty"/> </div> - <form role="form" method="post" class="js_surveyform" t-att-name="'%s_%s' % (survey.id, page.id)" t-att-action="'/survey/fill/%s/%s' % (slug(survey), token)" t-att-data-prefill="'/survey/prefill/%s/%s/%s' % (slug(survey), token, slug(page))" t-att-data-validate="'/survey/validate/%s' % (slug(survey))" t-att-data-submit="'/survey/submit/%s' % (slug(survey))"> + <form role="form" method="post" class="js_surveyform" t-att-name="'%s_%s' % (survey.id, page.id)" + t-att-action="'/survey/fill/%s/%s' % (slug(survey), token)" + t-att-data-prefill="'/survey/prefill/%s/%s?page_id=%s' % (slug(survey), token, page.id)" + t-att-data-validate="'/survey/validate/%s/%s' % (slug(survey), token)" + t-att-data-submit="'/survey/submit/%s/%s' % (slug(survey), token)"> <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/> <input type="hidden" name="page_id" t-att-value="page.id" /> <input type="hidden" name="token" t-att-value="token" /> @@ -455,20 +461,20 @@ <tbody> <t t-set="text_result" t-value="prepare_result"/> <tr t-foreach="text_result" t-as="user_input"> - <td><a t-att-href="'%s/%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)"><t t-esc="user_input_index + 1"></t></a></td> + <td><a t-att-href="'%s?token=%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)"><t t-esc="user_input_index + 1"></t></a></td> <t t-if="question.question_type == 'free_text'"> <td> - <a t-att-href="'%s/%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)" t-field="user_input.value_free_text"></a><br/> + <a t-att-href="'%s?token=%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)" t-field="user_input.value_free_text"></a><br/> </td> </t> <t t-if="question.question_type == 'textbox'"> <td> - <a t-att-href="'%s/%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)" t-field="user_input.value_text"></a><br/> + <a t-att-href="'%s?token=%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)" t-field="user_input.value_text"></a><br/> </td> </t> <t t-if="question.question_type == 'date'"> <td> - <a t-att-href="'%s/%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)" t-field="user_input.value_date"></a><br/> + <a t-att-href="'%s?token=%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)" t-field="user_input.value_date"></a><br/> </td> </t> </tr> @@ -489,7 +495,7 @@ </thead> <tbody> <tr t-foreach="comments" t-as="user_input"> - <td><a t-att-href="'%s/%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)"><t t-esc="user_input_index + 1"></t></a></td> + <td><a t-att-href="'%s?token=%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)"><t t-esc="user_input_index + 1"></t></a></td> <td> <span t-field="user_input.value_text"></span><br/> </td> @@ -673,7 +679,7 @@ </thead> <tbody> <tr class="d-none" t-foreach="number_result['input_lines']" t-as="user_input"> - <td><a t-att-href="'%s/%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)"><t t-esc="user_input_index + 1"></t></a></td> + <td><a t-att-href="'%s?token=%s' % (user_input.user_input_id.print_url, user_input.user_input_id.token)"><t t-esc="user_input_index + 1"></t></a></td> <td><span t-field="user_input.value_number"></span><br/></td> </tr> </tbody> |
