Index: qPloneGoogleSitemaps/trunk/utils.py
===================================================================
--- qPloneGoogleSitemaps/trunk/utils.py	(revision 3713)
+++ qPloneGoogleSitemaps/trunk/utils.py	(revision 1)
@@ -1,23 +1,108 @@
 from urllib2 import urlopen
 from urllib  import quote as urlquote
-
-from Globals import DevelopmentMode
+from Products.CMFCore.utils import getToolByName
+import re
+import Products.qPloneGoogleSitemaps.config as config
 from OFS.ObjectManager import BadRequestException
-
-from Products.qPloneGoogleSitemaps.config import testing
-
-def ping_google(url, sitemap_id):
+def ping_google(url):
     """Ping sitemap to Google"""
-    if DevelopmentMode:
-        #prevent pinging in debug mode
-        print "Pinging Google ...", url, sitemap_id
-        return 0
-
-    resurl = url + "/" + sitemap_id
-    sitemap_url = urlquote(resurl)
+    sitemap_url = urlquote(url + "/google-sitemaps")
     g = urlopen('http://www.google.com/webmasters/sitemaps/ping?sitemap='+sitemap_url)
     result = g.read()
     g.close()
-    if testing:
-        print "Pinged %s sitemap to google" % resurl
     return 0
+
+def searchAndReplace(string, what, with):
+    """Emulate sed command s/"""
+    res = re.sub(what,with,string)
+    return res
+
+OPERATORS = {'s': searchAndReplace,}
+
+def applyOperations(objects, operations):
+    """Parse Operations """
+    parse = re.compile(r"(.?[^\\])/(.*[^\\]|)/(.*[^\\]|)/")
+    operations=[parse.match(op).groups() for op in operations]
+    result={}
+    for ob in objects:
+        url = ob.getURL()
+        for operator, what, with in operations:
+            url = OPERATORS[operator](url, what, with.replace("\\", ""))
+        #TODO: Remove or replace following condition
+        #it is senseless in the case we need intelligent
+        #result set. Better condition would be to place
+        #freshest brain into result
+        if url in result.keys():
+            continue
+        #TODO: replace brain with only data necessary to 
+        #generate sitemap
+        result[url]=ob
+    return result
+
+def additionalURLs(self):
+    """Add URLs to sitemap that arn't objects"""
+    res = []
+    plone_home = getToolByName(self, 'portal_url').getPortalObject().absolute_url()
+    root = self.getPhysicalRoot().absolute_url()
+
+    props = getToolByName(self,'portal_properties')
+    try:
+        URLs = props.googlesitemap_properties.urls
+    except AttributeError:
+        URLs = []
+
+    add_zope = re.compile('^/')
+    add_plone= re.compile('^[^http://|https://|\\\]')
+    for url in URLs:
+        if add_zope.match(url):
+            res.append(root+url)
+        elif add_plone.match(url):
+            res.append(plone_home+'/'+url)
+        else:
+            res.append(url)
+    return res
+
+"""workflows & co"""
+def getWorkflowTransitions(self,workflow_id):
+    pw = getToolByName(self,'portal_workflow')
+    wf = pw.getWorkflowById(workflow_id)
+    if not wf:
+        return None
+    return wf.transitions.values()
+
+def setWorkflowTransitions(self,transitions):
+    """set workflow transitions properties"""
+    portal_workflow = getToolByName(self, 'portal_workflow')
+    transmap = {}
+    for key in transitions:
+        if key.find('#')>0:
+            ids = key.split('#')
+            wfid = ids[0]
+            if not wfid in transmap.keys():
+                transmap[wfid]=[]
+            transmap[wfid].append(ids[1])
+    for wfid in transmap.keys():
+        workflow = portal_workflow.getWorkflowById(wfid)
+        if config.ping_googlesitemap not in workflow.scripts.objectIds():
+            workflow.scripts.manage_addProduct['ExternalMethod'].manage_addExternalMethod(
+                                config.ping_googlesitemap,
+                                'Ping sitemap',
+                                'qPloneGoogleSitemaps.ping_googlesitemap',
+                                config.ping_googlesitemap)
+        transitions_set = transmap[wfid]
+        for transition in workflow.transitions.values():
+            trid = transition.id
+            tras = transition.after_script_name
+            if (tras == '') and (trid in transitions_set):
+                #set
+                after_script = config.ping_googlesitemap
+            elif (tras == config.ping_googlesitemap) and not (trid in transitions_set):
+                #reset
+                after_script = ''
+            else:
+                #avoid properties set
+                continue
+            transition.setProperties(title=transition.title,
+                                     new_state_id=transition.new_state_id,
+                                     after_script_name=after_script,
+                                     actbox_name=transition.actbox_name)
