refactored how skill settings are retrieved. added skill settings change code
parent
61e884b0f6
commit
35fa76e6a2
|
@ -1 +1,2 @@
|
|||
from .repository.setting import SkillSettingRepository
|
||||
from .repository.skill import SkillRepository
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
|
@ -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)
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
)
|
Loading…
Reference in New Issue