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