Hi there, i'm new to Python, and i don't understand why following exception occurs in this code:
class NETRPCGateway(RPCGateway): """NETRPC Implementation. """ def __init__(self, host, port): self.host = host self.port = port super(NETRPCGateway, self).__init__(self.host, self.port, 'socket') def listdb(self): sock = tiny_socket.mysocket() try: sock.connect(self.host, self.port) sock.mysend(('db', 'list')) res = sock.myreceive() sock.disconnect() return res except Exception, e: return -1 def login(self, db, user, password): sock = tiny_socket.mysocket() self.db = db self.password = password self.user = user try: sock.connect(self.host, self.port) sock.mysend(('common', 'login', db, user, password)) res = sock.myreceive() sock.disconnect() except Exception, e: return -1 return res def _execute(self, obj, method, args=(), noauth=False): sock = tiny_socket.mysocket() try: sock.connect(self.host, self.port) if not noauth: print "in noauth" args = (self.db, self.uid, self.password) + args sock.mysend((obj, method) + args) res = sock.myreceive() sock.disconnect() return res except xmlrpclib.Fault, err: raise RPCException(err.faultCode, err.faultString) except tiny_socket.Myexception, err: raise RPCException(err.faultCode, err.faultString) def execute(self, obj, method, *args): return self._execute(obj, method, args) def execute_noauth(self, obj, method, *args): return self._execute(obj, method, args, noauth=True) def execute_db(self, method, *args): sock = tiny_socket.mysocket() sock.connect(host, port) sock.mysend(('db', method) + args) res = sock.myreceive() sock.disconnect() return res class RPCSession(object): """This is a wrapper class that provides Pythonic way to handle RPC (remote procedure call). It also provides a way to store session data into different kind of storage. """ __slots__ = ['host', 'port', 'protocol', 'storage', 'gateway'] def __init__(self, host, port, protocol='socket', storage={}): """Create new instance of RPCSession. @param host: the openerp-server host @params port: the openerp-server port @params protocol: the openerp-server protocol @param storage: a dict like storage that will be used to store session data """ self.host = host self.port = port self.protocol = protocol self.storage = storage print "RPCSession ", host, port,protocol if protocol == 'http': self.gateway = XMLRPCGateway(host, port, 'http') elif protocol == 'https': self.gateway = XMLRPCGateway(host, port, 'https') elif protocol == 'socket': self.gateway = NETRPCGateway(host, port) else: raise common.message(_("Connection refused!")) def __getattr__(self, name): try: return super(RPCSession, self).__getattribute__(name) except: pass return self.storage.get(name) def __setattr__(self, name, value): if name in self.__slots__: super(RPCSession, self).__setattr__(name, value) else: self.storage[name] = value def __getitem__(self, name): return self.storage.get(name) def __setitem__(self, name, value): self.storage[name] = value def __delitem__(self, name): try: del self.storage[name] except: pass def get(self, name, default=None): return self.storage.get(name, default) def get_url(self): return self.gateway.get_url() def listdb(self): return self.gateway.listdb() def login(self, db, user, password): if password is None: return -1 uid = self.gateway.login(db, user or '', password or '') if uid <= 0: return -1 self.uid = uid self.db = db self.password = password self.open = True #self.gateway.db = db #self.gateway.uid = uid #self.gateway.password = password # read the full name of the user self.user_name = self.execute('object', 'execute', 'res.users', 'read', [uid], ['name'])[0]['name'] # set the context self.context_reload() return uid def logout(self): try: self.storage.clear() except Exception, e: pass def is_logged(self): return self.uid and self.open def getmac(self): s = socket.socket(socket.AF_PACKET,socket.SOCK_RAW) s.bind(("eth0",9999)) socObj=s.getsockname() mac = socObj[-1] mac_str = ":".join(["%02x" % ord(x) for x in mac]) print "HW : %s"%mac_str return mac_str def context_reload(self): """Reload the context for the current user """ self.context = {'client': 'pos','mac':self.getmac()} self.timezone = 'utc' # self.uid context = self.execute('object', 'execute', 'res.users', 'context_get') self.context.update(context or {}) if self.context.get('tz', False): self.timezone = self.execute('common', 'timezone_get') try: import pytz except: raise common.warning(_('You select a timezone but OpenERP could not find pytz library!\nThe timezone functionality will be disable.')) # set locale in session self.locale = self.context.get('lang') def __convert(self, result): if isinstance(result, basestring): # try to convert into unicode string try: return ustr(result) except Exception, e: return result elif isinstance(result, list): return [self.__convert(val) for val in result] elif isinstance(result, tuple): return tuple([self.__convert(val) for val in result]) elif isinstance(result, dict): newres = {} for key, val in result.items(): newres[key] = self.__convert(val) return newres else: return result def execute(self, obj, method, *args): print "in execute: ", obj, method, args if not self.is_logged(): raise common.warning('Not logged...', 'Authorization Error!') try: #print "TERP-CALLING:", obj, method, args result = self.gateway.execute(obj, method, *args) #print "TERP-RESULT:", result return self.__convert(result) except socket.error, (e1, e2): raise common.message(_(u'Холболт салгагдлаа!')) except RPCException, err: if err.type in ('warning', 'UserError'): raise common.warning(err.data) else: raise common.error(u'Програмын алдаа!', err.backtrace) except Exception, e: raise common.error(u'Програмын алдаа!', str(e)) def execute_noauth(self, obj, method, *args): return self.gateway.execute_noauth(obj, method, *args) def execute_db(self, method, *args): return self.gateway.execute_db(method, *args) my script is: import session session = session.RPCSession("localhost", 8070) res = session.listdb() print "listdb: ",res uid = session.login("openerp", "admin", "admin") print uid So i instantiate a RPCSession object, i call listdb() on it without problem. The when i call the login() method, i get the AttributeError exception: RPCSession localhost 8070 socket listdb: ['openerp'] Traceback (most recent call last): File "test.py", line 6, in <module> uid = session.login("openerp", "admin", "admin") File "/home/dolgion/workspace/erpj/current/POS/src/session.py", line 337, in login uid = self.gateway.login(db, user or '', password or '') File "/home/dolgion/workspace/erpj/current/POS/src/session.py", line 214, in login self.db = db AttributeError: can't set attribute the NETRPCGateway attribute self.db can't be set? why not? i've tried changing the RPCSession login function to set the variable like this as well: self.gateway.db = db which doesn't work either, same exception..... any suggestions? -- http://mail.python.org/mailman/listinfo/python-list