Ei kuvausta

create_demo_users.py 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from __future__ import annotations
  2. from django.core.management.base import BaseCommand, CommandError
  3. from django.contrib.auth import get_user_model
  4. from orgs.models import Organization, UserProfile
  5. class Command(BaseCommand):
  6. help = "Create demo users for an organization with roles and default passwords."
  7. def add_arguments(self, parser):
  8. parser.add_argument("--org", required=True, help="Organization code, id, or name")
  9. parser.add_argument("--owners", type=int, default=1, help="Number of owners to create (default: 1)")
  10. parser.add_argument("--managers", type=int, default=2, help="Number of managers to create (default: 2)")
  11. parser.add_argument("--drivers", type=int, default=2, help="Number of drivers to create (default: 2)")
  12. parser.add_argument("--customers", type=int, default=2, help="Number of customers to create (default: 2)")
  13. parser.add_argument("--auditors", type=int, default=0, help="Number of auditors to create (default: 0)")
  14. parser.add_argument("--password", default="password123", help="Password to set for demo users")
  15. parser.add_argument("--prefix", default=None, help="Username prefix (defaults to org code)")
  16. parser.add_argument("--email-domain", default="example.com", help="Email domain for users")
  17. parser.add_argument("--staff-owners", action="store_true", help="Mark owner users as staff for admin access")
  18. def handle(self, *args, **options):
  19. org_ident: str = options["org"]
  20. counts = {
  21. UserProfile.ROLE_OWNER: int(options["owners"]),
  22. UserProfile.ROLE_MANAGER: int(options["managers"]),
  23. UserProfile.ROLE_DRIVER: int(options["drivers"]),
  24. UserProfile.ROLE_CUSTOMER: int(options["customers"]),
  25. UserProfile.ROLE_AUDITOR: int(options["auditors"]),
  26. }
  27. password: str = options["password"]
  28. email_domain: str = options["email_domain"]
  29. staff_owners: bool = bool(options.get("staff_owners", False))
  30. # Resolve organization
  31. org = None
  32. if org_ident.isdigit():
  33. org = Organization.objects.filter(pk=int(org_ident)).first()
  34. if org is None:
  35. org = Organization.objects.filter(code=org_ident).first() or Organization.objects.filter(name=org_ident).first()
  36. if org is None:
  37. raise CommandError(f"Organization not found: {org_ident}")
  38. prefix = options.get("prefix") or org.code
  39. U = get_user_model()
  40. created = 0
  41. results = []
  42. for role, n in counts.items():
  43. for i in range(1, max(0, n) + 1):
  44. username = f"{prefix}-{role}-{i}"
  45. email = f"{username}@{email_domain}"
  46. user, was_created = U.objects.get_or_create(
  47. username=username,
  48. defaults={"email": email},
  49. )
  50. if was_created:
  51. user.set_password(password)
  52. if staff_owners and role == UserProfile.ROLE_OWNER:
  53. user.is_staff = True
  54. user.save()
  55. profile, _ = UserProfile.objects.get_or_create(
  56. user=user,
  57. defaults={"organization": org, "role": role},
  58. )
  59. if profile.organization_id != org.id or profile.role != role:
  60. profile.organization = org
  61. profile.role = role
  62. profile.save(update_fields=["organization", "role"])
  63. created += 1
  64. results.append((username, role))
  65. else:
  66. # Ensure profile exists and matches org/role
  67. profile, _ = UserProfile.objects.get_or_create(
  68. user=user,
  69. defaults={"organization": org, "role": role},
  70. )
  71. changed = False
  72. if profile.organization_id != org.id:
  73. profile.organization = org
  74. changed = True
  75. if profile.role != role:
  76. profile.role = role
  77. changed = True
  78. if changed:
  79. profile.save(update_fields=["organization", "role"])
  80. self.stdout.write(self.style.SUCCESS(
  81. f"Created {created} users for org {org.code}. Password='{password}'."
  82. ))
  83. if results:
  84. for uname, role in results[:10]:
  85. self.stdout.write(f" - {uname} ({role})")
  86. if len(results) > 10:
  87. self.stdout.write(f" ... and {len(results) - 10} more")