inactive.py 3.83 KB
Newer Older
1 2 3 4
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Script relevant les sysops absents depuis un temps donné

Linedwell's avatar
Linedwell committed
5
# (C) Linedwell, 2011-2015
6 7 8 9 10 11 12 13 14 15
#
# Distribué sous licence GNU GPLv3
# Distributed under the terms of the GNU GPLv3 license
# http://www.gnu.org/licenses/gpl.html


import sys
sys.path.insert(1, '..') #ajoute au PYTHONPATH le répertoire parent

import time
16 17 18
from datetime import date, datetime, timedelta

import pywikibot
19 20

# Déclarations
21
site = pywikibot.Site('fr','vikidia')
22 23 24
nbrModif = 0
nbrTotal = 0

25
month = [u'',u'janvier',u'février',u'mars',u'avril',u'mai',u'juin',u'juillet',u'août',u'septembre',u'octobre',u'novembre',u'décembre']
26

27 28
#Retourne la liste des administrateurs ainsi que la date de leur dernière contribution
def getSysopsLastEdit():
29 30
    
    sysopList = site.allusers(group="sysop")
31
    sysopLastEdit = {}
32 33

    for sysop in sysopList:
34
        sysopName = sysop[u'name']
Linedwell's avatar
Linedwell committed
35
        uc = site.usercontribs(user=sysopName,total=1)
36 37 38

        for c in uc:
            lastEdit = datetime.strptime(c[u'timestamp'],"%Y-%m-%dT%H:%M:%SZ")
39
            sysopLastEdit[sysopName] = lastEdit
40 41
            break

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
    return sysopLastEdit

#Retourne la liste des administrateurs inactifs depuis <hardlimit>, notifie ceux inactifs depuis <softlimit>
def getInactiveSysops(list, hardlimit, softlimit):
    
    inactiveSysops = []

    for sysop in sorted(list.iterkeys()):
        lastEdit = list[sysop]
        duration = calcDuration(lastEdit)
        hrdate = u"%s %s %s (%s jours)" %(lastEdit.day,month[int(lastEdit.month)],lastEdit.year,duration.days)
        
        if lastEdit < hardlimit:
            inactiveSysops.append(u"* {{u|" + sysop + u"}} : inactif depuis le " + hrdate)
        elif lastEdit < softlimit:
            deadline = lastEdit + timedelta(days=365)
            hrdeadline = u"%s %s %s" %(deadline.day,month[int(deadline.month)],deadline.year)
            notifySysop(sysop,hrdate,hrdeadline)

61
    return inactiveSysops
62

63 64
#Notifie un admin ayant presque atteint le seuil d'inactivité de la possible suspension de ses outils
def notifySysop(sysop,hrdate,hrdeadline):
Linedwell's avatar
Linedwell committed
65
    notif = u"\n\n{{subst:Utilisateur:LinedBot/NotifAdminInactif|%s|%s}}\n" %(hrdate,hrdeadline)
66 67 68 69 70 71 72 73 74 75

    page = pywikibot.Page(site,u"Discussion utilisateur:"+sysop)
    page.text = page.text + notif
    
    summary = "[[VD:Robot|Robot]] : Notification de prochaine suspension des outils"

    page.save(summary,minor=False)


#Envoie sur VD:DB la liste des administrateurs inactifs ainsi que la durée de leur inactivité
76 77 78 79 80 81 82 83 84 85 86 87 88
def reportInactiveSysops(list):
    
    if len(list) > 0:
        
        currentYear = datetime.utcnow().year

        report = u"\n\n== Administrateurs inactifs depuis au moins un an ==\n\n"

        for s in list:
            report += s + "\n"
        
        page = pywikibot.Page(site,u"Vikidia:Demandes aux bureaucrates/" + str(currentYear))
        page.text = page.text + report
89
        summary = "[[VD:Robot|Robot]] : Liste des administrateurs inactifs depuis au moins un an"
90

91
        page.save(summary,minor=False)
92 93 94 95 96 97 98


#Retourne la date avant laquelle on considère obsolète l'usage du modèle
def calcLimit(delay):
    today = datetime.utcnow()
    limite = today - timedelta(days=delay)
    return limite
99

100 101 102 103 104
#Retourne le temps écoulé entre une date et le jour courant
def calcDuration(date):
    today = datetime.utcnow()
    duration = today - date
    return duration
105 106 107 108 109


#Exécution
def main():
    timeStart = time.time()
110 111 112 113 114 115
    hardlimit = calcLimit(365) #Seuil pour lequel le retrait des outils sera demandé
    softlimit = calcLimit(300) #Seuil pour lequel une notification sera envoyée à l'admin
    
    sysopLastEdit = getSysopsLastEdit()
    inactiveSysops = getInactiveSysops(sysopLastEdit,hardlimit,softlimit)
    
Linedwell's avatar
Linedwell committed
116
    reportInactiveSysops(inactiveSysops)
117 118 119 120 121 122 123
    timeEnd = time.time()

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