Repository
odoo/odoo · module folder
Module version
3.7
Category
Marketing/Surveys
Folder size
12.24 MB
License
LGPL-3
Application
Yes
Auto-installable
No
Website
https://www.odoo.com/app/surveys
Last tracking update
2026-08-15 22:44:19
Authors
Odoo S.A.
Maintainers
Odoo S.A.
Committers
Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Denis Ledoux, Goffin Simon, Aaron Bohy, Géry Debongnie, Christophe Monniez, Jorge Pinna Puissant, Julien Castiaux, Aurélien Warnon, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, yhu-odoo, Florian Charlier, Abdelouahab (abla), Mathieu Walravens, Renaud Thiry, Louis Wicket (wil), Victor Piryns (pivi), amdi-odoo, Pierre-Yves Dufays, Maruan Aguerdouh (magm), Dylan Kiss (dyki), Mayurrajsinh Rathod, Walid (wasa), Astik Singh, bary, vava-odoo, Julien Carion (juca), adsh-odoo, Lopes Marc (loma), nihp-odoo, Shubham Thanki, aath-odoo, Xavier Luyckx (xlu), Pierre Lamotte (pila), Pierre Pulinckx, Anton Romanova (roan), Bastien PIERRE, João Horta Alves, pish-odoo, Hoste Patrick, lse-odoo, Krzysztof Magusiak (krma), utma-odoo, mojem, defl, Augustin (duau), Serhii Rubanskyi, Alessandro Lupo, Jérôme Belpaire, josv-odoo, lecr, saurabh, Séna Nshimiyimana, Kadam Darji, ELCO, chpa-odoo, Romain ROSANO (rros), Dhrumit Parmar, samueljlieber, João Alves
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
hr_recruitment_survey, hr_skills_survey, mgmtsystem_survey, partner_survey, survey_answer_generation, survey_certification_py3o, survey_certification_sending, survey_contact_generation, survey_crm, survey_legal, survey_multi_company, survey_partner_representative, survey_question_type_model_selection, survey_resource_booking, survey_result_mail, survey_skip_start, website_slides_survey
Description
Create beautiful surveys and visualize answers
==============================================

It depends on the answers or reviews of some questions by different users. A
survey may have multiple pages. Each page may contain multiple questions and
each question may have multiple answers. Different users may give different
answers of question and according to that survey is done. Partners are also
sent mails with personal token for the invitation of the survey.
    

Code Analysis

