| @@ -17,6 +17,7 @@ from flup.server.fcgi import WSGIServer | |||||
| from copyvios.api import format_api_error, handle_api_request | from copyvios.api import format_api_error, handle_api_request | ||||
| from copyvios.checker import do_check | from copyvios.checker import do_check | ||||
| from copyvios.cookies import parse_cookies | from copyvios.cookies import parse_cookies | ||||
| from copyvios.misc import cache | |||||
| from copyvios.settings import process_settings | from copyvios.settings import process_settings | ||||
| from copyvios.sites import update_sites | from copyvios.sites import update_sites | ||||
| @@ -28,8 +29,6 @@ app.logger.addHandler(TimedRotatingFileHandler( | |||||
| "logs/app.log", when="midnight", backupCount=7)) | "logs/app.log", when="midnight", backupCount=7)) | ||||
| app.logger.info(u"Flask server started " + asctime()) | app.logger.info(u"Flask server started " + asctime()) | ||||
| getLogger("earwigbot.wiki.cvworker").setLevel(INFO) | |||||
| def catch_errors(func): | def catch_errors(func): | ||||
| @wraps(func) | @wraps(func) | ||||
| def inner(*args, **kwargs): | def inner(*args, **kwargs): | ||||
| @@ -43,16 +42,19 @@ def catch_errors(func): | |||||
| @app.before_first_request | @app.before_first_request | ||||
| def setup_app(): | def setup_app(): | ||||
| g.bot = Bot(".earwigbot", 100) | |||||
| g.langs, g.projects = set(), set() | |||||
| g.last_sites_update = 0 | |||||
| g.background_data = {} | |||||
| g.last_background_updates = {} | |||||
| cache.bot = Bot(".earwigbot", 100) | |||||
| cache.langs, cache.projects = set(), set() | |||||
| cache.last_sites_update = 0 | |||||
| cache.background_data = {} | |||||
| cache.last_background_updates = {} | |||||
| getLogger("earwigbot.wiki.cvworker").setLevel(INFO) | |||||
| # getLogger().handlers .... | |||||
| globalize() | globalize() | ||||
| @app.before_request | @app.before_request | ||||
| def prepare_request(): | def prepare_request(): | ||||
| g.db = None | |||||
| g._db = None | |||||
| g.cookies = parse_cookies( | g.cookies = parse_cookies( | ||||
| request.script_root, request.environ.get("HTTP_COOKIE")) | request.script_root, request.environ.get("HTTP_COOKIE")) | ||||
| g.new_cookies = [] | g.new_cookies = [] | ||||
| @@ -72,8 +74,8 @@ def write_access_log(response): | |||||
| @app.teardown_appcontext | @app.teardown_appcontext | ||||
| def close_databases(error): | def close_databases(error): | ||||
| if g.db: | |||||
| g.db.close() | |||||
| if g._db: | |||||
| g._db.close() | |||||
| @app.route("/") | @app.route("/") | ||||
| @catch_errors | @catch_errors | ||||
| @@ -87,7 +89,7 @@ def index(): | |||||
| def settings(): | def settings(): | ||||
| status = process_settings() if request.method == "POST" else None | status = process_settings() if request.method == "POST" else None | ||||
| update_sites() | update_sites() | ||||
| default = g.bot.wiki.get_site() | |||||
| default = cache.bot.wiki.get_site() | |||||
| kwargs = {"status": status, "default_lang": default.lang, | kwargs = {"status": status, "default_lang": default.lang, | ||||
| "default_project": default.project} | "default_project": default.project} | ||||
| return render_template("settings.mako", **kwargs) | return render_template("settings.mako", **kwargs) | ||||
| @@ -2,10 +2,8 @@ | |||||
| from collections import OrderedDict | from collections import OrderedDict | ||||
| from flask import g | |||||
| from .checker import do_check, T_POSSIBLE, T_SUSPECT | from .checker import do_check, T_POSSIBLE, T_SUSPECT | ||||
| from .misc import Query | |||||
| from .misc import Query, cache | |||||
| from .sites import update_sites | from .sites import update_sites | ||||
| __all__ = ["format_api_error", "handle_api_request"] | __all__ = ["format_api_error", "handle_api_request"] | ||||
| @@ -95,8 +93,8 @@ def _hook_check(query): | |||||
| def _hook_sites(query): | def _hook_sites(query): | ||||
| update_sites() | update_sites() | ||||
| return OrderedDict(( | |||||
| ("status", "ok"), ("langs", g.langs), ("projects", g.projects))) | |||||
| return OrderedDict((("status", "ok"), | |||||
| ("langs", cache.langs), ("projects", cache.projects))) | |||||
| _HOOKS = { | _HOOKS = { | ||||
| "compare": _hook_check, | "compare": _hook_check, | ||||
| @@ -8,13 +8,15 @@ import re | |||||
| from earwigbot import exceptions | from earwigbot import exceptions | ||||
| from flask import g | from flask import g | ||||
| from .misc import cache | |||||
| __all__ = ["set_background"] | __all__ = ["set_background"] | ||||
| def _get_commons_site(): | def _get_commons_site(): | ||||
| try: | try: | ||||
| return g.bot.wiki.get_site("commonswiki") | |||||
| return cache.bot.wiki.get_site("commonswiki") | |||||
| except exceptions.SiteNotFoundError: | except exceptions.SiteNotFoundError: | ||||
| return g.bot.wiki.add_site(project="wikimedia", lang="commons") | |||||
| return cache.bot.wiki.add_site(project="wikimedia", lang="commons") | |||||
| def _load_file(site, filename): | def _load_file(site, filename): | ||||
| res = site.api_query(action="query", prop="imageinfo", iiprop="url|size", | res = site.api_query(action="query", prop="imageinfo", iiprop="url|size", | ||||
| @@ -57,23 +59,23 @@ _BACKGROUNDS = { | |||||
| } | } | ||||
| def _get_background(selected): | def _get_background(selected): | ||||
| if not g.last_background_updates: | |||||
| if not cache.last_background_updates: | |||||
| for key in _BACKGROUNDS: | for key in _BACKGROUNDS: | ||||
| g.last_background_updates[key] = datetime.min | |||||
| cache.last_background_updates[key] = datetime.min | |||||
| plus_one = g.last_background_updates[selected] + timedelta(days=1) | |||||
| plus_one = cache.last_background_updates[selected] + timedelta(days=1) | |||||
| max_age = datetime(plus_one.year, plus_one.month, plus_one.day) | max_age = datetime(plus_one.year, plus_one.month, plus_one.day) | ||||
| if datetime.utcnow() > max_age: | if datetime.utcnow() > max_age: | ||||
| update_func = _BACKGROUNDS.get(selected, _get_fresh_list) | update_func = _BACKGROUNDS.get(selected, _get_fresh_list) | ||||
| g.background_data[selected] = update_func() | |||||
| g.last_background_updates[selected] = datetime.utcnow() | |||||
| return g.background_data[selected] | |||||
| cache.background_data[selected] = update_func() | |||||
| cache.last_background_updates[selected] = datetime.utcnow() | |||||
| return cache.background_data[selected] | |||||
| def set_background(selected): | def set_background(selected): | ||||
| if "CopyviosScreenCache" in g.cookies: | if "CopyviosScreenCache" in g.cookies: | ||||
| cache = g.cookies["CopyviosScreenCache"].value | |||||
| screen_cache = g.cookies["CopyviosScreenCache"].value | |||||
| try: | try: | ||||
| screen = loads(cache) | |||||
| screen = loads(screen_cache) | |||||
| int(screen["width"]) | int(screen["width"]) | ||||
| int(screen["height"]) | int(screen["height"]) | ||||
| except (ValueError, KeyError): | except (ValueError, KeyError): | ||||
| @@ -8,7 +8,7 @@ from sqlalchemy.pool import manage | |||||
| oursql = manage(oursql) | oursql = manage(oursql) | ||||
| __all__ = ["Query", "get_db", "httpsfix", "urlstrip"] | |||||
| __all__ = ["Query", "cache", "get_db", "httpsfix", "urlstrip"] | |||||
| class Query(object): | class Query(object): | ||||
| def __init__(self, method="GET"): | def __init__(self, method="GET"): | ||||
| @@ -27,14 +27,27 @@ class Query(object): | |||||
| self.query[key] = value | self.query[key] = value | ||||
| class _AppCache(object): | |||||
| def __init__(self): | |||||
| self._data = {} | |||||
| def __getattr__(self, key): | |||||
| return self._data[key] | |||||
| def __setattr__(self, key, value): | |||||
| self._data[key] = value | |||||
| cache = _AppCache() | |||||
| def get_db(): | def get_db(): | ||||
| if not g.db: | |||||
| args = g.bot.config.wiki["_copyviosSQL"] | |||||
| if not g._db: | |||||
| args = cache.bot.config.wiki["_copyviosSQL"] | |||||
| args["read_default_file"] = expanduser("~/.my.cnf") | args["read_default_file"] = expanduser("~/.my.cnf") | ||||
| args["autoping"] = True | args["autoping"] = True | ||||
| args["autoreconnect"] = True | args["autoreconnect"] = True | ||||
| g.db = oursql.connect(**args) | |||||
| return g.db | |||||
| g._db = oursql.connect(**args) | |||||
| return g._db | |||||
| def httpsfix(context, url): | def httpsfix(context, url): | ||||
| if url.startswith("http://"): | if url.startswith("http://"): | ||||
| @@ -4,13 +4,14 @@ from time import time | |||||
| from urlparse import urlparse | from urlparse import urlparse | ||||
| from earwigbot import exceptions | from earwigbot import exceptions | ||||
| from flask import g | |||||
| from .misc import cache | |||||
| __all__ = ["get_site", "update_sites"] | __all__ = ["get_site", "update_sites"] | ||||
| def get_site(query): | def get_site(query): | ||||
| lang, project, name = query.lang, query.project, query.name | lang, project, name = query.lang, query.project, query.name | ||||
| wiki = g.bot.wiki | |||||
| wiki = cache.bot.wiki | |||||
| if project not in [proj[0] for proj in query.all_projects]: | if project not in [proj[0] for proj in query.all_projects]: | ||||
| return None | return None | ||||
| if project == "wikimedia" and name: # Special sites: | if project == "wikimedia" and name: # Special sites: | ||||
| @@ -30,12 +31,12 @@ def get_site(query): | |||||
| return None | return None | ||||
| def update_sites(): | def update_sites(): | ||||
| if time() - g.last_sites_update > 60 * 60 * 24 * 7: | |||||
| g.langs, g.projects = _load_sites() | |||||
| g.last_sites_update = time() | |||||
| if time() - cache.last_sites_update > 60 * 60 * 24 * 7: | |||||
| cache.langs, cache.projects = _load_sites() | |||||
| cache.last_sites_update = time() | |||||
| def _load_sites(): | def _load_sites(): | ||||
| site = g.bot.wiki.get_site() | |||||
| site = cache.bot.wiki.get_site() | |||||
| matrix = site.api_query(action="sitematrix")["sitematrix"] | matrix = site.api_query(action="sitematrix")["sitematrix"] | ||||
| del matrix["count"] | del matrix["count"] | ||||
| langs, projects = set(), set() | langs, projects = set(), set() | ||||
| @@ -1,6 +1,7 @@ | |||||
| <%! | <%! | ||||
| from flask import g, request | from flask import g, request | ||||
| from copyvios.checker import T_POSSIBLE, T_SUSPECT | from copyvios.checker import T_POSSIBLE, T_SUSPECT | ||||
| from copyvios.misc import cache | |||||
| %>\ | %>\ | ||||
| <%include file="/support/header.mako" args="title='Earwig\'s Copyvio Detector'"/> | <%include file="/support/header.mako" args="title='Earwig\'s Copyvio Detector'"/> | ||||
| <%namespace module="copyvios.highlighter" import="highlight_delta"/>\ | <%namespace module="copyvios.highlighter" import="highlight_delta"/>\ | ||||
| @@ -50,8 +51,8 @@ | |||||
| <td colspan="3"> | <td colspan="3"> | ||||
| <span class="mono">https://</span> | <span class="mono">https://</span> | ||||
| <select name="lang"> | <select name="lang"> | ||||
| <% selected_lang = query.orig_lang if query.orig_lang else g.cookies["CopyviosDefaultLang"].value if "CopyviosDefaultLang" in g.cookies else g.bot.wiki.get_site().lang %>\ | |||||
| % for code, name in g.langs: | |||||
| <% selected_lang = query.orig_lang if query.orig_lang else g.cookies["CopyviosDefaultLang"].value if "CopyviosDefaultLang" in g.cookies else cache.bot.wiki.get_site().lang %>\ | |||||
| % for code, name in cache.langs: | |||||
| % if code == selected_lang: | % if code == selected_lang: | ||||
| <option value="${code | h}" selected="selected">${name}</option> | <option value="${code | h}" selected="selected">${name}</option> | ||||
| % else: | % else: | ||||
| @@ -61,8 +62,8 @@ | |||||
| </select> | </select> | ||||
| <span class="mono">.</span> | <span class="mono">.</span> | ||||
| <select name="project"> | <select name="project"> | ||||
| <% selected_project = query.project if query.project else g.cookies["CopyviosDefaultProject"].value if "CopyviosDefaultProject" in g.cookies else g.bot.wiki.get_site().project %>\ | |||||
| % for code, name in g.projects: | |||||
| <% selected_project = query.project if query.project else g.cookies["CopyviosDefaultProject"].value if "CopyviosDefaultProject" in g.cookies else cache.bot.wiki.get_site().project %>\ | |||||
| % for code, name in cache.projects: | |||||
| % if code == selected_project: | % if code == selected_project: | ||||
| <option value="${code | h}" selected="selected">${name}</option> | <option value="${code | h}" selected="selected">${name}</option> | ||||
| % else: | % else: | ||||
| @@ -1,6 +1,7 @@ | |||||
| <%! | <%! | ||||
| from json import dumps, loads | from json import dumps, loads | ||||
| from flask import g, request | from flask import g, request | ||||
| from copyvios.misc import cache | |||||
| %>\ | %>\ | ||||
| <%include file="/support/header.mako" args="title='Settings - Earwig\'s Copyvio Detector'"/> | <%include file="/support/header.mako" args="title='Settings - Earwig\'s Copyvio Detector'"/> | ||||
| % if status: | % if status: | ||||
| @@ -17,7 +18,7 @@ | |||||
| <span class="mono">https://</span> | <span class="mono">https://</span> | ||||
| <select name="lang"> | <select name="lang"> | ||||
| <% selected_lang = g.cookies["CopyviosDefaultLang"].value if "CopyviosDefaultLang" in g.cookies else default_lang %>\ | <% selected_lang = g.cookies["CopyviosDefaultLang"].value if "CopyviosDefaultLang" in g.cookies else default_lang %>\ | ||||
| % for code, name in g.langs: | |||||
| % for code, name in cache.langs: | |||||
| % if code == selected_lang: | % if code == selected_lang: | ||||
| <option value="${code | h}" selected="selected">${name}</option> | <option value="${code | h}" selected="selected">${name}</option> | ||||
| % else: | % else: | ||||
| @@ -28,7 +29,7 @@ | |||||
| <span class="mono">.</span> | <span class="mono">.</span> | ||||
| <select name="project"> | <select name="project"> | ||||
| <% selected_project = g.cookies["CopyviosDefaultProject"].value if "CopyviosDefaultProject" in g.cookies else default_project %>\ | <% selected_project = g.cookies["CopyviosDefaultProject"].value if "CopyviosDefaultProject" in g.cookies else default_project %>\ | ||||
| % for code, name in g.projects: | |||||
| % for code, name in cache.projects: | |||||
| % if code == selected_project: | % if code == selected_project: | ||||
| <option value="${code | h}" selected="selected">${name}</option> | <option value="${code | h}" selected="selected">${name}</option> | ||||
| % else: | % else: | ||||