Kekkai/chart/chart.py

96 lines
2.9 KiB
Python
Raw Normal View History

import os
import psycopg2
import uvicorn
import yaml
import matplotlib.pyplot as plt
from fastapi import FastAPI, Response, status
from psycopg2.extras import DictCursor
from starlette.staticfiles import StaticFiles
app = FastAPI()
config = yaml.safe_load(open('../config.yaml'))
con = psycopg2.connect(host=config['database']['host'],
user=config['database']['user'],
password=config['database']['password'],
database=config['database']['name'],
port=config['database']['port'])
cur = con.cursor(cursor_factory=DictCursor)
con.autocommit = True
app.mount('/static/charts', StaticFiles(directory='../charts/'))
@app.get("/api/getChart/")
async def get_chart(response: Response,
from_currency: str, conv_currency: str,
start_date: str, end_date: str):
"""
:param response:
:param from_currency: The currency to convert from
:type from_currency: str
:param conv_currency: The currency to be converted into
:type conv_currency: str
:param start_date: The start date of the schedule period
:type start_date: str
:param end_date: The last date of the schedule period
:type end_date: str
:return:
"""
cur.execute('SELECT date, rate FROM currency WHERE (date BETWEEN %s AND %s) '
'AND from_currency = %s AND conv_currency = %s ORDER BY date',
[
start_date, end_date,
from_currency.upper(), conv_currency.upper()
])
con.commit()
data = cur.fetchall()
if not data:
response.status_code = status.HTTP_404_NOT_FOUND
return {'message': 'No data found', 'status_code': status.HTTP_404_NOT_FOUND}
date, rate = [], []
for i in range(len(data)):
date.append(str(data[i][0]))
rate.append(data[i][1])
if rate[0] < rate[-1]:
plt.plot(date, rate, color='green')
elif rate[0] > rate[-1]:
plt.plot(date, rate, color='red')
else:
plt.plot(date, rate, color='grey')
plt.xlabel('Date')
plt.ylabel('Rate')
fig = plt.gcf()
fig.set_size_inches(18.5, 9.5)
if not os.path.exists('../charts'):
os.mkdir('../charts')
fig.savefig(f'../charts/{from_currency}-{conv_currency}.png')
fig.clear()
return {'message': f'./static/charts/{from_currency}-{conv_currency}.png',
'status_code': status.HTTP_201_CREATED,
}
if __name__ == '__main__':
uvicorn.run(app,
host=config['server']['host'],
port=3030,
ssl_keyfile=config['server']['ssl']['private_key']
if config['server']['ssl']['work']
else None,
ssl_certfile=config['server']['ssl']['cert']
if config['server']['ssl']['work']
else None
)