99 lines
2.7 KiB
Python
99 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
from lib.db import DB
|
|
|
|
FAKE_ACCOUNTS = (
|
|
"unknown",
|
|
"buildservice-autocommit",
|
|
"autobuild",
|
|
"_service",
|
|
"admin",
|
|
"jg",
|
|
"mrdocs",
|
|
"AdrianSuSE",
|
|
"$user",
|
|
"embar-",
|
|
"michel_mno",
|
|
"guinux",
|
|
)
|
|
|
|
|
|
class User:
|
|
@staticmethod
|
|
def find(db: DB, userid: str) -> User:
|
|
row = User.lookup(db, userid)
|
|
self = User()
|
|
self.userid = userid
|
|
if row:
|
|
(_, _, self.email, self.realname) = row
|
|
else:
|
|
self.email = ""
|
|
self.realname = ""
|
|
if not self.email:
|
|
self.email = "null@suse.de"
|
|
if not self.realname:
|
|
self.realname = f"OBS User {userid}"
|
|
return self
|
|
|
|
def parse(self, xml, userid):
|
|
self.userid = userid
|
|
self.realname = xml.find("realname").text
|
|
if self.realname is None:
|
|
self.realname = ""
|
|
self.email = xml.find("email").text
|
|
if self.email is None:
|
|
self.email = ""
|
|
|
|
return self
|
|
|
|
def __str__(self):
|
|
return f"User {self.userid}: {self.realname} {self.email}"
|
|
|
|
def __repr__(self):
|
|
return f"[{self.__str__()}]"
|
|
|
|
def import_into_db(self, db):
|
|
with db.cursor() as cur:
|
|
cur.execute(
|
|
"""INSERT INTO users (userid, realname, email)
|
|
VALUES (%s,%s,%s)""",
|
|
(
|
|
self.userid,
|
|
self.realname,
|
|
self.email,
|
|
),
|
|
)
|
|
|
|
@staticmethod
|
|
def lookup(db, userid):
|
|
with db.cursor() as cur:
|
|
cur.execute("SELECT * FROM users where userid=%s", (userid,))
|
|
row = cur.fetchone()
|
|
if not row:
|
|
return None
|
|
return row
|
|
|
|
@staticmethod
|
|
def missing_users(db):
|
|
missing_users = set()
|
|
with db.cursor() as cur:
|
|
cur.execute(
|
|
"""SELECT DISTINCT revisions.userid
|
|
FROM revisions LEFT JOIN users ON revisions.userid = users.userid
|
|
WHERE users.userid IS NULL AND revisions.userid NOT IN {}""".format(
|
|
FAKE_ACCOUNTS
|
|
)
|
|
)
|
|
for row in cur.fetchall():
|
|
missing_users.add(row[0])
|
|
cur.execute(
|
|
"""SELECT DISTINCT requests.creator
|
|
FROM requests LEFT JOIN users ON requests.creator=users.userid
|
|
WHERE users.userid IS NULL AND requests.creator NOT IN {}""".format(
|
|
FAKE_ACCOUNTS
|
|
)
|
|
)
|
|
for row in cur.fetchall():
|
|
missing_users.add(row[0])
|
|
return sorted(missing_users)
|