def publier(self, souspage, liste, soustableau=0, simple=False):
     """
     Raccourci pour publier une liste d'article sur une souspage du P:SAdQaW
     La paramètre « simple » permet d'obtenir un affichage simplifié sous forme d'une liste de liens.
     """
     retour = u'%s pages.\n\n' % str(len(liste[soustableau]))
     if simple:
         m = []
         for t in liste[soustableau]:
             m.append(t.title())
         retour += u'<noinclude>[[' + u']], [['.join(m) + u']].\n</noinclude>\n'
     else:
         noinclude = False
         for i, t in enumerate(liste[soustableau]):
             retour += u'{{%s}}' % t.title()
             if i == 11:
                 retour += u'<noinclude>'
                 noinclude = True
             retour += u'\n'
         if noinclude:
             retour += u'</noinclude>'
     #pywikibot.Page(self.site, u'Projet:Suivi des articles de qualité des autres wikipédias/Traduction/' + souspage).put(retour, comment=self.resumeListing)
     p = pywikibot.Page(self.site, u'Projet:Suivi des articles de qualité des autres wikipédias/Traduction/' + souspage)
     p.text = retour
     BeBot.save(p, commentaire=self.resumeListing)
    def adl(self, mag):
        """ (Avec le wikimag) Ajoute les adq/ba de la semaine à l'Atelier de Lecture
        """
        separation = '<center><hr style="width:42%;" /></center>'

        split = re.compile("\|([\w \xe9]+?)=", re.LOCALE|re.UNICODE|re.MULTILINE|re.DOTALL)
        lien = re.compile("\[\[.*?\]\]", re.LOCALE|re.UNICODE)
        params = {  'adq': '', 'propositions adq' : '',
                    'ba' : '', 'propositions ba'  : '' } # Les paramètres du mag
        a = re.split(split, mag.text)
        for i in range(1, len(a), 2):
            #retrait des liens
            a[i] = lien.sub(r'', a[i])
            params[a[i].lower()] = a[i+1].rstrip('\n').strip(' ')

        lumiere = pywikibot.Page(self.site, 'Wikipédia:Atelier de lecture/Lumière sur...')
        #Retrait des a-label
        alabel = re.compile("\{\{[aA]-label\|([^\}\|]+).*?\}\}", re.LOCALE|re.UNICODE)
        params['adq'] = alabel.sub(r'[[\1]]', params['adq'])
        params['propositions adq'] = alabel.sub(r'[[\1]]', params['propositions adq'])
        params['ba']  = alabel.sub(r'[[\1]]', params['ba'])
        params['propositions ba'] = alabel.sub(r'[[\1]]', params['propositions ba'])
        propositions = params['propositions adq'] + '\n' + params['propositions ba']
        #Ajout des icones
        icone = re.compile("^\* ", re.LOCALE|re.UNICODE|re.MULTILINE)
        params['adq'] = icone.sub(r'* {{AdQ|20px}} ', params['adq'])
        params['ba']  = icone.sub(r'* {{BA|20px}} ', params['ba'])
        lumiere.text = '[[Fichier:HSutvald2.svg|left|60px]]\nLes articles labellisés durant la semaine dernière et les nouvelles propositions au label.{{Clr}}\n' \
                + '\n{{colonnes|nombre=3|\n' + params['adq'] + '\n}}\n' + separation \
                + '\n{{colonnes|nombre=3|\n' + params['ba']  + '\n}}\n' + separation \
                + '\n{{colonnes|nombre=3|\n' + propositions  + '\n}}\n' \
                + '<noinclude>\n[[Catégorie:Wikipédia:Atelier de lecture|Lumière sur...]]\n</noinclude>'
        pywikibot.output("# Publication sur l'Atelier de lecture")
        BeBot.save(lumiere, commentaire='Maj hebdomadaire de la liste', debug=self.debug)
 def run(self):
     for a in [2007, 2008, 2009, 2010, 2011]:
         for s in range(1,53):
             p = pywikibot.Page(self.site, u'Wikipédia:Wikimag/%d/%d' % (a, s))
             if p.exists() and not p.isRedirectPage():
                 #pywikibot.output(p.title())
                 p.text += self.categorie
                 BeBot.save(p, commentaire=self.resume, minor=True)
 def clore_traduction(self, page):
     """ Clôt une traduction
     """
     #pywikibot.output("&&& clore : %s" % page.title())
     page.text = self.re_statut.sub('|status=5', page.text)
     com = self.resume
     BeBot.save(page, commentaire=com, debug=self.debug)
     self.retirer_le_modele_Traduction(BeBot.togglePageTrad(page))
     self.stats['cloture'] += 1
 def newsboy(self, lecteur, msg, purge=True):
     """ Distribut l'infolettre
     """
     if lecteur.isRedirectPage():
         lecteur = lecteur.getRedirectTarget()
     if purge:
         self.rm_old(lecteur)
     lecteur.text += msg
     BeBot.save(lecteur, commentaire=self.resume, debug=self.debug)
 def retirer_le_modele_Traduction(self, page):
     """ Retire le {{Traduction}} d'une page
     """
     ns = page.namespace()
     if ns == 2 or ns == 3:
         pywikibot.output('Page utilisateur %d (retirer_modele) -> exit : %s' % (ns, b.title()))
         return
     text = self.re_trad.sub(r'', page.text)
     if text != page.text:
         page.text = text
         BeBot.save(page, commentaire=self.resume+' : Retrait du modèle {{Traduction}}', minor=True, debug=self.debug)
