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