User:Underlying lk/remove claims.py

# -*- coding: utf-8 -*-

"""
Usage:

python pwb.py remove_claims -namespace:0 -family:wikipedia -lang:en -transcludes:'Infobox ancient site' P1134

This script removes a given property from the Wikidata item linked to a page; the list of pages is created by a pagegenerator.

You can use any typical pagegenerator to provide with a list of pages.

The removal will only proceed if the bot has added the claim to the item within the last 50 revisions.

&params;
"""
#
# Based on harvest_template
#
import pywikibot
from pywikibot import pagegenerators as pg


class ReaperRobot:
    """
    A bot to remove Wikidata claims
    """
    def __init__(self, generator, propertyToRemove):
        self.generator = pg.PreloadingGenerator(generator)
        self.repo = pywikibot.Site().data_repository()
        self.propertyToRemove = propertyToRemove

        username = pywikibot.input("Remove whose contributions? (blank = self)")
        if username == "":
            username = self.repo.username()

        for page in self.generator:
            try:
                item = pywikibot.ItemPage.fromPage(page)
                pywikibot.output('Processing %s' % page)
                if not item.exists():
                    print "No Wikidata item for this page"
                    continue
                if propertyToRemove in item.get().get('claims'):
                    revhist = item.getVersionHistory(total=50)  # checking this many revisions
                    for revision in revhist:
                        if revision[2] == username:  # the bot's name is in this revision
                            if revision[3].find(propertyToRemove) is not -1:
                                if revision[3].find("wbcreateclaim") is not -1:
                                    # this property was added in this revision
                                    pywikibot.output('Removing %s' % propertyToRemove)
                                    item.get()
                                    claimtoremove = item.claims[propertyToRemove]
                                    item.removeClaims(claimtoremove)
                else:
                    pywikibot.output('%s does not exist in this item' % propertyToRemove)
            except Exception as e:
                pywikibot.exception(tb=True)


def main():
    gen = pg.GeneratorFactory()
    commandline_arguments = list()

    for arg in pywikibot.handleArgs():
        if gen.handleArg(arg):
            continue
        else:
            commandline_arguments.append(arg)

    propertyToRemove = commandline_arguments[0]

    generator = gen.getCombinedGenerator()

    bot = ReaperRobot(generator, propertyToRemove)

if __name__ == "__main__":
    main()