跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 关于图片

关于图片

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
10 帖子 5 发布者 8.4k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 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
                    • 版块
                    • 标签
                    • 热门
                    • 用户
                    • 群组