[ADD] auth_dynamic_groups
parent
271e515c7e
commit
3a49fba558
|
@ -0,0 +1,15 @@
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
This module allows defining groups whose membership is a condition expressed as
|
||||||
|
python code. For every user, it is evaluated during login if she belongs to
|
||||||
|
the group or not.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
Check `Dynamic` on a group you want to be dynamic. Now fill in the condition,
|
||||||
|
using `user` which is a browse record of the user in question that evaluates
|
||||||
|
truthy if the user is supposed to be a member of the group and falsy if not.
|
||||||
|
|
||||||
|
There is a constraint on the field to check for validity if this expression.
|
||||||
|
When you're satisfied, click the button `Evaluate` to prefill the group's
|
||||||
|
members. The condition will be checked now for every user who logs in.
|
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Management Solution
|
||||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
from . import model
|
|
@ -0,0 +1,39 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Management Solution
|
||||||
|
# This module copyright (C) 2013-2015 Therp BV (<http://therp.nl>).
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
{
|
||||||
|
"name": "Dynamic groups",
|
||||||
|
"version": "1.0",
|
||||||
|
"author": "Therp BV",
|
||||||
|
"complexity": "normal",
|
||||||
|
'summary': 'Have membership conditions for certain groups',
|
||||||
|
"category": "Tools",
|
||||||
|
"depends": [
|
||||||
|
'base',
|
||||||
|
],
|
||||||
|
"data": [
|
||||||
|
'view/res_groups.xml',
|
||||||
|
],
|
||||||
|
"auto_install": False,
|
||||||
|
"installable": True,
|
||||||
|
"external_dependencies": {
|
||||||
|
'python': [],
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Management Solution
|
||||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
from . import res_users
|
||||||
|
from . import res_groups
|
|
@ -0,0 +1,77 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Management Solution
|
||||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
import logging
|
||||||
|
from openerp.osv.orm import Model
|
||||||
|
from openerp.osv import fields
|
||||||
|
from openerp.tools.safe_eval import safe_eval
|
||||||
|
from openerp import SUPERUSER_ID
|
||||||
|
|
||||||
|
|
||||||
|
class res_groups(Model):
|
||||||
|
_inherit = 'res.groups'
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'is_dynamic': fields.boolean('Dynamic'),
|
||||||
|
'dynamic_group_condition': fields.text(
|
||||||
|
'Condition', help='The condition to be met for a user to be a '
|
||||||
|
'member of this group. It is evaluated as python code at login '
|
||||||
|
'time, you get `user` passed as a browse record')
|
||||||
|
}
|
||||||
|
|
||||||
|
def eval_dynamic_group_condition(self, cr, uid, ids, context=None):
|
||||||
|
result = True
|
||||||
|
user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid,
|
||||||
|
context=context)
|
||||||
|
for this in self.browse(cr, uid, ids, context=context):
|
||||||
|
result &= bool(
|
||||||
|
safe_eval(
|
||||||
|
this.dynamic_group_condition,
|
||||||
|
{
|
||||||
|
'user': user,
|
||||||
|
'any': any,
|
||||||
|
'all': all,
|
||||||
|
'filter': filter,
|
||||||
|
}))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _check_dynamic_group_condition(self, cr, uid, ids, context=None):
|
||||||
|
try:
|
||||||
|
for this in self.browse(cr, uid, ids, context=context):
|
||||||
|
if this.is_dynamic:
|
||||||
|
this.eval_dynamic_group_condition()
|
||||||
|
except (NameError, SyntaxError, TypeError) as e:
|
||||||
|
logging.info(e)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
_constraints = [
|
||||||
|
(_check_dynamic_group_condition,
|
||||||
|
'The condition doesn\'t evaluate correctly!',
|
||||||
|
['dynamic_group_condition']),
|
||||||
|
]
|
||||||
|
|
||||||
|
def action_evaluate(self, cr, uid, ids, context=None):
|
||||||
|
user_obj = self.pool.get('res.users')
|
||||||
|
for user in user_obj.browse(
|
||||||
|
cr, uid,
|
||||||
|
user_obj.search(cr, uid, [], context=context),
|
||||||
|
context=context):
|
||||||
|
user_obj.update_dynamic_groups(user.id, cr.dbname)
|
|
@ -0,0 +1,55 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Management Solution
|
||||||
|
# This module copyright (C) 2013 Therp BV (<http://therp.nl>).
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
from openerp.models import Model
|
||||||
|
from openerp.modules.registry import RegistryManager
|
||||||
|
from openerp import SUPERUSER_ID
|
||||||
|
|
||||||
|
|
||||||
|
class res_users(Model):
|
||||||
|
_inherit = 'res.users'
|
||||||
|
|
||||||
|
def _login(self, db, login, password):
|
||||||
|
uid = super(res_users, self)._login(db, login, password)
|
||||||
|
|
||||||
|
if uid:
|
||||||
|
self.update_dynamic_groups(uid, db)
|
||||||
|
|
||||||
|
return uid
|
||||||
|
|
||||||
|
def update_dynamic_groups(self, uid, db):
|
||||||
|
pool = RegistryManager.get(db)
|
||||||
|
cr = pool._db.cursor()
|
||||||
|
user = pool.get('res.users').browse(cr, SUPERUSER_ID, uid)
|
||||||
|
groups_obj = pool.get('res.groups')
|
||||||
|
user.write(
|
||||||
|
{
|
||||||
|
'groups_id': [
|
||||||
|
(4, dynamic_group.id)
|
||||||
|
if dynamic_group.eval_dynamic_group_condition()
|
||||||
|
else (3, dynamic_group.id)
|
||||||
|
for dynamic_group in groups_obj.browse(
|
||||||
|
cr, uid,
|
||||||
|
groups_obj.search(cr, uid,
|
||||||
|
[('is_dynamic', '=', True)]))
|
||||||
|
],
|
||||||
|
})
|
||||||
|
cr.commit()
|
||||||
|
cr.close()
|
|
@ -0,0 +1,30 @@
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<record model="ir.ui.view" id="view_groups_form">
|
||||||
|
<field name="inherit_id" ref="base.view_groups_form" />
|
||||||
|
<field name="view_type">form</field>
|
||||||
|
<field name="model">res.groups</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<data>
|
||||||
|
<field name="name" position="after">
|
||||||
|
<field name="is_dynamic" />
|
||||||
|
</field>
|
||||||
|
<field name="users" position="attributes">
|
||||||
|
<attribute name="attrs">{'readonly': [('is_dynamic', '=', True)]}</attribute>
|
||||||
|
</field>
|
||||||
|
<field name="users" position="before">
|
||||||
|
<field
|
||||||
|
name="dynamic_group_condition"
|
||||||
|
colspan="4" nolabel="1"
|
||||||
|
attrs="{'invisible': [('is_dynamic', '=', False)]}" />
|
||||||
|
<button
|
||||||
|
type="object"
|
||||||
|
name="action_evaluate"
|
||||||
|
string="Evaluate"
|
||||||
|
attrs="{'invisible': [('is_dynamic', '=', False)]}" />
|
||||||
|
</field>
|
||||||
|
</data>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
Loading…
Reference in New Issue