Compare commits
3 Commits
12.0
...
12.0-major
Author | SHA1 | Date | |
---|---|---|---|
|
a695473354 | ||
|
3dd1f5df6e | ||
|
6a9535ee5c |
3
majority_judgement/__init__.py
Normal file
3
majority_judgement/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import models
|
72
majority_judgement/__manifest__.py
Normal file
72
majority_judgement/__manifest__.py
Normal 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": [],
|
||||||
|
}
|
7
majority_judgement/models/__init__.py
Normal file
7
majority_judgement/models/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import vote
|
||||||
|
from . import grade
|
||||||
|
from . import voter
|
||||||
|
from . import candidate
|
||||||
|
from . import ballot_line
|
11
majority_judgement/models/ballot_line.py
Normal file
11
majority_judgement/models/ballot_line.py
Normal 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)
|
16
majority_judgement/models/candidate.py
Normal file
16
majority_judgement/models/candidate.py
Normal 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")
|
||||||
|
)
|
22
majority_judgement/models/grade.py
Normal file
22
majority_judgement/models/grade.py
Normal 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"))
|
52
majority_judgement/models/vote.py
Normal file
52
majority_judgement/models/vote.py
Normal 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"
|
14
majority_judgement/models/voter.py
Normal file
14
majority_judgement/models/voter.py
Normal 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"))
|
6
majority_judgement/security/ir.model.access.csv
Normal file
6
majority_judgement/security/ir.model.access.csv
Normal 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
|
|
BIN
majority_judgement/static/description/icon.png
Normal file
BIN
majority_judgement/static/description/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
20
majority_judgement/views/candidate.xml
Normal file
20
majority_judgement/views/candidate.xml
Normal 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>
|
16
majority_judgement/views/grade_model.xml
Normal file
16
majority_judgement/views/grade_model.xml
Normal 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>
|
34
majority_judgement/views/menus.xml
Normal file
34
majority_judgement/views/menus.xml
Normal 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>
|
71
majority_judgement/views/vote.xml
Normal file
71
majority_judgement/views/vote.xml
Normal 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>
|
Reference in New Issue
Block a user