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)