| @@ -47,7 +47,7 @@ class WikiProjectTagger(Task): | |||
| current directory) | |||
| ``--summary SUM`` | |||
| an optional edit summary to use; defaults to | |||
| ``"Adding {{BANNER}} to article talk page."`` | |||
| ``"Adding WikiProject banner {{BANNER}}."`` | |||
| ``--append TEXT`` | |||
| optional text to append to the banner (after an autoassessment, if | |||
| any), like ``|importance=low`` | |||
| @@ -106,25 +106,21 @@ class WikiProjectTagger(Task): | |||
| return | |||
| banner = kwargs["banner"] | |||
| summary = kwargs.get("summary", "Adding $3 to article talk page.") | |||
| summary = kwargs.get("summary", "Adding WikiProject banner $3.") | |||
| append = kwargs.get("append") | |||
| autoassess = kwargs.get("autoassess", False) | |||
| nocreate = kwargs.get("nocreate", False) | |||
| recursive = kwargs.get("recursive", 0) | |||
| banner, names = self.get_names(site, banner) | |||
| if not names: | |||
| return | |||
| job = _Job(banner, names, summary, append, autoassess, nocreate) | |||
| site = self.bot.wiki.get_site(name=kwargs.get("site")) | |||
| if "category" in kwargs: | |||
| title = kwargs["category"] | |||
| prefix = name.split(":", 1)[0] | |||
| ns_cat = site.namespace_id_to_name(constants.NS_CATEGORY) | |||
| if prefix == title: | |||
| title = u":".join((ns_cat, title)) | |||
| else: | |||
| try: | |||
| site.namespace_name_to_id(prefix) | |||
| except exceptions.NamespaceNotFoundError: | |||
| title = u":".join((ns_cat, title)) | |||
| self.process_category(title, recursive) | |||
| title = self.guess_namespace(title, constants.NS_CATEGORY) | |||
| self.process_category(site.get_page(title), job, recursive) | |||
| if "file" in kwargs: | |||
| with open(kwargs["file"], "r") as fileobj: | |||
| @@ -135,19 +131,86 @@ class WikiProjectTagger(Task): | |||
| line = line[2:-2] | |||
| page = site.get_page(line) | |||
| if page.namespace == constants.NS_CATEGORY: | |||
| self.process_category(page, recursive) | |||
| self.process_category(page, job, recursive) | |||
| else: | |||
| self.process_page(page) | |||
| def process_category(self, page, recursive): | |||
| self.process_page(page, job) | |||
| def guess_namespace(self, title, assumed): | |||
| prefix = title.split(":", 1)[0] | |||
| if prefix == title: | |||
| return u":".join((site.namespace_id_to_name(assumed), title)) | |||
| try: | |||
| site.namespace_name_to_id(prefix) | |||
| except exceptions.NamespaceNotFoundError: | |||
| return u":".join((site.namespace_id_to_name(assumed), title)) | |||
| return title | |||
| def get_names(self, site, banner): | |||
| title = self.guess_namespace(banner, constants.NS_TEMPLATE) | |||
| if title == banner: | |||
| banner = banner.split(":", 1)[1] | |||
| page = site.get_page(title) | |||
| if page.exists != page.PAGE_EXISTS: | |||
| self.logger.error("Banner [[{0}]] does not exist".format(title)) | |||
| return banner, None | |||
| names = [banner] if banner == title else [banner, title] | |||
| result = site.api_query(action="query", list="backlinks", bllimit=500, | |||
| blfilterredir="redirects", bltitle=title) | |||
| for backlink in result["query"]["backlinks"]: | |||
| names.append(backlink["title"]) | |||
| if backlink["ns"] == constants.NS_TEMPLATE: | |||
| names.append(backlink["title"].split(":", 1)[1]) | |||
| log = "Found {0} aliases for banner [[{1}]]".format(len(names), title) | |||
| self.logger.debug(log) | |||
| return banner, names | |||
| def process_category(self, page, job, recursive): | |||
| self.logger.info("Processing category: [[{0]]".format(page.title)) | |||
| for member in page.get_members(): | |||
| if member.namespace == constants.NS_CATEGORY: | |||
| if recursive is True: | |||
| self.process_category(member, True) | |||
| self.process_category(member, job, True) | |||
| elif recursive: | |||
| self.process_category(member, recursive - 1) | |||
| self.process_category(member, job, recursive - 1) | |||
| else: | |||
| self.process_page(member) | |||
| self.process_page(member, job) | |||
| def process_page(self, page, job): | |||
| if not page.is_talkpage: | |||
| page = page.toggle_talk() | |||
| try: | |||
| code = page.parse() | |||
| except exceptions.PageNotFoundError: | |||
| if job.nocreate: | |||
| log = "Skipping nonexistent page: [[{0}]]".format(page.title) | |||
| self.logger.info(log) | |||
| else: | |||
| log = "Tagging new page: [[{0}]]".format(page.title) | |||
| self.logger.info(log) | |||
| banner = "{{" + job.banner + job.append + "}}" | |||
| summary = job.summary.replace("$3", banner) | |||
| page.edit(banner, self.make_summary(summary)) | |||
| return | |||
| except exceptions.InvalidPageError: | |||
| log = u"Skipping invalid page: [[{0}]]".format(page.title) | |||
| self.logger.error(log) | |||
| return | |||
| raise NotImplementedError() | |||
| text = unicode(code) | |||
| if page.get() != text: | |||
| summary = job.summary.replace("$3", banner) | |||
| page.edit(text, self.make_summary(summary)) | |||
| def process_page(self, page): | |||
| raise NotImplementedError(page) | |||
| class _Job(object): | |||
| def __init__(self, banner, names, summary, append, autoassess, nocreate): | |||
| self.banner = banner | |||
| self.names = names | |||
| self.summary = summary | |||
| self.append = append | |||
| self.autoassess = autoassess | |||
| self.nocreate = nocreate | |||