From 0a035ce504e1efccf96ecb75c2fe8d66c79c5727 Mon Sep 17 00:00:00 2001 From: Fabien BOURGEOIS Date: Wed, 24 Oct 2018 07:57:15 +0200 Subject: [PATCH] [REF][FIX]GOLEM Member Minor : new legal guardians * Remove button to do default (and so browser reload) in favor of parent constraint ; * Ensures there is no double (two times same person) with SQL constraint ; * Add SQL on migration script to handle old column name inherited from m2m ; * Add base security on new model ; --- golem_member_minor/__manifest__.py | 5 +- .../migrations/10.0.1.1.3/post-migrate.py | 2 + golem_member_minor/models/__init__.py | 1 + .../models/golem_legal_guardian.py | 70 ++++++------------- golem_member_minor/models/golem_member.py | 16 ++++- .../security/ir.model.access.csv | 2 + .../views/golem_member_views.xml | 49 +++++++------ 7 files changed, 72 insertions(+), 73 deletions(-) create mode 100644 golem_member_minor/security/ir.model.access.csv diff --git a/golem_member_minor/__manifest__.py b/golem_member_minor/__manifest__.py index 419c330..202ed3b 100644 --- a/golem_member_minor/__manifest__.py +++ b/golem_member_minor/__manifest__.py @@ -18,12 +18,13 @@ { 'name': 'GOLEM members minor', 'summary': 'GOLEM non-profit members minor management', - 'version': '10.0.1.1.3', + 'version': '10.0.1.2.0', 'category': 'GOLEM', 'author': 'Fabien Bourgeois', 'license': 'AGPL-3', 'application': False, 'installable': True, 'depends': ['golem_member'], - 'data': ['views/golem_member_views.xml'] + 'data': ['security/ir.model.access.csv', + 'views/golem_member_views.xml'] } diff --git a/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py b/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py index 124d0c8..7b96e02 100644 --- a/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py +++ b/golem_member_minor/migrations/10.0.1.1.3/post-migrate.py @@ -27,3 +27,5 @@ def migrate(cursor, version): cursor.execute('''INSERT INTO golem_legal_guardian(member_id, legal_guardian_id) VALUES (%s, %s)''' % (member_id, legal_guardian_id)) cursor.execute('DROP TABLE golem_member_res_partner_rel') + cursor.execute('DELETE FROM ir_model_fields WHERE name=\'legal_guardian_ids\' ' + 'AND ttype=\'many2many\'') diff --git a/golem_member_minor/models/__init__.py b/golem_member_minor/models/__init__.py index 6bf7b26..d92c984 100644 --- a/golem_member_minor/models/__init__.py +++ b/golem_member_minor/models/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Copyright 2017 Fabien Bourgeois +# Copyright 2018 Youssef El Ouahby # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as diff --git a/golem_member_minor/models/golem_legal_guardian.py b/golem_member_minor/models/golem_legal_guardian.py index b19065b..2e5e1df 100644 --- a/golem_member_minor/models/golem_legal_guardian.py +++ b/golem_member_minor/models/golem_legal_guardian.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -# Copyright 2017-2018 Fabien Bourgeois +# 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 @@ -15,58 +16,29 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -""" Golem Legal Guardian Management """ +""" GOLEM Legal Guardian Management """ -from odoo import models, fields, api, _ -from odoo.exceptions import ValidationError +from odoo import models, fields, _ class GolemLegalGuardian(models.Model): - """ Golem Legal Guardian Management """ + """ GOLEM Legal Guardian Management """ _name = 'golem.legal.guardian' + _description = 'GOLEM Legal Guardian Management' + _sql_constraints = [( + 'golem_legal_guardian_uniq', 'UNIQUE (member_id, legal_guardian_id)', + _('There are doubles in your legal guardians. Please check your fills.') + )] member_id = fields.Many2one('golem.member', required=True, - ondelete='cascade', - readonly=True) - legal_guardian_id = fields.Many2one('res.partner', required=True, - domain="[('is_company', '=', False)]", - ondelete='cascade') - name = fields.Char(related="legal_guardian_id.name") - contact_address = fields.Char(related="legal_guardian_id.contact_address") - phone = fields.Char(related="legal_guardian_id.phone") - mobile = fields.Char(related="legal_guardian_id.mobile") - email = fields.Char(related="legal_guardian_id.email") - - + index=True, auto_join=True, + ondelete='cascade') + legal_guardian_id = fields.Many2one( + 'res.partner', required=True, index=True, auto_join=True, + string='Legal guardian', ondelete='cascade', + domain="[('is_company', '=', False)]" + ) + contact_address = fields.Char(related='legal_guardian_id.contact_address') + phone = fields.Char(related='legal_guardian_id.phone') + mobile = fields.Char(related='legal_guardian_id.mobile') + email = fields.Char(related='legal_guardian_id.email') is_default_guardian = fields.Boolean() - - def do_default_guardian(self): - """ Make current only default guardian """ - self.ensure_one() - self.write({'is_default_guardian': True}) - legal_list = self.member_id.legal_guardian_ids.filtered( - lambda a: a.legal_guardian_id not in self.legal_guardian_id) - legal_list.write({'is_default_guardian': False}) - return { - 'type': 'ir.actions.client', - 'tag': 'reload' - } - - @api.model - def create(self, values): - """ Make the current guardian is default if the only, and the only if default """ - if values['is_default_guardian']: - self.env['golem.member'].browse(values['member_id']).legal_guardian_ids.write( - {'is_default_guardian': False}) - if not self.env['golem.member'].browse(values['member_id']).legal_guardian_ids: - values['is_default_guardian'] = True - return super(GolemLegalGuardian, self).create(values) - - @api.multi - def unlink(self): - """ Forbids default legal guardian removal """ - for guardian in self: - if guardian.is_default_guardian and len(guardian.member_id.legal_guardian_ids) > 1: - emsg = _('You can\'t delete the default legal guardian') - raise ValidationError(emsg) - else: - return super(GolemLegalGuardian, self).unlink() diff --git a/golem_member_minor/models/golem_member.py b/golem_member_minor/models/golem_member.py index b0ef6fd..2829e05 100644 --- a/golem_member_minor/models/golem_member.py +++ b/golem_member_minor/models/golem_member.py @@ -18,7 +18,8 @@ """ GOLEM Member Minor management """ from datetime import date, timedelta -from odoo import models, fields, api +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError ADULT_DURATION = timedelta(days=365.25*18) @@ -51,3 +52,16 @@ class GolemMember(models.Model): else: operator = '<=' if value else '>' return [('birthdate_date', operator, adult_date)] + + @api.constrains('legal_guardian_ids') + def check_default_guardian(self): + """ Ensures there is one and only one default guardian, no double """ + for member in self: + if len(member.legal_guardian_ids): + default_guardians_count = len(member.legal_guardian_ids.filtered( + 'is_default_guardian' + )) + if not default_guardians_count or default_guardians_count > 1: + verr = _('You must have one and only one default legal ' + 'guardian. Please check your fills.') + raise ValidationError(verr) diff --git a/golem_member_minor/security/ir.model.access.csv b/golem_member_minor/security/ir.model.access.csv new file mode 100644 index 0000000..3e6751c --- /dev/null +++ b/golem_member_minor/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_golem_legal_guardian_user,Access GOLEM Legal Guardian User,model_golem_legal_guardian,golem_base.group_golem_user,1,1,1,1 diff --git a/golem_member_minor/views/golem_member_views.xml b/golem_member_minor/views/golem_member_views.xml index bea5849..966b050 100644 --- a/golem_member_minor/views/golem_member_views.xml +++ b/golem_member_minor/views/golem_member_views.xml @@ -2,6 +2,7 @@ + Add Minor Page/Tab golem.member @@ -34,39 +35,45 @@ along with this program. If not, see . - - - - - - - - -