Skip to content

Commit

Permalink
[MIG] survey_question_type_binary: Migration to 17.0
Browse files Browse the repository at this point in the history
  • Loading branch information
m1k3lm committed Jun 1, 2024
1 parent 2f0a422 commit 20aa611
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 88 deletions.
4 changes: 2 additions & 2 deletions survey_question_type_binary/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"name": "Survey binary question type",
"summary": """
This module add binary field as question type for survey page""",
"version": "16.0.1.0.0",
"version": "17.0.1.0.0",
"license": "AGPL-3",
"author": "Aures TIC, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/survey",
Expand All @@ -18,7 +18,7 @@
],
"assets": {
"survey.survey_assets": [
"/survey_question_type_binary/static/src/js/survey_form.js",
"survey_question_type_binary/static/src/js/survey_form.js",
],
},
}
6 changes: 4 additions & 2 deletions survey_question_type_binary/models/survey_user_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
class SurveyUserInput(models.Model):
_inherit = "survey.user_input"

def save_lines(self, question, answer, comment=None):
def _save_lines(self, question, answer, comment=None, overwrite_existing=True):
old_answers = self.env["survey.user_input.line"].search(
[
("user_input_id", "=", self.id),
Expand All @@ -24,7 +24,9 @@ def save_lines(self, question, answer, comment=None):
question, old_answers, answer_binary
)
else:
super(SurveyUserInput, self).save_lines(question, answer, comment=comment)
super(SurveyUserInput, self)._save_lines(
question, answer, comment=comment, overwrite_existing=overwrite_existing
)
return True

def _get_line_answer_values(self, question, answer, answer_type):
Expand Down
147 changes: 71 additions & 76 deletions survey_question_type_binary/static/src/js/survey_form.js
Original file line number Diff line number Diff line change
@@ -1,84 +1,79 @@
/* Copyright 2023 Aures Tic - Jose Zambudio
License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */
/** @odoo-module **/

odoo.define("survey_question_type_binary", function (require) {
"use strict";
import SurveyFormWidget from "@survey/js/survey_form";
import {sprintf} from "@web/core/utils/strings";

const survey_form = require("survey.form");
SurveyFormWidget.include({
_getSubmitBinariesValues: function (params) {
const self = this;
let promises = [];

survey_form.include({
_getSubmitBinariesValues: function (params) {
const self = this;
let promises = [];

this.$("[data-question-type]").each(function () {
switch ($(this).data("questionType")) {
case "binary":
case "multi_binary":
promises = promises.concat(
self._getSubmitAnswersBinary(params, $(this))
);
break;
this.$("[data-question-type]").each(function () {
switch ($(this).data("questionType")) {
case "binary":
case "multi_binary":
promises = promises.concat(
self._getSubmitAnswersBinary(params, $(this))
);
break;
}
});
return promises;
},
_getSubmitAnswersBinary: function (params, $input) {
const question_id = $input.attr("name");
return Array.prototype.map.call($input[0].files, (file) => {
return this._readFileAsDataURL(file).then(function (sDataURL) {
if (!params[question_id]) {
params[question_id] = [];
}
});
return promises;
},
_getSubmitAnswersBinary: function (params, $input) {
const question_id = $input.attr("name");
return Array.prototype.map.call($input[0].files, (file) => {
return this._readFileAsDataURL(file).then(function (sDataURL) {
if (!params[question_id]) {
params[question_id] = [];
}
params[question_id].push({
data: sDataURL.split(",")[1],
filename: file.name,
size: file.size,
type: file.type,
});
params[question_id].push({
data: sDataURL.split(",")[1],
filename: file.name,
size: file.size,
type: file.type,
});
});
},
_readFileAsDataURL: function (file) {
return $.Deferred(function (deferred) {
$.extend(new FileReader(), {
onload: function (e) {
var sDataURL = e.target.result;
deferred.resolve(sDataURL);
},
onerror: function () {
deferred.reject(this);
},
}).readAsDataURL(file);
}).promise();
},
_submitForm: function (options) {
const self = this;
const params = {};
const binaryPrimises = this._getSubmitBinariesValues(params);
if (binaryPrimises.length > 0 && !this.options.isStartScreen) {
const $form = this.$("form");
const formData = new FormData($form[0]);

if (options.previousPageId) {
params.previous_page_id = options.previousPageId;
}
this._prepareSubmitValues(formData, params);
Promise.all(binaryPrimises).then(function () {
const submitPromise = self._rpc({
route: _.str.sprintf(
"%s/%s/%s",
"/survey/submit",
self.options.surveyToken,
self.options.answerToken
),
params: params,
});
self._nextScreen(submitPromise, options);
});
} else {
return this._super(options);
});
},
_readFileAsDataURL: function (file) {
return $.Deferred(function (deferred) {
$.extend(new FileReader(), {
onload: function (e) {
var sDataURL = e.target.result;
deferred.resolve(sDataURL);
},
onerror: function () {
deferred.reject(this);
},
}).readAsDataURL(file);
}).promise();
},
_submitForm: function (options) {
const self = this;
const params = {};
const binaryPrimises = this._getSubmitBinariesValues(params);
if (binaryPrimises.length > 0 && !this.options.isStartScreen) {
const $form = this.$("form");
const formData = new FormData($form[0]);
if (options.previousPageId) {
params.previous_page_id = options.previousPageId;
}
},
});
this._prepareSubmitValues(formData, params);
Promise.all(binaryPrimises).then(function () {
const submitPromise = self.rpc(
sprintf(
"%s/%s/%s",
"/survey/submit",
self.options.surveyToken,
self.options.answerToken
),
params
);
self._nextScreen(submitPromise, options);
});
} else {
return this._super(options);
}
},
});
15 changes: 7 additions & 8 deletions survey_question_type_binary/views/survey_question.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,24 @@
<field name="inherit_id" ref="survey.survey_question_form" />
<field name="arch" type="xml">
<xpath expr="//sheet/group[2]/group[2]/div" position="inside">
<div
attrs="{'invisible': [('question_type', 'not in',('binary','multi_binary'))]}"
>
<div invisible="question_type not in ['binary','multi_binary']">
<i class="fa fa-upload fa-2x" title="upload" /> Upload binary
</div>
</xpath>
<xpath expr="//field[@name='validation_email']/../.." position="attributes">
<attribute name="attrs">
{'invisible': [('question_type', 'not in', ['char_box', 'numerical_box', 'date', 'datetime', "binary", "multi_binary"])]}</attribute>
<attribute
name="invisible"
>question_type not in ['char_box', 'numerical_box', 'date', 'datetime', "binary", "multi_binary"]</attribute>
</xpath>

<xpath expr="//field[@name='validation_length_min']" position="before">
<xpath expr="//field[@name='validation_required']" position="before">
<field
name="allowed_filemimetypes"
attrs="{'invisible': [('question_type','not in',('binary','multi_binary'))]}"
invisible="question_type not in ['binary','multi_binary']"
/>
<field
name="max_filesize"
attrs="{'invisible': [('question_type','not in',('binary','multi_binary'))]}"
invisible="question_type not in ['binary','multi_binary']"
/>
</xpath>
</field>
Expand Down

0 comments on commit 20aa611

Please sign in to comment.