Wikiproyecto:Cantabria/infobox.py

# -*- coding: utf-8 -*-
"""
Este script inserta un infobox a los municipios de Cantabria que todavía no tienen uno, basándose en un fichero de datos csv.
Con Prueba = True prepara una lista con enlaces a todas las localidades.

Requiere pywikipedia para su ejecución.
"""

#import sys

#sys.path.insert(0, '../') #Esta linea es necesaria solo si este script se encuentra en una carpeta dentro de la de pywikipedia.
import wikipedia

class Localidad(object):
	def __init__(self, text):
		trozos = text.replace('"','').split(";")
		self.INE = trozos[0]
		self.Nombre = trozos[1]
		self.Municipio = trozos[2]
		self.DistanciaCapitalProvincia = trozos[3]
		self.DistanciaCapitalMunicipio = trozos[4]
		self.Altitud = trozos[5]
		self.Poblacion2006 = trozos[6]
		self.Latitud = trozos[7]
		self.Longitud = trozos[8]
		self.CodigoPostal = trozos[9]
		self.Patron = trozos[10]
		self.CapitalMunicipio = trozos[11]
		self.CapitalMunicipioWikipedia = trozos[12]
		self.ArticuloWikipedia = trozos[13]
		#print trozos

	def gradosDecimalesToCoordenadas(self,valor):
		print valor
		valor=str(valor).replace(",",".")
		vabs=abs(float(valor))
		grados=int(vabs)
		minutos=int((vabs-grados)*60)
		segundos=int(round((vabs-grados-(minutos/60.0))*3600,0))
		return grados,minutos,segundos

	def get_infobox(self):
		EsMunicipio=False
#		if self.Nombre == self.Municipio:
		if self.Nombre == self.CapitalMunicipio:
			EsMunicipio=True
		ib = u"{{Infobox ciudad España\n"
		ib += u"| nombre = %s\n" % self.Nombre
		if EsMunicipio:
			ib += u"| bandera =\n"
			ib += u"| escudo =\n"
		else:
			ib += u"| bandera = no\n"
			ib += u"| escudo = no\n"
		ib += u"| imagen =\n"
		ib += u"| cod_provincia = 39\n"
		ib += u"| región =\n"
		if not EsMunicipio:
			ib += u"| municipio = [[%s]]\n" % self.Municipio
		ib += u"| cp = %s\n" % self.CodigoPostal
		if self.Latitud != "" and self.Longitud != "":
			gradosLat,minutosLat,segundosLat = self.gradosDecimalesToCoordenadas(self.Latitud)
			gradosLon,minutosLon,segundosLon = self.gradosDecimalesToCoordenadas(self.Longitud)
			ib += u"| coor = {{coor dms|%i|%i|%i|N|%i|%i|%i|O}}\n" % (gradosLat,minutosLat,segundosLat,gradosLon,minutosLon,segundosLon)
		else:
			ib += u"| coor = \n"

		ib += u"| superficie = \n"
		if self.Altitud != "":
			ib += u"| altitud = %s\n" % self.Altitud
		else:
			ib += u"| altitud =\n"

		if self.Nombre=="Santander":
			ib += u"| distancia = XX\n"
			ib += u"| referencia = [[Madrid]]\n"
		elif self.DistanciaCapitalProvincia != "":
			ib += u"| distancia = %s\n" % self.DistanciaCapitalProvincia
			ib += u"| referencia = [[Santander (Cantabria)|Santander]]\n"

		if not EsMunicipio and \
			self.DistanciaCapitalMunicipio != "":
			ib += u"| distancia2 = %s\n" % self.DistanciaCapitalMunicipio
			ib += u"| referencia2 = [[%s|%s]]\n" % (self.CapitalMunicipioWikipedia,self.CapitalMunicipio)

		if self.Poblacion2006 != "":
			ib += u"| población = %s\n" % self.Poblacion2006
			ib += u"| ine_año = 2006\n"
		else:
			ib += u"| población =\n"
			ib += u"| ine_año =\n"

		ib += u"| gentilicio =\n"
		if EsMunicipio:
			ib += u"| alcalde =\n"
			ib += u"| alcalde_año =\n"
			ib += u"| presupuesto =\n"
			ib += u"| presupuesto_año =\n"
		ib += u"| patrón =\n"
		ib += u"| patrona =\n"
		ib += u"| web =\n"
		ib += u"}}"

		return ib

def obtenerPagina(site,nombreArticulo):
	pagina = wikipedia.Page(site, nombreArticulo)
	try:
		pagina.get()
		return pagina
	except wikipedia.NoPage:
		return None
	except wikipedia.IsRedirectPage, err:
		target = err[0]
		return obtenerPagina(site, target)
	else:
		return None

if __name__ == '__main__':
	localidades='{| {{tablabonita}} class="sortable wikitable"\n! Enlace Localidad\n! Enlace Localidad (Cantabria)\n! TieneInfobox\n'
	tieneIB=""
	pruebas=False
	try:
		site = wikipedia.getSite()
		print u"Obteniendo datos csv . . ."
		csv = wikipedia.Page(site, u"Wikiproyecto:Cantabria/Localidades")
		texto = csv.get()
		texto = texto[texto.find("<pre>")+6:texto.find("</pre>")] #Me quedo con el texto entre pre's
		print u"Comenzando el proceso de inclusión de infobox"
		primera = True
		for linea in texto.splitlines():
			if primera:				
				primera = False #La primera linea es de títulos
			elif linea.lstrip()!="":
				tieneIB=""
				try:
					l = Localidad(linea)
				except:
					print u"Error gestionando línea: ",linea
					continue
				print u"Obteniendo artículo de localidad: %s . . ." % l.Nombre
				pagina = obtenerPagina(site, u"%s" % l.ArticuloWikipedia)
				if pagina!=None:
					codigo = pagina.get()
					if not pagina.canBeEdited():
						wikipedia.output(u"Tú no puedes editar la página %s" % page.aslink())
						continue

					if "Infobox" not in codigo: #Si contiene infobox no hago nada
						if not pruebas:
							print u"Incluyendo infobox"
							print l.get_infobox()
							pagina.put(u"%s\n%s" % (l.get_infobox(),codigo), u"Bot incluyendo infobox")
					else:
						tieneIB="{{listo}}"
						print u"Ya contiene infobox"
				else:
					print u"No se ha encontrado su página"

				localidades += u"|-\n| [[%s]]\n| [[%s]]\n| %s\n" % (l.Nombre,l.ArticuloWikipedia,tieneIB)

		if pruebas:
			localidades += u"|}"
			lista = wikipedia.Page(site, u"Wikiproyecto:Cantabria/LocalidadesInfobox")
			lista.put(localidades, u"Bot actualizando lista de localidades con infobox")
	finally:
		wikipedia.stopme()