def main():
    site = pywikibot.getSite()
    if BeBot.blocage(site):
        sys.exit(7)
    log = u'Utilisateur:BeBot/Traduction de qualité'

    tdq = TraductionDeQualite(site, log)
    tdq.run()
    
    p = pywikibot.Page(site, log)
    p.text = unicode(tdq)
    BeBot.save(p, commentaire=tdq.resume)
 def suppr_mod(self, b, titres):
     ns = b.namespace()
     if ns == 2 or ns == 3:
         #pywikibot.output('Page utilisateur %d (suppr_mod) -> exit : %s' % (ns, b.title()))
         return
     self.retirer_le_modele_Traduction(b) # si traduction active
     for a in re.finditer(self.re_appel, b.text):
         trouve = a.group(1).encode('ascii', 'ignore')
         if trouve in titres:
             c = b.text[:a.start()] + b.text[a.end():]
             #BeBot.diff(b.text, c)
             b.text = c
     BeBot.save(b, commentaire=self.resume+' : Traduction abandonnée', debug=self.debug)
Exemple #9
0
    def put_resultats(self):
        """ Affichage des résultats
        """
        total = self.resultats['nb_pages']
        msg = '== Statistiques ==\nAu %s\n' % datetime.datetime.today().strftime("%d/%m/%Y")
        msg += "* Nombre total de pages : %i\n" % total
        msg += "* Par statut:\n"
        for c, nbpages in self.paravancement.items():
            msg += "** %s : %i\n" % (c, nbpages)
        cat = pywikibot.Category(self.site, "Catégorie:Projet:Traduction/Articles liés")
        msg += "* Pages de suivi actives : %i\n" % len(list(cat.articles()))
        msg += "\n[[Catégorie:Maintenance du Projet Traduction|*]]\n"

        res = pywikibot.Page(self.site, "Projet:Traduction/Statistiques")
        stats = re.compile("^== Statistiques ==[^=]*", re.DOTALL|re.MULTILINE)
        res.text = stats.sub(r'', res.text)
        res.text = res.text + msg
        BeBot.save(res, commentaire=self.resume)
#!/usr/bin/python
# -*- coding: utf-8  -*-
import re, sys
import BeBot
import pywikibot

"""
    Supprime un modèle et ses appels d'inclusion
"""

site = pywikibot.getSite()
nom = u"Demande de traduction"
# renom = re.compile('{{'+nom+'}}', re.IGNORECASE|re.MULTILINE)
renom = re.compile("{{" + nom + "\|?[^}/]*?}}", re.IGNORECASE | re.MULTILINE)
modele = pywikibot.Page(site, u"Modèle:" + nom)
if not modele.exists():
    pywikibot.error(u"Le modèle {nom} n'existe pas".format(nom=nom))
    sys.exit(2)

