def test_parseSettings(): gcodeForParsing = "../../testdata/slicer-settings/PRUSA_Treefrog_0.2mm_FLEX_MK3S_1h5m.gcode" testLogger = logging.getLogger("testLogger") settingsParser = SlicerSettingsParser(testLogger) slicerSettings = settingsParser.extractSlicerSettings( gcodeForParsing, ";(.*)=(.*)") assert slicerSettings.settingsAsText assert 245 == len(slicerSettings.settingsAsDict) assert "Printer Settings → Extruder 1" in StringUtils.to_native_str( slicerSettings.settingsAsText) assert "80°, I'm printing at 40°" in StringUtils.to_native_str( slicerSettings.settingsAsText) gcodeForParsing = "../../testdata/slicer-settings/CURA_schieberdeckel2.gcode" slicerSettings = settingsParser.extractSlicerSettings( gcodeForParsing, ";(.*)=(.*)") assert slicerSettings.settingsAsText assert 4 == len(slicerSettings.settingsAsDict) assert "Cura" in slicerSettings.settingsAsText assert "bottom_layers" in slicerSettings.settingsAsText print(" Test passed") pass
def formatValue(self, printJob, fieldName): costModel = printJob.getCosts() if (costModel == None): return "-" if (hasattr(costModel, fieldName) == False): return "-" valueToFormat = getattr(costModel, fieldName) if ("filamentCost" == fieldName or "electricityCost" == fieldName or "printerCost" == fieldName or "otherCost" == fieldName): if (valueToFormat != None and valueToFormat != "" and valueToFormat != "-"): valueToFormat = StringUtils.formatFloatSave( StringUtils.FLOAT_DEFAULT_FORMAT, valueToFormat, "-") if ("otherCost" == fieldName): otherCostLabel = "" if (StringUtils.isNotEmpty(costModel.otherCostLabel)): otherCostLabel = costModel.otherCostLabel valueToFormat = otherCostLabel + ":" + valueToFormat if valueToFormat is None or "" == valueToFormat: return "-" return valueToFormat
def formatValue(self, printJob, fieldName): # only support for total model totalFilamentModel = printJob.getFilamentModelByToolId("total") if (totalFilamentModel == None): return "-" if (hasattr(totalFilamentModel, fieldName) == False): return "-" valueToFormat = getattr(totalFilamentModel, fieldName) # append unit to value if ("usedCost" == fieldName and valueToFormat != None and valueToFormat != ""): valueToFormat = StringUtils.formatFloatSave(StringUtils.FLOAT_DEFAULT_FORMAT, valueToFormat, "-") if (hasattr(totalFilamentModel, "spoolCostUnit") == True and totalFilamentModel.spoolCostUnit != None): if (valueToFormat != "-"): if (isinstance(totalFilamentModel.spoolCostUnit, str)): valueToFormat = valueToFormat + totalFilamentModel.spoolCostUnit else: valueToFormat = valueToFormat + totalFilamentModel.spoolCostUnit.encode("utf-8") if ("usedLength" == fieldName or "calculatedLength" == fieldName or "usedWeight" == fieldName): if (valueToFormat != None and valueToFormat != "" and valueToFormat != "-"): valueToFormat = StringUtils.formatFloatSave(StringUtils.FLOAT_DEFAULT_FORMAT, valueToFormat, "-") if valueToFormat is None or "" == valueToFormat: return "-" return valueToFormat
def transformPrintJobModel(job): jobAsDict = job.__data__ jobAsDict["printStartDateTimeFormatted"] = job.printStartDateTime.strftime( '%d.%m.%Y %H:%M') if (job.printEndDateTime): jobAsDict["printEndDateTimeFormatted"] = job.printEndDateTime.strftime( '%d.%m.%Y %H:%M') # # Calculate duration # duration = job.printEndDateTime - job.printStartDateTime duration = job.duration durationFormatted = StringUtils.secondsToText(duration) jobAsDict["durationFormatted"] = durationFormatted allFilaments = job.loadFilamentFromAssoziation() if allFilaments != None: filamentDict = allFilaments.__data__ filamentDict["usedWeight"] = StringUtils.formatFloatSave( "{:.02f}", filamentDict["usedWeight"], "") filamentDict["usedLengthFormatted"] = StringUtils.formatFloatSave( "{:.02f}", convertMM2M(filamentDict["usedLength"]), "") filamentDict[ "calculatedLengthFormatted"] = StringUtils.formatFloatSave( "{:.02f}", convertMM2M(filamentDict["calculatedLength"]), "") filamentDict["usedCost"] = StringUtils.formatFloatSave( "{:.02f}", filamentDict["usedCost"], "") filamentDict["spoolVendor"] = filamentDict["profileVendor"] jobAsDict['filamentModel'] = filamentDict allTemperatures = job.getTemperaturesFromAssoziation() if not allTemperatures == None and len(allTemperatures) > 0: allTempsAsList = list() for temp in allTemperatures: tempAsDict = dict() tempAsDict["sensorName"] = temp.sensorName tempAsDict["sensorValue"] = temp.sensorValue allTempsAsList.append(tempAsDict) jobAsDict["temperatureModels"] = allTempsAsList jobAsDict["snapshotFilename"] = CameraManager.buildSnapshotFilename( job.printStartDateTime) # remove timedelta object, because could not transfered to client del jobAsDict["printStartDateTime"] del jobAsDict["printEndDateTime"] del jobAsDict["created"] del jobAsDict["filamentModel"]["created"] return jobAsDict
def getCSV(self, printJobModel): columnValue = self.formattorParser.formatValue(printJobModel, self.fieldName) columnValue = StringUtils.to_native_str(columnValue) return columnValue
def isPrintJobReprintable(fileManager, fileOrigin, filePathName, fileName): resultPrintJobPrintable = {} isRePrintable = False fullFileLocation = "" filePath = filePathName if StringUtils.isNotEmpty( filePathName) else fileName if (fileOrigin == None): # could be during csv import, assumption it is local fileOrigin = FileDestinations.LOCAL if (fileOrigin == FileDestinations.LOCAL): # local filesystem fullFileLocation = fileManager.path_on_disk(fileOrigin, filePath) isRePrintable = _isFileReadable(fullFileLocation) pass else: # sd-card # - no readable check (positiv thinking) isRePrintable = True fullFileLocation = fileOrigin + ":/" + filePath resultPrintJobPrintable["isRePrintable"] = isRePrintable resultPrintJobPrintable["fullFileLocation"] = fullFileLocation return resultPrintJobPrintable
def deletePrintJob(self, databaseId): databaseIdAsInt = StringUtils.transformToIntOrNone(databaseId) if (databaseIdAsInt == None): self._logger.error( "Could not delete PrintJob, because not a valid databaseId '" + str(databaseId) + "' maybe not a number") return None with self._database.atomic() as transaction: # Opens new transaction. try: # first delete relations n = FilamentModel.delete().where( FilamentModel.printJob == databaseIdAsInt).execute() n = TemperatureModel.delete().where( TemperatureModel.printJob == databaseIdAsInt).execute() n = CostModel.delete().where( CostModel.printJob == databaseIdAsInt).execute() PrintJobModel.delete_by_id(databaseIdAsInt) except Exception as e: # Because this block of code is wrapped with "atomic", a # new transaction will begin automatically after the call # to rollback(). transaction.rollback() self._logger.exception( "Could not delete printJob from database:" + str(e)) self.sendErrorMessageToClient( "PJH-DatabaseManager", "Could not delete the printjob ('" + str(databaseId) + "') from the database. See OctoPrint.log for details!") pass
def _updatePrintJobFromJson(self, printJobModel, jsonData): # transfer header values printJobModel.fileName = self._getValueFromJSONOrNone("fileName", jsonData) # printJobModel.filePathName = self._getValueFromJSONOrNone("fileName", jsonData) # pech printJobModel.printStartDateTime = StringUtils.transformToDateTimeOrNone(self._getValueFromJSONOrNone("printStartDateTimeFormatted", jsonData)) printJobModel.printEndDateTime = StringUtils.transformToDateTimeOrNone(self._getValueFromJSONOrNone("printEndDateTimeFormatted", jsonData)) printJobModel.duration = self._getValueFromJSONOrNone("duration", jsonData) printJobModel.printedHeight = self._getValueFromJSONOrNone("printedHeight", jsonData) printJobModel.printedLayers = self._getValueFromJSONOrNone("printedLayers", jsonData) # changable... printJobModel.printStatusResult = self._getValueFromJSONOrNone("printStatusResult", jsonData) printJobModel.noteText = self._getValueFromJSONOrNone("noteText", jsonData) printJobModel.noteDeltaFormat = json.dumps(self._getValueFromJSONOrNone("noteDeltaFormat", jsonData)) printJobModel.noteHtml = self._getValueFromJSONOrNone("noteHtml", jsonData) printJobModel.printedLayers = self._getValueFromJSONOrNone("printedLayers", jsonData) printJobModel.printedHeight = self._getValueFromJSONOrNone("printedHeight", jsonData) if (printJobModel.databaseId != None): filamentModel = printJobModel.loadFilamentFromAssoziation() else: filamentModel = printJobModel.allFilaments[0] filamentModel.profileVendor = self._getValueFromJSONOrNone("spoolVendor", jsonData) filamentModel.spoolName = self._getValueFromJSONOrNone("spoolName", jsonData) filamentModel.material = self._getValueFromJSONOrNone("material", jsonData) filamentModel.usedLength = self._convertM2MM(self._getValueFromJSONOrNone("usedLengthFormatted", jsonData)) filamentModel.calculatedLength = self._convertM2MM(self._getValueFromJSONOrNone("calculatedLengthFormatted", jsonData)) filamentModel.usedWeight = self._getValueFromJSONOrNone("usedWeight", jsonData) filamentModel.usedCost = self._getValueFromJSONOrNone("usedCost", jsonData) # temperatureModel = TemperatureModel if (printJobModel.databaseId != None): allTemperaturesModels = printJobModel.loadTemperaturesFromAssoziation() else: allTemperaturesModels = printJobModel.allTemperatures for tempModel in allTemperaturesModels: sensorName = StringUtils.to_native_str(tempModel.sensorName) if (sensorName == "bed"): newBedTemp = self._getValueFromJSONOrNone("temperatureBed", jsonData) tempModel.sensorValue = newBedTemp continue if (sensorName.startswith("tool")): newToolTemp = self._getValueFromJSONOrNone("temperatureNozzle", jsonData) tempModel.sensorValue = newToolTemp return printJobModel
def loadPrintJob(self, databaseId): databaseIdAsInt = StringUtils.transformToIntOrNone(databaseId) if (databaseIdAsInt == None): self._logger.error( "Could not load PrintJob, because not a valid databaseId '" + str(databaseId) + "' maybe not a number") return None return PrintJobModel.get_or_none(databaseIdAsInt)
def formatValue(self, printJob, fieldName): if (hasattr(printJob, fieldName) == False): return "-" valueToFormat = getattr(printJob, fieldName) if valueToFormat is None or "" == valueToFormat: return "-" adjustedValue = StringUtils.secondsToText(valueToFormat) return adjustedValue
def formatValue(self, printJob, fieldNames): if (hasattr(printJob, fieldNames[0]) == False): return "-" allFilamentModels = getattr(printJob, fieldNames[0]) if (allFilamentModels is None): allFilamentModels = printJob.filaments if (allFilamentModels is None or len(allFilamentModels) == 0): return "-" # only support for one model filamentModel = allFilamentModels[0] if (hasattr(filamentModel, fieldNames[1]) == False): return "-" valueToFormat = getattr(filamentModel, fieldNames[1]) # append unit to value if ("usedCost" == fieldNames[1] and valueToFormat != None and valueToFormat != ""): if (hasattr(filamentModel, "spoolCostUnit") == True and filamentModel.spoolCostUnit != None): valueToFormat = StringUtils.formatFloatSave( StringUtils.FLOAT_DEFAULT_FORMAT, valueToFormat, "-") if (valueToFormat != "-"): if (isinstance(filamentModel.spoolCostUnit, str)): valueToFormat = valueToFormat + filamentModel.spoolCostUnit else: valueToFormat = valueToFormat + filamentModel.spoolCostUnit.encode( "utf-8") if ("usedLength" == fieldNames[1] or "calculatedLength" == fieldNames[1] or "usedWeight" == fieldNames[1]): if (valueToFormat != None and valueToFormat != "" and valueToFormat != "-"): valueToFormat = StringUtils.formatFloatSave( StringUtils.FLOAT_DEFAULT_FORMAT, valueToFormat, "-") if valueToFormat is None or "" == valueToFormat: return "-" return valueToFormat
def formatValue(self, printJob, fieldName): if (hasattr(printJob, fieldName) == False): return "-" valueToFormat = getattr(printJob, fieldName) adjustedValue = valueToFormat if valueToFormat is not None else '-' if (type(adjustedValue) is int or type(adjustedValue) is float): adjustedValue = StringUtils.to_native_str(adjustedValue) adjustedValue = adjustedValue.replace('\n', ' ').replace('\r', '') return adjustedValue
def _toIntFromJSONOrNone(self, key, json): value = self._getValueFromJSONOrNone(key, json) if (value != None): if (StringUtils.isNotEmpty(value)): try: value = int(value) except Exception as e: errorMessage = str(e) self._logger.error("could not transform value '"+str(value)+"' for key '"+key+"' to int:" + errorMessage) value = None else: value = None return value
def formatValue(self, printJob, fieldName): if (hasattr(printJob, fieldName) == False): return "-" valueToFormat = getattr(printJob, fieldName) adjustedValue = valueToFormat if valueToFormat is not None else '-' if (type(adjustedValue) is int or type(adjustedValue) is float or type(adjustedValue) is str or type(adjustedValue) is unicode): adjustedValue = StringUtils.to_native_str(adjustedValue) adjustedValue = adjustedValue.replace('\n', ' ').replace('\r', '') else: # print("BOOOOOOMMMMM!!!!! "+str(type(adjustedValue))) adjustedValue = "#" # workaround to identify not correct mapped values return adjustedValue
def addFilamentModel(self, filamentModel): # check preconditions if (filamentModel == None): return if (StringUtils.isEmpty(filamentModel.toolId)): raise AttributeError( "You can only add a FilamentModel with an toolId") filamentModel.printJob = self if (self.filamentModelsByToolId == None or len(self.filamentModelsByToolId) == 0): self._loadFilamentModels() self.filamentModelsByToolId[filamentModel.toolId] = filamentModel pass
def on_sentGCodeHook(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **kwargs): # take snapshot an gcode command if (self._settings.get_boolean( [SettingsKeys.SETTINGS_KEY_TAKE_SNAPSHOT_ON_GCODE_COMMAND])): gcodePattern = self._settings.get([ SettingsKeys.SETTINGS_KEY_TAKE_SNAPSHOT_GCODE_COMMAND_PATTERN ]) commandAsString = StringUtils.to_native_str(cmd) if (commandAsString.startswith(gcodePattern)): self._cameraManager.takeSnapshotAsync( CameraManager.buildSnapshotFilename( self._currentPrintJobModel.printStartDateTime), self._sendErrorMessageToClient) pass pass
def parseAndAssignFieldValue(self, fieldLabel, fieldName, fieldValue, printJobModel, errorCollection, lineNumber): if ("" == fieldValue or "-" == fieldValue or fieldValue == None): # check if mandatory return try: if ("." in fieldValue): # looks like timestamp in format 22.340769225993427 durationInSeconds = int(fieldValue) setattr(printJobModel, fieldName, durationInSeconds) pass else: # looks like timestamp in format 1m3s durationInSeconds = StringUtils.durationToSeconds(fieldValue) setattr(printJobModel, fieldName, durationInSeconds) pass except Exception as e: errorMessage = str(e) errorCollection.append("["+str(lineNumber)+"]"+" Error parsing value '"+fieldValue+"' for field '"+fieldName+"': "+errorMessage) pass
def formatValue(self, printJob, fieldName): # only support for total model totalFilamentModel = printJob.getFilamentModelByToolId("total") if (totalFilamentModel == None): return "-" if (hasattr(totalFilamentModel, fieldName) == False): return "-" valueToFormat = getattr(totalFilamentModel, fieldName) if ("usedLength" == fieldName or "calculatedLength" == fieldName or "usedWeight" == fieldName): if (valueToFormat != None and valueToFormat != "" and valueToFormat != "-"): valueToFormat = StringUtils.formatFloatSave( StringUtils.FLOAT_DEFAULT_FORMAT, valueToFormat, "-") if valueToFormat is None or "" == valueToFormat: return "-" return valueToFormat
def transformPrintJobModel(job, fileManager): jobAsDict = job.__data__ jobAsDict["printStartDateTimeFormatted"] = job.printStartDateTime.strftime( '%d.%m.%Y %H:%M') if (job.printEndDateTime): jobAsDict["printEndDateTimeFormatted"] = job.printEndDateTime.strftime( '%d.%m.%Y %H:%M') # # Calculate duration # duration = job.printEndDateTime - job.printStartDateTime duration = job.duration durationFormatted = StringUtils.secondsToText(duration) jobAsDict["durationFormatted"] = durationFormatted allFilaments = job.getFilamentModels() if allFilaments != None: allFilamentDict = {} for filament in allFilaments: filamentDict = filament.__data__ filamentDict["usedWeight"] = StringUtils.formatFloatSave( "{:.02f}", filamentDict["usedWeight"], "") filamentDict["usedLengthFormatted"] = StringUtils.formatFloatSave( "{:.02f}", convertMM2M(filamentDict["usedLength"]), "") filamentDict[ "calculatedLengthFormatted"] = StringUtils.formatFloatSave( "{:.02f}", convertMM2M(filamentDict["calculatedLength"]), "") filamentDict["usedCost"] = StringUtils.formatFloatSave( "{:.02f}", filamentDict["usedCost"], "") # remove datetime, because not json serializable del filamentDict["created"] # put to overall model allFilamentDict[filamentDict["toolId"]] = filamentDict jobAsDict['filamentModels'] = allFilamentDict allTemperatures = job.getTemperatureModels() if not allTemperatures == None and len(allTemperatures) > 0: allTempsAsList = list() for temp in allTemperatures: tempAsDict = dict() tempAsDict["sensorName"] = temp.sensorName tempAsDict["sensorValue"] = temp.sensorValue allTempsAsList.append(tempAsDict) jobAsDict["temperatureModels"] = allTempsAsList jobAsDict["snapshotFilename"] = CameraManager.buildSnapshotFilename( job.printStartDateTime) # remove timedelta object, because could not transfered to client del jobAsDict["printStartDateTime"] del jobAsDict["printEndDateTime"] del jobAsDict["created"] # not the best approach to check this value here printJobReprintable = PrintJobUtils.isPrintJobReprintable( fileManager, job.fileOrigin, job.filePathName, job.fileName) jobAsDict["isRePrintable"] = printJobReprintable["isRePrintable"] jobAsDict["fullFileLocation"] = printJobReprintable["fullFileLocation"] return jobAsDict
def parseCSV(csvFile4Import, updateParsingStatus, errorCollection, logger, deleteAfterParsing=True): result = list() # List with printJobModels lineNumber = 0 try: with open(csvFile4Import) as csv_file: csv_reader = csv.reader(csv_file, delimiter=',') lineNumber = 0 for row in csv_reader: lineNumber += 1 # import time # time.sleep(1) updateParsingStatus(str(lineNumber)) if lineNumber == 1: # createColumnOrderFromHeader(row) # mandatoryFieldCount = 0 mandatoryFieldAvaiable = list() columnIndex = 0 for column in row: column = column.strip() if column in ALL_COLUMNS: columnOrderInFile[columnIndex] = ALL_COLUMNS[ column] if column in mandatoryFieldNames: mandatoryFieldAvaiable.append(column) # mandatoryFieldCount += 1 columnIndex += 1 if len(mandatoryFieldAvaiable) != len(mandatoryFieldNames): # if mandatoryFieldCount != len(mandatoryFieldNames): # identify missing files # mandatoryFieldMissing = mandatoryFieldNames - mandatoryFieldAvaiable mandatoryFieldMissing = list( set(mandatoryFieldNames) - set(mandatoryFieldAvaiable)) errorCollection.append( "Mandatory column is missing! <br/><b>'" + "".join(mandatoryFieldMissing) + "'</b><br/>") break else: # pre check, do we have values in the line? isEmptyLine = True for columnValue in row: if (StringUtils.isNotEmpty(columnValue)): isEmptyLine = False break if (isEmptyLine == True): # errorCollection.append("CSV Line: "+str(lineNumber)+" without values! <br/>") # just skip this line continue printJobModel = PrintJobModel() # parse line with header defined order columnIndex = 0 for columnValue in row: if columnIndex in columnOrderInFile: csvColumn = columnOrderInFile[columnIndex] if not csvColumn == None: columnValue = columnValue.strip() # check if mandatory value is missing if (len(columnValue) == 0): columnName = csvColumn.columnLabel if columnName in mandatoryFieldNames: errorCollection.append( "[" + str(lineNumber) + "] Mandatory value for column '" + columnName + "' is missing!") pass else: csvColumn.parseAndAssignFieldValue( columnValue, printJobModel, errorCollection, lineNumber) pass columnIndex += 1 if (len(errorCollection) != 0): logger.error("Reading error line '" + str(lineNumber) + "' in Column '" + column + "' ") else: result.append(printJobModel) pass except Exception as e: errorMessage = "CSV Parsing error. Line:'" + str( lineNumber) + "' Error:'" + str( e) + "' File:'" + csvFile4Import + "'" errorCollection.append(errorMessage) logger.error(errorMessage) finally: if (deleteAfterParsing): logger.info("Removing uploded csv temp-file") try: os.remove(csvFile4Import) except Exception: pass return result
def convert(value): result = StringUtils.to_native_str(value) print(result)
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)) printJobModel.printEndDateTime = StringUtils.transformToDateTimeOrNone( self._getValueFromJSONOrNone("printEndDateTimeFormatted", jsonData)) printJobModel.duration = self._getValueFromJSONOrNone( "duration", jsonData) printJobModel.printedHeight = self._getValueFromJSONOrNone( "printedHeight", jsonData) printJobModel.printedLayers = self._getValueFromJSONOrNone( "printedLayers", jsonData) # changable... printJobModel.printStatusResult = self._getValueFromJSONOrNone( "printStatusResult", jsonData) printJobModel.noteText = self._getValueFromJSONOrNone( "noteText", jsonData) printJobModel.noteDeltaFormat = json.dumps( self._getValueFromJSONOrNone("noteDeltaFormat", jsonData)) printJobModel.noteHtml = self._getValueFromJSONOrNone( "noteHtml", jsonData) printJobModel.printedLayers = self._getValueFromJSONOrNone( "printedLayers", jsonData) printJobModel.printedHeight = self._getValueFromJSONOrNone( "printedHeight", jsonData) filamentModelTotal = printJobModel.getFilamentModelByToolId("total") filamentModelTotal.vendor = self._getValueFromJSONOrNone( "vendor", jsonData) filamentModelTotal.spoolName = self._getValueFromJSONOrNone( "spoolName", jsonData) filamentModelTotal.material = self._getValueFromJSONOrNone( "material", jsonData) filamentModelTotal.usedLength = self._convertM2MM( self._getValueFromJSONOrNone("usedLengthFormatted", jsonData)) filamentModelTotal.calculatedLength = self._convertM2MM( self._getValueFromJSONOrNone("calculatedLengthFormatted", jsonData)) filamentModelTotal.usedWeight = self._getValueFromJSONOrNone( "usedWeight", jsonData) filamentModelTotal.usedCost = self._getValueFromJSONOrNone( "usedCost", jsonData) # temperatureModel = TemperatureModel if (printJobModel.databaseId != None): allTemperaturesModels = printJobModel.getTemperatureModels() else: allTemperaturesModels = printJobModel.allTemperatures for tempModel in allTemperaturesModels: sensorName = StringUtils.to_native_str(tempModel.sensorName) if (sensorName == "bed"): newBedTemp = self._getValueFromJSONOrNone( "temperatureBed", jsonData) tempModel.sensorValue = newBedTemp continue if (sensorName.startswith("tool")): newToolTemp = self._getValueFromJSONOrNone( "temperatureNozzle", jsonData) tempModel.sensorValue = newToolTemp # Costs (if present) totalCosts = self._toFloatFromJSONOrNone("totalCosts", jsonData) filamentCost = self._toFloatFromJSONOrNone("filamentCost", jsonData) electricityCost = self._toFloatFromJSONOrNone("electricityCost", jsonData) printerCost = self._toFloatFromJSONOrNone("printerCost", jsonData) otherCostLabel = self._getValueFromJSONOrNone("otherCostLabel", jsonData) otherCost = self._toFloatFromJSONOrNone("otherCost", jsonData) withDefaultSpoolValues = self._getValueFromJSONOrNone( "withDefaultSpoolValues", jsonData) if (totalCosts != None or filamentCost != None or electricityCost != None or printerCost != None or otherCost != None): # okay, we need to save the data, update or insert if (printJobModel.getCosts() == None): costs = CostModel() printJobModel.setCosts(costs) else: costs = printJobModel.getCosts() costs.totalCosts = totalCosts costs.filamentCost = filamentCost costs.electricityCost = electricityCost costs.printerCost = printerCost costs.otherCostLabel = otherCostLabel costs.otherCost = otherCost costs.withDefaultSpoolValues = withDefaultSpoolValues return printJobModel
def put_printjob(self, databaseId): jsonData = request.json printJobModel = None oldStartDateTimeIfChanged = None newStartDateTime = None if (databaseId == 'null'): printJobModel = PrintJobModel() filemanentModel = FilamentModel() filemanentModel.toolId = "total" printJobModel.addFilamentModel(filemanentModel) tempModel = TemperatureModel() tempModel.sensorName = "bed" printJobModel.addTemperatureModel(tempModel) tempModel = TemperatureModel() tempModel.sensorName = self._settings.get( [SettingsKeys.SETTINGS_KEY_DEFAULT_TOOL_ID]) printJobModel.addTemperatureModel(tempModel) else: printJobModel = self._databaseManager.loadPrintJob(databaseId) # check if the startDate is changed, if true -> change snapshot image as well currentStartDateTime = printJobModel.printStartDateTime newStartDateTime = StringUtils.transformToDateTimeOrNone( self._getValueFromJSONOrNone("printStartDateTimeFormatted", jsonData)) changed = currentStartDateTime != newStartDateTime if (changed): oldStartDateTimeIfChanged = currentStartDateTime try: self._cameraManager.renameSnapshotFilename( oldStartDateTimeIfChanged, newStartDateTime) except (Exception) as error: self._logger.error(error) message = errorMessage = str(error) self._sendDataToClient( dict( action="errorPopUp", title= "could not rename snapshot image to new startdatetime", message=message)) def imageRollbackHandler(): if (oldStartDateTimeIfChanged != None): # do rollback on snapshotimage filename try: self._cameraManager.renameSnapshotFilename( newStartDateTime, oldStartDateTimeIfChanged) except (Exception) as error: self._logger.error(error) message = errorMessage = str(error) self._sendDataToClient( dict( action="errorPopUp", title= "could not rename snapshot image to new startdatetime", message=message)) pass pass # transfer values from ui to the model self._updatePrintJobFromJson(printJobModel, jsonData) if (databaseId == 'null'): self._databaseManager.insertPrintJob(printJobModel) else: self._databaseManager.updatePrintJob(printJobModel, imageRollbackHandler) return flask.jsonify()
def _test_createPrintJob(self): self.databaseManager.deletePrintJob(1011) newPrintJob = self.printJobService.createWithDefaults() # check # - databaseId # - filament total self.assertEqual(newPrintJob.databaseId, None, "Model already persistence!") totalFilament = newPrintJob.getFilamentModelByToolId("total") self.assertEqual(totalFilament.toolId, "total") # create data newPrintJob.userName = "******" newPrintJob.fileOrigin = "local" newPrintJob.fileName = "OllisBenchy.gcode" newPrintJob.filePathName = "archive/OllisBenchy.gcode" newPrintJob.fileSize = 1234 newPrintJob.printStartDateTime = StringUtils.transformToDateTimeOrNone( "12.03.2013 14:45") newPrintJob.printEndDateTime = StringUtils.transformToDateTimeOrNone( "12.03.2013 16:45") newPrintJob.duration = DateTimeUtils.calcDurationInSeconds( newPrintJob.printEndDateTime, newPrintJob.printStartDateTime) newPrintJob.printStatusResult = "failed" newPrintJob.noteText = "Hello World" newPrintJob.noteDeltaFormat = "Something" newPrintJob.noteHtml = "<p>Hello World</p>" newPrintJob.printedLayers = "10 / 133" newPrintJob.printedHeight = "1.3 / 143.3" newPrintJob.slicerSettingsAsText = "dummy slicer settings" newFilamentModel = FilamentModel() newFilamentModel.toolId = "tool0" newPrintJob.addFilamentModel(newFilamentModel) newTemperatureModel = TemperatureModel() newTemperatureModel.sensorName = "tool0" newTemperatureModel.sensorValue = "123C" newPrintJob.addTemperatureModel(newTemperatureModel) # store self.printJobService.savePrintJob(newPrintJob) databaseId = newPrintJob.databaseId self.rollBackPrintJobs.append(databaseId) # load again and check if everything is in loadedPrintJobModel = self.printJobService.loadPrintJob(databaseId) self.assertEqual(loadedPrintJobModel.databaseId, newPrintJob.databaseId) self.assertEqual(loadedPrintJobModel.userName, newPrintJob.userName) self.assertEqual(loadedPrintJobModel.fileOrigin, newPrintJob.fileOrigin) self.assertEqual(loadedPrintJobModel.fileName, newPrintJob.fileName) self.assertEqual(loadedPrintJobModel.filePathName, newPrintJob.filePathName) self.assertEqual(loadedPrintJobModel.fileSize, newPrintJob.fileSize) self.assertEqual(loadedPrintJobModel.printStartDateTime, newPrintJob.printStartDateTime) self.assertEqual(loadedPrintJobModel.printEndDateTime, newPrintJob.printEndDateTime) self.assertEqual(loadedPrintJobModel.duration, newPrintJob.duration) self.assertEqual(loadedPrintJobModel.printStatusResult, newPrintJob.printStatusResult) self.assertEqual(loadedPrintJobModel.noteText, newPrintJob.noteText) self.assertEqual(loadedPrintJobModel.noteDeltaFormat, newPrintJob.noteDeltaFormat) self.assertEqual(loadedPrintJobModel.noteHtml, newPrintJob.noteHtml) self.assertEqual(loadedPrintJobModel.printedLayers, newPrintJob.printedLayers) self.assertEqual(loadedPrintJobModel.slicerSettingsAsText, newPrintJob.slicerSettingsAsText) # check-assos # - allFilaments allFilamentModels = loadedPrintJobModel.getFilamentModels() self.assertEqual(len(allFilamentModels), 2, "'total' and 'tool0' filamentModel expected") # - allTemperatures allTemperatureModels = loadedPrintJobModel.getTemperatureModels() self.assertEqual(len(allTemperatureModels), 1, "temperatureModels expected") # - allTemperatures # do test-cleanup for printJobDatabaseId in self.rollBackPrintJobs: self.databaseManager.deletePrintJob(printJobDatabaseId)
def calculatePrintJobsStatisticByQuery(self, tableQuery): printJobCount = 0 duration = 0 length = 0.0 weight = 0.0 fileSize = 0 statusDict = dict() materialDict = dict() spoolDict = dict() firstDate = None lastDate = None newTableQuery = tableQuery.copy() newTableQuery["sortColumn"] = "printStartDateTime" newTableQuery["sortOrder"] = "asc" newTableQuery["from"] = 0 newTableQuery["to"] = 999999 allJobModels = self.loadPrintJobsByQuery(newTableQuery) for job in allJobModels: printJobCount = printJobCount + 1 if (firstDate == None): firstDate = job.printStartDateTime if (job.printEndDateTime != None): lastDate = job.printEndDateTime tempJobFileSize = job.fileSize if (tempJobFileSize == None): tempJobFileSize = 0 fileSize = fileSize + tempJobFileSize duration = duration + job.duration statusResult = job.printStatusResult if (statusResult in statusDict): currentCount = statusDict[statusResult] currentCount = currentCount + 1 statusDict[statusResult] = currentCount else: statusDict[statusResult] = 1 allFilaments = job.getFilamentModels() if allFilaments != None: for filla in allFilaments: if filla.toolId == "total": # exclude totals, otherwise everything is counted twice continue if (StringUtils.isEmpty(filla.usedLength) == False): length = length + filla.usedLength if (StringUtils.isEmpty(filla.usedWeight) == False): weight = weight + filla.usedWeight if (StringUtils.isEmpty(filla.spoolName) == False): # spoolsSet.add(filla.spoolName) if (filla.spoolName in spoolDict): currentCount = spoolDict[filla.spoolName] currentCount = currentCount + 1 spoolDict[filla.spoolName] = currentCount else: spoolDict[filla.spoolName] = 1 if (StringUtils.isEmpty(filla.material) == False): # materialsSet.add(filla.material) if (filla.material in materialDict): currentCount = materialDict[filla.material] currentCount = currentCount + 1 materialDict[filla.material] = currentCount else: materialDict[filla.material] = 1 # do formatting queryString = self._buildQueryString(tableQuery) 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) statusString = self._buildStatusString(statusDict) materialString = self._buildDictlString(materialDict) spoolString = self._buildDictlString(spoolDict) fileSizeString = StringUtils.get_formatted_size(fileSize) return { "printJobCount": printJobCount, "query": queryString, "fromToDate": fromToString, "duration": durationString, "usedLength": lengthString, "usedWeight": weightString, "fileSize": fileSizeString, "printStatus": statusString, "material": materialString, "spools": spoolString }
def _buildWeightString(self, weight): weightString = StringUtils.formatFloatSave("{:.02f}", weight, "-") if (weightString != "-"): weightString = weightString + "g" return weightString
def _buildLengthString(self, length): lengthString = StringUtils.formatFloatSave("{:.02f}", TransformPrintJob2JSON.convertMM2M(length), "-") if (lengthString != "-"): lengthString = lengthString + "m" return lengthString
def calculatePrintJobsStatisticByQuery(self, tableQuery): duration = 0 length = 0.0 weight = 0.0 fileSize = 0 statusDict = dict() materialDict = dict() spoolDict = dict() firstDate = None lastDate = None newTableQuery = tableQuery.copy() newTableQuery["sortColumn"] = "printStartDateTime" newTableQuery["sortOrder"] = "asc" allJobModels = self.loadPrintJobsByQuery(newTableQuery) for job in allJobModels: if (firstDate == None): firstDate = job.printStartDateTime lastDate = job.printEndDateTime fileSize = fileSize + job.fileSize duration = duration + job.duration statusResult = job.printStatusResult if (statusResult in statusDict): currentCount = statusDict[statusResult] currentCount = currentCount + 1 statusDict[statusResult] = currentCount else: statusDict[statusResult] = 1 job.loadFilamentFromAssoziation() allFilaments = job.allFilaments if allFilaments != None: for filla in allFilaments: if (StringUtils.isEmpty(filla.usedLength) == False): length = length + filla.usedLength if (StringUtils.isEmpty(filla.usedWeight) == False): weight = weight + filla.usedWeight if (StringUtils.isEmpty(filla.spoolName) == False): # spoolsSet.add(filla.spoolName) if (filla.spoolName in spoolDict): currentCount = spoolDict[filla.spoolName] currentCount = currentCount + 1 spoolDict[filla.spoolName] = currentCount else: spoolDict[filla.spoolName] = 1 if (StringUtils.isEmpty(filla.material) == False): # materialsSet.add(filla.material) if (filla.material in materialDict): currentCount = materialDict[filla.material] currentCount = currentCount + 1 materialDict[filla.material] = currentCount else: materialDict[filla.material] = 1 # do formatting queryString = self._buildQueryString(tableQuery) fromToString = firstDate.strftime('%d.%m.%Y %H:%M') + " - " + lastDate.strftime('%d.%m.%Y %H:%M') durationString = StringUtils.secondsToText(duration) lengthString = self._buildLengthString(length) weightString = self._buildWeightString(weight) statusString = self._buildStatusString(statusDict) materialString = self._buildDictlString(materialDict) spoolString = self._buildDictlString(spoolDict) fileSizeString = StringUtils.get_formatted_size(fileSize) return { "query": queryString, "fromToDate": fromToString, "duration": durationString, "usedLength": lengthString, "usedWeight": weightString, "fileSize": fileSizeString, "printStatus": statusString, "material": materialString, "spools": spoolString }