Files
xen/tools/python/xen/sv/Wizard.py
T
2005-09-17 10:33:50 +01:00

246 lines
8.9 KiB
Python
Executable File

from xen.sv.util import *
from xen.sv.HTMLBase import HTMLBase
from xen.sv.GenTabbed import GenTabbed, ActionTab
from xen.xend import sxp
import re
DEBUG = 0
class Wizard( GenTabbed ):
def __init__( self, urlWriter, title, sheets ):
self.title = title
self.sheets = sheets
self.urlWriter = urlWriter
self.offset = 0
GenTabbed.__init__( self, title, urlWriter, map( lambda x: x.title, sheets ), sheets )
def write_MENU( self, request ):
request.write( "<p class='small'><a href='%s'>%s</a></p>" % (self.urlWriter( '' ), self.title) )
def write_BODY( self, request ):
GenTabbed.write_BODY( self, request )
actionTab = ActionTab( { ("tab", str(self.tab-1)) : "< Prev", ("tab", str(self.tab+1)) : "Next >", "finish" : "Finish" } )
actionTab.write_BODY( request )
def perform( self, request ):
try:
action = getVar( 'op', request, 0 )
if action == "tab":
self.tab = int( getVar( 'args', request ) )
oldtab = int( getVar( 'tab', request ) )
if not self.tabObjects[ oldtab ]( self.urlWriter ).validate( request ):
self.tab = oldtab
else:
self.tab = int( getVar( 'tab', request, 0 ) )
self.tabObjects[ self.tab ]( self.urlWriter ).perform( request )
getattr( self, "op_" + getVar( "op", request ), None )( request )
except:
pass
def op_finish( self, request ):
pass
class Sheet( HTMLBase ):
def __init__( self, urlWriter, title, location ):
HTMLBase.__init__( self )
self.urlWriter = urlWriter
self.fields = []
self.title = title
self.location = location
self.passback = None
def parseForm( self, request ):
do_not_parse = [ 'mod', 'op', 'passback' ]
passed_back = request.args
temp_passback = passed_back.get( "passback" )
if temp_passback is not None and len( temp_passback ) > 0:
temp_passback = temp_passback[ len( temp_passback )-1 ]
else:
temp_passback = "( )"
last_passback = ssxp2hash( string2sxp( temp_passback ) ) #use special function - will work with no head on sxp
if DEBUG: print last_passback
for (key, value) in passed_back.items():
if key not in do_not_parse:
last_passback[ key ] = value[ len( value ) - 1 ]
self.passback = sxp2string( hash2sxp( last_passback ) ) #store the sxp
if DEBUG: print self.passback
def write_BODY( self, request ):
if not self.passback: self.parseForm( request )
request.write( "<p>%s</p>" % self.title )
previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the hash for quick reference
request.write( "<table width='100%' cellpadding='0' cellspacing='1' border='0'>" )
for (field, control) in self.fields:
control.write_Control( request, previous_values.get( field ) )
if previous_values.get( field ) is not None and not control.validate( previous_values.get( field ) ):
control.write_Help( request )
request.write( "</table>" )
request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback )
#request.write( "<input type='hidden' name='visited-sheet%s' value='True'></p>" % self.location )
def addControl( self, control ):
self.fields.append( [ control.getName(), control ] )
def validate( self, request ):
if not self.passback: self.parseForm( request )
check = True
previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the map for quick reference
if DEBUG: print previous_values
for (field, control) in self.fields:
if not control.validate( previous_values.get( field ) ):
check = False
if DEBUG: print "> %s = %s" % (field, previous_values.get( field ))
return check
class SheetControl( HTMLBase ):
def __init__( self, reg_exp = ".*" ):
HTMLBase.__init__( self )
self.name = ""
self.reg_exp = reg_exp
def write_Control( self, request, persistedValue ):
request.write( "<tr colspan='2'><td>%s</td></tr>" % persistedValue )
def write_Help( self, request ):
request.write( "<tr><td align='right' colspan='2'><p class='small'>Text must match pattern:" )
request.write( " %s</p></td></tr>" % self.reg_exp )
def validate( self, persistedValue ):
if persistedValue is None:
persistedValue = ""
return not re.compile( self.reg_exp ).match( persistedValue ) is None
def getName( self ):
return self.name
def setName( self, name ):
self.name = name
class InputControl( SheetControl ):
def __init__( self, name, defaultValue, humanText, reg_exp = ".*", help_text = "You must enter the appropriate details in this field." ):
SheetControl.__init__( self, reg_exp )
self.setName( name )
self.defaultValue = defaultValue
self.humanText = humanText
self.help_text = help_text
def write_Control( self, request, persistedValue ):
if persistedValue is None:
persistedValue = self.defaultValue
request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'><input size='40'type='text' name='%s' value=\"%s\"></td></tr>" % (self.humanText, self.getName(), persistedValue) )
def write_Help( self, request ):
request.write( "<tr><td align='right' colspan='2'><p class='small'>" )
request.write( " %s</p></td></tr>" % self.help_text )
class TextControl( SheetControl ):
def __init__( self, text ):
SheetControl.__init__( self )
self.text = text
def write_Control( self, request, persistedValue ):
request.write( "<tr><td colspan='2'><p>%s</p></td></tr>" % self.text )
class SmallTextControl( SheetControl ):
def __init__( self, text ):
SheetControl.__init__( self )
self.text = text
def write_Control( self, request, persistedValue ):
request.write( "<tr><td colspan='2'><p class='small'>%s</p></tr></td>" % self.text )
class ListControl( SheetControl ):
def __init__( self, name, options, humanText ):
SheetControl.__init__( self )
self.setName( name )
self.options = options
self.humanText = humanText
def write_Control( self, request, persistedValue ):
request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'>" % self.humanText )
request.write( "<select name='%s'>" % self.getName() )
for (value, text) in self.options:
if value == persistedValue:
request.write( "<option value='%s' selected>%s\n" % (value, text) )
else:
request.write( "<option value='%s'>%s\n" % (value, text) )
request.write( "</select></td></tr>" )
def validate( self, persistedValue ):
for (value, text) in self.options:
if value == persistedValue:
return True
return False
class FileControl( InputControl ):
def __init__( self, name, defaultValue, humanText, reg_exp = ".*", help_text = "You must enter the appropriate details in this field." ):
InputControl.__init__( self, name, defaultValue, humanText )
def validate( self, persistedValue ):
if persistedValue is None: return False
try:
open( persistedValue )
return True
except IOError, TypeError:
return False
def write_Help( self, request ):
request.write( "<tr><td colspan='2' align='right'><p class='small'>File does not exist: you must enter a valid, absolute file path.</p></td></tr>" )
class TickControl( SheetControl ):
def __init__( self, name, defaultValue, humanText ):
SheetControl.__init__( self )
self.setName( name )
self.defaultValue = defaultValue
self.humanText = humanText
def write_Control( self, request, persistedValue ):
request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'>" % self.humanText )
#request.write( str( persistedValue ) )
#TODO: Theres a problem with this: it doesn't persist an untick, because the browsers don't pass it back. Need a fix...
if persistedValue == 'True':
request.write( "<input type='checkbox' name='%s' value='True' checked>" % self.getName() )
else:
request.write( "<input type='checkbox' name='%s' value='True'>" % self.getName() )
request.write( "</td></tr>" )