00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 from PyQt4.QtCore import *
00031 from PyQt4.QtGui import *
00032 from PyQt4.uic import *
00033
00034 from Koo import Rpc
00035 from Koo.Common import Api
00036 from Koo.Common import Common
00037 from Koo.Common import Icons
00038
00039 from Koo.Screen.Screen import Screen
00040 from Koo.Model.Group import RecordGroup
00041
00042
00043 class WizardPage(QDialog):
00044 def __init__(self, arch, fields, state, name, datas, parent=None):
00045 QDialog.__init__(self, parent)
00046 self.setModal( True )
00047 buttons = []
00048 self.datas = datas
00049 self.buttonsLayout = QHBoxLayout()
00050 self.buttonsLayout.addStretch()
00051 for x in state:
00052 but = QPushButton( Common.normalizeLabel( x[1] ) )
00053
00054 but.setObjectName(x[0])
00055
00056 if len(x) >= 3:
00057 but.setIcon( Icons.kdeIcon( x[2] ) )
00058
00059 if len(x) >= 4 and x[3]:
00060 but.setDefault(True)
00061 self.buttonsLayout.addWidget(but)
00062 self.connect( but, SIGNAL('clicked()'), self.slotPush )
00063
00064 val = {}
00065 for f in fields:
00066 if 'value' in fields[f]:
00067 val[f] = fields[f]['value']
00068
00069 self.group = RecordGroup( 'wizard.'+name )
00070
00071
00072 self.group.setDomainForEmptyGroup()
00073 self.screen = Screen( self )
00074 self.screen.setRecordGroup( self.group )
00075 self.screen.new(default=False)
00076 self.screen.addView(arch, fields, display=True)
00077
00078 self.screen.currentRecord().set(val)
00079
00080 self.screen.currentRecord().set(self.datas)
00081 self.screen.display()
00082
00083
00084 size = self.screen.sizeHint()
00085 self.setMinimumSize( size.width()+100, min(600, size.height()+25) )
00086 size = QApplication.desktop().availableGeometry( self ).size()
00087 size -= QSize( 50, 50 )
00088 self.setMaximumSize( size )
00089
00090 self.layout = QVBoxLayout( self )
00091 self.layout.addWidget( self.screen )
00092 self.layout.addLayout( self.buttonsLayout )
00093 self.setWindowTitle(self.screen.currentView().title)
00094
00095 def slotPush( self ):
00096 o = self.sender()
00097 self.screen.currentView().store()
00098
00099 button = str( o.objectName() )
00100 if button != 'end' and not self.screen.currentRecord().validate():
00101 self.screen.display()
00102 return
00103 self.datas.update(self.screen.get())
00104 self.result = (button, self.datas)
00105 self.accept()
00106
00107
00108 class Wizard( QObject ):
00109 def __init__(self, action, datas, state='init', parent=None, context=None):
00110 QObject.__init__(self, parent)
00111 if context is None:
00112 context = {}
00113 if not 'form' in datas:
00114 datas['form'] = {}
00115 self.action = action
00116 self.datas = datas
00117 self.state = state
00118 self.context = context
00119 self.wizardId = Rpc.session.execute('/wizard', 'create', self.action)
00120 self.finished = False
00121 self.progress = Common.ProgressDialog( QApplication.activeWindow() )
00122 self.thread = None
00123
00124 def step(self):
00125 if self.state == 'end':
00126 self.finished = True
00127 return
00128 self.progress.start()
00129 QApplication.setOverrideCursor( Qt.WaitCursor )
00130 ctx = self.context.copy()
00131 ctx.update(Rpc.session.context)
00132 self.thread = Rpc.session.executeAsync( self.finishedStep, '/wizard', 'execute', self.wizardId, self.datas, self.state, ctx )
00133
00134 def finishedStep(self, res, exception):
00135 self.progress.stop()
00136 QApplication.restoreOverrideCursor()
00137
00138
00139
00140
00141 if exception or not res:
00142 self.state = 'end'
00143 self.step()
00144 return
00145
00146 if 'datas' in res:
00147 self.datas['form'].update( res['datas'] )
00148 if res['type']=='form':
00149 dialog = WizardPage(res['arch'], res['fields'], res['state'], self.action, self.datas['form'])
00150
00151 if dialog.exec_() == QDialog.Rejected:
00152 self.finished = True
00153 return
00154 (self.state, new_data) = dialog.result
00155
00156 for d in new_data.keys():
00157 if new_data[d]==None:
00158 del new_data[d]
00159 self.datas['form'].update(new_data)
00160 del new_data
00161 elif res['type']=='action':
00162 Api.instance.executeAction(res['action'],self.datas)
00163 self.state = res['state']
00164 elif res['type']=='print':
00165 self.datas['report_id'] = res.get('report_id', False)
00166 if res.get('get_id_from_action', False):
00167 backup_ids = self.datas['ids']
00168 self.datas['ids'] = self.datas['form']['ids']
00169 win = Api.instance.executeReport(res['report'], self.datas)
00170 self.datas['ids'] = backup_ids
00171 else:
00172 win = Api.instance.executeReport(res['report'], self.datas)
00173 self.state = res['state']
00174 elif res['type']=='state':
00175 self.state = res['state']
00176 self.step()
00177
00178
00179 def execute(action, datas, state='init', parent=None, context=None):
00180 if context is None:
00181 context = {}
00182 w = Wizard(action, datas, state, parent, context)
00183 w.step()
00184 while not w.finished:
00185 QCoreApplication.processEvents(QEventLoop.WaitForMoreEvents)
00186