diff --git a/grocy/cli.py b/grocy/cli.py index 14258d8..d231a9d 100644 --- a/grocy/cli.py +++ b/grocy/cli.py @@ -1,5 +1,3 @@ -""" -""" import logging import click from markdown import markdown @@ -13,6 +11,7 @@ from grocy.table import Table from grocy.entity import Entity from grocy.stock import Stock from grocy.schema import get_schema +from grocy.shoppinglist import ShoppingList import yaml from sys import exit from os import path @@ -433,7 +432,6 @@ def add_ingredient(recipe_id, template): # Add quantity_units to meta ingredient = click.edit(loaded_template.render(), extension='.yml') if ingredient is None: - return parsed_new_ingredient = util.load_yaml(ingredient)[0] parsed_new_ingredient['recipe_id'] = recipe_id @@ -465,6 +463,7 @@ def remove_ingredient(recipe_id, ingredient_id): def shopping(ctx): pass + @shopping.command() @click.pass_context @click.argument('shopping_id', required=False) @@ -486,7 +485,7 @@ def view(ctx, shopping_id, template): entity = Entity(name='products') products = entity.get() products_map = {product['id']: product for product in products} - for shopping_list_item in shopping_list_items: + for shopping_list_item in shopping_list_items: shopping_product_item = products_map[shopping_list_item['product_id']] shopping_list_item['product'] = shopping_product_item data['fields']['shopping_list_items'].append(shopping_list_item) @@ -503,6 +502,7 @@ def view(ctx, shopping_id, template): logger.error(e) raise e + @shopping.command() @click.option('--name', '-n', 'name') @click.option('-t', 'template') @@ -521,7 +521,7 @@ def list(name, template): else: shopping_list_entities = entity.get() - data = {'fields': { 'shopping_lists': shopping_list_entities }} + data = {'fields': {'shopping_lists': shopping_list_entities}} if template: loaded_template = cfg.templates(template) @@ -534,6 +534,72 @@ def list(name, template): raise e +@shopping.command() +@click.argument('shopping_id') +def browse(shopping_id): + logger = logging.getLogger('cli.shopping.browse') + try: + cfg = Configuration() + cfg.load() + url = '{domain}/shoppinglist?list={shopping_id}'.format(domain=cfg.domain, shopping_id=shopping_id) + click.launch(url, wait=False) + except Exception as e: + logger.error(e) + + +@shopping.command() +@click.option('-t', 'template') +def create(template): + logger = logging.getLogger('cli.shopping.create') + try: + cfg = Configuration() + cfg.load() + util = Util(cfg=cfg) + shopping_lists = Entity(name='shopping_lists') + if template: + loaded_template = cfg.templates(template) + else: + loaded_template = cfg.templates('shopping/create') + created_shopping_list = click.edit(loaded_template.render(), + extension='.yml') + if created_shopping_list is None: + return + parsed_created_shopping_list = util.load_yaml(created_shopping_list)[0] + + if template == 'debug': + click.echo(parsed_created_shopping_list) + return + shopping_lists.create(parsed_created_shopping_list) + except Exception as e: + raise e + + +@shopping.command() +@click.argument('shopping_id') +@click.option('-t', 'template') +def add_product(shopping_id, template): + logger = logging.getLogger('cli.shopping.add_product') + try: + cfg = Configuration() + cfg.load() + util = Util(cfg=cfg) + shopping_list = ShoppingList(id=shopping_id) + if template: + loaded_template = cfg.templates(template) + else: + loaded_template = cfg.templates('shopping/add_product') + + added_product = click.edit(loaded_template.render(), extension='.yml') + if added_product is None: + return + parsed_added_product = util.load_yaml(added_product)[0] + + if template == 'debug': + "TODO: Reserve for meta + return + shopping_list.add_product(parsed_added_product) + except Exception as e: + raise e # # diff --git a/grocy/request.py b/grocy/request.py index 1117236..5fbdcf8 100644 --- a/grocy/request.py +++ b/grocy/request.py @@ -25,7 +25,6 @@ class Request(object): logger = logging.getLogger('request.send') if self.resource: r = sess.request(method=self.method, url=self.url, headers=self.headers, json=self.resource) - print(r.text) else: r = sess.request(method=self.method, url=self.url, headers=self.headers) diff --git a/grocy/shoppinglist.py b/grocy/shoppinglist.py new file mode 100644 index 0000000..fa352ac --- /dev/null +++ b/grocy/shoppinglist.py @@ -0,0 +1,30 @@ +from grocy.request import Request +from grocy.conf import Configuration +import logging + + +class ShoppingList(object): + ADD_PRODUCT_URL_TEMPLATE = '{domain}/api/stock/shoppinglist/add-product' + + def __init__(self, id=None): + self.conf = Configuration() + self.conf.load() + self.id = id + + def add_product(self, entity): + logger = logging.getLogger('shoppinglist.add_product') + try: + if self.id is None: + raise Exception('shopping list id is required') + if entity and 'product_id' not in entity: + raise Exception('Must provide a product id') + if entity and 'product_amount' not in entity: + raise Exception('Must provide a product_amount id') + + entity['list_id'] = self.id + url = self.ADD_PRODUCT_URL_TEMPLATE.format(domain=self.conf.domain) + request = Request('post', url, resource=entity) + return request.send() + except Exception as e: + logger.error(e) + raise e diff --git a/templates/shopping/add_product.yml b/templates/shopping/add_product.yml new file mode 100644 index 0000000..8a444a8 --- /dev/null +++ b/templates/shopping/add_product.yml @@ -0,0 +1,2 @@ +product_id: +product_amount: diff --git a/templates/shopping/create.yml b/templates/shopping/create.yml new file mode 100644 index 0000000..845f7d0 --- /dev/null +++ b/templates/shopping/create.yml @@ -0,0 +1,2 @@ +name: +description: |