• 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

关于图片

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
10 帖子 5 发布者 7613 浏览
    • 从旧到新
    • 从新到旧
    • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • S 离线
    S 离线
    simon
    写于 最后由 编辑
    #1

    Vincent 对于图片自定义存储的东西.我写了个demo

    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:56:15
    1 首先在对象里还是要定义图片字段(至于不定义的 暂时没有去研究)
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:56:17
    'image': fields.binary('Image'),
    }
    Jack(104144648) 17:56:21
    论坛?

    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:56:44
    2 定义 creat 方法,重写对象的 create 方法.
    def create(self, cr, uid, vals, context={}):
    tmpImage = ''
    if vals['image']:
    tmpImage = vals['image']
    del vals['image']

    	employee_id = super(cbgd_hr_employee, self).create(cr, uid, vals, context)
    
    	if not (tmpImage == ''):
    		fp = open('e:\tmppic\employee_%010d.jpg' % employee_id, 'wb')
    		fp.write(base64.decodestring(tmpImage))
    		fp.close()
    	return employee_id
    

    Jack(104144648) 17:57:30
    这个还好理解,我不理解是怎么打开一个文件,在界面上怎么定义

    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:58:21
    这段代码很容易读懂.
    前面把 "保存"按钮 发过来的数据中的 Image 数据 保存到一个临时变量中 tmpImage

    然后 调用父方法,创建 对象数据.

    得到创建对象的ID后.
    根据 ID 生成一个文件名. 并保存到指定的地点. 我暂时用的文件存储. 你可以写到其它的地方.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:58:29
    然后返回 生成对象的ID
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:58:34
    这是保存的操作.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 17:59:01
    3 定义 read 方法,重写对象的 read 方法.
    def read(self, cr, uid, ids, fields=None, context={}):
    result = super(cbgd_hr_employee, self).read(cr, uid, ids, fields, context)
    if not isinstance(result,list):
    result=[result]

    	for res in result:
    		try:
    			fp = open('e:\tmppic\employee_%010d.jpg' % res['id'], 'rb')
    		except IOError,ex:
    			res['image'] = False
    			continue
    		tmpContent = base64.encodestring(fp.read())
    		res['image'] = tmpContent
    
    	return result
    

    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:00:33
    这段代码也不难理解.

    1 调用原 read 方法,取出保存在数据库中的数据.

    然后 在返回的数据中 加入 image 字段的内容. 只是注意, 对于二进制数据.都需要 base64 进行编码,解码.

    最后返回修整后的 result 数据.
    Jack(104144648) 18:00:59
    对象的方法。。
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:01:18
    To Jack 关于图片数据 在客户端( Client, webClient) 中如何显示. 这个不属于模块的内容的.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:01:33
    服务器端只管返回字段的 base64 数据即可.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:02:07
    嗯. 象这种个性化的字段调整, 就是需要重写对象的方法定义.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:03:15
    对于图片的修改部分.也差不多.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:03:34
    就是重写对象的 write 方法.
    Jack(104144648) 18:04:36
    不要修改了这是不需要的,要改也不用openerp干,除非加个什么商标什么的
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:05:26
    不是.
    shelly→水<[email:2almbx3o][email protected][/email:2almbx3o]> 18:05:48
    对于产品图片.这些, 有时候 使用文件系统比存到数据库中更方便.
    Jack(104144648) 18:06:20
    现在还有一个问题这么在界面定义一个打开文件的操作

    1 条回复 最后回复
    0
  • P 离线
    P 离线
    popkar77
    写于 最后由 编辑
    #2

    支持!!:D

    1 条回复 最后回复
    0
  • mrshellyM 离线
    mrshellyM 离线
    mrshelly
    写于 最后由 编辑
    #3

    对于不在数据库中生成垃圾字段的做法.

    1 在对象 fields 定义时.字段使用 function 类型 字段,并指明字段的存取 function 名.
    例:
    'datas': fields.function(_data_get,method=True,fnct_inv=_data_set,string='File Content',type="binary"),
    'datas_fname': fields.char('File Name', size=100, help='照片文件名'),

    指定了 _data_get 为获取该字段的function _data_set 为保存该字段的 function

    datas_fname 用于临时保存 文件名.

    1 条回复 最后回复
    0
  • mrshellyM 离线
    mrshellyM 离线
    mrshelly
    写于 最后由 编辑
    #4

    2 定义 _data_get 以及 _data_set 方法:

    def _data_get(self, cr, uid, ids, name, arg, context):
    	result = {}
    	for id in map(str,ids):
    		try:
    			value = file('e:\tmppic\employee_%010d.jpg' % int(id), 'rb').read()
    			result[int(id)] = base64.encodestring(value)
    		except:
    			result[int(id)]=''
    
    	return result
    
    def _data_set(self, cr, obj, id, name, value, uid=None, context={}):
    	if not value:
    		return True
    	try:
    		fp = file('e:\tmppic\employee_%010d.jpg' % int(id),'wb')
    		v = base64.decodestring(value)
    		fp.write(v)
    		fp.close()
    		return True
    	except Exception,e :
    		raise except_orm(_('Error!'), str(e))
    

    两段代码都很简单就不过多写注释了.

    代码基本上参阅了 document 模块的相关部分.

    1 条回复 最后回复
    0
  • O 离线
    O 离线
    oldrev
    写于 最后由 编辑
    #5

    搞不懂, attachment 是可以选择数据库还是文件的啊

    1 条回复 最后回复
    0
  • P 离线
    P 离线
    popkar77
    写于 最后由 编辑
    #6

    我按照这里写了一个一样的模块,发生了错误[code]
    Environment Information :
    System : Windows-XP-5.1.2600-SP2
    OS Name : nt
    Operating System Release : XP
    Operating System Version : 5.1.2600
    Operating System Architecture : 32bit
    Operating System Locale : zh_CN.cp936
    Python Version : 2.5.2
    OpenERP-Client Version : 5.0.6
    Last revision No. & ID :Bazaar Package not Found !Traceback (most recent call last):
    File "netsvc.pyo", line 244, in dispatch
    File "netsvc.pyo", line 73, in call
    File "serviceweb_services.pyo", line 583, in execute
    File "osvosv.pyo", line 59, in wrapper
    File "osvosv.pyo", line 118, in execute
    File "osvosv.pyo", line 110, in execute_cr
    File "osvorm.pyo", line 2084, in read
    File "osvorm.pyo", line 2195, in _read_flat
    File "osvfields.pyo", line 663, in get
    AttributeError: 'str' object has no attribute 'items'
    [/code]我也是使用了function的fields,
    写了_data_get,_data_set方法

    经过Mrshelly指导,已解决,原来是自己的return不是返回一个数组

    [[i] 本帖最后由 popkar77 于 2009-10-30 16:11 编辑 [/i]]

    1 条回复 最后回复
    0
  • V 离线
    V 离线
    vincentmrsf
    写于 最后由 编辑
    #7

    终于搞掂了这个问题。谢谢Mrshelly的帮助

    [[i] 本帖最后由 vincent@mrsf 于 2009-11-4 11:29 编辑 [/i]]

    1 条回复 最后回复
    0
  • V 离线
    V 离线
    vincentmrsf
    写于 最后由 编辑
    #8

    扩展了一下,如果想要显示网络图片
    只需要修改一下 _data_get 函数,
    先导入 urllib2包

    获取图片代码

                req = urllib2.Request('http://www.jpeg.org.cn/photo/2006/1111/smsj/t/smsj-001.jpg') #图片地址,暂时只测试了jpg格式的图片
                response = urllib2.urlopen(req) 
                value = response.read()
                result[int(id)]= base64.encodestring(value)
    

    result就是经过base64加密了的图片数据

    1 条回复 最后回复
    0
  • mrshellyM 离线
    mrshellyM 离线
    mrshelly
    写于 最后由 编辑
    #9

    呵呵.

    如果要 _data_set 哩...
    看来你要使用 urllib 进行远程图片上传了.

    如果你的 WEB Server 支持 webdav 还好...

    1 条回复 最后回复
    0

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。