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