Skip to content

Instantly share code, notes, and snippets.

@peteristhegreat
Last active April 29, 2021 02:20
Show Gist options
  • Save peteristhegreat/70fd623e92575e2e367fa9c9a7ae6f4f to your computer and use it in GitHub Desktop.
Save peteristhegreat/70fd623e92575e2e367fa9c9a7ae6f4f to your computer and use it in GitHub Desktop.
Pyrebase, Pyrebase4, pyres, Jinja, Flask

Easy Way

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>

Super Hard Way

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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment