diff --git a/osc/commands/person_search.py b/osc/commands/person_search.py new file mode 100644 index 00000000..0651978a --- /dev/null +++ b/osc/commands/person_search.py @@ -0,0 +1,51 @@ +import osc.commandline + + +class PersonSearchCommand(osc.commandline.OscCommand): + """ + Search a person (user) + """ + + name = "search" + parent = "PersonCommand" + + def init_arguments(self): + self.add_argument( + "--login", + help="Search by a login.", + ) + self.add_argument( + "--login-contains", + metavar="SUBSTR", + help="Search by a substring in a login.", + ) + self.add_argument( + "--realname-contains", + metavar="SUBSTR", + help="Search by a substring in a realname.", + ) + self.add_argument( + "--email", + help="Search by an email address.", + ) + self.add_argument( + "--email-contains", + metavar="SUBSTR", + help="Search by a substring in an email address.", + ) + + def run(self, args): + from .. import obs_api + + persons = obs_api.Person.search( + args.apiurl, + login=args.login, + login__contains=args.login_contains, + realname__contains=args.realname_contains, + email=args.email, + email__contains=args.email_contains, + ) + + for person in persons: + print(person.to_human_readable_string()) + print() diff --git a/osc/obs_api/person.py b/osc/obs_api/person.py index 4aba536a..ae4b6c51 100644 --- a/osc/obs_api/person.py +++ b/osc/obs_api/person.py @@ -33,6 +33,19 @@ class Person(XmlModel): ignore_auth_services: Optional[BoolString] = Field( ) + def to_human_readable_string(self) -> str: + """ + Render the object as a human readable string. + """ + from ..output import KeyValueTable + + table = KeyValueTable() + table.add("Login", self.login, color="bold") + table.add("Real name", self.realname) + table.add("Email", self.email) + table.add("State", self.state) + return f"{table}" + @classmethod def from_api(cls, apiurl: str, username: str): url_path = ["person", username]