|
|
@@ -10,24 +10,22 @@ import os |
|
|
from modules.steps import Step,StepView |
|
|
from modules.steps import Step,StepView |
|
|
import xml.etree.ElementTree |
|
|
import xml.etree.ElementTree |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BeerXMLImport(FlaskView): |
|
|
class BeerXMLImport(FlaskView): |
|
|
|
|
|
|
|
|
BEER_XML_FILE = "./upload/beer.xml" |
|
|
BEER_XML_FILE = "./upload/beer.xml" |
|
|
|
|
|
|
|
|
@route('/', methods=['GET']) |
|
|
@route('/', methods=['GET']) |
|
|
def get(self): |
|
|
def get(self): |
|
|
if not os.path.exists(self.BEER_XML_FILE): |
|
|
if not os.path.exists(self.BEER_XML_FILE): |
|
|
self.api.notify(headline="File Not Found", message="Please upload a Beer.xml File", |
|
|
self.api.notify(headline="File Not Found", message="Please upload a Beer.xml File", |
|
|
type="danger") |
|
|
type="danger") |
|
|
return ('', 404) |
|
|
return ('', 404) |
|
|
|
|
|
result = [] |
|
|
|
|
|
|
|
|
|
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
result = [] |
|
|
result = [] |
|
|
for idx, r in enumerate(self.getDict().get("RECIPES").get("RECIPE")): |
|
|
|
|
|
result.append({"id": idx, "name": r.get("NAME")}) |
|
|
|
|
|
|
|
|
for idx, val in enumerate(e.findall('RECIPE')): |
|
|
|
|
|
result.append({"id": idx+1, "name": val.find("NAME").text}) |
|
|
return json.dumps(result) |
|
|
return json.dumps(result) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def allowed_file(self, filename): |
|
|
def allowed_file(self, filename): |
|
|
return '.' in filename and filename.rsplit('.', 1)[1] in set(['xml']) |
|
|
return '.' in filename and filename.rsplit('.', 1)[1] in set(['xml']) |
|
|
|
|
|
|
|
|
@@ -48,12 +46,11 @@ class BeerXMLImport(FlaskView): |
|
|
@route('/<int:id>', methods=['POST']) |
|
|
@route('/<int:id>', methods=['POST']) |
|
|
def load(self, id): |
|
|
def load(self, id): |
|
|
|
|
|
|
|
|
recipe = self.getDict().get("RECIPES").get("RECIPE")[id] |
|
|
|
|
|
steps = recipe.get("MASH",{}).get("MASH_STEPS",{}).get("MASH_STEP",[]) |
|
|
|
|
|
name = recipe.get("NAME") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
steps = self.getSteps(id) |
|
|
|
|
|
name = self.getRecipeName(id) |
|
|
self.api.set_config_parameter("brew_name", name) |
|
|
self.api.set_config_parameter("brew_name", name) |
|
|
boil_time = recipe.get("BOIL_TIME", 90) |
|
|
|
|
|
|
|
|
boil_time = self.getBoilTime(id) |
|
|
mashstep_type = cbpi.get_config_parameter("step_mash", "MashStep") |
|
|
mashstep_type = cbpi.get_config_parameter("step_mash", "MashStep") |
|
|
mash_kettle = cbpi.get_config_parameter("step_mash_kettle", None) |
|
|
mash_kettle = cbpi.get_config_parameter("step_mash_kettle", None) |
|
|
|
|
|
|
|
|
@@ -65,43 +62,38 @@ class BeerXMLImport(FlaskView): |
|
|
Step.delete_all() |
|
|
Step.delete_all() |
|
|
StepView().reset() |
|
|
StepView().reset() |
|
|
|
|
|
|
|
|
conn = None |
|
|
|
|
|
try: |
|
|
try: |
|
|
conn = sqlite3.connect(self.api.app.config['UPLOAD_FOLDER'] + '/kbh.db') |
|
|
|
|
|
c = conn.cursor() |
|
|
|
|
|
|
|
|
|
|
|
for row in steps: |
|
|
for row in steps: |
|
|
Step.insert(**{"name": row.get("NAME"), "type": mashstep_type, "config": {"kettle": mash_kettle, "temp": float(row.get("STEP_TEMP")), "timer": row.get("STEP_TIME")}}) |
|
|
|
|
|
|
|
|
Step.insert(**{"name": row.get("name"), "type": mashstep_type, "config": {"kettle": mash_kettle, "temp": float(row.get("temp")), "timer": row.get("timer")}}) |
|
|
Step.insert(**{"name": "ChilStep", "type": "ChilStep", "config": {"timer": 15}}) |
|
|
Step.insert(**{"name": "ChilStep", "type": "ChilStep", "config": {"timer": 15}}) |
|
|
## Add cooking step |
|
|
## Add cooking step |
|
|
Step.insert(**{"name": "Boil", "type": boilstep_type, "config": {"kettle": boil_kettle, "temp": boil_temp, "timer": boil_time}}) |
|
|
Step.insert(**{"name": "Boil", "type": boilstep_type, "config": {"kettle": boil_kettle, "temp": boil_temp, "timer": boil_time}}) |
|
|
## Add Whirlpool step |
|
|
## Add Whirlpool step |
|
|
Step.insert(**{"name": "Whirlpool", "type": "ChilStep", "config": {"timer": 15}}) |
|
|
Step.insert(**{"name": "Whirlpool", "type": "ChilStep", "config": {"timer": 15}}) |
|
|
# setBrewName(name) |
|
|
|
|
|
self.api.emit("UPDATE_ALL_STEPS", Step.get_all()) |
|
|
self.api.emit("UPDATE_ALL_STEPS", Step.get_all()) |
|
|
self.api.notify(headline="Recipe %s loaded successfully" % name, message="") |
|
|
self.api.notify(headline="Recipe %s loaded successfully" % name, message="") |
|
|
except Exception as e: |
|
|
except Exception as e: |
|
|
self.api.notify(headline="Failed to load Recipe", message=e.message, type="danger") |
|
|
self.api.notify(headline="Failed to load Recipe", message=e.message, type="danger") |
|
|
return ('', 500) |
|
|
return ('', 500) |
|
|
finally: |
|
|
|
|
|
if conn: |
|
|
|
|
|
conn.close() |
|
|
|
|
|
|
|
|
|
|
|
return ('', 204) |
|
|
return ('', 204) |
|
|
|
|
|
|
|
|
|
|
|
def getRecipeName(self, id): |
|
|
|
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
|
|
|
return e.find('./RECIPE[%s]/NAME' % (str(id))).text |
|
|
|
|
|
|
|
|
def getDict(self): |
|
|
|
|
|
''' |
|
|
|
|
|
Beer XML file to dict |
|
|
|
|
|
:return: beer.xml file as dict |
|
|
|
|
|
''' |
|
|
|
|
|
try: |
|
|
|
|
|
import xmltodict |
|
|
|
|
|
with open(self.BEER_XML_FILE) as fd: |
|
|
|
|
|
doc = xmltodict.parse(fd.read()) |
|
|
|
|
|
return doc |
|
|
|
|
|
except: |
|
|
|
|
|
self.api.notify(headline="Failed to load Beer.xml", message="Please check if you uploaded an beer.xml", type="danger") |
|
|
|
|
|
|
|
|
def getBoilTime(self, id): |
|
|
|
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
|
|
|
return float(e.find('./RECIPE[%s]/BOIL_TIME' % (str(id))).text) |
|
|
|
|
|
|
|
|
|
|
|
def getSteps(self, id): |
|
|
|
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
|
|
|
steps = [] |
|
|
|
|
|
for e in e.findall('./RECIPE[%s]/MASH/MASH_STEPS/MASH_STEP' % (str(id))): |
|
|
|
|
|
steps.append({"name": e.find("NAME").text, "temp": float(e.find("STEP_TEMP").text), "timer": float(e.find("STEP_TIME").text)}) |
|
|
|
|
|
|
|
|
|
|
|
return steps |
|
|
|
|
|
|
|
|
@cbpi.initalizer() |
|
|
@cbpi.initalizer() |
|
|
def init(cbpi): |
|
|
def init(cbpi): |
|
|
|