From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 10 May 2022 21:51:50 +0700 Subject: initial commit 2 --- addons/survey/__init__.py | 6 + addons/survey/__manifest__.py | 60 + addons/survey/controllers/__init__.py | 5 + addons/survey/controllers/main.py | 700 +++ addons/survey/controllers/survey_session_manage.py | 241 + addons/survey/data/ir_actions_data.xml | 16 + addons/survey/data/mail_template_data.xml | 78 + addons/survey/data/survey.user_input.line.csv | 107 + addons/survey/data/survey_demo_certification.xml | 399 ++ addons/survey/data/survey_demo_conditional.xml | 474 ++ addons/survey/data/survey_demo_feedback.xml | 222 + addons/survey/data/survey_demo_quiz.xml | 582 +++ addons/survey/data/survey_demo_quiz_userinput.xml | 571 +++ addons/survey/data/survey_demo_user.xml | 9 + addons/survey/i18n/af.po | 2101 +++++++++ addons/survey/i18n/ar.po | 4609 +++++++++++++++++++ addons/survey/i18n/az.po | 2649 +++++++++++ addons/survey/i18n/bg.po | 4542 +++++++++++++++++++ addons/survey/i18n/bn.po | 4516 ++++++++++++++++++ addons/survey/i18n/bs.po | 2672 +++++++++++ addons/survey/i18n/ca.po | 4549 +++++++++++++++++++ addons/survey/i18n/ckb.po | 4514 ++++++++++++++++++ addons/survey/i18n/cs.po | 4690 +++++++++++++++++++ addons/survey/i18n/da.po | 4766 +++++++++++++++++++ addons/survey/i18n/de.po | 4790 ++++++++++++++++++++ addons/survey/i18n/el.po | 4522 ++++++++++++++++++ addons/survey/i18n/en_GB.po | 2107 +++++++++ addons/survey/i18n/eo.po | 4499 ++++++++++++++++++ addons/survey/i18n/es.po | 4772 +++++++++++++++++++ addons/survey/i18n/es_CL.po | 2092 +++++++++ addons/survey/i18n/es_CO.po | 2334 ++++++++++ addons/survey/i18n/es_CR.po | 2068 +++++++++ addons/survey/i18n/es_DO.po | 2331 ++++++++++ addons/survey/i18n/es_EC.po | 2337 ++++++++++ addons/survey/i18n/es_MX.po | 4766 +++++++++++++++++++ addons/survey/i18n/es_PE.po | 2097 +++++++++ addons/survey/i18n/es_PY.po | 2065 +++++++++ addons/survey/i18n/es_VE.po | 2057 +++++++++ addons/survey/i18n/et.po | 4677 +++++++++++++++++++ addons/survey/i18n/eu.po | 4531 ++++++++++++++++++ addons/survey/i18n/fa.po | 4578 +++++++++++++++++++ addons/survey/i18n/fi.po | 4542 +++++++++++++++++++ addons/survey/i18n/fr.po | 4687 +++++++++++++++++++ addons/survey/i18n/gl.po | 2055 +++++++++ addons/survey/i18n/gu.po | 2658 +++++++++++ addons/survey/i18n/he.po | 4559 +++++++++++++++++++ addons/survey/i18n/hi.po | 4514 ++++++++++++++++++ addons/survey/i18n/hr.po | 4529 ++++++++++++++++++ addons/survey/i18n/hu.po | 4530 ++++++++++++++++++ addons/survey/i18n/id.po | 4548 +++++++++++++++++++ addons/survey/i18n/is.po | 2658 +++++++++++ addons/survey/i18n/it.po | 4766 +++++++++++++++++++ addons/survey/i18n/ja.po | 4586 +++++++++++++++++++ addons/survey/i18n/ka.po | 4522 ++++++++++++++++++ addons/survey/i18n/kab.po | 2112 +++++++++ addons/survey/i18n/km.po | 4523 ++++++++++++++++++ addons/survey/i18n/ko.po | 4630 +++++++++++++++++++ addons/survey/i18n/lb.po | 2553 +++++++++++ addons/survey/i18n/lt.po | 4552 +++++++++++++++++++ addons/survey/i18n/lv.po | 4537 ++++++++++++++++++ addons/survey/i18n/mk.po | 2268 +++++++++ addons/survey/i18n/mn.po | 4539 +++++++++++++++++++ addons/survey/i18n/nb.po | 4531 ++++++++++++++++++ addons/survey/i18n/nl.po | 4756 +++++++++++++++++++ addons/survey/i18n/nl_BE.po | 2105 +++++++++ addons/survey/i18n/pl.po | 4647 +++++++++++++++++++ addons/survey/i18n/pt.po | 4524 ++++++++++++++++++ addons/survey/i18n/pt_BR.po | 4647 +++++++++++++++++++ addons/survey/i18n/ro.po | 4699 +++++++++++++++++++ addons/survey/i18n/ru.po | 4557 +++++++++++++++++++ addons/survey/i18n/si.po | 4499 ++++++++++++++++++ addons/survey/i18n/sk.po | 4589 +++++++++++++++++++ addons/survey/i18n/sl.po | 4537 ++++++++++++++++++ addons/survey/i18n/sr.po | 2653 +++++++++++ addons/survey/i18n/sr@latin.po | 2087 +++++++++ addons/survey/i18n/survey.pot | 4506 ++++++++++++++++++ addons/survey/i18n/sv.po | 4544 +++++++++++++++++++ addons/survey/i18n/th.po | 4524 ++++++++++++++++++ addons/survey/i18n/tr.po | 4685 +++++++++++++++++++ addons/survey/i18n/uk.po | 4621 +++++++++++++++++++ addons/survey/i18n/ur.po | 4494 ++++++++++++++++++ addons/survey/i18n/vi.po | 4684 +++++++++++++++++++ addons/survey/i18n/zh_CN.po | 4591 +++++++++++++++++++ addons/survey/i18n/zh_TW.po | 4568 +++++++++++++++++++ addons/survey/models/__init__.py | 9 + addons/survey/models/badge.py | 16 + addons/survey/models/challenge.py | 12 + addons/survey/models/res_partner.py | 32 + addons/survey/models/survey_question.py | 560 +++ addons/survey/models/survey_survey.py | 1066 +++++ addons/survey/models/survey_user.py | 628 +++ addons/survey/security/ir.model.access.csv | 23 + addons/survey/security/survey_security.xml | 184 + addons/survey/static/description/icon.png | Bin 0 -> 10424 bytes addons/survey/static/description/icon.svg | 1 + addons/survey/static/img/africa.png | Bin 0 -> 54654 bytes addons/survey/static/img/asia.png | Bin 0 -> 61292 bytes addons/survey/static/img/china.jpg | Bin 0 -> 2856 bytes addons/survey/static/img/coniferous.jpg | Bin 0 -> 82597 bytes addons/survey/static/img/cornaceae.jpg | Bin 0 -> 74548 bytes addons/survey/static/img/douglas_fir.jpg | Bin 0 -> 12434 bytes addons/survey/static/img/europe.png | Bin 0 -> 59284 bytes addons/survey/static/img/european_yew.jpg | Bin 0 -> 12962 bytes addons/survey/static/img/japan.jpg | Bin 0 -> 3829 bytes addons/survey/static/img/mountain_pine.jpg | Bin 0 -> 18131 bytes addons/survey/static/img/norway_spruce.jpg | Bin 0 -> 10272 bytes addons/survey/static/img/pinaceae.jpg | Bin 0 -> 75231 bytes addons/survey/static/img/pinus_sylvestris.jpg | Bin 0 -> 87305 bytes addons/survey/static/img/salicaceae.jpg | Bin 0 -> 66044 bytes addons/survey/static/img/south_america.png | Bin 0 -> 43140 bytes addons/survey/static/img/south_korea.jpg | Bin 0 -> 22884 bytes addons/survey/static/img/survey_background.jpg | Bin 0 -> 126948 bytes addons/survey/static/img/ulmaceae.jpg | Bin 0 -> 71427 bytes addons/survey/static/img/vietnam.jpg | Bin 0 -> 5086 bytes addons/survey/static/src/css/survey_print.css | 17 + addons/survey/static/src/css/survey_result.css | 77 + addons/survey/static/src/fonts/ETHOS-REGULAR.OTF | Bin 0 -> 54772 bytes .../static/src/fonts/MrDeHaviland-Regular.ttf | Bin 0 -> 43260 bytes .../survey/static/src/fonts/MrDeHaviland-ofl.txt | 94 + addons/survey/static/src/fonts/Oswald-Light.ttf | Bin 0 -> 124680 bytes .../static/src/img/burger_quiz_background.jpg | Bin 0 -> 364528 bytes .../static/src/img/burger_quiz_cubism_klein.jpg | Bin 0 -> 49649 bytes .../static/src/img/burger_quiz_don_quixote.jpg | Bin 0 -> 42181 bytes .../survey/static/src/img/burger_quiz_guernica.jpg | Bin 0 -> 33208 bytes .../static/src/img/burger_quiz_self_portrait.jpg | Bin 0 -> 14892 bytes .../src/img/certification_bg_classic_blue.jpg | Bin 0 -> 83580 bytes .../src/img/certification_bg_classic_default.jpg | Bin 0 -> 78982 bytes .../src/img/certification_bg_classic_gold.jpg | Bin 0 -> 83632 bytes .../static/src/img/certification_bg_modern.png | Bin 0 -> 7880 bytes .../survey/static/src/img/certification_seal.svg | 1 + addons/survey/static/src/img/survey_background.jpg | Bin 0 -> 166837 bytes .../survey/static/src/img/survey_background_2.jpg | Bin 0 -> 86252 bytes addons/survey/static/src/img/trophy-solid.svg | 1 + addons/survey/static/src/img/watermark.png | Bin 0 -> 61598 bytes .../static/src/js/fields_form_page_description.js | 53 + .../static/src/js/fields_section_one2many.js | 185 + .../src/js/libs/chartjs-plugin-datalabels.min.js | 7 + addons/survey/static/src/js/survey_breadcrumb.js | 50 + addons/survey/static/src/js/survey_form.js | 1094 +++++ addons/survey/static/src/js/survey_print.js | 31 + addons/survey/static/src/js/survey_quick_access.js | 68 + addons/survey/static/src/js/survey_result.js | 408 ++ .../survey/static/src/js/survey_session_chart.js | 363 ++ .../survey/static/src/js/survey_session_colors.js | 21 + .../static/src/js/survey_session_leaderboard.js | 335 ++ .../survey/static/src/js/survey_session_manage.js | 588 +++ .../static/src/js/survey_session_text_answers.js | 74 + addons/survey/static/src/js/survey_timer.js | 72 + addons/survey/static/src/scss/survey_form.scss | 422 ++ addons/survey/static/src/scss/survey_reports.scss | 196 + addons/survey/static/src/scss/survey_views.scss | 26 + .../static/src/xml/survey_breadcrumb_templates.xml | 31 + .../xml/survey_session_text_answer_template.xml | 11 + .../static/tests/tours/certification_failure.js | 109 + .../static/tests/tours/certification_success.js | 100 + addons/survey/static/tests/tours/survey.js | 70 + addons/survey/static/tests/tours/survey_prefill.js | 155 + .../tests/tours/survey_session_manage_test.js | 37 + .../tests/tours/survey_tour_session_create.js | 20 + .../tests/tours/survey_tour_session_manage.js | 432 ++ .../tests/tours/survey_tour_session_start.js | 32 + .../tests/tours/survey_tour_session_tools.js | 21 + addons/survey/tests/__init__.py | 16 + addons/survey/tests/common.py | 281 ++ addons/survey/tests/test_certification_badge.py | 230 + addons/survey/tests/test_certification_flow.py | 205 + addons/survey/tests/test_survey.py | 115 + .../tests/test_survey_compute_pages_questions.py | 69 + addons/survey/tests/test_survey_flow.py | 121 + .../tests/test_survey_flow_with_conditions.py | 126 + addons/survey/tests/test_survey_invite.py | 223 + addons/survey/tests/test_survey_randomize.py | 59 + addons/survey/tests/test_survey_security.py | 364 ++ .../survey/tests/test_survey_ui_certification.py | 282 ++ addons/survey/tests/test_survey_ui_feedback.py | 169 + addons/survey/tests/test_survey_ui_session.py | 210 + addons/survey/views/assets.xml | 69 + addons/survey/views/gamification_badge_views.xml | 28 + addons/survey/views/res_partner_views.xml | 40 + addons/survey/views/survey_menus.xml | 22 + addons/survey/views/survey_question_views.xml | 307 ++ addons/survey/views/survey_report_templates.xml | 89 + addons/survey/views/survey_reports.xml | 17 + addons/survey/views/survey_survey_views.xml | 300 ++ addons/survey/views/survey_templates.xml | 591 +++ .../survey/views/survey_templates_management.xml | 149 + addons/survey/views/survey_templates_print.xml | 56 + .../survey/views/survey_templates_statistics.xml | 422 ++ .../views/survey_templates_user_input_session.xml | 196 + addons/survey/views/survey_user_views.xml | 232 + addons/survey/wizard/__init__.py | 4 + addons/survey/wizard/survey_invite.py | 277 ++ addons/survey/wizard/survey_invite_views.xml | 65 + 193 files changed, 289683 insertions(+) create mode 100644 addons/survey/__init__.py create mode 100644 addons/survey/__manifest__.py create mode 100644 addons/survey/controllers/__init__.py create mode 100644 addons/survey/controllers/main.py create mode 100644 addons/survey/controllers/survey_session_manage.py create mode 100644 addons/survey/data/ir_actions_data.xml create mode 100644 addons/survey/data/mail_template_data.xml create mode 100644 addons/survey/data/survey.user_input.line.csv create mode 100644 addons/survey/data/survey_demo_certification.xml create mode 100644 addons/survey/data/survey_demo_conditional.xml create mode 100644 addons/survey/data/survey_demo_feedback.xml create mode 100644 addons/survey/data/survey_demo_quiz.xml create mode 100644 addons/survey/data/survey_demo_quiz_userinput.xml create mode 100644 addons/survey/data/survey_demo_user.xml create mode 100644 addons/survey/i18n/af.po create mode 100644 addons/survey/i18n/ar.po create mode 100644 addons/survey/i18n/az.po create mode 100644 addons/survey/i18n/bg.po create mode 100644 addons/survey/i18n/bn.po create mode 100644 addons/survey/i18n/bs.po create mode 100644 addons/survey/i18n/ca.po create mode 100644 addons/survey/i18n/ckb.po create mode 100644 addons/survey/i18n/cs.po create mode 100644 addons/survey/i18n/da.po create mode 100644 addons/survey/i18n/de.po create mode 100644 addons/survey/i18n/el.po create mode 100644 addons/survey/i18n/en_GB.po create mode 100644 addons/survey/i18n/eo.po create mode 100644 addons/survey/i18n/es.po create mode 100644 addons/survey/i18n/es_CL.po create mode 100644 addons/survey/i18n/es_CO.po create mode 100644 addons/survey/i18n/es_CR.po create mode 100644 addons/survey/i18n/es_DO.po create mode 100644 addons/survey/i18n/es_EC.po create mode 100644 addons/survey/i18n/es_MX.po create mode 100644 addons/survey/i18n/es_PE.po create mode 100644 addons/survey/i18n/es_PY.po create mode 100644 addons/survey/i18n/es_VE.po create mode 100644 addons/survey/i18n/et.po create mode 100644 addons/survey/i18n/eu.po create mode 100644 addons/survey/i18n/fa.po create mode 100644 addons/survey/i18n/fi.po create mode 100644 addons/survey/i18n/fr.po create mode 100644 addons/survey/i18n/gl.po create mode 100644 addons/survey/i18n/gu.po create mode 100644 addons/survey/i18n/he.po create mode 100644 addons/survey/i18n/hi.po create mode 100644 addons/survey/i18n/hr.po create mode 100644 addons/survey/i18n/hu.po create mode 100644 addons/survey/i18n/id.po create mode 100644 addons/survey/i18n/is.po create mode 100644 addons/survey/i18n/it.po create mode 100644 addons/survey/i18n/ja.po create mode 100644 addons/survey/i18n/ka.po create mode 100644 addons/survey/i18n/kab.po create mode 100644 addons/survey/i18n/km.po create mode 100644 addons/survey/i18n/ko.po create mode 100644 addons/survey/i18n/lb.po create mode 100644 addons/survey/i18n/lt.po create mode 100644 addons/survey/i18n/lv.po create mode 100644 addons/survey/i18n/mk.po create mode 100644 addons/survey/i18n/mn.po create mode 100644 addons/survey/i18n/nb.po create mode 100644 addons/survey/i18n/nl.po create mode 100644 addons/survey/i18n/nl_BE.po create mode 100644 addons/survey/i18n/pl.po create mode 100644 addons/survey/i18n/pt.po create mode 100644 addons/survey/i18n/pt_BR.po create mode 100644 addons/survey/i18n/ro.po create mode 100644 addons/survey/i18n/ru.po create mode 100644 addons/survey/i18n/si.po create mode 100644 addons/survey/i18n/sk.po create mode 100644 addons/survey/i18n/sl.po create mode 100644 addons/survey/i18n/sr.po create mode 100644 addons/survey/i18n/sr@latin.po create mode 100644 addons/survey/i18n/survey.pot create mode 100644 addons/survey/i18n/sv.po create mode 100644 addons/survey/i18n/th.po create mode 100644 addons/survey/i18n/tr.po create mode 100644 addons/survey/i18n/uk.po create mode 100644 addons/survey/i18n/ur.po create mode 100644 addons/survey/i18n/vi.po create mode 100644 addons/survey/i18n/zh_CN.po create mode 100644 addons/survey/i18n/zh_TW.po create mode 100644 addons/survey/models/__init__.py create mode 100644 addons/survey/models/badge.py create mode 100644 addons/survey/models/challenge.py create mode 100644 addons/survey/models/res_partner.py create mode 100644 addons/survey/models/survey_question.py create mode 100644 addons/survey/models/survey_survey.py create mode 100644 addons/survey/models/survey_user.py create mode 100644 addons/survey/security/ir.model.access.csv create mode 100644 addons/survey/security/survey_security.xml create mode 100644 addons/survey/static/description/icon.png create mode 100644 addons/survey/static/description/icon.svg create mode 100644 addons/survey/static/img/africa.png create mode 100644 addons/survey/static/img/asia.png create mode 100644 addons/survey/static/img/china.jpg create mode 100644 addons/survey/static/img/coniferous.jpg create mode 100644 addons/survey/static/img/cornaceae.jpg create mode 100644 addons/survey/static/img/douglas_fir.jpg create mode 100644 addons/survey/static/img/europe.png create mode 100644 addons/survey/static/img/european_yew.jpg create mode 100644 addons/survey/static/img/japan.jpg create mode 100644 addons/survey/static/img/mountain_pine.jpg create mode 100644 addons/survey/static/img/norway_spruce.jpg create mode 100644 addons/survey/static/img/pinaceae.jpg create mode 100644 addons/survey/static/img/pinus_sylvestris.jpg create mode 100644 addons/survey/static/img/salicaceae.jpg create mode 100644 addons/survey/static/img/south_america.png create mode 100644 addons/survey/static/img/south_korea.jpg create mode 100644 addons/survey/static/img/survey_background.jpg create mode 100644 addons/survey/static/img/ulmaceae.jpg create mode 100644 addons/survey/static/img/vietnam.jpg create mode 100644 addons/survey/static/src/css/survey_print.css create mode 100644 addons/survey/static/src/css/survey_result.css create mode 100755 addons/survey/static/src/fonts/ETHOS-REGULAR.OTF create mode 100644 addons/survey/static/src/fonts/MrDeHaviland-Regular.ttf create mode 100644 addons/survey/static/src/fonts/MrDeHaviland-ofl.txt create mode 100644 addons/survey/static/src/fonts/Oswald-Light.ttf create mode 100644 addons/survey/static/src/img/burger_quiz_background.jpg create mode 100644 addons/survey/static/src/img/burger_quiz_cubism_klein.jpg create mode 100644 addons/survey/static/src/img/burger_quiz_don_quixote.jpg create mode 100644 addons/survey/static/src/img/burger_quiz_guernica.jpg create mode 100644 addons/survey/static/src/img/burger_quiz_self_portrait.jpg create mode 100644 addons/survey/static/src/img/certification_bg_classic_blue.jpg create mode 100644 addons/survey/static/src/img/certification_bg_classic_default.jpg create mode 100644 addons/survey/static/src/img/certification_bg_classic_gold.jpg create mode 100644 addons/survey/static/src/img/certification_bg_modern.png create mode 100644 addons/survey/static/src/img/certification_seal.svg create mode 100644 addons/survey/static/src/img/survey_background.jpg create mode 100644 addons/survey/static/src/img/survey_background_2.jpg create mode 100644 addons/survey/static/src/img/trophy-solid.svg create mode 100644 addons/survey/static/src/img/watermark.png create mode 100644 addons/survey/static/src/js/fields_form_page_description.js create mode 100644 addons/survey/static/src/js/fields_section_one2many.js create mode 100644 addons/survey/static/src/js/libs/chartjs-plugin-datalabels.min.js create mode 100644 addons/survey/static/src/js/survey_breadcrumb.js create mode 100644 addons/survey/static/src/js/survey_form.js create mode 100644 addons/survey/static/src/js/survey_print.js create mode 100644 addons/survey/static/src/js/survey_quick_access.js create mode 100644 addons/survey/static/src/js/survey_result.js create mode 100644 addons/survey/static/src/js/survey_session_chart.js create mode 100644 addons/survey/static/src/js/survey_session_colors.js create mode 100644 addons/survey/static/src/js/survey_session_leaderboard.js create mode 100644 addons/survey/static/src/js/survey_session_manage.js create mode 100644 addons/survey/static/src/js/survey_session_text_answers.js create mode 100644 addons/survey/static/src/js/survey_timer.js create mode 100644 addons/survey/static/src/scss/survey_form.scss create mode 100644 addons/survey/static/src/scss/survey_reports.scss create mode 100644 addons/survey/static/src/scss/survey_views.scss create mode 100644 addons/survey/static/src/xml/survey_breadcrumb_templates.xml create mode 100644 addons/survey/static/src/xml/survey_session_text_answer_template.xml create mode 100644 addons/survey/static/tests/tours/certification_failure.js create mode 100644 addons/survey/static/tests/tours/certification_success.js create mode 100644 addons/survey/static/tests/tours/survey.js create mode 100644 addons/survey/static/tests/tours/survey_prefill.js create mode 100644 addons/survey/static/tests/tours/survey_session_manage_test.js create mode 100644 addons/survey/static/tests/tours/survey_tour_session_create.js create mode 100644 addons/survey/static/tests/tours/survey_tour_session_manage.js create mode 100644 addons/survey/static/tests/tours/survey_tour_session_start.js create mode 100644 addons/survey/static/tests/tours/survey_tour_session_tools.js create mode 100644 addons/survey/tests/__init__.py create mode 100644 addons/survey/tests/common.py create mode 100644 addons/survey/tests/test_certification_badge.py create mode 100644 addons/survey/tests/test_certification_flow.py create mode 100644 addons/survey/tests/test_survey.py create mode 100644 addons/survey/tests/test_survey_compute_pages_questions.py create mode 100644 addons/survey/tests/test_survey_flow.py create mode 100644 addons/survey/tests/test_survey_flow_with_conditions.py create mode 100644 addons/survey/tests/test_survey_invite.py create mode 100644 addons/survey/tests/test_survey_randomize.py create mode 100644 addons/survey/tests/test_survey_security.py create mode 100644 addons/survey/tests/test_survey_ui_certification.py create mode 100644 addons/survey/tests/test_survey_ui_feedback.py create mode 100644 addons/survey/tests/test_survey_ui_session.py create mode 100644 addons/survey/views/assets.xml create mode 100644 addons/survey/views/gamification_badge_views.xml create mode 100644 addons/survey/views/res_partner_views.xml create mode 100644 addons/survey/views/survey_menus.xml create mode 100644 addons/survey/views/survey_question_views.xml create mode 100644 addons/survey/views/survey_report_templates.xml create mode 100644 addons/survey/views/survey_reports.xml create mode 100644 addons/survey/views/survey_survey_views.xml create mode 100644 addons/survey/views/survey_templates.xml create mode 100644 addons/survey/views/survey_templates_management.xml create mode 100644 addons/survey/views/survey_templates_print.xml create mode 100644 addons/survey/views/survey_templates_statistics.xml create mode 100644 addons/survey/views/survey_templates_user_input_session.xml create mode 100644 addons/survey/views/survey_user_views.xml create mode 100644 addons/survey/wizard/__init__.py create mode 100644 addons/survey/wizard/survey_invite.py create mode 100644 addons/survey/wizard/survey_invite_views.xml (limited to 'addons/survey') diff --git a/addons/survey/__init__.py b/addons/survey/__init__.py new file mode 100644 index 00000000..c158f87e --- /dev/null +++ b/addons/survey/__init__.py @@ -0,0 +1,6 @@ +# -*- encoding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import controllers +from . import models +from . import wizard diff --git a/addons/survey/__manifest__.py b/addons/survey/__manifest__.py new file mode 100644 index 00000000..d644b46f --- /dev/null +++ b/addons/survey/__manifest__.py @@ -0,0 +1,60 @@ +# -*- encoding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': 'Surveys', + 'version': '3.2', + 'category': 'Marketing/Surveys', + '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. + """, + 'summary': 'Create surveys and analyze answers', + 'website': 'https://www.odoo.com/page/survey', + 'depends': [ + 'auth_signup', + 'http_routing', + 'mail', + 'web_tour', + 'gamification'], + 'data': [ + 'views/survey_report_templates.xml', + 'views/survey_reports.xml', + 'data/mail_template_data.xml', + 'data/ir_actions_data.xml', + 'security/survey_security.xml', + 'security/ir.model.access.csv', + 'views/assets.xml', + 'views/survey_menus.xml', + 'views/survey_survey_views.xml', + 'views/survey_user_views.xml', + 'views/survey_question_views.xml', + 'views/survey_templates.xml', + 'views/survey_templates_management.xml', + 'views/survey_templates_print.xml', + 'views/survey_templates_statistics.xml', + 'views/survey_templates_user_input_session.xml', + 'views/gamification_badge_views.xml', + 'wizard/survey_invite_views.xml', + 'views/res_partner_views.xml', + ], + 'demo': [ + 'data/survey_demo_user.xml', + 'data/survey_demo_feedback.xml', + 'data/survey_demo_certification.xml', + 'data/survey_demo_quiz.xml', + 'data/survey_demo_quiz_userinput.xml', + 'data/survey_demo_conditional.xml', + 'data/survey.user_input.line.csv' + ], + 'installable': True, + 'auto_install': False, + 'application': True, + 'sequence': 220, + 'license': 'LGPL-3', +} diff --git a/addons/survey/controllers/__init__.py b/addons/survey/controllers/__init__.py new file mode 100644 index 00000000..0bbff652 --- /dev/null +++ b/addons/survey/controllers/__init__.py @@ -0,0 +1,5 @@ +# -*- encoding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main +from . import survey_session_manage diff --git a/addons/survey/controllers/main.py b/addons/survey/controllers/main.py new file mode 100644 index 00000000..e7aa1f7b --- /dev/null +++ b/addons/survey/controllers/main.py @@ -0,0 +1,700 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import json +import logging +import werkzeug + +from datetime import datetime, timedelta +from dateutil.relativedelta import relativedelta + +from odoo import fields, http, _ +from odoo.addons.base.models.ir_ui_view import keep_query +from odoo.exceptions import UserError +from odoo.http import request, content_disposition +from odoo.osv import expression +from odoo.tools import format_datetime, format_date, is_html_empty + +from odoo.addons.web.controllers.main import Binary + +_logger = logging.getLogger(__name__) + + +class Survey(http.Controller): + + # ------------------------------------------------------------ + # ACCESS + # ------------------------------------------------------------ + + def _fetch_from_access_token(self, survey_token, answer_token): + """ Check that given token matches an answer from the given survey_id. + Returns a sudo-ed browse record of survey in order to avoid access rights + issues now that access is granted through token. """ + survey_sudo = request.env['survey.survey'].with_context(active_test=False).sudo().search([('access_token', '=', survey_token)]) + if not answer_token: + answer_sudo = request.env['survey.user_input'].sudo() + else: + answer_sudo = request.env['survey.user_input'].sudo().search([ + ('survey_id', '=', survey_sudo.id), + ('access_token', '=', answer_token) + ], limit=1) + return survey_sudo, answer_sudo + + def _check_validity(self, survey_token, answer_token, ensure_token=True): + """ Check survey is open and can be taken. This does not checks for + security rules, only functional / business rules. It returns a string key + allowing further manipulation of validity issues + + * survey_wrong: survey does not exist; + * survey_auth: authentication is required; + * survey_closed: survey is closed and does not accept input anymore; + * survey_void: survey is void and should not be taken; + * token_wrong: given token not recognized; + * token_required: no token given although it is necessary to access the + survey; + * answer_deadline: token linked to an expired answer; + + :param ensure_token: whether user input existence based on given access token + should be enforced or not, depending on the route requesting a token or + allowing external world calls; + """ + survey_sudo, answer_sudo = self._fetch_from_access_token(survey_token, answer_token) + + if not survey_sudo.exists(): + return 'survey_wrong' + + if answer_token and not answer_sudo: + return 'token_wrong' + + if not answer_sudo and ensure_token: + return 'token_required' + if not answer_sudo and survey_sudo.access_mode == 'token': + return 'token_required' + + if survey_sudo.users_login_required and request.env.user._is_public(): + return 'survey_auth' + + if (survey_sudo.state == 'closed' or survey_sudo.state == 'draft' or not survey_sudo.active) and (not answer_sudo or not answer_sudo.test_entry): + return 'survey_closed' + + if (not survey_sudo.page_ids and survey_sudo.questions_layout == 'page_per_section') or not survey_sudo.question_ids: + return 'survey_void' + + if answer_sudo and answer_sudo.deadline and answer_sudo.deadline < datetime.now(): + return 'answer_deadline' + + return True + + def _get_access_data(self, survey_token, answer_token, ensure_token=True): + """ Get back data related to survey and user input, given the ID and access + token provided by the route. + + : param ensure_token: whether user input existence should be enforced or not(see ``_check_validity``) + """ + survey_sudo, answer_sudo = request.env['survey.survey'].sudo(), request.env['survey.user_input'].sudo() + has_survey_access, can_answer = False, False + + validity_code = self._check_validity(survey_token, answer_token, ensure_token=ensure_token) + if validity_code != 'survey_wrong': + survey_sudo, answer_sudo = self._fetch_from_access_token(survey_token, answer_token) + try: + survey_user = survey_sudo.with_user(request.env.user) + survey_user.check_access_rights(self, 'read', raise_exception=True) + survey_user.check_access_rule(self, 'read') + except: + pass + else: + has_survey_access = True + can_answer = bool(answer_sudo) + if not can_answer: + can_answer = survey_sudo.access_mode == 'public' + + return { + 'survey_sudo': survey_sudo, + 'answer_sudo': answer_sudo, + 'has_survey_access': has_survey_access, + 'can_answer': can_answer, + 'validity_code': validity_code, + } + + def _redirect_with_error(self, access_data, error_key): + survey_sudo = access_data['survey_sudo'] + answer_sudo = access_data['answer_sudo'] + + if error_key == 'survey_void' and access_data['can_answer']: + return request.render("survey.survey_void_content", {'survey': survey_sudo, 'answer': answer_sudo}) + elif error_key == 'survey_closed' and access_data['can_answer']: + return request.render("survey.survey_closed_expired", {'survey': survey_sudo}) + elif error_key == 'survey_auth': + if not answer_sudo: # survey is not even started + redirect_url = '/web/login?redirect=/survey/start/%s' % survey_sudo.access_token + elif answer_sudo.access_token: # survey is started but user is not logged in anymore. + if answer_sudo.partner_id and (answer_sudo.partner_id.user_ids or survey_sudo.users_can_signup): + if answer_sudo.partner_id.user_ids: + answer_sudo.partner_id.signup_cancel() + else: + answer_sudo.partner_id.signup_prepare(expiration=fields.Datetime.now() + relativedelta(days=1)) + redirect_url = answer_sudo.partner_id._get_signup_url_for_action(url='/survey/start/%s?answer_token=%s' % (survey_sudo.access_token, answer_sudo.access_token))[answer_sudo.partner_id.id] + else: + redirect_url = '/web/login?redirect=%s' % ('/survey/start/%s?answer_token=%s' % (survey_sudo.access_token, answer_sudo.access_token)) + return request.render("survey.survey_auth_required", {'survey': survey_sudo, 'redirect_url': redirect_url}) + elif error_key == 'answer_deadline' and answer_sudo.access_token: + return request.render("survey.survey_closed_expired", {'survey': survey_sudo}) + + return werkzeug.utils.redirect("/") + + # ------------------------------------------------------------ + # TEST / RETRY SURVEY ROUTES + # ------------------------------------------------------------ + + @http.route('/survey/test/', type='http', auth='user', website=True) + def survey_test(self, survey_token, **kwargs): + """ Test mode for surveys: create a test answer, only for managers or officers + testing their surveys """ + survey_sudo, dummy = self._fetch_from_access_token(survey_token, False) + try: + answer_sudo = survey_sudo._create_answer(user=request.env.user, test_entry=True) + except: + return werkzeug.utils.redirect('/') + return request.redirect('/survey/start/%s?%s' % (survey_sudo.access_token, keep_query('*', answer_token=answer_sudo.access_token))) + + @http.route('/survey/retry//', type='http', auth='public', website=True) + def survey_retry(self, survey_token, answer_token, **post): + """ This route is called whenever the user has attempts left and hits the 'Retry' button + after failing the survey.""" + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return self._redirect_with_error(access_data, access_data['validity_code']) + + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + if not answer_sudo: + # attempts to 'retry' without having tried first + return werkzeug.utils.redirect("/") + + try: + retry_answer_sudo = survey_sudo._create_answer( + user=request.env.user, + partner=answer_sudo.partner_id, + email=answer_sudo.email, + invite_token=answer_sudo.invite_token, + test_entry=answer_sudo.test_entry, + **self._prepare_retry_additional_values(answer_sudo) + ) + except: + return werkzeug.utils.redirect("/") + return request.redirect('/survey/start/%s?%s' % (survey_sudo.access_token, keep_query('*', answer_token=retry_answer_sudo.access_token))) + + def _prepare_retry_additional_values(self, answer): + return { + 'deadline': answer.deadline, + } + + def _prepare_survey_finished_values(self, survey, answer, token=False): + values = {'survey': survey, 'answer': answer} + if token: + values['token'] = token + if survey.scoring_type != 'no_scoring' and survey.certification: + values['graph_data'] = json.dumps(answer._prepare_statistics()[0]) + return values + + # ------------------------------------------------------------ + # TAKING SURVEY ROUTES + # ------------------------------------------------------------ + + @http.route('/survey/start/', type='http', auth='public', website=True) + def survey_start(self, survey_token, answer_token=None, email=False, **post): + """ Start a survey by providing + * a token linked to a survey; + * a token linked to an answer or generate a new token if access is allowed; + """ + # Get the current answer token from cookie + if not answer_token: + answer_token = request.httprequest.cookies.get('survey_%s' % survey_token) + + access_data = self._get_access_data(survey_token, answer_token, ensure_token=False) + if access_data['validity_code'] is not True: + return self._redirect_with_error(access_data, access_data['validity_code']) + + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + if not answer_sudo: + try: + answer_sudo = survey_sudo._create_answer(user=request.env.user, email=email) + except UserError: + answer_sudo = False + + if not answer_sudo: + try: + survey_sudo.with_user(request.env.user).check_access_rights('read') + survey_sudo.with_user(request.env.user).check_access_rule('read') + except: + return werkzeug.utils.redirect("/") + else: + return request.render("survey.survey_403_page", {'survey': survey_sudo}) + + return request.redirect('/survey/%s/%s' % (survey_sudo.access_token, answer_sudo.access_token)) + + def _prepare_survey_data(self, survey_sudo, answer_sudo, **post): + """ This method prepares all the data needed for template rendering, in function of the survey user input state. + :param post: + - previous_page_id : come from the breadcrumb or the back button and force the next questions to load + to be the previous ones. """ + data = { + 'is_html_empty': is_html_empty, + 'survey': survey_sudo, + 'answer': answer_sudo, + 'breadcrumb_pages': [{ + 'id': page.id, + 'title': page.title, + } for page in survey_sudo.page_ids], + 'format_datetime': lambda dt: format_datetime(request.env, dt, dt_format=False), + 'format_date': lambda date: format_date(request.env, date) + } + if survey_sudo.questions_layout != 'page_per_question': + triggering_answer_by_question, triggered_questions_by_answer, selected_answers = answer_sudo._get_conditional_values() + data.update({ + 'triggering_answer_by_question': { + question.id: triggering_answer_by_question[question].id for question in triggering_answer_by_question.keys() + if triggering_answer_by_question[question] + }, + 'triggered_questions_by_answer': { + answer.id: triggered_questions_by_answer[answer].ids + for answer in triggered_questions_by_answer.keys() + }, + 'selected_answers': selected_answers.ids + }) + + if not answer_sudo.is_session_answer and survey_sudo.is_time_limited and answer_sudo.start_datetime: + data.update({ + 'timer_start': answer_sudo.start_datetime.isoformat(), + 'time_limit_minutes': survey_sudo.time_limit + }) + + page_or_question_key = 'question' if survey_sudo.questions_layout == 'page_per_question' else 'page' + + # Bypass all if page_id is specified (comes from breadcrumb or previous button) + if 'previous_page_id' in post: + previous_page_or_question_id = int(post['previous_page_id']) + new_previous_id = survey_sudo._get_next_page_or_question(answer_sudo, previous_page_or_question_id, go_back=True).id + page_or_question = request.env['survey.question'].sudo().browse(previous_page_or_question_id) + data.update({ + page_or_question_key: page_or_question, + 'previous_page_id': new_previous_id, + 'has_answered': answer_sudo.user_input_line_ids.filtered(lambda line: line.question_id.id == new_previous_id), + 'can_go_back': survey_sudo._can_go_back(answer_sudo, page_or_question), + }) + return data + + if answer_sudo.state == 'in_progress': + if answer_sudo.is_session_answer: + next_page_or_question = survey_sudo.session_question_id + else: + next_page_or_question = survey_sudo._get_next_page_or_question( + answer_sudo, + answer_sudo.last_displayed_page_id.id if answer_sudo.last_displayed_page_id else 0) + + if next_page_or_question: + data.update({ + 'survey_last': survey_sudo._is_last_page_or_question(answer_sudo, next_page_or_question) + }) + + if answer_sudo.is_session_answer and next_page_or_question.is_time_limited: + data.update({ + 'timer_start': survey_sudo.session_question_start_time.isoformat(), + 'time_limit_minutes': next_page_or_question.time_limit / 60 + }) + + data.update({ + page_or_question_key: next_page_or_question, + 'has_answered': answer_sudo.user_input_line_ids.filtered(lambda line: line.question_id == next_page_or_question), + 'can_go_back': survey_sudo._can_go_back(answer_sudo, next_page_or_question), + }) + if survey_sudo.questions_layout != 'one_page': + data.update({ + 'previous_page_id': survey_sudo._get_next_page_or_question(answer_sudo, next_page_or_question.id, go_back=True).id + }) + elif answer_sudo.state == 'done' or answer_sudo.survey_time_limit_reached: + # Display success message + return self._prepare_survey_finished_values(survey_sudo, answer_sudo) + + return data + + def _prepare_question_html(self, survey_sudo, answer_sudo, **post): + """ Survey page navigation is done in AJAX. This function prepare the 'next page' to display in html + and send back this html to the survey_form widget that will inject it into the page.""" + survey_data = self._prepare_survey_data(survey_sudo, answer_sudo, **post) + + survey_content = False + if answer_sudo.state == 'done': + survey_content = request.env.ref('survey.survey_fill_form_done')._render(survey_data) + else: + survey_content = request.env.ref('survey.survey_fill_form_in_progress')._render(survey_data) + + survey_progress = False + if answer_sudo.state == 'in_progress' and not survey_data.get('question', request.env['survey.question']).is_page: + if survey_sudo.questions_layout == 'page_per_section': + page_ids = survey_sudo.page_ids.ids + survey_progress = request.env.ref('survey.survey_progression')._render({ + 'survey': survey_sudo, + 'page_ids': page_ids, + 'page_number': page_ids.index(survey_data['page'].id) + (1 if survey_sudo.progression_mode == 'number' else 0) + }) + elif survey_sudo.questions_layout == 'page_per_question': + page_ids = survey_sudo.question_ids.ids + survey_progress = request.env.ref('survey.survey_progression')._render({ + 'survey': survey_sudo, + 'page_ids': page_ids, + 'page_number': page_ids.index(survey_data['question'].id) + }) + + return { + 'survey_content': survey_content, + 'survey_progress': survey_progress, + 'survey_navigation': request.env.ref('survey.survey_navigation')._render(survey_data), + } + + @http.route('/survey//', type='http', auth='public', website=True) + def survey_display_page(self, survey_token, answer_token, **post): + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return self._redirect_with_error(access_data, access_data['validity_code']) + + answer_sudo = access_data['answer_sudo'] + if answer_sudo.state != 'done' and answer_sudo.survey_time_limit_reached: + answer_sudo._mark_done() + + return request.render('survey.survey_page_fill', + self._prepare_survey_data(access_data['survey_sudo'], answer_sudo, **post)) + + @http.route('/survey/get_background_image//', type='http', auth="public", website=True, sitemap=False) + def survey_get_background(self, survey_token, answer_token): + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return werkzeug.exceptions.Forbidden() + + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + + status, headers, image_base64 = request.env['ir.http'].sudo().binary_content( + model='survey.survey', id=survey_sudo.id, field='background_image', + default_mimetype='image/png') + + return Binary._content_image_get_response(status, headers, image_base64) + + @http.route('/survey/get_question_image////', type='http', auth="public", website=True, sitemap=False) + def survey_get_question_image(self, survey_token, answer_token, question_id, suggested_answer_id): + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return werkzeug.exceptions.Forbidden() + + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + + if not survey_sudo.question_ids.filtered(lambda q: q.id == question_id)\ + .suggested_answer_ids.filtered(lambda a: a.id == suggested_answer_id): + return werkzeug.exceptions.NotFound() + + status, headers, image_base64 = request.env['ir.http'].sudo().binary_content( + model='survey.question.answer', id=suggested_answer_id, field='value_image', + default_mimetype='image/png') + + return Binary._content_image_get_response(status, headers, image_base64) + + # ---------------------------------------------------------------- + # JSON ROUTES to begin / continue survey (ajax navigation) + Tools + # ---------------------------------------------------------------- + + @http.route('/survey/begin//', type='json', auth='public', website=True) + def survey_begin(self, survey_token, answer_token, **post): + """ Route used to start the survey user input and display the first survey page. """ + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return {'error': access_data['validity_code']} + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + + if answer_sudo.state != "new": + return {'error': _("The survey has already started.")} + + answer_sudo._mark_in_progress() + return self._prepare_question_html(survey_sudo, answer_sudo, **post) + + @http.route('/survey/next_question//', type='json', auth='public', website=True) + def survey_next_question(self, survey_token, answer_token, **post): + """ Method used to display the next survey question in an ongoing session. + Triggered on all attendees screens when the host goes to the next question. """ + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return {'error': access_data['validity_code']} + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + + if answer_sudo.state == 'new' and answer_sudo.is_session_answer: + answer_sudo._mark_in_progress() + + return self._prepare_question_html(survey_sudo, answer_sudo, **post) + + @http.route('/survey/submit//', type='json', auth='public', website=True) + def survey_submit(self, survey_token, answer_token, **post): + """ Submit a page from the survey. + This will take into account the validation errors and store the answers to the questions. + If the time limit is reached, errors will be skipped, answers will be ignored and + survey state will be forced to 'done'""" + # Survey Validation + access_data = self._get_access_data(survey_token, answer_token, ensure_token=True) + if access_data['validity_code'] is not True: + return {'error': access_data['validity_code']} + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + + if answer_sudo.state == 'done': + return {'error': 'unauthorized'} + + questions, page_or_question_id = survey_sudo._get_survey_questions(answer=answer_sudo, + page_id=post.get('page_id'), + question_id=post.get('question_id')) + + if not answer_sudo.test_entry and not survey_sudo._has_attempts_left(answer_sudo.partner_id, answer_sudo.email, answer_sudo.invite_token): + # prevent cheating with users creating multiple 'user_input' before their last attempt + return {'error': 'unauthorized'} + + if answer_sudo.survey_time_limit_reached or answer_sudo.question_time_limit_reached: + if answer_sudo.question_time_limit_reached: + time_limit = survey_sudo.session_question_start_time + relativedelta( + seconds=survey_sudo.session_question_id.time_limit + ) + time_limit += timedelta(seconds=3) + else: + time_limit = answer_sudo.start_datetime + timedelta(minutes=survey_sudo.time_limit) + time_limit += timedelta(seconds=10) + if fields.Datetime.now() > time_limit: + # prevent cheating with users blocking the JS timer and taking all their time to answer + return {'error': 'unauthorized'} + + errors = {} + # Prepare answers / comment by question, validate and save answers + for question in questions: + inactive_questions = request.env['survey.question'] if answer_sudo.is_session_answer else answer_sudo._get_inactive_conditional_questions() + if question in inactive_questions: # if question is inactive, skip validation and save + continue + answer, comment = self._extract_comment_from_answers(question, post.get(str(question.id))) + errors.update(question.validate_question(answer, comment)) + if not errors.get(question.id): + answer_sudo.save_lines(question, answer, comment) + + if errors and not (answer_sudo.survey_time_limit_reached or answer_sudo.question_time_limit_reached): + return {'error': 'validation', 'fields': errors} + + if not answer_sudo.is_session_answer: + answer_sudo._clear_inactive_conditional_answers() + + if answer_sudo.survey_time_limit_reached or survey_sudo.questions_layout == 'one_page': + answer_sudo._mark_done() + elif 'previous_page_id' in post: + # Go back to specific page using the breadcrumb. Lines are saved and survey continues + return self._prepare_question_html(survey_sudo, answer_sudo, **post) + else: + vals = {'last_displayed_page_id': page_or_question_id} + if not answer_sudo.is_session_answer: + next_page = survey_sudo._get_next_page_or_question(answer_sudo, page_or_question_id) + if not next_page: + answer_sudo._mark_done() + + answer_sudo.write(vals) + + return self._prepare_question_html(survey_sudo, answer_sudo) + + def _extract_comment_from_answers(self, question, answers): + """ Answers is a custom structure depending of the question type + that can contain question answers but also comments that need to be + extracted before validating and saving answers. + If multiple answers, they are listed in an array, except for matrix + where answers are structured differently. See input and output for + more info on data structures. + :param question: survey.question + :param answers: + * question_type: free_text, text_box, numerical_box, date, datetime + answers is a string containing the value + * question_type: simple_choice with no comment + answers is a string containing the value ('question_id_1') + * question_type: simple_choice with comment + ['question_id_1', {'comment': str}] + * question_type: multiple choice + ['question_id_1', 'question_id_2'] + [{'comment': str}] if holds a comment + * question_type: matrix + {'matrix_row_id_1': ['question_id_1', 'question_id_2'], + 'matrix_row_id_2': ['question_id_1', 'question_id_2'] + } + {'comment': str} if holds a comment + :return: tuple( + same structure without comment, + extracted comment for given question + ) """ + comment = None + answers_no_comment = [] + if answers: + if question.question_type == 'matrix': + if 'comment' in answers: + comment = answers['comment'].strip() + answers.pop('comment') + answers_no_comment = answers + else: + if not isinstance(answers, list): + answers = [answers] + for answer in answers: + if isinstance(answer, dict) and 'comment' in answer: + comment = answer['comment'].strip() + else: + answers_no_comment.append(answer) + if len(answers_no_comment) == 1: + answers_no_comment = answers_no_comment[0] + return answers_no_comment, comment + + # ------------------------------------------------------------ + # COMPLETED SURVEY ROUTES + # ------------------------------------------------------------ + + @http.route('/survey/print/', type='http', auth='public', website=True, sitemap=False) + def survey_print(self, survey_token, review=False, answer_token=None, **post): + '''Display an survey in printable view; if is set, it will + grab the answers of the user_input_id that has .''' + access_data = self._get_access_data(survey_token, answer_token, ensure_token=False) + if access_data['validity_code'] is not True and ( + access_data['has_survey_access'] or + access_data['validity_code'] not in ['token_required', 'survey_closed', 'survey_void']): + return self._redirect_with_error(access_data, access_data['validity_code']) + + survey_sudo, answer_sudo = access_data['survey_sudo'], access_data['answer_sudo'] + + return request.render('survey.survey_page_print', { + 'is_html_empty': is_html_empty, + 'review': review, + 'survey': survey_sudo, + 'answer': answer_sudo if survey_sudo.scoring_type != 'scoring_without_answers' else answer_sudo.browse(), + 'questions_to_display': answer_sudo._get_print_questions(), + 'scoring_display_correction': survey_sudo.scoring_type == 'scoring_with_answers' and answer_sudo, + 'format_datetime': lambda dt: format_datetime(request.env, dt, dt_format=False), + 'format_date': lambda date: format_date(request.env, date), + }) + + @http.route(['/survey//get_certification_preview'], type="http", auth="user", methods=['GET'], website=True) + def survey_get_certification_preview(self, survey, **kwargs): + if not request.env.user.has_group('survey.group_survey_user'): + raise werkzeug.exceptions.Forbidden() + + fake_user_input = survey._create_answer(user=request.env.user, test_entry=True) + response = self._generate_report(fake_user_input, download=False) + fake_user_input.sudo().unlink() + return response + + @http.route(['/survey//get_certification'], type='http', auth='user', methods=['GET'], website=True) + def survey_get_certification(self, survey_id, **kwargs): + """ The certification document can be downloaded as long as the user has succeeded the certification """ + survey = request.env['survey.survey'].sudo().search([ + ('id', '=', survey_id), + ('certification', '=', True) + ]) + + if not survey: + # no certification found + return werkzeug.utils.redirect("/") + + succeeded_attempt = request.env['survey.user_input'].sudo().search([ + ('partner_id', '=', request.env.user.partner_id.id), + ('survey_id', '=', survey_id), + ('scoring_success', '=', True) + ], limit=1) + + if not succeeded_attempt: + raise UserError(_("The user has not succeeded the certification")) + + return self._generate_report(succeeded_attempt, download=True) + + # ------------------------------------------------------------ + # REPORTING SURVEY ROUTES AND TOOLS + # ------------------------------------------------------------ + + @http.route('/survey/results/', type='http', auth='user', website=True) + def survey_report(self, survey, answer_token=None, **post): + """ Display survey Results & Statistics for given survey. + + New structure: { + 'survey': current survey browse record, + 'question_and_page_data': see ``SurveyQuestion._prepare_statistics()``, + 'survey_data'= see ``SurveySurvey._prepare_statistics()`` + 'search_filters': [], + 'search_finished': either filter on finished inputs only or not, + } + """ + user_input_lines, search_filters = self._extract_filters_data(survey, post) + survey_data = survey._prepare_statistics(user_input_lines) + question_and_page_data = survey.question_and_page_ids._prepare_statistics(user_input_lines) + + template_values = { + # survey and its statistics + 'survey': survey, + 'question_and_page_data': question_and_page_data, + 'survey_data': survey_data, + # search + 'search_filters': search_filters, + 'search_finished': post.get('finished') == 'true', + } + + if survey.session_show_leaderboard: + template_values['leaderboard'] = survey._prepare_leaderboard_values() + + return request.render('survey.survey_page_statistics', template_values) + + def _generate_report(self, user_input, download=True): + report = request.env.ref('survey.certification_report').sudo()._render_qweb_pdf([user_input.id], data={'report_type': 'pdf'})[0] + + report_content_disposition = content_disposition('Certification.pdf') + if not download: + content_split = report_content_disposition.split(';') + content_split[0] = 'inline' + report_content_disposition = ';'.join(content_split) + + return request.make_response(report, headers=[ + ('Content-Type', 'application/pdf'), + ('Content-Length', len(report)), + ('Content-Disposition', report_content_disposition), + ]) + + def _get_user_input_domain(self, survey, line_filter_domain, **post): + user_input_domain = ['&', ('test_entry', '=', False), ('survey_id', '=', survey.id)] + if line_filter_domain: + matching_line_ids = request.env['survey.user_input.line'].sudo().search(line_filter_domain).ids + user_input_domain = expression.AND([ + [('user_input_line_ids', 'in', matching_line_ids)], + user_input_domain + ]) + if post.get('finished'): + user_input_domain = expression.AND([[('state', '=', 'done')], user_input_domain]) + else: + user_input_domain = expression.AND([[('state', '!=', 'new')], user_input_domain]) + return user_input_domain + + def _extract_filters_data(self, survey, post): + search_filters = [] + line_filter_domain, line_choices = [], [] + for data in post.get('filters', '').split('|'): + try: + row_id, answer_id = (int(item) for item in data.split(',')) + except: + pass + else: + if row_id and answer_id: + line_filter_domain = expression.AND([ + ['&', ('matrix_row_id', '=', row_id), ('suggested_answer_id', '=', answer_id)], + line_filter_domain + ]) + answers = request.env['survey.question.answer'].browse([row_id, answer_id]) + elif answer_id: + line_choices.append(answer_id) + answers = request.env['survey.question.answer'].browse([answer_id]) + if answer_id: + question_id = answers[0].matrix_question_id or answers[0].question_id + search_filters.append({ + 'question': question_id.title, + 'answers': '%s%s' % (answers[0].value, ': %s' % answers[1].value if len(answers) > 1 else '') + }) + if line_choices: + line_filter_domain = expression.AND([[('suggested_answer_id', 'in', line_choices)], line_filter_domain]) + + user_input_domain = self._get_user_input_domain(survey, line_filter_domain, **post) + user_input_lines = request.env['survey.user_input'].sudo().search(user_input_domain).mapped('user_input_line_ids') + + return user_input_lines, search_filters diff --git a/addons/survey/controllers/survey_session_manage.py b/addons/survey/controllers/survey_session_manage.py new file mode 100644 index 00000000..04923c99 --- /dev/null +++ b/addons/survey/controllers/survey_session_manage.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import datetime +import json +import werkzeug + +from dateutil.relativedelta import relativedelta +from werkzeug.exceptions import NotFound + +from odoo import fields, http +from odoo.http import request +from odoo.tools import is_html_empty + + +class UserInputSession(http.Controller): + def _fetch_from_token(self, survey_token): + """ Check that given survey_token matches a survey 'access_token'. + Unlike the regular survey controller, user trying to access the survey must have full access rights! """ + return request.env['survey.survey'].search([('access_token', '=', survey_token)]) + + def _fetch_from_session_code(self, session_code): + """ Matches a survey against a passed session_code. + We force the session_state to be reachable (ready / in_progress) to avoid people + using this route to access other (private) surveys. + We limit to sessions opened within the last 7 days to avoid potential abuses. """ + if session_code: + matching_survey = request.env['survey.survey'].sudo().search([ + ('state', '=', 'open'), + ('session_state', 'in', ['ready', 'in_progress']), + ('session_start_time', '>', fields.Datetime.now() - relativedelta(days=7)), + ('session_code', '=', session_code), + ], limit=1) + if matching_survey: + return matching_survey + + return False + + # ------------------------------------------------------------ + # SURVEY SESSION MANAGEMENT + # ------------------------------------------------------------ + + @http.route('/survey/session/manage/', type='http', auth='user', website=True) + def survey_session_manage(self, survey_token, **kwargs): + """ Main route used by the host to 'manager' the session. + - If the state of the session is 'ready' + We render a template allowing the host to showcase the different options of the session + and to actually start the session. + - If the state of the session is 'in_progress' + We render a template allowing the host to show the question results, display the attendees + leaderboard or go to the next question of the session. """ + + survey = self._fetch_from_token(survey_token) + + if not survey or not survey.session_state: + # no open session + return NotFound() + + if survey.session_state == 'ready': + return request.render('survey.user_input_session_open', { + 'survey': survey + }) + else: + template_values = self._prepare_manage_session_values(survey) + return request.render('survey.user_input_session_manage', template_values) + + @http.route('/survey/session/next_question/', type='json', auth='user', website=True) + def survey_session_next_question(self, survey_token, **kwargs): + """ This route is called when the host goes to the next question of the session. + + It's not a regular 'request.render' route because we handle the transition between + questions using a AJAX call to be able to display a bioutiful fade in/out effect. + + It triggers the next question of the session. + + We artificially add 1 second to the 'current_question_start_time' to account for server delay. + As the timing can influence the attendees score, we try to be fair with everyone by giving them + an extra second before we start counting down. + + Frontend should take the delay into account by displaying the appropriate animations. + + Writing the next question on the survey is sudo'ed to avoid potential access right issues. + e.g: a survey user can create a live session from any survey but he can only write + on its own survey. """ + + survey = self._fetch_from_token(survey_token) + + if not survey or not survey.session_state: + # no open session + return '' + + if survey.session_state == 'ready': + survey._session_open() + + next_question = survey._get_session_next_question() + + # using datetime.datetime because we want the millis portion + if next_question: + now = datetime.datetime.now() + survey.sudo().write({ + 'session_question_id': next_question.id, + 'session_question_start_time': fields.Datetime.now() + relativedelta(seconds=1) + }) + request.env['bus.bus'].sendone(survey.access_token, { + 'question_start': now.timestamp(), + 'type': 'next_question' + }) + + template_values = self._prepare_manage_session_values(survey) + template_values['is_rpc_call'] = True + return request.env.ref('survey.user_input_session_manage_content')._render(template_values) + else: + return False + + @http.route('/survey/session/results/', type='json', auth='user', website=True) + def survey_session_results(self, survey_token, **kwargs): + """ This route is called when the host shows the current question's results. + + It's not a regular 'request.render' route because we handle the display of results using + an AJAX request to be able to include the results in the currently displayed page. """ + + survey = self._fetch_from_token(survey_token) + + if not survey or survey.session_state != 'in_progress': + # no open session + return False + + user_input_lines = request.env['survey.user_input.line'].search([ + ('survey_id', '=', survey.id), + ('question_id', '=', survey.session_question_id.id), + ('create_date', '>=', survey.session_start_time) + ]) + + return self._prepare_question_results_values(survey, user_input_lines) + + @http.route('/survey/session/leaderboard/', type='json', auth='user', website=True) + def survey_session_leaderboard(self, survey_token, **kwargs): + """ This route is called when the host shows the current question's attendees leaderboard. + + It's not a regular 'request.render' route because we handle the display of the leaderboard + using an AJAX request to be able to include the results in the currently displayed page. """ + + survey = self._fetch_from_token(survey_token) + + if not survey or survey.session_state != 'in_progress': + # no open session + return '' + + return request.env.ref('survey.user_input_session_leaderboard')._render({ + 'animate': True, + 'leaderboard': survey._prepare_leaderboard_values() + }) + + # ------------------------------------------------------------ + # QUICK ACCESS SURVEY ROUTES + # ------------------------------------------------------------ + + @http.route('/s', type='http', auth='public', website=True, sitemap=False) + def survey_session_code(self, **post): + """ Renders the survey session code page route. + This page allows the user to enter the session code of the survey. + It is mainly used to ease survey access for attendees in session mode. """ + return request.render("survey.survey_session_code") + + @http.route('/s/', type='http', auth='public', website=True) + def survey_start_short(self, session_code): + """" Redirects to 'survey_start' route using a shortened link & token. + We match the session_code for open surveys. + This route is used in survey sessions where we need short links for people to type. """ + + survey = self._fetch_from_session_code(session_code) + if survey: + return werkzeug.utils.redirect("/survey/start/%s" % survey.access_token) + + return werkzeug.utils.redirect("/s") + + @http.route('/survey/check_session_code/', type='json', auth='public', website=True) + def survey_check_session_code(self, session_code): + """ Checks if the given code is matching a survey session_code. + If yes, redirect to /s/code route. + If not, return error. The user is invited to type again the code. """ + survey = self._fetch_from_session_code(session_code) + if survey: + return {"survey_url": "/survey/start/%s" % survey.access_token} + + return {"error": "survey_wrong"} + + def _prepare_manage_session_values(self, survey): + is_last_question = False + if survey.question_ids: + most_voted_answers = survey._get_session_most_voted_answers() + is_last_question = survey._is_last_page_or_question(most_voted_answers, survey.session_question_id) + + values = { + 'survey': survey, + 'is_last_question': is_last_question, + } + + values.update(self._prepare_question_results_values(survey, request.env['survey.user_input.line'])) + + return values + + def _prepare_question_results_values(self, survey, user_input_lines): + """ Prepares usefull values to display during the host session: + + - question_statistics_graph + The graph data to display the bar chart for questions of type 'choice' + - input_lines_values + The answer values to text/date/datetime questions + - answers_validity + An array containing the is_correct value for all question answers. + We need this special variable because of Chartjs data structure. + The library determines the parameters (color/label/...) by only passing the answer 'index' + (and not the id or anything else we can identify). + In other words, we need to know if the answer at index 2 is correct or not. + - answer_count + The number of answers to the current question. """ + + question = survey.session_question_id + answers_validity = [] + if (any(answer.is_correct for answer in question.suggested_answer_ids)): + answers_validity = [answer.is_correct for answer in question.suggested_answer_ids] + if question.comment_count_as_answer: + answers_validity.append(False) + + full_statistics = question._prepare_statistics(user_input_lines)[0] + input_line_values = [] + if question.question_type in ['char_box', 'date', 'datetime']: + input_line_values = [{ + 'id': line.id, + 'value': line['value_%s' % question.question_type] + } for line in full_statistics.get('table_data', request.env['survey.user_input.line'])[:100]] + + return { + 'is_html_empty': is_html_empty, + 'question_statistics_graph': full_statistics.get('graph_data'), + 'input_line_values': input_line_values, + 'answers_validity': json.dumps(answers_validity), + 'answer_count': survey.session_question_answer_count, + 'attendees_count': survey.session_answer_count, + } diff --git a/addons/survey/data/ir_actions_data.xml b/addons/survey/data/ir_actions_data.xml new file mode 100644 index 00000000..7e0473fd --- /dev/null +++ b/addons/survey/data/ir_actions_data.xml @@ -0,0 +1,16 @@ + + + + + Survey: Clean test answers + ir.actions.server + + + code + +if records: + env['survey.user_input'].search([('survey_id', 'in', records.ids), ('test_entry', '=', 'True')]).unlink() + + + + \ No newline at end of file diff --git a/addons/survey/data/mail_template_data.xml b/addons/survey/data/mail_template_data.xml new file mode 100644 index 00000000..1e138281 --- /dev/null +++ b/addons/survey/data/mail_template_data.xml @@ -0,0 +1,78 @@ + + + + + Survey: Invite + + Participate to ${object.survey_id.title} survey + ${(object.partner_id.email_formatted or object.email) |safe} + +
+

