feat: Added create, remove, list, edit subcommads for battery

- fix: Used correct `str.join` method to join list into string
This commit is contained in:
Aerex 2019-12-30 23:37:08 -05:00
parent 57900844f1
commit c2b21e80d3
3 changed files with 199 additions and 4 deletions

41
grocy/battery.py Normal file
View File

@ -0,0 +1,41 @@
import logging
from grocy.conf import Configuration
from grocy.request import Request
class Battery(object):
TRACK_CHARGE = '{domain}/api/batteries/{batteryId}/charge'
GET_BATTERY = '{domain}/api/batteries/{batteryId}'
def __init__(self, id=None):
self.conf = Configuration()
self.conf.load()
self.id = id
@property
def details(self):
logger = logging.getLogger('battery.details')
try:
if self.id is None:
raise Exception('battery id is required')
url = self.GET_BATTERY.format(domain=self.conf.domain, batteryId=self.id)
request = Request('get', url)
battery_details = request.send()
# Remove general battery info
del battery_details['battery']
return battery_details
except Exception as e:
logger.error(e)
raise e
def track_charge(self):
logger = logging.getLogger('battery.track_charge')
try:
if self.id is None:
raise Exception('battery id is required')
url = self.TRACK_CHARGE.format(domain=self.conf.domain, batteryId=self.id)
request = Request('post', url)
batteries = request.send()
except Exception as e:
logger.error(e)
raise e

View File

@ -10,6 +10,7 @@ from grocy.recipe import Recipe
from grocy.table import Table
from grocy.entity import Entity
from grocy.chore import Chore
from grocy.battery import Battery
from grocy.stock import Stock
from grocy.schema import get_schema
from grocy.shoppinglist import ShoppingList
@ -744,11 +745,11 @@ def list(name, template):
else:
chores = entity.get()
data = {'chores': []}
data = {'fields': []}
for chore in chores:
chore_details = Chore(chore['id'])
chore.update(chore_details.execution_times)
data['chores'].append({'fields': chore})
data['fields'].append(chore)
if template:
loaded_template = cfg.templates(template)
@ -786,3 +787,157 @@ def create(template):
except Exception as e:
logger.error(e)
raise e
@main.group()
def battery():
pass
@battery.command()
@click.option('-t', 'template')
@click.option('--name', '-n', 'name')
def list(name, template):
logger = logging.getLogger('cli.battery.list')
cfg = Configuration()
cfg.load()
query = {}
try:
entity = Entity(name='batteries')
if name:
batteries = entity.find_by_name(name)
if len(batteries) == 0:
return
else:
batteries = entity.get()
for battery in batteries:
battery_details = Battery(id=battery['id']).details
battery.update(battery_details)
data = {'fields': {'batteries': batteries}}
if template:
loaded_template = cfg.templates(template)
else:
loaded_template = cfg.templates('battery/list')
click.echo(loaded_template.render(grocy=data))
except Exception as e:
logger.error(e)
raise e
@battery.command()
@click.option('-t', 'template')
def create(template):
logger = logging.getLogger('cli.battery.create')
try:
cfg = Configuration()
cfg.load()
util = Util(cfg=cfg)
meta = Meta()
data = {'meta': meta.generate()}
if template:
loaded_template = cfg.templates(template)
else:
loaded_template = cfg.templates('battery/create')
created_battery = click.edit(loaded_template.render(grocy=data), extension='.yml')
if not created_battery:
return
parsed_new_battery = util.load_yaml(created_battery)[0]
if template == 'debug':
click.echo(parsed_new_battery)
return
entity = Entity(name='batteries')
entity.create(parsed_new_battery)
except Exception as e:
logger.error(e)
raise e
@battery.command()
@click.argument('battery_id')
@click.option('-t', 'template')
def remove(battery_id, template):
logger = logging.getLogger('cli.battery.remove')
try:
entity = Entity(name='batteries')
entity.delete(battery_id)
except Exception as e:
logger.error(e)
raise e
@battery.command()
@click.argument('battery_id', required=False)
@click.option('-t', 'template')
@click.option('--name', '-n', 'name')
def edit(battery_id, name, template):
logger = logging.getLogger('cli.battery.edit')
try:
cfg = Configuration()
util = Util(cfg=cfg)
cfg.load()
if template:
loaded_template = cfg.templates(template)
else:
loaded_template = cfg.templates('battery/edit')
entity = Entity(name='batteries')
if battery_id:
battery = entity.get(id=battery_id)
batteries = [battery]
elif name:
# Convert name args to a single string
string_name_arg = ' '.join(name) if type(name) == list else name
batteries = entity.find({'name': string_name_arg})
else:
raise click.BadParameter('Missing BATTERY_ID or QUERY')
if batteries is None:
click.echo('Could not find batteries')
return
data = {'fields': {'batteries': batteries}}
edited_batteries = click.edit(loaded_template.render(grocy=data), extension='.yml')
if edited_batteries is None:
return
schema = entity.schema
parsed_edited_batteries = util.load_yaml(edited_batteries)
for index, edited_battery in enumerate(parsed_edited_batteries):
edited_battery['id'] = batteries[index]['id']
util.verify_integrity(edited_battery, schema)
entity.update(edited_battery, id=batteries[index]['id'])
except Exception as e:
logger.error(e)
raise e
@battery.command()
@click.option('-t', 'template')
@click.argument('battery_id')
def track(template, battery_id):
logger = logging.getLogger('cli.battery.track')
cfg = Configuration()
cfg.load()
try:
if template:
loaded_template = cfg.templates(template)
else:
loaded_template = cfg.templates('battery/track')
created_battery = click.edit(loaded_template.render(), extension='.yml')
parsed_created_battery = yaml.safe_load(created_battery)
if template == 'debug':
click.echo(parsed_created_battery)
return
battery = Battery(id=battery_id)
battery.track_charge()
except Exception as e:
logger.error(e)
raise e

View File

@ -31,9 +31,8 @@ class Util(object):
for prop in new_data.keys():
if prop not in schema_keys:
keys_not_found.append(prop)
print('{}'.format(keys_not_found))
if len(keys_not_found) > 0:
raise Exception('{} is not valid property'.format(keys_not_found.join(', ')))
raise Exception('{} are/is not valid properties'.format(', '.join(keys_not_found)))
except Exception as e:
logger.error(e)
raise e