from __future__ import annotations from typing import List from ad_user_creator.models import UserInputRecord from ad_user_creator.user_service import UserService def _split_optional_groups(text: str) -> List[str]: if not text.strip(): return [] items = [item.strip() for item in text.replace(",", ",").split(",")] return [item for item in items if item] def run_interactive_create(user_service: UserService, default_base_group: str, dry_run: bool = False) -> None: print("请输入 AD 用户信息:") display_name = input("显示名称(姓名): ").strip() sam_account_name = input("用户名(sAMAccountName): ").strip() email = input("邮箱(mail): ").strip() dept_ou = input("部门 OU (例如 CEO 或 RnD/tm_hardware): ").strip() base_group_input = input(f"基础组(默认 {default_base_group}): ").strip() base_group = base_group_input or default_base_group project_groups = _split_optional_groups(input("项目组(逗号分隔,可空): ")) resource_groups = _split_optional_groups(input("资源组(逗号分隔,可空): ")) record = UserInputRecord( display_name=display_name, sam_account_name=sam_account_name, email=email, dept_ou=dept_ou, base_group=base_group, project_groups=project_groups, resource_groups=resource_groups, ) plan = user_service.preview_plan(record) print("\n预览:") print(f"- 显示名称: {plan.display_name}") print(f"- 用户名: {plan.sam_account_name}") print(f"- 邮箱: {plan.email}") print(f"- 部门 OU: {record.dept_ou}") print(f"- 用户 DN: {plan.user_dn}") print(f"- 基础组: {plan.base_group}") print(f"- 项目组: {', '.join(plan.project_groups) if plan.project_groups else '(空)'}") print(f"- 资源组: {', '.join(plan.resource_groups) if plan.resource_groups else '(空)'}") print(f"- uid: {plan.uid}") print(f"- uidNumber: {plan.uid_number}") print(f"- gidNumber: {plan.gid_number}") print(f"- unixHomeDirectory: {plan.unix_home_directory}") confirm = input("\n确认创建? [y/N]: ").strip().lower() if confirm not in {"y", "yes"}: print("已取消。") return result = user_service.process_user(record, dry_run=dry_run) print(f"执行结果: {result.status} {result.reason}")