+ Dear ${object.partner_id.name or 'participant'}

+ % if object.survey_id.certification: + You have been invited to take a new certification. + % else: + We are conducting a survey and your response would be appreciated. + % endif +

+ % if object.deadline: + Please answer the survey for ${format_date(object.deadline)}.

+ % endif + Thank you for your participation. +

+
+
+ ${object.partner_id.lang} + +
+ + + + Survey: Send certification by email + + Certification: ${object.survey_id.display_name} + ${(object.survey_id.create_uid.email_formatted or user.email_formatted or user.company_id.catchall_formatted) |safe} + ${(object.partner_id.email_formatted or object.email) |safe} + +
+ + + + +
+ + + + Certification: ${object.survey_id.display_name} +
+ + + + +
+

Dear ${object.partner_id.name or 'participant'}

+

+ Here is, in attachment, your certification document for + ${object.survey_id.display_name} +

+

Congratulations for succeeding the test!

+
+
+
+ + Certification Document + ${object.partner_id.lang} + +
+
+
diff --git a/addons/survey/data/survey.user_input.line.csv b/addons/survey/data/survey.user_input.line.csv new file mode 100644 index 00000000..1d75f750 --- /dev/null +++ b/addons/survey/data/survey.user_input.line.csv @@ -0,0 +1,107 @@ +id,user_input_id:id,question_id:id,skipped,answer_type,value_char_box,value_numerical_box,value_date,value_datetime,value_text_box,suggested_answer_id:id,matrix_row_id:id +survey_answer_1_p1_q1,survey_answer_1,survey_feedback_p1_q1,False,char_box,Brussels,,,,,, +survey_answer_1_p1_q2,survey_answer_1,survey_feedback_p1_q2,False,date,,,1980-01-11,,,, +survey_answer_1_p1_q3,survey_answer_1,survey_feedback_p1_q3,False,suggestion,,,,,,survey_feedback_p1_q3_sug3, +survey_answer_1_p1_q4,survey_answer_1,survey_feedback_p1_q4,False,numerical_box,,4,,,,, +survey_answer_1_p2_q1_1,survey_answer_1,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug1, +survey_answer_1_p2_q1_2,survey_answer_1,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug2, +survey_answer_1_p2_q2_1,survey_answer_1,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col3,survey_feedback_p2_q2_row1 +survey_answer_1_p2_q2_2,survey_answer_1,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col3,survey_feedback_p2_q2_row2 +survey_answer_1_p2_q2_3,survey_answer_1,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col2,survey_feedback_p2_q2_row3 +survey_answer_1_p2_q2_4,survey_answer_1,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col4,survey_feedback_p2_q2_row4 +survey_answer_1_p2_q2_5,survey_answer_1,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col2,survey_feedback_p2_q2_row5 +survey_answer_1_p2_q3,survey_answer_1,survey_feedback_p2_q3,False,text_box,,,,,Thanks for the good quality of your products,, +survey_answer_2_p1_q1,survey_answer_2,survey_feedback_p1_q1,False,char_box,Paris,,,,,, +survey_answer_2_p1_q2,survey_answer_2,survey_feedback_p1_q2,True,,,,,,,, +survey_answer_2_p1_q3,survey_answer_2,survey_feedback_p1_q3,False,suggestion,,,,,,survey_feedback_p1_q3_sug2, +survey_answer_2_p1_q4,survey_answer_2,survey_feedback_p1_q4,False,numerical_box,,10,,,,, +survey_answer_2_p2_q1_1,survey_answer_2,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug2, +survey_answer_2_p2_q1_2,survey_answer_2,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug3, +survey_answer_2_p2_q1_3,survey_answer_2,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug4, +survey_answer_2_p2_q2_1,survey_answer_2,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col4,survey_feedback_p2_q2_row1 +survey_answer_2_p2_q2_2,survey_answer_2,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col3,survey_feedback_p2_q2_row2 +survey_answer_2_p2_q2_3,survey_answer_2,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col3,survey_feedback_p2_q2_row3 +survey_answer_2_p2_q2_4,survey_answer_2,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col4,survey_feedback_p2_q2_row4 +survey_answer_2_p2_q2_5,survey_answer_2,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col3,survey_feedback_p2_q2_row5 +survey_answer_2_p2_q3,survey_answer_2,survey_feedback_p2_q3,False,text_box,,,,,I really appreciate your products. They are awesome !!,, +survey_answer_3_p1_q1,survey_answer_3,survey_feedback_p1_q1,False,char_box,New York,,,,,, +survey_answer_3_p1_q2,survey_answer_3,survey_feedback_p1_q2,False,date,,,1966-06-15,,,, +survey_answer_3_p1_q3,survey_answer_3,survey_feedback_p1_q3,False,suggestion,,,,,,survey_feedback_p1_q3_sug4, +survey_answer_3_p1_q4,survey_answer_3,survey_feedback_p1_q4,False,numerical_box,,1,,,,, +survey_answer_3_p2_q1_1,survey_answer_3,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug7, +survey_answer_3_p2_q1_2,survey_answer_3,survey_feedback_p2_q1,False,suggestion,,,,,,survey_feedback_p2_q1_sug8, +survey_answer_3_p2_q2_1,survey_answer_3,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col1,survey_feedback_p2_q2_row1 +survey_answer_3_p2_q2_2,survey_answer_3,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col2,survey_feedback_p2_q2_row2 +survey_answer_3_p2_q2_3,survey_answer_3,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col1,survey_feedback_p2_q2_row3 +survey_answer_3_p2_q2_4,survey_answer_3,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col3,survey_feedback_p2_q2_row4 +survey_answer_3_p2_q2_5,survey_answer_3,survey_feedback_p2_q2,False,suggestion,,,,,,survey_feedback_p2_q2_col1,survey_feedback_p2_q2_row5 +survey_answer_3_p2_q3,survey_answer_3,survey_feedback_p2_q3,False,text_box,,,,,The customizable desk received is not the one I ordered on your website and the quality is very poor ! Really disappointed.,, +survey_vendor_certification_answer_1_p1_q1,survey_vendor_certification_answer_1,vendor_certification_page_1_question_1,False,suggestion,,,,,,vendor_certification_page_1_question_1_choice_2, +survey_vendor_certification_answer_1_p1_q2_1,survey_vendor_certification_answer_1,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_1, +survey_vendor_certification_answer_1_p1_q2_2,survey_vendor_certification_answer_1,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_3, +survey_vendor_certification_answer_1_p1_q2_3,survey_vendor_certification_answer_1,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_4, +survey_vendor_certification_answer_1_p1_q3_1,survey_vendor_certification_answer_1,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_1, +survey_vendor_certification_answer_1_p1_q3_2,survey_vendor_certification_answer_1,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_3, +survey_vendor_certification_answer_1_p1_q3_3,survey_vendor_certification_answer_1,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_4, +survey_vendor_certification_answer_1_p1_q4,survey_vendor_certification_answer_1,vendor_certification_page_1_question_4,False,suggestion,,,,,,vendor_certification_page_1_question_4_choice_2, +survey_vendor_certification_answer_1_p1_q5,survey_vendor_certification_answer_1,vendor_certification_page_1_question_5,False,text_box,,,,,I think it misses a product but I don't know what,, +survey_vendor_certification_answer_1_p2_q1,survey_vendor_certification_answer_1,vendor_certification_page_2_question_1,False,suggestion,,,,,,vendor_certification_page_2_question_1_choice_4, +survey_vendor_certification_answer_1_p2_q2_1,survey_vendor_certification_answer_1,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_1, +survey_vendor_certification_answer_1_p2_q2_2,survey_vendor_certification_answer_1,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_2, +survey_vendor_certification_answer_1_p2_q2_3,survey_vendor_certification_answer_1,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_4, +survey_vendor_certification_answer_1_p2_q3,survey_vendor_certification_answer_1,vendor_certification_page_2_question_3,False,suggestion,,,,,,vendor_certification_page_2_question_3_choice_3, +survey_vendor_certification_answer_1_p3_q1,survey_vendor_certification_answer_1,vendor_certification_page_3_question_1,False,numerical_box,,30,,,,, +survey_vendor_certification_answer_1_p3_q2,survey_vendor_certification_answer_1,vendor_certification_page_3_question_2,False,date,,,2020-01-08,,,, +survey_vendor_certification_answer_1_p3_q3,survey_vendor_certification_answer_1,vendor_certification_page_3_question_3,False,datetime,,,,2021-01-07 01:00:01,,, +survey_vendor_certification_answer_1_p3_q4,survey_vendor_certification_answer_1,vendor_certification_page_3_question_4,False,date,,,2020-01-01,,,, +survey_vendor_certification_answer_1_p3_q5,survey_vendor_certification_answer_1,vendor_certification_page_3_question_5,False,datetime,,,,2021-01-01 13:00:01,,, +survey_vendor_certification_answer_1_p3_q6,survey_vendor_certification_answer_1,vendor_certification_page_3_question_6,False,numerical_box,,1000,,,,, +survey_vendor_certification_answer_2_p1_q1,survey_vendor_certification_answer_2,vendor_certification_page_1_question_1,False,suggestion,,,,,,vendor_certification_page_1_question_1_choice_2, +survey_vendor_certification_answer_2_p1_q2_1,survey_vendor_certification_answer_2,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_1, +survey_vendor_certification_answer_2_p1_q2_2,survey_vendor_certification_answer_2,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_3, +survey_vendor_certification_answer_2_p1_q3_1,survey_vendor_certification_answer_2,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_1, +survey_vendor_certification_answer_2_p1_q3_2,survey_vendor_certification_answer_2,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_3, +survey_vendor_certification_answer_2_p1_q4,survey_vendor_certification_answer_2,vendor_certification_page_1_question_4,False,suggestion,,,,,,vendor_certification_page_1_question_4_choice_2, +survey_vendor_certification_answer_2_p1_q5,survey_vendor_certification_answer_2,vendor_certification_page_1_question_5,True,,,,,,,, +survey_vendor_certification_answer_2_p2_q1,survey_vendor_certification_answer_2,vendor_certification_page_2_question_1,False,suggestion,,,,,,vendor_certification_page_2_question_1_choice_4, +survey_vendor_certification_answer_2_p2_q2_1,survey_vendor_certification_answer_2,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_1, +survey_vendor_certification_answer_2_p2_q2_2,survey_vendor_certification_answer_2,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_2, +survey_vendor_certification_answer_2_p2_q2_3,survey_vendor_certification_answer_2,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_4, +survey_vendor_certification_answer_2_p2_q3,survey_vendor_certification_answer_2,vendor_certification_page_2_question_3,False,suggestion,,,,,,vendor_certification_page_2_question_3_choice_4, +survey_vendor_certification_answer_2_p3_q1,survey_vendor_certification_answer_2,vendor_certification_page_3_question_1,False,numerical_box,,30,,,,, +survey_vendor_certification_answer_2_p3_q2,survey_vendor_certification_answer_2,vendor_certification_page_3_question_2,False,date,,,2020-01-09,,,, +survey_vendor_certification_answer_2_p3_q3,survey_vendor_certification_answer_2,vendor_certification_page_3_question_3,False,datetime,,,,2021-01-07 01:00:01,,, +survey_vendor_certification_answer_2_p3_q4,survey_vendor_certification_answer_2,vendor_certification_page_3_question_4,True,,,,,,,, +survey_vendor_certification_answer_2_p3_q5,survey_vendor_certification_answer_2,vendor_certification_page_3_question_5,True,,,,,,,, +survey_vendor_certification_answer_2_p3_q6,survey_vendor_certification_answer_2,vendor_certification_page_3_question_6,False,numerical_box,,0,,,,, +survey_vendor_certification_answer_3_p1_q1,survey_vendor_certification_answer_3,vendor_certification_page_1_question_1,False,suggestion,,,,,,vendor_certification_page_1_question_1_choice_2, +survey_vendor_certification_answer_3_p1_q2_1,survey_vendor_certification_answer_3,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_1, +survey_vendor_certification_answer_3_p1_q2_2,survey_vendor_certification_answer_3,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_4, +survey_vendor_certification_answer_3_p1_q3_1,survey_vendor_certification_answer_3,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_1, +survey_vendor_certification_answer_3_p1_q3_2,survey_vendor_certification_answer_3,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_4, +survey_vendor_certification_answer_3_p1_q4,survey_vendor_certification_answer_3,vendor_certification_page_1_question_4,False,suggestion,,,,,,vendor_certification_page_1_question_4_choice_2, +survey_vendor_certification_answer_3_p1_q5,survey_vendor_certification_answer_3,vendor_certification_page_1_question_5,True,,,,,,,, +survey_vendor_certification_answer_3_p2_q1,survey_vendor_certification_answer_3,vendor_certification_page_2_question_1,False,suggestion,,,,,,vendor_certification_page_2_question_1_choice_4, +survey_vendor_certification_answer_3_p2_q2_2,survey_vendor_certification_answer_3,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_1, +survey_vendor_certification_answer_3_p2_q2_3,survey_vendor_certification_answer_3,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_4, +survey_vendor_certification_answer_3_p2_q3,survey_vendor_certification_answer_3,vendor_certification_page_2_question_3,False,suggestion,,,,,,vendor_certification_page_2_question_3_choice_2, +survey_vendor_certification_answer_3_p3_q1,survey_vendor_certification_answer_3,vendor_certification_page_3_question_1,False,numerical_box,,30,,,,, +survey_vendor_certification_answer_3_p3_q2,survey_vendor_certification_answer_3,vendor_certification_page_3_question_2,False,date,,,2020-01-08,,,, +survey_vendor_certification_answer_3_p3_q3,survey_vendor_certification_answer_3,vendor_certification_page_3_question_3,False,datetime,,,,2021-01-06 23:59:59,,, +survey_vendor_certification_answer_3_p3_q4,survey_vendor_certification_answer_3,vendor_certification_page_3_question_4,True,,,,,,,, +survey_vendor_certification_answer_3_p3_q5,survey_vendor_certification_answer_3,vendor_certification_page_3_question_5,True,,,,,,,, +survey_vendor_certification_answer_3_p3_q6,survey_vendor_certification_answer_3,vendor_certification_page_3_question_6,True,,,,,,,, +survey_vendor_certification_answer_4_p1_q1,survey_vendor_certification_answer_4,vendor_certification_page_1_question_1,False,suggestion,,,,,,vendor_certification_page_1_question_1_choice_1, +survey_vendor_certification_answer_4_p1_q2,survey_vendor_certification_answer_4,vendor_certification_page_1_question_2,False,suggestion,,,,,,vendor_certification_page_1_question_2_choice_3, +survey_vendor_certification_answer_4_p1_q3,survey_vendor_certification_answer_4,vendor_certification_page_1_question_3,False,suggestion,,,,,,vendor_certification_page_1_question_3_choice_2, +survey_vendor_certification_answer_4_p1_q4,survey_vendor_certification_answer_4,vendor_certification_page_1_question_4,False,suggestion,,,,,,vendor_certification_page_1_question_4_choice_4, +survey_vendor_certification_answer_4_p1_q5,survey_vendor_certification_answer_4,vendor_certification_page_1_question_5,True,,,,,,,, +survey_vendor_certification_answer_4_p2_q1,survey_vendor_certification_answer_4,vendor_certification_page_2_question_1,False,suggestion,,,,,,vendor_certification_page_2_question_1_choice_2, +survey_vendor_certification_answer_4_p2_q2,survey_vendor_certification_answer_4,vendor_certification_page_2_question_2,False,suggestion,,,,,,vendor_certification_page_2_question_2_choice_4, +survey_vendor_certification_answer_4_p2_q3,survey_vendor_certification_answer_4,vendor_certification_page_2_question_3,False,suggestion,,,,,,vendor_certification_page_2_question_3_choice_5, +survey_vendor_certification_answer_4_p3_q1,survey_vendor_certification_answer_4,vendor_certification_page_3_question_1,False,numerical_box,,2,,,,, +survey_vendor_certification_answer_4_p3_q2,survey_vendor_certification_answer_4,vendor_certification_page_3_question_2,False,date,,,2020-01-08,,,, +survey_vendor_certification_answer_4_p3_q3,survey_vendor_certification_answer_4,vendor_certification_page_3_question_3,False,datetime,,,,2021-01-07 01:00:01,,, +survey_vendor_certification_answer_4_p3_q4,survey_vendor_certification_answer_4,vendor_certification_page_3_question_4,False,date,,,2019-12-31,,,, +survey_vendor_certification_answer_4_p3_q5,survey_vendor_certification_answer_4,vendor_certification_page_3_question_5,False,datetime,,,,2021-01-01 13:00:01,,, +survey_vendor_certification_answer_4_p3_q6,survey_vendor_certification_answer_4,vendor_certification_page_3_question_6,True,,,,,,,, diff --git a/addons/survey/data/survey_demo_certification.xml b/addons/survey/data/survey_demo_certification.xml new file mode 100644 index 00000000..54cd42ca --- /dev/null +++ b/addons/survey/data/survey_demo_certification.xml @@ -0,0 +1,399 @@ + + + + + MyCompany Vendor + Congratulations, you are now official vendor of MyCompany + nobody + + + + + + MyCompany Vendor Certification + 4ead4bc8-b8f2-4760-a682-1fde8ddb95ac + open + public + page_per_question + + + scoring_with_answers + + + limited + 10.0 + + 2 +

