123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- # -*- coding: utf-8 -*-
- """
- flaskbb.extensions
- ~~~~~~~~~~~~~~~~~~
- The extensions that are used by FlaskBB.
- :copyright: (c) 2014 by the FlaskBB Team.
- :license: BSD, see LICENSE for more details.
- """
- from inspect import isclass
- from celery import Celery
- from flask_alembic import Alembic
- from flask_allows import Allows
- from flask_babelplus import Babel
- from flask_caching import Cache
- from flask_debugtoolbar import DebugToolbarExtension
- from flask_limiter import Limiter
- from flask_limiter.util import get_remote_address
- from flask_login import LoginManager
- from flask_mail import Mail
- from flask_redis import FlaskRedis
- from flask_sqlalchemy import BaseQuery, SQLAlchemy
- from flask_themes2 import Themes
- from flask_whooshee import (DELETE_KWD, INSERT_KWD, UPDATE_KWD, Whooshee,
- WhoosheeQuery)
- from flask_wtf.csrf import CSRFProtect
- from flaskbb.exceptions import AuthorizationRequired
- from sqlalchemy import MetaData, event
- from sqlalchemy.orm import Query as SQLAQuery
- class FlaskBBWhooshee(Whooshee):
- def register_whoosheer(self, wh):
- """This will register the given whoosher on `whoosheers`, create the
- neccessary SQLAlchemy event listeners, replace the `query_class` with
- our own query class which will provide the search functionality
- and store the app on the whoosheer, so that we can always work
- with that.
- :param wh: The whoosher which should be registered.
- """
- self.whoosheers.append(wh)
- for model in wh.models:
- event.listen(model, 'after_{0}'.format(INSERT_KWD), self.after_insert) # noqa
- event.listen(model, 'after_{0}'.format(UPDATE_KWD), self.after_update) # noqa
- event.listen(model, 'after_{0}'.format(DELETE_KWD), self.after_delete) # noqa
- query_class = getattr(model, 'query_class', None)
- if query_class is not None and isclass(query_class):
- # already a subclass, ignore it
- if issubclass(query_class, self.query):
- pass
- # ensure there can be a stable MRO
- elif query_class not in (BaseQuery, SQLAQuery, WhoosheeQuery):
- query_class_name = query_class.__name__
- model.query_class = type(
- "Whooshee{}".format(query_class_name),
- (query_class, self.query),
- {}
- )
- else:
- model.query_class = self.query
- else:
- model.query_class = self.query
- if self.app:
- wh.app = self.app
- return wh
- # Permissions Manager
- allows = Allows(throws=AuthorizationRequired)
- # Database
- metadata = MetaData(
- naming_convention={
- "ix": 'ix_%(column_0_label)s',
- "uq": "uq_%(table_name)s_%(column_0_name)s",
- "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
- "pk": "pk_%(table_name)s"
- }
- )
- db = SQLAlchemy(metadata=metadata)
- # Whooshee (Full Text Search)
- whooshee = FlaskBBWhooshee()
- # Login
- login_manager = LoginManager()
- # Mail
- mail = Mail()
- # Caching
- cache = Cache()
- # Redis
- redis_store = FlaskRedis()
- # Debugtoolbar
- debugtoolbar = DebugToolbarExtension()
- # Migrations
- alembic = Alembic()
- # Themes
- themes = Themes()
- # Babel
- babel = Babel()
- # CSRF
- csrf = CSRFProtect()
- # Rate Limiting
- limiter = Limiter(auto_check=False, key_func=get_remote_address)
- # Celery
- celery = Celery("flaskbb")
|