Views touched (73)
XML IDNameModelTypeStatus
certification_preview certification_preview ir.ui.view qweb New
certification_report_view certification_report_view ir.ui.view qweb New
certification_report_view_general certification_report_view_general ir.ui.view qweb New
gamification_badge_form_view_simplified gamification.badge.form.view.simplified gamification.badge form New
question_char_box Question: text box ir.ui.view qweb New
question_container Survey: question container ir.ui.view qweb New
question_date Question: date box ir.ui.view qweb New
question_datetime Question: datetime box ir.ui.view qweb New
question_matrix Question: matrix ir.ui.view qweb New
question_multiple_choice Question: multiple choice ir.ui.view qweb New
question_numerical_box Question: numerical box ir.ui.view qweb New
question_result_choice Question: choice result (simple_choice, multiple_choice, scale) ir.ui.view qweb New
question_result_comments Question: comments ir.ui.view qweb New
question_result_matrix Question: matrix result (matrix) ir.ui.view qweb New
question_result_number_or_date_or_datetime Question: number or date (and time) result (numerical_box or date or datetime) ir.ui.view qweb New
question_result_text Question: text result (text_box, char_box) ir.ui.view qweb New
question_scale Question: scale ir.ui.view qweb New
question_simple_choice Question: simple choice ir.ui.view qweb New
question_suggested_value_image Image from the question suggested answer ir.ui.view qweb New
question_table_pagination Survey: statistics table pagination ir.ui.view qweb New
question_text_box Question: free text box ir.ui.view qweb New
res_partner_view_form res.partner.view.form.inherit.survey res.partner form Inherits base.view_partner_form
survey.layout Survey Layout ir.ui.view qweb Inherits web.frontend_layout
survey_403_page Survey: custom 403 page ir.ui.view qweb New
survey_access_error Survey: access error ir.ui.view qweb New
survey_auth_required Survey: login required ir.ui.view qweb New
survey_button_form_view Survey: back to form view ir.ui.view qweb New
survey_button_retake Survey: retake button ir.ui.view qweb New
survey_closed_expired Survey: expired ir.ui.view qweb New
survey_fill_form Survey: main page content ir.ui.view qweb New
survey_fill_form_done Survey: finished ir.ui.view qweb New
survey_fill_form_in_progress Survey: form with questions ir.ui.view qweb New
survey_fill_form_start Survey: start form content ir.ui.view qweb New
survey_fill_header Survey: main page header ir.ui.view qweb New
survey_invite_view_form survey.invite.view.form survey.invite form New
survey_navigation Survey: Navigation ir.ui.view qweb New
survey_page_fill Survey: main page (take survey) ir.ui.view qweb New
survey_page_print Survey: print page ir.ui.view qweb New
survey_page_statistics Survey: result statistics page ir.ui.view qweb New
survey_page_statistics_header Survey: result statistics header ir.ui.view qweb New
survey_page_statistics_inner Survey: result statistics content ir.ui.view qweb New
survey_page_statistics_question Question: result statistics ir.ui.view qweb New
survey_progression Survey: Progression ir.ui.view qweb New
survey_question_answer_view_form survey.question.answer.view.form survey.question.answer form New
survey_question_answer_view_search survey.question.answer.view.search survey.question.answer search New
survey_question_answer_view_tree survey.question.answer.view.list survey.question.answer list New
survey_question_form Form view for survey question survey.question form New
survey_question_search Search view for survey question survey.question search New
survey_question_tree List view for survey question survey.question list New
survey_remove_unnecessary_decimals Survey: remove .0 ir.ui.view qweb New
survey_response_line_view_tree survey.user_input.line.view.list survey.user_input.line list New
survey_results_filters Survey: Filter results ir.ui.view qweb New
survey_selection_key survey_selection_key ir.ui.view qweb New
survey_session_code Survey: Access Code page ir.ui.view qweb New
survey_survey_view_activity survey.survey.view.activity survey.survey activity New
survey_survey_view_form survey.survey.view.form survey.survey form New
survey_survey_view_graph survey.survey.view.graph survey.survey graph New
survey_survey_view_kanban survey.survey.view.kanban survey.survey kanban New
survey_survey_view_pivot survey.survey.view.pivot survey.survey pivot New
survey_survey_view_search survey.survey.search survey.survey search New
survey_survey_view_tree survey.survey.view.list survey.survey list New
survey_user_input_line_view_form survey.user_input.line.view.form survey.user_input.line form New
survey_user_input_line_view_search survey.user_input.line.view.search survey.user_input.line search New
survey_user_input_view_form survey.user_input.view.form survey.user_input form New
survey_user_input_view_search survey.user_input.view.search survey.user_input search New
survey_user_input_view_tree survey.user_input.view.list survey.user_input list New
survey_user_input_viuew_kanban survey.user_input.view.kanban survey.user_input kanban New
survey_void_content Survey: void content ir.ui.view qweb New
user_input_session Survey User Input Session ir.ui.view qweb Inherits web.frontend_layout
user_input_session_leaderboard Survey User Input Leaderboard ir.ui.view qweb New
user_input_session_manage Survey: Manage Session ir.ui.view qweb New
user_input_session_manage_content Survey User Input Session Manage ir.ui.view qweb New
user_input_session_open Survey: Open Session ir.ui.view qweb New
HTTP endpoints (22)
Route(s)HandlerAuthTypeMethodsFlags
/survey/<model("survey.survey"):survey>/certification_preview Survey.show_certification_pdf user http ALL website
/survey/begin/<string:survey_token>/<string:answer_token> Survey.survey_begin public jsonrpc ALL website
/survey/<string:survey_token>, /survey/<string:survey_token>/<string:answer_token> Survey.survey_display_page public http ALL website
/survey/<string:survey_token>/get_background_image Survey.survey_get_background public http ALL website
/survey/<int:survey_id>/get_certification Survey.survey_get_certification user http GET sudo website
/survey/<model("survey.survey"):survey>/get_certification_preview Survey.survey_get_certification_preview user http GET sudo website
/survey/get_question_image/<string:survey_token>/<string:answer_token>/<int:question_id>/<int:suggested_answer_id> Survey.survey_get_question_image public http ALL sudo website
/survey/next_question/<string:survey_token>/<string:answer_token> Survey.survey_next_question public jsonrpc ALL website
/survey/print/<string:survey_token> Survey.survey_print public http ALL website
/survey/results/<model("survey.survey"):survey> Survey.survey_report user http ALL website
/survey/retry/<string:survey_token>/<string:answer_token> Survey.survey_retry public http ALL website
/survey/<string:survey_token>/<int:section_id>/get_background_image Survey.survey_section_get_background public http ALL website
/survey/start/<string:survey_token> Survey.survey_start public http ALL sudo website
/survey/submit/<string:survey_token>/<string:answer_token> Survey.survey_submit public jsonrpc ALL sudo website
/survey/test/<string:survey_token> Survey.survey_test user http ALL website
/survey/check_session_code/<string:session_code> UserInputSession.survey_check_session_code public jsonrpc ALL website
/s UserInputSession.survey_session_code public http ALL website
/survey/session/leaderboard/<string:survey_token> UserInputSession.survey_session_leaderboard user jsonrpc ALL website
/survey/session/manage/<string:survey_token> UserInputSession.survey_session_manage user http ALL website
/survey/session/next_question/<string:survey_token> UserInputSession.survey_session_next_question user jsonrpc ALL sudo website
/survey/session/results/<string:survey_token> UserInputSession.survey_session_results user jsonrpc ALL website
/s/<string:session_code> UserInputSession.survey_start_short public http ALL website
Models touched (12)

New fields (2)
  • survey_id Many2one → survey.survey
    compute='_compute_survey_id' store=True args: 'survey.survey', 'Survey'
  • survey_ids One2many → survey.survey
    args: 'survey.survey', 'certification_badge_id', 'Survey Ids'
Public methods (0)

No public methods.

New fields (1)
  • challenge_category Selection
    ondelete={'certification': 'set default'} selection_add=[('certification', 'Certifications')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_nearest_lang(self, lang_code)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)
    When languages are disabled, clear corresponding survey languages.

New fields (2)
  • certifications_company_count Integer
    compute='_compute_certifications_company_count' args: 'Company Certifications Count'
  • certifications_count Integer
    compute='_compute_certifications_count' args: 'Certifications Count'
Public methods (1)
  • action_view_certifications(self)

New fields (16)
  • attachment_ids Many2many → ir.attachment
    bypass_search_access=True compute='_compute_attachment_ids' readonly=False store=True string='Attachments' args: 'ir.attachment', 'survey_mail_compose_message_ir_attachments_rel', 'wizard_id', 'attachment_id'
  • author_id Many2one → res.partner
    default=_get_default_author index=True ondelete='set null' args: 'res.partner', 'Author'
  • deadline Datetime
    string='Answer deadline'
  • emails Text
    string='Additional emails'
  • existing_emails Text
    compute='_compute_existing_emails' readonly=True store=False args: 'Existing emails'
  • existing_mode Selection
    default='resend' required=True string='Handle existing' args: [('new', 'New invite'), ('resend', 'Resend invite')]
  • existing_partner_ids Many2many → res.partner
    compute='_compute_existing_partner_ids' readonly=True store=False args: 'res.partner'
  • existing_text Text
    compute='_compute_existing_text' args: 'Resend Comment'
  • mail_server_id Many2one → ir.mail_server
    args: 'ir.mail_server', 'Outgoing mail server'
  • partner_ids Many2many → res.partner
    domain="[ '|', (survey_users_can_signup, '=', 1), '|', (not survey_users_login_required, '=', 1), ('user_ids', '!=', False), ]" string='Recipients' args: 'res.partner', 'survey_invite_partner_ids', 'invite_id', 'partner_id'
  • send_email Boolean
    compute='_compute_send_email' inverse='_inverse_send_email'
  • survey_access_mode Selection
    readonly=True related='survey_id.access_mode'
  • survey_id Many2one → survey.survey
    required=True string='Survey' args: 'survey.survey'
  • survey_start_url Char
    compute='_compute_survey_start_url' args: 'Survey URL'
  • survey_users_can_signup Boolean
    related='survey_id.users_can_signup'
  • survey_users_login_required Boolean
    readonly=True related='survey_id.users_login_required'
Public methods (2)
  • action_invite(self)
    Process the wizard content and proceed with sending the related email(s), rendering any template patterns on the fly if needed
  • create(self, vals_list)
    @api.model_create_multi