Test your vendor skills!

+ True + + +
+ + + Products + + 1 + + +

Test your knowledge of your products!

+
+ + + + 2 + Do we sell Acoustic Bloc Screens? + simple_choice + + + + + 1 + No + + + + 2 + Yes + + 2.0 + + + + + 3 + Select all the existing products + multiple_choice + 4 + + + + 1 + Chair floor protection + + 1.0 + + + + 2 + Fanta + -1.0 + + + + 3 + Conference chair + + 1.0 + + + + 4 + Drawer + + 1.0 + + + + 5 + Customizable Lamp + -1.0 + + + + + 4 + Select all the available customizations for our Customizable Desk + multiple_choice + 4 + + + + 1 + Color + + 1.0 + + + + 2 + Height + -1.0 + + + + 3 + Width + + 1.0 + + + + 4 + Legs + + 1.0 + + + + 5 + Number of drawers + -1.0 + + + + + 5 + How many versions of the Corner Desk do we have? + simple_choice + + + + + 1 + 1 + + + + 2 + 2 + + 2.0 + + + + 3 + 3 + + + + 4 + 4 + + + + + 6 + Do you think we have missing products in our catalog? (not rated) + text_box + + + + Prices + + + + 7 + <p>Test your knowledge of our prices.</p> + + + + + 8 + How much do we sell our Cable Management Box? + simple_choice + + + + + 1 + $20 + + + + 2 + $50 + + + + 3 + $80 + + + + 4 + $100 + + 2.0 + + + + 5 + $200 + + + + 6 + $300 + + + + + 9 + Select all the products that sell for $100 or more + multiple_choice + 2 + + + + 1 + Corner Desk Right Sit + 1.0 + + + + + 2 + Desk Combination + 1.0 + + + + + 3 + Cabinet with Doors + -1.0 + + + + 4 + Large Desk + 1.0 + + + + + 5 + Letter Tray + -1.0 + + + + 6 + Office Chair Black + -1.0 + + + + + 10 + What do you think about our prices (not rated)? + simple_choice + + + + + 1 + Very underpriced + + + + 2 + Underpriced + + + + 3 + Correctly priced + + + + 4 + A little bit overpriced + + + + 5 + A lot overpriced + + + + Policies + + + + 11 + <p>Test your knowledge of our policies.</p> + + + + + 12 + How many days is our money-back guarantee? + numerical_box + + 30 + 1.0 + + + + + + 13 + If a customer purchases a product on 6 January 2020, what is the latest day we expect to ship it? + date + + 2020-01-08 + 1.0 + + + + + 14 + If a customer purchases a 1 year warranty on 6 January 2020, when do we expect the warranty to expire? + datetime + + 2021-01-07 00:00:01 + 1.0 + + + + + 15 + What day to you think is best for us to start having an annual sale (not rated)? + date + 0 + + + + + 16 + What day and time do you think most customers are most likely to call customer service (not rated)? + datetime + 0 + + + + + 17 + How many chairs do you think we should aim to sell in a year (not rated)? + numerical_box + 0 + + + + + + douglas.fletcher51@example.com + done + + + + + billy.fox45@example.com + done + + + + + brandon.freeman55@example.com + done + + + + + oscar.morgan11@example.com + done + +
+
diff --git a/addons/survey/data/survey_demo_conditional.xml b/addons/survey/data/survey_demo_conditional.xml new file mode 100644 index 00000000..9201bcdc --- /dev/null +++ b/addons/survey/data/survey_demo_conditional.xml @@ -0,0 +1,474 @@ + + + + + Burger Quiz + burger00-quiz-1234-abcd-344ca2tgb31e + open + public + + scoring_with_answers + 55 + limited + 10.0 + page_per_question + +

