[GRASS-SVN] r47478 - grass-addons/grass7/gui/wxpython/wx.wms

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Aug 7 10:11:59 EDT 2011


Author: sudeepsingh
Date: 2011-08-07 07:11:59 -0700 (Sun, 07 Aug 2011)
New Revision: 47478

Modified:
   grass-addons/grass7/gui/wxpython/wx.wms/ServerInfoAPIs.py
   grass-addons/grass7/gui/wxpython/wx.wms/ServersList.xml
   grass-addons/grass7/gui/wxpython/wx.wms/TODO
   grass-addons/grass7/gui/wxpython/wx.wms/addserver.py
   grass-addons/grass7/gui/wxpython/wx.wms/config
   grass-addons/grass7/gui/wxpython/wx.wms/wmsmenu.py
Log:
UUID now being used as an id for saves

Modified: grass-addons/grass7/gui/wxpython/wx.wms/ServerInfoAPIs.py
===================================================================
--- grass-addons/grass7/gui/wxpython/wx.wms/ServerInfoAPIs.py	2011-08-07 13:11:34 UTC (rev 47477)
+++ grass-addons/grass7/gui/wxpython/wx.wms/ServerInfoAPIs.py	2011-08-07 14:11:59 UTC (rev 47478)
@@ -31,11 +31,20 @@
             
     return soup, True
 
+def ifServerNameExists(soup,servername):
+    servers = soup.findAll('servername')
+    for server in servers:
+        name = server.string.strip()
+        if(name == servername):
+            return True
+        else:
+            return False
+    return False
+    
 
-def addServerInfo(soup, serverinfo, snamevalue, urlvalue, unamevalue, passwordvalue):
+def addServerInfo(soup, serverinfo, uid, snamevalue, urlvalue, unamevalue, passwordvalue):
     snamevalue = unicode(snamevalue)
-    elements = soup.findAll(id = snamevalue)
-    if(len(elements)!=0):
+    if(ifServerNameExists(soup, snamevalue)):
         return False
     else:
         server = Tag(soup, "server")
@@ -55,7 +64,7 @@
     
         #Adding attribute to server tag
         
-        server['id'] = snamevalue
+        server['id'] = uid
     
         #Adding text values to the server info fields
         servername.insert(0,snamevalue)
@@ -74,10 +83,10 @@
             element.extract()
         return True
 
-def updateServerInfo(soup, serverinfo, snamevalue, urlvalue, unamevalue, passwordvalue):
+def updateServerInfo(soup, serverinfo, uid, snamevalue, urlvalue, unamevalue, passwordvalue):
     snamevalue = unicode(snamevalue)
-    if(removeServerInfo(soup, snamevalue)):
-        if(addServerInfo(soup, serverinfo, snamevalue, urlvalue, unamevalue, passwordvalue)):
+    if(removeServerInfo(soup, uid)):
+        if(addServerInfo(soup, serverinfo, uid, snamevalue, urlvalue, unamevalue, passwordvalue)):
             return True
         else:
             return False
@@ -87,7 +96,9 @@
 def getAllRows(soup):
     elements = soup.findAll('server')
     servers = {}
+    map_servernameTouid = {}
     for element in elements:
+        uid = element['id']
         servername = element.findAll('servername')[0]
         serverurl = element.findAll('serverurl')[0]
         username = element.findAll('username')[0]
@@ -97,6 +108,6 @@
         serverdata.url = serverurl.contents[0].strip()
         serverdata.username = username.contents[0].strip()
         serverdata.password = password.contents[0].strip()
-        servers[serverdata.servername] = serverdata
-        
-    return servers
\ No newline at end of file
+        servers[uid] = serverdata
+        map_servernameTouid[serverdata.servername] = uid
+    return servers, map_servernameTouid
\ No newline at end of file

Modified: grass-addons/grass7/gui/wxpython/wx.wms/ServersList.xml
===================================================================
--- grass-addons/grass7/gui/wxpython/wx.wms/ServersList.xml	2011-08-07 13:11:34 UTC (rev 47477)
+++ grass-addons/grass7/gui/wxpython/wx.wms/ServersList.xml	2011-08-07 14:11:59 UTC (rev 47478)
@@ -1,4 +1,32 @@
 <serverinfo>
