Skip to content

Commit

Permalink
Obey pep8
Browse files Browse the repository at this point in the history
  • Loading branch information
imwilsonxu committed Jun 22, 2016
1 parent 26c087b commit adbb004
Show file tree
Hide file tree
Showing 16 changed files with 180 additions and 177 deletions.
2 changes: 1 addition & 1 deletion fbone/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-

from .views import api
from views import api
4 changes: 2 additions & 2 deletions fbone/api/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-

from flask import Blueprint, current_app, request, jsonify
from flask import Blueprint, request, jsonify
from flask_login import login_user, current_user, logout_user
from flask_restful import Api, Resource, url_for
from flask_restful import Api, Resource

from ..user import User

Expand Down
42 changes: 20 additions & 22 deletions fbone/app.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,29 @@
# -*- coding: utf-8 -*-

import os, click

from flask import Flask, render_template

from .config import DefaultConfig
from .user import User, user
from .frontend import frontend
from .api import api
from .extensions import db, login_manager
from .filters import format_date, pretty_date
from .utils import INSTANCE_FOLDER_PATH
from config import DefaultConfig
from user import User

from extensions import db, login_manager
from filters import format_date, pretty_date, nl2br
from utils import INSTANCE_FOLDER_PATH


# For import *
__all__ = ['create_app']

DEFAULT_BLUEPRINTS = (
frontend,
user,
api,
)

def create_app(config=None, app_name=None, blueprints=None):
def create_app(config=None, app_name=None):
"""Create a Flask app."""

if app_name is None:
app_name = DefaultConfig.PROJECT
if blueprints is None:
blueprints = DEFAULT_BLUEPRINTS

app = Flask(app_name, instance_path=INSTANCE_FOLDER_PATH, instance_relative_config=True)
configure_app(app, config)
configure_hook(app)
configure_blueprints(app, blueprints)
configure_blueprints(app)
configure_extensions(app)
configure_logging(app)
configure_template_filters(app)
Expand Down Expand Up @@ -77,16 +67,23 @@ def load_user(id):
login_manager.setup_app(app)


def configure_blueprints(app, blueprints):
def configure_blueprints(app):
"""Configure blueprints in views."""

for blueprint in blueprints:
app.register_blueprint(blueprint)
from user import user
from frontend import frontend
from api import api

for bp in [user, frontend, api]:
app.register_blueprint(bp)


def configure_template_filters(app):
"""Configure filters."""

app.jinja_env.filters["pretty_date"] = pretty_date
app.jinja_env.filters["format_date"] = format_date
app.jinja_env.filters["nl2br"] = nl2br


def configure_logging(app):
Expand All @@ -97,6 +94,7 @@ def configure_logging(app):
return

import logging
import os
from logging.handlers import SMTPHandler

# Set info level on logger, which might be overwritten by handers.
Expand All @@ -120,7 +118,7 @@ def configure_logging(app):
mail_handler = SMTPHandler(app.config['MAIL_SERVER'],
app.config['MAIL_USERNAME'],
app.config['ADMINS'],
'O_ops... %s failed!' % app.config['PROJECT'],
'Your Application Failed!',
(app.config['MAIL_USERNAME'],
app.config['MAIL_PASSWORD']))
mail_handler.setLevel(logging.ERROR)
Expand Down
7 changes: 7 additions & 0 deletions fbone/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ class DefaultConfig(BaseConfig):

SENTRY_DSN = ""

MAIL_HOST = ""
FROM_ADDR = ""
TO_ADDRS = [""]
MAIL_USERNAME = ""
MAIL_PASSWORD = ""

# Flask-Sqlalchemy: http://packages.python.org/Flask-SQLAlchemy/config.html
SQLALCHEMY_ECHO = False
# QLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be
Expand All @@ -49,6 +55,7 @@ class DefaultConfig(BaseConfig):

class TestConfig(BaseConfig):
TESTING = True
CSRF_ENABLED = False
WTF_CSRF_ENABLED = False

SQLALCHEMY_ECHO = False
Expand Down
31 changes: 12 additions & 19 deletions fbone/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import os
from collections import OrderedDict
from flask import Markup

ADMIN = 0
STAFF = 1
Expand Down Expand Up @@ -32,36 +33,28 @@
}
SEX_TYPES = OrderedDict(sorted(SEX_TYPES.items()))

JOB_TITLES = {
1: "CEO",
2: "CTO",
3: "COO",
99: "Other",
}
JOB_TITLES = OrderedDict(sorted(JOB_TITLES.items()))

JOB_TYPES = {
1: "Full-time",
2: "Part-time",
3: "Internship",
99: "Other",
}
JOB_TYPES = OrderedDict(sorted(JOB_TYPES.items()))

INSTANCE_FOLDER_PATH = os.path.join('/tmp', 'instance')

ALLOWED_AVATAR_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])

USERNAME_LEN_MIN = 4
USERNAME_LEN_MAX = 25
USERNAME_TIP = "Don't worry. you can change it later."

REALNAME_LEN_MIN = 4
REALNAME_LEN_MAX = 25

PASSWORD_LEN_MIN = 6
PASSWORD_LEN_MAX = 16
PASSWORD_TIP = '%s characters or more! Be tricky.' % PASSWORD_LEN_MIN

AGREE_TIP = Markup(
'Agree to the <a target="blank" href="/terms">Terms of Service</a>')

EMAIL_LEN_MIN = 2
EMAIL_LEN_MAX = 50
EMAIL_TIP = "What's your email address?"

AGE_MIN = 1
AGE_MAX = 300
BIO_TIP = "Tell us about yourself"

STRING_LEN = 200
STRING_LEN = 225
21 changes: 16 additions & 5 deletions fbone/filters.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
# -*- coding: utf-8 -*-

import re
from datetime import datetime
from jinja2 import Markup, escape


# http://jinja.pocoo.org/docs/dev/api/#custom-filters
def format_date(value, format='%Y-%m-%d'):
# http://blog.sneawo.com/blog/2015/04/08/strftime-for-datetime-before-1900-year/
if value:
return value.strftime(format)
else:
return ""
return '{0.year:4d}-{0.month:02d}-{0.day:02d}'.format(value)
return ""


# https://bitbucket.org/danjac/newsmeme/src/a281babb9ca3/newsmeme/
def pretty_date(value, default="just now"):
now = datetime.utcnow()
diff = now - dt
diff = now - value

periods = (
(diff.days / 365, 'year', 'years'),
Expand All @@ -37,3 +38,13 @@ def pretty_date(value, default="just now"):
return u'%d %s ago' % (period, plural)

return default


_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

def nl2br(value):
if not value:
return ""
result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', Markup('<br>\n'))
for p in _paragraph_re.split(escape(value.strip())))
return Markup(result)
2 changes: 1 addition & 1 deletion fbone/frontend/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-

from .views import frontend
from views import frontend
63 changes: 41 additions & 22 deletions fbone/frontend/forms.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,49 @@
# -*- coding: utf-8 -*-

from flask import Markup

from flask_wtf import Form
from wtforms import (ValidationError, HiddenField, BooleanField, StringField,
PasswordField, SubmitField)
from wtforms import ValidationError, HiddenField, BooleanField, StringField, \
PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo, Email
from flask_wtf.html5 import EmailField

from ..user import User
from ..constants import (PASSWORD_LEN_MIN, PASSWORD_LEN_MAX,
USERNAME_LEN_MIN, USERNAME_LEN_MAX)
from fbone.user import User
from fbone.constants import USERNAME_LEN_MIN, USERNAME_LEN_MAX, USERNAME_TIP, \
PASSWORD_LEN_MIN, PASSWORD_LEN_MAX, PASSWORD_TIP, \
EMAIL_LEN_MIN, EMAIL_LEN_MAX, EMAIL_TIP, \
AGREE_TIP


class LoginForm(Form):
next = HiddenField()
login = StringField(u'Username or email', [DataRequired()])
password = PasswordField('Password', [DataRequired(), Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)])
login = StringField('Username or email',
[DataRequired(),
Length(USERNAME_LEN_MIN, USERNAME_LEN_MAX)])
password = PasswordField('Password',
[DataRequired(),
Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)])
remember = BooleanField('Remember me')
submit = SubmitField('Sign in', render_kw={"class": "btn btn-success btn-block"})
# Use render_kw to set style of submit button
submit = SubmitField('Sign in',
render_kw={"class": "btn btn-success btn-block"})


