refactored how skill settings are retrieved. added skill settings change code

pull/58/head
Chris Veilleux 2019-02-28 21:46:05 -06:00
parent 61e884b0f6
commit 35fa76e6a2
8 changed files with 165 additions and 10 deletions

View File

@ -1 +1,2 @@
from .repository.setting import SkillSettingRepository
from .repository.skill import SkillRepository

View File

@ -28,3 +28,18 @@ class SettingSection(object):
display_order: int
description: str = None
settings: List[Setting] = None
@dataclass
class SkillVersion(object):
version: str
display_name: str
@dataclass
class Skill(object):
name: str
url: str
versions: List[SkillVersion]
has_settings: bool
id: str = None

View File

@ -0,0 +1,9 @@
from dataclasses import dataclass
from typing import List
@dataclass
class AccountSkillSetting(object):
settings_definition: dict
settings_values: dict
devices: List[str]

View File

@ -0,0 +1,47 @@
import json
from typing import List
from selene.util.db import use_transaction
from ..entity.skill_setting import AccountSkillSetting
from ...repository_base import RepositoryBase
class SkillSettingRepository(RepositoryBase):
def __init__(self, db):
super(SkillSettingRepository, self).__init__(db, __file__)
self.db = db
def get_account_skill_settings(
self, skill_id: str, account_id: str
) -> List[AccountSkillSetting]:
db_request = self._build_db_request(
'get_settings_for_skill.sql',
args=dict(skill_id=skill_id, account_id=account_id)
)
db_result = self.cursor.select_all(db_request)
skill_settings = []
for row in db_result:
settings_definition = row['settings_definition']['skillMetadata']
skill_settings.append(
AccountSkillSetting(
settings_definition=settings_definition,
settings_values=row['settings_values'],
devices=row['devices']
)
)
return skill_settings
@use_transaction
def update_device_skill_settings(self, skill_id, skill_settings):
for settings_group in skill_settings:
db_request = self._build_db_request(
'update_device_skill_settings.sql',
args=dict(
settings_values=json.dumps(settings_group['settingsValues']),
skill_id=skill_id,
device_names=tuple(settings_group['devices'])
)
)
self.cursor.update(db_request)

View File

@ -1,20 +1,20 @@
from os import path
from typing import List
from selene.util.db import DatabaseRequest, get_sql_from_file, Cursor
SQL_DIR = path.join(path.dirname(__file__), 'sql')
from ..entity.skill import Skill, SkillVersion
from ...repository_base import RepositoryBase
class SkillRepository(object):
class SkillRepository(RepositoryBase):
def __init__(self, db):
self.cursor = Cursor(db)
super(SkillRepository, self).__init__(db, __file__)
def get_skill_settings_by_device_id(self, device_id):
"""Return all skill settings from a given device id
:param device_id: device uuid
:return list of skills using the format from the API v1"""
query = DatabaseRequest(
sql=get_sql_from_file(path.join(SQL_DIR, 'get_skill_setting_by_device_id.sql')),
query = self._build_db_request(
'get_skill_setting_by_device_id.sql',
args=dict(device_id=device_id)
)
sql_results = self.cursor.select_all(query)
@ -23,15 +23,33 @@ class SkillRepository(object):
def get_skill_settings_by_device_id_and_version_hash(self, device_id, version_hash):
"""Return a skill setting for a given device id and skill version hash
:param device_id: device uuid
:param version_hash: skill setting version hash
:return skill setting using the format from the API v1
"""
query = DatabaseRequest(
sql=get_sql_from_file(path.join(SQL_DIR, 'get_skill_setting_by_device_id_and_version_hash.sql')),
query = self._build_db_request(
'get_skill_setting_by_device_id_and_version_hash.sql',
args=dict(device_id=device_id, version_hash=version_hash)
)
sql_results = self.cursor.select_all(query)
if sql_results:
return sql_results[0]['skill']
def get_skills_for_account(self, account_id) -> List[Skill]:
skills = []
db_request = self._build_db_request(
'get_skills_for_account.sql',
args=dict(account_id=account_id)
)
db_result = self.cursor.select_all(db_request)
if db_result is not None:
for row in db_result:
skill_versions = []
if row['skill']['versions'] is not None:
for version in row['skill']['versions']:
skill_versions.append(SkillVersion(**version))
row['skill']['versions'] = skill_versions
skills.append(Skill(**row['skill']))
return skills

View File

@ -0,0 +1,14 @@
SELECT
sm.settings_meta::jsonb AS settings_definition,
ds.settings::jsonb AS settings_values,
array_agg(d.name) AS devices
FROM
skill.setting_meta sm
INNER JOIN device.device_skill ds ON sm.id = ds.skill_setting_meta_id
INNER JOIN device.device d ON ds.device_id = d.id
WHERE
sm.skill_id = %(skill_id)s
AND d.account_id = %(account_id)s
GROUP BY
sm.settings_meta::jsonb,
ds.settings::jsonb

View File

@ -0,0 +1,42 @@
WITH
setting_meta AS (
SELECT
s.id,
count(sm.id) > 0 AS has_settings
FROM
skill.skill s
LEFT JOIN skill.setting_meta sm ON s.id = sm.skill_id
GROUP BY
s.id
),
skill_versions AS (
SELECT
s.id as skill_id,
array_agg(
json_build_object(
'version', b.branch,
'display_name', b.display_name
)
) AS versions
FROM
skill.skill s
INNER JOIN skill.branch b ON s.id = b.skill_id
GROUP BY
s.id
)
SELECT DISTINCT
json_build_object(
'id', s.id,
'name', s.name,
'url', s.url,
'has_settings', sm.has_settings,
'versions', sv.versions
)::jsonb as skill
FROM
skill.skill s
INNER JOIN device.device_skill ds ON ds.skill_id = s.id
INNER JOIN device.device d ON d.id = ds.device_id
INNER JOIN setting_meta sm ON sm.id = s.id
LEFT JOIN skill_versions sv ON sv.skill_id = s.id
WHERE
d.account_id = %(account_id)s

View File

@ -0,0 +1,9 @@
UPDATE
device.device_skill
SET
settings = %(settings_values)s
WHERE
skill_id = %(skill_id)s
AND device_id IN (
SELECT id FROM device.device WHERE name IN %(device_names)s
)