FAKE_ACCOUNTS = ('unknown', 'buildservice-autocommit', 'autobuild', '_service') class User: def parse(self, xml, userid): self.userid = userid self.realname = xml.find("realname").text 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): 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) ) missing_users = [row[0] for row in cur.fetchall()] return missing_users