from grocy import RestService import html2text from grocy.commands import product from tabulate import tabulate from os import path class Recipe(object): GET_RECIPES = '/objects/recipes' GET_RECIPE = '/objects/recipes/{0}' GET_PRODUCT = '/objects/products/{0}' GET_RECIPES_POS = '/objects/recipes_pos' def __init__(self, id, **entries): self.id = id self.__dict__.update(entries) self._init_rest_service() self.products = [] #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.GET_RECIPES) 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 = self.rest_service.get(Recipe.GET_RECIPES_POS) products_for_recipe = [] for recipe_product in recipe_products: if recipe_product.get('recipe_id') == self.id: ## TODO: need to find a better way to run a batch call to get only products for recipe product = self.rest_service.get(Recipe.GET_PRODUCT.format(recipe_product.get('product_id'))) ## combined dict into single dict product_recipe_info = {k: v for combined_dict in [product, recipe_product] for k, v in combined_dict.items()} self.products.append(product_recipe_info) 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 get(self, include_products=False): try: recipe = self.rest_service.get(Recipe.GET_RECIPE.format(self.id)) if 'description' in recipe: recipe['description_txt'] = html2text.html2text(recipe['description'].strip()) self.__dict__.update(recipe) if include_products: self._get_products_by_recipe_id() except Exception as e: raise e