options.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from django.contrib.auth import get_user_model, logout
  2. from django.contrib.auth.password_validation import validate_password
  3. from django.utils.translation import gettext as _
  4. from rest_framework import serializers
  5. from misago.users.online.tracker import clear_tracking
  6. from misago.users.permissions import allow_delete_own_account
  7. from misago.users.validators import validate_email, validate_username
  8. User = get_user_model()
  9. __all__ = [
  10. "ForumOptionsSerializer",
  11. "EditSignatureSerializer",
  12. "ChangeUsernameSerializer",
  13. "ChangePasswordSerializer",
  14. "ChangeEmailSerializer",
  15. "DeleteOwnAccountSerializer",
  16. ]
  17. class ForumOptionsSerializer(serializers.ModelSerializer):
  18. class Meta:
  19. model = User
  20. fields = [
  21. "is_hiding_presence",
  22. "limits_private_thread_invites_to",
  23. "subscribe_to_started_threads",
  24. "subscribe_to_replied_threads",
  25. ]
  26. extra_kwargs = {
  27. "limits_private_thread_invites_to": {"required": True},
  28. "subscribe_to_started_threads": {"required": True},
  29. "subscribe_to_replied_threads": {"required": True},
  30. }
  31. class EditSignatureSerializer(serializers.ModelSerializer):
  32. class Meta:
  33. model = User
  34. fields = ["signature"]
  35. def validate(self, data):
  36. settings = self.context["settings"]
  37. if len(data.get("signature", "")) > settings.signature_length_max:
  38. raise serializers.ValidationError(_("Signature is too long."))
  39. return data
  40. class ChangeUsernameSerializer(serializers.Serializer):
  41. username = serializers.CharField(max_length=200, required=False, allow_blank=True)
  42. def validate(self, data):
  43. username = data.get("username")
  44. if not username:
  45. raise serializers.ValidationError(_("Enter new username."))
  46. user = self.context["user"]
  47. if username == user.username:
  48. raise serializers.ValidationError(_("New username is same as current one."))
  49. settings = self.context["settings"]
  50. validate_username(settings, username)
  51. return data
  52. def change_username(self, changed_by):
  53. user = self.context["user"]
  54. user.set_username(self.validated_data["username"], changed_by=changed_by)
  55. user.save(update_fields=["username", "slug"])
  56. class ChangePasswordSerializer(serializers.Serializer):
  57. password = serializers.CharField(max_length=200, trim_whitespace=False)
  58. new_password = serializers.CharField(max_length=200, trim_whitespace=False)
  59. def validate_password(self, value):
  60. if not self.context["user"].check_password(value):
  61. raise serializers.ValidationError(_("Entered password is invalid."))
  62. return value
  63. def validate_new_password(self, value):
  64. validate_password(value, user=self.context["user"])
  65. return value
  66. class ChangeEmailSerializer(serializers.Serializer):
  67. password = serializers.CharField(max_length=200, trim_whitespace=False)
  68. new_email = serializers.CharField(max_length=200)
  69. def validate_password(self, value):
  70. if not self.context["user"].check_password(value):
  71. raise serializers.ValidationError(_("Entered password is invalid."))
  72. return value
  73. def validate_new_email(self, value):
  74. if not value:
  75. raise serializers.ValidationError(
  76. _("You have to enter new e-mail address.")
  77. )
  78. if value.lower() == self.context["user"].email.lower():
  79. raise serializers.ValidationError(_("New e-mail is same as current one."))
  80. validate_email(value)
  81. return value
  82. class DeleteOwnAccountSerializer(serializers.Serializer):
  83. password = serializers.CharField(max_length=200, trim_whitespace=False)
  84. def validate_password(self, value):
  85. if not self.context["user"].check_password(value):
  86. raise serializers.ValidationError(_("Entered password is invalid."))
  87. return value
  88. def mark_account_for_deletion(self, request):
  89. """
  90. Deleting user account can be costful, so just mark account for deletion, deactivate it
  91. and sign user out.
  92. """
  93. profile = self.context["user"]
  94. allow_delete_own_account(request.user, profile)
  95. logout(request)
  96. clear_tracking(request)
  97. profile.mark_for_delete()