+ <server id="aad1ec6f-25c7-489e-acc3-238c25d8a8c9">
+  <servername>
+   yahoo
+  </servername>
+  <serverurl>
+   http://www.yahoo.com
+  </serverurl>
+  <username>
+   asdkjasdkjsad
+  </username>
+  <password>
+   asdkjasdkjasdkasdkjas
+  </password>
+ </server>
+ <server id="GISNetServer">
+  <servername>
+   GISNetServer
+  </servername>
+  <serverurl>
+   http://www.gisnet.lv/cgi-bin/topo
+  </serverurl>
+  <username>
+   unameq
+  </username>
+  <password>
+   password
+  </password>
+ </server>
  <server id="asd">
   <servername>
    asd
@@ -37,18 +65,4 @@
   <password>
   </password>
  </server>
- <server id="GISNetServer">
-  <servername>
-   GISNetServer
-  </servername>
-  <serverurl>
-   http://www.gisnet.lv/cgi-bin/topo
-  </serverurl>
-  <username>
-   uname
-  </username>
-  <password>
-   password
-  </password>
- </server>
 </serverinfo>

Modified: grass-addons/grass7/gui/wxpython/wx.wms/TODO
===================================================================
--- grass-addons/grass7/gui/wxpython/wx.wms/TODO	2011-08-07 13:11:34 UTC (rev 47477)
+++ grass-addons/grass7/gui/wxpython/wx.wms/TODO	2011-08-07 14:11:59 UTC (rev 47478)
@@ -20,6 +20,7 @@
 8.The Save/Dont Save/Cancel popup works fine for the first time, but for the 2nd time leads to PyDeadObjectError error. This bug is known and is of serious nature. Fix to be done soon. 
 Some other issues detected with this popup. Like when adding a new server name "</servername>" , and then click on save and then on quit, the popup appears, now click on cancel. After clicking on cancel, another popup appears and this continues. Serious issue. This popups code needs to be checked throughly. 
 
+9.On quiting the application it leads to segmentation error or even after quiting application the console doesnot quits. Need to use ctrl-c right now.
 
 More to be added...
 
@@ -32,6 +33,7 @@
 1.[Fixed]Username checked for delimeter presence
 2.[Fixed]On closing add server window, main window also closes.
 3.[Fixed]In addserver.py when pressing the quit button or closing it, main wmsmenu window closes, and it gives an error of maximum recurssion depth reached error. 
+4.[Fixed]Reply from wms server on getmap should be an image or a service exception, Now this check is being made. 
 
 
 
@@ -45,7 +47,6 @@
 
 
 
-
 Following are issues reported by Maris and their current status. (Issues marked with [done] are fixed). 
 
 
@@ -70,15 +71,15 @@
 This is important! Use copy on success trick (save to temporary file;
 in case of success, copy temporary file over original one).
 *[done]  All fields should accept non-ascii characters.
-* TODO: validate user provided URL by doing getCapabilities request.
-* When server is removed, it should switch dropdown server list to
+* TODO: validate user provided URL by doing getCapabilities request.[Can it be validated ?, sometimes a server might be down, so instead we leave it at user to decide if he gives a valid url, as in case he gives something like www.google.com or any other website, the application can handle the wrong responses recieved]
+*[Need help in this, could not figure out the function to preselect something] When server is removed, it should switch dropdown server list to
 other entry to indicate it's removal.
 
 wmsmenu:
 *[done]  Code makes assumptions that serverlist files are readable and
 writable. This might not be true. Just chmod -r serverlist* to see how
 it affects program.
-* TODO: server list storage in Location OR users preferences. This
+*[?] TODO: server list storage in Location OR users preferences. This
 should be offered as a choice to user.
 *[done]  "AddServer" should be called "Edit server list" or some of edit
 icons on button should be used.

Modified: grass-addons/grass7/gui/wxpython/wx.wms/addserver.py
===================================================================
--- grass-addons/grass7/gui/wxpython/wx.wms/addserver.py	2011-08-07 13:11:34 UTC (rev 47477)
+++ grass-addons/grass7/gui/wxpython/wx.wms/addserver.py	2011-08-07 14:11:59 UTC (rev 47478)
@@ -4,6 +4,7 @@
 
 import wx
 import os
+import uuid
 from wx.lib.pubsub import Publisher
 from BeautifulSoup import BeautifulSoup, Tag, NavigableString, BeautifulStoneSoup
 from ServerInfoAPIs import addServerInfo, removeServerInfo, updateServerInfo, initServerInfoBase, getAllRows
@@ -72,6 +73,7 @@
         Publisher().subscribe(self.OnPopupNotSaveRequest, ("PopupNotSaveRequest"))
         Publisher().subscribe(self.OnPopupCancelRequest, ("PopupCancelRequest"))
         self.editOn = False
+        self.selectedUid = None
         #sudeep code ends
 
     def __set_properties(self):
@@ -131,53 +133,59 @@
         self.SetSizer(sizer_1)
         self.Layout()
         # end wxGlade
-        
+    def valueExists(self,dict, newServerName):
+        print 'Enter here'
+        print newServerName
+        try:
+            for key, value in dict.items():
+                #print key, value.servername
+                if(value.servername == newServerName):
+                    print 'returning true'
+                    return True
+            print 'returning False'
+            return False
+        except:
+            print 'Exception while iterating dictionary elements'
+            return False
     def OnSave(self, event): # wxGlade: ServerAdd.<event_handler>
         #print "Event handler `OnSave' not implemented"
+        print '-------------------------------------------------------------------> OnSave'
         newServerName = unicode(self.ServerNameText.GetValue())
         newUrl = self.URLText.GetValue()
         newUserName = self.UsernameText.GetValue()
         newPassword = self.PasswordText.GetValue()
         
-        
-        if(newServerName.count(self.name_url_delimiter)>0):
-                print "Warning: UserName cannot consist of "+self.name_url_delimiter
-                print "Please give another username, save failed..."
-                return
-            
-        if(newUrl.count(self.name_url_delimiter)>0):
-                print "Warning: URL cannot consist of "+self.name_url_delimiter
-                print "Change in config file required to use different character as delimeter which doesnot appears in url"
-                return
-            
-        character = '>'
-        if(newServerName.count(character) > 0 or newUrl.count(character) > 0 or newUserName.count(character) > 0 or newPassword.count(character) > 0):
-            print character+' is not allowed in a Field'
+        if(not self.allFieldsValid(newServerName, newUrl, newUserName, newPassword)):
             return
-
-        character = '<'
-        if(newServerName.count(character) > 0 or newUrl.count(character) > 0 or newUserName.count(character) > 0 or newPassword.count(character) > 0):
-            print character+' is not allowed in a Field'
-            return
         
-        character = '&'
-        if(newServerName.count(character) > 0 or newUrl.count(character) > 0 or newUserName.count(character) > 0 or newPassword.count(character) > 0):
-            print character+' is not allowed in a Field'
-            return
         
-        print 'before '+newUrl
         if(not newUrl.startswith('http://')):
             newUrl = 'http://'+newUrl
-        print 'after '+newUrl
         
+        
         print newServerName
         print 'check12'
-        if(self.servers.has_key(newServerName)):
+        
+        if(self.selectedUid == None):
+            update = False
+        else:
             update = True
+        '''print newServerName
+        print self.map_servernameTouid
+        if(self.map_servernameTouid.has_key(newServerName)):
+            CurrentUid = self.map_servernameTouid[newServerName]
+            update = True
+            print 'key present'
+        else:
+            print 'key not present'
+            CurrentUid = None
+            update = False
+        if(self.servers.has_key(Uid)):
+            update = True
             #print 'Server Name already exists'
             #return
         else:
-            update = False
+            update = False'''
             
        
         
@@ -187,22 +195,38 @@
         url = newUrl.split()
         #if(len(newUrl) != 0 and len(newServerName) != 0 and len(newUserName) !=0 and len(newPassword) != 0 ):
         if(len(newUrl) != 0 and len(newServerName) != 0):
+            if(not self.selectedServer.servername == newServerName):
+                if(self.valueExists(self.servers, newServerName)):
+                    print 'Please Enter a different Servername'
+                    return
+            #del self.servers[self.selectedUid]
             serverData.servername = newServerName
             serverData.url = newUrl
             serverData.username = newUserName
             serverData.password = newPassword
-            self.servers[newServerName] = serverData
+            
+            
             if(update):
-                if(updateServerInfo(self.soup, self.soup.serverinfo, newServerName, newUrl, newUserName, newPassword)):
+                if(updateServerInfo(self.soup, self.soup.serverinfo, self.selectedUid, newServerName, newUrl, newUserName, newPassword)):
                     print 'update save successful'
+                    self.servers[self.selectedUid] = serverData
+                    del self.map_servernameTouid[self.selectedServer.servername]
+                    self.selectedServer = serverData
+                    self.map_servernameTouid[newServerName] = self.selectedUid
                     self.saveXMLData()
                     msg = self.servers
                     Publisher().sendMessage(("update.serverList"), msg)
                 else:
                     print 'update save not successful'
             else:    
-                if(addServerInfo(self.soup, self.soup.serverinfo, newServerName, newUrl, newUserName, newPassword)):
+                uid = str(uuid.uuid4())
+                
+                if(addServerInfo(self.soup, self.soup.serverinfo, uid, newServerName, newUrl, newUserName, newPassword)):
                     print 'soup save successfully'
+                    self.selectedUid = uid
+                    self.servers[self.selectedUid] = serverData
+                    self.selectedServer = serverData
+                    self.map_servernameTouid[newServerName] = uid
                     self.saveXMLData()
                     msg = self.servers
                     Publisher().sendMessage(("update.serverList"), msg)
@@ -225,16 +249,21 @@
             event.Skip()
 
     def OnRemove(self, event): # wxGlade: ServerAdd.<event_handler>
-        serverName = unicode(self.ServerNameText.GetValue())
-        if(len(serverName) > 0):
-            if(removeServerInfo(self.soup, serverName)):
+        print '-------------------------------------------------------------------> OnRemove'
+        if(self.selectedUid == None):
+            print 'No Uid is selected....Remove Unsuccessful'
+            return
+        else:
+            if(removeServerInfo(self.soup, self.selectedUid)):
                 print 'remove successful'
+                del self.map_servernameTouid[self.selectedServer.servername]
             else:
                 print 'remove unsuccessful'
                 return
             #print self.servers
             
-            del self.servers[serverName]
+            del self.servers[self.selectedUid]
+            self.selectedUid = None
             self.__update_URL_List()
             
             self.ServerNameText.Clear()
@@ -245,14 +274,15 @@
             self.saveXMLData()
             msg = self.servers
             Publisher().sendMessage(("update.serverList"), msg)
-        else:
-            print 'No server selected'
+        
         #print "Event handler `OnRemove' not implemented"
         self.editOn = False
         event.Skip()
 
     def OnAddNew(self, event): # wxGlade: ServerAdd.<event_handler>
+        print '-------------------------------------------------------------------> OnAddNew'
         #print "Event handler `OnAddNew' not implemented"
+        self.selectedUid = None
         self.ServerNameText.Clear()
         self.PasswordText.Clear()
         self.URLText.Clear()
@@ -261,6 +291,7 @@
         event.Skip()
     
     def OnQuit(self, event): # wxGlade: ServerAdd.<event_handler>
+        print '-------------------------------------------------------------------> OnQuit'
         print 'onQuit pressed'
         if(self.editOn):
             print "Do you want to save the unsaved changes ?"
@@ -280,6 +311,7 @@
         event.Skip()
 
     def OnServerList(self, event): # wxGlade: ServerAdd.<event_handler>
+        print '-------------------------------------------------------------------> OnServerList'
         #print self.ServerList.CurrentSelection
         url = self.ServerList.GetValue()
         print 'here'
@@ -288,7 +320,9 @@
         print urlarr
         #print self.servers
         if(len(urlarr)==2):
-            self.selectedServer = self.servers[unicode(urlarr[0])]
+            uid = self.map_servernameTouid[urlarr[0]]
+            self.selectedUid = uid
+            self.selectedServer = self.servers[uid]
             print self.selectedServer
             self.ServerNameText.SetValue(self.selectedServer.servername)
             self.URLText.SetValue(self.selectedServer.url)
@@ -307,7 +341,7 @@
     
     #Sudeeps methods start
     def __populate_URL_List(self, ComboBox):
-        self.servers = getAllRows(self.soup)
+        self.servers, self.map_servernameTouid = getAllRows(self.soup)
         for key, value in self.servers.items():
             ComboBox.Append(value.servername+self.name_url_delimiter+value.url)
             #ComboBox.Append(value.servername+" "+value.url)
@@ -340,7 +374,37 @@
             print 'Save not successful'
             return False
         return True
+    
+    def allFieldsValid(self, newServerName, newUrl, newUserName, newPassword):
+        if(newServerName.count(self.name_url_delimiter)>0):
+                print "Warning: UserName cannot consist of "+self.name_url_delimiter
+                print "Please give another username, save failed..."
+                return False
+            
+        if(newUrl.count(self.name_url_delimiter)>0):
+                print "Warning: URL cannot consist of "+self.name_url_delimiter
+                print "Change in config file required to use different character as delimeter which doesnot appears in url"
+                return False
+            
+        character = '>'
+        if(newServerName.count(character) > 0 or newUrl.count(character) > 0 or newUserName.count(character) > 0 or newPassword.count(character) > 0):
+            print character+' is not allowed in a Field'
+            return False
+
+        character = '<'
+        if(newServerName.count(character) > 0 or newUrl.count(character) > 0 or newUserName.count(character) > 0 or newPassword.count(character) > 0):
+            print character+' is not allowed in a Field'
+            return False
         
+        character = '&'
+        if(newServerName.count(character) > 0 or newUrl.count(character) > 0 or newUserName.count(character) > 0 or newPassword.count(character) > 0):
+            print character+' is not allowed in a Field'
+            return False
+        
+        return True
+    
+
+
     def OnWMSMenuClose(self, msg):
         self.Close()
         self.Destroy()

Modified: grass-addons/grass7/gui/wxpython/wx.wms/config
===================================================================
--- grass-addons/grass7/gui/wxpython/wx.wms/config	2011-08-07 13:11:34 UTC (rev 47477)
+++ grass-addons/grass7/gui/wxpython/wx.wms/config	2011-08-07 14:11:59 UTC (rev 47478)
@@ -1 +1 @@
-delimeter_servername_url >
+delimeter_servername_url #

Modified: grass-addons/grass7/gui/wxpython/wx.wms/wmsmenu.py
===================================================================
--- grass-addons/grass7/gui/wxpython/wx.wms/wmsmenu.py	2011-08-07 13:11:34 UTC (rev 47477)
+++ grass-addons/grass7/gui/wxpython/wx.wms/wmsmenu.py	2011-08-07 14:11:59 UTC (rev 47478)
@@ -4,6 +4,7 @@
 
 import wx
 from wxPython.wx import *
+import imghdr
 from wx.lib.pubsub import Publisher
 from urllib2 import Request, urlopen, URLError, HTTPError
 from parse import parsexml, isServiceException, populateLayerTree, isValidResponse
@@ -67,6 +68,7 @@
         
         self.Bind(wx.EVT_CLOSE, self.OnQuit)
         self.AddServerisClosed = True
+        self.layerName = ""
         
         #items = ["a", "b", "c"]
         #itemId = self.LayerTree.AppendItem(self.layerTreeRoot, "item")
@@ -117,7 +119,7 @@
 
 
     def __populate_Url_List(self, ComboBox):
-        self.servers = getAllRows(self.soup)
+        self.servers, self.map_servernameTouid = getAllRows(self.soup)
         for key, value in self.servers.items():
             ComboBox.Append(value.servername+self.name_url_delimiter+value.url)
             #ComboBox.Append(value.servername+" "+self.name_url_delimiter+" "+value.url)
@@ -212,12 +214,19 @@
             response = urlopen(req)
             image = response.read()
             #print image
+            
             if(isServiceException(image)):
                 print 'Service Exception has occured'
             else:
                 outfile = open('map.png','wb')
                 outfile.write(image)
                 outfile.close()
+                if(imghdr.what('./map.png') != 'png'):
+                    print 'uiui'
+                    print imghdr.what('./map.png')
+                    print 'Not a valid PNG Image, Unable to display, returning'
+                    return
+                
                 NewImageFrame()
             
             
@@ -274,7 +283,8 @@
         #self.printDict(self.servers)
         print "OnServerList: done"
         if(len(urlarr)==2):
-            self.selectedURL = self.servers[urlarr[0]].url
+            uid = self.map_servernameTouid[urlarr[0]]
+            self.selectedURL = self.servers[uid].url
             print self.selectedURL
         else:
             print "Wrong format of URL selected"



More information about the grass-commit mailing list