Skip to content

Commit

Permalink
RC3
Browse files Browse the repository at this point in the history
fix #2, renaming of Pluginname
fix #5, csv-export of accent characters
improved #4, text in plugin dependency check
  • Loading branch information
OllisGit committed Nov 15, 2019
1 parent 14c634a commit 6bdedeb
Show file tree
Hide file tree
Showing 19 changed files with 242 additions and 695 deletions.
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

# WORK IN PROGRESS!!!!

# Release Candidate is out (rc2.1)
# Release Candidate is out (rc3)

[![Version](https://img.shields.io/badge/dynamic/json.svg?color=brightgreen&label=version&url=https://api.github.com/repos/OllisGit/OctoPrint-PrintJobHistory/releases&query=$[0].name)]()
[![Released](https://img.shields.io/badge/dynamic/json.svg?color=brightgreen&label=released&url=https://api.github.com/repos/OllisGit/OctoPrint-PrintJobHistory/releases&query=$[0].published_at)]()
![GitHub Releases (by Release)](https://img.shields.io/github/downloads/OllisGit/OctoPrint-PrintJobHistory/latest/total.svg)

The OctoPrint Plugin stores all print-job informations of a print in a database
The OctoPrint-Plugin stores all print-job informations of a print in a database

#### Current implementation for Plugin-Manager URL:
https://github.com/OllisGit/OctoPrint-PrintJobHistory/releases/latest/download/master.zip
Expand Down Expand Up @@ -40,7 +40,7 @@ should include the following features:
- [x] Filament cost

### UI features
- [ ] Better error-feedback (more then just the "happy-path")
- [x] Better error-feedback (more then just the "happy-path")
- [x] List all printjobs
- [x] Edit single printjob
- [x] Capture/Upload Image
Expand All @@ -56,7 +56,9 @@ should include the following features:


## Planning Release #2, ...
....to be done.... see Planning Board: https://github.com/OllisGit/OctoPrint-PrintJobHistory/projects/1
....to be done.... see:
- Poll: "What is the next big thing?" https://github.com/OllisGit/OctoPrint-PrintJobHistory/issues/6
- Planning Board: https://github.com/OllisGit/OctoPrint-PrintJobHistory/projects/1

## Screenshots
![plugin-settings](screenshots/plugin-settings.png "Plugin-Settings")
Expand Down
48 changes: 20 additions & 28 deletions octoprint_PrintJobHistory/CameraManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,23 @@
from PIL import Image
from PIL import ImageFile

import logging
import os.path
import StringIO


class CameraManager(object):

def __init__(self):

def __init__(self, parentLogger):
self._logger = logging.getLogger(parentLogger.name + "." + self.__class__.__name__)
self._streamUrl = None
self._snapshotUrl = None

self._snapshotStoragePath = None

@staticmethod
def doSomething():
print("Hallo Welt")
print("Hello World")

@staticmethod
def buildSnapshotFilename(startDateTime):
Expand All @@ -33,14 +34,20 @@ def buildSnapshotFilename(startDateTime):

# def initCamera(self, enabled, streamUrl, snapshotUrl, snapshotStoragePath, pluginBaseFolder, rotate = None, flipH = None, flipV = None):
def initCamera(self, pluginDataBaseFolder, pluginBaseFolder, globalSettings):
self._logger.info("Init CameraManager")

snapshotStoragePath = pluginDataBaseFolder + "/snapshots"
if not os.path.exists(snapshotStoragePath):
os.makedirs(snapshotStoragePath)
self._logger.info("Snapshot-Folderr:"+snapshotStoragePath)

self._snapshotStoragePath = snapshotStoragePath
self._pluginBaseFolder = pluginBaseFolder
self._globalSettings = globalSettings

self._logger.info("Done CameraMenager")


def getSnapshotFileLocation(self):
return self._snapshotStoragePath

Expand All @@ -50,7 +57,6 @@ def getSnapshotFileLocation(self):
# self._globalSettings.global_get(["webcam", "webcamEnabled"])



def buildSnapshotFilenameLocation(self, snapshotFilename, returnDefaultImage = True):
if str(snapshotFilename).endswith(".jpg"):
imageLocation = self._snapshotStoragePath + "/" + snapshotFilename
Expand All @@ -71,32 +77,34 @@ def deleteSnapshot(self, snapshotFilename):

if os.path.isfile(imageLocation):
os.remove(imageLocation)

self._logger.info("Snapshot '" + imageLocation + "' deleted")

def takeSnapshot(self, snapshotFilename):

if str(snapshotFilename).endswith(".jpg"):
snapshotFilename = self._snapshotStoragePath + "/" +snapshotFilename
else:
snapshotFilename = self._snapshotStoragePath + "/" +snapshotFilename + ".jpg"

snapshotThumbnailFilename = self._snapshotStoragePath + "/" +snapshotFilename+ "-thumbnail.jpg"


# streamUrl = self._settings.global_get(["webcam", "stream"])
snapshotUrl = self._globalSettings.global_get(["webcam", "snapshot"])
self._logger.info("Try taking snapshot '" + snapshotFilename + "' from '" + snapshotUrl + "'")
if (snapshotUrl == None or snapshotUrl == ""):
return

rotate = self._globalSettings.global_get(["webcam", "rotate90"])
flipH = self._globalSettings.global_get(["webcam", "flipH"])
flipV = self._globalSettings.global_get(["webcam", "flipV"])


response = requests.get(snapshotUrl, verify=not True,timeout=float(120))
if response.status_code == requests.codes.ok:

self._logger.info("Process snapshot image")
with i_open(snapshotFilename, 'wb') as snapshot_file:
for chunk in response.iter_content(1024):
if chunk:
snapshot_file.write(chunk)
print("image downloaded")

# adjust orientation
if flipH or flipV or rotate:
Expand All @@ -110,6 +118,7 @@ def takeSnapshot(self, snapshotFilename):
image = image.transpose(Image.ROTATE_90)
# output = StringIO.StringIO()
image.save(snapshotFilename, format="JPEG")
self._logger.info("Image stored to '" + snapshotFilename + "'")
# data = output.getvalue()
# output.close()

Expand All @@ -124,27 +133,10 @@ def takeSnapshot(self, snapshotFilename):
# hsize = int((float(img.size[1]) * float(wpercent)))
# img = img.resize((basewidth, hsize), Image.ANTIALIAS)
# img.save(snapshotThumbnailFilename, "JPEG")
else:
self._logger.error("Invalid response code from snapshot-url. Code:" + str(response.status_code))

def takeSnapshotAsync(self, snapshotFilename):
thread = threading.Thread(name='TakeSnapshot', target=self.takeSnapshot, args=(snapshotFilename,))
thread.daemon = True
thread.start()




calc = 5065.81694999996
# %.02fm"
# {:06.2f}
mystring = "{:.02f}m".format(calc)
print(mystring)

# print("hallo welt")
# url = "http://192.168.178.44:8080/shot.jpg"
# targetPath = "/Users/o0632/Library/Application Support/OctoPrint/data/PrintJobHistory/"
# targetPathThumb = "/Users/o0632/Library/Application Support/OctoPrint/data/PrintJobHistory/myImage-Thumb.jpg"
""""
cam = CameraManager()
cam.initWebCam(url, targetPath)
cam.createSnapshot(815, "bild.gcode")
"""
58 changes: 36 additions & 22 deletions octoprint_PrintJobHistory/DatabaseManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,13 @@
import os
import sqlite3

from octoprint_PrintJobHistory.WrappedLoggingHandler import WrappedLoggingHandler
from octoprint_PrintJobHistory.models.FilamentModel import FilamentModel
from octoprint_PrintJobHistory.models.PrintJobModel import PrintJobModel
from octoprint_PrintJobHistory.models.PluginMetaDataModel import PluginMetaDataModel
from octoprint_PrintJobHistory.models.TemperatureModel import TemperatureModel
from peewee import *

from peewee import BackrefAccessor

from .entities.PrintJobEntity import PrintJobEntity
from .entities.FilamentEntity import FilamentEntity
from .entities.TemperatureEntity import TemperatureEntity
from .entities.PluginMetaDataEntity import PluginMetaDataEntity

from datetime import datetime

FORCE_CREATE_TABLES = False
SQL_LOGGING = True
Expand All @@ -31,10 +24,13 @@

class DatabaseManager(object):

def __init__(self):
self._logger = logging.getLogger(__name__)
def __init__(self, parentLogger):
self._logger = logging.getLogger(parentLogger.name + "." + self.__class__.__name__)
self._sqlLogger = logging.getLogger(parentLogger.name + "." + self.__class__.__name__ + ".SQL")

self._database = None
self._databaseFileLocation = None
self._sendDataToClient = None

################################################################################################## private functions

Expand All @@ -46,15 +42,18 @@ def _createOrUpgradeSchemeIfNecessary(self):
except Exception as e:
errorMessage = e.message
if errorMessage.startswith("no such table"):

self._logger.info("Create database-table, because didn't exists")
self._createDatabaseTables()
else:
print(str(e))
self._logger.error(str(e))

if not schemeVersionFromDatabaseModel == None:
currentDatabaseSchemeVersion = int(schemeVersionFromDatabaseModel.value)
if (currentDatabaseSchemeVersion < CURRENT_DATABASE_SCHEME_VERSION):
# evautate upgrade steps (from 1-2 , 1...6)
print("We need to upgrade the database scheme from: '" + str(currentDatabaseSchemeVersion) + "' to: '" + str(CURRENT_DATABASE_SCHEME_VERSION) + "'")
self._logger.info("We need to upgrade the database scheme from: '" + str(currentDatabaseSchemeVersion) + "' to: '" + str(CURRENT_DATABASE_SCHEME_VERSION) + "'")
self._logger.info("...not needed/implemented...")
pass
pass

Expand All @@ -66,35 +65,48 @@ def _createOrUpgradeSchemeIfNecessary(self):
# # sql
# pass
def _createDatabaseTables(self):
self._logger.info("Creating new database tables for printjob-plugin")
self._database.connect(reuse_if_open=True)
self._database.drop_tables(MODELS)
self._database.create_tables(MODELS)

PluginMetaDataModel.create(key=PluginMetaDataModel.KEY_DATABASE_SCHEME_VERSION, value=CURRENT_DATABASE_SCHEME_VERSION)
self._database.close()
self._logger.info("Database tables created")

################################################################################################### public functions
# datapasePath '/Users/o0632/Library/Application Support/OctoPrint/data/PrintJobHistory'
def initDatabase(self, databasePath):

def initDatabase(self, databasePath, sendErrorMessageToClient):
self._logger.info("Init DatabaseManager")
self.sendErrorMessageToClient = sendErrorMessageToClient
self._databaseFileLocation = os.path.join(databasePath, "printJobHistory.db")
self._logger.info("Creating new database in: " + str(self._databaseFileLocation))

self._logger.info("Creating database in: " + str(self._databaseFileLocation))
if SQL_LOGGING == True:
import logging
logger = logging.getLogger('peewee')
# we need only the single logger without parent
logger.parent = None
# logger.addHandler(logging.StreamHandler())
# activate SQL logging on PEEWEE side and on PLUGIN side
logger.setLevel(logging.DEBUG)
self._sqlLogger.setLevel(logging.DEBUG)

wrappedHandler = WrappedLoggingHandler(self._sqlLogger)
logger.addHandler(wrappedHandler)


self._database = SqliteDatabase(self._databaseFileLocation)
DatabaseManager.db = self._database
self._database.bind(MODELS)

if FORCE_CREATE_TABLES:
self._logger.info("Creating new database-tables, because FORCE == TRUE!")
self._createDatabaseTables()
else:
# check, if we need an scheme upgrade
self._logger.info("Check if database-scheme upgrade needed.")
self._createOrUpgradeSchemeIfNecessary()
self._logger.info("Done DatabaseManager")
pass

def getDatabaseFileLocation(self):
Expand Down Expand Up @@ -124,7 +136,8 @@ def insertPrintJob(self, printJobModel):
# to rollback().
transaction.rollback()
self._logger.exception("Could not insert printJob into database:" + str(e))
# TODO Inform user about exception

self.sendErrorMessageToClient("DatabaseManager", "Could not insert the printjob into the database. See OctoPrint.log for details!")
pass

return databaseId
Expand All @@ -136,9 +149,9 @@ def updatePrintJob(self, printJobModel):
databaseId = printJobModel.get_id()
# save all relations
# - Filament
# for filamentModel in printJobModel.getFilamentModels():
# filamentModel.printJob = printJobModel
# filamentModel.save()
for filamentModel in printJobModel.getFilamentModels():
filamentModel.save()

# # - Temperature
# for temperatureModel in printJobModel.getTemperatureModels():
# temperatureModel.printJob = printJobModel
Expand All @@ -149,7 +162,7 @@ def updatePrintJob(self, printJobModel):
# to rollback().
transaction.rollback()
self._logger.exception("Could not update printJob into database:" + str(e))
# TODO Inform user about exception
self.sendErrorMessageToClient("DatabaseManager", "Could not update the printjob ('"+ printJobModel.fileName +"') into the database. See OctoPrint.log for details!")
pass

def countPrintJobsByQuery(self, tableQuery):
Expand Down Expand Up @@ -219,5 +232,6 @@ def deletePrintJob(self, databaseId):
# to rollback().
transaction.rollback()
self._logger.exception("Could not delete printJob from database:" + str(e))
# TODO Inform user about exception

self.sendErrorMessageToClient("DatabaseManager", "Could not update the printjob ('"+ str(databaseId) +"') into the database. See OctoPrint.log for details!")
pass
Loading

0 comments on commit 6bdedeb

Please sign in to comment.