Source code for yadawia
"""
App
---
Initialize configuration for the whole app and put all the parts together.
"""
from flask import Flask, request, session, abort
from flask_sqlalchemy import SQLAlchemy
from flask_jsglue import JSGlue
from flask_assets import Environment, Bundle
from sqlalchemy_searchable import make_searchable
import re
app = Flask(__name__)
"""Initialize app."""
app.config.from_pyfile('config.py')
"""Get app configuration from the file config.py."""
db = SQLAlchemy(app)
"""Use SQLAlchemy as an ORM."""
jsglue = JSGlue(app)
"""Initialize Flask-JSGlue which allows us to use Flask.url_for in un-rendered JavaScript."""
assets = Environment(app)
"""Initialize assets in app."""
make_searchable()
"""Activates SQLAlchemy-Searchable"""
# import other necessary modules
import yadawia.errorhandlers
import yadawia.views
import yadawia.classes
import yadawia.helpers
js = Bundle(
*yadawia.helpers.assetsList(app),
filters='slimit',
output='js/all.js')
"""Bundle all JavaScript files and minify them."""
css_libs = Bundle(*yadawia.helpers.assetsList(app, folder='css', extension='css',
exclusions=['css/layout.css']), filters='cssmin', output='css/all.css')
"""Bundle library css files and minify them."""
assets.register('js_all', js)
assets.register('css_libs', css_libs)
@app.before_request
[docs]def csrf_protect():
"""Check for csrf token in POST and DELETE requests. CSRF tokens are generated per session/login.
If there's no token or the token is not equal to the one from the form, abort the request.
"""
if (request.method == 'POST' or request.method ==
'DELETE') and app.config['CSRF_ENABLED']:
token = session['_csrf_token']
if not token or token != request.form.get('_csrf_token'):
abort(400)
@app.template_filter('country_name')
[docs]def country_name_filter(country_id):
"""TEMPLATE FILTER: Get country name from country ID."""
return yadawia.classes.Country.query.filter_by(id=country_id).first().value
@app.template_filter('sender')
[docs]def sender(thread_id):
"""TEMPLATE FILTER: Get sender in a 2-person message from threadID and logged in session."""
userId = session['userId']
return yadawia.classes.MessageThread.query.filter_by(
id=thread_id).first().otherUser(userId).id
@app.template_filter('name_or_username')
[docs]def name_or_username(userId):
"""TEMPLATE FILTER: Get someone's name if set, if not then username."""
return yadawia.classes.User.query.filter_by(
id=userId).first().name_or_username()
@app.template_filter('paragraph')
[docs]def paragraph(text):
"""TEMPLATE FILTER: Replace newlines with <br /> in html."""
return text.replace('\n', '<br />')
@app.template_filter('order_total')
[docs]def order_total(order):
"""TEMPLATE FILTER: Get order total given the order object."""
total = {}
strings = []
for product in order.products.all():
if product.currency_id in total:
total[product.currency_id] += product.price * product.quantity
else:
total[product.currency_id] = product.price * product.quantity
for key, val in total.items():
strings.append(str(val) + ' ' + key)
return ' + '.join(strings)
@app.template_filter('excerpt')
[docs]def excerpt(text):
"""TEMPLATE FILTER: Cut text and append dots if its lenght is more than 100 chars."""
return text[:100] + '...' if len(text) > 100 else text
app.jinja_env.globals['csrf_token'] = yadawia.helpers.generate_csrf_token
"""Whenever `{{ csrf_token() }}` is used in a Jinja2 template, it returns the result of the function `generate_csrf_token()` """