Choose your favourite subject and show how good you are. Ready ?

+ +
+ + + + Start + + 1 + + + + + + 2 + Pick a subject + multiple_choice + + + + + 1 + Geography + + + + 2 + History + + + + 3 + Sciences + + + + 4 + Art & Culture + + + + + Geography + + 100 + + + + + + 110 + How long is the White Nile river? + simple_choice + + + + + + + + 1 + 1450 km + + + + 2 + 3700 km + + 10 + + + + 3 + 6650 km + + + + + + 120 + What is the biggest city in the world ? + simple_choice + + + + + + + + 1 + Shanghai + + + + 2 + Tokyo + + 10 + + + + 3 + New York + + + + 4 + Istanbul + + + + + 130 + Which is the highest volcano in Europe ? + simple_choice + + + + + + + + 1 + Mount Teide (Spain - Tenerife) + + + + 2 + Eyjafjallajökull (Iceland) + + + + 3 + Mount Etna (Italy - Sicily) + + + + 4 + Mount Elbrus (Russia) + + 10 + + + + + History + + 200 + + + + + + 210 + When did Genghis Khan die ? + simple_choice + + + + + + + + 1 + 1227 + + 10 + + + + 2 + 1324 + + + + 3 + 1055 + + + + + 220 + Who is the architect of the Great Pyramid of Giza ? + simple_choice + + + + + + + + 1 + Imhotep + + + + 2 + Amenhotep + + + + 3 + Hemiunu + + 10 + + + + 4 + Papyrus + + + + + 230 + How many years did the 100 years war last ? + simple_choice + + + + + + + + 1 + 99 years + + + + 2 + 100 years + + + + 3 + 116 years + + 10 + + + + 4 + 127 years + + + + + Sciences + + 300 + + + + + + 310 + Who received a Nobel prize in Physics for the discovery of neutrino oscillations, which shows that neutrinos have mass ? + multiple_choice + + + + + + + + 1 + Arthur B. McDonald + + 5 + + + + 2 + Peter W. Higgs + + + + 3 + Takaaki Kajita + + 5 + + + + 4 + Willard S. Boyle + + + + + 320 + What is, approximately, the critical mass of plutonium-239 ? + simple_choice + + + + + + + + 1 + 5.7 kg + + + + 2 + 10 kg + + 10 + + + + 3 + 16.2 kg + + + + 4 + 47 kg + + + + + 330 + Can Humans ever directly see a photon ? + simple_choice + + + + + + + + 1 + Yes, that's the only thing a human eye can see. + + 10 + + + + 2 + No, it's to small for the human eye. + + + + + Art & Culture + + 400 + + + + + + 410 + Which Musician is not in the 27th Club ? + multiple_choice + + + + + + + + 1 + Kurt Cobain + + + + 2 + Kim Jong-hyun + + + + 3 + Avicii + + 5 + + + + 4 + Cliff Burton + + 5 + + + + + 420 + Which painting/drawing was not made by Pablo Picasso ? + simple_choice + + + + + + + + + 1 + + + + + + 2 + + + + 10 + + + + 3 + + + + + + 4 + + + + + + + 430 + Which quote is from Jean-Claude Van Damme + simple_choice + + + + + + + + 1 + I’ve never really wanted to go to Japan. Simply because I don’t like eating fish. And I know that’s very popular out there in Africa. + + + + 2 + I am fascinated by air. If you remove the air from the sky, all the birds would fall to the ground. And all the planes, too. + + 10 + + + + 3 + I've been noticing gravity since I was very young ! + + + + 4 + I actually don't like thinking. I think people think I like to think a lot. And I don't. I do not like to think at all. + + +
diff --git a/addons/survey/data/survey_demo_feedback.xml b/addons/survey/data/survey_demo_feedback.xml new file mode 100644 index 00000000..ef23de6b --- /dev/null +++ b/addons/survey/data/survey_demo_feedback.xml @@ -0,0 +1,222 @@ + + + + + Feedback Form + b135640d-14d4-4748-9ef6-344ca256531e + open + public + + page_per_section + +

