#---------------------------------------------------------------------------- # Name: UICommon.py # Purpose: Shared UI stuff # # Author: Matt Fryer, Morgan Hua # # Created: 3/10/05 # CVS-ID: $Id$ # Copyright: (c) 2005-2006 ActiveGrid, Inc. # License: wxWindows License #---------------------------------------------------------------------------- import os import os.path import wx import string import ProjectEditor import activegrid.util.appdirs as appdirs import activegrid.util.fileutils as fileutils import activegrid.util.strutils as strutils import activegrid.util.sysutils as sysutils import activegrid.util.xmlutils as xmlutils _ = wx.GetTranslation def CreateDirectoryControl( parent, fileLabel=_("File Name:"), dirLabel=_("Directory:"), fileExtension="*", startingName="", startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False, returnAll=False, useDirDialog=False): if not choiceDirs: choiceDirs = [] projectDirs = [] if appDirDefaultStartDir: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT) else: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY) if appDirectory: choiceDirs.append(appDirectory) if appDirDefaultStartDir and not startingDirectory: startingDirectory = appDirectory projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: curProjectDoc = projectService.GetCurrentProject() if curProjectDoc: homeDir = curProjectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in choiceDirs): choiceDirs.append(homeDir) if not startingDirectory: startingDirectory = homeDir for projectDoc in projectService.GetOpenProjects(): if projectDoc == curProjectDoc: continue homeDir = projectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in projectDirs): projectDirs.append(homeDir) projectDirs.sort(CaseInsensitiveCompare) for projectDir in projectDirs: if projectDir not in choiceDirs: choiceDirs.append(projectDir) if startingDirectory and (startingDirectory not in choiceDirs): choiceDirs.insert(0, startingDirectory) if os.getcwd() not in choiceDirs: choiceDirs.append(os.getcwd()) if appdirs.getSystemDir() not in choiceDirs: choiceDirs.append(appdirs.getSystemDir()) if not startingDirectory: startingDirectory = os.getcwd() nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1)) nameLabelText = wx.StaticText(parent, -1, fileLabel) dirLabelText = wx.StaticText(parent, -1, dirLabel) dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs) dirControl.SetToolTipString(startingDirectory) button = wx.Button(parent, -1, _("Browse...")) allControls = [nameControl, nameLabelText, dirLabelText, dirControl, button] def OnFindDirClick(event): name = "" nameCtrlValue = nameControl.GetValue() if nameCtrlValue: root, ext = os.path.splitext( nameCtrlValue ) if ext == '.' + fileExtension: name = nameCtrlValue else: name = _("%s.%s") % (nameCtrlValue, fileExtension) if not useDirDialog: dlg = wx.FileDialog(parent, _("Choose a filename and directory"), defaultDir = dirControl.GetValue().strip(), defaultFile = name, wildcard= "*.%s" % fileExtension, style=wx.SAVE|wx.CHANGE_DIR) else: dlg = wx.DirDialog(wx.GetApp().GetTopWindow(), _("Choose a directory:"), defaultPath=dirControl.GetValue().strip(), style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON) if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() return path = dlg.GetPath() dlg.Destroy() if path: if not useDirDialog: dir, filename = os.path.split(path) if dirControl.FindString(dir) == wx.NOT_FOUND: dirControl.Insert(dir, 0) dirControl.SetValue(dir) dirControl.SetToolTipString(dir) nameControl.SetValue(filename) else: dirControl.SetValue(path) dirControl.SetToolTipString(path) parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button) def Validate(allowOverwriteOnPrompt=False, infoString='', validClassName=False, ignoreFileConflicts=False): projName = nameControl.GetValue().strip() if projName == "": wx.MessageBox(_("Please provide a %sfile name.") % infoString, _("Provide a File Name")) return False if projName.find(' ') != -1: wx.MessageBox(_("Please provide a %sfile name that does not contains spaces.") % infoString, _("Spaces in File Name")) return False if validClassName: if projName[0].isdigit(): wx.MessageBox(_("File name cannot start with a number. Please enter a different name."), _("Invalid File Name")) return False if projName.endswith(".agp"): projName2 = projName[:-4] else: projName2 = projName if not projName2.replace("_", "a").isalnum(): # [a-zA-Z0-9_] note '_' is allowed and ending '.agp'. wx.MessageBox(_("Name must be alphanumeric ('_' allowed). Please enter a valid name."), _("Project Name")) return False dirName = dirControl.GetValue().strip() if dirName == "": wx.MessageBox(_("No directory. Please provide a directory."), _("Provide a Directory")) return False if os.sep == "\\" and dirName.find("/") != -1: wx.MessageBox(_("Wrong delimiter '/' found in directory path. Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory")) return False if not os.path.exists(dirName): wx.MessageBox(_("That %sdirectory does not exist. Please choose an existing directory.") % infoString, _("Provide a Valid Directory")) return False if not ignoreFileConflicts: filePath = os.path.join(dirName, MakeNameEndInExtension(projName, "." + fileExtension)) if os.path.exists(filePath): if allowOverwriteOnPrompt: res = wx.MessageBox(_("That %sfile already exists. Would you like to overwrite it.") % infoString, "File Exists", style=wx.YES_NO|wx.NO_DEFAULT) return (res == wx.YES) else: wx.MessageBox(_("That %sfile already exists. Please choose a different name.") % infoString, "File Exists") return False return True HALF_SPACE = 5 flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE) flexGridSizer.AddGrowableCol(1,1) if not useDirDialog: flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE) flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0) else: flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0) flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT) flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE) if returnAll: return nameControl, dirControl, flexGridSizer, Validate, allControls else: return nameControl, dirControl, flexGridSizer, Validate def CreateDirectoryOnlyControl( parent, dirLabel=_("Location:"), startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False): if not choiceDirs: choiceDirs = [] projectDirs = [] if appDirDefaultStartDir: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT) else: appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY) if appDirectory: choiceDirs.append(appDirectory) if appDirDefaultStartDir and not startingDirectory: startingDirectory = appDirectory projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: curProjectDoc = projectService.GetCurrentProject() if curProjectDoc: homeDir = curProjectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in choiceDirs): choiceDirs.append(homeDir) if not startingDirectory: startingDirectory = homeDir for projectDoc in projectService.GetOpenProjects(): if projectDoc == curProjectDoc: continue homeDir = projectDoc.GetAppDocMgr().homeDir if homeDir and (homeDir not in projectDirs): projectDirs.append(homeDir) projectDirs.sort(CaseInsensitiveCompare) for projectDir in projectDirs: if projectDir not in choiceDirs: choiceDirs.append(projectDir) if startingDirectory and (startingDirectory not in choiceDirs): choiceDirs.insert(0, startingDirectory) if os.getcwd() not in choiceDirs: choiceDirs.append(os.getcwd()) if appdirs.getSystemDir() not in choiceDirs: choiceDirs.append(appdirs.getSystemDir()) if not startingDirectory: startingDirectory = os.getcwd() dirLabelText = wx.StaticText(parent, -1, dirLabel) dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs) dirControl.SetToolTipString(startingDirectory) button = wx.Button(parent, -1, _("Browse...")) def OnFindDirClick(event): dlg = wx.DirDialog(wx.GetApp().GetTopWindow(), _("Choose a directory:"), defaultPath=dirControl.GetValue().strip(), style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON) dlg.CenterOnParent() if dlg.ShowModal() == wx.ID_OK: dir = dlg.GetPath() if dirControl.FindString(dir) == wx.NOT_FOUND: dirControl.Insert(dir, 0) dirControl.SetValue(dir) dirControl.SetToolTipString(dir) dlg.Destroy() parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button) def Validate(allowOverwriteOnPrompt=False): dirName = dirControl.GetValue().strip() if dirName == "": wx.MessageBox(_("Please provide a directory."), _("Provide a Directory")) return False if os.sep == "\\" and dirName.find("/") != -1: wx.MessageBox(_("Wrong delimiter '/' found in directory path. Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory")) return False if not os.path.exists(dirName): wx.MessageBox(_("That directory does not exist. Please choose an existing directory."), _("Provide a Valid Directory")) return False return True HALF_SPACE = 5 flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE) flexGridSizer.AddGrowableCol(1,1) flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.RIGHT, border=HALF_SPACE) flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE) flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE) return dirControl, flexGridSizer, Validate def CreateNameOnlyControl( parent, fileLabel, startingName="", startingDirectoryControl=None): fileLabelText = wx.StaticText(parent, -1, fileLabel) nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1)) def Validate(allowOverwriteOnPrompt=False, validClassName=False): projName = nameControl.GetValue().strip() if projName == "": wx.MessageBox(_("Blank name. Please enter a valid name."), _("Project Name")) return False if projName.find(' ') != -1: wx.MessageBox(_("Spaces in name. Name cannot have spaces."), _("Project Name")) return False if validClassName: if projName[0].isdigit(): wx.MessageBox(_("Name cannot start with a number. Please enter a valid name."), _("Project Name")) return False if projName.endswith(".agp"): projName2 = projName[:-4] else: projName2 = projName if not projName2.replace("_", "a").isalnum(): # [a-zA-Z0-9_] note '_' is allowed and ending '.agp'. wx.MessageBox(_("Name must be alphanumeric ('_' allowed). Please enter a valid name."), _("Project Name")) return False path = os.path.join(startingDirectoryControl.GetValue().strip(), projName) if os.path.exists(path): if os.path.isdir(path): message = _("Project '%s' already exists. Would you like to overwrite the contents of the project?") % projName else: # os.path.isfile(path): message = _("'%s' already exists as a file. Would you like to replace it with the project?") % nameControl.GetValue().strip() yesNoMsg = wx.MessageDialog(wx.GetApp().GetTopWindow(), message, _("Project Directory Exists"), wx.YES_NO|wx.ICON_QUESTION ) yesNoMsg.CenterOnParent() status = yesNoMsg.ShowModal() yesNoMsg.Destroy() if status == wx.ID_NO: return False return True HALF_SPACE = 5 flexGridSizer = wx.FlexGridSizer(cols = 2, vgap = HALF_SPACE, hgap = HALF_SPACE) flexGridSizer.AddGrowableCol(1,1) flexGridSizer.Add(fileLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.TOP|wx.RIGHT, border=HALF_SPACE) flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE) return nameControl, flexGridSizer, Validate def ValidateName(name, ext=None, hint="name"): """ Returns an error string if there is something wrong with the name. Otherwise it returns None """ if name == "": return _("Blank %s. Please enter a valid %s.") % (hint, hint) if name.find(' ') != -1: return _("Spaces in %s. %s cannot have spaces.") % (hint, hint.title()) if name[0].isdigit(): return _("%s cannot start with a number. Please enter a valid %s.") % (hint.title(), hint) if ext and name.endswith(ext): # strip extension if provided lenExt = len(ext) name = name[:-lenExt] if not name.replace("_", "a").isalnum(): # [a-zA-Z0-9_] note '_' is allowed and ext ending. return _("%s must be alphanumeric ('_' allowed). Please enter a valid %s.") % (hint.title(), hint) return None def GetCurrentProject(): projectDocument = None projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: projectDocument = projectService.GetCurrentProject() return projectDocument def AddFilesToCurrentProject(paths, folderPath=None, types=None, names=None, save=False): projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) if projectService: projectDocument = projectService.GetCurrentProject() if projectDocument: files = projectDocument.GetFiles() for path in paths: if path in files: paths.remove(path) if paths: projectDocument.GetCommandProcessor().Submit(ProjectEditor.ProjectAddFilesCommand(projectDocument, paths, folderPath=folderPath, types=types, names=names)) if save: projectDocument.OnSaveDocument(projectDocument.GetFilename()) def AddFilesToProject(projectDocument, paths, types=None, names=None, save=False): if projectDocument: files = projectDocument.GetFiles() for path in paths: if path in files: paths.remove(path) if paths: projectDocument.GetCommandProcessor().Submit(ProjectEditor.ProjectAddFilesCommand(projectDocument, paths, types=types, names=names)) if save: projectDocument.OnSaveDocument(projectDocument.GetFilename()) def MakeNameEndInExtension(name, extension): if not name: return name root, ext = os.path.splitext(name) if ext == extension: return name else: return name + extension def GetPythonExecPath(): pythonExecPath = wx.ConfigBase_Get().Read("ActiveGridPythonLocation") if not pythonExecPath: pythonExecPath = sysutils.pythonExecPath return pythonExecPath def GetPHPExecPath(): PHPExecPath = wx.ConfigBase_Get().Read("ActiveGridPHPLocation") return PHPExecPath def GetPHPINIPath(): PHPINIPath = wx.ConfigBase_Get().Read("ActiveGridPHPINILocation") return PHPINIPath def _DoRemoveRecursive(path, skipFile=None, skipped=False): if path == skipFile: skipped = True elif os.path.isdir(path): for file in os.listdir(path): file_or_dir = os.path.join(path,file) if skipFile == file_or_dir: skipped = True elif os.path.isdir(file_or_dir) and not os.path.islink(file_or_dir): if _DoRemoveRecursive(file_or_dir, skipFile): # it's a directory recursive call to function again skipped = True else: os.remove(file_or_dir) # it's a file, delete it if not skipped: os.rmdir(path) # delete the directory here else: os.remove(path) return skipped def RemoveRecursive(path, skipFile=None): _DoRemoveRecursive(path, skipFile) def CaseInsensitiveCompare(s1, s2): """ Method used by sort() to sort values in case insensitive order """ return strutils.caseInsensitiveCompare(s1, s2) def GetAnnotation(model, elementName): """ Get an object's annotation used for tooltips """ if hasattr(model, "_complexType"): ct = model._complexType elif hasattr(model, "__xsdcomplextype__"): ct = model.__xsdcomplextype__ else: ct = None if ct: el = ct.findElement(elementName) if el and el.annotation: return el.annotation return "" def GetDisplayName(doc, name): if name: appDocMgr = doc.GetAppDocMgr() if appDocMgr: name = appDocMgr.toDisplayTypeName(name) else: namespace, name = xmlutils.splitType(name) if namespace and hasattr(doc.GetModel(), "getXmlNamespaces"): for xmlkey, xmlval in doc.GetModel().getXmlNamespaces().iteritems(): if xmlval == namespace: name = "%s:%s" % (xmlkey, name) break if name: import activegrid.model.schema as schemalib baseTypeName = schemalib.mapXsdType(name) if baseTypeName: name = baseTypeName return name def GetInternalName(doc, name): if name: appDocMgr = doc.GetAppDocMgr() if appDocMgr: name = appDocMgr.toInternalTypeName(name) else: namespace, name = xmlutils.splitType(name) if namespace and hasattr(doc.GetModel(), "getXmlNamespaces"): for xmlkey, xmlval in doc.GetModel().getXmlNamespaces().iteritems(): if xmlkey == namespace: name = "%s:%s" % (xmlval, name) break import activegrid.model.schema as schemalib name = schemalib.mapAGType(name) return name #---------------------------------------------------------------------------- # Methods for finding application level info #---------------------------------------------------------------------------- def GetProjectForDoc(doc): """ Given a document find which project it belongs to. Tries to intelligently resolve conflicts if it is in more than one open project. """ projectService = wx.GetApp().GetService(ProjectEditor.ProjectService) projectDoc = projectService.FindProjectFromMapping(doc) if projectDoc: return projectDoc projectDoc = projectService.GetCurrentProject() if not projectDoc: return None if projectDoc.IsFileInProject(doc.GetFilename()): return projectDoc projects = [] openDocs = wx.GetApp().GetDocumentManager().GetDocuments() for openDoc in openDocs: if openDoc == projectDoc: continue if(isinstance(openDoc, ProjectEditor.ProjectDocument)): if openDoc.IsFileInProject(doc.GetFilename()): projects.append(openDoc) if projects: if len(projects) == 1: return projects[0] else: choices = [os.path.basename(project.GetFilename()) for project in projects] dlg = wx.SingleChoiceDialog(wx.GetApp().GetTopWindow(), _("'%s' found in more than one project.\nWhich project should be used for this operation?") % os.path.basename(doc.GetFilename()), _("Select Project"), choices, wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.OK|wx.CENTRE) dlg.CenterOnParent() projectDoc = None if dlg.ShowModal() == wx.ID_OK: i = dlg.GetSelection() projectDoc = projects[i] dlg.Destroy() return projectDoc return None def GetAppInfoForDoc(doc): """ Get the AppInfo for a given document """ projectDoc = GetProjectForDoc(doc) if projectDoc: return projectDoc.GetAppInfo() return None def GetAppDocMgrForDoc(doc): """ Get the AppDocMgr for a given document """ projectDoc = GetProjectForDoc(doc) if projectDoc: return projectDoc.GetModel() return None def GetAppInfoLanguage(doc=None): from activegrid.server.projectmodel import LANGUAGE_DEFAULT if doc: language = doc.GetAppInfo().language else: language = None if not language: config = wx.ConfigBase_Get() language = config.Read(ProjectEditor.APP_LAST_LANGUAGE, LANGUAGE_DEFAULT) if doc: doc.GetAppInfo().language = language # once it is selected, it must be set. return language def AddWsdlAgToProjectFromWsdlRegistration(wsdlRegistration): """Add wsdl ag for registry entry.""" wsdlPath = wsdlRegistration.path rootPath = None serviceRefName = wsdlRegistration.name agwsDoc = _InitWsdlAg(wsdlPath, rootPath, serviceRefName) if (agwsDoc == None): return serviceRef = agwsDoc.GetModel() serviceRef.serviceType = wsdlRegistration.type import activegrid.server.deployment as deployment if (serviceRef.serviceType == deployment.SERVICE_LOCAL): serviceRef.localService = deployment.LocalService( wsdlRegistration.codeFile) elif (serviceRef.serviceType == deployment.SERVICE_DATABASE): serviceRef.databaseService = deployment.DatabaseService( wsdlRegistration.datasourceName) elif (serviceRef.serviceType == deployment.SERVICE_SOAP): pass elif (serviceRef.serviceType == deployment.SERVICE_RSS): serviceRef.rssService = deployment.RssService(wsdlRegistration.feedUrl) elif (serviceRef.serviceType == deployment.SERVICE_REST): serviceRef.restService = deployment.RestService( wsdlRegistration.baseUrl) else: raise AssertionError("Unknown service type") _AddToProject(agwsDoc, addWsdl=True) def AddWsdlAgToProject(wsdlPath, rootPath=fileutils.AG_SYSTEM_STATIC_VAR_REF, serviceRefName=None, className=None, serviceType=None, dataSourceName=None): """ wsdlPath: path to wsdl from rootPath. If wsdlPath is absolute, rootPath is ignored. rootPath is also ignored when rootPath is set to None. rootPath: defaults to ${AG_SYSTEM_STATIC}. serviceRefName: If None, it will be set to the wsdl file name without the .wsdl file extension. className: if not None, will be used for the the wsdlag's ClassName. serviceType: defaults to local. dataSourceName: if serviceType is deployment.DATABASE, the ds must be provided. """ import WsdlAgEditor import XFormWizard import activegrid.model.basedocmgr as basedocmgr import activegrid.server.deployment as deployment if (serviceType == None): serviceType = deployment.SERVICE_LOCAL agwsDoc = _InitWsdlAg(wsdlPath, rootPath, serviceRefName) if (agwsDoc == None): return serviceRef = agwsDoc.GetModel() serviceRef.serviceType = serviceType if (serviceType == deployment.SERVICE_DATABASE and dataSourceName != None): serviceRef.databaseService = deployment.DatabaseService(dataSourceName) else: serviceRef.localService = deployment.LocalService(className=className) _AddToProject(agwsDoc) def _AddToProject(agwsDoc, addWsdl=False): import activegrid.model.basedocmgr as basedocmgr projectDoc = GetCurrentProject() agwsDoc.OnSaveDocument(agwsDoc.GetFilename()) files = [agwsDoc.fileName] types = [basedocmgr.FILE_TYPE_SERVICE] names = [agwsDoc.GetModel().name] if (addWsdl): m = agwsDoc.GetModel() wsdlName = os.path.splitext(os.path.basename(m.filePath))[0] appDocMgr = projectDoc.GetAppDocMgr() if (appDocMgr.findService(wsdlName) == None): m = agwsDoc.GetModel() files.append(m.filePath) types.append(None) names.append(wsdlName) ProjectEditor.ProjectAddFilesCommand(projectDoc, files, types=types, names=names).Do() def _InitWsdlAg(wsdlPath, rootPath=fileutils.AG_SYSTEM_STATIC_VAR_REF, serviceRefName=None): projectDoc = GetCurrentProject() appDocMgr = projectDoc.GetAppDocMgr() if (serviceRefName == None): serviceRefName = os.path.splitext(os.path.basename(wsdlPath))[0] if (appDocMgr.findServiceRef(serviceRefName) != None): return None import WsdlAgEditor import XFormWizard import activegrid.server.deployment as deployment template = XFormWizard.GetTemplate(WsdlAgEditor.WsdlAgDocument) ext = template.GetDefaultExtension() fullPath = os.path.join(appDocMgr.homeDir, serviceRefName + ext) agwsDoc = template.CreateDocument( fullPath, flags=(wx.lib.docview.DOC_NO_VIEW|wx.lib.docview.DOC_NEW| wx.lib.docview.DOC_OPEN_ONCE)) serviceRef = agwsDoc.GetModel() serviceRef.name = serviceRefName if (rootPath == None or os.path.isabs(wsdlPath)): serviceRef.filePath = wsdlPath else: # make sure to use forward slashes for the path to the .wsdl wsdlPath = wsdlPath.replace("\\", "/") if not wsdlPath.startswith("/"): wsdlPath = "/%s" % wsdlPath serviceRef.filePath = "%s%s" % (rootPath, wsdlPath) agwsDoc.fileName = fullPath return agwsDoc def GetSchemaName(schema): return os.path.basename(schema.fileName) class AGChoice(wx.Choice): """Extension to wx.Choice that fixes linux bug where first item of choices passed into ctor would be visible, but not selected.""" def __init__(self, parent, id, choices=[]): super(AGChoice, self).__init__(parent=parent, id=id) self.AppendItems(choices)