@@ -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: | ||||