New fields (57)
  • allowed_triggering_question_ids Many2many → survey.question
    compute='_compute_allowed_triggering_question_ids' copy=False string='Allowed Triggering Questions' args: 'survey.question'
  • answer_date Date
    help='Correct date answer for this question.' args: 'Correct date answer'
  • answer_datetime Datetime
    help='Correct date and time answer for this question.' args: 'Correct datetime answer'
  • answer_numerical_box Float
    help='Correct number answer for this question.' args: 'Correct numerical answer'
  • answer_score Float
    help='Score value for a correct answer to this question.' args: 'Score'
  • background_image Image
    compute='_compute_background_image' readonly=False store=True args: 'Background Image'
  • background_image_url Char
    compute='_compute_background_image_url' args: 'Background Url'
  • comment_count_as_answer Boolean
    args: 'Comment is an answer'
  • comments_allowed Boolean
    args: 'Show Comments Field'
  • comments_message Char
    translate=True args: 'Comment Message'
  • constr_error_msg Char
    translate=True args: 'Error message'
  • constr_mandatory Boolean
    args: 'Mandatory Answer'
  • description Html
    help='Use this field to add additional explanations about your question or to illustrate it with pictures or a video' sanitize=True sanitize_overridable=True translate=True args: 'Description'
  • has_image_only_suggested_answer Boolean
    compute='_compute_has_image_only_suggested_answer' args: 'Has image only suggested answer'
  • is_page Boolean
    args: 'Is a page?'
  • is_placed_before_trigger Boolean
    compute='_compute_allowed_triggering_question_ids' help='Is this question placed before any of its trigger questions?' string='Is misplaced?'
  • is_scored_question Boolean
    compute='_compute_is_scored_question' copy=True help='Include this question as part of quiz scoring. Requires an answer and answer score to be taken into account.' readonly=False store=True args: 'Scored'
  • is_time_customized Boolean
    args: 'Customized speed rewards'
  • is_time_limited Boolean
    help='Currently only supported for live sessions.' args: 'The question is limited in time'
  • matrix_row_ids One2many → survey.question.answer
    copy=True help='Labels used for proposed choices: rows of matrix' string='Matrix Rows' args: 'survey.question.answer', 'matrix_question_id'
  • matrix_subtype Selection
    default='simple' string='Matrix Type' args: [('simple', 'One choice per row'), ('multiple', 'Multiple choices per row')]
  • page_id Many2one → survey.question
    compute='_compute_page_id' store=True string='Page' args: 'survey.question'
  • question_ids One2many → survey.question
    compute='_compute_question_ids' string='Questions' args: 'survey.question'
  • question_placeholder Char
    compute='_compute_question_placeholder' readonly=False store=True translate=True args: 'Placeholder'
  • question_type Selection
    compute='_compute_question_type' readonly=False store=True string='Question Type' args: [('simple_choice', 'Multiple choice: only one answer'), ('multiple_choice', 'Multiple choice: multiple answers allowed'), ('text_box', 'Multiple Lines Text Box'), ('char_box', 'Single Line Text Box'), ('numerical_box', 'Numerical Value'), ('scale', 'Scale'), ('date', 'Date'), ('datetime', 'Datetime'), ('matrix', 'Matrix')]
  • questions_selection Selection
    help='If randomized is selected, add the number of random questions next to the section.' readonly=True related='survey_id.questions_selection'
  • random_questions_count Integer
    default=1 help='Used on randomized sections to take X random questions from all the questions of that section.' args: '# Questions Randomly Picked'
  • save_as_email Boolean
    compute='_compute_save_as_email' copy=True help="If checked, this option will save the user's answer as its email address." readonly=False store=True args: 'Save as user email'
  • save_as_nickname Boolean
    compute='_compute_save_as_nickname' copy=True help="If checked, this option will save the user's answer as its nickname." readonly=False store=True args: 'Save as user nickname'
  • scale_max Integer
    default=10 args: 'Scale Maximum Value'
  • scale_max_label Char
    translate=True args: 'Scale Maximum Label'
  • scale_mid_label Char
    translate=True args: 'Scale Middle Label'
  • scale_min Integer
    default=0 args: 'Scale Minimum Value'
  • scale_min_label Char
    translate=True args: 'Scale Minimum Label'
  • scoring_type Selection
    readonly=True related='survey_id.scoring_type' string='Scoring Type'
  • sequence Integer
    default=10 args: 'Sequence'
  • session_available Boolean
    readonly=True related='survey_id.session_available' string='Live Session available'
  • suggested_answer_ids One2many → survey.question.answer
    copy=True help='Labels used for proposed choices: simple choice, multiple choice and columns of matrix' string='Types of answers' args: 'survey.question.answer', 'question_id'
  • survey_id Many2one → survey.survey
    index='btree_not_null' ondelete='cascade' string='Survey' args: 'survey.survey'
  • survey_session_speed_rating Boolean
    related='survey_id.session_speed_rating'
  • survey_session_speed_rating_time_limit Integer
    related='survey_id.session_speed_rating_time_limit' string='General Time limit (seconds)'
  • time_limit Integer
    args: 'Time limit (seconds)'
  • title Char
    required=True translate=True args: 'Title'
  • triggering_answer_ids Many2many → survey.question.answer
    copy=False domain="[\n ('question_id.survey_id', '=', survey_id),\n '&', ('question_id.question_type', 'in', ['simple_choice', 'multiple_choice']),\n '|',\n ('question_id.sequence', '<', sequence),\n '&', ('question_id.sequence', '=', sequence), ('question_id.id', '<', id)\n ]" help='Picking any of these answers will trigger this question.\nLeave the field empty if the question should always be displayed.' readonly=False store=True string='Triggering Answers' args: 'survey.question.answer'
  • triggering_question_ids Many2many → survey.question
    compute='_compute_triggering_question_ids' help='Questions containing the triggering answer(s) to display the current question.' store=False string='Triggering Questions' args: 'survey.question'
  • user_input_line_ids One2many → survey.user_input.line
    domain=[('skipped', '=', False)] groups='survey.group_survey_user' string='Answers' args: 'survey.user_input.line', 'question_id'
  • validation_email Boolean
    args: 'Input must be an email'
  • validation_error_msg Char
    translate=True args: 'Validation Error'
  • validation_length_max Integer
    default=0 args: 'Maximum Text Length'
  • validation_length_min Integer
    default=0 args: 'Minimum Text Length'
  • validation_max_date Date
    args: 'Maximum Date'
  • validation_max_datetime Datetime
    args: 'Maximum Datetime'
  • validation_max_float_value Float
    default=0.0 args: 'Maximum value'
  • validation_min_date Date
    args: 'Minimum Date'
  • validation_min_datetime Datetime
    args: 'Minimum Datetime'
  • validation_min_float_value Float
    default=0.0 args: 'Minimum value'
  • validation_required Boolean
    compute='_compute_validation_required' readonly=False store=True args: 'Validate entry'
