user.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from django.contrib.auth import get_user_model
  2. from django.db import IntegrityError, transaction
  3. from django.utils import timezone
  4. from django.utils.translation import gettext_lazy as _
  5. from ..users.setupnewuser import setup_new_user
  6. from .exceptions import OAuth2UserDataValidationError, OAuth2UserIdNotProvidedError
  7. from .models import Subject
  8. from .validation import validate_user_data
  9. User = get_user_model()
  10. def get_user_from_data(request, user_data):
  11. if not user_data["id"]:
  12. raise OAuth2UserIdNotProvidedError()
  13. user = get_user_by_subject(user_data["id"])
  14. if not user and user_data["email"]:
  15. user = get_user_by_email(user_data["id"], user_data["email"])
  16. created = not bool(user)
  17. cleaned_data = validate_user_data(request, user, user_data)
  18. try:
  19. with transaction.atomic():
  20. if not user:
  21. user = create_new_user(request, cleaned_data)
  22. else:
  23. update_existing_user(user, cleaned_data)
  24. except IntegrityError as error:
  25. raise_validation_error_from_integrity_error(error)
  26. return user, created
  27. def get_user_by_subject(user_id):
  28. try:
  29. subject = Subject.objects.select_related("user", "user__ban_cache").get(
  30. sub=user_id
  31. )
  32. subject.last_used_on = timezone.now()
  33. subject.save(update_fields=["last_used_on"])
  34. return subject.user
  35. except Subject.DoesNotExist:
  36. return None
  37. def get_user_by_email(user_id, user_email):
  38. try:
  39. user = User.objects.get_by_email(user_email)
  40. Subject.objects.create(sub=user_id, user=user)
  41. except User.DoesNotExist:
  42. return None
  43. def create_new_user(request, user_data):
  44. activation_kwargs = {}
  45. if request.settings.account_activation == "admin":
  46. activation_kwargs = {"requires_activation": User.ACTIVATION_ADMIN}
  47. user = User.objects.create_user(
  48. user_data["name"],
  49. user_data["email"],
  50. joined_from_ip=request.user_ip,
  51. **activation_kwargs,
  52. )
  53. setup_new_user(request.settings, user, avatar_url=user_data["avatar"])
  54. Subject.objects.create(sub=user_data["id"], user=user)
  55. return user
  56. def update_existing_user(user, user_data):
  57. save_changes = False
  58. if user.username != user_data["name"]:
  59. user.set_username(user_data["name"])
  60. save_changes = True
  61. if user.email != user_data["email"]:
  62. user.set_email(user_data["email"])
  63. save_changes = True
  64. if save_changes:
  65. user.save()
  66. def raise_validation_error_from_integrity_error(error):
  67. error_str = str(error)
  68. if "misago_users_user_email_hash_key" in error_str:
  69. raise OAuth2UserDataValidationError(
  70. error_list=[_("This e-mail address is not available.")]
  71. )
  72. if "misago_users_user_slug_key" in error_str:
  73. raise OAuth2UserDataValidationError(
  74. error_list=[_("This username is not available.")]
  75. )