Resolves #21
This commit is contained in:
Aaron Kimbre 2022-03-13 22:10:07 -05:00
parent 6606f1558e
commit 24e98190fe
5 changed files with 218 additions and 28 deletions

View File

@ -75,14 +75,14 @@ def create_app():
if cdclient is not None:
cdclient.close()
@app.errorhandler(Exception)
def handle_exception(e):
app.logger.error(e)
# pass through HTTP errors
if isinstance(e, HTTPException):
return e
# now you're handling non-HTTP exceptions only
return render_template("status_codes/500.html.j2", exception=e), 500
# @app.errorhandler(Exception)
# def handle_exception(e):
# app.logger.error(e)
# # pass through HTTP errors
# if isinstance(e, HTTPException):
# return e
# # now you're handling non-HTTP exceptions only
# return render_template("status_codes/500.html.j2", exception=e), 500
# add the commands to flask cli
app.cli.add_command(init_db)
@ -193,7 +193,7 @@ def register_settings(app):
'APP_DATABASE_URI',
app.config['APP_DATABASE_URI']
)
if app.config['SECRET_KEY'] is "" or "<database>" in app.config['APP_DATABASE_URI']:
if app.config['SECRET_KEY'] == "" or "<database>" in app.config['APP_DATABASE_URI']:
raise("No database uri or secret Key")
# try to get overides, otherwise just use what we have already
app.config['USER_ENABLE_REGISTER'] = os.getenv(

View File

@ -199,6 +199,19 @@ def translate_from_locale(trans_string):
return trans_string
def get_lot_name(lot_id):
name = translate_from_locale(f'Objects_{lot_id}_name')
if name == f'Objects_{lot_id}_name':
intermed = query_cdclient(
'select * from Objects where id = ?',
[lot_id],
one=True
)
if intermed:
name = intermed[7] if (intermed[7] != "None" and intermed[7] != "" and intermed[7] is None) else intermed[1]
return name
def register_luclient_jinja_helpers(app):
@app.template_filter('get_zone_name')
@ -237,17 +250,8 @@ def register_luclient_jinja_helpers(app):
return None
@app.template_filter('get_lot_name')
def get_lot_name(lot_id):
name = translate_from_locale(f'Objects_{lot_id}_name')
if name == f'Objects_{lot_id}_name':
intermed = query_cdclient(
'select * from Objects where id = ?',
[lot_id],
one=True
)
if intermed:
name = intermed[7] if (intermed[7] != "None" and intermed[7] != "" and intermed[7] is None) else intermed[1]
return name
def jinja_get_lot_name(lot_id):
return get_lot_name(lot_id)
@app.template_filter('get_lot_rarity')
def get_lot_rarity(lot_id):

View File

@ -1,9 +1,12 @@
from flask import render_template, Blueprint, current_app
from flask_user import login_required
from app.models import CharacterInfo, Account, CharacterXML, Reports
from app.luclient import get_lot_name
from app import gm_level, scheduler
from sqlalchemy.orm import load_only
import datetime
import xmltodict
import random
reports_blueprint = Blueprint('reports', __name__)
@ -12,8 +15,30 @@ reports_blueprint = Blueprint('reports', __name__)
@login_required
@gm_level(3)
def index():
reports = Reports.query.distinct(Reports.date).group_by(Reports.date).all()
return render_template('reports/index.html.j2', reports=reports)
reports_items = Reports.query.distinct(
Reports.date
).filter(
Reports.report_type == "items"
).group_by(Reports.date).options(load_only(Reports.date)).all()
reports_currency = Reports.query.distinct(
Reports.date
).filter(
Reports.report_type == "currency"
).group_by(Reports.date).options(load_only(Reports.date)).all()
reports_uscore = Reports.query.distinct(
Reports.date
).filter(
Reports.report_type == "uscore"
).group_by(Reports.date).options(load_only(Reports.date)).all()
return render_template(
'reports/index.html.j2',
reports_items=reports_items,
reports_currency=reports_currency,
reports_uscore=reports_uscore,
)
@reports_blueprint.route('/items/by_date/<date>', methods=['GET', 'POST'])
@ -24,6 +49,46 @@ def items_by_date(date):
return render_template('reports/items/by_date.html.j2', data=data, date=date)
@reports_blueprint.route('/items/graph', methods=['GET', 'POST'])
@login_required
@gm_level(3)
def items_graph():
thirty_days_ago = datetime.date.today() - datetime.timedelta(days=30)
entries = Reports.query.filter(
Reports.report_type == "items"
).filter(Reports.date >= thirty_days_ago).all()
# transform data for chartjs
labels = []
items = dict()
datasets = []
# get stuff ready
for entry in entries:
labels.append(entry.date.strftime("%m/%d/%Y"))
for key in entry.data:
items[key] = get_lot_name(key)
# make it
for key, value in items.items():
data = []
for entry in entries:
if key in entry.data.keys():
data.append(entry.data[key])
else:
data.append(0)
color = "#" + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])
datasets.append({
"label": value,
"data": data,
"backgroundColor": color,
"borderColor": color
})
return render_template(
'reports/graph.html.j2',
labels=labels,
datasets=datasets,
name="Item"
)
@reports_blueprint.route('/currency/by_date/<date>', methods=['GET', 'POST'])
@login_required
@gm_level(3)
@ -32,6 +97,42 @@ def currency_by_date(date):
return render_template('reports/currency/by_date.html.j2', data=data, date=date)
@reports_blueprint.route('/currency/graph', methods=['GET', 'POST'])
@login_required
@gm_level(3)
def currency_graph():
thirty_days_ago = datetime.date.today() - datetime.timedelta(days=30)
entries = Reports.query.filter(
Reports.report_type == "currency"
).filter(Reports.date >= thirty_days_ago).all()
characters = CharacterInfo.query.options(load_only(CharacterInfo.name)).all()
labels = []
datasets = []
# get stuff ready
for entry in entries:
labels.append(entry.date.strftime("%m/%d/%Y"))
for character in characters:
data = []
for entry in entries:
if character.name in entry.data.keys():
data.append(entry.data[character.name])
else:
data.append(0)
color = "#" + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])
datasets.append({
"label": character.name,
"data": data,
"backgroundColor": color,
"borderColor": color
})
return render_template(
'reports/graph.html.j2',
labels=labels,
datasets=datasets,
name="Currency"
)
@reports_blueprint.route('/uscore/by_date/<date>', methods=['GET', 'POST'])
@login_required
@gm_level(3)
@ -40,6 +141,42 @@ def uscore_by_date(date):
return render_template('reports/uscore/by_date.html.j2', data=data, date=date)
@reports_blueprint.route('/uscore/graph', methods=['GET', 'POST'])
@login_required
@gm_level(3)
def uscore_graph():
thirty_days_ago = datetime.date.today() - datetime.timedelta(days=30)
entries = Reports.query.filter(
Reports.report_type == "uscore"
).filter(Reports.date >= thirty_days_ago).all()
characters = CharacterInfo.query.options(load_only(CharacterInfo.name)).all()
labels = []
datasets = []
# get stuff ready
for entry in entries:
labels.append(entry.date.strftime("%m/%d/%Y"))
for character in characters:
data = []
for entry in entries:
if character.name in entry.data.keys():
data.append(entry.data[character.name])
else:
data.append(0)
color = "#" + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])
datasets.append({
"label": character.name,
"data": data,
"backgroundColor": color,
"borderColor": color
})
return render_template(
'reports/graph.html.j2',
labels=labels,
datasets=datasets,
name="U-Score"
)
@scheduler.task("cron", id="gen_item_report", hour=23, timezone="UTC")
def gen_item_report():
with scheduler.app.app_context():

View File

@ -0,0 +1,37 @@
{% extends 'base.html.j2' %}
{% block title %}
{{name}} History for the Last 30 Days
{% endblock title %}
{% block content_before %}
{{name}} History for the Last 30 Days
{% endblock content_before %}
{% block content %}
<canvas id="item_chart"></canvas>
{% endblock %}
{% block js %}
{{ super () }}
<script type="text/javascript" src="{{ url_for('static', filename='chartjs/chart.min.js') }}"></script>
<script>
$(document).ready(function(){
let config = {
type: 'line',
data: {
labels: {{labels}},
datasets: {{datasets}},
},
options: {
plugins: { legend: { display: false }, }
}
};
let items_chart = new Chart(
document.getElementById('item_chart'),
config
);
}
);
</script>
{% endblock %}

View File

@ -11,8 +11,12 @@
{% block content %}
<div class="row">
<div class="col">
Items: <br/>
{% for report in reports|reverse %}
Items:
<a role="button" class="btn btn-primary btn btn-block"
href='{{url_for('reports.items_graph')}}'>
Graph
</a><br/>
{% for report in reports_items|reverse %}
<a role="button" class="btn btn-primary btn btn-block"
href='{{url_for('reports.items_by_date', date=report.date)}}'>
{{report.date}}
@ -20,8 +24,12 @@
{% endfor %}
</div>
<div class="col">
Currency: <br/>
{% for report in reports|reverse %}
Currency:
<a role="button" class="btn btn-primary btn btn-block"
href='{{url_for('reports.currency_graph')}}'>
Graph
</a><br/>
{% for report in reports_currency|reverse %}
<a role="button" class="btn btn-primary btn btn-block"
href='{{url_for('reports.currency_by_date', date=report.date)}}'>
{{report.date}}
@ -29,8 +37,12 @@
{% endfor %}
</div>
<div class="col">
U-Score: <br/>
{% for report in reports|reverse %}
U-Score:
<a role="button" class="btn btn-primary btn btn-block"
href='{{url_for('reports.uscore_graph')}}'>
Graph
</a><br/>
{% for report in reports_uscore|reverse %}
<a role="button" class="btn btn-primary btn btn-block"
href='{{url_for('reports.uscore_by_date', date=report.date)}}'>
{{report.date}}