From aae7504e134d82336127c26e6a60d598357ea791 Mon Sep 17 00:00:00 2001 From: Darksider3 Date: Sat, 30 May 2020 09:51:25 +0200 Subject: [PATCH] ListUsers.py: Externalize class & rename some variables This actually makes the whole file easier to read and maintain. I've still to refactor the output to something. --- private/ListUsers.py | 111 ++++++--------------------------------- private/backup.py | 10 ++-- private/lib/ListUsers.py | 65 +++++++++++++++++++++++ 3 files changed, 86 insertions(+), 100 deletions(-) create mode 100644 private/lib/ListUsers.py diff --git a/private/ListUsers.py b/private/ListUsers.py index 3d36770..bdd1785 100755 --- a/private/ListUsers.py +++ b/private/ListUsers.py @@ -1,120 +1,41 @@ #!/usr/bin/env python3 import configparser -import sqlite3 # sqlite3.Row-Object -from typing import List # Typing support! - import lib.uis.default as default_cmd # Follows -u, -a, -f flags -from lib.sqlitedb import SQLiteDB - - -class ListUsers: - db = None - usersFetch = None - - def __init__(self, db: str, unapproved: bool = False, approved: bool = True, single_user: str = None): - """Constructs ListUsers - - :param db: Database to access - :type db: str - :param unapproved: only List unapproved users - :type unapproved: bool - :param approved: only list approved users - :type approved: bool - """ - - self.db = SQLiteDB(db) - if unapproved: # only unapproved users - query = "SELECT * FROM `applications` WHERE `status` = '0'" - elif approved: # Approved users - query = "SELECT * FROM `applications` WHERE `status` = '1'" - else: # All users - query = "SELECT * FROM `applications`" - self.usersFetch = self.db.query(query) - if single_user is not None: - query = "SELECT * FROM `applications` WHERE `username` = ?" - self.usersFetch = self.db.safequery(query, tuple([single_user])) - - def output_as_list(self) -> str: - """Generates a string with one (approved) user per line and one newline at the end - - :rtype: str - :return: String consisting with one(activated) user per line - """ - - list_str: str = "" - query = "SELECT `username` FROM `applications` WHERE `status` = '1' ORDER BY timestamp ASC" - self.usersFetch = self.db.query(query) - for users in self.usersFetch: - list_str += users["username"] + "\n" - return list_str - - def prettyPrint(self) -> None: - pass # see below why not implemented yet, texttable... - - def get_fetch(self) -> List[sqlite3.Row]: - """ Returns a complete fetch done by the lib.sqlitedb-class - - :return: Complete fetchall(). A List[sqlite3.Row] with dict-emulation objects. - :rtype: List[sqlite3.Row] - """ - - return self.usersFetch - - -# @TODO MAYBE best solution: https://pypi.org/project/texttable/ -# examle: -""" -from texttable import Texttable -t = Texttable() -t.add_rows([['Name', 'Age'], ['Alice', 24], ['Bob', 19]]) -print(t.draw()) ----------------> Results in: - -+-------+-----+ -| Name | Age | -+=======+=====+ -| Alice | 24 | -+-------+-----+ -| Bob | 19 | -+-------+-----+ +from lib.ListUsers import ListUsers - for user in fetch: - print("ID: {}; Username: \"{}\"; Mail: {}; Name: \"{}\"; Registered: {}; Status: {}".format( - user["id"], user["username"], user["email"], user["name"], user["timestamp"], user["status"] - )) -""" if __name__ == "__main__": default_cmd.argparser.description += " - Lists Users from the Tilde database." default_cmd.argparser.add_argument('--list-asc', default=False, action="store_true", help='Output a newline seperated list of users', required=False, dest="args_asc") - default_cmd.argparser.add_argument('--user', default=None, type=str, - help="Just show a specific user by it's name", required=False) + default_cmd.argparser.add_argument('--single_user', default=None, type=str, + help="Just show a specific single_user by it's name", required=False) args = default_cmd.argparser.parse_args() config = configparser.ConfigParser() config.read(args.config) - ret = "" - if args.user is not None: + OUTPUT = "" + if args.single_user is not None: L = ListUsers(config['DEFAULT']['applications_db'], unapproved=args.unapproved, approved=args.approved, - single_user=args.user) + single_user=args.single_user) else: L = ListUsers(config['DEFAULT']['applications_db'], unapproved=args.unapproved, approved=args.approved) if args.args_asc: - ret = L.output_as_list() + OUTPUT = L.output_as_list() else: - fetch = L.get_fetch() - ret += "ID %-1s| Username %-5s| Mail %-20s| Name %-17s| Registered %-8s | State |\n" % ( + users = L.get_fetch() + OUTPUT += "ID %-1s| Username %-5s| Mail %-20s| Name %-17s| Registered %-8s | State |\n" % ( " ", " ", " ", " ", " " ) - ret += 102 * "-" + "\n" - for user in fetch: - ret += "%-4i| %-14s| %-25s| %-22s| %-8s | %-5i |\n" % ( - user["id"], user["username"], user["email"], user["name"], user["timestamp"], user["status"] + OUTPUT += 102 * "-" + "\n" + for single_user in users: + OUTPUT += "%-4i| %-14s| %-25s| %-22s| %-8s | %-5i |\n" % ( + single_user["id"], single_user["username"], single_user["email"], + single_user["name"], single_user["timestamp"], single_user["status"] ) if args.file != "stdout": with open(args.file, 'w') as f: - print(ret, file=f) + print(OUTPUT, file=f) else: - print(ret) + print(OUTPUT) exit(0) diff --git a/private/backup.py b/private/backup.py index bd575b7..52adf30 100755 --- a/private/backup.py +++ b/private/backup.py @@ -9,7 +9,7 @@ import configparser import csv import io -import ListUsers +from lib.ListUsers import ListUsers import lib.uis.default as default_cmd # Follows -u, -a, -f flags @@ -20,7 +20,7 @@ class Backup: :Example: >>> from backup import Backup >>> from ListUsers import ListUsers - >>> L = ListUsers.ListUsers("/path/to/sqlite").get_fetch() + >>> L = ListUsers.list_users("/path/to/sqlite").get_fetch() >>> backup_db = Backup("stdout") >>> backup_db.backup_to_file(L) CSV-Separated list with headers in first row @@ -72,9 +72,9 @@ class Backup: self.quoting = quoting def set_filename(self, filename: str) -> None: - """ Sets Filename to output to + """ Sets Filename to OUTPUT to - :param filename: Filename to output to(set stdout for stdout) + :param filename: Filename to OUTPUT to(set stdout for stdout) :type filename: str :return: None :rtype: None @@ -125,7 +125,7 @@ if __name__ == "__main__": args = default_cmd.argparser.parse_args() config = configparser.ConfigParser() config.read(args.config) - L = ListUsers.ListUsers(config['DEFAULT']['applications_db'], + L = ListUsers(config['DEFAULT']['applications_db'], unapproved=args.unapproved, approved=args.approved) fetch = L.get_fetch() if fetch: diff --git a/private/lib/ListUsers.py b/private/lib/ListUsers.py new file mode 100644 index 0000000..9afec94 --- /dev/null +++ b/private/lib/ListUsers.py @@ -0,0 +1,65 @@ +from lib.sqlitedb import SQLiteDB +import sqlite3 # sqlite3.Row-Object +from typing import List # Typing support! + + +class ListUsers: + """ + List tilde users + """ + + db = None + users_fetch = None + + def __init__(self, db: str, unapproved: bool = False, approved: bool = True, single_user: str = None): + """Constructs list_users + + :param db: Database to access + :type db: str + :param unapproved: only List unapproved users + :type unapproved: bool + :param approved: only list approved users + :type approved: bool + """ + + self.db = SQLiteDB(db) + if unapproved: # only unapproved users + query = "SELECT * FROM `applications` WHERE `status` = '0'" + elif approved: # Approved users + query = "SELECT * FROM `applications` WHERE `status` = '1'" + else: # All users + query = "SELECT * FROM `applications`" + self.users_fetch = self.db.query(query) + if single_user is not None: + query = "SELECT * FROM `applications` WHERE `username` = ?" + self.users_fetch = self.db.safequery(query, tuple([single_user])) + + def output_as_list(self) -> str: + """Generates a string with one (approved) single_user per line and one newline at the end + + :rtype: str + :return: String consisting with one(activated) single_user per line + """ + + list_str: str = "" + query = "SELECT `username` FROM `applications` WHERE `status` = '1' ORDER BY timestamp ASC" + self.users_fetch = self.db.query(query) + for user in self.users_fetch: + list_str += user["username"] + "\n" + return list_str + + def pretty_print(self) -> None: + """ + pretty-print users + :return: None + """ + pass # see below why not implemented yet, texttable... + + def get_fetch(self) -> List[sqlite3.Row]: + """ Returns a complete users done by the lib.sqlitedb-class + + :return: Complete fetchall(). A List[sqlite3.Row] with dict-emulation objects. + :rtype: List[sqlite3.Row] + """ + + return self.users_fetch