From 4cd64ef8aac15d62641d5862c7bd30a76ee0429b Mon Sep 17 00:00:00 2001 From: eloyoussef Date: Thu, 22 Mar 2018 16:47:54 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20du=20module=20et=20wizard=20=C3=A0=20la?= =?UTF-8?q?ncer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- golem_precreation_member/__init__.py | 19 ++ golem_precreation_member/__manifest__.py | 31 +++ golem_precreation_member/models/__init__.py | 19 ++ .../models/golem_member.py | 39 ++++ golem_precreation_member/tests/__init__.py | 18 ++ .../tests/test_golem_member.py | 180 ++++++++++++++++++ .../views/golem_member_views.xml | 37 ++++ golem_precreation_member/wizard/__init__.py | 19 ++ .../wizard/golem_precreation_member_wizard.py | 26 +++ .../golem_precreation_member_wizard_views.xml | 49 +++++ 10 files changed, 437 insertions(+) create mode 100644 golem_precreation_member/__init__.py create mode 100644 golem_precreation_member/__manifest__.py create mode 100644 golem_precreation_member/models/__init__.py create mode 100644 golem_precreation_member/models/golem_member.py create mode 100644 golem_precreation_member/tests/__init__.py create mode 100644 golem_precreation_member/tests/test_golem_member.py create mode 100644 golem_precreation_member/views/golem_member_views.xml create mode 100644 golem_precreation_member/wizard/__init__.py create mode 100644 golem_precreation_member/wizard/golem_precreation_member_wizard.py create mode 100644 golem_precreation_member/wizard/golem_precreation_member_wizard_views.xml diff --git a/golem_precreation_member/__init__.py b/golem_precreation_member/__init__.py new file mode 100644 index 0000000..f95e908 --- /dev/null +++ b/golem_precreation_member/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from . import models, wizard diff --git a/golem_precreation_member/__manifest__.py b/golem_precreation_member/__manifest__.py new file mode 100644 index 0000000..e402fbc --- /dev/null +++ b/golem_precreation_member/__manifest__.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +{ + 'name': 'GOLEM Pre-creation search member', + 'summary': 'Pre-creation search member', + 'version': '10.0.0.0.0', + 'category': 'GOLEM', + 'author': 'Fabien Bourgeois, Youssef El ouahby', + 'license': 'AGPL-3', + 'application': True, + 'installable': True, + 'depends': ['golem_member', 'golem_family'], + 'data': ['views/golem_member_views.xml', + 'wizard/golem_precreation_member_wizard_views.xml'] +} diff --git a/golem_precreation_member/models/__init__.py b/golem_precreation_member/models/__init__.py new file mode 100644 index 0000000..d74b40a --- /dev/null +++ b/golem_precreation_member/models/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from . import golem_member diff --git a/golem_precreation_member/models/golem_member.py b/golem_precreation_member/models/golem_member.py new file mode 100644 index 0000000..b49d4e4 --- /dev/null +++ b/golem_precreation_member/models/golem_member.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" GOLEM Members """ + +import logging +from odoo import models, fields, api, _ +from odoo.exceptions import UserError +_LOGGER = logging.getLogger(__name__) + + +class GolemMember(models.Model): + """ GOLEM Member model """ + _inherit = 'golem.member' + + @api.multi + def precreation_search(self): + self.ensure_one() + return {'name' : _('Please enter the rejection reason'), + 'type' : 'ir.actions.act_window', + 'res_model' : 'golem.precreation.member.wizard', + #'context': {'default_reservation_id': reservation_id.id}, + 'view_mode': 'form', + 'target': 'new'} diff --git a/golem_precreation_member/tests/__init__.py b/golem_precreation_member/tests/__init__.py new file mode 100644 index 0000000..0f44c19 --- /dev/null +++ b/golem_precreation_member/tests/__init__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +# Copyright 2016 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from . import test_golem_member diff --git a/golem_precreation_member/tests/test_golem_member.py b/golem_precreation_member/tests/test_golem_member.py new file mode 100644 index 0000000..d58cb81 --- /dev/null +++ b/golem_precreation_member/tests/test_golem_member.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- + +# Copyright 2017 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" GOLEM member testing """ + +from odoo import exceptions +from odoo.tests.common import TransactionCase +# from psycopg2 import IntegrityError + + +class GolemMemberTestCase(TransactionCase): + """ GOLEM member testing """ + + def setUp(self, *args, **kwargs): + """ Bootstrap season and members """ + super(GolemMemberTestCase, self).setUp(*args, **kwargs) + self.member_numberconfig_model = self.env['golem.member.numberconfig'] + season_mdl = self.env['golem.season'].sudo() + self.season_current = season_mdl.create({'name': u'Current'}) + self.season_current.do_default_season() + self.season_next = season_mdl.create({'name': u'Next'}) + self.member_model = self.env['golem.member'].sudo() + mcrt = self.member_model.create + self.member1 = mcrt({'lastname': u'LAST', 'firstname': u'First'}) + self.member2 = mcrt({'lastname': u'LAST', 'firstname': u'Young', + 'birthdate_date': '2016-01-01'}) + + def test_member_creation_noname(self): + """ Test creation of member without needed parameters """ + with self.assertRaises(exceptions.ValidationError) as exc_cm: + self.member_model.create({}) + self.assertIn('Error(s) with partner', exc_cm.exception.args[0]) + self.assertEqual('No name is set.', exc_cm.exception.args[1]) + + def test_current_season(self): + """ Test if default season if fixed according to setUp and if users + are correctly seen """ + self.assertEqual(self.member_model._default_season(), + self.season_current) + self.assertTrue(self.member1.is_current) + self.assertTrue(self.member2.is_current) + self.season_next.do_default_season() + self.assertFalse(self.member1.is_current) + self.assertFalse(self.member2.is_current) + + def test_member_numbers_manual(self): + """ Tests manual member number generation """ + conf = self.member_numberconfig_model.create({'is_automatic': '0'}) + conf.apply_recompute() + self.assertFalse(self.member1.number) + self.member1.number_manual = u'M01' + self.assertEqual(self.member1.number_manual, self.member1.number) + # **Can not test IntegrityError without Odoo ERROR...** + # with self.assertRaises(IntegrityError) as cm: + # self.member2.number_manual = u'M01' + # self.assertIn('duplicate key value violates unique constraint', + # cm.exception.args[0]) + + def test_member_numbers_auto_season(self): + """ Tests per season automatic member number generation + prefix """ + conf = self.member_numberconfig_model.create({'is_automatic': '1', + 'is_per_season': '1', + 'prefix': u'M'}) + conf.apply_recompute() + self.assertEqual(self.member1.number, u'M1') + self.assertEqual(self.member2.number, u'M2') + + self.member2.season_ids += self.season_next + self.assertEqual(self.member2.number, u'M2') + self.season_next.do_default_season() + self.assertTrue(self.member2.is_current) + self.assertEqual(self.member2.number, u'M1') + self.assertFalse(self.member1.is_current) + self.assertFalse(self.member1.number) + + def test_mnumbers_auto_season_from(self): + """ Tests per season automatic member number + number_from """ + conf = self.member_numberconfig_model.create({'is_automatic': '1', + 'is_per_season': '1', + 'prefix': False, + 'number_from': 100}) + conf.apply_recompute() + self.assertEqual(self.member1.number, u'100') + self.assertEqual(self.member2.number, u'101') + + self.member2.season_ids += self.season_next + self.assertEqual(self.member2.number, u'101') + self.season_next.do_default_season() + self.assertTrue(self.member2.is_current) + self.assertEqual(self.member2.number, u'100') + self.assertFalse(self.member1.is_current) + self.assertFalse(self.member1.number) + + def test_member_numbers_auto_global(self): + """ Tests global automatic member number generation """ + conf = self.member_numberconfig_model.create({'is_automatic': '1', + 'is_per_season': '0'}) + conf.apply_recompute() + self.assertEqual(self.member1.number, u'1') + self.assertEqual(self.member2.number, u'2') + new_m = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Buddy', + 'season_ids': [self.season_next]}) + self.assertEqual(new_m.number, u'3') + + def test_mnumbers_auto_global_from(self): + """ Tests global automatic member number generation + number_from """ + conf = self.member_numberconfig_model.create({'is_automatic': '1', + 'is_per_season': '0', + 'number_from': 50}) + conf.apply_recompute() + self.assertEqual(self.member1.number, u'50') + self.assertEqual(self.member2.number, u'51') + new_m = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Buddy', + 'season_ids': [self.season_next]}) + self.assertEqual(new_m.number, u'52') + + def test_mnumbers_manual_to_auto(self): + """ Tests generation change withtout whole recompute """ + conf = self.member_numberconfig_model.create({'is_automatic': '0'}) + conf.apply_recompute() + self.assertFalse(self.member1.number) + self.member1.number_manual = u'M01' + self.assertEqual(self.member1.number_manual, self.member1.number) + + # Without number_from + conf = self.member_numberconfig_model.create({'is_automatic': '1', + 'is_per_season': '0', + 'prefix': False}) + conf.apply_nocompute() + self.assertEqual(self.member1.number, u'M01') + new_m = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Dewie', + 'season_ids': [self.season_current]}) + new_m2 = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Dowa', + 'season_ids': [self.season_current]}) + self.assertEqual(new_m.number, u'1') + self.assertEqual(new_m2.number, u'2') + + # With number_from + conf = self.member_numberconfig_model.create({'is_automatic': '1', + 'is_per_season': '0', + 'prefix': False, + 'number_from': 50}) + conf.apply_nocompute() + self.assertEqual(self.member1.number, u'M01') + new_m = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Buddy', + 'season_ids': [self.season_current]}) + new_m2 = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Bobby', + 'season_ids': [self.season_current]}) + self.assertEqual(new_m.number, u'50') + self.assertEqual(new_m2.number, u'51') + # After season changing + self.season_next.do_default_season() + self.assertEqual(self.member1.number, u'M01') + self.assertEqual(new_m.number, u'50') + self.member1.season_ids += self.season_next + self.assertEqual(self.member1.number, u'M01') + new_m3 = self.member_model.create({'lastname': 'NEW', + 'firstname': 'Barny', + 'season_ids': [self.season_current]}) + self.assertEqual(new_m3.number, u'52') diff --git a/golem_precreation_member/views/golem_member_views.xml b/golem_precreation_member/views/golem_member_views.xml new file mode 100644 index 0000000..92c560e --- /dev/null +++ b/golem_precreation_member/views/golem_member_views.xml @@ -0,0 +1,37 @@ + + + + + + + + GOLEM Member Precreation extention Form + golem.member + + + +
+
+
+
+
+ +
+
diff --git a/golem_precreation_member/wizard/__init__.py b/golem_precreation_member/wizard/__init__.py new file mode 100644 index 0000000..b554785 --- /dev/null +++ b/golem_precreation_member/wizard/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from . import golem_precreation_member_wizard diff --git a/golem_precreation_member/wizard/golem_precreation_member_wizard.py b/golem_precreation_member/wizard/golem_precreation_member_wizard.py new file mode 100644 index 0000000..f1401fc --- /dev/null +++ b/golem_precreation_member/wizard/golem_precreation_member_wizard.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Youssef El Ouahby +# Copyright 2018 Fabien Bourgeois +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +""" GOLEM Precreation member wizard""" + +from odoo import models, fields, api + +class GolemPrecreationMemberWizard(models.TransientModel): + """GOLEM Precreation member wizard """ + _name = "golem.precreation.member.wizard" + + name = fields.Char() diff --git a/golem_precreation_member/wizard/golem_precreation_member_wizard_views.xml b/golem_precreation_member/wizard/golem_precreation_member_wizard_views.xml new file mode 100644 index 0000000..e1493fb --- /dev/null +++ b/golem_precreation_member/wizard/golem_precreation_member_wizard_views.xml @@ -0,0 +1,49 @@ + + + + + + + + Golem Precreation Member Wizard Form + golem.precreation.member.wizard + +
+ + + + +
+
+
+ +
+