This survey allows you to give a feedback about your experience with our products. + Filling it helps us improving your experience.

+
+ + + + About you + + 1 + + + +

This section is about general information about you. Answering them helps qualifying your answers.

+
+ + + 2 + Where do you live ? + char_box + + + + + 3 + When is your date of birth ? + date + + + + + 4 + How frequently do you buy products online ? + simple_choice + + + + + + + 1 + Once a day + + + + 2 + Once a week + + + + 3 + Once a month + + + + 4 + Once a year + + + + 5 + How many times did you order products on our website ? + numerical_box + + + + + + About our ecommerce + + 6 + + + +

This section is about our eCommerce experience itself.

+
+ + + 7 + Which of the following words would you use to describe our products ? + multiple_choice + + + + + + + 1 + High quality + + + + 2 + Useful + + + + 3 + Unique + + + + 4 + Good value for money + + + + 5 + Overpriced + + + + 6 + Impractical + + + + 7 + Ineffective + + + + 8 + Poor quality + + + + 8 + What do your think about our new eCommerce ? + matrix + multiple + + + + + 1 + Totally disagree + + + + 2 + Disagree + + + + 3 + Agree + + + + 4 + Totally agree + + + + 1 + The new layout and design is fresh and up-to-date + + + + 2 + It is easy to find the product that I want + + + + 3 + The tool to compare the products is useful to make a choice + + + + 4 + The checkout process is clear and secure + + + + 5 + I have added products to my wishlist + + + + 9 + Do you have any other comments, questions, or concerns ? + text_box + + + + + + + mark.brown23@example.com + done + + + + + billy.fox45@example.com + done + + + + + Evelyne Gargouillis <evelyne@example.com> + done + + + + + Martin Tamarre <martin@example.com> + in_progress + + +
diff --git a/addons/survey/data/survey_demo_quiz.xml b/addons/survey/data/survey_demo_quiz.xml new file mode 100644 index 00000000..6f4ce8a8 --- /dev/null +++ b/addons/survey/data/survey_demo_quiz.xml @@ -0,0 +1,582 @@ + + + + + Quiz about our Company + b137640d-9876-1234-abcd-344ca256531e + open + public + + scoring_with_answers + 55 + page_per_question + +

