diff --git a/app/__init__.py b/app/__init__.py index 7aba26f..b01e6f2 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -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 "" in app.config['APP_DATABASE_URI']: + if app.config['SECRET_KEY'] == "" or "" 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( diff --git a/app/luclient.py b/app/luclient.py index fa4a490..e1451bf 100644 --- a/app/luclient.py +++ b/app/luclient.py @@ -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): diff --git a/app/reports.py b/app/reports.py index 7ce6263..d3a09ec 100644 --- a/app/reports.py +++ b/app/reports.py @@ -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/', 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/', 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/', 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(): diff --git a/app/templates/reports/graph.html.j2 b/app/templates/reports/graph.html.j2 new file mode 100644 index 0000000..d54550d --- /dev/null +++ b/app/templates/reports/graph.html.j2 @@ -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 %} + +{% endblock %} + +{% block js %} + {{ super () }} + + +{% endblock %} diff --git a/app/templates/reports/index.html.j2 b/app/templates/reports/index.html.j2 index 711fd66..0412d90 100644 --- a/app/templates/reports/index.html.j2 +++ b/app/templates/reports/index.html.j2 @@ -11,8 +11,12 @@ {% block content %}