Compare commits

3 Commits

Author SHA1 Message Date
Stéphan Sainléger
a695473354 [NEW] Add grade models and grade management 2022-03-05 21:57:45 +01:00
Stéphan Sainléger
3dd1f5df6e [NEW] Add State field and buttons to manipulate its value 2022-03-05 19:10:44 +01:00
Stéphan Sainléger
6a9535ee5c [NEW] Majority Judgement addons initialisation 2022-03-05 19:10:44 +01:00
14 changed files with 344 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -0,0 +1,72 @@
# © 2022 Elabore
# @author Stéphan Sainléger <stephan.sainleger@elabore.coop>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Majority Judgement",
"summary": "Majority Judgement addons to support democracy in your organisation",
"version": "12.0.0.0.1",
"category": "Generic Modules/Others",
"license": "AGPL-3",
"author": "Elabore",
"website": "https://elabore.coop/",
"installable": True,
"auto_install": False,
"application": True,
"description": """
==================
Majority Judgement
==================
This module provides majority judgement fonctionnalities.
Installation
============
Just install majority_judgement, all dependencies will be installed by default.
Known issues / Roadmap
======================
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/elabore-coop/decision-support-tools/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.
Credits
=======
Images
------
* Elabore: `Icon <https://elabore.coop/web/image/res.company/1/logo?unique=f3db262>`_.
Contributors
------------
* Stéphan Sainléger <https://github.com/stephansainleger>
Funders
-------
The development of this module has been financially supported by:
* Elabore (https://elabore.coop)
Maintainer
----------
This module is maintained by ELABORE.
""",
"depends": ["base"],
"external_dependencies": {
"python": [],
},
"data": [
"views/vote.xml",
"views/candidate.xml",
"views/grade_model.xml",
"views/menus.xml",
"security/ir.model.access.csv",
],
"demo": [],
"js": [],
"css": [],
"qweb": [],
}

View File

@@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
from . import vote
from . import grade
from . import voter
from . import candidate
from . import ballot_line

View File

@@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
class MajorityJudgementBallotLine(models.Model):
_name = "ballot.line"
_description = "Majority Judgement ballot line"
candidate_id = fields.Many2one("candidate", string=_("Candidate"), required=True)
grade_id = fields.Many2one("grade", string=_("Grade"), required=True)

View File

@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
class MajorityJudgementCandidate(models.Model):
_name = "candidate"
_description = "Majority Judgement candidate"
name = fields.Char(string=_("Name"), required=True)
description = fields.Text(string=_("Description"))
vote_id = fields.Many2one("vote", string=_("Vote"))
final_grade = fields.Many2one("grade", string=_("Final Grage"))
ballot_line_ids = fields.One2many(
"ballot.line", "candidate_id", string=_("Ballot lines")
)

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
class MajorityJudgementGradeModel(models.Model):
_name = "grade.model"
_description = "Majority Judgement grade model"
name = fields.Char(string=_("Name"), required=True)
color = fields.Integer("Color Index", default=0)
sequence = fields.Integer()
class MajorityJudgementGrade(models.Model):
_name = "grade"
_description = "Majority Judgement grade"
name = fields.Char(string=_("Name"), required=True)
color = fields.Integer("Color Index", default=0)
sequence = fields.Integer()
vote_id = fields.Many2one("vote", string=_("Vote"))

View File

@@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
class MajorityJudgementVote(models.Model):
_name = "vote"
_description = "Majority Judgement vote"
name = fields.Char(string=_("Name"), required=True)
description = fields.Text(string=_("Description"))
question = fields.Char(string=_("Question"), required=True)
start_time = fields.Datetime(string=_("Start time"))
end_time = fields.Datetime(string=_("End time"))
grade_ids = fields.One2many("grade", "vote_id", string=_("Grades"))
candidate_ids = fields.One2many("candidate", "vote_id", string=_("Candidate"))
voter_ids = fields.One2many("voter", "vote_id", string=_("Voters"))
state = fields.Selection(
[("draft", "Draft"), ("opened", "Opened"), ("closed", "Closed")],
string=_("Status"),
index=True,
readonly=True,
default="draft",
track_visibility="onchange",
copy=False,
)
@api.model
def create(self, values):
record = super(MajorityJudgementVote, self).create(values)
record.generate_default_grades()
return record
def generate_default_grades(self):
for grade in self.grade_ids:
grade.unlink()
grade_models = self.env["grade.model"].search([])
for model in grade_models:
vals = {
"name": model.name,
"color": model.color,
"sequence": model.sequence,
"vote_id": self.id,
}
self.env["grade"].create(vals)
def action_open_vote(self):
self.state = "opened"
def action_close_vote(self):
self.state = "closed"

View File

