|
|
@@ -26,6 +26,7 @@ from os.path import expanduser |
|
|
|
from threading import Lock |
|
|
|
from time import sleep |
|
|
|
|
|
|
|
import mwparserfromhell |
|
|
|
import oursql |
|
|
|
|
|
|
|
from earwigbot import exceptions |
|
|
@@ -508,75 +509,43 @@ class AFCStatistics(Task): |
|
|
|
idea :P). |
|
|
|
""" |
|
|
|
statuses = self.get_statuses(content) |
|
|
|
|
|
|
|
if "R" in statuses: |
|
|
|
status, chart = "r", self.CHART_REVIEW |
|
|
|
if namespace == wiki.NS_MAIN: |
|
|
|
if statuses: |
|
|
|
return None, self.CHART_MISPLACE |
|
|
|
return "a", self.CHART_ACCEPT |
|
|
|
elif "R" in statuses: |
|
|
|
return "r", self.CHART_REVIEW |
|
|
|
elif "P" in statuses: |
|
|
|
status, chart = "p", self.CHART_PEND |
|
|
|
return "p", self.CHART_PEND |
|
|
|
elif "T" in statuses: |
|
|
|
status, chart = None, self.CHART_NONE |
|
|
|
return None, self.CHART_NONE |
|
|
|
elif "D" in statuses: |
|
|
|
status, chart = "d", self.CHART_DECLINE |
|
|
|
else: |
|
|
|
status, chart = None, self.CHART_NONE |
|
|
|
|
|
|
|
if namespace == wiki.NS_MAIN: |
|
|
|
if not statuses: |
|
|
|
status, chart = "a", self.CHART_ACCEPT |
|
|
|
else: |
|
|
|
status, chart = None, self.CHART_MISPLACE |
|
|
|
|
|
|
|
return status, chart |
|
|
|
return "d", self.CHART_DECLINE |
|
|
|
return None, self.CHART_NONE |
|
|
|
|
|
|
|
def get_statuses(self, content): |
|
|
|
"""Return a list of all AFC submission statuses in a page's text.""" |
|
|
|
re_has_templates = "\{\{[aA][fF][cC] submission\s*(\}\}|\||/)" |
|
|
|
re_template = "\{\{[aA][fF][cC] submission\s*(.*?)\}\}" |
|
|
|
re_remove_embed = "(\{\{[aA][fF][cC] submission\s*(.*?))\{\{(.*?)\}\}(.*?)\}\}" |
|
|
|
valid = ["R", "P", "T", "D"] |
|
|
|
subtemps = { |
|
|
|
"/reviewing": "R", |
|
|
|
"/pending": "P", |
|
|
|
"/draft": "T", |
|
|
|
"/declined": "D" |
|
|
|
valid = ["P", "R", "T", "D"] |
|
|
|
aliases = { |
|
|
|
"submit": "P", |
|
|
|
"afc submission/submit": "P", |
|
|
|
"afc submission/reviewing": "R", |
|
|
|
"afc submission/pending": "P", |
|
|
|
"afc submission/draft": "T", |
|
|
|
"afc submission/declined": "D" |
|
|
|
} |
|
|
|
statuses = [] |
|
|
|
|
|
|
|
while re.search(re_has_templates, content): |
|
|
|
status = "P" |
|
|
|
match = re.search(re_template, content, re.S) |
|
|
|
if not match: |
|
|
|
return statuses |
|
|
|
temp = match.group(1) |
|
|
|
limit = 0 |
|
|
|
while "{{" in temp and limit < 50: |
|
|
|
content = re.sub(re_remove_embed, "\\1\\4}}", content, 1, re.S) |
|
|
|
match = re.search(re_template, content, re.S) |
|
|
|
temp = match.group(1) |
|
|
|
limit += 1 |
|
|
|
params = temp.split("|") |
|
|
|
try: |
|
|
|
subtemp, params = params[0].strip(), params[1:] |
|
|
|
except IndexError: |
|
|
|
status = "P" |
|
|
|
params = [] |
|
|
|
else: |
|
|
|
if subtemp: |
|
|
|
status = subtemps.get(subtemp) |
|
|
|
params = [] |
|
|
|
for param in params: |
|
|
|
param = param.strip().upper() |
|
|
|
if "=" in param: |
|
|
|
key, value = param.split("=", 1) |
|
|
|
if key.strip() == "1": |
|
|
|
status = value if value in valid else "P" |
|
|
|
break |
|
|
|
code = mwparserfromhell.parse(content) |
|
|
|
for template in code.filter_templates(): |
|
|
|
name = template.name.strip().lower() |
|
|
|
if name == "afc submission": |
|
|
|
if template.has(1): |
|
|
|
status = template.get(1).value.strip().upper() |
|
|
|
statuses.append(status if status in valid else "P") |
|
|
|
else: |
|
|
|
status = param if param in valid else "P" |
|
|
|
break |
|
|
|
statuses.append(status) |
|
|
|
content = re.sub(re_template, "", content, 1, re.S) |
|
|
|
|
|
|
|
statuses.append("P") |
|
|
|
elif name in aliases: |
|
|
|
statuses.append(aliases[name]) |
|
|
|
return statuses |
|
|
|
|
|
|
|
def get_size(self, content): |
|
|
|