This small quiz will test your knowledge about our Company. Be prepared !

+ +
+ + + + Who are you ? + + 1 + + + +

Some general information about you. It will be used internally for statistics only.

+
+ + + 2 + What is your email ? + char_box + + + + + + + 3 + What is your nickname ? + char_box + + + + + + 4 + Where are you from ? + char_box + + + + + 5 + How old are you ? +

Just to categorize your answers, don't worry.

+ numerical_box + +
+ + + + Our Company in a few questions ... + + 10 + + + +

Some questions about our company. Do you really know us?

+
+ + + 11 + When is Mitchell Admin born ? + Our famous Leader ! + date + + + + + 12 + When did precisely Marc Demo crop its first apple tree ? + datetime + + + + + 13 + Give the list of all types of wood we sell. + text_box + + + + + + Fruits and vegetables + + 20 + + + +

An apple a day keeps the doctor away.

+
+ + + 21 + Which category does a tomato belong to + "Red" is not a category, I know what you are trying to do ;) + simple_choice + + + + + + + 1 + Fruits + + 20 + + + + 2 + Vegetables + + 10 + + + + 3 + Space stations + + + + 22 + Which of the following would you use to pollinate + simple_choice + + + + + 15 + + + + 1 + Bees + + 20 + + + + 2 + Dogs + + + + 3 + Mooses + + + + 23 + Select trees that made more than 20K sales this year + Our sales people have an advantage, but you can do it ! + multiple_choice + + + + + 20 + + + + 1 + Apple Trees + + 20 + + + + 2 + Lemon Trees + + 10 + + + + 3 + Baobab Trees + -10 + + + + 4 + Cookies + -10 + + + + 24 + A "Citrus" could give you ... + multiple_choice + + + + + 20 + + + + 1 + Pomelos + + 20 + + + + 2 + Grapefruits + + 20 + + + + 3 + Cosmic rays + -10 + + + + 4 + Bricks + -10 + + + + 25 + How often should you water those plants + matrix + simple + + + + + + 1 + Cactus + + + + 2 + Ficus + + + + 1 + Once a month + + + + 2 + Once a week + + + + 26 + When do you harvest those fruits + Best time to do it, is the right time to do it. + matrix + multiple + + + + + + 1 + Apples + + + + 2 + Strawberries + + + + 3 + Clementine + + + + 1 + Spring + + + + 2 + Summer + + + + 3 + Autumn + + + + 4 + Winter + + + + + Trees + + 30 + + + +

+ We like to say that the apple doesn't fall far from the tree, so here are trees. +

+
+
+ + + Dogwood is from which family of trees ? + + 31 + simple_choice + 6 + + + + + + 1 + Pinaceae + + + + + 2 + Ulmaceae + + + + + 3 + Cornaceae + + + 20 + + + + 4 + Salicaceae + + + + + In which country did the bonsai technique develop ? + + 32 + simple_choice + 6 + + + + + + 1 + Japan + + + 20 + + + + 2 + China + + + + + 3 + Vietnam + + + + + 4 + South Korea + + + + + Is the wood of a coniferous hard or soft ? + + 33 + simple_choice + 6 + + +

+
+

+
+
+ + + 1 + Hard + + + + 2 + Soft + + 10 + + + + From which continent is native the Scots pine (pinus sylvestris) ? + + 34 + simple_choice + + + +

+
+

+
+
+ + + 1 + Africa + + + + + 2 + Asia + + 20 + + + + + 3 + Europe + + + + + 4 + South America + + + + + In the list below, select all the coniferous. + + 35 + multiple_choice + 6 + + + + + + 1 + Douglas Fir + + + 5 + + + + 2 + Norway Spruce + + + 5 + + + + 3 + European Yew + + + 5 + + + + 4 + Mountain Pine + + + 5 + + + + After watching this video, will you swear that you are not going to procrastinate to trim your hedge this year ? + + 36 + simple_choice + 6 + +
+
+
+
+ +

+
+ + + + + 1 + Yes + + 10 + + + + 2 + No + + + + 3 + Perhaps + -10 + + + + + Your feeling + + 40 + + + +

We may be interested by your input.

