Utilisateur:DSisyphBot/Script/placepalette.py

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

import wikipedia
import urllib
import sys
import pagegenerators
import catlib
import interwiki
import re
import time


def main():
	#Données
	site = wikipedia.getSite('fr','wikipedia')
	category = u"Modèle effectif équipe nationale de football féminin‎‎"
	temp = wikipedia.Page(site,u'Utilisateur:Sisyph/Exceptions palette')
	exceptions = temp.get()
	#Main
	cat = catlib.Category(site, category)
	lst2 = cat.articlesList(True)
	d = len(lst2)
	for p in pagegenerators.PreloadingGenerator(lst2,1000):
		if p.isRedirectPage():          p = p.getRedirectTarget()
		pagename = p.title()
		d = d-1
		if site.messages():
			message = raw_input(u'Un message est arrivé, nimporte quelle touche pour continuer')
		elif not re.search(pagename,exceptions) and re.search('Palette',pagename): #Ignore les modèles-exceptions référencés dans Utilisateur:Sisyph/Exceptions palette
			textmodel = p.get()
			namemodel = p.titleWithoutNamespace()
			modelsanspal = namemodel.replace(u'Palette ',u'')
			wikipedia.output(namemodel)
			print d
			lienintern = p.linkedPages() #récupère liens internes de la palette
			for pp in pagegenerators.PreloadingGenerator(lienintern,1000):
				edit =0                                
				pagename = pp.title()
				if pp.isRedirectPage():
					 pp = pp.getRedirectTarget() 
				if pp.exists() and not re.search(u'(titre|dessous) *= *.*\[\[.'+pagename[1:],textmodel): #exception des titres de l'infobox, majuscule ou minuscule première lettre
					textpage = pp.get()
					textpage = re.sub(u'{{([Mm]odèle|[Tt]emplate):',u'{{',textpage)
					if textpage.find(namemodel)<0 and textpage.find(modelsanspal)<0 and not re.search("\d{4}",pp.title()): #Elimine les pages avec le modèle cible mais pas ses redirects et les articles années (attention aux titre avec des parenthèses, ne pas utilise re)
						model = pp.templates() #récupère modèle de la page
						wikipedia.output(pagename)
						#print model
						listmodel = []
						listmodel2 = []
						for m in model:
							m1 = wikipedia.Page(site,u'Modèle:'+m)
							listmodel.append(m1)
							#wikipedia.output(m)
						for mm in pagegenerators.PreloadingGenerator(listmodel,1000):
							if mm.isRedirectPage():
								print 'redirect'
								pagenameredirect = mm.titleWithoutNamespace()
								mm = mm.getRedirectTarget()      
								pagename = mm.titleWithoutNamespace()
								wikipedia.output(pagename)
								pagenamesanpal = namemodel.replace(u'Palette ',u'')
								if textpage.count(u'{{'+pagenameredirect+u'}}')==1 and pagename[:8]==u'Palette ':
									print u'corrige'
									textpage = textpage.replace(u'{{'+pagenameredirect+u'}}',u'{{'+pagename+u'}}')
							listmodel2.append(mm.titleWithoutNamespace())
							#wikipedia.output(mm.titleWithoutNamespace())
						modelsanspal = namemodel.replace(u'Palette ',u'')
						
						if not namemodel in listmodel2 and not re.search(modelsanspal,textpage):
							print u'############## pas le modele dans ################'
							wikipedia.output(pp.title())
							if re.search(u'{{[Pp]alette',textpage):
								edit = 1
								if (textpage.count(u'{{Palette|')+textpage.count(u'{{palette|'))==1:
									if re.search(u'{{[Pp]alette\|.*}}',textpage):
										inter = re.search(u'{{[Pp]alette\|(.*)}}',textpage).group(1)
										newtext = re.sub(u'{{[Pp]alette\|.*}}',u'{{Palette|'+inter+u'|'+modelsanspal+u'}}',textpage)
								elif not re.search(u'{{[Pp]alette\|',textpage):
									newtext = textpage.replace(u'{{Palette ',u'{{'+namemodel+u'}}\n{{Palette ',1)
								
								
							elif re.search(u'{{[Pp]ortail',textpage) and (textpage.count(u'{{Portail')+textpage.count(u'{{portail'))==1:
								newtext = re.sub(u'{{[Pp]ortail',u'{{Palette|'+modelsanspal+u'}}\n{{Portail',textpage)
								edit =1
				
				if edit==1 and not site.messages():
					wikipedia.showDiff(pp.get(), newtext)
					comment = u'Bot, ajoute [[Modèle:'+namemodel+u']]'
					choice = 'u'
					choice = wikipedia.inputChoice(u'upload, Skip', [ 'upload', 'Skip' ], ['u', 'S'], 's')
					if choice == 'u':
						pp.put(newtext,comment)
			


if __name__ == '__main__':
	try:
		main()
	finally:
		wikipedia.stopme()