Browse Source

More intelligent status determination.

tags/v0.1^2
Ben Kurtovic 12 years ago
parent
commit
c57ae4cabd
1 changed files with 70 additions and 11 deletions
  1. +70
    -11
      bot/tasks/afc_statistics.py

+ 70
- 11
bot/tasks/afc_statistics.py View File

@@ -261,6 +261,11 @@ class Task(BaseTask):
cursor.execute(query, (CHART_ACCEPT, CHART_DECLINE))

def update(self, **kwargs):
"""Update a page by name, regardless of whether anything has changed.

Mainly intended as a command to be used via IRC, e.g.:
!tasks start afc_statistics action=update page=Foobar
"""
title = kwargs.get("page")
if not title:
return
@@ -487,19 +492,71 @@ class Task(BaseTask):
use (revision history search to find the most recent isn't a viable
idea :P).
"""
flags = re.I|re.S
if re.search("\{\{afc submission\|r\|(.*?)\}\}", content, flags):
statuses = self.get_statuses(content)
if "R" in statuses:
return "r", CHART_REVIEW
elif re.search("\{\{afc submission\|h\|(.*?)\}\}", content, flags):
elif "H" in statuses:
return "p", CHART_DRAFT
elif re.search("\{\{afc submission\|\|(.*?)\}\}", content, flags):
elif "P" in statuses:
return "p", CHART_PEND
elif re.search("\{\{afc submission\|t\|(.*?)\}\}", content, flags):
elif "T" in statuses:
return None, CHART_NONE
elif re.search("\{\{afc submission\|d\|(.*?)\}\}", content, flags):
elif "D" in statuses:
return "d", CHART_DECLINE
return None, 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", "H", "P", "T", "D"]
subtemps = {
"/reviewing": "R",
"/onhold": "H",
"/pending": "P",
"/draft": "T",
"/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
else:
status = param if param in valid else "P"
break
statuses.append(status)
content = re.sub(re_template, "", content, 1, re.S)

return statuses

def get_short_title(self, title):
"""Shorten a title so we can display it in a chart using less space.

@@ -557,11 +614,11 @@ class Task(BaseTask):
elif chart == CHART_ACCEPT:
return self.get_create(pageid)
elif chart == CHART_DRAFT:
search = "\{\{afc submission\|h\|(.*?)\}\}"
search_for = "H"
elif chart == CHART_REVIEW:
search = "\{\{afc submission\|r\|(.*?)\}\}"
search_for = "R"
elif chart == CHART_DECLINE:
search = "\{\{afc submission\|d\|(.*?)\}\}"
search_for = "D"

query = """SELECT rev_user_text, rev_timestamp, rev_id
FROM revision WHERE rev_page = ? ORDER BY rev_id DESC"""
@@ -576,7 +633,8 @@ class Task(BaseTask):
self.logger.warn(msg.format(pageid, chart))
return None, None, None
content = self.get_revision_content(revid)
if content and not re.search(search, content, re.I|re.S):
statuses = self.get_statuses(content)
if search_for in statuses:
return last
last = (user, datetime.strptime(ts, "%Y%m%d%H%M%S"), revid)

@@ -598,7 +656,8 @@ class Task(BaseTask):
if chart in ignored_charts:
return notes

if re.search("\{\{afc submission\|d\|(.*?)\}\}", content, re.I|re.S):
statuses = self.get_statuses(content)
if "D" in statuses:
notes += "|nr=1" # Submission was resubmitted

if len(content) < 500:


Loading…
Cancel
Save