+
+ + + 41 + What do you think about this survey ? + If you don't like us, please try to be as objective as possible. + simple_choice + + + + + + + 1 + Good + + + + 2 + Not Good, Not Bad + + + + 3 + Iznogoud + + + + 4 + I have no idea, I'm a dog! + + diff --git a/addons/survey/data/survey_demo_quiz_userinput.xml b/addons/survey/data/survey_demo_quiz_userinput.xml new file mode 100644 index 00000000..62335989 --- /dev/null +++ b/addons/survey/data/survey_demo_quiz_userinput.xml @@ -0,0 +1,571 @@ + + + + + + mark.brown23@example.com + done + + + + + admin@yourcompany.example.com + done + + + + + joel.willis63@example.com + done + + + + + brandon.freeman55@example.com + done + + + + + colleen.diaz83@example.com + in_progress + + + + + travis.mendoza24@example.com + new + + + + + + + char_box + mark.brown23@example.com + + + + + char_box + Mark Brown + + + + + char_box + Brussels + + + + + numerical_box + 36 + + + + + + date + + + + + + datetime + + + + + + text_box + Oak, ash, pine + + + + + + suggestion + + True + 2 + + + + + suggestion + + True + 2 + + + + + char_box + Mooses ?? Really ? + + + + + suggestion + + True + 1 + + + + + suggestion + + + + + + suggestion + + True + 2 + + + + + suggestion + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + + + + char_box + admin@yourcompany.example.com + + + + + char_box + Mitchell Admin + + + + + char_box + Ottawa + + + + + numerical_box + 48 + + + + + + date + + + + + + datetime + + + + + + + + + + + + suggestion + + True + 1 + + + + + suggestion + + + + + + char_box + Mooses are best pollinators of the world ! + + + + + suggestion + + True + 2 + + + + + char_box + I sold a 30K raspberry tree once. + + + + + suggestion + + True + 2 + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + + + + char_box + joel.willis63@example.com + + + + + char_box + Joël Willis + + + + + char_box + Brussels + + + + + numerical_box + 28 + + + + + + date + + + + + + datetime + + + + + + text_box + Oak, fur, pine, red pine + + + + + + char_box + Both fruit (seeds, par of the plant) and vegetable (culinary use), obviously. + + + + + suggestion + + True + 2 + + + + + suggestion + + True + 2 + + + + + suggestion + + True + 1 + + + + + char_box + You forgot the strawberry tree. + + + + + suggestion + + True + 2 + + + + + suggestion + + True + 2 + + + + + suggestion + + + + + + char_box + Gives the beeest cosmics rays man. So juicy. + + + + + suggestion + + + + + + + suggestion + + + + + + + char_box + Well sometimes I forget them, they survived. Almost. + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + suggestion + + + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + + + suggestion + + + + diff --git a/addons/survey/data/survey_demo_user.xml b/addons/survey/data/survey_demo_user.xml new file mode 100644 index 00000000..0daa9eb4 --- /dev/null +++ b/addons/survey/data/survey_demo_user.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/survey/i18n/af.po b/addons/survey/i18n/af.po new file mode 100644 index 00000000..0f84e8b3 --- /dev/null +++ b/addons/survey/i18n/af.po @@ -0,0 +1,2101 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * survey +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Odoo 9.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-08-18 14:08+0000\n" +"PO-Revision-Date: 2015-12-15 05:08+0000\n" +"Last-Translator: Martin Trigaux\n" +"Language-Team: Afrikaans (http://www.transifex.com/odoo/odoo-9/language/" +"af/)\n" +"Language: af\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: survey +#: model:mail.template,body_html:survey.email_template_survey +msgid "" +"\n" +" \n" +"

Hello,

\n" +"

We are conducting a survey, and your response would be appreciated.

\n" +"

Please, click here to start survey

\n" +"

Thanks for your participation!

\n" +" \n" +" " +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_page_tree +msgid "#Questions" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:231 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopie)" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "&times;" +msgstr "&times;" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "Question " +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "123.." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_matrix +msgid "" +"\n" +" Graph" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_choice +msgid " Graph" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_choice +msgid " Pie Chart" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid " answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid " answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid " answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "" +"\n" +" All Data" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_matrix +msgid "" +"\n" +" Data" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_choice +msgid " Data" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "" +"\n" +" Most Common" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid " answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid " Clear All Filters" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid " Filters" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "" +"All surveysFinished surveys" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "Average " +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "Maximum " +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "Minimum " +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "Sum " +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "" +"All surveysFinished surveys" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.no_result +msgid "" +"\n" +" \n" +" \n" +" Sorry, No one answered this survey yet" +msgstr "" + +#. module: survey +#: constraint:survey.label:0 +msgid "A label must be attached to one and only one question" +msgstr "" + +#. module: survey +#: sql_constraint:survey.question:0 +msgid "A length must be positive!" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_survey_description +msgid "A long description of the purpose of the survey" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_label_quizz_mark +msgid "" +"A positive score indicates a correct choice; a negative or null score " +"indicates a wrong answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "A problem has occured" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_2_4 +msgid "A process is defined for all enterprise flows" +msgstr "" + +#. module: survey +#: constraint:survey.user_input_line:0 +msgid "A question cannot be unanswered and skipped" +msgstr "" + +#. module: survey +#: sql_constraint:survey.user_input:0 +msgid "A token must be unique!" +msgstr "" + +#. module: survey +#: model:survey.page,title:survey.feedback_1 +msgid "About your Odoo usage" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_active +msgid "Active" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "" +"Add list of email of recipients (will not converted in partner), separated " +"by commas, semicolons or newline..." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Add list of existing contacts..." +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.fcol_2_1_3 +#: model:survey.label,value:survey.fcol_2_2_3 +#: model:survey.label,value:survey.fcol_2_5_3 +#: model:survey.label,value:survey.fcol_2_7_3 +msgid "Agree" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Allow Comments" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_page_description +msgid "An introductory text to your page" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_kanban +msgid "Analyze Answers" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_choice +msgid "Answer Choices" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_answer_type +#: model:ir.model.fields,field_description:survey.field_survey_user_input_type +msgid "Answer Type" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "Answered" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_user_input +#: model:ir.model.fields,field_description:survey.field_survey_question_user_input_line_ids +#: model:ir.model.fields,field_description:survey.field_survey_user_input_user_input_line_ids +#: model:ir.ui.menu,name:survey.menu_survey_type_form1 +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Answers" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_1_1 +msgid "Are you using Odoo on a daily basis?" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_attachment_ids +msgid "Attachments" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.back +msgid "Back to Survey" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_2_4 +msgid "CRM" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Cancel" +msgstr "Gekanselleer" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Choices" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.simple_choice +msgid "Choose..." +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:125 +#: code:addons/survey/wizard/survey_email_compose_message.py:34 +#, python-format +msgid "Click here to start survey" +msgstr "" + +#. module: survey +#: code:addons/survey/wizard/survey_email_compose_message.py:92 +#, python-format +msgid "Click here to take survey" +msgstr "" + +#. module: survey +#: model_terms:ir.actions.act_window,help:survey.action_survey_form +msgid "Click to add a survey." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Close" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_stage_closed +#: model:survey.stage,name:survey.stage_closed +msgid "Closed" +msgstr "gesluit" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_color +msgid "Color Index" +msgstr "Kleurindeks" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_comments +msgid "Comment" +msgstr "Kommentaar" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_comment_count_as_answer +msgid "Comment Field is an Answer Choice" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_comments_message +msgid "Comment Message" +msgstr "" + +#. module: survey +#: model:survey.page,title:survey.feedback_3 +msgid "Community and contributors" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_tree +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +#: selection:survey.user_input,state:0 +msgid "Completed" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Compose Email" +msgstr "" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_surveys_configuration +msgid "Configuration" +msgstr "Instelling" + +#. module: survey +#: model:survey.label,value:survey.frow_2_7_2 +msgid "Configuration wizard exists for each important setting" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Constraints" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Copy and paste the HTML code below to add this web link to any webpage." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Copy, paste and share the web link below to your audience." +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_date_create +msgid "Create Date" +msgstr "Skeppingsdatum" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_page_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_question_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_stage_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_survey_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_user_input_create_uid +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_create_uid +msgid "Created by" +msgstr "Geskep deur" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_create_date +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_create_date +#: model:ir.model.fields,field_description:survey.field_survey_page_create_date +#: model:ir.model.fields,field_description:survey.field_survey_question_create_date +#: model:ir.model.fields,field_description:survey.field_survey_stage_create_date +#: model:ir.model.fields,field_description:survey.field_survey_survey_create_date +#: model:ir.model.fields,field_description:survey.field_survey_user_input_create_date +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_create_date +msgid "Created on" +msgstr "Geskep op" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_date_create +msgid "Creation Date" +msgstr "Skeppingsdatum" + +#. module: survey +#: selection:survey.user_input_line,answer_type:0 +msgid "Date" +msgstr "Datum" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Date and Time" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_value_date +msgid "Date answer" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_user_input_deadline +msgid "Date by which the person can open the survey and submit answers" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_deadline +msgid "Deadline" +msgstr "Sperdatum" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_mail_compose_message_date_deadline +msgid "" +"Deadline to which the invitation to respond for this survey is valid. If the " +"field is empty, the invitation is still valid." +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_date_deadline +msgid "Deadline to which the invitation to respond is valid" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_kanban +msgid "Delete" +msgstr "Verwyder" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_page_description +#: model:ir.model.fields,field_description:survey.field_survey_question_description +#: model:ir.model.fields,field_description:survey.field_survey_survey_description +msgid "Description" +msgstr "Beskrywing" + +#. module: survey +#: model:survey.label,value:survey.frow_2_7_1 +msgid "Descriptions and help tooltips are clear enough" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_kanban +msgid "Design" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "Design Survey" +msgstr "" + +#. module: survey +#: model_terms:ir.actions.act_window,help:survey.action_survey_form +msgid "" +"Design easily your survey, send invitations to answer by email and analyse " +"answers." +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.fcol_2_1_2 +#: model:survey.label,value:survey.fcol_2_2_2 +#: model:survey.label,value:survey.fcol_2_5_2 +#: model:survey.label,value:survey.fcol_2_7_2 +msgid "Disagree" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_display_name +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_display_name +#: model:ir.model.fields,field_description:survey.field_survey_page_display_name +#: model:ir.model.fields,field_description:survey.field_survey_question_display_name +#: model:ir.model.fields,field_description:survey.field_survey_stage_display_name +#: model:ir.model.fields,field_description:survey.field_survey_survey_display_name +#: model:ir.model.fields,field_description:survey.field_survey_user_input_display_name +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_display_name +msgid "Display Name" +msgstr "Vertoningsnaam" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_display_mode +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Display mode" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_3_3 +msgid "Do you have a proposition to attract new contributors?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_3_2 +msgid "Do you have a proposition to help people to contribute?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_2_3 +msgid "Do you have suggestions on how to improve the process view ?" +msgstr "" + +#. module: survey +#: model:survey.stage,name:survey.stage_draft +msgid "Draft" +msgstr "Konsep" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_email +msgid "E-mail" +msgstr "Epos" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "Edit Pages and Questions" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_kanban +msgid "Edit Survey" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "Email" +msgstr "E-pos" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_email_template_id +msgid "Email Template" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_mail_compose_message +msgid "Email composition wizard for Survey" +msgstr "Epos samestellingsassistent vir Survey" + +#. module: survey +#: model:survey.page,title:survey.feedback_2 +msgid "Ergonomy and ease of use" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_constr_error_msg +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_error_msg +msgid "Error message" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_partner_ids +msgid "Existing contacts" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_7_3 +msgid "Extra modules proposed are relevant" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_2_3 +msgid "Financial Management" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_stage_fold +msgid "Folded in kanban view" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Format" +msgstr "" + +#. module: survey +#: selection:survey.user_input_line,answer_type:0 +msgid "Free Text" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_value_free_text +msgid "Free Text answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_page_search +#: model_terms:ir.ui.view,arch_db:survey.survey_question_search +#: model_terms:ir.ui.view,arch_db:survey.survey_response_line_search +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "Group By" +msgstr "Groepeer deur" + +#. module: survey +#: model:survey.question,question:survey.feedback_3_1 +msgid "How do you contribute or plan to contribute to Odoo?" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_2_6 +msgid "Human Resources" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_3_1_3 +msgid "I develop new features" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_4_1_4 +msgid "I do not publish my developments" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_3_1_4 +msgid "I help to translate" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_4_1_3 +msgid "I host them on my own website" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_3_1_1 +msgid "I participate to discussion and forums" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_4_1_1 +msgid "I use Github, like all official Odoo projects" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_4_1_2 +msgid "I use another repository system (SourceForge...)" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_1_3 +msgid "I use the contextual help in Odoo" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_3_1_5 +msgid "I write documentations" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_3_1_2 +msgid "I'd like to contribute but I don't know how?" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_id +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_id +#: model:ir.model.fields,field_description:survey.field_survey_page_id +#: model:ir.model.fields,field_description:survey.field_survey_question_id +#: model:ir.model.fields,field_description:survey.field_survey_stage_id +#: model:ir.model.fields,field_description:survey.field_survey_survey_id +#: model:ir.model.fields,field_description:survey.field_survey_user_input_id +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_id +msgid "ID" +msgstr "ID" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_token +msgid "Identification token" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_survey_users_can_go_back +msgid "If checked, users can go back to previous pages." +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_stage_closed +msgid "If closed, people won't be able to answer to surveys in this column." +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:624 +#: model:survey.question,comments_message:survey.feedback_1_1 +#: model:survey.question,comments_message:survey.feedback_1_2 +#: model:survey.question,comments_message:survey.feedback_2_1 +#: model:survey.question,comments_message:survey.feedback_2_2 +#: model:survey.question,comments_message:survey.feedback_2_3 +#: model:survey.question,comments_message:survey.feedback_2_4 +#: model:survey.question,comments_message:survey.feedback_2_5 +#: model:survey.question,comments_message:survey.feedback_2_6 +#: model:survey.question,comments_message:survey.feedback_2_7 +#: model:survey.question,comments_message:survey.feedback_3_1 +#: model:survey.question,comments_message:survey.feedback_3_2 +#: model:survey.question,comments_message:survey.feedback_3_3 +#: model:survey.question,comments_message:survey.feedback_4_1 +#, python-format +msgid "If other, please specify:" +msgstr "" + +#. module: survey +#: model_terms:survey.page,description:survey.feedback_4 +msgid "If you do not contribute or develop in Odoo, skip this page." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.sfinished +msgid "If you wish, you can" +msgstr "" + +#. module: survey +#: model:survey.stage,name:survey.stage_in_progress +msgid "In progress" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_email +msgid "Input must be an email" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_tree +msgid "Invitations sent" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_designed +msgid "Is designed?" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_2_4_2 +msgid "It can be improved" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_1_2 +msgid "It helps in the beginning" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_1_5 +msgid "It is clear" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_1_4 +msgid "It is complete" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_1_1 +msgid "It is up-to-date" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_2_5 +msgid "It's easy to find the process you need" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_sequence +msgid "Label Sequence order" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_label_form +#: model:ir.ui.menu,name:survey.menu_survey_label_form1 +msgid "Labels" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label___last_update +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message___last_update +#: model:ir.model.fields,field_description:survey.field_survey_page___last_update +#: model:ir.model.fields,field_description:survey.field_survey_question___last_update +#: model:ir.model.fields,field_description:survey.field_survey_stage___last_update +#: model:ir.model.fields,field_description:survey.field_survey_survey___last_update +#: model:ir.model.fields,field_description:survey.field_survey_user_input___last_update +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line___last_update +msgid "Last Modified on" +msgstr "Laas Gewysig op" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_page_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_question_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_stage_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_survey_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_write_uid +#: model:ir.model.fields,field_description:survey.field_survey_user_input_write_uid +msgid "Last Updated by" +msgstr "Laas Opgedateer deur" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_write_date +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_write_date +#: model:ir.model.fields,field_description:survey.field_survey_page_write_date +#: model:ir.model.fields,field_description:survey.field_survey_question_write_date +#: model:ir.model.fields,field_description:survey.field_survey_stage_write_date +#: model:ir.model.fields,field_description:survey.field_survey_survey_write_date +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_write_date +#: model:ir.model.fields,field_description:survey.field_survey_user_input_write_date +msgid "Last Updated on" +msgstr "Laas Opgedateer op" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_last_displayed_page_id +msgid "Last displayed page" +msgstr "" + +#. module: survey +#: selection:survey.user_input,type:0 +msgid "Link" +msgstr "Skakel" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_multi_email +msgid "List of emails" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_auth_required +#: model_terms:ir.ui.view,arch_db:survey.auth_required +msgid "Login required" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_constr_mandatory +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Mandatory Answer" +msgstr "" + +#. module: survey +#: selection:survey.user_input,type:0 +msgid "Manually" +msgstr "" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Matrix" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_matrix_subtype +msgid "Matrix Type" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "Matrix:" +msgstr "" + +#. module: survey +#: sql_constraint:survey.question:0 +msgid "Max date cannot be smaller than min date!" +msgstr "" + +#. module: survey +#: sql_constraint:survey.question:0 +msgid "Max length cannot be smaller than min length!" +msgstr "" + +#. module: survey +#: sql_constraint:survey.question:0 +msgid "Max value cannot be smaller than min value!" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_max_date +msgid "Maximum Date" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_length_max +msgid "Maximum Text Length" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_max_float_value +msgid "Maximum value" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_min_date +msgid "Minimum Date" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_length_min +msgid "Minimum Text Length" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_min_float_value +msgid "Minimum value" +msgstr "" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple Lines Text Box" +msgstr "" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple choice: multiple answers allowed" +msgstr "" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple choice: only one answer" +msgstr "" + +#. module: survey +#: selection:survey.question,matrix_subtype:0 +msgid "Multiple choices per row" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_stage_name +msgid "Name" +msgstr "Naam" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "New" +msgstr "Nuwe" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "Next page" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_1_4 +msgid "No, I just tested it" +msgstr "" + +#. module: survey +#: model_terms:ir.actions.act_window,help:survey.action_selected_survey_user_input +msgid "Nobody has replied to your survey yet." +msgstr "" + +#. module: survey +#: model_terms:ir.actions.act_window,help:survey.action_survey_user_input +msgid "Nobody has replied to your surveys yet." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.notopen +msgid "Not open" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.nopages +msgid "Not ready" +msgstr "" + +#. module: survey +#: selection:survey.user_input,state:0 +msgid "Not started yet" +msgstr "" + +#. module: survey +#: selection:survey.user_input_line,answer_type:0 +msgid "Number" +msgstr "Nommer" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_column_nb +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Number of columns" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_tot_comp_survey +msgid "Number of completed surveys" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_tot_sent_survey +msgid "Number of sent surveys" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_tot_start_survey +msgid "Number of started surveys" +msgstr "" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Numerical Value" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_value_number +msgid "Numerical answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_number +msgid "Occurence" +msgstr "" + +#. module: survey +#: selection:survey.question,matrix_subtype:0 +msgid "One choice per row" +msgstr "" + +#. module: survey +#: code:addons/survey/wizard/survey_email_compose_message.py:78 +#, python-format +msgid "One email at least is incorrect: %s" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Options" +msgstr "Opsies" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_page_id +#: model_terms:ir.ui.view,arch_db:survey.page +#: model_terms:ir.ui.view,arch_db:survey.survey_page_search +#: model_terms:ir.ui.view,arch_db:survey.survey_question_search +msgid "Page" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_page_title +#: model_terms:ir.ui.view,arch_db:survey.survey_page_form +msgid "Page Title" +msgstr "Blad Titel" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_page_sequence +msgid "Page number" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.act_survey_pages +#: model:ir.actions.act_window,name:survey.action_survey_page_form +#: model:ir.model.fields,field_description:survey.field_survey_survey_page_ids +#: model:ir.ui.menu,name:survey.menu_survey_page_form1 +msgid "Pages" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +#: selection:survey.user_input,state:0 +msgid "Partially completed" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_partner_id +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "Partner" +msgstr "Ouer Venoot" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_partner_survey_mail +#: model:ir.actions.act_window,name:survey.action_partner_survey_mail_crm +msgid "Partner Survey Mailing" +msgstr "" + +#. module: survey +#: model:survey.stage,name:survey.stage_permanent +msgid "Permanent" +msgstr "" + +#. module: survey +#: code:addons/survey/wizard/survey_email_compose_message.py:199 +#, python-format +msgid "Please enter at least one valid recipient." +msgstr "" + +#. module: survey +#: code:addons/survey/wizard/survey_email_compose_message.py:95 +#, python-format +msgid "Please select a survey" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "Previous page" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "Print Survey" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_form +msgid "Print These Answers" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_print_url +msgid "Print link" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_2_5 +msgid "Project Management" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_public_url_html +msgid "Public HTML web link" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_public_url +msgid "Public link" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_public_url_html +msgid "Public link (html version)" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_print_url +msgid "Public link to the empty survey" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_result_url +msgid "Public link to the survey results" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_public_url +msgid "Public url" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_2_2 +msgid "Purchases Management" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_question_id +#: model:ir.model.fields,field_description:survey.field_survey_label_question_id_2 +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_question_id +#: model_terms:ir.ui.view,arch_db:survey.survey_label_search +#: model_terms:ir.ui.view,arch_db:survey.survey_question_search +msgid "Question" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_question +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Question Name" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Question name" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.act_survey_page_question +#: model:ir.actions.act_window,name:survey.act_survey_question +#: model:ir.actions.act_window,name:survey.action_survey_question_form +#: model:ir.model.fields,field_description:survey.field_survey_page_question_ids +#: model:ir.ui.menu,name:survey.menu_survey_question_form1 +msgid "Questions" +msgstr "" + +#. module: survey +#: model:survey.page,title:survey.feedback_4 +msgid "Questions for developers" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_quizz_mode +msgid "Quiz mode" +msgstr "" + +#. module: survey +#: selection:survey.question,display_mode:0 +msgid "Radio Buttons" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_result_url +msgid "Results link" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_value_suggested_row +msgid "Row answer" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Row1" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Row2" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Row3" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Rows" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_labels_ids_2 +msgid "Rows of the Matrix" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_7_4 +msgid "Running the configuration wizards is a good way to spare time" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_2_1 +msgid "Sales Management" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Save as a new template" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Save as new template" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_quizz_score +msgid "Score for the quiz" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_quizz_mark +msgid "Score for this choice" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_quizz_mark +msgid "Score given for this choice" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_label_search +msgid "Search Label" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_page_search +msgid "Search Page" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_search +msgid "Search Question" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "Search Survey" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_response_line_search +msgid "Search User input lines" +msgstr "" + +#. module: survey +#: selection:survey.question,display_mode:0 +msgid "Selection Box" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Send" +msgstr "Stuur" + +#. module: survey +#: selection:survey.mail.compose.message,public:0 +msgid "Send by email the public web link to your audience." +msgstr "" + +#. module: survey +#: selection:survey.mail.compose.message,public:0 +msgid "" +"Send private invitation to your audience (only one response per recipient " +"and per invitation)." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_form +msgid "Sent Invitation Again" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_sequence +#: model:ir.model.fields,field_description:survey.field_survey_stage_sequence +msgid "Sequence" +msgstr "Volgorde" + +#. module: survey +#: sql_constraint:survey.stage:0 +msgid "Sequence number MUST be a natural" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_kanban +msgid "Share &amp; Invite" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "Share and invite by email" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_public +msgid "Share options" +msgstr "" + +#. module: survey +#: selection:survey.mail.compose.message,public:0 +msgid "Share the public web link to your audience." +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_comments_allowed +msgid "Show Comments Field" +msgstr "" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Single Line Text Box" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_skipped +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "Skipped" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "" +"Something went wrong while contacting survey server. Your answers have probably not been recorded. Try " +"refreshing." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result +msgid "Sorry, No one answered this question." +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_stage_id +#: model_terms:ir.ui.view,arch_db:survey.survey_stage_form +msgid "Stage" +msgstr "Stand" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_init +msgid "Start Survey" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_tree +msgid "Started" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_state +msgid "Status" +msgstr "Stand" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Subject..." +msgstr "Onderwerp..." + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "Submit survey" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_value_suggested +msgid "Suggested answer" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_label_value +msgid "Suggested value" +msgstr "" + +#. module: survey +#: selection:survey.user_input_line,answer_type:0 +msgid "Suggestion" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_survey +#: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message_survey_id +#: model:ir.model.fields,field_description:survey.field_survey_page_survey_id +#: model:ir.model.fields,field_description:survey.field_survey_question_survey_id +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_survey_id +#: model:ir.model.fields,field_description:survey.field_survey_user_input_survey_id +#: model_terms:ir.ui.view,arch_db:survey.survey_form +#: model_terms:ir.ui.view,arch_db:survey.survey_page_search +#: model_terms:ir.ui.view,arch_db:survey.survey_question_search +#: model_terms:ir.ui.view,arch_db:survey.survey_response_line_search +#: model_terms:ir.ui.view,arch_db:survey.survey_tree +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "Survey" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_response_line_tree +msgid "Survey Answer Line" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_label +#: model_terms:ir.ui.view,arch_db:survey.survey_label_tree +msgid "Survey Label" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_page +#: model_terms:ir.ui.view,arch_db:survey.survey_page_form +#: model_terms:ir.ui.view,arch_db:survey.survey_page_tree +msgid "Survey Page" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_question +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +#: model_terms:ir.ui.view,arch_db:survey.survey_question_tree +msgid "Survey Question" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_stage +msgid "Survey Stage" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "Survey Title" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_user_input +msgid "Survey User Input" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_user_input_line +msgid "Survey User Input Line" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_user_input_line +msgid "Survey User Input lines" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_selected_survey_user_input +msgid "Survey User input" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_form +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_tree +msgid "Survey User inputs" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_page_id +msgid "Survey page" +msgstr "" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_form +#: model:ir.ui.menu,name:survey.menu_survey_form +#: model:ir.ui.menu,name:survey.menu_surveys +msgid "Surveys" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_kanban +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_search +msgid "Test" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "Test Survey" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_test_entry +msgid "Test entry" +msgstr "" + +#. module: survey +#: selection:survey.user_input_line,answer_type:0 +msgid "Text" +msgstr "Teks" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_value_text +msgid "Text answer" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_thank_you_message +msgid "Thank you message" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.sfinished +msgid "Thank you!" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_5_3 +msgid "The 'Usability/Extended View' group helps in daily work" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_5_4 +msgid "The 'Usability/Extended View' group hides only optional fields" +msgstr "" + +#. module: survey +#: constraint:survey.user_input_line:0 +msgid "The answer must be in the right type" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:622 +#: model:survey.question,validation_error_msg:survey.feedback_1_1 +#: model:survey.question,validation_error_msg:survey.feedback_1_2 +#: model:survey.question,validation_error_msg:survey.feedback_2_1 +#: model:survey.question,validation_error_msg:survey.feedback_2_2 +#: model:survey.question,validation_error_msg:survey.feedback_2_3 +#: model:survey.question,validation_error_msg:survey.feedback_2_4 +#: model:survey.question,validation_error_msg:survey.feedback_2_5 +#: model:survey.question,validation_error_msg:survey.feedback_2_6 +#: model:survey.question,validation_error_msg:survey.feedback_2_7 +#: model:survey.question,validation_error_msg:survey.feedback_3_1 +#: model:survey.question,validation_error_msg:survey.feedback_3_2 +#: model:survey.question,validation_error_msg:survey.feedback_3_3 +#: model:survey.question,validation_error_msg:survey.feedback_4_1 +#, python-format +msgid "The answer you entered has an invalid format." +msgstr "" + +#. module: survey +#: code:addons/survey/wizard/survey_email_compose_message.py:174 +#, python-format +msgid "" +"The content of the text don't contain '__URL__'. __URL__ " +"is automaticaly converted into the special url of the survey." +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_2_4_1 +msgid "The current menu structure is good" +msgstr "" + +#. module: survey +#: sql_constraint:survey.user_input:0 +msgid "The deadline cannot be in the past" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_5_5 +msgid "The groups set on menu items are relevant" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_2_6_3 +msgid "The number of groups is good" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_5_1 +msgid "The security rules defined on groups are useful" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_2_6_2 +msgid "There are too few groups defined, security isn't accurate enough" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_2_6_1 +msgid "There are too many groups defined, security is too complex to set" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_2_4_3 +msgid "There are too much menus, it's complex to understand" +msgstr "" + +#. module: survey +#: model_terms:survey.page,description:survey.feedback_2 +msgid "" +"These questions relate to the ergonomy and ease of use of Odoo. Try to " +"remind your firsts days on Odoo and\n" +"what have been your difficulties." +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_2_2 +msgid "They are clean and correct" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_2_3 +msgid "They are useful on a daily usage" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_2_1 +msgid "They help new users to understand Odoo" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:671 code:addons/survey/tests/test_survey.py:94 +#, python-format +msgid "This answer must be an email address" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:713 code:addons/survey/tests/test_survey.py:115 +#, python-format +msgid "This is not a date/time" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:690 code:addons/survey/tests/test_survey.py:105 +#, python-format +msgid "This is not a number" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_mail_compose_message_multi_email +msgid "" +"This list of emails of recipients will not converted in contacts. Emails " +"separated by commas, semicolons or newline." +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_survey_thank_you_message +msgid "This message will be displayed when survey is completed" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:621 +#: model:survey.question,constr_error_msg:survey.feedback_1_1 +#: model:survey.question,constr_error_msg:survey.feedback_1_2 +#: model:survey.question,constr_error_msg:survey.feedback_2_1 +#: model:survey.question,constr_error_msg:survey.feedback_2_2 +#: model:survey.question,constr_error_msg:survey.feedback_2_3 +#: model:survey.question,constr_error_msg:survey.feedback_2_4 +#: model:survey.question,constr_error_msg:survey.feedback_2_5 +#: model:survey.question,constr_error_msg:survey.feedback_2_6 +#: model:survey.question,constr_error_msg:survey.feedback_2_7 +#: model:survey.question,constr_error_msg:survey.feedback_3_1 +#: model:survey.question,constr_error_msg:survey.feedback_3_2 +#: model:survey.question,constr_error_msg:survey.feedback_3_3 +#: model:survey.question,constr_error_msg:survey.feedback_4_1 +#, python-format +msgid "This question requires an answer." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.nopages +msgid "This survey has no pages by now!" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.notopen +msgid "This survey is not open. Thank you for your interest!" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.auth_required +msgid "This survey is open only to registered people. Please" +msgstr "" + +#. module: survey +#: model:survey.survey,description:survey.feedback_form +msgid "This survey should take less than five minutes." +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.frow_2_5_2 +msgid "" +"Those security rules are standard and can be used out-of-the-box in most " +"cases" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_title +msgid "Title" +msgstr "Titel" + +#. module: survey +#: model:survey.label,value:survey.fcol_2_1_4 +#: model:survey.label,value:survey.fcol_2_2_4 +#: model:survey.label,value:survey.fcol_2_5_4 +#: model:survey.label,value:survey.fcol_2_7_4 +msgid "Totally agree" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.fcol_2_1_1 +#: model:survey.label,value:survey.fcol_2_2_1 +#: model:survey.label,value:survey.fcol_2_5_1 +#: model:survey.label,value:survey.fcol_2_7_1 +msgid "Totally disagree" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_search +msgid "Type" +msgstr "Tiepe" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_type +msgid "Type of Question" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "Type of answers" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_labels_ids +msgid "Types of answers" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "Use template" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_question_description +msgid "" +"Use this field to add additional explanations about your question" +msgstr "" + +#. module: survey +#: model:survey.survey,title:survey.feedback_form +msgid "User Feedback Form" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_user_input_line_user_input_id +#: model_terms:ir.ui.view,arch_db:survey.survey_response_line_search +msgid "User Input" +msgstr "" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_survey_response_line_form +msgid "User Input Lines" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_choice +#: model_terms:ir.ui.view,arch_db:survey.result_number +#: model_terms:ir.ui.view,arch_db:survey.result_text +msgid "User Responses" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "User can come back in the previous page" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_line_form +msgid "User input line details" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_user_input_ids +msgid "User responses" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_survey_users_can_go_back +msgid "Users can go back" +msgstr "" + +#. module: survey +#: model:ir.model.fields,help:survey.field_survey_survey_auth_required +msgid "" +"Users with a public link will be requested to login before taking part to " +"the survey" +msgstr "" + +#. module: survey +#: model:ir.model.fields,field_description:survey.field_survey_question_validation_required +msgid "Validate entry" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_user_input_form +msgid "View Results" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_form +msgid "View results" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.result_choice +msgid "Vote" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_2_7 +msgid "What do you think about configuration wizards?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_2_1 +msgid "What do you think about the documentation available on doc.odoo.com?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_2_5 +msgid "What do you think about the groups of users?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_2_2 +msgid "" +"What do you think about the process views of Odoo, available in the web " +"client ?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_2_4 +#: model:survey.question,question:survey.feedback_2_6 +msgid "What do you think about the structure of the menus?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_4_1 +msgid "Where do you develop your new features?" +msgstr "" + +#. module: survey +#: model:survey.question,question:survey.feedback_1_2 +msgid "Which modules are you using/testing?" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.datetime +msgid "YYYY-MM-DD hh:mm:ss" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "" +"YYYY-MM-DD hh:mm:ss\n" +" " +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_1_1 +msgid "Yes, I use a version < 7.0" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_1_2 +msgid "Yes, I use the 7.0 version, installed locally" +msgstr "" + +#. module: survey +#: model:survey.label,value:survey.choice_1_1_3 +msgid "Yes, I use the online version of Odoo" +msgstr "" + +#. module: survey +#: model_terms:ir.actions.act_window,help:survey.action_survey_form +msgid "" +"You can create surveys for different purposes: customer opinion, services " +"feedback, recruitment interviews, employee's periodical evaluations, " +"marketing campaigns, etc." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_email_compose_message +msgid "" +"You can share your survey web public link and/or send private invitations to " +"your audience. People can answer once per invitation, and whenever they want " +"with the public web link (in this case, the \"Public in website\" setting " +"must be enabled)." +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:424 +#, python-format +msgid "You cannot send an invitation for a survey that has no questions." +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:429 +#, python-format +msgid "You cannot send invitations for closed surveys." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.sfinished +msgid "You scored" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_question_form +msgid "ans" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.auth_required +msgid "log in" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.page +msgid "of" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.sfinished +msgid "points." +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.sfinished +msgid "review your answers" +msgstr "" + +#. module: survey +#. openerp-web +#: code:addons/survey/static/src/js/tour_test_survey.js:10 +#, python-format +msgid "try to create and fill survey" +msgstr "" + +#~ msgid "Action Needed" +#~ msgstr "Aksie word benodig" + +#~ msgid "Author" +#~ msgstr "Outeur" + +#~ msgid "Channels" +#~ msgstr "Kanale" + +#~ msgid "Date of the last message posted on the record." +#~ msgstr "Datum van die laaste boodskap wat op die rekord gepos is." + +#~ msgid "Followers" +#~ msgstr "Volgelinge" + +#~ msgid "Followers (Channels)" +#~ msgstr "Volgelinge (Kanale)" + +#~ msgid "Followers (Partners)" +#~ msgstr "Volgelinge (Venote)" + +#~ msgid "From" +#~ msgstr "Van" + +#~ msgid "If checked new messages require your attention." +#~ msgstr "As dit gekies is vereis nuwe boodskappe jou aandag." + +#~ msgid "If checked, new messages require your attention." +#~ msgstr "As dit gekies is, vereis nuwe boodskappe jou aandag." + +#~ msgid "Is Follower" +#~ msgstr "Is Volgeling" + +#~ msgid "Last Message Date" +#~ msgstr "Laaste Boodskap Datum" + +#~ msgid "Messages" +#~ msgstr "Boodskappe" + +#~ msgid "Messages and communication history" +#~ msgstr "Boodskap-en kommunikasiegeskiedenis" + +#~ msgid "Number of Actions" +#~ msgstr "Hoeveelheid Aksies" + +#~ msgid "Number of messages which requires an action" +#~ msgstr "Hoeveelheid boodskappe wat aksie vereis" + +#~ msgid "Number of unread messages" +#~ msgstr "Hoeveelheid ongeleesde boodskappe" + +#~ msgid "Starred" +#~ msgstr "Gester" + +#~ msgid "Subject" +#~ msgstr "Onderwerp" + +#~ msgid "Unread Messages" +#~ msgstr "Ongeleesde Boodskappe" + +#~ msgid "Unread Messages Counter" +#~ msgstr "Ongeleesde Boodskappe Teller" + +#~ msgid "on" +#~ msgstr "aan" diff --git a/addons/survey/i18n/ar.po b/addons/survey/i18n/ar.po new file mode 100644 index 00000000..a2f61f19 --- /dev/null +++ b/addons/survey/i18n/ar.po @@ -0,0 +1,4609 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * survey +# +# Translators: +# Sherif Abd Ekmoniem , 2020 +# Akram Alfusayal , 2020 +# Osoul , 2020 +# Zuhair Hammadi , 2020 +# Sadig Adam , 2020 +# amrnegm , 2020 +# hoxhe Aits , 2020 +# Mohammed Ibrahim , 2020 +# Ghaith Gammar , 2020 +# amal ahmed , 2020 +# Mostafa Hanafy , 2020 +# Nisrine Tagri , 2020 +# Tasneem Sarhan , 2020 +# Mustafa Rawi , 2020 +# Martin Trigaux, 2020 +# Osama Ahmaro , 2020 +# Shaima Safar , 2020 +# Abdulmajeed Alomar , 2020 +# Talal Albahra , 2020 +# Rachid Al Assir , 2020 +# Mustafa J. Kadhem , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 15:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:19+0000\n" +"Last-Translator: Mustafa J. Kadhem , 2021\n" +"Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: survey +#: model:survey.question.answer,value:survey.vendor_certification_page_2_question_1_choice_4 +msgid "$100" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.vendor_certification_page_2_question_1_choice_1 +msgid "$20" +msgstr "20 دولار" + +#. module: survey +#: model:survey.question.answer,value:survey.vendor_certification_page_2_question_1_choice_5 +msgid "$200" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.vendor_certification_page_2_question_1_choice_6 +msgid "$300" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.vendor_certification_page_2_question_1_choice_2 +msgid "$50" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.vendor_certification_page_2_question_1_choice_3 +msgid "$80" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_progression +msgid "% completed" +msgstr "" + +#. module: survey +#: code:addons/survey/models/survey_survey.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (نسخة)" + +#. module: survey +#: code:addons/survey/models/survey_survey.py:0 +#, python-format +msgid "%s certification passed" +msgstr "" + +#. module: survey +#: code:addons/survey/models/survey_survey.py:0 +#, python-format +msgid "%s challenge certification" +msgstr "" + +#. module: survey +#: model:ir.actions.report,print_report_name:survey.certification_report +msgid "'Certification - %s' % (object.survey_id.display_name)" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p4_q2_sug2 +msgid "10 kg" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q3_sug2 +msgid "100 years" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q1_sug3 +msgid "1055" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q3_sug3 +msgid "116 years" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q1_sug1 +msgid "1227" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q3_sug4 +msgid "127 years" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q1_sug2 +msgid "1324" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p2_q1_sug1 +msgid "1450 km" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p4_q2_sug3 +msgid "16.2 kg" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p2_q1_sug2 +msgid "3700 km" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_403_page +msgid "403: Forbidden" +msgstr "403: محظور" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p4_q2_sug4 +msgid "47 kg" +msgstr "" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_session_code +msgid "4812" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p4_q2_sug1 +msgid "5.7 kg" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p2_q1_sug3 +msgid "6650 km" +msgstr "" + +#. module: survey +#: model:survey.question.answer,value:survey.survey_demo_burger_quiz_p3_q3_sug1 +msgid "99 years" +msgstr "" + +#. module: survey +#: model:mail.template,body_html:survey.mail_template_certification +msgid "" +"\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +" \n" +" \n" +" \n" +" Certification: ${object.survey_id.display_name}\n" +"
\n" +" \n" +" \n" +" \n" +" \n" +"
\n" +"

Dear ${object.partner_id.name or 'participant'}

\n" +"

\n" +" Here is, in attachment, your certification document for\n" +" ${object.survey_id.display_name}\n" +"

\n" +"

Congratulations for succeeding the test!

\n" +"
\n" +"
\n" +" " +msgstr "" +"\n" +"
\n" +"\n" +"\n" +"\n" +"\n" +"
\n" +"\n" +"\n" +"\n" +"الشهادة: ${object.survey_id.display_name}\n" +"
\n" +"\n" +"\n" +"\n" +"\n" +"
\n" +"

عزيزي ${object.partner_id.name or 'المشارك'}

\n" +"

\n" +"هنا، في المرفق، وثيقة شهادتك ل\n" +"${object.survey_id.display_name}\n" +"

\n" +"

تهانينا على نجاحك في الاختبار!

\n" +"
\n" +"
" + +#. module: survey +#: model_terms:ir.ui.view,arch_db:survey.survey_page_statistics_question +msgid "" +"
\n" +" Score:" +msgstr "" + +#. module: survey +#: model:survey.question,description:survey.survey_demo_quiz_p4_q6 +msgid "" +"
\n" +"
\n" +"
\n" +"
\n" +"