chore(backend): refactor mono cli file into package
This commit is contained in:
98
backend/cli/commands/members.py
Normal file
98
backend/cli/commands/members.py
Normal file
@@ -0,0 +1,98 @@
|
||||
"""
|
||||
Member-related CLI commands.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from backend.cli.base import NimbusFlowCLI
|
||||
|
||||
from backend.cli.utils import format_member_row
|
||||
|
||||
|
||||
def cmd_members_list(cli: "NimbusFlowCLI", args) -> None:
|
||||
"""List all members with optional filters."""
|
||||
print("Listing members...")
|
||||
|
||||
# Get all classifications for lookup
|
||||
classifications = cli.classification_repo.list_all()
|
||||
classification_map = {c.ClassificationId: c.ClassificationName for c in classifications}
|
||||
|
||||
# Apply filters
|
||||
if args.classification:
|
||||
# Find classification ID by name
|
||||
classification_id = None
|
||||
for c in classifications:
|
||||
if c.ClassificationName.lower() == args.classification.lower():
|
||||
classification_id = c.ClassificationId
|
||||
break
|
||||
|
||||
if classification_id is None:
|
||||
print(f"❌ Classification '{args.classification}' not found")
|
||||
return
|
||||
|
||||
members = cli.member_repo.get_by_classification_ids([classification_id])
|
||||
elif args.active:
|
||||
members = cli.member_repo.get_active()
|
||||
else:
|
||||
members = cli.member_repo.list_all()
|
||||
|
||||
if not members:
|
||||
print("No members found.")
|
||||
return
|
||||
|
||||
# Print header
|
||||
print(f"\n{'ID':<3} | {'First Name':<12} | {'Last Name':<15} | {'Classification':<12} | {'Active':<6} | {'Email'}")
|
||||
print("-" * 80)
|
||||
|
||||
# Print members
|
||||
for member in members:
|
||||
classification_name = classification_map.get(member.ClassificationId)
|
||||
print(format_member_row(member, classification_name))
|
||||
|
||||
print(f"\nTotal: {len(members)} members")
|
||||
|
||||
|
||||
def cmd_members_show(cli: "NimbusFlowCLI", args) -> None:
|
||||
"""Show detailed information about a specific member."""
|
||||
member = cli.member_repo.get_by_id(args.member_id)
|
||||
if not member:
|
||||
print(f"❌ Member with ID {args.member_id} not found")
|
||||
return
|
||||
|
||||
# Get classification name
|
||||
classification = None
|
||||
if member.ClassificationId:
|
||||
classification = cli.classification_repo.get_by_id(member.ClassificationId)
|
||||
|
||||
print(f"\n📋 Member Details (ID: {member.MemberId})")
|
||||
print("-" * 50)
|
||||
print(f"Name: {member.FirstName} {member.LastName}")
|
||||
print(f"Email: {member.Email or 'N/A'}")
|
||||
print(f"Phone: {member.PhoneNumber or 'N/A'}")
|
||||
print(f"Classification: {classification.ClassificationName if classification else 'N/A'}")
|
||||
print(f"Active: {'Yes' if member.IsActive else 'No'}")
|
||||
print(f"Notes: {member.Notes or 'N/A'}")
|
||||
|
||||
print(f"\n⏰ Schedule History:")
|
||||
print(f"Last Scheduled: {member.LastScheduledAt or 'Never'}")
|
||||
print(f"Last Accepted: {member.LastAcceptedAt or 'Never'}")
|
||||
print(f"Last Declined: {member.LastDeclinedAt or 'Never'}")
|
||||
print(f"Decline Streak: {member.DeclineStreak}")
|
||||
|
||||
|
||||
def setup_members_parser(subparsers) -> None:
|
||||
"""Set up member-related command parsers."""
|
||||
# Members commands
|
||||
members_parser = subparsers.add_parser("members", help="Manage members")
|
||||
members_subparsers = members_parser.add_subparsers(dest="members_action", help="Members actions")
|
||||
|
||||
# members list
|
||||
members_list_parser = members_subparsers.add_parser("list", help="List members")
|
||||
members_list_parser.add_argument("--active", action="store_true", help="Show only active members")
|
||||
members_list_parser.add_argument("--classification", type=str, help="Filter by classification name")
|
||||
|
||||
# members show
|
||||
members_show_parser = members_subparsers.add_parser("show", help="Show member details")
|
||||
members_show_parser.add_argument("member_id", type=int, help="Member ID to show")
|
||||
Reference in New Issue
Block a user