Public methods (4)
  • copy(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • validate_question(self, answer, comment=None)
    Validate question, depending on question type and parameters for simple choice, text, date and number, answer is simply the answer of the question. For other multiple choices questions, answer is a list of answers (the selected choices or a list of selected answers per question -for matrix type-): - Simple answer : ``answer = 'example'`` or ``2`` or ``question_answer_id`` or ``2019/10/10`` - Multiple choice : ``answer = [question_answer_id1, question_answer_id2, question_answer_id3]`` - Matrix: ``answer = { 'rowId1' : [colId1, colId2,...], 'rowId2' : [colId1, colId3, ...] }`` :returns: A dict ``{question.id: error}``, or an empty dict if no validation error. :rtype: dict[int, str]

New fields (11)
  • answer_score Float
    help='A positive score indicates a correct choice; a negative or null score indicates a wrong answer' args: 'Score'
  • is_correct Boolean
    args: 'Correct'
  • matrix_question_id Many2one → survey.question
    index='btree_not_null' ondelete='cascade' string='Question (as matrix row)' args: 'survey.question'
  • question_id Many2one → survey.question
    index='btree_not_null' ondelete='cascade' string='Question' args: 'survey.question'
  • question_type Selection
    related='question_id.question_type'
  • scoring_type Selection
    related='question_id.scoring_type'
  • sequence Integer
    default=10 args: 'Label Sequence order'
  • value Char
    translate=True args: 'Suggested value'
  • value_image Image
    max_height=1024 max_width=1024 args: 'Image'
  • value_image_filename Char
    args: 'Image Filename'
  • value_label Char
    compute='_compute_value_label' help='Answer label as either the value itself if not empty or a letter representing the index of the answer otherwise.' args: 'Value Label'
Public methods (0)

No public methods.

New fields (57)
  • access_mode Selection
    default='public' required=True string='Access Mode' args: [('public', 'Anyone with the link'), ('token', 'Invited people only')]
  • access_token Char
    copy=False default=<expr> args: 'Access Token'
  • active Boolean
    default=True args: 'Active'
  • allowed_survey_types Json
    compute='_compute_allowed_survey_types' string='Allowed survey types'
  • answer_count Integer
    compute='_compute_survey_statistic' args: 'Registered'
  • answer_done_count Integer
    compute='_compute_survey_statistic' args: 'Attempts'
  • answer_duration_avg Float
    compute='_compute_answer_duration_avg' help='Average duration of the survey (in hours)' args: 'Average Duration'
  • answer_score_avg Float
    compute='_compute_survey_statistic' args: 'Avg Score (%)'
  • attempts_limit Integer
    default=1 args: 'Number of attempts'
  • background_image Image
    args: 'Background Image'
  • background_image_url Char
    compute='_compute_background_image_url' args: 'Background Url'
  • certification Boolean
    compute='_compute_certification' precompute=True readonly=False store=True args: 'Is a Certification'
  • certification_badge_id Many2one → gamification.badge
    copy=False index='btree_not_null' args: 'gamification.badge', 'Certification Badge'
  • certification_badge_id_dummy Many2one
    related='certification_badge_id' string='Certification Badge '
  • certification_give_badge Boolean
    compute='_compute_certification_give_badge' copy=False readonly=False store=True args: 'Give Badge'
  • certification_mail_template_id Many2one → mail.template
    domain="[('model', '=', 'survey.user_input')]" help='Automated email sent to the user when they succeed the certification, containing their certification document.' args: 'mail.template', 'Certified Email Template'
  • certification_report_layout Selection
    default='modern_purple' string='Certification template' args: [('modern_purple', 'Modern Purple'), ('modern_blue', 'Modern Blue'), ('modern_gold', 'Modern Gold'), ('classic_purple', 'Classic Purple'), ('classic_blue', 'Classic Blue'), ('classic_gold', 'Classic Gold')]
  • color Integer
    default=0 args: 'Color Index'
  • description Html
    help='The description will be displayed on the home page of the survey. You can use this to give the purpose and guidelines to your candidates before they start it.' sanitize=True sanitize_overridable=True translate=True args: 'Description'
  • description_done Html
    help='This message will be displayed when survey is completed' translate=True args: 'End Message'
  • has_conditional_questions Boolean
    compute='_compute_has_conditional_questions' args: 'Contains conditional questions'
  • is_attempts_limited Boolean
    compute='_compute_is_attempts_limited' help='Check this option if you want to limit the number of attempts per user' readonly=False store=True args: 'Limited number of attempts'
  • is_time_limited Boolean
    args: 'The survey is limited in time'
  • lang_ids Many2many → res.lang
    default=<expr> domain=<expr> help='Leave the field empty to support all installed languages.' string='Languages' args: 'res.lang'
  • page_ids One2many → survey.question
    compute='_compute_page_and_question_ids' string='Pages' args: 'survey.question'
  • progression_mode Selection
    default='percent' help='If Number is selected, it will display the number of questions answered on the total number of question to answer.' string='Display Progress as' args: [('percent', 'Percentage left'), ('number', 'Number')]
  • question_and_page_ids One2many → survey.question
    copy=True string='Sections and Questions' args: 'survey.question', 'survey_id'
  • question_count Integer
    compute='_compute_page_and_question_ids' args: '# Questions'
  • question_ids One2many → survey.question
    compute='_compute_page_and_question_ids' string='Questions' args: 'survey.question'
  • questions_layout Selection
    default='page_per_question' required=True string='Pagination' args: [('page_per_question', 'One page per question'), ('page_per_section', 'One page per section'), ('one_page', 'One page with all the questions')]
  • questions_selection Selection
    default='all' help='If randomized is selected, you can configure the number of random questions by section. This mode is ignored in live session.' required=True string='Question Selection' args: [('all', 'All questions'), ('random', 'Randomized per Section')]
  • restrict_user_ids Many2many → res.users
    domain=[('share', '=', False)] string='Restricted to' tracking=2 args: 'res.users'
  • scoring_max_obtainable Float
    compute='_compute_scoring_max_obtainable' args: 'Maximum obtainable score'
  • scoring_success_min Float
    default=80.0 args: 'Required Score (%)'
  • scoring_type Selection
    compute='_compute_scoring_type' precompute=True readonly=False required=True store=True string='Scoring' args: [('no_scoring', 'No scoring'), ('scoring_with_answers_after_page', 'Scoring with answers after each page'), ('scoring_with_answers', 'Scoring with answers at the end'), ('scoring_without_answers', 'Scoring without answers')]
  • session_answer_count Integer
    compute='_compute_session_answer_count' args: 'Answers Count'
  • session_available Boolean
    compute='_compute_session_available' args: 'Live session available'
  • session_code Char
    compute='_compute_session_code' copy=False help='This code will be used by your attendees to reach your session. Feel free to customize it however you like!' precompute=True readonly=False store=True args: 'Session Code'
  • session_link Char
    compute='_compute_session_link' args: 'Session Link'
  • session_question_answer_count Integer
    compute='_compute_session_question_answer_count' args: 'Question Answers Count'
  • session_question_id Many2one → survey.question
    copy=False help='The current question of the survey session.' string='Current Question' args: 'survey.question'
  • session_question_start_time Datetime
    copy=False help='The time at which the current question has started, used to handle the timer for attendees.' args: 'Current Question Start Time'
  • session_show_leaderboard Boolean
    compute='_compute_session_show_leaderboard' help='Whether or not we want to show the attendees leaderboard for this survey.' args: 'Show Session Leaderboard'
  • session_speed_rating Boolean
    help='Attendees get more points if they answer quickly' args: 'Reward quick answers'
  • session_speed_rating_time_limit Integer
    help='Default time given to receive additional points for right answers' args: 'Time limit (seconds)'
  • session_start_time Datetime
    copy=False args: 'Current Session Start Time'
  • session_state Selection
    copy=False string='Session State' args: [('ready', 'Ready'), ('in_progress', 'In Progress')]
  • success_count Integer
    compute='_compute_survey_statistic' args: 'Success'
  • success_ratio Integer
    compute='_compute_survey_statistic' args: 'Success Ratio (%)'
  • survey_type Selection
    default='custom' required=True string='Survey Type' args: [('survey', 'Survey'), ('live_session', 'Live session'), ('assessment', 'Assessment'), ('custom', 'Custom')]
  • time_limit Float
    default=10 args: 'Time limit (minutes)'
  • title Char
    required=True translate=True args: 'Survey Title'
  • user_id Many2one → res.users
    default=<expr> domain=[('share', '=', False)] string='Responsible' tracking=1 args: 'res.users'
  • user_input_ids One2many → survey.user_input
    readonly=True string='User responses' args: 'survey.user_input', 'survey_id'
  • users_can_go_back Boolean
    help='If checked, users can go back to previous pages.' args: 'Users can go back'
  • users_can_signup Boolean
    compute='_compute_users_can_signup' args: 'Users can signup'
  • users_login_required Boolean
    help='If checked, users have to login before answering even with a valid token.' args: 'Require Login'
Public methods (23)
  • action_archive(self)
  • action_end_session(self)
    The write is sudo'ed because a survey user can end a session even if it's not their own survey.
  • action_open_session_manager(self)
  • action_print_survey(self, answer=None)
    Open the website page with the survey printable view
  • action_result_survey(self)
    Open the website page with the survey results view
  • action_send_survey(self)
    Open a window to compose an email, pre-filled with the survey message
  • action_start_session(self)
    Sets the necessary fields for the session to take place and starts it. The write is sudo'ed because a survey user can start a session even if it's not their own survey.
  • action_start_survey(self, answer=None)
    Open the website page with the survey form
  • action_survey_preview_certification_template(self)
  • action_survey_user_input(self)
  • action_survey_user_input_certified(self)
  • action_survey_user_input_completed(self)
  • action_test_survey(self)
    Open the website page with the survey form into test mode
  • action_unarchive(self)
  • check_validity(self)
  • copy(self, default=None)
    Correctly copy the 'triggering_answer_ids' field from the original to the clone. This needs to be done in post-processing to make sure we get references to the newly created answers from the copy instead of references to the answers of the original. This implementation assumes that the order of created answers will be kept between the original and the clone, using 'zip()' to match the records between the two. Note that when `question_ids` is provided in the default parameter, it falls back to the standard copy, meaning that triggering logic will not be maintained.
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_print_url(self)
  • get_start_short_url(self)
    See controller method docstring for more details.
  • get_start_url(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (4)
  • action_load_sample_custom(self)
    @api.model
  • action_load_survey_template_sample(self, template_key)
    @api.model
  • action_show_sample(self)
  • get_survey_templates_data(self)
    @api.model

New fields (27)
  • access_token Char
    copy=False default=<expr> readonly=True required=True args: 'Identification token'
  • attempts_count Integer
    compute='_compute_attempts_info' args: 'Attempts Count'
  • attempts_limit Integer
    related='survey_id.attempts_limit' args: 'Number of attempts'
  • attempts_number Integer
    compute='_compute_attempts_info' args: 'Attempt n°'
  • deadline Datetime
    help='Datetime until customer can open the survey and submit answers' args: 'Deadline'
  • email Char
    readonly=True args: 'Email'
  • end_datetime Datetime
    readonly=True args: 'End date and time'
  • invite_token Char
    copy=False readonly=True args: 'Invite token'
  • is_attempts_limited Boolean
    related='survey_id.is_attempts_limited' args: 'Limited number of attempts'
  • is_session_answer Boolean
    help='Is that user input part of a survey session or not.' args: 'Is in a Session'
  • lang_id Many2one → res.lang
    string='Language' args: 'res.lang'
  • last_displayed_page_id Many2one → survey.question
    string='Last displayed question/page' args: 'survey.question'
  • nickname Char
    help='Attendee nickname, mainly used to identify them in the survey session leaderboard.' args: 'Nickname'
  • partner_id Many2one → res.partner
    index='btree_not_null' readonly=True string='Contact' args: 'res.partner'
  • predefined_question_ids Many2many → survey.question
    readonly=True string='Predefined Questions' args: 'survey.question'
  • question_time_limit_reached Boolean
    compute='_compute_question_time_limit_reached' args: 'Question Time Limit Reached'
  • scoring_percentage Float
    compute='_compute_scoring_values' compute_sudo=True store=True args: 'Score (%)'
  • scoring_success Boolean
    compute='_compute_scoring_success' compute_sudo=True store=True args: 'Quiz Passed'
  • scoring_total Float
    compute='_compute_scoring_values' compute_sudo=True digits=(10, 2) store=True args: 'Total Score'
  • scoring_type Selection
    related='survey_id.scoring_type' string='Scoring'
  • start_datetime Datetime
    readonly=True args: 'Start date and time'
  • state Selection
    default='new' readonly=True string='Status' args: [('new', 'New'), ('in_progress', 'In Progress'), ('done', 'Completed')]
  • survey_first_submitted Boolean
    string='Survey First Submitted'
  • survey_id Many2one → survey.survey
    index=True ondelete='cascade' readonly=True required=True string='Survey' args: 'survey.survey'
  • survey_time_limit_reached Boolean
    compute='_compute_survey_time_limit_reached' args: 'Survey Time Limit Reached'
  • test_entry Boolean
    readonly=True
  • user_input_line_ids One2many → survey.user_input.line
    copy=True string='Answers' args: 'survey.user_input.line', 'user_input_id'
Public methods (6)
  • action_print_answers(self)
    Open the website page with the survey form
  • action_redirect_to_attempts(self)
  • action_resend(self)
  • create(self, vals_list)
    @api.model_create_multi
  • get_print_url(self)
  • get_start_url(self)

New fields (18)
  • answer_is_correct Boolean
    compute='_compute_answer_score' precompute=True store=True args: 'Correct'
  • answer_score Float
    compute='_compute_answer_score' precompute=True store=True args: 'Score'
  • answer_type Selection
    string='Answer Type' args: [('text_box', 'Free Text'), ('char_box', 'Text'), ('numerical_box', 'Number'), ('scale', 'Number'), ('date', 'Date'), ('datetime', 'Datetime'), ('suggestion', 'Suggestion')]
  • lang_id Many2one → res.lang
    related='user_input_id.lang_id' args: 'res.lang'
  • matrix_row_id Many2one → survey.question.answer
    string='Row answer' args: 'survey.question.answer'
  • page_id Many2one
    readonly=False related='question_id.page_id' string='Section'
  • question_id Many2one → survey.question
    index=True ondelete='cascade' required=True string='Question' args: 'survey.question'
  • question_sequence Integer
    related='question_id.sequence' store=True args: 'Sequence'
  • skipped Boolean
    args: 'Skipped'
  • suggested_answer_id Many2one → survey.question.answer
    string='Suggested answer' args: 'survey.question.answer'
  • survey_id Many2one
    readonly=False related='user_input_id.survey_id' store=True string='Survey'
  • user_input_id Many2one → survey.user_input
    index=True ondelete='cascade' required=True string='User Input' args: 'survey.user_input'
  • value_char_box Char
    args: 'Text answer'
  • value_date Date
    args: 'Date answer'
  • value_datetime Datetime
    args: 'Datetime answer'
  • value_numerical_box Float
    args: 'Numerical answer'
  • value_scale Integer
    args: 'Scale value'
  • value_text_box Text
    args: 'Free Text answer'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…