#!/usr/bin/env python3 from typing import Optional from flask import jsonify, request, abort, current_app from utils import json_required, redis_client from flask_classful import FlaskView import json class AssignmentView(FlaskView): @staticmethod def _resolve_response(site: Optional[str]) -> dict: site_url_map = redis_client.get("SITEURLMAP") if site_url_map: site_url_map = json.loads(site_url_map.decode('utf-8')) if not site_url_map: return { "site": current_app.config['DEFAULT_WHILE_NOT_DEFINED'][0], "url": current_app.config['DEFAULT_WHILE_NOT_DEFINED'][1], "hard_default": True } if not site: return { "site": current_app.config['DEFAULT_WHILE_NOT_DEFINED'][0], "url": current_app.config['DEFAULT_WHILE_NOT_DEFINED'][1], "hard_default": True } if site not in site_url_map.keys(): # This should be an internal server error instead return { "site": current_app.config['DEFAULT_WHILE_NOT_DEFINED'][0], "url": current_app.config['DEFAULT_WHILE_NOT_DEFINED'][1], "hard_default": True } return { "site": site, "url": site_url_map[site], "hard_default": False } @json_required def post(self): device_id = request.json['device_id'] schedule_store_key = f"SCHEDULED:{device_id}" target_site = redis_client.get(schedule_store_key) if target_site: target_site = target_site.decode('utf-8') if not target_site: default_target = redis_client.get('DEFAULT:SCHEDULED') if default_target: target_site = default_target.decode('utf-8') redis_client.set(schedule_store_key, default_target) # Update (or set) TTL redis_client.expire( schedule_store_key, current_app.config['DEVICE_TIMEOUT'] ) return jsonify(self._resolve_response(target_site))