| @@ -22,14 +22,17 @@ | |||||
| import re | import re | ||||
| from earwigbot import exceptions | |||||
| from earwigbot.tasks import Task | from earwigbot.tasks import Task | ||||
| from earwigbot.wiki import constants | |||||
| class WikiProjectTagger(Task): | class WikiProjectTagger(Task): | ||||
| """A task to tag talk pages with WikiProject banners. | """A task to tag talk pages with WikiProject banners. | ||||
| Usage: :command:`earwigbot -t wikiproject_tagger PATH | Usage: :command:`earwigbot -t wikiproject_tagger PATH | ||||
| --banner BANNER (--category CAT | --file FILE) [--summary SUM] | --banner BANNER (--category CAT | --file FILE) [--summary SUM] | ||||
| [--append TEXT] [--autoassess] [--nocreate] [--recursive NUM]` | |||||
| [--append TEXT] [--autoassess] [--nocreate] [--recursive NUM] | |||||
| [--site SITE]` | |||||
| .. glossary:: | .. glossary:: | ||||
| @@ -57,6 +60,8 @@ class WikiProjectTagger(Task): | |||||
| ``--recursive NUM`` | ``--recursive NUM`` | ||||
| recursively go through subcategories up to a maximum depth of ``NUM``, | recursively go through subcategories up to a maximum depth of ``NUM``, | ||||
| or if ``NUM`` isn't provided, go infinitely (this can be dangerous) | or if ``NUM`` isn't provided, go infinitely (this can be dangerous) | ||||
| ``--site SITE`` | |||||
| the ID of the site to tag pages on, defaulting to the... default site | |||||
| """ | """ | ||||
| name = "wikiproject_tagger" | name = "wikiproject_tagger" | ||||
| @@ -91,7 +96,58 @@ class WikiProjectTagger(Task): | |||||
| def run(self, **kwargs): | def run(self, **kwargs): | ||||
| """Main entry point for the bot task.""" | """Main entry point for the bot task.""" | ||||
| if "file" not in kwargs and "category" not in kwargs: | |||||
| log = "No pages to tag; I need either a 'category' or a 'file' passed as kwargs" | |||||
| self.logger.error(log) | |||||
| return | |||||
| if "banner" not in kwargs: | |||||
| log = "Needs a banner to add passed as the 'banner' kwarg" | |||||
| self.logger.error(log) | |||||
| return | |||||
| banner = kwargs["banner"] | |||||
| summary = kwargs.get("summary", "Adding $3 to article talk page.") | |||||
| append = kwargs.get("append") | |||||
| autoassess = kwargs.get("autoassess", False) | |||||
| nocreate = kwargs.get("nocreate", False) | |||||
| recursive = kwargs.get("recursive", 0) | |||||
| site = self.bot.wiki.get_site(name=kwargs.get("site")) | |||||
| if "category" in kwargs: | if "category" in kwargs: | ||||
| pass | |||||
| elif "file" in kwargs: | |||||
| pass | |||||
| 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) | |||||
| if "file" in kwargs: | |||||
| with open(kwargs["file"], "r") as fileobj: | |||||
| for line in fileobj: | |||||
| if line.strip(): | |||||
| line = line.decode("utf8") | |||||
| if line.startswith("[[") and line.endswith("]]"): | |||||
| line = line[2:-2] | |||||
| page = site.get_page(line) | |||||
| if page.namespace == constants.NS_CATEGORY: | |||||
| self.process_category(page, recursive) | |||||
| else: | |||||
| self.process_page(page) | |||||
| def process_category(self, page, recursive): | |||||
| for member in page.get_members(): | |||||
| if member.namespace == constants.NS_CATEGORY: | |||||
| if recursive is True: | |||||
| self.process_category(member, True) | |||||
| elif recursive: | |||||
| self.process_category(member, recursive - 1) | |||||
| else: | |||||
| self.process_page(member) | |||||
| def process_page(self, page): | |||||
| raise NotImplementedError(page) | |||||