From cd87d1c2bb1f4f04da240c31c412a41fb481b401 Mon Sep 17 00:00:00 2001 From: Jonathan Golder Date: Tue, 22 Aug 2017 21:45:58 +0200 Subject: [PATCH 1/2] Fix already marked articles was reshown bug Since we search for matching states for articles to include or exclude in a loop, we could not control the outer loop via default break/ continue. Python docs recommend using Exceptions and try/except structures to realise that most conveniently. https://docs.python.org/3/faq/design.html#why-is-there-no-goto Related Task: [FS#138](https://fs.golderweb.de/index.php?do=details&task_id=138) --- lib/redfam.py | 93 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 36 deletions(-) diff --git a/lib/redfam.py b/lib/redfam.py index 6c045c6..36ff4d2 100644 --- a/lib/redfam.py +++ b/lib/redfam.py @@ -515,46 +515,67 @@ class RedFamWorker( RedFam ): @type filter_redirects bool/None """ + + # Helper to leave multidimensional loop + # https://docs.python.org/3/faq/design.html#why-is-there-no-goto + class Continue(Exception): + pass + + class Break(Exception): + pass + # Iterate over articles in redfam for article in self.articlesList: - # Not all list elements contain articles - if not article: + + # To be able to control outer loop from inside child loops + try: + + # Not all list elements contain articles + if not article: + raise Break() + + page = pywikibot.Page( pywikibot.Link(article), + pywikibot.Site() ) + + # Filter existing pages if requested with filter_existing=False + if page.exists(): + self.article_remove_status( "deleted", title=article ) + if filter_existing is False: + raise Continue() + # Filter non existing Pages if requested with + # filter_existing=True + else: + self.article_add_status( "deleted", title=article ) + if filter_existing: + raise Continue() + + # Filter redirects if requested with filter_redirects=True + if page.isRedirectPage(): + self.article_add_status( "redirect", title=article ) + if filter_redirects: + raise Continue() + # Filter noredirects if requested with filter_redirects=False + else: + self.article_remove_status("redirect", title=article ) + if filter_redirects is False: + raise Continue() + + # Exclude by article status + for status in exclude_article_status: + if self.article_has_status( status, title=article ): + raise Continue() + + # Only include by article status + for status in onlyinclude_article_status: + if not self.article_has_status( status, title=article ): + raise Continue() + + # Proxy loop control to outer loop + except Continue: + continue + except Break: break - page = pywikibot.Page(pywikibot.Link(article), pywikibot.Site()) - - # Filter existing pages if requested with filter_existing=False - if page.exists(): - self.article_remove_status( "deleted", title=article ) - if filter_existing is False: - continue - # Filter non existing Pages if requested with filter_existing=True - else: - self.article_add_status( "deleted", title=article ) - if filter_existing: - continue - - # Filter redirects if requested with filter_redirects=True - if page.isRedirectPage(): - self.article_add_status( "redirect", title=article ) - if filter_redirects: - continue - # Filter noredirects if requested with filter_redirects=False - else: - self.article_remove_status("redirect", title=article ) - if filter_redirects is False: - continue - - # Exclude by article status - for status in exclude_article_status: - if self.article_has_status( status, title=article ): - continue - - # Only include by article status - for status in onlyinclude_article_status: - if not self.article_has_status( status, title=article ): - continue - # Yield filtered pages yield page From 4137d7246830610ef68466987b74e7dfcbbc090a Mon Sep 17 00:00:00 2001 From: Jonathan Golder Date: Tue, 22 Aug 2017 21:56:43 +0200 Subject: [PATCH 2/2] Look for existing notice by simple in-check To detect maybe uncommented notices already present, check for them using just a simple python x in y check over whole wikicode Related Task: [FS#138](https://fs.golderweb.de/index.php?do=details&task_id=138) --- bots/markpages.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bots/markpages.py b/bots/markpages.py index 4e12620..ffef940 100644 --- a/bots/markpages.py +++ b/bots/markpages.py @@ -268,6 +268,10 @@ class MarkPagesBot( CurrentPageBot ): # sets 'current_page' on each treat() """ Checks if disc notice which shall be added is already present. """ + + if self.disc_notice in self.current_wikicode: + return True + # Iterate over Templates with same name (if any) to search equal # Link to decide if they are the same for present_notice in self.current_wikicode.ifilter_templates(