2009-10-20 10:52:23 +00:00
# -*- coding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
2009-10-14 12:32:15 +00:00
#
2008-11-19 09:37:50 +00:00
# OpenERP, Open Source Management Solution
2009-10-14 12:32:15 +00:00
# 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.
2006-12-07 13:41:40 +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.
2006-12-07 13:41:40 +00:00
#
2009-10-14 12:32:15 +00:00
# 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/>.
2006-12-07 13:41:40 +00:00
#
##############################################################################
from osv import fields , osv
2008-08-04 09:31:37 +00:00
from osv . orm import except_orm
2006-12-07 13:41:40 +00:00
import tools
2008-06-16 18:27:17 +00:00
import pytz
2009-03-06 18:06:50 +00:00
from tools . translate import _
2006-12-07 13:41:40 +00:00
class groups ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = " res.groups "
2008-09-03 18:11:03 +00:00
_order = ' name '
2008-07-22 14:24:36 +00:00
_columns = {
' name ' : fields . char ( ' Group Name ' , size = 64 , required = True ) ,
' model_access ' : fields . one2many ( ' ir.model.access ' , ' group_id ' , ' Access Controls ' ) ,
' rule_groups ' : fields . many2many ( ' ir.rule.group ' , ' group_rule_group_rel ' ,
' group_id ' , ' rule_group_id ' , ' Rules ' , domain = " [( ' global ' , ' <> ' , True)] " ) ,
' menu_access ' : fields . many2many ( ' ir.ui.menu ' , ' ir_ui_menu_group_rel ' , ' gid ' , ' menu_id ' , ' Access Menu ' ) ,
' comment ' : fields . text ( ' Comment ' , size = 250 ) ,
}
_sql_constraints = [
( ' name_uniq ' , ' unique (name) ' , ' The name of the group must be unique ! ' )
]
2009-09-17 07:27:12 +00:00
def copy ( self , cr , uid , id , default = None , context = { } ) :
group_name = self . read ( cr , uid , [ id ] , [ ' name ' ] ) [ 0 ] [ ' name ' ]
default . update ( { ' name ' : group_name + ' (copy) ' } )
return super ( groups , self ) . copy ( cr , uid , id , default , context )
2007-08-09 06:06:27 +00:00
2008-07-22 14:24:36 +00:00
def write ( self , cr , uid , ids , vals , context = None ) :
if ' name ' in vals :
if vals [ ' name ' ] . startswith ( ' - ' ) :
raise osv . except_osv ( _ ( ' Error ' ) ,
_ ( ' The name of the group can not start with " - " ' ) )
res = super ( groups , self ) . write ( cr , uid , ids , vals , context = context )
# Restart the cache on the company_get method
2009-01-05 21:17:46 +00:00
self . pool . get ( ' ir.rule ' ) . domain_get . clear_cache ( cr . dbname )
2009-01-26 23:19:05 +00:00
self . pool . get ( ' ir.model.access ' ) . call_cache_clearing_methods ( cr )
2008-07-22 14:24:36 +00:00
return res
2007-08-09 06:06:27 +00:00
2008-07-22 14:24:36 +00:00
def create ( self , cr , uid , vals , context = None ) :
if ' name ' in vals :
if vals [ ' name ' ] . startswith ( ' - ' ) :
raise osv . except_osv ( _ ( ' Error ' ) ,
_ ( ' The name of the group can not start with " - " ' ) )
2009-02-04 14:36:29 +00:00
gid = super ( groups , self ) . create ( cr , uid , vals , context = context )
# assign this new group to user_root
user_obj = self . pool . get ( ' res.users ' )
aid = user_obj . browse ( cr , 1 , user_obj . _get_admin_id ( cr ) )
if aid :
aid . write ( { ' groups_id ' : [ ( 4 , gid ) ] } )
return gid
2007-08-09 06:06:27 +00:00
2006-12-07 13:41:40 +00:00
groups ( )
class roles ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = " res.roles "
_columns = {
' name ' : fields . char ( ' Role Name ' , size = 64 , required = True ) ,
' parent_id ' : fields . many2one ( ' res.roles ' , ' Parent ' , select = True ) ,
2009-01-26 15:04:53 +00:00
' child_id ' : fields . one2many ( ' res.roles ' , ' parent_id ' , ' Children ' ) ,
2008-07-28 15:43:35 +00:00
' users ' : fields . many2many ( ' res.users ' , ' res_roles_users_rel ' , ' rid ' , ' uid ' , ' Users ' ) ,
2008-07-22 14:24:36 +00:00
}
_defaults = {
}
def check ( self , cr , uid , ids , role_id ) :
if role_id in ids :
return True
2008-12-09 12:37:22 +00:00
cr . execute ( ' select parent_id from res_roles where id= %s ' , ( role_id , ) )
2008-07-22 14:24:36 +00:00
roles = cr . fetchone ( ) [ 0 ]
if roles :
return self . check ( cr , uid , ids , roles )
return False
2006-12-07 13:41:40 +00:00
roles ( )
2008-06-16 18:27:17 +00:00
def _lang_get ( self , cr , uid , context = { } ) :
2008-07-22 14:24:36 +00:00
obj = self . pool . get ( ' res.lang ' )
ids = obj . search ( cr , uid , [ ] )
res = obj . read ( cr , uid , ids , [ ' code ' , ' name ' ] , context )
res = [ ( r [ ' code ' ] , r [ ' name ' ] ) for r in res ]
return res
2008-06-18 06:17:51 +00:00
def _tz_get ( self , cr , uid , context = { } ) :
2008-07-22 14:24:36 +00:00
return [ ( x , x ) for x in pytz . all_timezones ]
2008-06-16 18:27:17 +00:00
2009-09-17 07:27:12 +00:00
def _companies_get ( self , cr , uid , context = { } ) :
res = [ ]
ids = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context ) . company_ids
res = [ ( i . id , i . name ) for i in ids ]
return res
2006-12-07 13:41:40 +00:00
class users ( osv . osv ) :
2009-02-04 14:36:29 +00:00
__admin_ids = { }
2008-07-22 14:24:36 +00:00
_name = " res.users "
2008-11-19 09:37:50 +00:00
#_log_access = False
2009-09-17 07:27:12 +00:00
def get_current_company ( self , cr , uid ) :
res = [ ]
cr . execute ( ' select company_id, res_company.name from res_users left join res_company on res_company.id = company_id where res_users.id= %s ' % uid )
res = cr . fetchall ( )
return res
2008-07-22 14:24:36 +00:00
_columns = {
' name ' : fields . char ( ' Name ' , size = 64 , required = True , select = True ) ,
' login ' : fields . char ( ' Login ' , size = 64 , required = True ) ,
2008-11-19 20:22:44 +00:00
' password ' : fields . char ( ' Password ' , size = 64 , invisible = True , help = " Keep empty if you don ' t want the user to be able to connect on the system. " ) ,
2008-07-22 14:24:36 +00:00
' signature ' : fields . text ( ' Signature ' , size = 64 ) ,
' address_id ' : fields . many2one ( ' res.partner.address ' , ' Address ' ) ,
' active ' : fields . boolean ( ' Active ' ) ,
' action_id ' : fields . many2one ( ' ir.actions.actions ' , ' Home Action ' ) ,
' menu_id ' : fields . many2one ( ' ir.actions.actions ' , ' Menu Action ' ) ,
' groups_id ' : fields . many2many ( ' res.groups ' , ' res_groups_users_rel ' , ' uid ' , ' gid ' , ' Groups ' ) ,
' roles_id ' : fields . many2many ( ' res.roles ' , ' res_roles_users_rel ' , ' uid ' , ' rid ' , ' Roles ' ) ,
2008-08-04 09:31:37 +00:00
' rules_id ' : fields . many2many ( ' ir.rule.group ' , ' user_rule_group_rel ' , ' user_id ' , ' rule_group_id ' , ' Rules ' ) ,
2008-07-22 14:24:36 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' ) ,
2009-09-17 07:27:12 +00:00
' company_ids ' : fields . many2many ( ' res.company ' , ' res_company_users_rel ' , ' user_id ' , ' cid ' , ' Accepted Companies ' ) ,
2008-07-22 14:24:36 +00:00
' context_lang ' : fields . selection ( _lang_get , ' Language ' , required = True ) ,
2009-09-17 07:27:12 +00:00
' context_tz ' : fields . selection ( _tz_get , ' Timezone ' , size = 64 ) ,
2009-10-08 09:54:48 +00:00
' company ' : fields . selection ( _companies_get , ' Company ' , size = 64 ) ,
2008-07-22 14:24:36 +00:00
}
def read ( self , cr , uid , ids , fields = None , context = None , load = ' _classic_read ' ) :
2008-09-23 16:24:56 +00:00
def override_password ( o ) :
2009-01-28 11:20:14 +00:00
if ' password ' in o and ( ' id ' not in o or o [ ' id ' ] != uid ) :
2008-09-23 16:24:56 +00:00
o [ ' password ' ] = ' ******** '
return o
2008-07-22 14:24:36 +00:00
result = super ( users , self ) . read ( cr , uid , ids , fields , context , load )
canwrite = self . pool . get ( ' ir.model.access ' ) . check ( cr , uid , ' res.users ' , ' write ' , raise_exception = False )
if not canwrite :
2008-09-23 16:24:56 +00:00
if isinstance ( ids , ( int , float ) ) :
result = override_password ( result )
else :
result = map ( override_password , result )
2008-07-22 14:24:36 +00:00
return result
2008-05-26 12:43:53 +00:00
2008-07-22 14:24:36 +00:00
_sql_constraints = [
2009-09-17 07:27:12 +00:00
( ' login_key ' , ' UNIQUE (login) ' , _ ( ' You can not have two users with the same login ! ' ) )
2008-07-22 14:24:36 +00:00
]
2009-02-04 14:36:29 +00:00
def _get_admin_id ( self , cr ) :
if self . __admin_ids . get ( cr . dbname ) is None :
ir_model_data_obj = self . pool . get ( ' ir.model.data ' )
mdid = ir_model_data_obj . _get_id ( cr , 1 , ' base ' , ' user_root ' )
self . __admin_ids [ cr . dbname ] = ir_model_data_obj . read ( cr , 1 , [ mdid ] , [ ' res_id ' ] ) [ 0 ] [ ' res_id ' ]
return self . __admin_ids [ cr . dbname ]
2008-07-22 14:24:36 +00:00
def _get_action ( self , cr , uid , context = { } ) :
ids = self . pool . get ( ' ir.ui.menu ' ) . search ( cr , uid , [ ( ' usage ' , ' = ' , ' menu ' ) ] )
return ids and ids [ 0 ] or False
2008-06-30 15:33:15 +00:00
2008-07-22 14:24:36 +00:00
def _get_company ( self , cr , uid , context = { } ) :
return self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context ) . company_id . id
2008-06-30 15:33:15 +00:00
2008-07-22 14:24:36 +00:00
def _get_menu ( self , cr , uid , context = { } ) :
ids = self . pool . get ( ' ir.actions.act_window ' ) . search ( cr , uid , [ ( ' usage ' , ' = ' , ' menu ' ) ] )
return ids and ids [ 0 ] or False
2008-06-30 15:33:15 +00:00
2008-11-21 11:30:22 +00:00
def _get_group ( self , cr , uid , context = { } ) :
ids = self . pool . get ( ' res.groups ' ) . search ( cr , uid , [ ( ' name ' , ' = ' , ' Employee ' ) ] )
return ids or False
2008-07-22 14:24:36 +00:00
_defaults = {
' password ' : lambda obj , cr , uid , context = { } : ' ' ,
' context_lang ' : lambda * args : ' en_US ' ,
' active ' : lambda obj , cr , uid , context = { } : True ,
' menu_id ' : _get_menu ,
' action_id ' : _get_menu ,
' company_id ' : _get_company ,
2008-11-21 11:30:22 +00:00
' groups_id ' : _get_group ,
2008-07-22 14:24:36 +00:00
}
def company_get ( self , cr , uid , uid2 ) :
2008-12-13 06:01:18 +00:00
company_id = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid2 ) . company_id . id
2008-07-22 14:24:36 +00:00
return company_id
company_get = tools . cache ( ) ( company_get )
2006-12-07 13:41:40 +00:00
2008-07-22 14:24:36 +00:00
def write ( self , cr , uid , ids , values , * args , * * argv ) :
if ( ids == [ uid ] ) :
ok = True
for k in values . keys ( ) :
if k not in ( ' password ' , ' signature ' , ' action_id ' , ' context_lang ' , ' context_tz ' ) :
ok = False
if ok :
uid = 1
2009-10-08 09:54:48 +00:00
context_company = values . get ( ' company ' , False )
2009-09-17 07:27:12 +00:00
if context_company :
values . update ( { ' company_id ' : context_company } )
2008-07-22 14:24:36 +00:00
res = super ( users , self ) . write ( cr , uid , ids , values , * args , * * argv )
2009-01-05 21:17:46 +00:00
self . company_get . clear_cache ( cr . dbname )
2008-07-22 14:24:36 +00:00
# Restart the cache on the company_get method
2009-01-05 21:17:46 +00:00
self . pool . get ( ' ir.rule ' ) . domain_get . clear_cache ( cr . dbname )
2009-01-26 23:19:05 +00:00
self . pool . get ( ' ir.model.access ' ) . call_cache_clearing_methods ( cr )
2008-07-22 14:24:36 +00:00
return res
2006-12-07 13:41:40 +00:00
2009-01-21 11:19:56 +00:00
def unlink ( self , cr , uid , ids , context = None ) :
2008-07-22 14:24:36 +00:00
if 1 in ids :
2008-09-02 21:31:44 +00:00
raise osv . except_osv ( _ ( ' Can not remove root user! ' ) , _ ( ' You can not remove the admin user as it is used internally for resources created by OpenERP (updates, module installation, ...) ' ) )
2009-01-21 11:19:56 +00:00
return super ( users , self ) . unlink ( cr , uid , ids , context = context )
2008-06-20 11:49:23 +00:00
2008-07-22 14:24:36 +00:00
def name_search ( self , cr , user , name = ' ' , args = None , operator = ' ilike ' , context = None , limit = 80 ) :
if not args :
args = [ ]
if not context :
context = { }
ids = [ ]
if name :
ids = self . search ( cr , user , [ ( ' login ' , ' = ' , name ) ] + args , limit = limit )
if not ids :
ids = self . search ( cr , user , [ ( ' name ' , operator , name ) ] + args , limit = limit )
return self . name_get ( cr , user , ids )
2008-06-20 11:49:23 +00:00
2008-07-22 14:24:36 +00:00
def copy ( self , cr , uid , id , default = None , context = { } ) :
login = self . read ( cr , uid , [ id ] , [ ' login ' ] ) [ 0 ] [ ' login ' ]
default . update ( { ' login ' : login + ' (copy) ' } )
return super ( users , self ) . copy ( cr , uid , id , default , context )
2008-06-16 18:27:17 +00:00
2008-09-22 11:13:18 +00:00
def context_get ( self , cr , uid , context = None ) :
2008-07-22 14:24:36 +00:00
user = self . browse ( cr , uid , uid , context )
result = { }
for k in self . _columns . keys ( ) :
if k . startswith ( ' context_ ' ) :
result [ k [ 8 : ] ] = getattr ( user , k )
return result
2008-06-16 18:27:17 +00:00
2008-07-22 14:24:36 +00:00
def action_get ( self , cr , uid , context = { } ) :
dataobj = self . pool . get ( ' ir.model.data ' )
data_id = dataobj . _get_id ( cr , 1 , ' base ' , ' action_res_users_my ' )
return dataobj . browse ( cr , uid , data_id , context ) . res_id
2008-06-20 11:49:23 +00:00
2008-07-22 14:24:36 +00:00
def action_next ( self , cr , uid , ids , context = None ) :
2008-09-09 09:40:23 +00:00
return {
2008-07-22 14:24:36 +00:00
' view_type ' : ' form ' ,
" view_mode " : ' form ' ,
2008-09-29 08:49:06 +00:00
' res_model ' : ' ir.actions.configuration.wizard ' ,
2008-07-22 14:24:36 +00:00
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
}
2008-07-02 08:42:47 +00:00
2008-07-22 14:24:36 +00:00
def action_continue ( self , cr , uid , ids , context = { } ) :
return {
' view_type ' : ' form ' ,
" view_mode " : ' form ' ,
2008-09-29 08:49:06 +00:00
' res_model ' : ' ir.actions.configuration.wizard ' ,
2008-07-22 14:24:36 +00:00
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
2008-09-09 09:40:23 +00:00
}
2008-07-22 14:24:36 +00:00
def action_new ( self , cr , uid , ids , context = { } ) :
return {
' view_type ' : ' form ' ,
" view_mode " : ' form ' ,
' res_model ' : ' res.users ' ,
' view_id ' : self . pool . get ( ' ir.ui.view ' ) . search ( cr , uid , [ ( ' name ' , ' = ' , ' res.users.confirm.form ' ) ] ) ,
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
}
2006-12-07 13:41:40 +00:00
users ( )
2008-07-28 15:43:35 +00:00
class groups2 ( osv . osv ) : ##FIXME: Is there a reason to inherit this object ?
2008-07-22 14:24:36 +00:00
_inherit = ' res.groups '
_columns = {
' users ' : fields . many2many ( ' res.users ' , ' res_groups_users_rel ' , ' gid ' , ' uid ' , ' Users ' ) ,
}
2007-07-19 13:47:25 +00:00
groups2 ( )
2008-06-21 09:54:30 +00:00
class res_config_view ( osv . osv_memory ) :
2008-07-22 14:24:36 +00:00
_name = ' res.config.view '
_columns = {
' name ' : fields . char ( ' Name ' , size = 64 ) ,
2008-08-24 17:10:28 +00:00
' view ' : fields . selection ( [ ( ' simple ' , ' Simplified Interface ' ) , ( ' extended ' , ' Extended Interface ' ) ] , ' View Mode ' , required = True ) ,
2008-06-21 09:54:30 +00:00
}
2008-07-22 14:24:36 +00:00
_defaults = {
' view ' : lambda * args : ' simple ' ,
2008-08-24 17:10:28 +00:00
}
2008-07-07 09:41:01 +00:00
2008-07-22 14:24:36 +00:00
def action_cancel ( self , cr , uid , ids , conect = None ) :
return {
' view_type ' : ' form ' ,
" view_mode " : ' form ' ,
2008-09-29 08:49:06 +00:00
' res_model ' : ' ir.actions.configuration.wizard ' ,
2008-07-22 14:24:36 +00:00
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
2008-07-07 09:41:01 +00:00
}
2008-07-22 14:24:36 +00:00
def action_set ( self , cr , uid , ids , context = None ) :
res = self . read ( cr , uid , ids ) [ 0 ]
users_obj = self . pool . get ( ' res.users ' )
group_obj = self . pool . get ( ' res.groups ' )
if ' view ' in res and res [ ' view ' ] and res [ ' view ' ] == ' extended ' :
2008-09-19 07:28:20 +00:00
group_ids = group_obj . search ( cr , uid , [ ( ' name ' , ' ilike ' , ' Extended ' ) ] )
2008-07-22 14:24:36 +00:00
if group_ids and len ( group_ids ) :
2008-09-19 07:28:20 +00:00
users_obj . write ( cr , uid , [ uid ] , {
2008-07-22 14:24:36 +00:00
' groups_id ' : [ ( 4 , group_ids [ 0 ] ) ]
} , context = context )
return {
' view_type ' : ' form ' ,
" view_mode " : ' form ' ,
2008-09-29 08:49:06 +00:00
' res_model ' : ' ir.actions.configuration.wizard ' ,
2008-07-22 14:24:36 +00:00
' type ' : ' ir.actions.act_window ' ,
' target ' : ' new ' ,
}
2008-06-21 09:54:30 +00:00
res_config_view ( )
2008-09-22 11:13:18 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: