From 9d8333ef2b4196ca7e278cf9ff4d7bdfe9e1f64d Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Wed, 2 Dec 2015 17:21:27 +0000
Subject: [PATCH] object classes modifications related to daq and upload
 tracking

---
 src/python/dm/common/objects/daqInfo.py      | 46 +++++++++++++++++++-
 src/python/dm/common/objects/observedFile.py | 19 ++++----
 src/python/dm/common/objects/uploadInfo.py   | 41 ++++++++++++++++-
 3 files changed, 93 insertions(+), 13 deletions(-)

diff --git a/src/python/dm/common/objects/daqInfo.py b/src/python/dm/common/objects/daqInfo.py
index e28bc5e9..c5d32214 100755
--- a/src/python/dm/common/objects/daqInfo.py
+++ b/src/python/dm/common/objects/daqInfo.py
@@ -1,11 +1,53 @@
 #!/usr/bin/env python
 
+import copy
 from dmObject import DmObject
+from dm.common.utility.dictUtility import DictUtility
 
 class DaqInfo(DmObject):
 
-    DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory' ]
+    DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory', 'status', 'nProcessedFiles', 'nFiles', 'startTimestamp', 'endTimestamp' ]
 
-    def __init__(self, dict):
+    def __init__(self, dict={}):
         DmObject.__init__(self, dict)
+        self.originalKeys = dict.keys()
+        self['fileDict'] = self.get('fileDict', {})
 
+    def updateStatus(self):
+        daqStatus = self.get('status', 'running')
+        if daqStatus == 'done':          
+            return 
+        fileDict = self.get('fileDict')
+        nFiles = len(fileDict)
+        nProcessedFiles = 0
+        for (filePath,uploadFileInfo) in fileDict.items():
+            if uploadFileInfo.get('processed'):
+                 nProcessedFiles += 1                
+        self['nProcessedFiles'] = '%s' % (nProcessedFiles)
+        self['nFiles'] = '%s' % (nFiles)
+
+        # need to handle 'failed' uploads
+        if self.get('endTime'):
+            daqStatus = 'done'
+        self['status'] = daqStatus
+
+    def toDictWithOriginalKeys(self):
+        dict = copy.deepcopy(self.data)
+        for key in dict.keys():
+            if key not in self.originalKeys:
+                del dict[key]
+        return dict
+
+    def scrub(self):
+        # Remove redundant information
+        daqInfo2 = DictUtility.deepCopy(self.data, excludeKeys='fileDict')
+        fileDict = self.get('fileDict', {})
+        fileDict2 = {}
+        for (filePath,fileInfo) in fileDict.items():
+            fileInfo2 = {}
+            for key in ['processed', 'lastUpdateTime']:
+                if fileInfo.has_key(key):
+                    fileInfo2[key] = fileInfo[key]
+            fileDict2[filePath] = fileInfo2
+        daqInfo2['fileDict'] = fileDict2
+        return DaqInfo(daqInfo2)
diff --git a/src/python/dm/common/objects/observedFile.py b/src/python/dm/common/objects/observedFile.py
index 02de1c75..2648d958 100755
--- a/src/python/dm/common/objects/observedFile.py
+++ b/src/python/dm/common/objects/observedFile.py
@@ -7,7 +7,7 @@ import urlparse
 
 class ObservedFile(DmObject):
 
-    DEFAULT_KEY_LIST = [ 'filePath', 'lastUpdatedTimestamp' ]
+    DEFAULT_KEY_LIST = [ 'filePath', 'lastUpdateTime' ]
 
     def __init__(self, dict={}, filePath=None, dataDirectory=None, experiment=None):
         DmObject.__init__(self, dict)
@@ -19,13 +19,15 @@ class ObservedFile(DmObject):
                 parseResult = urlparse.urlparse(dataDirectory)
                 self['experimentFilePath'] = os.path.relpath(filePath, parseResult.path)
         if experiment:
-            self['experiment'] = experiment
+            self['experimentName'] = experiment.get('name')
+            self['storageHost'] = experiment.get('storageHost')
+            self['storageDirectory'] = experiment.get('storageDirectory')
 
-    def setLastUpdatedTimestampToNow(self):
-        self['lastUpdateTimestamp'] = time.time()
+    def setLastUpdateTimeToNow(self):
+        self['lastUpdateTime'] = time.time()
 
-    def getLastUpdatedTimestamp(self):
-        self.get('lastUpdateTimestamp')
+    def getLastUpdateTime(self):
+        self.get('lastUpdateTime')
 
     def getFilePath(self):
         return self.get('filePath')
@@ -33,14 +35,11 @@ class ObservedFile(DmObject):
     def getDataDirectory(self):
         return self.get('dataDirectory')
 
-    def getExperiment(self):
-        return self.get('experiment')
-
 ####################################################################
 # Testing
 if __name__ == '__main__':
     of = ObservedFile(filePath='tmp/xyz')
     print of
-    of.setLastUpdatedTimestampToNow()
+    of.setLastUpdateTimeToNow()
     print of
 
diff --git a/src/python/dm/common/objects/uploadInfo.py b/src/python/dm/common/objects/uploadInfo.py
index ffae07d5..d992e3c7 100755
--- a/src/python/dm/common/objects/uploadInfo.py
+++ b/src/python/dm/common/objects/uploadInfo.py
@@ -1,11 +1,50 @@
 #!/usr/bin/env python
 
 from dmObject import DmObject
+from dm.common.utility.dictUtility import DictUtility
 
 class UploadInfo(DmObject):
 
-    DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory', 'status', 'nProcessedFiles', 'percentageComplete' ]
+    DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory', 'status', 'nProcessedFiles', 'nFiles', 'percentageComplete', 'startTimestamp', 'endTimestamp' ]
 
     def __init__(self, dict={}):
         DmObject.__init__(self, dict)
+        self['fileDict'] = self.get('fileDict', {})
+
+    def updateStatus(self):
+        uploadStatus = self.get('status', 'running')
+        if uploadStatus == 'done':
+            return 
+        fileDict = self.get('fileDict')
+        nFiles = len(fileDict)
+        nProcessedFiles = 0
+        for (filePath,uploadFileInfo) in fileDict.items():
+            if uploadFileInfo.get('processed'):
+                nProcessedFiles += 1
+
+        # need to handle 'failed' uploads
+        if nProcessedFiles == nFiles:
+            uploadStatus = 'done'
+        self['status'] = uploadStatus
+        self['nProcessedFiles'] = '%s' % (nProcessedFiles)
+        self['nFiles'] = '%s' % (nFiles)
+
+        percentageComplete = 100.0
+        if nFiles > 0:
+             percentageComplete = float(nProcessedFiles)/float(nFiles)*100.0
+        self['percentageComplete'] = '%.2f' % percentageComplete
+
+    def scrub(self):
+        # Remove redundant information
+        uploadInfo2 = DictUtility.deepCopy(self.data, excludeKeys='fileDict')
+        fileDict = self.get('fileDict', {})
+        fileDict2 = {}
+        for (filePath,fileInfo) in fileDict.items():
+            fileInfo2 = {}
+            for key in ['processed', 'lastUpdateTime']:
+                if fileInfo.has_key(key):
+                    fileInfo2[key] = fileInfo[key]
+            fileDict2[filePath] = fileInfo2
+        uploadInfo2['fileDict'] = fileDict2
+        return UploadInfo(uploadInfo2)
 
-- 
GitLab