Browse Source

[MIG] survey_select_input

16.0
RemiFr82 2 weeks ago
parent
commit
d1e4ecfd7f
  1. 11
      survey_select_input/__manifest__.py
  2. 53
      survey_select_input/models/survey_survey.py
  3. 25
      survey_select_input/models/survey_user_input.py
  4. 24
      survey_select_input/static/src/js/survey_state_selection_field.js
  5. 26
      survey_select_input/views/survey_survey.xml
  6. 47
      survey_select_input/views/survey_user_input.xml

11
survey_select_input/__manifest__.py

@ -17,7 +17,7 @@
# "price": 0,
# "currency": "EUR",
"application": False,
"installable": False,
"installable": True,
"auto_install": False,
"pre_init_hook": "",
"post_init_hook": "",
@ -31,6 +31,15 @@
"views/survey_survey.xml",
"views/survey_user_input.xml",
],
"assets": {
"web.assets_backend": [
(
"after",
"web/static/src/views/fields/state_selection/state_selection_field.js",
"survey_select_input/static/src/js/survey_state_selection_field.js",
)
]
},
"css": [],
"images": [],
"js": [],

53
survey_select_input/models/survey_survey.py

@ -4,25 +4,54 @@ from odoo import models, fields, api, _
class SurveySurvey(models.Model):
_inherit = "survey.survey"
tot_selected_survey = fields.Integer(
"Number of selected surveys", compute="_get_selected_input"
answer_selection = fields.Boolean(
string="Manual selection",
help="Checking this box allows you to select completed real answers (regardless of the scoring success, if enable).",
)
answer_selected_count = fields.Integer(
"Number of selected answers", compute="_compute_selected_answer"
)
answer_selected_ratio = fields.Integer(
"Ratio of selected anwers", compute="_compute_selected_answer"
)
@api.depends("user_input_ids", "user_input_ids.selected")
def _get_selected_input(self):
selected_survey = self.env["survey.user_input"].search(
[("survey_id", "in", self.ids), ("selected", "=", True)]
@api.depends("user_input_ids", "user_input_ids.select")
def _compute_selected_answer(self):
default_vals = {
"answer_count": 0,
"answer_selected_count": 0,
}
stats = dict((sid, default_vals) for sid in self.ids)
UserInput = self.env["survey.user_input"]
base_domain = [
("survey_id", "in", self.ids),
("state", "=", "done"),
("test_entry", "=", False),
]
read_group_res = UserInput._read_group(
base_domain,
["survey_id", "select"],
["survey_id", "select"],
lazy=False,
)
for survey in self:
survey.tot_selected_survey = len(
selected_survey.filtered(
lambda user_input: user_input.survey_id == survey
)
for item in read_group_res:
stats[item["survey_id"][0]]["answer_count"] += item["__count"]
if item["select"] == "done":
stats[item["survey_id"][0]]["answer_selected_count"] += item["__count"]
for survey_stats in stats.values():
survey_stats["answer_selected_ratio"] = (
survey_stats["answer_selected_count"]
/ (survey_stats["answer_count"] or 1)
* 100
)
for survey in self:
survey.update(stats.get(survey._origin.id, default_vals))
# ACTIONS
@api.multi
def action_survey_user_input(self):
action = super(SurveySurvey, self).action_survey_user_input()
if self.env.context.get("search_default_selected", False):

25
survey_select_input/models/survey_user_input.py

@ -1,13 +1,24 @@
from odoo import models, fields, api
SELECT_OPTIONS = [
("normal", "Undefined"),
("done", "Selected"),
("blocked", "Not selected"),
]
class SurveyUserInput(models.Model):
_inherit = "survey.user_input"
selected = fields.Boolean(string="Selected", default=False)
@api.multi
def toggle_selected(self):
unselect = self.filtered("selected")
unselect.write({"selected": False})
(self - unselect).write({"selected": True})
answer_selection = fields.Boolean(
related="survey_id.answer_selection",
store=True,
)
select = fields.Selection(
SELECT_OPTIONS,
string="Selection",
copy=False,
default="normal",
required=True,
)

24
survey_select_input/static/src/js/survey_state_selection_field.js

@ -0,0 +1,24 @@
/** @odoo-module **/
import { Dropdown } from "@web/core/dropdown/dropdown";
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
import { registry } from "@web/core/registry";
import { StateSelectionField } from '@web/views/fields/state_selection/state_selection_field';
import { _lt } from "@web/core/l10n/translation";
import { standardFieldProps } from "@web/views/fields/standard_field_props";
export class SurveyStateSelectionField extends StateSelectionField {
// export class StateSelectionField extends StateSelectionField {
setup() {
super.setup();
}
/**
* @override
*/
get showLabel() {
return !this.props.hideLabel;
}
}
registry.category("fields").add("form.survey_state_selection", SurveyStateSelectionField);

26
survey_select_input/views/survey_survey.xml

@ -1,20 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="survey_survey_form" model="ir.ui.view">
<record id="survey_survey_view_form" model="ir.ui.view">
<field name="name">survey_select_input survey.survey form</field>
<field name="model">survey.survey</field>
<field name="inherit_id" ref="survey.survey_form"/>
<field name="inherit_id" ref="survey.survey_survey_view_form" />
<field name="priority">26</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='tot_comp_survey']/.." position="after">
<xpath expr="//div[@name='button_box']" position="inside">
<button type="object" name="action_survey_user_input"
attrs="{'invisible': [('tot_selected_survey','=',0)]}"
context="{'search_default_selected':1}"
class="oe_stat_button text-success" icon="fa-pencil-square-o">
<field name="tot_selected_survey" string="Selected" widget="statinfo"/>
attrs="{'invisible': [('answer_selection','=',False)]}"
context="{'search_default_selected':1}"
class="oe_stat_button text-success" icon="fa-check-circle">
<field name="answer_selected_count" string="Selected" widget="statinfo" />
</button>
<button type="object" name="action_survey_user_input"
attrs="{'invisible': [('answer_selection','=',False)]}"
context="{'search_default_selected':1}"
class="oe_stat_button text-success">
<field name="answer_selected_ratio" string="Selected" widget="percentpie" />
</button>
</xpath>
<group name="participants" position="attributes">
<attribute name="class">o_label_nowrap</attribute>
</group>
<group name="participants" position="inside">
<field name="answer_selection" />
</group>
</field>
</record>

47
survey_select_input/views/survey_user_input.xml

@ -1,62 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="survey_user_input_form" model="ir.ui.view">
<record id="survey_user_input_view_form" model="ir.ui.view">
<field name="name">survey_select_input survey.user_input form</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.survey_user_input_form"/>
<field name="inherit_id" ref="survey.survey_user_input_view_form" />
<field name="priority">26</field>
<field name="groups_id" eval="[(6,0,[ref('survey.group_survey_manager')])]"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button type="object" name="toggle_selected" class="oe_stat_button" icon="fa-check"
attrs="{'invisible':['|','|',('test_entry','=',True),('state','!=','done')]}">
<field name="selected" widget="boolean_button"
options="{'terminology': {'string_true': 'Selected', 'string_false': 'Not selected', 'hover_false': 'Select', 'hover_true': 'Unselect'}}"/>
</button>
</div>
<field name="scoring_type" position="before">
<field name="answer_selection" invisible="1" />
<field name="select" widget="survey_state_selection"
attrs="{'invisible': ['|','|',('answer_selection', '=', False),('test_entry','=',True),('state','!=','done')]}" />
</field>
</field>
</record>
<record id="survey_user_input_tree" model="ir.ui.view">
<record id="survey_user_input_view_tree" model="ir.ui.view">
<field name="name">survey_select_input survey.user_input tree</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.survey_user_input_tree"/>
<field name="inherit_id" ref="survey.survey_user_input_view_tree" />
<field name="priority">26</field>
<field name="groups_id" eval="[(6,0,[ref('survey.group_survey_manager')])]"/>
<field name="arch" type="xml">
<field name="state" position="after">
<field name="selected" widget="toggle_button" attrs="{'invisible':['|',('test_entry','=',True),('state','!=','done')]}"/>
<field name="answer_selection" invisible="1" />
<field name="select" widget="state_selection"
attrs="{'invisible':['|','|',('answer_selection', '=', False),('test_entry','=',True),('state','!=','done')]}" />
</field>
</field>
</record>
<record id="view_survey_user_input_kanban" model="ir.ui.view">
<record id="survey_user_input_viuew_kanban" model="ir.ui.view">
<field name="name">survey_select_input survey.user_input kanban</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.view_survey_user_input_kanban"/>
<field name="inherit_id" ref="survey.survey_user_input_viuew_kanban" />
<field name="priority">26</field>
<field name="groups_id" eval="[(6,0,[ref('survey.group_survey_manager')])]"/>
<field name="arch" type="xml">
<field name="state" position="after">
<field name="selected"/>
<field name="answer_selection" />
<field name="test_entry" />
<field name="select" />
</field>
<xpath expr="//div[hasclass('o_kanban_record_top')]" position="inside">
<span t-if="record.selected.raw_value" class="badge-pill badge-success">Selected</span>
<field name="select" widget="state_selection"
attrs="{'invisible':['|','|',('answer_selection', '=', False),('test_entry','=',True),('state','!=','done')]}" />
</xpath>
</field>
</record>
<record id="survey_user_input_search" model="ir.ui.view">
<record id="survey_user_input_view_search" model="ir.ui.view">
<field name="name">survey_select_input survey.user_input search</field>
<field name="model">survey.user_input</field>
<field name="inherit_id" ref="survey.survey_user_input_search"/>
<field name="inherit_id" ref="survey.survey_user_input_view_search" />
<field name="priority">26</field>
<field name="groups_id" eval="[(6,0,[ref('survey.group_survey_manager')])]"/>
<field name="arch" type="xml">
<filter name="new" position="after">
<separator/>
<filter string="Selected" name="selected" domain="[('selected','=', True)]"/>
<separator />
<filter string="Selected" name="selected" domain="[('select','=', 'done')]" />
</filter>
</field>
</record>

Loading…
Cancel
Save