Implemented the remove and merge duplicate entries actions.

Sun, 21 Oct 2012 15:33:36 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 21 Oct 2012 15:33:36 +0200
changeset 11
1eabdd26c44e
parent 10
64acf4452ac0
child 12
6c91abc72022

Implemented the remove and merge duplicate entries actions.

TimeTracker/TimeTrackEntry.py file | annotate | diff | comparison | revisions
TimeTracker/TimeTracker.py file | annotate | diff | comparison | revisions
TimeTracker/TimeTrackerWidget.py file | annotate | diff | comparison | revisions
--- a/TimeTracker/TimeTrackEntry.py	Sun Oct 21 14:53:23 2012 +0200
+++ b/TimeTracker/TimeTrackEntry.py	Sun Oct 21 15:33:36 2012 +0200
@@ -211,6 +211,16 @@
                                 .replace("\n", " ")\
                                 .replace("\r", " ")
     
+    def addDuration(self, duration):
+        """
+        Public method to add a duration.
+        
+        @param duration duration to be added in minutes (integer). Negative values
+            are ignored.
+        """
+        if duration > 0:
+            self.__duration += duration
+    
     def getEntryData(self):
         """
         Public method to get the entry data.
--- a/TimeTracker/TimeTracker.py	Sun Oct 21 14:53:23 2012 +0200
+++ b/TimeTracker/TimeTracker.py	Sun Oct 21 15:33:36 2012 +0200
@@ -191,6 +191,9 @@
             self.__entries[nextID] = entry
             nextID += 1
         
+        if self.__plugin.getPreferences("AutoSave"):
+            self.saveTrackerEntries()
+        
         if invalidCount != 0 or duplicateCount != 0:
             if invalidCount != 0 and duplicateCount != 0:
                 msg = self.tr("""<p>The time tracker file <b>{0}</b> contained"""
@@ -274,3 +277,62 @@
         """
         if eid in self.__entries:
             del self.__entries[eid]
+    
+    def removeDuplicateTrackerEntries(self):
+        """
+        Public slot to remove duplicate time tracker entries.
+        
+        If entries with the identical start date and time are found, the one
+        with the longest duration is kept.
+        """
+        entries = {}
+        for entry in self.__entries.values():
+            dt = entry.getStartDateTime()
+            if dt in entries:
+                if entry.getDuration() > entries[dt].getDuration():
+                    entries[dt] = entry
+            else:
+                entries[dt] = entry
+        
+        self.__entries = {}
+        nextID = 0
+        for entry in sorted(entries.values()):
+            entry.setID(nextID)
+            self.__entries[nextID] = entry
+            nextID += 1
+        
+        if self.__plugin.getPreferences("AutoSave"):
+            self.saveTrackerEntries()
+        
+        self.__widget.clear()
+        self.__widget.showTrackerEntries(sorted(self.__entries.values(), reverse=True))
+        self.__widget.setCurrentEntry(self.__currentEntry)
+    
+    def mergeDuplicateTrackerEntries(self):
+        """
+        Public slot to merge duplicate time tracker entries.
+        
+        If entries with the identical start date and time are found, the durations
+        of these entries are added.
+        """
+        entries = {}
+        for entry in self.__entries.values():
+            dt = entry.getStartDateTime()
+            if dt in entries:
+                entries[dt].addDuration(entry.getDuration())
+            else:
+                entries[dt] = entry
+        
+        self.__entries = {}
+        nextID = 0
+        for entry in sorted(entries.values()):
+            entry.setID(nextID)
+            self.__entries[nextID] = entry
+            nextID += 1
+        
+        if self.__plugin.getPreferences("AutoSave"):
+            self.saveTrackerEntries()
+        
+        self.__widget.clear()
+        self.__widget.showTrackerEntries(sorted(self.__entries.values(), reverse=True))
+        self.__widget.setCurrentEntry(self.__currentEntry)
--- a/TimeTracker/TimeTrackerWidget.py	Sun Oct 21 14:53:23 2012 +0200
+++ b/TimeTracker/TimeTrackerWidget.py	Sun Oct 21 15:33:36 2012 +0200
@@ -125,6 +125,9 @@
         menu.addAction(self.tr("Export Selected"), self.__exportSelectedEntries)\
             .setEnabled(len(self.entriesList.selectedItems()) != 0)
         menu.addAction(self.tr("Export All"), self.__exportEntries)
+        menu.addSeparator()
+        menu.addAction(self.tr("Remove duplicates"), self.__removeDuplicates)
+        menu.addAction(self.tr("Merge duplicates"), self.__mergeDuplicates)
         menu.exec_(QCursor.pos())
     
     def __editEntry(self):
@@ -222,6 +225,28 @@
         if ids:
             self.__exportEntries(ids=ids)
     
+    def __removeDuplicates(self):
+        """
+        Private slot to remove duplicate entries.
+        """
+        res = E5MessageBox.yesNo(self,
+            self.trUtf8("Remove Duplicate Tracker Entries"),
+            self.trUtf8("""Are you sure you want to remove duplicate tracker entries?"""
+                        """ Only the one with the longest duration will be kept."""))
+        if res:
+            self.__tracker.removeDuplicateTrackerEntries()
+    
+    def __mergeDuplicates(self):
+        """
+        Private slot to merge duplicate entries.
+        """
+        res = E5MessageBox.yesNo(self,
+            self.trUtf8("Merge Duplicate Tracker Entries"),
+            self.trUtf8("""Are you sure you want to merge duplicate tracker entries?"""
+                        """ The durations of duplicate ones will be added."""))
+        if res:
+            self.__tracker.mergeDuplicateTrackerEntries()
+    
     def __insertEntry(self, entry, index=-1):
         """
         Private method to insert a tracker entry into the list.

eric ide

mercurial