debug = True
# Retrait des transclusions
for b in modele.getReferences(follow_redirects=False, onlyTemplateInclusion=True, content=True, total=9):
    a = renom.sub(r"", b.text)
    BeBot.diff(b.text, a)
    b.text = a
    BeBot.save(b, commentaire=u'Retrait du modèle "{nom}"'.format(nom=nom), debug=debug)
BeBot.delete(modele, u'Retrait du modèle "{nom}"'.format(nom=nom), debug=debug)
    nom = b.title(withNamespace=False)
    if nb > lim_peu:
        classement[nom] = nb
        last[nom] = derniere
    else:
        peuactifs[nom] = nb

classement = sorted(classement.items(), key=itemgetter(1), reverse=True)

# Affichage des résultats
t = '{{|class=\"wikitable sortable\"\n|+calculé le {date}\n!Nom!!Contribs ces {x} derniers jours!!Timestamp de dernière modif'.format(date=datetime.date.today().isoformat(),x=lim_jours)
for nom, nb in classement:
    t += '\n|-\n|{{u|%s}}||%d||%s' % (nom, nb, last[nom])
t += '\n|}'

t += '\n== Les bots peu actifs (moins de %d modifs) ==\n' % lim_peu
t += '{{début de colonnes|nombre=3}}\n'
for pa in sorted(peuactifs.keys()):
    t += '\n* {{u|%s}}' % pa
t += '{{fin de colonnes}}\n'


parser = argparse.ArgumentParser(prog='bebot')
parser.add_argument('--debug', action='store_true', default=False, help="Activate debug mode (no publication)")
args = parser.parse_args()

if not args.debug:
    p.text = t
    BeBot.save(p, commentaire='Recalculationnement du classement', debug=False)
else:
    print(t)
Exemple #12
0
#!/usr/bin/python
# -*- coding: utf-8  -*-
import BeBot
import pywikibot

site = pywikibot.Site()
page = pywikibot.Page(site, u'Utilisateur:BeBot/Test')
page.text = ' '
BeBot.save(page, commentaire=u'Login', minor=True)
site = pywikibot.getSite()
nom = "Utilisateur Traduction"
renom = re.compile("{{" + nom + "}}", re.IGNORECASE)
nom2 = "Traduction"
# renom2 = re.compile(u'(\{\{Bo(î|i)te\s*(utilisateur|babel)[^\}]*?)\|\s*'+nom2+u'(\s*|/\w{2})([^\}]*\}\})', re.IGNORECASE|re.UNICODE|re.MULTILINE)
renom2 = re.compile(
    u"(\{\{Bo(î|i)te\s*(utilisateur|babel)[^\}]*?)\|\s*" + nom2 + u"\s*([^\}/]?[^\}]*?\}\})",
    re.IGNORECASE | re.UNICODE | re.MULTILINE,
)
modele = pywikibot.Page(site, u"Modèle:" + nom)
if not modele.exists():
    pywikibot.error(u"La BU {nom} n'existe pas".format(nom=nom))
    sys.exit(2)

# Retrait des transclusions
for b in modele.getReferences(follow_redirects=False, onlyTemplateInclusion=True, content=True):
    # remp = r''
    remp = r"{{Utilisateur Projet/Traduction}}"
    a = renom.sub(remp, b.text)
    a = renom2.sub(r"\1|Projet/Traduction\4", a)
    b.text = a
    BeBot.save(
        b,
        commentaire=u'Retrait du modèle "{nom}" suite à la restructuration du [[Projet:Traduction]]'.format(nom=nom),
        debug=False,
    )
BeBot.delete(
    modele, u'Retrait du modèle "{nom}" suite à la restructuration du [[Projet:Traduction]]'.format(nom=nom), debug=True
)
Exemple #14
0
    def run(self):
        # Dénombrement
        l = {}
        cat = pywikibot.Category(self.site, u"Catégorie:Article par importance")
        for c in cat.subcategories(recurse=False):
            nom = c.title().split(' ')[-1]
            l[nom] = 0
            for d in c.subcategories():
                pages = self.site.categoryinfo(d)['pages']
                l[nom] += pages
        total = 0
        for a in l.values():
            total += a
        # Sauvegarde
        curseur = self.conn.cursor()
        req = 'INSERT INTO %s' % self.nom_base \
            + '(date, maximum, élevée, moyenne, faible, inconnue, total) ' \
            + 'VALUES ("%s", %d, %d, %d, %d, %d, %d)' \
            % (self.date.strftime("%Y-%m-%d"), l['maximum'], l['élevée'], \
                    l['moyenne'], l['faible'], l['inconnue'], total)
        try:
            curseur.execute(req)
        except sqlite3.Error as e:
            pywikibot.error(u"Erreur lors de l'INSERT :\n%s" % (e.args[0]))
        self.conn.commit()
        # Dessin
        largeur = 600 #largeur du graphique
        maxi = 0 #valeur max en hauteur
        nb_bande = 6 #nombre max de colonnes
        #on suppose ici un enregistrement par mois
        res = BeBot.charger_bdd(self.conn, self.nom_base, lim=nb_bande, ordre='"date" DESC')
        width = math.ceil(largeur/nb_bande) #largeur d'une bande

        # Liste des mois à traiter
        mois = []
        for j in range(0, nb_bande):
            d = self.date + relativedelta(months=-j)
            mois.append(d.strftime(u"%Y-%m"))
        # Récupération et tri des valeurs
        vals = []
        ri = 0 # ressource index : index sur les enregistrements utilisés
        for m in mois:
            val = {}
            if m != res[ri]['date'][0:7]:
                for k in res[ri].keys():
                    val[k] = 0
                val['date'] = m + u"-02"
            else:
                for k in res[ri].keys():
                    val[k] = res[ri][k]
                if maxi < val['total']:
                    maxi = val['total'] # point le plus haut
                ri = ri + 1
            vals.append(val)
        vals.reverse()
        #Majoration du maximum
        t = maxi
        rang = 0
        while t > 1:
            t = math.ceil(t/10)
            rang +=1
        graduation = pow(10, rang-2)
        maxi = maxi + math.floor(graduation/2)
        maxi = int(math.floor(maxi*pow(10,3-rang))*pow(10,rang-3)) # 3 premiers chiffre significatifs

        self.msg = dedent(u"""
<timeline>
Colors=
  id:lightgrey value:gray(0.9)
  id:darkgrey  value:gray(0.7)
  id:sfondo value:rgb(1,1,1)
  id:barra value:rgb(0.7,0.9,0.7) legend:Total
  id:rouge value:rgb(1,0,0) legend:Max+Élevée
  id:gris value:rgb(0.95,0.95,0.95)

ImageSize  = width:%d height:300
Define $width = %d
PlotArea   = left:60 bottom:20 top:20 right:10
DateFormat = x.y
Period     = from:0 till:%d
TimeAxis   = orientation:vertical
AlignBars  = justify
ScaleMajor = gridcolor:darkgrey increment:%d start:0
ScaleMinor = gridcolor:lightgrey increment:%d start:0
BackgroundColors = canvas:sfondo

Legend = left:70 top:295"""[1:] % (largeur, width, maxi, graduation, graduation/2) )
        #Nom des bars
        self.msg += '\nBarData=\n'
        for r in range(0, nb_bande):
            p = ''
            if r % 2 == 1:
                spl = vals[r]['date'].split('-')
                p = spl[1] + '/' + spl[0][2:]
            self.msg += '  bar:%d text:%s\n' % (r+1, p)
        #Valeurs : total
        self.msg += '\nPlotData=\n  color:barra width:$width align:left\n\n'
        for r in range(0, nb_bande):
            p = vals[r]['total']
            self.msg += '  bar:%d from:0 till: %d\n' % (r+1, p)
        #Valeurs : importants
        self.msg += '\nPlotData=\n  color:rouge width:$width align:left\n\n'
        for r in range(0, nb_bande):
            p = vals[r]['maximum'] + vals[r]['élevée']
            self.msg += '  bar:%d from:0 till: %d\n' % (r+1, p)
        #Labels
        self.msg += '\nPlotData=\n'
        for r in range(0, nb_bande):
            if r % 2 == 1:
                p = vals[r]['total']
                s = self.nombreverschaine(p)
                self.msg += '  bar:%d at: %d fontsize:S text:"%s" shift:(-20,5)\n' % (r+1, p, s)
                q = vals[r]['maximum'] + vals[r]['élevée']
                s = self.nombreverschaine(q)
                self.msg += '  bar:%d at: %d fontsize:S text:"%s" shift:(-20,5)\n' % (r+1, q, s)
        self.msg += '</timeline>'

        # Publication
        page = pywikibot.Page(self.site, 'Projet:Évaluation/Évolution')
        page.text = BeBot.ER_BotSection.sub(self.BotSectionEdit, page.text)
        BeBot.save(page, commentaire=self.resume, debug=False)
    def traduit_de(self, page):
        """ Vérifie et ajoute le {{Traduit de}} à la page de discussion
        """
        disc = pywikibot.Page(self.site, page.title().replace('/Traduction', ''))
        if disc.isRedirectPage():
            disc = disc.getRedirectTarget()
        m = self.re_traduitde.search(disc.text)
        if not m:
            n = self.re_suivi.search(page.text) # Récupération des infos de traduction
            if n:
                a = BeBot.modeletodic(n.group(0))
                if not a.has_key(1) or not a.has_key(2):
                    pywikibot.warning(";;; Impossible de trouver le nom ou la langue d'origine pour %s" % page.title())
                    return False
                langue = a[1]
                article = a[2].replace('_', ' ')
                if 'status' in a:
                    statut = a['status']
                else:
                    pywikibot.output(";;; Statut introuvable -> on passe")
                    pywikibot.output(a)
                    return False
                if statut == "1":
                    pywikibot.output(";;; Statut 'Demande' -> ne pas ajouter le {{Traduit de}}")
                    return True
                plus = ''
                if a.has_key('oldid') and a['oldid'] != '' and a['oldid'] != '830165' :
                    # On utilise le oldid pour retrouver la date
                    oldid = a['oldid']
                    if self.sites.has_key(langue):
                        sit = self.sites[langue]
                    else:
                        sit = pywikibot.Site(langue)
                        self.sites[langue] = sit
                    orig = pywikibot.Page(sit, article)
                    if orig.isRedirectPage():
                        orig = orig.getRedirectTarget()

                    date = ''
                    try:
                        for o in orig.fullVersionHistory():
                            revis = o[0]
                            if revis == oldid:
                                date = o[1]
                                break;
                    except: #Nopage
                        pywikibot.warning(";;; Impossible de lire l'historique pour %s:%s" % (langue, orig.title()))
                        return False
                    #pywikibot.output(date.__str__()[8:10])
                    date = date.__str__()
                    if date != '':
                        jour  = date[8:10].lstrip('0')
                        mois  = date[5:7].lstrip('0')
                        annee = date[0:4]
                        plus = "|%s/%s/%s|%s" % (jour, mois, annee, oldid)
                    else:
                        pywikibot.warning("Ne peut dater une ancienne révision de %s" % page.title())
                appel = '{{Traduit de|%s|%s%s}}\n' % (langue, article, plus)
                #BeBot.diff(disc.text, appel + disc.text)
                disc.text = appel + disc.text
                BeBot.save(disc, commentaire=self.resume+' : Ajout du bandeau de licence', debug=self.debug)
                self.stats['traduitde'] += 1
                return True
            else:
                pywikibot.warning('Impossible de trouver les infos de traduction pour %s' % page.title())
        return True
        opts, args = getopt.getopt(sys.argv[1:], "")
    except getopt.GetoptError, err:
        print str(err)
        usage()
        sys.exit(2)
    if len(args) > 0:
        wikis = args
    else:
        wikis = ['nl']

    log = u''
    for cl in wikis:
        pywikibot.output( u"== WP:%s ..." % cl )
        try:
            lq = ListageQualite(pywikibot.Site(cl))
        except:
            continue
        lq.run()
        lq.page_projet.text = lq.publier()
        BeBot.save(lq.page_projet, commentaire=u'Mise à jour mensuelle des listings')
        log += unicode(lq)
    pywikibot.Page(pywikibot.Site('fr'), \
            u'Utilisateur:BeBot/Listage qualité').put(log, \
            comment=lq.resume, minorEdit=False)

if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme()