diff foodtruck/web.py @ 587:d4a01a023998

admin: Add "FoodTruck" admin panel from the side experiment project.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 16 Jan 2016 14:24:35 -0800
parents
children 79a31a3c947b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foodtruck/web.py	Sat Jan 16 14:24:35 2016 -0800
@@ -0,0 +1,121 @@
+import logging
+from flask import Flask, g, request, render_template
+from .config import (
+        FoodTruckConfigNotFoundError, get_foodtruck_config)
+from .sites import FoodTruckSites
+
+
+logger = logging.getLogger(__name__)
+
+app = Flask(__name__)
+
+c = get_foodtruck_config()
+app.secret_key = c.get('foodtruck/secret_key')
+del c
+
+
+def after_this_request(f):
+    if not hasattr(g, 'after_request_callbacks'):
+        g.after_request_callbacks = []
+    g.after_request_callbacks.append(f)
+    return f
+
+
+class LazySomething(object):
+    def __init__(self, factory):
+        self._factory = factory
+        self._something = None
+
+    def __getattr__(self, name):
+        if self._something is not None:
+            return getattr(self._something, name)
+
+        self._something = self._factory()
+        return getattr(self._something, name)
+
+
+@app.before_request
+def _setup_foodtruck_globals():
+    def _get_sites():
+        s = FoodTruckSites(g.config,
+                           request.cookies.get('foodtruck_site_name'))
+        return s
+    g.config = LazySomething(get_foodtruck_config)
+    g.sites = LazySomething(_get_sites)
+
+
+@app.after_request
+def _call_after_request_callbacks(response):
+    for callback in getattr(g, 'after_request_callbacks', ()):
+        callback(response)
+    return response
+
+
+@app.errorhandler(FoodTruckConfigNotFoundError)
+def _on_config_missing(ex):
+    return render_template('install.html')
+
+
+@app.errorhandler
+def _on_error(ex):
+    logging.exception(ex)
+
+
+from flask.ext.login import LoginManager, UserMixin
+
+
+class User(UserMixin):
+    def __init__(self, uid, pwd):
+        self.id = uid
+        self.password = pwd
+
+
+def load_user(user_id):
+    admin_id = g.config.get('security/username')
+    if admin_id == user_id:
+        admin_pwd = g.config.get('security/password')
+        return User(admin_id, admin_pwd)
+    return None
+
+
+login_manager = LoginManager()
+login_manager.init_app(app)
+login_manager.login_view = 'login'
+login_manager.user_loader(load_user)
+
+
+try:
+    from flask.ext.bcrypt import Bcrypt
+except ImportError:
+    logging.warning("Bcrypt not available... falling back to SHA512.")
+    logging.warning("Run `pip install Flask-Bcrypt` for more secure "
+                    "password hashing.")
+
+    import hashlib
+
+    def generate_password_hash(password):
+        return hashlib.sha512(password.encode('utf8')).hexdigest()
+
+    def check_password_hash(reference, check):
+        check_hash = hashlib.sha512(check.encode('utf8')).hexdigest()
+        return check_hash == reference
+
+    class SHA512Fallback(object):
+        def __init__(self, app=None):
+            self.generate_password_hash = generate_password_hash
+            self.check_password_hash = check_password_hash
+
+    Bcrypt = SHA512Fallback
+
+app.bcrypt = Bcrypt(app)
+
+
+import foodtruck.views.baking  # NOQA
+import foodtruck.views.create  # NOQA
+import foodtruck.views.edit  # NOQA
+import foodtruck.views.main  # NOQA
+import foodtruck.views.menu  # NOQA
+import foodtruck.views.preview  # NOQA
+import foodtruck.views.settings  # NOQA
+import foodtruck.views.sources  # NOQA
+