# -*- 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.
¶ms;
"""
#
# 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()