Sun, 21 Oct 2012 15:33:36 +0200
Implemented the remove and merge duplicate entries actions.
--- 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.