| @@ -72,6 +72,8 @@ class Task(BaseTask): | |||||
| self.save(**kwargs) | self.save(**kwargs) | ||||
| elif action == "sync": | elif action == "sync": | ||||
| self.sync(**kwargs) | self.sync(**kwargs) | ||||
| elif action == "update": | |||||
| self.update(**kwargs) | |||||
| finally: | finally: | ||||
| self.conn.close() | self.conn.close() | ||||
| @@ -258,6 +260,24 @@ class Task(BaseTask): | |||||
| AND ADDTIME(page_special_time, '36:00:00') < NOW()""" | AND ADDTIME(page_special_time, '36:00:00') < NOW()""" | ||||
| cursor.execute(query, (CHART_ACCEPT, CHART_DECLINE)) | cursor.execute(query, (CHART_ACCEPT, CHART_DECLINE)) | ||||
| def update(self, **kwargs): | |||||
| title = kwargs.get(page) | |||||
| if not title: | |||||
| return | |||||
| query = "SELECT page_id, page_modify_oldid FROM page WHERE page_title = ?" | |||||
| with self.conn.cursor() as cursor: | |||||
| cursor.execute(query, (title,)) | |||||
| try: | |||||
| pageid, oldid = cursor.fetchall()[0] | |||||
| except IndexError: | |||||
| msg = "Page [[{0}]] not found in database".format(title) | |||||
| self.logger.error(msg) | |||||
| msg = "Updating page [[{0}]] (id: {1}) @ {2}" | |||||
| self.logger.info(msg.format(title, pageid, oldid)) | |||||
| self.update_page(cursor, pageid, title) | |||||
| def untrack_page(self, cursor, pageid): | def untrack_page(self, cursor, pageid): | ||||
| """Remove a page, given by ID, from our database.""" | """Remove a page, given by ID, from our database.""" | ||||
| self.logger.debug("Untracking page (id: {0})".format(pageid)) | self.logger.debug("Untracking page (id: {0})".format(pageid)) | ||||
| @@ -280,7 +300,7 @@ class Task(BaseTask): | |||||
| status, chart = self.get_status_and_chart(content) | status, chart = self.get_status_and_chart(content) | ||||
| if not status: | if not status: | ||||
| msg = "Could not find a status for [[{0}]]".format(title) | msg = "Could not find a status for [[{0}]]".format(title) | ||||
| self.logger.error(msg) | |||||
| self.logger.warn(msg) | |||||
| return | return | ||||
| short = self.get_short_title(title) | short = self.get_short_title(title) | ||||
| @@ -288,7 +308,7 @@ class Task(BaseTask): | |||||
| c_user, c_time, c_id = self.get_create(pageid) | c_user, c_time, c_id = self.get_create(pageid) | ||||
| m_user, m_time, m_id = self.get_modify(pageid) | m_user, m_time, m_id = self.get_modify(pageid) | ||||
| s_user, s_time, s_id = self.get_special(pageid, chart) | s_user, s_time, s_id = self.get_special(pageid, chart) | ||||
| notes = self.get_notes(content, m_time, c_user) | |||||
| notes = self.get_notes(chart, content, m_time, c_user) | |||||
| query1 = "INSERT INTO row VALUES (?, ?)" | query1 = "INSERT INTO row VALUES (?, ?)" | ||||
| query2 = "INSERT INTO page VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" | query2 = "INSERT INTO page VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" | ||||
| @@ -351,7 +371,7 @@ class Task(BaseTask): | |||||
| size = len(content) | size = len(content) | ||||
| m_user, m_time, m_id = self.get_modify(pageid) | m_user, m_time, m_id = self.get_modify(pageid) | ||||
| notes = self.get_notes(content, m_time, result["page_create_user"]) | |||||
| notes = self.get_notes(chart, content, m_time, result["page_create_user"]) | |||||
| if title != result["page_title"]: | if title != result["page_title"]: | ||||
| self.update_page_title(cursor, result, pageid, title) | self.update_page_title(cursor, result, pageid, title) | ||||
| @@ -467,15 +487,16 @@ class Task(BaseTask): | |||||
| use (revision history search to find the most recent isn't a viable | use (revision history search to find the most recent isn't a viable | ||||
| idea :P). | idea :P). | ||||
| """ | """ | ||||
| if re.search("\{\{afc submission\|r\|(.*?)\}\}", content, re.I): | |||||
| flags = re.I|re.S | |||||
| if re.search("\{\{afc submission\|r\|(.*?)\}\}", content, flags): | |||||
| return "r", CHART_REVIEW | return "r", CHART_REVIEW | ||||
| elif re.search("\{\{afc submission\|h\|(.*?)\}\}", content, re.I): | |||||
| elif re.search("\{\{afc submission\|h\|(.*?)\}\}", content, flags): | |||||
| return "p", CHART_DRAFT | return "p", CHART_DRAFT | ||||
| elif re.search("\{\{afc submission\|\|(.*?)\}\}", content, re.I): | |||||
| elif re.search("\{\{afc submission\|\|(.*?)\}\}", content, flags): | |||||
| return "p", CHART_PEND | return "p", CHART_PEND | ||||
| elif re.search("\{\{afc submission\|t\|(.*?)\}\}", content, re.I): | |||||
| elif re.search("\{\{afc submission\|t\|(.*?)\}\}", content, flags): | |||||
| return None, CHART_NONE | return None, CHART_NONE | ||||
| elif re.search("\{\{afc submission\|d\|(.*?)\}\}", content, re.I): | |||||
| elif re.search("\{\{afc submission\|d\|(.*?)\}\}", content, flags): | |||||
| return "d", CHART_DECLINE | return "d", CHART_DECLINE | ||||
| return None, CHART_NONE | return None, CHART_NONE | ||||
| @@ -555,30 +576,44 @@ class Task(BaseTask): | |||||
| self.logger.warn(msg.format(pageid, chart)) | self.logger.warn(msg.format(pageid, chart)) | ||||
| return None, None, None | return None, None, None | ||||
| content = self.get_revision_content(revid) | content = self.get_revision_content(revid) | ||||
| if content and not re.search(search, content, re.I): | |||||
| if content and not re.search(search, content, re.I|re.S): | |||||
| return last | return last | ||||
| last = (user, datetime.strptime(ts, "%Y%m%d%H%M%S"), revid) | last = (user, datetime.strptime(ts, "%Y%m%d%H%M%S"), revid) | ||||
| return last | return last | ||||
| def get_notes(self, content, m_time, c_user): | |||||
| def get_notes(self, chart, content, m_time, c_user): | |||||
| """Return any special notes or warnings about this page. | """Return any special notes or warnings about this page. | ||||
| Currently unimplemented, so always returns None. | |||||
| resubmit: submission was resubmitted after a previous decline | |||||
| short: submission is less than 500 bytes | |||||
| no-inline: submission has no inline citations | |||||
| unsourced: submission lacks references completely | |||||
| old: submission has not been touched in > 4 days | |||||
| blocked: submitter is currently blocked | |||||
| """ | """ | ||||
| # accepted subs | |||||
| # rebuild action | |||||
| # resubmit submission was resubmitted after a previous decline | |||||
| # re.search("\{\{afc submission\|d\|(.*?)\}\}", content, re.I) | |||||
| # short submission is less than X bytes | |||||
| # len(content) < X | |||||
| # no-inline submission has no inline citations | |||||
| # not re.search("\<ref\s*(.*?)\>(.*?)\</ref\>", content, re.I|re.S) | |||||
| # unsourced submission lacks references completely | |||||
| # not re.search(references, content, re.I|re.S) and search(hyperlinks) | |||||
| # old submission has not been touched in > 4 days | |||||
| # m_time < now - 4 hours | |||||
| # blocked submitter is currently blocked | |||||
| # c_user is blocked via API | |||||
| return "" | |||||
| notes = "" | |||||
| if re.search("\{\{afc submission\|d\|(.*?)\}\}", content, re.I|re.S): | |||||
| notes += "|nr=1" # Submission was resubmitted | |||||
| if len(content) < 500: | |||||
| notes += "|ns=1" # Submission is short | |||||
| if not re.search("\<ref\s*(.*?)\>(.*?)\</ref\>", content, re.I|re.S): | |||||
| if re.search("https?:\/\/(.*?)\.", content, re.I|re.S): | |||||
| notes += "|ni=1" # Submission has no inline citations | |||||
| else: | |||||
| notes += "|nu=1" # Submission is completely unsourced | |||||
| pending_charts = [CHART_PEND, CHART_DRAFT, CHART_REVIEW] | |||||
| time_since_modify = (datetime.now() - m_time).seconds | |||||
| max_time = 4 * 24 * 60 * 60 | |||||
| if chart in pending_charts and time_since_modify > max_time: | |||||
| notes += "|no=1" # Submission hasn't been touched in over 4 days | |||||
| creator = self.site.get_user(c_user) | |||||
| if creator.blockinfo(): | |||||
| notes += "|nb=1" # Submitter is blocked | |||||
| return notes | |||||