1
0
Fork 0
mirror of https://gitlab.com/SIGBUS/nyaa.git synced 2024-12-22 14:00:00 +00:00

Prepare for app factory [1 of 2] (#315)

* Move db, assets, debug toolbar and fix_paginate into nyaa.extensions
* Change all `from nyaa import db` imports to `from nyaa.extensions import db`
* Move `nyaa.torrents.create_magnet_from_es_info` context processor into template-utils blueprint
* Fix tools (wrap in `with app.app_context():` where needed)
This commit is contained in:
Kfir Hadas 2017-07-30 20:35:16 +03:00 committed by GitHub
parent 1dae331156
commit 0181d6cb33
16 changed files with 121 additions and 98 deletions

View file

@ -1,7 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys
import sqlalchemy import sqlalchemy
from nyaa import app, db, models
from nyaa import app, models
from nyaa.extensions import db
NYAA_CATEGORIES = [ NYAA_CATEGORIES = [
('Anime', ['Anime Music Video', 'English-translated', 'Non-English-translated', 'Raw']), ('Anime', ['Anime Music Video', 'English-translated', 'Non-English-translated', 'Raw']),
@ -29,6 +30,7 @@ def add_categories(categories, main_class, sub_class):
if __name__ == '__main__': if __name__ == '__main__':
with app.app_context():
# Test for the user table, assume db is empty if it's not created # Test for the user table, assume db is empty if it's not created
database_empty = False database_empty = False
try: try:
@ -36,11 +38,9 @@ if __name__ == '__main__':
except (sqlalchemy.exc.ProgrammingError, sqlalchemy.exc.OperationalError): except (sqlalchemy.exc.ProgrammingError, sqlalchemy.exc.OperationalError):
database_empty = True database_empty = True
print('Creating all tables...') print('Creating all tables...')
db.create_all() db.create_all()
nyaa_category_test = models.NyaaMainCategory.query.first() nyaa_category_test = models.NyaaMainCategory.query.first()
if not nyaa_category_test: if not nyaa_category_test:
print('Adding Nyaa categories...') print('Adding Nyaa categories...')

View file

@ -1,10 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sys import sys
from nyaa import app, db
from flask_script import Manager from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand from flask_migrate import Migrate, MigrateCommand
from nyaa import app
from nyaa.extensions import db
migrate = Migrate(app, db) migrate = Migrate(app, db)
manager = Manager(app) manager = Manager(app)

View file

@ -7,14 +7,15 @@ with a cron job or some binlog-reading thing (TODO)
""" """
import sys import sys
import json import json
from nyaa import app, db, models
# This should be progressbar33
import progressbar
from elasticsearch import Elasticsearch from elasticsearch import Elasticsearch
from elasticsearch.client import IndicesClient from elasticsearch.client import IndicesClient
from elasticsearch import helpers from elasticsearch import helpers
# This should be progressbar33 from nyaa import app, models
import progressbar from nyaa.extensions import db
es = Elasticsearch(timeout=30) es = Elasticsearch(timeout=30)
ic = IndicesClient(es) ic = IndicesClient(es)
@ -93,7 +94,8 @@ FLAVORS = [
] ]
# Get binlog status from mysql # Get binlog status from mysql
master_status = db.engine.execute('SHOW MASTER STATUS;').fetchone() with app.app_context():
master_status = db.engine.execute('SHOW MASTER STATUS;').fetchone()
position_json = { position_json = {
'log_file': master_status[0], 'log_file': master_status[0],

View file

@ -2,26 +2,20 @@ import logging
import os import os
import flask import flask
from flask_assets import Bundle, Environment # noqa F401 from flask_assets import Bundle # noqa F401
from flask_debugtoolbar import DebugToolbarExtension
from flask_sqlalchemy import SQLAlchemy
from nyaa import fix_paginate # noqa F401 from nyaa.extensions import assets, db, fix_paginate, toolbar
app = flask.Flask(__name__) app = flask.Flask(__name__)
app.config.from_object('config') app.config.from_object('config')
# Database
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['MYSQL_DATABASE_CHARSET'] = 'utf8mb4'
# Don't refresh cookie each request # Don't refresh cookie each request
app.config['SESSION_REFRESH_EACH_REQUEST'] = False app.config['SESSION_REFRESH_EACH_REQUEST'] = False
# Debugging # Debugging
if app.config['DEBUG']: if app.config['DEBUG']:
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
toolbar = DebugToolbarExtension(app) toolbar.init_app(app)
app.logger.setLevel(logging.DEBUG) app.logger.setLevel(logging.DEBUG)
# Forbid caching # Forbid caching
@ -63,9 +57,13 @@ app.jinja_env.add_extension('jinja2.ext.do')
app.jinja_env.lstrip_blocks = True app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True app.jinja_env.trim_blocks = True
db = SQLAlchemy(app) # Database
fix_paginate() # This has to be before the database is initialized
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['MYSQL_DATABASE_CHARSET'] = 'utf8mb4'
db.init_app(app)
assets = Environment(app) assets.init_app(app)
# css = Bundle('style.scss', filters='libsass', # css = Bundle('style.scss', filters='libsass',
# output='style.css', depends='**/*.scss') # output='style.css', depends='**/*.scss')

View file

@ -6,7 +6,8 @@ import re
import flask import flask
from nyaa import backend, bencode, db, forms, models, utils from nyaa import backend, bencode, forms, models, utils
from nyaa.extensions import db
from nyaa.views.torrents import _create_upload_category_choices from nyaa.views.torrents import _create_upload_category_choices
api_blueprint = flask.Blueprint('api', __name__) api_blueprint = flask.Blueprint('api', __name__)

View file

@ -7,7 +7,8 @@ from werkzeug import secure_filename
from orderedset import OrderedSet from orderedset import OrderedSet
from nyaa import app, db, models, utils from nyaa import app, models, utils
from nyaa.extensions import db
@utils.cached_function @utils.cached_function

34
nyaa/extensions.py Normal file
View file

@ -0,0 +1,34 @@
from flask import abort
from flask_assets import Environment
from flask_debugtoolbar import DebugToolbarExtension
from flask_sqlalchemy import BaseQuery, Pagination, SQLAlchemy
assets = Environment()
db = SQLAlchemy()
toolbar = DebugToolbarExtension()
def fix_paginate():
def paginate_faste(self, page=1, per_page=50, max_page=None, step=5, count_query=None):
if page < 1:
abort(404)
if max_page and page > max_page:
abort(404)
# Count all items
if count_query is not None:
total_query_count = count_query.scalar()
else:
total_query_count = self.count()
# Grab items on current page
items = self.limit(per_page).offset((page - 1) * per_page).all()
if not items and page != 1:
abort(404)
return Pagination(self, page, per_page, total_query_count, items)
BaseQuery.paginate_faste = paginate_faste

View file

@ -1,27 +0,0 @@
from flask import abort
from flask_sqlalchemy import BaseQuery, Pagination
def paginate_faste(self, page=1, per_page=50, max_page=None, step=5, count_query=None):
if page < 1:
abort(404)
if max_page and page > max_page:
abort(404)
# Count all items
if count_query is not None:
total_query_count = count_query.scalar()
else:
total_query_count = self.count()
# Grab items on current page
items = self.limit(per_page).offset((page - 1) * per_page).all()
if not items and page != 1:
abort(404)
return Pagination(self, page, per_page, total_query_count, items)
BaseQuery.paginate_faste = paginate_faste

View file

@ -15,7 +15,8 @@ from sqlalchemy.ext import declarative
from sqlalchemy_fulltext import FullText from sqlalchemy_fulltext import FullText
from sqlalchemy_utils import ChoiceType, EmailType, PasswordType from sqlalchemy_utils import ChoiceType, EmailType, PasswordType
from nyaa import app, db from nyaa import app
from nyaa.extensions import db
from nyaa.torrents import create_magnet from nyaa.torrents import create_magnet
if app.config['USE_MYSQL']: if app.config['USE_MYSQL']:

View file

@ -10,7 +10,8 @@ from elasticsearch import Elasticsearch
from elasticsearch_dsl import Q, Search from elasticsearch_dsl import Q, Search
from sqlalchemy_fulltext import FullTextSearch from sqlalchemy_fulltext import FullTextSearch
from nyaa import app, db, models from nyaa import app, models
from nyaa.extensions import db
DEFAULT_MAX_SEARCH_RESULT = 1000 DEFAULT_MAX_SEARCH_RESULT = 1000
DEFAULT_PER_PAGE = 75 DEFAULT_PER_PAGE = 75

View file

@ -1,17 +1,40 @@
import os.path import os.path
from base64 import b32encode
from datetime import datetime from datetime import datetime
from email.utils import formatdate from email.utils import formatdate
from urllib.parse import urlencode
import flask import flask
from werkzeug.urls import url_encode from werkzeug.urls import url_encode
from nyaa import app from nyaa import app
from nyaa.backend import get_category_id_map from nyaa.backend import get_category_id_map
from nyaa.torrents import get_default_trackers
bp = flask.Blueprint('template-utils', __name__) bp = flask.Blueprint('template-utils', __name__)
_static_cache = {} # For static_cachebuster _static_cache = {} # For static_cachebuster
# ######################## CONTEXT PROCESSORS ########################
# For processing ES links
@bp.app_context_processor
def create_magnet_from_es_info():
def _create_magnet_from_es_info(display_name, info_hash, max_trackers=5, trackers=None):
if trackers is None:
trackers = get_default_trackers()
magnet_parts = [
('dn', display_name)
]
for tracker in trackers[:max_trackers]:
magnet_parts.append(('tr', tracker))
b32_info_hash = b32encode(bytes.fromhex(info_hash)).decode('utf-8')
return 'magnet:?xt=urn:btih:' + b32_info_hash + '&' + urlencode(magnet_parts)
return dict(create_magnet_from_es_info=_create_magnet_from_es_info)
# ######################### TEMPLATE GLOBALS ######################### # ######################### TEMPLATE GLOBALS #########################
@bp.app_template_global() @bp.app_template_global()

View file

@ -92,24 +92,6 @@ def create_magnet(torrent, max_trackers=5, trackers=None):
return 'magnet:?xt=urn:btih:' + b32_info_hash + '&' + urlencode(magnet_parts) return 'magnet:?xt=urn:btih:' + b32_info_hash + '&' + urlencode(magnet_parts)
# For processing ES links
@app.context_processor
def create_magnet_from_es_info():
def _create_magnet_from_es_info(display_name, info_hash, max_trackers=5, trackers=None):
if trackers is None:
trackers = get_default_trackers()
magnet_parts = [
('dn', display_name)
]
for tracker in trackers[:max_trackers]:
magnet_parts.append(('tr', tracker))
b32_info_hash = base64.b32encode(bytes.fromhex(info_hash)).decode('utf-8')
return 'magnet:?xt=urn:btih:' + b32_info_hash + '&' + urlencode(magnet_parts)
return dict(create_magnet_from_es_info=_create_magnet_from_es_info)
def create_default_metadata_base(torrent, trackers=None, webseeds=None): def create_default_metadata_base(torrent, trackers=None, webseeds=None):
if trackers is None or webseeds is None: if trackers is None or webseeds is None:
db_trackers, db_webseeds = get_trackers_and_webseeds(torrent) db_trackers, db_webseeds = get_trackers_and_webseeds(torrent)

View file

@ -6,7 +6,8 @@ from ipaddress import ip_address
import flask import flask
from nyaa import app, db, forms, models from nyaa import app, forms, models
from nyaa.extensions import db
from nyaa.views.users import get_activation_link from nyaa.views.users import get_activation_link
bp = flask.Blueprint('account', __name__) bp = flask.Blueprint('account', __name__)

View file

@ -1,6 +1,7 @@
import flask import flask
from nyaa import db, forms, models from nyaa import forms, models
from nyaa.extensions import db
bp = flask.Blueprint('admin', __name__) bp = flask.Blueprint('admin', __name__)

View file

@ -7,7 +7,8 @@ from werkzeug.datastructures import CombinedMultiDict
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from nyaa import app, backend, db, forms, models, torrents from nyaa import app, backend, forms, models, torrents
from nyaa.extensions import db
from nyaa.utils import cached_function from nyaa.utils import cached_function
bp = flask.Blueprint('torrents', __name__) bp = flask.Blueprint('torrents', __name__)

View file

@ -5,7 +5,8 @@ from flask_paginate import Pagination
from itsdangerous import BadSignature, URLSafeSerializer from itsdangerous import BadSignature, URLSafeSerializer
from nyaa import app, db, forms, models from nyaa import app, forms, models
from nyaa.extensions import db
from nyaa.search import (DEFAULT_MAX_SEARCH_RESULT, DEFAULT_PER_PAGE, SERACH_PAGINATE_DISPLAY_MSG, from nyaa.search import (DEFAULT_MAX_SEARCH_RESULT, DEFAULT_PER_PAGE, SERACH_PAGINATE_DISPLAY_MSG,
_generate_query_string, search_db, search_elastic) _generate_query_string, search_db, search_elastic)
from nyaa.utils import chain_get from nyaa.utils import chain_get