users.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import hashlib
  2. import random
  3. from django.contrib.auth import get_user_model
  4. from django.utils.crypto import get_random_string
  5. from ..users.bans import ban_user
  6. from ..users.test import create_test_user
  7. from .utils import retry_on_db_error
  8. User = get_user_model()
  9. AVATAR_SIZES = (400, 200, 100)
  10. GRAVATAR_URL = "https://www.gravatar.com/avatar/%s?s=%s&d=retro"
  11. PASSWORD = "password"
  12. @retry_on_db_error
  13. def get_fake_user(fake, rank=None, requires_activation=User.ACTIVATION_NONE):
  14. username = get_fake_username(fake)
  15. email = fake.email()
  16. return create_test_user(
  17. username,
  18. email.lower(),
  19. PASSWORD,
  20. avatars=get_fake_avatars(email),
  21. rank=rank,
  22. requires_activation=requires_activation,
  23. )
  24. def get_fake_banned_user(fake, rank=None):
  25. user = get_fake_user(fake, rank=rank)
  26. ban_user(user)
  27. return user
  28. def get_fake_inactive_user(fake, rank=None):
  29. return get_fake_user(fake, rank=rank, requires_activation=User.ACTIVATION_USER)
  30. def get_fake_admin_activated_user(fake, rank=None):
  31. return get_fake_user(fake, rank=rank, requires_activation=User.ACTIVATION_ADMIN)
  32. def get_fake_deleted_user(fake, rank=None):
  33. user = get_fake_user(fake, rank=rank)
  34. user.is_active = False
  35. user.save(update_fields=["is_active"])
  36. return user
  37. def get_fake_username(fake):
  38. possible_usernames = [
  39. fake.first_name(),
  40. fake.last_name(),
  41. fake.name().replace(" ", ""),
  42. fake.user_name(),
  43. get_random_string(random.randint(4, 8)),
  44. ]
  45. return random.choice(possible_usernames)
  46. def get_fake_avatars(email):
  47. email_hash = hashlib.md5(email.lower().encode("utf-8")).hexdigest()
  48. return [
  49. {"size": size, "url": GRAVATAR_URL % (email_hash, size)}
  50. for size in AVATAR_SIZES
  51. ]