Beispiel #1
0
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
Beispiel #2
0
    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
Beispiel #3
0
	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
Beispiel #5
0
    def getCSV(self, printJobModel):
        columnValue = self.formattorParser.formatValue(printJobModel,
                                                       self.fieldName)

        columnValue = StringUtils.to_native_str(columnValue)

        return columnValue
Beispiel #6
0
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)
Beispiel #10
0
    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
Beispiel #11
0
    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
Beispiel #12
0
    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
Beispiel #15
0
    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
Beispiel #18
0
    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
Beispiel #20
0
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)
Beispiel #22
0
    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
Beispiel #23
0
    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
		}