Index: trunk/ippToPsps/jython/odm.py
===================================================================
--- trunk/ippToPsps/jython/odm.py	(revision 32075)
+++ trunk/ippToPsps/jython/odm.py	(revision 32075)
@@ -0,0 +1,79 @@
+#!/usr/bin/env jython
+
+import re
+import sys
+import tempfile
+from xml.etree.ElementTree import ElementTree, Element, tostring
+from subprocess import call, PIPE, Popen
+
+'''
+Class for ippToPsps database connectivity
+'''
+class Odm(object):
+
+    '''
+    Constructor
+    '''
+    def __init__(self, logger, doc):
+
+        self.logger = logger
+        self.doc = doc
+
+    '''
+    Checks a batch with the ODM
+    '''
+    def checkBatch(self, batchID, results):
+
+        batch = "B%08d" % batchID
+
+        tempFile = tempfile.NamedTemporaryFile(mode='w+b')
+
+        p = Popen("../perl/checkOdmStatus.pl -b " + batch + " -f " + tempFile.name, 
+                shell=True, 
+                stdout=PIPE)
+        p.wait()
+        
+        if p.returncode != 0:
+           self.logger.errorPair("ODM polling", "failed")
+           return 0
+        else:
+           self.logger.debugPair("ODM polling", "successful")
+
+        ret = self.decodeODMResponse(tempFile.name, results)
+
+        tempFile.close()
+
+        if not ret: self.logger.errorPair("Cannot read ODM file for batch", "%d" % batchID)
+
+        return ret
+
+    '''
+    Parsed the XML returned from the ODM SOAP call
+    '''
+    def decodeODMResponse(self, odmResponseFile, results):
+
+        doc = ElementTree(file=odmResponseFile)
+
+        loadedToODM = 0
+        loadFailed = 0
+        mergeWorthy = 0
+        merged = 0
+
+        try:
+            NAMESPACE = "PanSTARRS.Services.OdmWebService"
+            STATE = doc.find("{%s}OdmBatchState/{%s}BatchState" % (NAMESPACE, NAMESPACE)).text
+            MESSAGE = doc.find("{%s}OdmBatchState/{%s}Message" % (NAMESPACE, NAMESPACE)).text
+
+            if re.search("failed", STATE): loadFailed = 1
+            if re.search("MergeWorthy", MESSAGE): mergeWorthy = 1
+            if re.search("Merge[1-9]Completed", MESSAGE): merged = 1
+            if mergeWorthy or merged or loadFailed: loadedToODM = 1
+        except:
+            return 0
+
+        results['LOADEDTOODM'] = loadedToODM
+        results['LOADFAILED'] = loadFailed
+        results['MERGEWORTHY'] = mergeWorthy
+        results['MERGED'] = merged
+
+        return 1
