2009-10-20 10:52:23 +00:00
# -*- coding: utf-8 -*-
2007-05-18 12:29:43 +00:00
##############################################################################
2010-03-19 10:58:38 +00:00
#
2009-10-14 12:32:15 +00:00
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
2008-06-16 11:00:21 +00:00
#
2008-11-03 18:27:16 +00:00
# This program is free software: you can redistribute it and/or modify
2009-10-14 12:32:15 +00:00
# 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.
2007-05-18 12:29:43 +00:00
#
2008-11-03 18:27:16 +00:00
# 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
2009-10-14 12:32:15 +00:00
# GNU Affero General Public License for more details.
2007-05-18 12:29:43 +00:00
#
2009-10-14 12:32:15 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-03-19 10:58:38 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2007-05-18 12:29:43 +00:00
#
##############################################################################
from osv import fields , osv
import time
import tools
2007-08-22 05:17:13 +00:00
2007-06-06 10:53:38 +00:00
class ir_rule_group ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = ' ir.rule.group '
_columns = {
' name ' : fields . char ( ' Name ' , size = 128 , select = 1 ) ,
2008-08-21 13:49:55 +00:00
' model_id ' : fields . many2one ( ' ir.model ' , ' Object ' , select = 1 , required = True ) ,
2009-07-06 19:41:53 +00:00
' global ' : fields . boolean ( ' Global ' , select = 1 , help = " Make the rule global, otherwise it needs to be put on a group " ) ,
2008-07-22 14:24:36 +00:00
' rules ' : fields . one2many ( ' ir.rule ' , ' rule_group ' , ' Tests ' , help = " The rule is satisfied if at least one test is True " ) ,
' groups ' : fields . many2many ( ' res.groups ' , ' group_rule_group_rel ' , ' rule_group_id ' , ' group_id ' , ' Groups ' ) ,
' users ' : fields . many2many ( ' res.users ' , ' user_rule_group_rel ' , ' rule_group_id ' , ' user_id ' , ' Users ' ) ,
}
_order = ' model_id, global DESC '
_defaults = {
' global ' : lambda * a : True ,
}
2007-06-06 10:53:38 +00:00
ir_rule_group ( )
2007-05-18 12:29:43 +00:00
class ir_rule ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = ' ir.rule '
_rec_name = ' field_id '
def _operand ( self , cr , uid , context ) :
def get ( object , level = 3 , recur = None , root_tech = ' ' , root = ' ' ) :
res = [ ]
if not recur :
recur = [ ]
fields = self . pool . get ( object ) . fields_get ( cr , uid )
key = fields . keys ( )
key . sort ( )
for k in key :
if fields [ k ] [ ' type ' ] in ( ' many2one ' ) :
res . append ( ( root_tech + ' . ' + k + ' .id ' ,
root + ' / ' + fields [ k ] [ ' string ' ] ) )
elif fields [ k ] [ ' type ' ] in ( ' many2many ' , ' one2many ' ) :
res . append ( ( ' \' , \' .join(map(lambda x: str(x.id), ' + root_tech + ' . ' + k + ' )) ' ,
root + ' / ' + fields [ k ] [ ' string ' ] ) )
else :
res . append ( ( root_tech + ' . ' + k ,
root + ' / ' + fields [ k ] [ ' string ' ] ) )
if ( fields [ k ] [ ' type ' ] in recur ) and ( level > 0 ) :
res . extend ( get ( fields [ k ] [ ' relation ' ] , level - 1 ,
recur , root_tech + ' . ' + k , root + ' / ' + fields [ k ] [ ' string ' ] ) )
return res
res = [ ( " False " , " False " ) , ( " True " , " True " ) , ( " user.id " , " User " ) ]
res + = get ( ' res.users ' , level = 1 ,
recur = [ ' many2one ' ] , root_tech = ' user ' , root = ' User ' )
return res
def _domain_force_get ( self , cr , uid , ids , field_name , arg , context = { } ) :
res = { }
for rule in self . browse ( cr , uid , ids , context ) :
2009-02-25 11:14:35 +00:00
eval_user_data = { ' user ' : self . pool . get ( ' res.users ' ) . browse ( cr , 1 , uid ) ,
' time ' : time }
2010-03-19 10:58:38 +00:00
2008-07-22 14:24:36 +00:00
if rule . domain_force :
2009-02-25 11:14:35 +00:00
res [ rule . id ] = eval ( rule . domain_force , eval_user_data )
2008-07-22 14:24:36 +00:00
else :
2009-12-31 07:45:11 +00:00
if rule . operand and rule . operand . startswith ( ' user. ' ) and rule . operand . count ( ' . ' ) > 1 :
2009-11-25 16:37:18 +00:00
#Need to check user.field.field1.field2(if field is False,it will break the chain)
op = rule . operand [ 5 : ]
rule . operand = rule . operand [ : 5 + len ( op [ : op . find ( ' . ' ) ] ) ] + ' and ' + rule . operand + ' or False '
2008-07-22 14:24:36 +00:00
if rule . operator in ( ' in ' , ' child_of ' ) :
dom = eval ( " [( ' %s ' , ' %s ' , [ %s ])] " % ( rule . field_id . name , rule . operator ,
2009-02-25 11:14:35 +00:00
eval ( rule . operand , eval_user_data ) ) , eval_user_data )
2008-07-22 14:24:36 +00:00
else :
dom = eval ( " [( ' %s ' , ' %s ' , %s )] " % ( rule . field_id . name , rule . operator ,
2009-02-25 11:14:35 +00:00
rule . operand ) , eval_user_data )
2008-07-22 14:24:36 +00:00
res [ rule . id ] = dom
return res
_columns = {
2009-06-24 05:43:12 +00:00
' field_id ' : fields . many2one ( ' ir.model.fields ' , ' Field ' , domain = " [( ' model_id ' , ' = ' , parent.model_id)] " , select = 1 ) ,
' operator ' : fields . selection ( ( ( ' = ' , ' = ' ) , ( ' <> ' , ' <> ' ) , ( ' <= ' , ' <= ' ) , ( ' >= ' , ' >= ' ) , ( ' in ' , ' in ' ) , ( ' child_of ' , ' child_of ' ) ) , ' Operator ' ) ,
' operand ' : fields . selection ( _operand , ' Operand ' , size = 64 ) ,
2008-07-22 14:24:36 +00:00
' rule_group ' : fields . many2one ( ' ir.rule.group ' , ' Group ' , select = 2 , required = True , ondelete = " cascade " ) ,
' domain_force ' : fields . char ( ' Force Domain ' , size = 250 ) ,
2010-03-19 10:58:38 +00:00
' domain ' : fields . function ( _domain_force_get , method = True , string = ' Domain ' , type = ' char ' , size = 250 ) ,
' perm_read ' : fields . boolean ( ' Read Access ' ) ,
' perm_write ' : fields . boolean ( ' Write Access ' ) ,
' perm_create ' : fields . boolean ( ' Create Access ' ) ,
' perm_unlink ' : fields . boolean ( ' Delete Access ' )
}
_defaults = {
' perm_read ' : lambda * a : True ,
' perm_write ' : lambda * a : True ,
' perm_create ' : lambda * a : True ,
' perm_unlink ' : lambda * a : True ,
2008-07-22 14:24:36 +00:00
}
2010-03-19 10:58:38 +00:00
_sql_constraints = [
( ' no_access_rights ' , ' CHECK (perm_read!=False or perm_write!=False or perm_create!=False or perm_unlink!=False) ' , ' Rule must have atleast one checked access right ' ) ,
]
2008-07-22 14:24:36 +00:00
def onchange_all ( self , cr , uid , ids , field_id , operator , operand ) :
if not ( field_id or operator or operand ) :
return { }
2010-03-19 10:58:38 +00:00
def domain_get ( self , cr , uid , model_name , mode = ' read ' , context = { } ) :
2008-07-22 14:24:36 +00:00
if uid == 1 :
2009-12-22 21:28:07 +00:00
return [ ] , [ ] , [ ' " ' + self . pool . get ( model_name ) . _table + ' " ' ]
2008-07-22 14:24:36 +00:00
2010-03-19 10:58:38 +00:00
cr . execute ( """ SELECT r.id
FROM ir_rule r
2008-07-22 14:24:36 +00:00
JOIN ( ir_rule_group g
JOIN ir_model m ON ( g . model_id = m . id ) )
ON ( g . id = r . rule_group )
WHERE m . model = % s
2010-03-19 10:58:38 +00:00
AND r . perm_ """ + mode + """
2008-07-22 14:24:36 +00:00
AND ( g . id IN ( SELECT rule_group_id FROM group_rule_group_rel g_rel
JOIN res_groups_users_rel u_rel ON ( g_rel . group_id = u_rel . gid )
2008-12-09 12:37:22 +00:00
WHERE u_rel . uid = % s ) OR g . global ) """ , (model_name, uid))
2010-03-19 10:58:38 +00:00
ids = map ( lambda x : x [ 0 ] , cr . fetchall ( ) )
2009-12-22 19:01:58 +00:00
dom = [ ]
2008-07-22 14:24:36 +00:00
for rule in self . browse ( cr , uid , ids ) :
2009-12-22 19:01:58 +00:00
dom + = rule . domain
d1 , d2 , tables = self . pool . get ( model_name ) . _where_calc ( cr , uid , dom , active_test = False )
2009-12-22 21:20:36 +00:00
return d1 , d2 , tables
2008-07-22 14:24:36 +00:00
domain_get = tools . cache ( ) ( domain_get )
def unlink ( self , cr , uid , ids , context = None ) :
res = super ( ir_rule , self ) . unlink ( cr , uid , ids , context = context )
# Restart the cache on the domain_get method of ir.rule
2009-01-05 21:17:46 +00:00
self . domain_get . clear_cache ( cr . dbname )
2008-07-22 14:24:36 +00:00
return res
def create ( self , cr , user , vals , context = None ) :
res = super ( ir_rule , self ) . create ( cr , user , vals , context = context )
# Restart the cache on the domain_get method of ir.rule
2009-01-05 21:17:46 +00:00
self . domain_get . clear_cache ( cr . dbname )
2008-07-22 14:24:36 +00:00
return res
def write ( self , cr , uid , ids , vals , context = None ) :
if not context :
context = { }
res = super ( ir_rule , self ) . write ( cr , uid , ids , vals , context = context )
# Restart the cache on the domain_get method
2009-01-05 21:17:46 +00:00
self . domain_get . clear_cache ( cr . dbname )
2008-07-22 14:24:36 +00:00
return res
2007-05-18 12:29:43 +00:00
ir_rule ( )
2008-07-23 15:01:27 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: