From b0cb34e8e4ddf09b0cfe3081439610c6f6d0341c Mon Sep 17 00:00:00 2001
From: Zachary Sloan
Date: Fri, 22 Mar 2013 22:40:57 +0000
Subject: Added secure_server.py
Updated notes.txt
---
wqflask/secure_server.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 wqflask/secure_server.py
(limited to 'wqflask/secure_server.py')
diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py
new file mode 100644
index 00000000..49e0b433
--- /dev/null
+++ b/wqflask/secure_server.py
@@ -0,0 +1,76 @@
+from __future__ import print_function, division, absolute_import
+
+from wqflask import app
+
+from flask import Flask, render_template
+from flask.ext.sqlalchemy import SQLAlchemy
+from flask.ext.security import Security, SQLAlchemyUserDatastore, \
+ UserMixin, RoleMixin
+
+# Create app
+#app = Flask(__name__)
+app.config['SECRET_KEY'] = 'LjfrbDOlvdFMT5cCi9qrJqStxK4NcmxW'
+app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://webqtl:f2ZypIflRM@gn.cazhbciu2y1i.us-east-1.rds.amazonaws.com/db_webqtl'
+#app.config['SECURITY_CONFIRMABLE'] = True
+app.config['SECURITY_TRACKABLE'] = True
+
+# Create database connection object
+db = SQLAlchemy(app)
+
+# Define models
+roles_users = db.Table('roles_users',
+ db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
+ db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
+
+class Role(db.Model, RoleMixin):
+ id = db.Column(db.Integer(), primary_key=True)
+ name = db.Column(db.String(80), unique=True)
+ description = db.Column(db.String(255))
+
+class User(db.Model, UserMixin):
+ id = db.Column(db.Integer(), primary_key=True)
+ email = db.Column(db.String(255), unique=True)
+ password = db.Column(db.String(255))
+ active = db.Column(db.Boolean())
+ confirmed_at = db.Column(db.DateTime())
+
+ last_login_at = db.Column(db.DateTime())
+ current_login_at = db.Column(db.DateTime())
+ last_login_ip_= db.Column(db.String(39))
+ current_login_ip = db.Column(db.String(39))
+ login_count = db.Column(db.Integer())
+
+ roles = db.relationship('Role', secondary=roles_users,
+ backref=db.backref('users', lazy='dynamic'))
+
+# Setup Flask-Security
+user_datastore = SQLAlchemyUserDatastore(db, User, Role)
+security = Security(app, user_datastore)
+
+# Create a user to test with
+#@app.before_first_request
+def create_user():
+ db.create_all()
+ user_datastore.create_user(email='matt@example.com', password='notebook')
+ db.session.commit()
+
+## Views
+#@app.route('/')
+#def home():
+# return render_template('index.html')
+
+import logging
+#from themodule import TheHandlerYouWant
+file_handler = logging.FileHandler("/tmp/flask_gn_log")
+file_handler.setLevel(logging.DEBUG)
+app.logger.addHandler(file_handler)
+
+import logging_tree
+logging_tree.printout()
+
+if __name__ == '__main__':
+ #create_user()
+ app.run(host='0.0.0.0',
+ use_debugger=False,
+ threaded=True,
+ use_reloader=True)
--
cgit v1.2.3
From 05f4cfc55a6473cb438ce0059d6d37f913abcb01 Mon Sep 17 00:00:00 2001
From: Zachary Sloan
Date: Fri, 22 Mar 2013 23:29:55 +0000
Subject: Began creating templates for login/registration
---
wqflask/cfg/default_settings.py | 7 +++-
wqflask/secure_server.py | 24 +++---------
wqflask/wqflask/templates/security/_macros.html | 16 ++++++++
wqflask/wqflask/templates/security/_menu.html | 15 ++++++++
wqflask/wqflask/templates/security/_messages.html | 9 +++++
.../wqflask/templates/security/register_user.html | 45 ++++++++++++++++++++++
6 files changed, 96 insertions(+), 20 deletions(-)
create mode 100644 wqflask/wqflask/templates/security/_macros.html
create mode 100644 wqflask/wqflask/templates/security/_menu.html
create mode 100644 wqflask/wqflask/templates/security/_messages.html
create mode 100644 wqflask/wqflask/templates/security/register_user.html
(limited to 'wqflask/secure_server.py')
diff --git a/wqflask/cfg/default_settings.py b/wqflask/cfg/default_settings.py
index 53b5a96e..a575a3bd 100644
--- a/wqflask/cfg/default_settings.py
+++ b/wqflask/cfg/default_settings.py
@@ -4,5 +4,8 @@ LOGFILE = """/tmp/flask_gn_log"""
#400 bad request response with no exception/log
TRAP_BAD_REQUEST_ERRORS = True
-#SECURITY_CONFIRMABLE = True
-SECURITY_TRACKABLE = True
\ No newline at end of file
+# http://pythonhosted.org/Flask-Security/configuration.html
+SECURITY_CONFIRMABLE = True
+SECURITY_TRACKABLE = True
+SECURITY_REGISTERABLE = True
+SECURITY_RECOVERABLE = True
diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py
index 49e0b433..425fce89 100644
--- a/wqflask/secure_server.py
+++ b/wqflask/secure_server.py
@@ -4,15 +4,8 @@ from wqflask import app
from flask import Flask, render_template
from flask.ext.sqlalchemy import SQLAlchemy
-from flask.ext.security import Security, SQLAlchemyUserDatastore, \
- UserMixin, RoleMixin
+from flask.ext.security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin
-# Create app
-#app = Flask(__name__)
-app.config['SECRET_KEY'] = 'LjfrbDOlvdFMT5cCi9qrJqStxK4NcmxW'
-app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://webqtl:f2ZypIflRM@gn.cazhbciu2y1i.us-east-1.rds.amazonaws.com/db_webqtl'
-#app.config['SECURITY_CONFIRMABLE'] = True
-app.config['SECURITY_TRACKABLE'] = True
# Create database connection object
db = SQLAlchemy(app)
@@ -48,19 +41,14 @@ user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
# Create a user to test with
-#@app.before_first_request
-def create_user():
- db.create_all()
- user_datastore.create_user(email='matt@example.com', password='notebook')
- db.session.commit()
+##@app.before_first_request
+#def create_user():
+# db.create_all()
+# user_datastore.create_user(email='matt@example.com', password='notebook')
+# db.session.commit()
-## Views
-#@app.route('/')
-#def home():
-# return render_template('index.html')
import logging
-#from themodule import TheHandlerYouWant
file_handler = logging.FileHandler("/tmp/flask_gn_log")
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)
diff --git a/wqflask/wqflask/templates/security/_macros.html b/wqflask/wqflask/templates/security/_macros.html
new file mode 100644
index 00000000..8575f3db
--- /dev/null
+++ b/wqflask/wqflask/templates/security/_macros.html
@@ -0,0 +1,16 @@
+{% macro render_field_with_errors(field) %}
+
+ {{ field.label }} {{ field(**kwargs)|safe }}
+ {% if field.errors %}
+
+ {% for error in field.errors %}
+ - {{ error }}
+ {% endfor %}
+
+ {% endif %}
+
+{% endmacro %}
+
+{% macro render_field(field) %}
+ {{ field(**kwargs)|safe }}
+{% endmacro %}
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/security/_menu.html b/wqflask/wqflask/templates/security/_menu.html
new file mode 100644
index 00000000..5291f809
--- /dev/null
+++ b/wqflask/wqflask/templates/security/_menu.html
@@ -0,0 +1,15 @@
+{% if security.registerable or security.recoverable or security.confirmabled %}
+Menu
+
+{% endif %}
diff --git a/wqflask/wqflask/templates/security/_messages.html b/wqflask/wqflask/templates/security/_messages.html
new file mode 100644
index 00000000..179d0636
--- /dev/null
+++ b/wqflask/wqflask/templates/security/_messages.html
@@ -0,0 +1,9 @@
+{%- with messages = get_flashed_messages(with_categories=true) -%}
+ {% if messages %}
+
+ {% for category, message in messages %}
+ - {{ message }}
+ {% endfor %}
+
+ {% endif %}
+{%- endwith %}
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/security/register_user.html b/wqflask/wqflask/templates/security/register_user.html
new file mode 100644
index 00000000..af87f810
--- /dev/null
+++ b/wqflask/wqflask/templates/security/register_user.html
@@ -0,0 +1,45 @@
+{% from "security/_macros.html" import render_field_with_errors, render_field %}
+{% extends "base.html" %}
+{% include "security/_messages.html" %}
+{% block content %}
+
+
+
+
+{% include "security/_menu.html" %}
+
+{% endblock %}
+
+
\ No newline at end of file
--
cgit v1.2.3
From 34312cfacdcb5af450d33ac3b54d7c01a6a61788 Mon Sep 17 00:00:00 2001
From: Lei Yan
Date: Tue, 30 Apr 2013 22:15:38 +0000
Subject: Changed path to log file
Added server port to configuration file
---
wqflask/cfg/default_settings.py | 2 ++
wqflask/secure_server.py | 5 ++++-
wqflask/wqflask/dataSharing/SharingInfo.py | 12 ++++++------
3 files changed, 12 insertions(+), 7 deletions(-)
(limited to 'wqflask/secure_server.py')
diff --git a/wqflask/cfg/default_settings.py b/wqflask/cfg/default_settings.py
index a575a3bd..d0713e4d 100644
--- a/wqflask/cfg/default_settings.py
+++ b/wqflask/cfg/default_settings.py
@@ -1,5 +1,7 @@
LOGFILE = """/tmp/flask_gn_log"""
+SERVER_PORT = 5000
+
#This is needed because Flask turns key errors into a
#400 bad request response with no exception/log
TRAP_BAD_REQUEST_ERRORS = True
diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py
index 425fce89..5448dbeb 100644
--- a/wqflask/secure_server.py
+++ b/wqflask/secure_server.py
@@ -49,16 +49,19 @@ security = Security(app, user_datastore)
import logging
-file_handler = logging.FileHandler("/tmp/flask_gn_log")
+file_handler = logging.FileHandler(app.config['LOGFILE'])
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)
import logging_tree
logging_tree.printout()
+#print("app.config is:", app.config)
+
if __name__ == '__main__':
#create_user()
app.run(host='0.0.0.0',
+ port=app.config['SERVER_PORT'],
use_debugger=False,
threaded=True,
use_reloader=True)
diff --git a/wqflask/wqflask/dataSharing/SharingInfo.py b/wqflask/wqflask/dataSharing/SharingInfo.py
index befc158a..41a75222 100755
--- a/wqflask/wqflask/dataSharing/SharingInfo.py
+++ b/wqflask/wqflask/dataSharing/SharingInfo.py
@@ -34,12 +34,12 @@ import requests
from dbFunction import webqtlDatabaseFunction
import SharingBody
-import logging
-logging.basicConfig(filename="/tmp/flask_gn_log", level=logging.INFO)
-
-_log = logging.getLogger("search")
-_ch = logging.StreamHandler()
-_log.addHandler(_ch)
+#import logging
+#logging.basicConfig(filename="/tmp/flask_gn_log", level=logging.INFO)
+#
+#_log = logging.getLogger("search")
+#_ch = logging.StreamHandler()
+#_log.addHandler(_ch)
--
cgit v1.2.3
From 1cf6894c7416f879fcd114ae7358bb7d4169a677 Mon Sep 17 00:00:00 2001
From: Sam
Date: Thu, 9 May 2013 22:28:22 +0000
Subject: Working on user registration
---
wqflask/secure_server.py | 9 +++--
wqflask/wqflask/templates/base.html | 30 +++++++++++++---
wqflask/wqflask/templates/index_page.html | 7 ++--
.../wqflask/templates/security/register_user.html | 40 +++-------------------
4 files changed, 39 insertions(+), 47 deletions(-)
(limited to 'wqflask/secure_server.py')
diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py
index 5448dbeb..60f6db44 100644
--- a/wqflask/secure_server.py
+++ b/wqflask/secure_server.py
@@ -7,6 +7,11 @@ from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin
+# Setup mail
+from flask.ext.mail import Mail
+mail = Mail(app)
+
+
# Create database connection object
db = SQLAlchemy(app)
@@ -26,13 +31,13 @@ class User(db.Model, UserMixin):
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
-
+
last_login_at = db.Column(db.DateTime())
current_login_at = db.Column(db.DateTime())
last_login_ip_= db.Column(db.String(39))
current_login_ip = db.Column(db.String(39))
login_count = db.Column(db.Integer())
-
+
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html
index 71c12941..6f4b8e1e 100644
--- a/wqflask/wqflask/templates/base.html
+++ b/wqflask/wqflask/templates/base.html
@@ -14,9 +14,9 @@
-
+
{% block css %}
{% endblock %}
@@ -57,13 +57,17 @@
News
- References
+ References
+
+
+ Policies
- Policies
+ Links
- Links
+ Login
@@ -137,6 +141,22 @@
+
+
+
+
+
+
One fine body…this is getting replaced with content that comes from passed-in href
+
+
+
+
diff --git a/wqflask/wqflask/templates/security/_macros.html b/wqflask/wqflask/templates/security/_macros.html
index 8575f3db..919b979a 100644
--- a/wqflask/wqflask/templates/security/_macros.html
+++ b/wqflask/wqflask/templates/security/_macros.html
@@ -13,4 +13,4 @@
{% macro render_field(field) %}
{{ field(**kwargs)|safe }}
-{% endmacro %}
\ No newline at end of file
+{% endmacro %}
diff --git a/wqflask/wqflask/templates/security/login_user.html b/wqflask/wqflask/templates/security/login_user.html
index d781ce08..b5fcbfdc 100644
--- a/wqflask/wqflask/templates/security/login_user.html
+++ b/wqflask/wqflask/templates/security/login_user.html
@@ -5,8 +5,13 @@
{{ login_user_form.hidden_tag() }}
{{ render_field_with_errors(login_user_form.email) }}
{{ render_field_with_errors(login_user_form.password) }}
+
+ {% if security.recoverable %}
+ Forgot your password?
+ {% endif %}
+
{{ render_field_with_errors(login_user_form.remember) }}
{{ render_field(login_user_form.next) }}
{{ render_field(login_user_form.submit) }}
-{% include "security/_menu.html" %}
\ No newline at end of file
+
diff --git a/wqflask/wqflask/user_manager.py b/wqflask/wqflask/user_manager.py
new file mode 100644
index 00000000..4d608dc7
--- /dev/null
+++ b/wqflask/wqflask/user_manager.py
@@ -0,0 +1,22 @@
+from __future__ import print_function, division, absolute_import
+
+"""Access things in template like this:
+
+ x: {{ g.identity.name }}
+ security: {{ security.__dict__ }}
+
+"""
+
+from wqflask import model
+
+from flask import Flask, g
+
+#from app import db
+print("globals are:", globals())
+
+
+class UserManager(object):
+ def __init__(self):
+ self.users = model.User.query.all()
+ print("Users are:", self.users)
+
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index 8531561a..dadce4d5 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -35,6 +35,8 @@ from utility.benchmark import Bench
from pprint import pformat as pf
+from wqflask import user_manager
+
#import logging
#logging.basicConfig(filename="/tmp/gn_log", level=logging.INFO)
#_log = logging.getLogger("correlation")
@@ -166,21 +168,21 @@ def marker_regression_page():
'dataset',
'suggestive'
)
-
+
start_vars = {}
for key, value in initial_start_vars.iteritems():
if key in wanted or key.startswith(('value:')):
start_vars[key] = value
-
+
version = "v14"
key = "marker_regression:{}:".format(version) + json.dumps(start_vars, sort_keys=True)
with Bench("Loading cache"):
result = Redis.get(key)
-
+
#print("************************ Starting result *****************")
#print("result is [{}]: {}".format(type(result), result))
#print("************************ Ending result ********************")
-
+
if result:
print("Cache hit!!!")
with Bench("Loading results"):
@@ -194,17 +196,17 @@ def marker_regression_page():
indent=" ")
result = template_vars.__dict__
-
+
#for item in template_vars.__dict__.keys():
# print(" ---**--- {}: {}".format(type(template_vars.__dict__[item]), item))
-
+
#causeerror
Redis.set(key, pickle.dumps(result))
Redis.expire(key, 60*60)
-
+
with Bench("Rendering template"):
rendered_template = render_template("marker_regression.html", **result)
-
+
return rendered_template
@@ -234,6 +236,11 @@ def get_temp_data():
temp_uuid = request.args['key']
return flask.jsonify(temp_data.TempData(temp_uuid).get_all())
+@app.route("/users")
+def manage_users():
+ template_vars = user_manager.UserManager()
+ return render_template("admin/user_manager.html", **template_vars.__dict__)
+
def json_default_handler(obj):
'''Based on http://stackoverflow.com/a/2680060/1175849'''
@@ -251,4 +258,4 @@ def json_default_handler(obj):
# return None
else:
raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (
- type(obj), repr(obj))
\ No newline at end of file
+ type(obj), repr(obj))
--
cgit v1.2.3