| @@ -11,16 +11,14 @@ | |||
| from earwigbot import bot, exceptions | |||
| import oursql | |||
| def get_results(bot, lang, project, title, url, query): | |||
| try: | |||
| site = bot.wiki.get_site(lang=lang, project=project) # UPDATE ME FOR SPECIAL SITES! | |||
| except exceptions.SiteNotFoundError: | |||
| try: | |||
| site = bot.wiki.add_site(lang=lang, project=project) # TODO: what if the site doesn't exist? | |||
| except exceptions.APIError: | |||
| return None, None | |||
| def get_results(bot, lang, project, all_projects, title, url, query): | |||
| site = get_site(bot, lang, project, all_projects) | |||
| if not site: | |||
| return None, None | |||
| page = site.get_page(title) | |||
| if page.exists in [page.PAGE_MISSING, page.PAGE_INVALID]: | |||
| return page, None | |||
| page = site.get_page(title) # TODO: what if the page doesn't exist? | |||
| # if url: | |||
| # result = get_url_specific_results(page, url) | |||
| # else: | |||
| @@ -36,6 +34,25 @@ | |||
| True, 0.67123, "http://example.com/", 7, mc1, (mc2, mci)) | |||
| return page, result | |||
| def get_site(bot, lang, project, all_projects): | |||
| if project not in [proj[0] for proj in all_projects]: | |||
| return None | |||
| if project == "wikimedia": # Special sites: | |||
| try: | |||
| return bot.wiki.get_site(name=lang) | |||
| except exceptions.SiteNotFoundError: | |||
| try: | |||
| return bot.wiki.add_site(lang=lang, project=project) | |||
| except exceptions.APIError: | |||
| return None | |||
| try: | |||
| return bot.wiki.get_site(lang=lang, project=project) | |||
| except exceptions.SiteNotFoundError: | |||
| try: | |||
| return bot.wiki.add_site(lang=lang, project=project) | |||
| except exceptions.APIError: | |||
| return None | |||
| def get_url_specific_results(page, url): | |||
| t_start = time() | |||
| result = page.copyvio_compare(url) | |||
| @@ -118,14 +135,13 @@ | |||
| time_since_update = int(time() - cursor.fetchall()[0][0]) | |||
| if time_since_update > max_staleness: | |||
| update_sites(bot, cursor) | |||
| langs = load_sites_from_db(cursor, query2, site.lang) | |||
| projects = load_sites_from_db(cursor, query3, site.project) | |||
| langs = "\n".join(langs) | |||
| projects = "\n".join(projects) | |||
| result = '<select name="lang">\n{0}\n</select>\n'.format(langs) | |||
| result += '<select name="project">\n{0}\n</select>'.format(projects) | |||
| return result | |||
| cursor.execute(query2) | |||
| langs = cursor.fetchall() | |||
| cursor.execute(query3) | |||
| projects = cursor.fetchall() | |||
| return langs, projects | |||
| def update_sites(site, cursor): | |||
| matrix = site.api_query(action="sitematrix")["sitematrix"] | |||
| @@ -171,16 +187,6 @@ | |||
| cursor.executemany(q_rmv, removals) | |||
| cursor.executemany(q_update, updates) | |||
| def load_sites_from_db(cursor, query, selected_code): | |||
| tl_normal = '<option value="{0}">{1}</option>' | |||
| tl_selected = '<option value="{0}" selected="selected">{1}</option>' | |||
| cursor.execute(query) | |||
| results = [] | |||
| for code, name in cursor.fetchall(): | |||
| template = tl_selected if code == selected_code else tl_normal | |||
| results.append(template.format(code, name)) | |||
| return results | |||
| def highlight_delta(chain, delta): | |||
| processed = [] | |||
| prev_prev = prev = chain.START | |||
| @@ -262,16 +268,18 @@ | |||
| %>\ | |||
| <% | |||
| bot = bot.Bot(".earwigbot") | |||
| site = bot.wiki.get_site() | |||
| query = parse_qs(environ["QUERY_STRING"]) | |||
| try: | |||
| lang = query["lang"][0] | |||
| project = query["project"][0] | |||
| title = query["title"][0] | |||
| url = query.get("url", [None])[0] | |||
| except (KeyError, IndexError): | |||
| page = None | |||
| lang = query["lang"][0].lower() if "lang" in query else None | |||
| project = query["project"][0].lower() if "project" in query else None | |||
| title = query["title"][0] if "title" in query else None | |||
| url = query["url"][0] if "url" in query else None | |||
| all_langs, all_projects = get_sites(bot) | |||
| if lang and project and title: | |||
| page, result = get_results(bot, lang, project, all_projects, title, | |||
| url, query) | |||
| else: | |||
| page, result = get_results(bot, lang, project, title, url, query) | |||
| page = result = None | |||
| %>\ | |||
| <%include file="/support/header.mako" args="environ=environ, title='Copyvio Detector', add_css=('copyvios.css',), add_js=('copyvios.js',)"/> | |||
| <h1>Copyvio Detector</h1> | |||
| @@ -281,13 +289,34 @@ | |||
| <tr> | |||
| <td>Site:</td> | |||
| <td> | |||
| ${get_sites(bot)} | |||
| <% selected_lang = lang if lang else site.lang %> | |||
| <select name="lang"> | |||
| % for code, name in all_langs: | |||
| % if code == selected_lang: | |||
| <option value="${code}" selected="selected">${name}</option> | |||
| % else: | |||
| <option value="${code}">${name}</option> | |||
| % endif | |||
| % endfor | |||
| </select> | |||
| <% selected_project = project if project else site.project %> | |||
| <select name="project"> | |||
| % for code, name in all_projects: | |||
| % if code == selected_project: | |||
| <option value="${code}" selected="selected">${name}</option> | |||
| % else: | |||
| <option value="${code}">${name}</option> | |||
| % endif | |||
| % endfor | |||
| </select> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td>Page title:</td> | |||
| % if page: | |||
| <td><input type="text" name="title" size="60" value="${page.title() | h}" /></td> | |||
| % elif title: | |||
| <td><input type="text" name="title" size="60" value="${title | h}" /></td> | |||
| % else: | |||
| <td><input type="text" name="title" size="60" /></td> | |||
| % endif | |||
| @@ -315,7 +344,11 @@ | |||
| </tr> | |||
| </table> | |||
| </form> | |||
| % if page: | |||
| % if project and lang and title and not page: | |||
| CASE WHEN GIVEN SITE DOESN'T EXIST | |||
| % elif project and lang and title and page and not result: | |||
| CASE WHEN GIVEN PAGE DOESN'T EXIST | |||
| % elif page: | |||
| <div class="divider"></div> | |||
| <div id="cv-result-${'yes' if result.violation else 'no'}"> | |||
| % if result.violation: | |||