@@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
class MajorityJudgementVoter(models.Model):
_name = "voter"
_description = "Majority Judgement voter"
partner_id = fields.Many2one(
"res.partner", string=_("Associated contact"), required=True
)
vote_id = fields.Many2one("vote", string=_("Vote"))
has_voted = fields.Boolean(string="Has voted")
vote_timestamp = fields.Datetime(string=_("Has voted on"))

View File

@@ -0,0 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_vote_manager,access_vote_manager,model_vote,base.group_user,1,1,1,1
access_voter_manager,access_voter_manager,model_voter,base.group_user,1,1,1,1
access_grade_manager,access_grade_manager,model_grade,base.group_user,1,1,1,1
access_grade_model_manager,access_grade_model_manager,model_grade_model,base.group_user,1,1,1,1
access_candidate_manager,access_candidate_manager,model_candidate,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_vote_manager access_vote_manager model_vote base.group_user 1 1 1 1
3 access_voter_manager access_voter_manager model_voter base.group_user 1 1 1 1
4 access_grade_manager access_grade_manager model_grade base.group_user 1 1 1 1
5 access_grade_model_manager access_grade_model_manager model_grade_model base.group_user 1 1 1 1
6 access_candidate_manager access_candidate_manager model_candidate base.group_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="candidate_form_view" model="ir.ui.view">
<field name="name">candidate.form.view</field>
<field name="model">candidate</field>
<field name="priority">0</field>
<field name="arch" type="xml">
<form string="Candidate">
<sheet string="Candidate">
<group name="general_info">
<field name="name" />
<field name="description" />
</group>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="grade_model_tree_view" model="ir.ui.view">
<field name="name">grade.model.tree.view</field>
<field name="model">grade.model</field>
<field name="priority">0</field>
<field name="arch" type="xml">
<tree string="Grade Models" editable="top">
<field name="sequence" widget="handle" />
<field name="name" />
<field name="color" />
</tree>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.actions.act_window" id="action_view_vote_list">
<field name="name">Votes</field>
<field name="res_model">vote</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new vote
</p>
</field>
</record>
<record model="ir.actions.act_window" id="action_view_grade_models_list">
<field name="name">Grade Models</field>
<field name="res_model">grade.model</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a grade model
</p>
</field>
</record>
<menuitem id="majority_judgement_menu_root" name="Majority Judgements" sequence="60" web_icon="majority_judgement,static/description/icon.png" />
<menuitem id="majority_judgement_menu" name="Majority Judgements" parent="majority_judgement_menu_root" sequence="1" action="action_view_vote_list" />
<menuitem id="majority_judgement_configuration_menu" name="Configuration" parent="majority_judgement_menu_root" sequence="2" />
<menuitem id="majority_judgement_grade_models_menu" name="Grade Models" parent="majority_judgement_configuration_menu" sequence="1" action="action_view_grade_models_list" />
</odoo>

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="vote_tree_view" model="ir.ui.view">
<field name="name">vote.tree.view</field>
<field name="model">vote</field>
<field name="priority">0</field>
<field name="arch" type="xml">
<tree string="Majority Judgement Vote">
<field name="name" />
<field name="question" />
<field name="start_time" />
<field name="end_time" />
</tree>
</field>
</record>
<record id="vote_form_view" model="ir.ui.view">
<field name="name">vote.form.view</field>
<field name="model">vote</field>
<field name="priority">0</field>
<field name="arch" type="xml">
<form string="Majority Judgement Vote">
<header>
<button name="action_open_vote" string="Open vote" type="object" attrs="{'invisible':[('state','!=','draft')]}" class="oe_highlight" />
<button name="action_close_vote" string="Close vote" type="object" attrs="{'invisible':[('state','!=','opened')]}" class="oe_highlight" />
<field name="state" widget="statusbar" nolabel="1" statusbar_visible="draft,opened,closed" />
</header>
<sheet string="Majority Judgement Vote">
<group name="general_info">
<field name="name" />
<field name="description" />
<field name="question" />
<field name="start_time" />
<field name="end_time" />
</group>
<notebook>
<page name="candidates" string="Candidates">
<field name="candidate_ids" create="true">
<tree default_order="name">
<field name="name" />
<field name="description" />
</tree>
</field>
</page>
<page name="grades" string="Grades">
<field name="grade_ids" create="true">
<tree default_order="sequence">
<field name="sequence" widget="handle" />
<field name="name" />
<field name="color" />
</tree>
</field>
<button name="generate_default_grades" string="Re-initialize" class="oe_highlight" type="object" />
</page>
<page name="voters" string="Voters">
<field name="voter_ids" create="true">
<tree default_order="name">
<field name="partner_id" />
<field name="has_voted" />
<field name="vote_timestamp" />
</tree>
</field>
</page>
<page name="results" string="Results"></page>
</notebook>
</sheet>
</form>
</field>
</record>
</odoo>