From 104756b0791eb0bd93f87cbd3c33e91900cff236 Mon Sep 17 00:00:00 2001 From: OllisGit Date: Tue, 18 May 2021 09:29:06 +0200 Subject: [PATCH] New Version 1.13.1 - B #145, #143: Issues with manuell added print jobs (e.g. missing username, lastDate and total) --- octoprint_PrintJobHistory/DatabaseManager.py | 71 +++++++++++++++++-- .../api/PrintJobHistoryAPI.py | 1 + .../models/PrintJobModel.py | 7 +- .../js/PrintJobHistory-EditJobDialog.js | 18 +++-- .../static/js/PrintJobHistory.js | 40 +++++++---- .../test/test_PrintJobService.py | 15 ++-- setup.py | 2 +- 7 files changed, 124 insertions(+), 30 deletions(-) diff --git a/octoprint_PrintJobHistory/DatabaseManager.py b/octoprint_PrintJobHistory/DatabaseManager.py index 8f3c677..351f51e 100644 --- a/octoprint_PrintJobHistory/DatabaseManager.py +++ b/octoprint_PrintJobHistory/DatabaseManager.py @@ -21,7 +21,7 @@ FORCE_CREATE_TABLES = False SQL_LOGGING = True -CURRENT_DATABASE_SCHEME_VERSION = 5 +CURRENT_DATABASE_SCHEME_VERSION = 6 # List all Models MODELS = [PluginMetaDataModel, PrintJobModel, FilamentModel, TemperatureModel] @@ -73,7 +73,16 @@ def _createOrUpgradeSchemeIfNecessary(self): def _upgradeDatabase(self,currentDatabaseSchemeVersion, targetDatabaseSchemeVersion): - migrationFunctions = [self._upgradeFrom1To2, self._upgradeFrom2To3, self._upgradeFrom3To4, self._upgradeFrom4To5] + migrationFunctions = [self._upgradeFrom1To2, + self._upgradeFrom2To3, + self._upgradeFrom3To4, + self._upgradeFrom4To5, + self._upgradeFrom5To6, + self._upgradeFrom6To7, + self._upgradeFrom7To8, + self._upgradeFrom8To9, + self._upgradeFrom9To10 + ] for migrationMethodIndex in range(currentDatabaseSchemeVersion -1, targetDatabaseSchemeVersion -1): self._logger.info("Database migration from '" + str(migrationMethodIndex + 1) + "' to '" + str(migrationMethodIndex + 2) + "'") @@ -81,6 +90,56 @@ def _upgradeDatabase(self,currentDatabaseSchemeVersion, targetDatabaseSchemeVers pass pass + def _upgradeFrom9To10(self): + self._logger.info(" Starting 9 -> 10") + self._logger.info(" Successfully 9 -> 10") + pass + + def _upgradeFrom8To9(self): + self._logger.info(" Starting 8 -> 9") + self._logger.info(" Successfully 8 -> 9") + pass + + def _upgradeFrom7To8(self): + self._logger.info(" Starting 7 -> 8") + self._logger.info(" Successfully 7 -> 8") + pass + + def _upgradeFrom6To7(self): + self._logger.info(" Starting 6 -> 7") + self._logger.info(" Successfully 6 -> 7") + pass + + def _upgradeFrom5To6(self): + self._logger.info(" Starting 5 -> 6") + # What is changed: + # - FilamentModel: + # - renameing: + # profileVendor -> vendor + # spoolWeight -> weight + # (ALTER TABLE spo_spoolmodel RENAME COLUMN encloserTemperature to enclosureTemperature; not working SQLite did not support the ALTER TABLE RENAME COLUMN syntax before version 3.25.0. + # see https://www.sqlitetutorial.net/sqlite-rename-column/#:~:text=SQLite%20did%20not%20support%20the,the%20version%20lower%20than%203.25.) + + connection = sqlite3.connect(self._databaseFileLocation) + cursor = connection.cursor() + + sql = """ + PRAGMA foreign_keys=off; + BEGIN TRANSACTION; + + UPDATE 'pjh_filamentmodel' SET toolId='total' where toolId is NULL; + + UPDATE 'pjh_pluginmetadatamodel' SET value=6 WHERE key='databaseSchemeVersion'; + COMMIT; + PRAGMA foreign_keys=on; + """ + cursor.executescript(sql) + + connection.close() + self._logger.info(" Successfully 5 -> 6") + pass + + def _upgradeFrom4To5(self): self._logger.info(" Starting 4 -> 5") # What is changed: @@ -477,7 +536,8 @@ def calculatePrintJobsStatisticByQuery(self, tableQuery): printJobCount = printJobCount + 1 if (firstDate == None): firstDate = job.printStartDateTime - lastDate = job.printEndDateTime + if (job.printEndDateTime != None): + lastDate = job.printEndDateTime tempJobFileSize = job.fileSize if (tempJobFileSize == None): tempJobFileSize = 0 @@ -520,7 +580,10 @@ def calculatePrintJobsStatisticByQuery(self, tableQuery): # do formatting queryString = self._buildQueryString(tableQuery) - fromToString = firstDate.strftime('%d.%m.%Y %H:%M') + " - " + lastDate.strftime('%d.%m.%Y %H:%M') + lastDateString = "" + if (lastDate != None): + lastDateString = lastDate.strftime('%d.%m.%Y %H:%M') + fromToString = firstDate.strftime('%d.%m.%Y %H:%M') + " - " + lastDateString durationString = StringUtils.secondsToText(duration) lengthString = self._buildLengthString(length) weightString = self._buildWeightString(weight) diff --git a/octoprint_PrintJobHistory/api/PrintJobHistoryAPI.py b/octoprint_PrintJobHistory/api/PrintJobHistoryAPI.py index 4f515df..59942ed 100644 --- a/octoprint_PrintJobHistory/api/PrintJobHistoryAPI.py +++ b/octoprint_PrintJobHistory/api/PrintJobHistoryAPI.py @@ -40,6 +40,7 @@ class PrintJobHistoryAPI(octoprint.plugin.BlueprintPlugin): def _updatePrintJobFromJson(self, printJobModel, jsonData): # transfer header values + printJobModel.userName = self._getValueFromJSONOrNone("userName", jsonData) printJobModel.fileName = self._getValueFromJSONOrNone("fileName", jsonData) # printJobModel.filePathName = self._getValueFromJSONOrNone("fileName", jsonData) # pech printJobModel.printStartDateTime = StringUtils.transformToDateTimeOrNone(self._getValueFromJSONOrNone("printStartDateTimeFormatted", jsonData)) diff --git a/octoprint_PrintJobHistory/models/PrintJobModel.py b/octoprint_PrintJobHistory/models/PrintJobModel.py index cae321d..1ad8951 100644 --- a/octoprint_PrintJobHistory/models/PrintJobModel.py +++ b/octoprint_PrintJobHistory/models/PrintJobModel.py @@ -59,9 +59,12 @@ def getFilamentModels(self, withoutTotal = False): self._loadFilamentModels() allFilamentModels = self.filamentModelsByToolId.values() if (withoutTotal): - allFilamentModels[:] = [filamentModel for filamentModel in allFilamentModels if filamentModel.toolId != "total"] + newAllFilamentModels = [] + for filamentModel in allFilamentModels: + if filamentModel.toolId != "total": + newAllFilamentModels.append(filamentModel) + allFilamentModels = newAllFilamentModels pass - return allFilamentModels diff --git a/octoprint_PrintJobHistory/static/js/PrintJobHistory-EditJobDialog.js b/octoprint_PrintJobHistory/static/js/PrintJobHistory-EditJobDialog.js index f86a18e..f62a23a 100644 --- a/octoprint_PrintJobHistory/static/js/PrintJobHistory-EditJobDialog.js +++ b/octoprint_PrintJobHistory/static/js/PrintJobHistory-EditJobDialog.js @@ -4,6 +4,7 @@ function PrintJobHistoryEditDialog(){ var self = this; this.apiClient = null; + this.currentUser = null; this.editPrintJobItemDialog = null; this.printJobItemForEdit = null; @@ -193,6 +194,11 @@ function PrintJobHistoryEditDialog(){ } + /////////////////////////////////////////////////////////////////////////////////////////////////// SETTER + this.setCurrentUser = function(currentUser){ + this.currentUser = currentUser; + } + /////////////////////////////////////////////////////////////////////////////////////////////////// SHOW DIALOG this.showDialog = function(printJobItemForEdit, closeDialogHandler, fullEditMode){ @@ -314,7 +320,6 @@ function PrintJobHistoryEditDialog(){ return; } - var noteText = self.noteEditor.getText(); var noteDeltaFormat = self.noteEditor.getContents(); var noteHtml = self.noteEditor.getHtml(); @@ -322,6 +327,14 @@ function PrintJobHistoryEditDialog(){ self.printJobItemForEdit.noteDeltaFormat(noteDeltaFormat); self.printJobItemForEdit.noteHtml(noteHtml); + if (self.printJobItemForEdit.userName == null || + self.printJobItemForEdit.userName() == null || + self.printJobItemForEdit.userName().trim().length === 0){ + if (self.currentUser != null){ + self.printJobItemForEdit.userName(self.currentUser.name); + } + } + self.apiClient.callStorePrintJob(self.printJobItemForEdit.databaseId(), self.printJobItemForEdit, function(allPrintJobsResponse){ self.editPrintJobItemDialog.modal('hide'); self.closeDialogHandler(true); @@ -329,7 +342,6 @@ function PrintJobHistoryEditDialog(){ } - /////////////////////////////////////////////////////////////////////////////////////////////////// DELETE PRINT JOB this.deletePrintJobItem = function(){ var result = confirm("Do you really want to delete the print job?"); @@ -341,7 +353,6 @@ function PrintJobHistoryEditDialog(){ } } - /////////////////////////////////////////////////////////////////////////////////////////////////// DELETE IMAGE this.deleteImage = function(){ @@ -442,7 +453,6 @@ function PrintJobHistoryEditDialog(){ } } - this.cancelCaptureImage = function(){ self.imageDisplayMode(IMAGEDISPLAYMODE_SNAPSHOTIMAGE); self.captureButtonText.text(reCaptureText); diff --git a/octoprint_PrintJobHistory/static/js/PrintJobHistory.js b/octoprint_PrintJobHistory/static/js/PrintJobHistory.js index 07a5127..55d3141 100644 --- a/octoprint_PrintJobHistory/static/js/PrintJobHistory.js +++ b/octoprint_PrintJobHistory/static/js/PrintJobHistory.js @@ -139,25 +139,27 @@ $(function() { // result from backend this.allFilamentModels = updateData.filamentModels; - this.jsonArray = ko.observable(this.allFilamentModels); this.allToolKeys = Object.keys(this.allFilamentModels); this.isMultiToolPrint(Object.keys(this.allFilamentModels).length > 1) totalFilamentModel = updateData.filamentModels["total"]; // should always be present - this.diameter(totalFilamentModel.diameter); - this.density(totalFilamentModel.density); - this.material(totalFilamentModel.material); - this.vendor(totalFilamentModel.vendor); - this.spoolName(totalFilamentModel.spoolName); - this.spoolCost(totalFilamentModel.spoolCost); - this.spoolCostUnit(totalFilamentModel.spoolCostUnit); - this.weight(totalFilamentModel.weight); -// this.usedLength( formatFilamentLength(updateData.filamentEntity.usedLength) ); -// this.calculatedLength( formatFilamentLength(updateData.filamentEntity.calculatedLength) ); - this.usedLengthFormatted(totalFilamentModel.usedLengthFormatted ); - this.calculatedLengthFormatted(totalFilamentModel.calculatedLengthFormatted ); - this.usedWeight(totalFilamentModel.usedWeight ); - this.usedCost(totalFilamentModel.usedCost ); + // should never happen, but in the past we have some jobs where "total" is missing + if (totalFilamentModel != null){ + this.diameter(totalFilamentModel.diameter); + this.density(totalFilamentModel.density); + this.material(totalFilamentModel.material); + this.vendor(totalFilamentModel.vendor); + this.spoolName(totalFilamentModel.spoolName); + this.spoolCost(totalFilamentModel.spoolCost); + this.spoolCostUnit(totalFilamentModel.spoolCostUnit); + this.weight(totalFilamentModel.weight); + // this.usedLength( formatFilamentLength(updateData.filamentEntity.usedLength) ); + // this.calculatedLength( formatFilamentLength(updateData.filamentEntity.calculatedLength) ); + this.usedLengthFormatted(totalFilamentModel.usedLengthFormatted ); + this.calculatedLengthFormatted(totalFilamentModel.calculatedLengthFormatted ); + this.usedWeight(totalFilamentModel.usedWeight ); + this.usedCost(totalFilamentModel.usedCost ); + } } this.snapshotFilename(updateData.snapshotFilename); @@ -497,6 +499,14 @@ $(function() { } } + self.onUserLoggedIn = function(currentUser) { + self.printJobEditDialog.setCurrentUser(currentUser); + } + self.onUserLoggedOut = function() { + if (self.printJobEditDialog != null) { + self.printJobEditDialog.setCurrentUser(null); + } + } // receive data from server self.onDataUpdaterPluginMessage = function (plugin, data) { diff --git a/octoprint_PrintJobHistory/test/test_PrintJobService.py b/octoprint_PrintJobHistory/test/test_PrintJobService.py index 7dc351b..881fbd2 100644 --- a/octoprint_PrintJobHistory/test/test_PrintJobService.py +++ b/octoprint_PrintJobHistory/test/test_PrintJobService.py @@ -26,9 +26,7 @@ def init_database(self): self.databaseManager = DatabaseManager(testLogger, True) self.databaseManager.initDatabase(self.databaselocation, self._clientOutput) - - - def test_createPrintJob(self): + def _test_createPrintJob(self): self.databaseManager.deletePrintJob(1011) newPrintJob = self.printJobService.createWithDefaults() @@ -98,11 +96,20 @@ def test_createPrintJob(self): # - allTemperatures - # do test-cleanup for printJobDatabaseId in self.rollBackPrintJobs: self.databaseManager.deletePrintJob(printJobDatabaseId) + def test_readFilamentModels(self): + # - allFilaments + loadedPrintJobModel = self.printJobService.loadPrintJob(72) + allFilamentModels = loadedPrintJobModel.getFilamentModels() + self.assertEqual(len(allFilamentModels), 2, "'total' and 'tool0' filamentModel expected") + + loadedPrintJobModel = self.printJobService.loadPrintJob(72) + allFilamentModels = loadedPrintJobModel.getFilamentModels(withoutTotal=True) + self.assertEqual(len(allFilamentModels), 1, "'total' filamentModel expected") + if __name__ == '__main__': diff --git a/setup.py b/setup.py index c6d3232..26fdbec 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ plugin_name = "Print Job History" # The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module -plugin_version = "1.13.0" +plugin_version = "1.13.1" # The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin # module