Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

如何获取客户端登录的IP地址(已解决)



  • 12月11日更新:
    修改http.py文件
    [code]
            self.context = self.params.pop('context', {})
            #-----------------------------------------------------------------
            # add client ip to context
            if type(self.context) == dict:
                    self.context['remote_addr'] = self.httprequest.remote_addr
            # ----------------------------------------------------------------
            self.debug = self.params.pop('debug', False) is not False
    [/code]

    建立一个controller.py, 如下:
    [code]
    import openerp

    class GetIP(openerp.addons.web.http.Controller):
        _cp_path = "/my_module"

        @openerp.addons.web.http.jsonrequest
        def get_ip(self, req, model):
            ip_address = req.context.get('remote_addr')
            return ip_address
    [/code]

    module的py文件中增加一个函数:
    [code]
    def update_ip(self, cr, uid, ip_address, context=None):
            employee_ids = self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)
            if ip_address:
                cr.execute("""select max(id) as id from hr_attendance<br />                                    where  action in ('sign_in', 'sign_out') and employee_id=%s""" % (employee_ids[0]))
                result = cr.fetchall()
                for res in result:
                    aid = res[0]
                    self.write(cr, uid, [aid], {'ip_address': ip_address}, context=context)
            return ip_address
    [/code]

    module的js文件中,如下调用:
    [code]
    instance.session.rpc('/my_module/get_ip', {model:'my_module'}).then(function (result) {
                                    my_module.call('update_ip', [result]).then(function(){});});
    [/code]

    问题虽然解决了的,但是感觉有点麻烦,请问以上的方法是否可以简化呢?谢谢!

    [attachimg=1]



  • 12月11日更新:
    修改http.py文件
    [code]
            self.context = self.params.pop('context', {})
            #-----------------------------------------------------------------
            # add client ip to context
            if type(self.context) == dict:
                    self.context['remote_addr'] = self.httprequest.remote_addr
            # ----------------------------------------------------------------
            self.debug = self.params.pop('debug', False) is not False
    [/code]

    建立一个controller.py, 如下:
    [code]
    import openerp

    class GetIP(openerp.addons.web.http.Controller):
        _cp_path = "/my_module"

        @openerp.addons.web.http.jsonrequest
        def get_ip(self, req, model):
            ip_address = req.context.get('remote_addr')
            return ip_address
    [/code]

    module的py文件中增加一个函数:
    [code]
    def update_ip(self, cr, uid, ip_address, context=None):
            employee_ids = self.pool.get('hr.employee').search(cr, uid, [('user_id', '=', uid)], context=context)
            if ip_address:
                cr.execute("""select max(id) as id from hr_attendance<br />                                    where  action in ('sign_in', 'sign_out') and employee_id=%s""" % (employee_ids[0]))
                result = cr.fetchall()
                for res in result:
                    aid = res[0]
                    self.write(cr, uid, [aid], {'ip_address': ip_address}, context=context)
            return ip_address
    [/code]

    module的js文件中,如下调用:
    [code]
    instance.session.rpc('/my_module/get_ip', {model:'my_module'}).then(function (result) {
                                    my_module.call('update_ip', [result]).then(function(){});});
    [/code]

    问题虽然解决了的,但是感觉有点麻烦,请问以上的方法是否可以简化呢?谢谢!

    [attachimg=1]



  • 代码应该没有啥大问题(可能其他部分的代码不正确, 是否源自 openerpweb.Controller ?). 可能你请求的方式不对.
    你可以断点测试..



  • 调用 get_ip_address 时,你的 req 哪里来的 ?



  • 这个是我一直纠结的问题,即如何获得req,现在调用是,我也使用@openerpweb.jsonrequest来获得req。不知道这样做是否正确。



  • 我目前解决了这个问题的,但是感觉有点麻烦,请大家帮忙看看是否可以简化,谢谢



  • 很棒。正打算写过登陆日志加验证码。
    要想结构上更漂亮的话, 继承BaseModel,给每个类都自动加上ip字段,然后通过HttpReques ,context传入的ip地址,override create,write方法,自动写入 ip地址,类似writeid之类的系统字段。
    这样所有表的日志的创建和写入就都有了,签入表也自动有了。



  • 看了orm.py代码,没法通过继承简单漂亮的搞定了。里面代码写的比较乱。 :'(
    明明定义了:
    [code]
    # Definition of log access columns, automatically added to models if
    # self._log_access is True
    LOG_ACCESS_COLUMNS = {
        'create_uid': 'INTEGER REFERENCES res_users ON DELETE SET NULL',
        'create_date': 'TIMESTAMP',
        'write_uid': 'INTEGER REFERENCES res_users ON DELETE SET NULL',
        'write_date': 'TIMESTAMP'
    [/code]
    但在添删改的时候,仍然:
    [code] if self._log_access:
                upd0.append('write_uid=%s')
                upd0.append("write_date=(now() at time zone 'UTC')")
                upd1.append(user)

            if len(upd0):
                self.check_access_rule(cr, user, ids, 'write', context=context)
                for sub_ids in cr.split_for_in_conditions(ids):
                    cr.execute('update ' + self.table + ' set ' + ','.join(upd0) + ' ' <br />                          'where id IN %s', upd1 + [sub_ids])
                    if cr.rowcount != len(sub_ids):
                        raise except_orm(
    ('AccessError'),
                                        _('One of the records you are trying to modify has already been deleted (Document type: %s).') % self._description)[/code]

    [quote author=Tiger link=topic=8093.msg25803#msg25803 date=1386772631]
    很棒。正打算写过登陆日志加验证码。
    要想结构上更漂亮的话, 继承BaseModel,给每个类都自动加上ip字段,然后通过HttpReques ,context传入的ip地址,override create,write方法,自动写入 ip地址,类似writeid之类的系统字段。
    这样所有表的日志的创建和写入就都有了,签入表也自动有了。
    [/quote]



  • [quote author=Tiger link=topic=8093.msg25803#msg25803 date=1386772631]
    很棒。正打算写过登陆日志加验证码。
    要想结构上更漂亮的话, 继承BaseModel,给每个类都自动加上ip字段,然后通过HttpReques ,context传入的ip地址,override create,write方法,自动写入 ip地址,类似writeid之类的系统字段。
    这样所有表的日志的创建和写入就都有了,签入表也自动有了。
    [/quote]
    这个想法好,不过工程量似乎大了点~~呵呵,有时间研究一下。


  • 管理员

    很好的分享


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待