Fix reports

Add currency report
make reports use json storage
Make tables nicer
This commit is contained in:
Aaron Kimbre
2022-01-16 20:24:47 -06:00
parent 1a5531eb19
commit b2af6d967a
17 changed files with 197 additions and 67 deletions

View File

@@ -1,8 +1,8 @@
from flask import render_template, Blueprint, redirect, url_for, request, abort, flash, request
from flask_user import login_required, current_user
from app.models import db, CharacterInfo, Account, CharacterXML, ItemReports
from app.models import db, CharacterInfo, Account, CharacterXML, Reports
from app import gm_level, scheduler
import datetime, xmltodict
import datetime, xmltodict, json
reports_blueprint = Blueprint('reports', __name__)
@@ -10,49 +10,103 @@ reports_blueprint = Blueprint('reports', __name__)
@login_required
@gm_level(3)
def index():
items = ItemReports.query.distinct(ItemReports.date).group_by(ItemReports.date).all()
return render_template('reports/index.html.j2', items=items)
reports = Reports.query.distinct(Reports.date).group_by(Reports.date).all()
print(gen_item_report())
print(gen_currency_report())
return render_template('reports/index.html.j2', reports=reports)
@reports_blueprint.route('/items/by_date/<date>', methods=['GET', 'POST'])
@login_required
@gm_level(3)
def items_by_date(date):
items = ItemReports.query.filter(ItemReports.date==date).order_by(ItemReports.count.desc()).all()
return render_template('reports/items/by_date.html.j2', items=items, date=date)
data = Reports.query.filter(Reports.date==date).filter(Reports.report_type=="items").first().data
return render_template('reports/items/by_date.html.j2', data=data, date=date)
@reports_blueprint.route('/currency/by_date/<date>', methods=['GET', 'POST'])
@login_required
@gm_level(3)
def currency_by_date(date):
data = Reports.query.filter(Reports.date==date).filter(Reports.report_type=="currency").first().data
return render_template('reports/currency/by_date.html.j2', data=data, date=date)
@scheduler.task("cron", id="gen_item_report", hour=7)
@scheduler.task("cron", id="gen_item_report", hour=23)
def gen_item_report():
date = datetime.date.today().strftime('%Y-%m-%d')
report = ItemReports.query.filter(ItemReports.date==date).first()
with scheduler.app.app_context():
date = datetime.date.today().strftime('%Y-%m-%d')
report = Reports.query.filter(Reports.date==date).filter(Reports.report_type=="items").first()
# Only one report per day
if report != None:
return f"Report Already Generated for {date}"
# Only one report per day
if report != None:
return f"Item Report Already Generated for {date}"
char_xmls = CharacterXML.query.join(
CharacterInfo,
CharacterInfo.id==CharacterXML.id
).join(
Account,
CharacterInfo.account_id==Account.id
).filter(Account.gm_level < 3).all()
char_xmls = CharacterXML.query.join(
CharacterInfo,
CharacterInfo.id==CharacterXML.id
).join(
Account,
CharacterInfo.account_id==Account.id
).filter(Account.gm_level < 3).all()
report_data={}
report_data={}
for char_xml in char_xmls:
character_json = xmltodict.parse(
char_xml.xml_data,
attr_prefix="attr_"
for char_xml in char_xmls:
character_json = xmltodict.parse(
char_xml.xml_data,
attr_prefix="attr_"
)
for inv in character_json["obj"]["inv"]["items"]["in"]:
if "i" in inv.keys() and type(inv["i"]) == list and (int(inv["attr_t"])==0 or int(inv["attr_t"])==0):
for item in inv["i"]:
if item["attr_l"] in report_data:
report_data[item["attr_l"]] = report_data[item["attr_l"]] + int(item["attr_c"])
else:
report_data[item["attr_l"]] = int(item["attr_c"])
new_report = Reports(
data=report_data,
report_type="items",
date=date
)
for inv in character_json["obj"]["inv"]["items"]["in"]:
if "i" in inv.keys() and type(inv["i"]) == list and (int(inv["attr_t"])==0 or int(inv["attr_t"])==0):
for item in inv["i"]:
if item["attr_l"] in report_data:
report_data[item["attr_l"]] = report_data[item["attr_l"]] + int(item["attr_c"])
else:
report_data[item["attr_l"]] = int(item["attr_c"])
new_report.save()
return f"Generated Item Report for {date}"
return f"Generated Report for {date}"
@scheduler.task("cron", id="gen_currency_report", hour=23)
def gen_currency_report():
with scheduler.app.app_context():
date = datetime.date.today().strftime('%Y-%m-%d')
report = Reports.query.filter(Reports.date==date).filter(Reports.report_type=="currency").first()
# Only one report per day
if report != None:
return f"Currency Report Already Generated for {date}"
characters = CharacterXML.query.join(
CharacterInfo,
CharacterInfo.id==CharacterXML.id
).join(
Account,
CharacterInfo.account_id==Account.id
).filter(Account.gm_level < 3).all()
report_data={}
for character in characters:
character_json = xmltodict.parse(
character.xml_data,
attr_prefix="attr_"
)
report_data[CharacterInfo.query.filter(CharacterInfo.id==character.id).first().name] = int(character_json["obj"]["char"]["attr_cc"])
new_report = Reports(
data=report_data,
report_type="currency",
date=date
)
new_report.save()
return f"Generated Currency Report for {date}"