Completed
Push — master ( f10ede...2cdad2 )
by Jochen
04:07
created

byceps.services.site.settings_service.get_settings_for_party()   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 1
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
"""
2
byceps.services.site.settings_service
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
:Copyright: 2006-2019 Jochen Kupperschmidt
6
:License: Modified BSD, see LICENSE for details.
7
"""
8
9
from typing import List, Optional
10
11
from ...database import db, upsert
12
from ...typing import PartyID
13
14
from .models.setting import Setting as DbSetting
15
from .transfer.models import SiteID, SiteSetting
16
17
18
def create_setting(site_id: SiteID, name: str, value: str) -> SiteSetting:
19
    """Create a setting for that site."""
20
    setting = DbSetting(site_id, name, value)
21
22
    db.session.add(setting)
23
    db.session.commit()
24
25
    return _db_entity_to_site_setting(setting)
26
27
28
def create_or_update_setting(
29
    site_id: SiteID, name: str, value: str
30
) -> SiteSetting:
31
    """Create or update a setting for that site, depending on whether
32
    it already exists or not.
33
    """
34
    table = DbSetting.__table__
35
    identifier = {
36
        'site_id': site_id,
37
        'name': name,
38
    }
39
    replacement = {
40
        'value': value,
41
    }
42
43
    upsert(table, identifier, replacement)
44
45
    return find_setting(site_id, name)
46
47
48
def find_setting(site_id: SiteID, name: str) -> Optional[SiteSetting]:
49
    """Return the setting for that site and with that name, or `None`
50
    if not found.
51
    """
52
    setting = DbSetting.query.get((site_id, name))
53
54
    if setting is None:
55
        return None
56
57
    return _db_entity_to_site_setting(setting)
58
59
60
def find_setting_value(site_id: SiteID, name: str) -> Optional[str]:
61
    """Return the value of the setting for that site and with that
62
    name, or `None` if not found.
63
    """
64
    setting = find_setting(site_id, name)
65
66
    if setting is None:
67
        return None
68
69
    return setting.value
70
71
72
def get_settings(site_id: SiteID) -> List[SiteSetting]:
73
    """Return all settings for that site."""
74
    settings = DbSetting.query \
75
        .filter_by(site_id=site_id) \
76
        .all()
77
78
    return {_db_entity_to_site_setting(setting) for setting in settings}
79
80
81
def _db_entity_to_site_setting(setting: DbSetting) -> SiteSetting:
82
    return SiteSetting(
83
        setting.site_id,
84
        setting.name,
85
        setting.value,
86
    )
87