From 3b56b36b1d7450cc25f31167814411734a871346 Mon Sep 17 00:00:00 2001
From: admiralobvious <aferlandqc@gmail.com>
Date: Mon, 18 Aug 2014 22:38:54 -0400
Subject: [PATCH] added example using blueprints/factories

---
 examples/blueprints/blueprints/__init__.py    |  0
 examples/blueprints/blueprints/app.py         | 49 +++++++++++++++++++
 examples/blueprints/blueprints/config.py      | 11 +++++
 .../blueprints/blueprints/core/__init__.py    |  1 +
 examples/blueprints/blueprints/core/views.py  | 41 ++++++++++++++++
 examples/blueprints/blueprints/extensions.py  |  2 +
 .../blueprints/blueprints/foo/__init__.py     |  1 +
 examples/blueprints/blueprints/foo/views.py   | 10 ++++
 examples/blueprints/run.py                    |  7 +++
 examples/{ => groups}/app.py                  |  0
 10 files changed, 122 insertions(+)
 create mode 100644 examples/blueprints/blueprints/__init__.py
 create mode 100644 examples/blueprints/blueprints/app.py
 create mode 100644 examples/blueprints/blueprints/config.py
 create mode 100644 examples/blueprints/blueprints/core/__init__.py
 create mode 100644 examples/blueprints/blueprints/core/views.py
 create mode 100644 examples/blueprints/blueprints/extensions.py
 create mode 100644 examples/blueprints/blueprints/foo/__init__.py
 create mode 100644 examples/blueprints/blueprints/foo/views.py
 create mode 100644 examples/blueprints/run.py
 rename examples/{ => groups}/app.py (100%)

diff --git a/examples/blueprints/blueprints/__init__.py b/examples/blueprints/blueprints/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/examples/blueprints/blueprints/app.py b/examples/blueprints/blueprints/app.py
new file mode 100644
index 0000000..13e5652
--- /dev/null
+++ b/examples/blueprints/blueprints/app.py
@@ -0,0 +1,49 @@
+from flask import Flask, g, session
+
+from .config import BaseConfig
+from .extensions import ldap
+from .core import core
+from .foo import foo
+
+DEFAULT_BLUEPRINTS = (
+    core,
+    foo
+)
+
+
+def create_app(config=None, app_name=None, blueprints=None):
+    if app_name is None:
+        app_name = BaseConfig.PROJECT
+    if blueprints is None:
+        blueprints = DEFAULT_BLUEPRINTS
+    app = Flask(app_name)
+    configure_app(app, config)
+    register_hooks(app)
+    register_blueprints(app, blueprints)
+    register_extensions(app)
+    return app
+
+
+def configure_app(app, config=None):
+    if config:
+        app.config.from_object(config)
+
+
+def register_hooks(app):
+    @app.before_request
+    def before_request():
+        g.user = None
+        if 'user_id' in session:
+            # This is where you'd query your database to get the user info.
+            g.user = {}
+            # Create a global with the LDAP groups the user is a member of.
+            g.ldap_groups = ldap.get_user_groups(user=session['user_id'])
+
+
+def register_blueprints(app, blueprints):
+    for blueprint in blueprints:
+        app.register_blueprint(blueprint)
+
+
+def register_extensions(app):
+    ldap.init_app(app)
diff --git a/examples/blueprints/blueprints/config.py b/examples/blueprints/blueprints/config.py
new file mode 100644
index 0000000..a7353cd
--- /dev/null
+++ b/examples/blueprints/blueprints/config.py
@@ -0,0 +1,11 @@
+class BaseConfig(object):
+    PROJECT = 'foo'
+    SECRET_KEY = 'dev key'
+    DEBUG = True
+
+    # LDAP
+    LDAP_HOST = 'ldap.example.org'
+    LDAP_BASE_DN = 'OU=users,dc=example,dc=org'
+    LDAP_USERNAME = 'CN=user,OU=Users,DC=example,DC=org'
+    LDAP_PASSWORD = 'password'
+    LDAP_LOGIN_VIEW = 'core.login'
diff --git a/examples/blueprints/blueprints/core/__init__.py b/examples/blueprints/blueprints/core/__init__.py
new file mode 100644
index 0000000..0b96c5d
--- /dev/null
+++ b/examples/blueprints/blueprints/core/__init__.py
@@ -0,0 +1 @@
+from .views import core
diff --git a/examples/blueprints/blueprints/core/views.py b/examples/blueprints/blueprints/core/views.py
new file mode 100644
index 0000000..ad4a806
--- /dev/null
+++ b/examples/blueprints/blueprints/core/views.py
@@ -0,0 +1,41 @@
+from flask import Blueprint, g, request, session, redirect, url_for
+from ..extensions import ldap
+
+core = Blueprint('core', __name__)
+
+
+@core.route('/')
+@ldap.login_required
+def index():
+    return 'Successfully logged in!'
+
+
+@core.route('/login', methods=['GET', 'POST'])
+def login():
+    if g.user:
+        return redirect(url_for('index'))
+    if request.method == 'POST':
+        user = request.form['user']
+        passwd = request.form['passwd']
+        test = ldap.bind_user(user, passwd)
+        if test is None:
+            return 'Invalid credentials'
+        else:
+            session['user_id'] = request.form['user']
+            return redirect('/')
+    return """<form action="" method="post">
+                user: <input name="user"><br>
+                password:<input type="password" name="passwd"><br>
+                <input type="submit" value="Submit"></form>"""
+
+
+@core.route('/group')
+@ldap.group_required(groups=['Web Developers', 'QA'])
+def group():
+    return 'Group restricted page'
+
+
+@core.route('/logout')
+def logout():
+    session.pop('user_id', None)
+    return redirect(url_for('index'))
diff --git a/examples/blueprints/blueprints/extensions.py b/examples/blueprints/blueprints/extensions.py
new file mode 100644
index 0000000..cd5765e
--- /dev/null
+++ b/examples/blueprints/blueprints/extensions.py
@@ -0,0 +1,2 @@
+from flask.ext.simpleldap import LDAP
+ldap = LDAP()
diff --git a/examples/blueprints/blueprints/foo/__init__.py b/examples/blueprints/blueprints/foo/__init__.py
new file mode 100644
index 0000000..088f543
--- /dev/null
+++ b/examples/blueprints/blueprints/foo/__init__.py
@@ -0,0 +1 @@
+from .views import foo
diff --git a/examples/blueprints/blueprints/foo/views.py b/examples/blueprints/blueprints/foo/views.py
new file mode 100644
index 0000000..4150518
--- /dev/null
+++ b/examples/blueprints/blueprints/foo/views.py
@@ -0,0 +1,10 @@
+from flask import Blueprint
+from ..extensions import ldap
+
+foo = Blueprint('foo', __name__, url_prefix='/foo')
+
+
+@foo.route('/group')
+@ldap.group_required(groups=['Web Developers', 'QA'])
+def group():
+    return 'Group restricted page in foo module'
diff --git a/examples/blueprints/run.py b/examples/blueprints/run.py
new file mode 100644
index 0000000..edc0f51
--- /dev/null
+++ b/examples/blueprints/run.py
@@ -0,0 +1,7 @@
+from blueprints.app import create_app
+from blueprints.config import BaseConfig
+
+app = create_app(BaseConfig)
+
+if __name__ == "__main__":
+    app.run()
diff --git a/examples/app.py b/examples/groups/app.py
similarity index 100%
rename from examples/app.py
rename to examples/groups/app.py
-- 
GitLab