| @@ -11,16 +11,14 @@ | |||||
| from earwigbot import bot, exceptions | from earwigbot import bot, exceptions | ||||
| import oursql | 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: | # if url: | ||||
| # result = get_url_specific_results(page, url) | # result = get_url_specific_results(page, url) | ||||
| # else: | # else: | ||||
| @@ -36,6 +34,25 @@ | |||||
| True, 0.67123, "http://example.com/", 7, mc1, (mc2, mci)) | True, 0.67123, "http://example.com/", 7, mc1, (mc2, mci)) | ||||
| return page, result | 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): | def get_url_specific_results(page, url): | ||||
| t_start = time() | t_start = time() | ||||
| result = page.copyvio_compare(url) | result = page.copyvio_compare(url) | ||||
| @@ -118,14 +135,13 @@ | |||||
| time_since_update = int(time() - cursor.fetchall()[0][0]) | time_since_update = int(time() - cursor.fetchall()[0][0]) | ||||
| if time_since_update > max_staleness: | if time_since_update > max_staleness: | ||||
| update_sites(bot, cursor) | 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): | def update_sites(site, cursor): | ||||
| matrix = site.api_query(action="sitematrix")["sitematrix"] | matrix = site.api_query(action="sitematrix")["sitematrix"] | ||||
| @@ -171,16 +187,6 @@ | |||||
| cursor.executemany(q_rmv, removals) | cursor.executemany(q_rmv, removals) | ||||
| cursor.executemany(q_update, updates) | 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): | def highlight_delta(chain, delta): | ||||
| processed = [] | processed = [] | ||||
| prev_prev = prev = chain.START | prev_prev = prev = chain.START | ||||
| @@ -262,16 +268,18 @@ | |||||
| %>\ | %>\ | ||||
| <% | <% | ||||
| bot = bot.Bot(".earwigbot") | bot = bot.Bot(".earwigbot") | ||||
| site = bot.wiki.get_site() | |||||
| query = parse_qs(environ["QUERY_STRING"]) | 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: | 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',)"/> | <%include file="/support/header.mako" args="environ=environ, title='Copyvio Detector', add_css=('copyvios.css',), add_js=('copyvios.js',)"/> | ||||
| <h1>Copyvio Detector</h1> | <h1>Copyvio Detector</h1> | ||||
| @@ -281,13 +289,34 @@ | |||||
| <tr> | <tr> | ||||
| <td>Site:</td> | <td>Site:</td> | ||||
| <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> | </td> | ||||
| </tr> | </tr> | ||||
| <tr> | <tr> | ||||
| <td>Page title:</td> | <td>Page title:</td> | ||||
| % if page: | % if page: | ||||
| <td><input type="text" name="title" size="60" value="${page.title() | h}" /></td> | <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: | % else: | ||||
| <td><input type="text" name="title" size="60" /></td> | <td><input type="text" name="title" size="60" /></td> | ||||
| % endif | % endif | ||||
| @@ -315,7 +344,11 @@ | |||||
| </tr> | </tr> | ||||
| </table> | </table> | ||||
| </form> | </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 class="divider"></div> | ||||
| <div id="cv-result-${'yes' if result.violation else 'no'}"> | <div id="cv-result-${'yes' if result.violation else 'no'}"> | ||||
| % if result.violation: | % if result.violation: | ||||