diff --git a/majority_judgement/__init__.py b/majority_judgement/__init__.py new file mode 100644 index 0000000..cde864b --- /dev/null +++ b/majority_judgement/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/majority_judgement/__manifest__.py b/majority_judgement/__manifest__.py new file mode 100644 index 0000000..321221e --- /dev/null +++ b/majority_judgement/__manifest__.py @@ -0,0 +1,71 @@ +# © 2022 Elabore +# @author Stéphan Sainléger +# 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 +`_. 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 `_. + +Contributors +------------ +* Stéphan Sainléger + +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/menus.xml", + "security/ir.model.access.csv", + ], + "demo": [], + "js": [], + "css": [], + "qweb": [], +} diff --git a/majority_judgement/models/__init__.py b/majority_judgement/models/__init__.py new file mode 100644 index 0000000..da4559f --- /dev/null +++ b/majority_judgement/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +from . import vote +from . import grade +from . import voter +from . import candidate +from . import ballot_line diff --git a/majority_judgement/models/ballot_line.py b/majority_judgement/models/ballot_line.py new file mode 100644 index 0000000..ac8e366 --- /dev/null +++ b/majority_judgement/models/ballot_line.py @@ -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) diff --git a/majority_judgement/models/candidate.py b/majority_judgement/models/candidate.py new file mode 100644 index 0000000..9f1a083 --- /dev/null +++ b/majority_judgement/models/candidate.py @@ -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") + ) diff --git a/majority_judgement/models/grade.py b/majority_judgement/models/grade.py new file mode 100644 index 0000000..5ed157b --- /dev/null +++ b/majority_judgement/models/grade.py @@ -0,0 +1,20 @@ +# -*- 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) + + +class MajorityJudgementGrade(models.Model): + _name = "grade" + _description = "Majority Judgement grade" + + name = fields.Char(string=_("Name"), required=True) + color = fields.Integer("Color Index", default=0) + vote_id = fields.Many2one("vote", string=_("Vote")) diff --git a/majority_judgement/models/vote.py b/majority_judgement/models/vote.py new file mode 100644 index 0000000..5711c08 --- /dev/null +++ b/majority_judgement/models/vote.py @@ -0,0 +1,17 @@ +# -*- 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")) diff --git a/majority_judgement/models/voter.py b/majority_judgement/models/voter.py new file mode 100644 index 0000000..6b0984f --- /dev/null +++ b/majority_judgement/models/voter.py @@ -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")) diff --git a/majority_judgement/security/ir.model.access.csv b/majority_judgement/security/ir.model.access.csv new file mode 100644 index 0000000..bf2e7a4 --- /dev/null +++ b/majority_judgement/security/ir.model.access.csv @@ -0,0 +1,5 @@ +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_candidate_manager,access_candidate_manager,model_candidate,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/majority_judgement/static/description/icon.png b/majority_judgement/static/description/icon.png new file mode 100644 index 0000000..8581cd0 Binary files /dev/null and b/majority_judgement/static/description/icon.png differ diff --git a/majority_judgement/views/candidate.xml b/majority_judgement/views/candidate.xml new file mode 100644 index 0000000..e64ac3c --- /dev/null +++ b/majority_judgement/views/candidate.xml @@ -0,0 +1,20 @@ + + + + + candidate.form.view + candidate + 0 + +
+ + + + + + +
+
+
+ +
\ No newline at end of file diff --git a/majority_judgement/views/menus.xml b/majority_judgement/views/menus.xml new file mode 100644 index 0000000..3abc4b4 --- /dev/null +++ b/majority_judgement/views/menus.xml @@ -0,0 +1,20 @@ + + + + Votes + vote + form + kanban,tree,form + +

+ Create a new vote +

+
+
+ + + + + + +
\ No newline at end of file diff --git a/majority_judgement/views/vote.xml b/majority_judgement/views/vote.xml new file mode 100644 index 0000000..00537fd --- /dev/null +++ b/majority_judgement/views/vote.xml @@ -0,0 +1,64 @@ + + + + vote.tree.view + vote + 0 + + + + + + + + + + + + vote.form.view + vote + 0 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
\ No newline at end of file