Přeskočit obsah

File main.py

File List > python-wrapper > main.py

Go to the documentation of this file.

import json
from flask import Flask, request, abort
from dotenv import dotenv_values
from skola_online import SkolaOnline
from fablab import Fablab
from salina import Salina
from alojz import Alojz
from functools import wraps
import datetime
import time
from pprint import *

app = Flask(__name__)

# file .env
# USERNAME=username
# PASSWORD=password
# API_KEY=api_key
config = dotenv_values(".env")


def request_data(message: str):
    """! @brief Vytvoří odpověď na požadavek.
    @param message: Zpráva, která se má vrátit.
    @return JSON Odpověď na požadavek.
    """
    mess = {"data": message, "status": "ok", "timeFull": str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))}
    print(mess)
    return json.dumps(mess)


def request_error(message):
    mess = {"data": message, "status": "error"}
    print(mess)
    return json.dumps(mess)


# Source: https://coderwall.com/p/4qickw/require-an-api-key-for-a-route-in-flask-using-only-a-decorator
# The actual decorator function
def require_appkey(view_function):
    @wraps(view_function)
    # the new, post-decoration function. Note *args and **kwargs here.
    def decorated_function(*args, **kwargs):
        config = dotenv_values(".env")
        if request.args.get("api_key") and request.args.get("api_key") == config["API_KEY"]:
            return view_function(*args, **kwargs)
        else:
            abort(401)

    return decorated_function


# http://127.0.0.1:5000/marksLast/?api_key=
# @require_apikey
@app.route("/marksLast/")
def marksLastFlask():
    """! @brief URL pro získání posledních známek.

    @return JSON s posledními známkami
    """

    try:
        sol = SkolaOnline(config["USERNAME"], config["PASSWORD"])
        lastMarks = sol.getLastMarks()

        json_arr = []
        for mark in lastMarks:
            print(mark)
            json_arr.append(mark.__dict__)
        return request_data(json_arr)

    except Exception as e:
        return request_error(str(e))


# http://127.0.0.1:5000/marksSubject/
# @require_apikey
@app.route("/marksSubject/")
def marksSubjectFlask():
    """! @brief URL pro získání známek podle předmětu.

    @return JSON se známkami podle předmětu
    """

    return request_error("Neni implementovano :-(")

    try:
        sol = SkolaOnline(config["USERNAME"], config["PASSWORD"])
        subject = request.args.get("subject")
        lastMarks = sol.getLastMarksBySubject(subject)

        json_arr = []
        for mark in lastMarks:
            print(mark)
            json_arr.append(mark.__dict__)
        return request_data(json_arr)

    except Exception as e:
        print(e)
        return request_error(str(e))


# http://127.0.0.1:5000/fablabNow/
# @require_apikey
@app.route("/fablabNow/")
def fablabNowFlask():
    """! @brief URL pro získání aktuálního stavu strojů ve Fsblabu.
    @return JSON s aktuálním stavem strojů ve Fsblabu
    """

    # return request_error("Neni implementovano :-(")

    try:
        fablab = Fablab()
        machinesStat = fablab.getMachinesStatus()

        json_machines = []
        for machine in machinesStat.machines:
            json_machines.append(machine.__dict__)
        json_printers = []
        for printer in machinesStat.printers:
            json_printers.append(printer.__dict__)
        json_arr = {"members": machinesStat.members, "machines": json_machines, "printers": json_printers}

        return request_data(json_arr)

    except Exception as e:
        print(e)
        return json.dumps({"error": str(e)})

# http://127.0.0.1:5000/departures?stopid=1272&postid=2
# @require_apikey
@app.route("/departures")
def departuresFlask():
    params = request.args

    # {'stopid': '1146', 'postid': '1'}
    if not params.get("stopid") or not params.get("postid"):
        return request_error("Není zadáno stop_id nebo post_id")
    try:
        salina = Salina()
        salinaStop = salina.getDepartures(params)
        return request_data(salinaStop)
    except Exception as e:
        print(e)
        return request_error(str(e))


# http://127.0.0.1:5000/alojz?alojzId=brno&lat=49.195060&lon=16.606837&alt=237
# @require_apikey
@app.route("/alojz")
def alojzFlask():
    params = request.args

    # {"alojzId": "brno", "lat": 49.195060, "lon": 16.606837, "alt": 237}
    if not params.get("alojzId") or not params.get("lat") or not params.get("lon") or not params.get("alt"):
        return request_error("Není zadáno alojzId, lat, lon nebo alt")
    try:
        alozj = Alojz()
        alojzWeather = alozj.getWeather(params)
        return request_data(alojzWeather)
    except Exception as e:
        print(e)
        return request_error(str(e))

# http://127.0.0.1:5000/ping
# @require_apikey
@app.route("/ping")
def pingFlask():
    params = request.args
    return request_data("Pong" + time.strftime("%Y-%m-%d %H:%M:%S"))


if __name__ == "__main__":
    """! @brief Spouštění aplikace.
    Hlavní funkce aplikace - spouští Flask server.
    """

    app.run(host="0.0.0.0")
    # # app.run(debug=True, host="0.0.0.0")