options.py 3.9 KB

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