This repository was archived by the owner on Aug 14, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlist-users-for-review-rights.py
More file actions
152 lines (129 loc) · 5.99 KB
/
list-users-for-review-rights.py
File metadata and controls
152 lines (129 loc) · 5.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/python
#
# (C) 2020 Count Count
#
# Distributed under the terms of the MIT license.
from __future__ import unicode_literals
import locale
import os
import re
from dataclasses import dataclass
from datetime import datetime, timedelta
from typing import Any, List, Set, cast
import pytz
import pywikibot
from criteria import CriteriaChecker
@dataclass
class AlreadyReportedCandidates:
reviewCandidates: Set[str]
autoReviewCandidates: Set[str]
class Program:
def __init__(self) -> None:
self.site = pywikibot.Site()
self.site.login()
self.timezone = pytz.timezone("Europe/Berlin")
self.criteriaChecker = CriteriaChecker(self.site)
@staticmethod
def getDateString(date: int) -> str:
dayFormat = "%-d" if os.name != "nt" else "%d"
return date.strftime(f"{dayFormat}. %B %Y")
def getAlreadyReportedCandidates(self) -> AlreadyReportedCandidates:
page = pywikibot.Page(self.site, "Wikipedia:Gesichtete Versionen/Rechtevergabe/Botliste")
self.site.loadrevisions(page, rvdir=True, content=True, user=self.site.user())
actualRevs = page._revisions.values()
newText = None
reviewCandidates = set()
autoReviewCandidates = set()
pattern = re.compile(r"\{\{Wikipedia:Gesichtete Versionen/Rechtevergabe/Vorlage\|([^}]+)\}\}")
for rev in [x for x in actualRevs]:
oldText = page.getOldVersion(rev.parent_id)
newText = rev.text
addedText = newText[len(oldText) :]
targetSet = set()
for line in addedText.split("\n"):
if line == "; Kandidaten für aktive Sichterrechte":
targetSet = reviewCandidates
elif line == "; Kandidaten für passive Sichterrechte":
targetSet = autoReviewCandidates
for match in pattern.finditer(line):
user = match.group(1)
targetSet.add(user)
return AlreadyReportedCandidates(reviewCandidates, autoReviewCandidates)
def listNewUsers(self) -> None:
alreadyReportedCandidates = self.getAlreadyReportedCandidates()
h24Ago = datetime.now() - timedelta(days=1)
startTime = datetime(h24Ago.year, h24Ago.month, h24Ago.day, 0, 0, 0)
endTime = startTime + timedelta(hours=24)
recentChanges = self.site.recentchanges(end=startTime, start=endTime) # reverse order
usernames = set()
for ch in recentChanges:
if "userhidden" in ch:
continue
if (ch["type"] == "edit" or ch["type"] == "new") and not "anon" in ch:
usernames.add(ch["user"])
usersToBePromoted = []
usersToBePromotedToAutoReview = []
print(f"Checking {len(usernames)} users for {startTime}...")
count = 0
for username in usernames:
count += 1
if count % 100 == 0:
print(f"Checked {count} users.")
user = pywikibot.User(self.site, username)
if not "review" in user.rights():
userData = self.criteriaChecker.getUserData(user, endTime, False)
# check for review rights
reviewCriteriaChecks = self.criteriaChecker.checkUserEligibleForReviewGroup(userData)
eligibleForReview = not list(filter(lambda criteria: not criteria.met, reviewCriteriaChecks))
if eligibleForReview and not username in alreadyReportedCandidates.reviewCandidates:
usersToBePromoted.append(user)
continue
# check for autoreview rights
if "autoreview" in user.rights() or username in alreadyReportedCandidates.autoReviewCandidates:
continue
autoReviewCriteriaChecks = self.criteriaChecker.checkUserEligibleForAutoReviewGroup(userData)
eligibleForAutoReview = not list(filter(lambda criteria: not criteria.met, autoReviewCriteriaChecks))
if eligibleForAutoReview:
usersToBePromotedToAutoReview.append(user)
newSection = f"\n\n== {self.getDateString(startTime)} ==\n"
newSection += "; Kandidaten für aktive Sichterrechte\n"
# print(f"{len(usersToBePromoted)} Benutzer gefunden.")
if usersToBePromoted:
for user in sorted(usersToBePromoted):
newSection += f"* {{{{Wikipedia:Gesichtete Versionen/Rechtevergabe/Vorlage|{user.username}}}}}\n"
else:
newSection += f":''keine''\n"
newSection += "\n"
newSection += "; Kandidaten für passive Sichterrechte\n"
# print(f"{len(usersToBePromotedToAutoReview)} Benutzer gefunden.")
if usersToBePromotedToAutoReview:
for user in sorted(usersToBePromotedToAutoReview):
newSection += f"* {{{{Wikipedia:Gesichtete Versionen/Rechtevergabe/Vorlage|{user.username}}}}}\n"
else:
newSection += f":''keine''\n"
if not usersToBePromoted and not usersToBePromotedToAutoReview:
newSection += f"{{{{Erledigt|--~~~~}}}}\n"
page = pywikibot.Page(self.site, "Wikipedia:Gesichtete Versionen/Rechtevergabe/Botliste")
page.text += newSection
page.save(summary=f"Bot: Neue Kandidaten für den {self.getDateString(startTime)} hinzugefügt.")
print(newSection)
def checkSingleUser(self) -> None:
crit = self.criteriaChecker.checkUserEligibleForReviewGroup(
self.criteriaChecker.getUserData(
pywikibot.User(self.criteriaChecker.site, "Benutzer:Beson"), datetime(2020, 1, 6), False
)
)
if list(filter(lambda criteria: not criteria.met, crit)):
print(f"User not eligible")
else:
print(f"User eligible")
def main() -> None:
locale.setlocale(locale.LC_ALL, "de_DE.utf8")
pywikibot.handle_args()
# Program().checkSingleUser()
Program().listNewUsers()
if __name__ == "__main__":
try:
main()
finally:
pywikibot.stopme()