123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #!/usr/bin/env python
- # -*- coding=UTF-8 -*-
- # **************************************************************************
- # Copyright © 2016 jianglin
- # File Name: extensions.py
- # Author: jianglin
- # Email: xiyang0807@gmail.com
- # Created: 2016-05-20 13:02:50 (CST)
- # Last Update:星期日 2016-7-24 21:51:35 (CST)
- # By:
- # Description:
- # **************************************************************************
- from flask import request, g
- from flask.json import JSONEncoder
- from flask_wtf.csrf import CsrfProtect
- from flask_maple import Bootstrap, Error, Captcha
- from flask_login import LoginManager
- from flask_babelex import Babel
- from flask_babelex import lazy_gettext as _
- from flask_mail import Mail
- from flask_principal import Principal
- from flask_avatar import Avatar
- from flask_cache import Cache
- from flask_maple_rbac import Rbac
- from redis import StrictRedis
- def register_avatar(app):
- Avatar(app)
- def register_form(app):
- csrf = CsrfProtect()
- csrf.init_app(app)
- def register_rbac(app):
- from maple.user.models import Role
- from maple.permission.models import Route, Permiss
- from flask_login import current_user
- rbac = Rbac(app,
- role_model=Role,
- route_model=Route,
- permission_model=Permiss,
- user_loader=current_user,
- skip_startswith_rules=['/admin', '/static'],
- skip_rules=['topic.topic', 'static_from_root', 'avatar',
- 'upload.avatar_file'])
- return rbac
- def register_babel(app):
- babel = Babel()
- babel.init_app(app)
- class CustomJSONEncoder(JSONEncoder):
- """This class adds support for lazy translation texts to Flask's
- JSON encoder. This is necessary when flashing translated texts."""
- def default(self, obj):
- from speaklater import is_lazy_string
- if is_lazy_string(obj):
- try:
- return unicode(obj) # python 2
- except NameError:
- return str(obj) # python 3
- return super(CustomJSONEncoder, self).default(obj)
- app.json_encoder = CustomJSONEncoder
- @babel.localeselector
- def get_locale():
- # return 'zh'
- user = getattr(g, 'user', None)
- if user is not None:
- if g.user.is_authenticated:
- return user.setting.locale or 'zh'
- return request.accept_languages.best_match(app.config[
- 'LANGUAGES'].keys())
- @babel.timezoneselector
- def get_timezone():
- user = getattr(g, 'user', None)
- if user is not None:
- if g.user.is_authenticated:
- return user.setting.timezone or 'UTC'
- return 'UTC'
- def register_maple(app):
- Bootstrap(app,
- css=('styles/monokai.css', 'styles/mine.css',
- 'tags/css/bootstrap-tokenfield.css'),
- js=('styles/upload.js', 'styles/forums.js', 'styles/mine.js',
- 'styles/topic.js', 'tags/bootstrap-tokenfield.min.js'),
- use_auth=True)
- Captcha(app)
- Error(app)
- def register_redis(app):
- redis_data = StrictRedis(db=app.config['CACHE_REDIS_DB'],
- password=app.config['CACHE_REDIS_PASSWORD'],
- decode_responses=True)
- return redis_data
- def register_cache(app):
- cache = Cache(config={'CACHE_TYPE': 'null'})
- cache.init_app(app)
- return cache
- def register_mail(app):
- mail = Mail()
- mail.init_app(app)
- return mail
- def register_login(app):
- login_manager = LoginManager()
- login_manager.init_app(app)
- login_manager.login_view = "auth.login"
- login_manager.session_protection = "strong"
- login_manager.login_message = _("Please login to access this page.")
- # login_manager.anonymous_user = Anonymous
- from maple.user.models import User
- # @login_manager.token_loader
- # def load_token(token):
- # max_age = app.config["REMEMBER_COOKIE_DURATION"].total_seconds()
- # data = login_serializer.loads(token, max_age=max_age)
- # user = User.load_by_name(data[0])
- # if user and data[1] == user.password:
- # return user
- # return None
- @login_manager.user_loader
- def user_loader(id):
- user = User.query.get(int(id))
- return user
- return login_manager
- def register_principal(app):
- principal = Principal()
- principal.init_app(app)
- def register_jinja2(app):
- from maple.main.records import load_online_users
- from .filters import Filters, safe_clean
- app.jinja_env.globals['Title'] = Filters.Title
- app.jinja_env.globals['hot_tags'] = Filters.hot_tags
- app.jinja_env.globals['recent_tags'] = Filters.recent_tags
- app.jinja_env.globals['notice_count'] = Filters.notice_count
- app.jinja_env.filters['get_last_reply'] = Filters.get_last_reply
- app.jinja_env.filters['get_user_infor'] = Filters.get_user_infor
- app.jinja_env.filters['get_read_count'] = Filters.get_read_count
- app.jinja_env.filters['timesince'] = Filters.timesince
- app.jinja_env.filters['get_online_users'] = load_online_users
- app.jinja_env.filters['markdown'] = Filters.safe_markdown
- app.jinja_env.filters['safe_clean'] = safe_clean
- app.jinja_env.filters['is_collected'] = Filters.is_collected
|