class SignupForm(Form):
next = HiddenField()
email = EmailField(u'Email', [DataRequired(), Email()],
description=u"What's your email address?")
password = PasswordField(u'Password', [DataRequired(), Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)],
description=u'%s characters or more! Be tricky.' % PASSWORD_LEN_MIN)
name = StringField(u'Choose your username', [DataRequired(), Length(USERNAME_LEN_MIN, USERNAME_LEN_MAX)],
description=u"Don't worry. you can change it later.")
agree = BooleanField(u'Agree to the ' +
Markup('<a target="blank" href="/terms">Terms of Service</a>'), [DataRequired()])
submit = SubmitField('Sign up', render_kw={"class": "btn btn-success btn-block"})
email = EmailField(u'Email',
[DataRequired(), Email(),
Length(EMAIL_LEN_MIN, EMAIL_LEN_MAX)],
description=EMAIL_TIP)
password = PasswordField('Password',
[DataRequired(),
Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)],
description=PASSWORD_TIP)
name = StringField('Choose your username',
[DataRequired(),
Length(USERNAME_LEN_MIN, USERNAME_LEN_MAX)],
description=USERNAME_TIP)
agree = BooleanField(AGREE_TIP, [DataRequired()])
submit = SubmitField('Sign up',
render_kw={"class": "btn btn-success btn-block"})

def validate_name(self, field):
if User.query.filter_by(name=field.data).first() is not None:
Expand All @@ -43,18 +55,25 @@ def validate_email(self, field):


class RecoverPasswordForm(Form):
email = EmailField(u'Your email', [Email()])
email = EmailField(u'Your email',
[DataRequired(),
Email(),
Length(EMAIL_LEN_MIN, EMAIL_LEN_MAX)])
submit = SubmitField('Send instructions')


class ChangePasswordForm(Form):
activation_key = HiddenField()
password = PasswordField(u'Password', [DataRequired()])
password_again = PasswordField(u'Password again', [EqualTo('password', message="Passwords don't match")])
password_again = PasswordField(u'Password again',
[EqualTo('password',
message="Passwords don't match")])
submit = SubmitField('Save')


class ReauthForm(Form):
next = HiddenField()
password = PasswordField(u'Password', [DataRequired(), Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)])
password = PasswordField(u'Password',
[DataRequired(),
Length(PASSWORD_LEN_MIN, PASSWORD_LEN_MAX)])
submit = SubmitField('Reauthenticate')
26 changes: 12 additions & 14 deletions fbone/frontend/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

from uuid import uuid4

from flask import (Blueprint, render_template, current_app, request,
flash, url_for, redirect, session, abort)
from flask_login import login_required, login_user, current_user, logout_user, confirm_login, login_fresh
from flask import Blueprint, render_template, current_app, request, flash, \
url_for, redirect, session, abort
from flask_login import login_required, login_user, current_user, logout_user, \
confirm_login, login_fresh

from ..user import User
from ..extensions import db, login_manager
from .forms import SignupForm, LoginForm, RecoverPasswordForm, ReauthForm, ChangePasswordForm
from fbone.user import User
from fbone.extensions import db, login_manager
from forms import SignupForm, LoginForm, RecoverPasswordForm, ReauthForm, \
ChangePasswordForm


frontend = Blueprint('frontend', __name__)
Expand All @@ -18,10 +20,7 @@
def index():
if current_user.is_authenticated:
return redirect(url_for('user.profile'))

page = int(request.args.get('page', 1))
pagination = User.query.paginate(page=page, per_page=10)
return render_template('index.html', pagination=pagination)
return render_template('index.html')


@frontend.route('/login', methods=['GET', 'POST'])
Expand Down Expand Up @@ -57,10 +56,10 @@ def reauth():
form.password.data)
if user and authenticated:
confirm_login()
flash(_('Reauthenticated.'), 'success')
flash('Reauthenticated.', 'success')
return redirect('/change_password')

flash(_('Password is wrong.'), 'danger')
flash('Password is wrong.', 'danger')
return render_template('frontend/reauth.html', form=form)


Expand Down Expand Up @@ -117,8 +116,7 @@ def change_password():
db.session.add(user)
db.session.commit()

flash(_("Your password has been changed, please log in again"),
"success")
flash("Your password has been changed, please log in again", "success")
return redirect(url_for("frontend.login"))

return render_template("frontend/change_password.html", form=form)
Expand Down
2 changes: 1 addition & 1 deletion fbone/templates/layouts/user.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<div class="col-md-3">
<div class="panel panel-default">
<div class="panel-heading clearfix">
<b>{{ user.name }}</b>
<b>{{ current_user.name }}</b>
</div>
<div class="panel-body">
<ul class="nav nav-pills nav-stacked">
Expand Down
Loading

0 comments on commit adbb004

Please sign in to comment.