from grocy import RestService
import html2text
from grocy.models import Product, RecipePos
from grocy.models.schema import Schema
from tabulate import tabulate
from os import path
class Recipe(Schema):
def __init__(self, **entries):
self.fields = [
'name',
'picture_file_name', 'description',
'base_servings', 'desired_servings',
'not_check_shoppinglist', 'recipes_pos', 'products'
]
self.__dict__.update(entries)
self.recipes_pos = []
self.products = []
self._init_rest_service()
#self._set_default_table_formats()
#if not hasattr('tablefmt', self):
# self.tablefmt = None
#if not hasattr('colalign', self):
# self.colalign = None
def get_list(self):
try:
recipes = self.rest_service.get('recipe')
table_headers = ['#', 'Name']
table_entries = []
for recipe in recipes:
table_entry = [recipe.get('id'), recipe.get('name')]
table_entries.append(table_entry)
except Exception as e:
raise e
# Generate stock overview table
return tabulate(table_entries, headers=table_headers)
def _get_products_by_recipe_id(self):
recipe_products_info = self.rest_service.get('recipes_pos')
for recipe_product_info in recipe_products_info:
if recipe_product_info.get('recipe_id') == self.id:
## TODO: need to find a better way to run a batch call to get only products for recipe
product_info = self.rest_service.get('products', recipe_product_info.get('product_id'))
product = Product(**product_info)
product.id = recipe_product_info.get('product_id')
self.products.append(product)
recipe_pos = RecipePos(**recipe_product_info)
recipe_pos.id = recipe_product_info.get('id')
self.recipes_pos.append(recipe_pos)
def _set_default_table_formats(self):
if not hasattr('formats', self):
self.tablefmt = None
self.colalign = None
elif not hasattr('table', self.formats):
self.tableformat = None
elif not hasattr('col', self.formats):
self.colalign = None
# def _init_rest_service(self):
# if self.api.startswith == '/':
# self.api = self.api[1:]
# if self.api.endswith == '/':
# self.api = self.api[1:-1]
# self.rest_service = RestService(self.api, json=True)
# self.rest_service.addHeader('Content-Type', 'application/json')
# self.rest_service.addToken(self.token)
def toJSON(self):
obj = {}
for attr, value in self.__dict__.items():
isEmptyList = True if type(value) == list and len(value) == 0 else False
if attr in self.fields and not isEmptyList:
obj[attr] = value
return obj
def update(self):
try:
for item in self.products:
product = Product(**item)
self.rest_service.put('products', product, product.id)
#for item in self.recipes_pos:
# self.rest_service.put('recipes_pos', item)
updated_recipe = {
'description': self.description,
'name': self.name,
'base_servings': self.base_servings,
'desired_servings': self.desired_servings,
'not_check_shoppinglist': self.not_check_shoppinglist
}
self.rest_service.put('recipes', updated_recipe, self.id)
except Exception as e:
raise e
def create(self):
created_recipe = {
'description': self.description,
'name': self.name,
'base_servings': self.base_servings,
'desired_servings': self.desired_servings,
'not_check_shoppinglist': self.not_check_shoppinglist
}
self.rest_service.post('recipes', created_recipe)
def get(self, include_products=False):
try:
recipe = self.rest_service.get('recipes', id=self.id)
if 'description' in recipe:
recipe['description'] = html2text.html2text(recipe['description'].strip())
self.__dict__.update(recipe)
if include_products:
self._get_products_by_recipe_id()
except Exception as e:
raise e