byceps/byceps

View on GitHub
byceps/services/global_setting/global_setting_service.py

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
"""
byceps.services.global_setting.global_setting_service
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from sqlalchemy import delete, select

from byceps.database import db, upsert

from .dbmodels import DbGlobalSetting
from .models import GlobalSetting


def create_setting(name: str, value: str) -> GlobalSetting:
    """Create a global setting."""
    db_setting = DbGlobalSetting(name, value)

    db.session.add(db_setting)
    db.session.commit()

    return _db_entity_to_global_setting(db_setting)


def create_or_update_setting(name: str, value: str) -> GlobalSetting:
    """Create or update a global setting, depending on whether it
    already exists or not.
    """
    table = DbGlobalSetting.__table__
    identifier = {'name': name}
    replacement = {'value': value}

    upsert(table, identifier, replacement)

    return find_setting(name)


def remove_setting(name: str) -> None:
    """Remove the global setting with that name.

    Do nothing if no global setting with that name exists.
    """
    db.session.execute(
        delete(DbGlobalSetting).where(DbGlobalSetting.name == name)
    )
    db.session.commit()


def find_setting(name: str) -> GlobalSetting | None:
    """Return the global setting with that name, or `None` if not found."""
    db_setting = db.session.get(DbGlobalSetting, name)

    if db_setting is None:
        return None

    return _db_entity_to_global_setting(db_setting)


def find_setting_value(name: str) -> str | None:
    """Return the value of the global setting with that name, or `None`
    if not found.
    """
    setting = find_setting(name)

    if setting is None:
        return None

    return setting.value


def get_settings() -> set[GlobalSetting]:
    """Return all global settings."""
    db_settings = db.session.scalars(select(DbGlobalSetting)).all()

    return {
        _db_entity_to_global_setting(db_setting) for db_setting in db_settings
    }


def _db_entity_to_global_setting(db_setting: DbGlobalSetting) -> GlobalSetting:
    return GlobalSetting(
        db_setting.name,
        db_setting.value,
    )