Wikiproyecto:Bots/Repositorio/crearCAB.py

De Wikipedia, la enciclopedia libre

actualizar · discusión · código desprotegido  

Información de fichero
  • Nombre del fichero: crearCAB.py
  • Lenguaje: Python
  • Estado: no protegido
Detalles de edición
  • Detalles:
Script de EmBOTellado (disc. · contr. · bloq.), usado para crear automáticamente CABs.
# -*- coding: utf-8 -*-
import re
from datetime import datetime
import wikipedia
from query import GetData as GetApi

class Usuario(object):
	def __init__(self, nombre):
		self.nombre = nombre
		params = {
			"action": "query",
			"list": "users|usercontribs",
			"ususers": nombre,
			"usprop": "editcount",
			"ucuser": nombre,
			"ucdir": "newer",
			"ucprop": "timestamp",
			"uclimit": 1,

		}
		self._datos = GetApi(params, site)

	def no_existe(self):
		return self._datos['query']['users'][0].has_key("missing")

	def contribuciones(self):
		return self._datos['query']['users'][0]['editcount']

	def primera_contribucion(self):
		return datetime.strptime(self._datos['query']['usercontribs'][0]['timestamp'], "%Y-%m-%dT%H:%M:%SZ")

class Candidatura(object):
	def __init__(self, usuario, proponente):
		self.usuario = usuario
		self.proponente = proponente
		self.cuenta = Usuario(usuario)
		self.pagina = wikipedia.Page(site, u"Wikipedia:Candidaturas a bibliotecario/%s" % usuario)

	def info(self):
		wikipedia.output(
			u"%s tiene %i desde el %s" % (
				self.usuario,
				self.cuenta.contribuciones(),
				datetime.strftime(self.cuenta.primera_contribucion(), "%Y-%m-%d %H:%M")
			)
		)

	def crear_candidatura(self):
		txt_CAB = u"{{subst:Votar bibliotecario1|%(usuario)s|%(proponente)s|%(date1)s|%(primcontr1)s|%(contribs)i|Votación abierta|{{subst:CURRENTTIME}}}}" % self.datos
		if not test: self.pagina.put(txt_CAB, u"Creando CAB para [[Usuario:%(usuario)s|%(usuario)s]]" % self.datos)

	def crear_discusion(self):
		txt_discu_CAB = u"{{subst:Votar bibliotecario2|%(usuario)s|%(proponente)s|%(date2)s|%(primcontr2)s|%(contribs)i|Votación abierta|{{subst:CURRENTTIME}}}}" % self.datos
		pagina_discusion = wikipedia.Page(site, u"Wikipedia discusión:Candidaturas a bibliotecario/%s" % usuario)
		if not test: pagina_discusion.put(txt_discu_CAB, u"Creando página de discusión para la CAB de [[Usuario:%(usuario)s|%(usuario)s]]"  % self.datos)

	def actualizar_tabla(self):
		plantilla_tabla = u"{{CandidaturaBibliotecario|%(usuario)s|%(proponente)s|%(date1)s|%(primcontr1)s|%(contribs)i|color=#FFFFCC}}" % self.datos
		tabla = wikipedia.Page(site, "Wikipedia:Candidaturas a bibliotecario/Tabla")
		txt_tabla_actual = tabla.get()
		inicio = u"<!-- **** AGREGA UNA NUEVA CANDIDATURA DEBAJO DE ESTA LÍNEA **** -->"
		txt_tabla_actual = re.sub("(?s)(%s\s+)" % inicio, ur"\1%s" % plantilla_tabla, txt_tabla_actual)
		candidaturas = re.findall("\{\{ *[Cc]andidaturaBibliotecario *\|", txt_tabla_actual)
		if not test: tabla.put(txt_tabla_actual, u"Agregando a: [[Usuario:%(usuario)s|%(usuario)s]]" % self.datos)

	def actualizar_num_CAB(self):
		pagina_numero = wikipedia.Page(site, u"Wikipedia:Candidaturas a bibliotecario/número")
		texto = pagina_numero.get()
		numero = re.search("</noinclude>(\d+)", texto)
		numero = int(numero.group(1))
		numero += 1
		if not test: pagina_numero.put(re.sub("(</noinclude>)\d+", ur"\1%i" % numero, texto), u"Bot: Actualizando número de CAB: %i" % numero)

	def principal(self):
		if self.cuenta.no_existe():
			wikipedia.output("el usuario no existe")
			return
		if Usuario(self.proponente).no_existe():
			wikipedia.output("el proponente no existe")
			return
		self.datos = {
		   "usuario": self.usuario,
		   "proponente": self.proponente,
		   "primcontr1": datetime.strftime(self.cuenta.primera_contribucion(), "%d/%m/%Y"),
		   "primcontr2": datetime.strftime(self.cuenta.primera_contribucion(), "%d|%m|%Y"),
		   "contribs": self.cuenta.contribuciones(),
		   "date1": "{{subst:CURRENTDAY}}/{{subst:CURRENTMONTH}}/{{subst:CURRENTYEAR}}",
		   "date2": "{{subst:CURRENTDAY}}|{{subst:CURRENTMONTH}}|{{subst:CURRENTYEAR}}"
		}
		if info:
			self.info()
		if not self.pagina.exists():
			self.crear_candidatura()
			self.crear_discusion()
			self.actualizar_tabla()
			#self.actualizar_num_CAB()
		else:
		   wikipedia.output(u"El usuario tiene una candidatura previa, por favor trasládela y solicite el borrado de esta página antes de crear una nueva")

if __name__ == '__main__':
	args = wikipedia.handleArgs()
	site = wikipedia.getSite()
	test= True if "--test" in args or "-t" in args else False
	info= True if "--info" in args or "-i" in args else False
	c = Candidatura(args[0], args[1])
	c.principal()
	wikipedia.stopme()