65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
from trytond.netsvc import Service, LocalService
|
|
from trytond import security
|
|
from threading import Semaphore
|
|
from random import randint
|
|
from sys import maxint
|
|
|
|
|
|
class Wizard(Service):
|
|
|
|
def __init__(self, name='wizard'):
|
|
Service.__init__(self, name)
|
|
Service.join_group(self, 'web-services')
|
|
Service.export_method(self, self.execute)
|
|
Service.export_method(self, self.create)
|
|
Service.export_method(self, self.delete)
|
|
self.wiz_datas = {}
|
|
self.wiz_name = {}
|
|
self.wiz_uid = {}
|
|
self._semaphore = Semaphore()
|
|
|
|
def _execute(self, database, user, wiz_id, datas, action, context):
|
|
self.wiz_datas[wiz_id].update(datas)
|
|
wiz = LocalService('wizard_proxy')
|
|
return wiz.execute(database, user, self.wiz_name[wiz_id],
|
|
self.wiz_datas[wiz_id], action, context)
|
|
|
|
def create(self, database, user, passwd, wiz_name, datas=None):
|
|
security.check(database, user, passwd)
|
|
self._semaphore.acquire()
|
|
wiz_id = 0
|
|
while True:
|
|
wiz_id = randint(0, maxint)
|
|
if wiz_id not in self.wiz_name:
|
|
break
|
|
self.wiz_datas[wiz_id] = {}
|
|
self.wiz_name[wiz_id] = wiz_name
|
|
self.wiz_uid[wiz_id] = user
|
|
self._semaphore.release()
|
|
return wiz_id
|
|
|
|
def execute(self, database, user, passwd, wiz_id, datas, *args):
|
|
security.check(database, user, passwd)
|
|
if wiz_id in self.wiz_uid:
|
|
if self.wiz_uid[wiz_id] == user:
|
|
return self._execute(database, user, wiz_id, datas, *args)
|
|
else:
|
|
raise Exception, 'AccessDenied'
|
|
else:
|
|
raise Exception, 'WizardNotFound'
|
|
|
|
def delete(self, database, user, passwd, wiz_id):
|
|
security.check(database, user, passwd)
|
|
if wiz_id in self.wiz_uid:
|
|
if self.wiz_uid[wiz_id] == user:
|
|
self._semaphore.acquire()
|
|
del self.wiz_datas[wiz_id]
|
|
del self.wiz_name[wiz_id]
|
|
del self.wiz_uid[wiz_id]
|
|
self._semaphore.release()
|
|
return wiz_id
|
|
else:
|
|
raise Exception, 'AccessDenied'
|
|
else:
|
|
raise Exception, 'WizardNotFound'
|