# -*- coding: utf-8 -*- """ :author: Grey Li (李辉) :url: http://greyli.com :copyright: © 2018 Grey Li :license: MIT, see LICENSE for more details. """ import os import click from flask import Flask, render_template from flask_login import current_user from flask_wtf.csrf import CSRFError from albumy.blueprints.admin import admin_bp from albumy.blueprints.ajax import ajax_bp from albumy.blueprints.auth import auth_bp from albumy.blueprints.main import main_bp from albumy.blueprints.user import user_bp from albumy.extensions import bootstrap, db, login_manager, mail, dropzone, moment, whooshee, avatars, csrf from albumy.models import Role, User, Photo, Tag, Follow, Notification, Comment, Collect, Permission from albumy.settings import config def create_app(config_name=None): if config_name is None: config_name = os.getenv('FLASK_CONFIG', 'development') app = Flask(__name__) app.config.from_object(config[config_name]) register_extensions(app) register_blueprints(app) register_commands(app) register_errorhandlers(app) register_shell_context(app) register_template_context(app) return app def register_extensions(app): bootstrap.init_app(app) db.init_app(app) login_manager.init_app(app) mail.init_app(app) dropzone.init_app(app) moment.init_app(app) whooshee.init_app(app) avatars.init_app(app) csrf.init_app(app) def register_blueprints(app): app.register_blueprint(main_bp) app.register_blueprint(user_bp, url_prefix='/user') app.register_blueprint(auth_bp, url_prefix='/auth') app.register_blueprint(admin_bp, url_prefix='/admin') app.register_blueprint(ajax_bp, url_prefix='/ajax') def register_shell_context(app): @app.shell_context_processor def make_shell_context(): return dict(db=db, User=User, Photo=Photo, Tag=Tag, Follow=Follow, Collect=Collect, Comment=Comment, Notification=Notification) def register_template_context(app): @app.context_processor def make_template_context(): if current_user.is_authenticated: notification_count = Notification.query.with_parent(current_user).filter_by(is_read=False).count() else: notification_count = None return dict(notification_count=notification_count) def register_errorhandlers(app): @app.errorhandler(400) def bad_request(e): return render_template('errors/400.html'), 400 @app.errorhandler(403) def forbidden(e): return render_template('errors/403.html'), 403 @app.errorhandler(404) def page_not_found(e): return render_template('errors/404.html'), 404 @app.errorhandler(413) def request_entity_too_large(e): return render_template('errors/413.html'), 413 @app.errorhandler(500) def internal_server_error(e): return render_template('errors/500.html'), 500 @app.errorhandler(CSRFError) def handle_csrf_error(e): return render_template('errors/400.html', description=e.description), 500 def register_commands(app): @app.cli.command() @click.option('--drop', is_flag=True, help='Create after drop.') def initdb(drop): """Initialize the database.""" if drop: click.confirm('This operation will delete the database, do you want to continue?', abort=True) db.drop_all() click.echo('Drop tables.') db.create_all() click.echo('Initialized database.') @app.cli.command() def init(): """Initialize Albumy.""" click.echo('Initializing the database...') db.create_all() click.echo('Initializing the roles and permissions...') Role.init_role() click.echo('Done.') @app.cli.command() @click.option('--user', default=10, help='Quantity of users, default is 10.') @click.option('--follow', default=30, help='Quantity of follows, default is 30.') @click.option('--photo', default=30, help='Quantity of photos, default is 30.') @click.option('--tag', default=20, help='Quantity of tags, default is 20.') @click.option('--collect', default=50, help='Quantity of collects, default is 50.') @click.option('--comment', default=100, help='Quantity of comments, default is 100.') def forge(user, follow, photo, tag, collect, comment): """Generate fake data.""" from albumy.fakes import fake_admin, fake_comment, fake_follow, fake_photo, fake_tag, fake_user, fake_collect db.drop_all() db.create_all() click.echo('Initializing the roles and permissions...') Role.init_role() click.echo('Generating the administrator...') fake_admin() click.echo('Generating %d users...' % user) fake_user(user) click.echo('Generating %d follows...' % follow) fake_follow(follow) click.echo('Generating %d tags...' % tag) fake_tag(tag) click.echo('Generating %d photos...' % photo) fake_photo(photo) click.echo('Generating %d collects...' % photo) fake_collect(collect) click.echo('Generating %d comments...' % comment) fake_comment(comment) click.echo('Done.')