pg端,检查一下postgresql.conf,看看listen那一行是不是写着listen = "localhost",是的话,改成listen = "*"
然后pg_hba.conf把访问限制取消,具体查文档。
pg端,检查一下postgresql.conf,看看listen那一行是不是写着listen = "localhost",是的话,改成listen = "*"
然后pg_hba.conf把访问限制取消,具体查文档。
用python的mssql模块来操作呗。
各位,又遇到难题了,现在文件是以binary方式存到数据库里的,如何读取出来呢?
为什么不能用android设备直接通过网页访问oe的网站呢?
这个,只要搞定怎么上传了,后面就简单了,想怎么玩就怎么玩。
准备工作,您需要下载Python的解析Excel的包。xlrd
有关此包的介绍我就不详说了,就是一个读Excel2003以下格式的第三方类库,据官网介绍也支持Excel2007的xml文件格式,不过具体我没试验过,只试了2003的xls格式。至于写就是另外一个包了,叫xlwt,反正一家公司的。
下载地址:http://www.python-excel.org/
言归正传,我是有个外部的Excel文件需要导入到OE里,但是OE自带Import模块太复杂,验证过于繁琐,因此就想改成我自己上传附件,后台自定义解析。
首先要解决上传附件的问题,OE有个ir.attachments模块,这个就是附件模块,不过默认是序列化为二进制后存入数据库,这样挺麻烦的,这时候就需要改为上传到指定的文件夹,然后用文件流的方式读取。
至于怎么改请参考这篇文章,http://cn.openerp.cn/where_to_store_attachement_in_openerp_7/,我就是在这里找到解决的思路。
上传后,文件会保存在"openerp根目录/filestore/当前数据库名称/"目录下,至于怎么获取这个目录请参考我之前发的一篇文章,http://shine-it.net/index.php/topic,14759.0.html。
至此,我们解决了上传附件的问题,接下来就是解析Excel了,其实网上这方面的博客都很多,仔细看看应该基本都会了。
首先需要引入相关库
<br />import xdrlib ,sys<br />import xlrd<br />
Excel操作
<br />try:<br /> data = xlrd.open_workbook(file_path) # 打开Excel文件<br /> return data<br />except Exception,e:<br /> raise osv.except_osv(u'error',u'.....')<br /><br />sheet = data.sheets()[0] # 获取第一个sheet<br />nrows = sheet.nrows # 总行数<br />ncols = sheet.ncols # 总列数<br /><br /># 循环行<br />for i to range(0, nrows):<br /> pass<br />
后续具体怎么操作,还是请各位结合自己的业务逻辑吧。
因为做一个模块的时候需要解析上传文件,找了一圈,终于在openerp.tools里找到了一些东西。
首先引入openerp.tools.config
import openerp.tools.config
然后调用config['root_path'],即可获得
config['root_path']
具体的方法是,去掉_default字段里,自增长的函数。
重写create方法,在创建的时候给字段赋值,设置自增长字段的readonly=True
谢谢Joshua。child_of我也研究过,但是一直没思路,所以我就自己递归出来的。
您的这个代码里,emps是一个数组吗,员工本身部门的ID集合?
res.users里的这个create方法是原来就有的,我只是一起copy出来了。
各位过奖了,呵呵,我就是在群里潜水,还经常问你们问题的。
这个只是总结了下。
HR模块主要包含了hr.employee(员工), hr.department(部门), hr.job(岗位), hr.employee.category(员工分类)对象,以及扩展继承了res.users(用户)对象。
其中hr.employee和res.users对象之间的关系是,hr.employee -> resource.resource -> res.users。但是,在HR模块里,res.users扩展了一个属性,employee_ids用来记录用户关联了哪些员工。
现在我们做些扩展,需要知道用户属于哪些部门,他的上级有哪些部门,下级有哪些部门。
对res_users类进行扩展,_get_self_department_ids函数是用来获取用户关联部门的,_get_parent_ids函数是用来获取用户关联部门的所有父节点(所有的上级部门),_get_child_ids函数是用来获取用户关联部门的所有子节点(所有的下级部门)。
写完这三个函数后,我们在columns中扩展出对应的属性即可。
<br /> 'department_ids' : fields.function(_get_self_department_ids, type='many2many' , relation= "hr.department", string= "部门" ),<br /> 'child_department_ids' : fields.function(_get_child_ids, type='many2many' , relation= "hr.department", string= "子部门集合" ),<br /> 'parent_department_ids' : fields.function(_get_parent_ids, type='many2many' , relation= "hr.department", string= "父部门集合" ),<br />
完整代码如下
<br />class res_users(osv.osv):<br /> _name = 'res.users'<br /> _inherit = 'res.users'<br /> def create(self, cr, uid, data, context= None):<br /> user_id = super(res_users, self).create(cr, uid, data, context=context)<br /> # add shortcut unless 'noshortcut' is True in context<br /> if not(context and context.get('noshortcut', False)):<br /> data_obj = self.pool.get('ir.model.data')<br /> try:<br /> data_id = data_obj._get_id(cr, uid, 'hr ', 'ir_ui_view_sc_employee' )<br /> view_id = data_obj.browse(cr, uid, data_id, context=context).res_id<br /> self.pool.get('ir.ui.view_sc').copy(cr, uid, view_id, default = {<br /> 'user_id': user_id}, context=context)<br /> except:<br /> # Tolerate a missing shortcut. See product/product.py for similar code.<br /> _logger.debug( 'Skipped meetings shortcut for user "%s".', data.get('name', '<new'))<br /> return user_id<br /> <br /> # 获取用户关联的部门<br /> def _get_self_department_ids(self, cr, uid, ids, field_name, arg, context=None):<br /> result = {}<br /> for user in self.browse(cr, uid, ids, context=context):<br /> if user.employee_ids:<br /> departs = []<br /> for emp in user.employee_ids:<br /> departs.append(emp.department_id)<br /> result[user.id] = departs<br /> return result<br /> <br /> # 向下递归,寻找所有子节点<br /> def _get_child_ids(self, cr, uid, ids, field_name, arg, context=None):<br /> result = {}<br /> for user in self.browse(cr, uid, ids, context=context):<br /> if user.employee_ids:<br /> departs = []<br /> for emp in user.employee_ids:<br /> sql = '''<br />WITH RECURSIVE r AS (<br />SELECT * FROM hr_department WHERE id = %d<br />union ALL<br />SELECT hr_department.* FROM hr_department, r WHERE hr_department.parent_id = r.id<br />)<br />SELECT * FROM r where r.id <> %d<br />ORDER BY id;''' % (emp.department_id.id, emp.department_id.id)<br /> cr.execute(sql)<br /> for depart in cr.fetchall():<br /> departs.append(depart)<br /> result[user.id] = departs<br /> return result<br /> <br /> # 向上递归,寻找所有父节点<br /> def _get_parent_ids(self, cr, uid, ids, field_name, arg, context=None):<br /> result = {}<br /> for user in self.browse(cr, uid, ids, context=context):<br /> if user.employee_ids:<br /> departs = []<br /> for emp in user.employee_ids:<br /> sql = '''<br />WITH RECURSIVE r AS (<br />SELECT parent_id FROM hr_department WHERE id = %d<br />union ALL<br />SELECT hr_department.parent_id FROM hr_department, r WHERE hr_department.id = r.parent_id<br />)<br />SELECT * FROM hr_department where id in (select parent_id from r)''' % (emp.department_id.id, )<br /> cr.execute(sql)<br /> for depart in cr.fetchall():<br /> departs.append(depart)<br /> result[user.id] = departs<br /> return result<br /> _columns = {<br /> 'employee_ids': fields.one2many('hr.employee', 'user_id', 'Related employees' ),<br /> 'department_ids': fields.function(_get_self_department_ids, type='many2many' , relation="hr.department", string= "部门"),<br /> 'child_department_ids': fields.function(_get_child_ids, type='many2many' , relation="hr.department", string= "子部门集合" ),<br /> 'parent_department_ids': fields.function(_get_parent_ids, type='many2many' , relation="hr.department", string= "父部门集合" ),<br /> }<br />res_users()<br />
做完这些工作后,继续对规则进行定义,现在有这样一个场景。
公司部门结构为上下三层,自己可以看到自己,经理可以看到部门内其他员工但普通员工之间不可互相看到,上级部门的员工可以看到所有下级部门的员工。
开动,在"设置-技术-安全设定-记录规则"中新建一个全局规则,名字随便取,对象选择为hr.employee,在规则定义( Domain 过滤器)文本框内写入规则:
<br />['|', '|', ('users_id', '=', user.id), ('department_id.manager_id.users_id', '=', user.id), ('department_id.id', 'in', [depart.id[0] for depart in user.child_department_ids])]<br />
我们来解读一下
('users_id', '=', user.id),这个是自己能看到自己
('department_id.manager_id.users_id', '=', user.id),这个是部门经理可以看到部门的所有
('department_id.id', 'in', [depart.id[0] for depart in user.child_department_ids]),这个是员工可以看到所属部门的所有下级部门
两个'|'表示这3个条件都是或者的关系。
这样,用户再次登录后,规则生效。
在form表单中,有些控件希望在编辑的时候显示,非编辑时不显示,如hr模块的员工表单,在非编辑模式中,姓名的title不显示,而在编辑模式中显示出来。我们可以在xml文件中给控件赋属性值,class="oe_edit_only"
而有时候需求正好相反,编辑模式下,控件不显示;而在非编辑模式下控件显示。
需要在openerp/addons/web/static/src/css/base.css文件中,添加
.openerp .oe_form_editable .oe_save_only, .openerp .oe_form_editable .oe_form_field:empty {
display: none !important;
}
然后给控件赋属性值,class="oe_save_only"。
感谢开发群的朋友的帮助,特别鸣谢“上海-codefans”同学。
最近有个需求,新员工入职后,还不能立刻生成工号(流水号自增长从B-001,B-002,...B-XXXXX)。
因此必须在页面上设置一个button,符合条件后,点击生成工号,对于已有工号的员工,则需要隐藏此button。
翻阅文档和咨询过群里的朋友后,先开始使用的是states属性,但是不管给states属性赋什么值都会报错(state没有这个属性)。后来在源代码里遍寻所有的button控件,看看其他第三方控件是如何设置button属性的,发现用attrs属性的invisible可以实现控件的隐藏状态。
根据需求,我需要字段work_id为空的时候显示button,有值的时候隐藏button。因此可以这样设置
<button ....... attrs="{'invisible':[('work_id','!=', False)]}" />
希望能给大家帮助。