After you do .get() on some db.child().child()..., then you check it if its valid, and if it is you do .val() on it. Then you get an OrderedDict() and you rejoice!
resp = db.child("users").child(user_id).get()
user = resp.val() if resp.pyres else {}
resp = db.child("tickets").get()
tickets = resp.val() if resp.pyres else {}
# Now access it like a dict
return render_template("user.html", user=user, tickets=tickets)
Now in your template, just iterate over the items like any other dict, or direct access with a key. Note that the default ordering is alphabetical.
Or if it is a generated key besides user id, it will be ordered by date ascending.
{% if user %}
<p>Hello {{ user["first_name"] }}
{{ user.get("middle_name", "") }}
{{ user["last_name"] }}
</p>
{% endif %}
<div class="container">
{% if tickets %}
{% for id, tickets_details in tickets.items() %}
<h3>{{ id }}</h3>
{% for key, val in tickets_details.items() %}
{% include 'admin/status_snippet.html' %}
{% endfor %}
<hr/>
{% endfor %}
{% endif %}
</div>
Figuring this out took a little longer than expected and the interet wasn't super helpful.
In your Route put something like this:
in app.py or in your app/init.py
import pyrebase
import json
with open("pyrebase-key.json", "r") as jfile:
firebase_config = json.loads(jfile.read())
firebase = pyrebase.initialize_app(firebase_config)
auth = firebase.auth()
db = firebase.database()
from ppretty import ppretty
from app import db
@app.route('/tickets', methods=['GET'])
def tickets_list():
tickets = db.child("users").child("tickets").get()
print(ppretty(tickets.pyres))
if tickets.pyres:
return render_template("admin/tickets.html", tickets=tickets.pyres)
else:
return render_template("admin/tickets.html", tickets=[])
Then in your jinja template
templates/admin/tickets.html
{% extends "layout.html" %}
{% set active_page = "dashboard" %}
{% block content %}
<h2>Tickets</h2>
<div class="container">
{% if tickets %}
{% for obj in tickets %}
{% set id, item = obj.item %}
<h3>{{ id }}</h3>
{% for key, val in item.items() %}
<li>{{ key|e }}: {{ val|e }}</li>
{% endfor %}
{#% endfor %#}
<hr/>
{% endfor %}
{% endif %}
</div>
{% endblock %}
Also the first call to the db often returns empty if I haven't hit the db recently. I'm not exactly sure why.
Also to save data from a form, I ended up cleaning the data in and out of json first. I might switch to simplejson soon.
import datetime
from ppretty import ppretty
from app import db, firebase
import json
from json_default import default
from decimal import Decimal
@default.register(Decimal)
def _(obj):
return float(obj)
@mod_ticket.route('/new', methods=['GET', 'POST'])
def new():
today_str = datetime.date.today().strftime('%Y-%m-%d')
form = TicketForm(request.form, my_date=today_str)
print(ppretty(form))
if form.validate_on_submit():
form_data = {}
for field in form:
if field.id != "csrf_token":
form_data[field.id] = field.data
print(ppretty(form_data))
form_json = json.dumps(form_data, default=default)
try:
resp = db.child("tickets").push(json.loads(form_json))
except HTTPError as e:
error_dict = json.loads(e.strerror)
print(ppretty(error_dict))
# print(error_dict["error"]["message"], error_dict["error"]["errors"][0]["reason"])
return redirect(url_for("ticket.thank_you"))
return render_template("ticket/new.html", form=form)