foxygit / infodisplay Log in
commits tags

/kiosk/addons/clock/routes.py · 2.37 KB

raw
import re
from flask import Blueprint, jsonify, request, abort
import db
import extensions
from auth import login_required

bp = Blueprint('clock', __name__, url_prefix='/api')

_HEX_COLOR = re.compile(r'^#[0-9a-fA-F]{6}$')


@bp.route('/clock', methods=['GET'])
def get_clock():
    state = db.get_state()
    return jsonify({
        'enabled':       state.get('clock_enabled',       '0') == '1',
        'style':         state.get('clock_style',         'digital'),
        'show_date':     state.get('clock_show_date',     '0') == '1',
        'position':      state.get('clock_position',      'top-right'),
        'size':          float(state.get('clock_size',    '2')),
        'color':         state.get('clock_color',         '#ffffff'),
        'opacity':       int(state.get('clock_opacity',   '90')),
        'schedule_mode': state.get('clock_schedule_mode', 'always'),
    })


@bp.route('/clock', methods=['POST'])
@login_required
def set_clock():
    data = request.get_json()
    if not data:
        abort(400)
    enabled  = bool(data.get('enabled', False))
    style    = 'analog' if data.get('style') == 'analog' else 'digital'
    show_date = bool(data.get('show_date', False))
    position  = data.get('position', 'top-right')
    if position not in {'top-left', 'top-right', 'bottom-left', 'bottom-right', 'center'}:
        position = 'top-right'
    size    = max(1.0, min(5.0, float(data.get('size', 2))))
    color   = str(data.get('color', '#ffffff'))
    if not _HEX_COLOR.match(color):
        color = '#ffffff'
    opacity = max(0, min(100, int(data.get('opacity', 90))))
    schedule_mode = 'scheduled_only' if data.get('schedule_mode') == 'scheduled_only' else 'always'

    db.set_state('clock_enabled',       '1' if enabled else '0')
    db.set_state('clock_style',         style)
    db.set_state('clock_show_date',     '1' if show_date else '0')
    db.set_state('clock_position',      position)
    db.set_state('clock_size',          str(size))
    db.set_state('clock_color',         color)
    db.set_state('clock_opacity',       str(opacity))
    db.set_state('clock_schedule_mode', schedule_mode)

    payload = {
        'enabled': enabled, 'style': style, 'show_date': show_date,
        'position': position, 'size': size, 'color': color,
        'opacity': opacity, 'schedule_mode': schedule_mode,
    }
    extensions.socketio.emit('clock_settings', payload)
    return '', 204