options.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from rest_framework import serializers
  2. from django.contrib.auth import get_user_model
  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.validators import validate_email, validate_username
  7. UserModel = get_user_model()
  8. __all__ = [
  9. 'ForumOptionsSerializer',
  10. 'EditSignatureSerializer',
  11. 'ChangeUsernameSerializer',
  12. 'ChangePasswordSerializer',
  13. 'ChangeEmailSerializer',
  14. ]
  15. class ForumOptionsSerializer(serializers.ModelSerializer):
  16. class Meta:
  17. model = UserModel
  18. fields = [
  19. 'is_hiding_presence',
  20. 'limits_private_thread_invites_to',
  21. 'subscribe_to_started_threads',
  22. 'subscribe_to_replied_threads'
  23. ]
  24. extra_kwargs = {
  25. 'limits_private_thread_invites_to': {
  26. 'required': True
  27. },
  28. 'subscribe_to_started_threads': {
  29. 'required': True
  30. },
  31. 'subscribe_to_replied_threads': {
  32. 'required': True
  33. },
  34. }
  35. class EditSignatureSerializer(serializers.ModelSerializer):
  36. class Meta:
  37. model = UserModel
  38. fields = ['signature']
  39. def validate(self, data):
  40. if len(data.get('signature', '')) > settings.signature_length_max:
  41. raise serializers.ValidationError(_("Signature is too long."))
  42. return data
  43. class ChangeUsernameSerializer(serializers.Serializer):
  44. username = serializers.CharField(max_length=200, required=False, allow_blank=True)
  45. def validate(self, data):
  46. username = data.get('username')
  47. if not username:
  48. raise serializers.ValidationError(_("Enter new username."))
  49. if username == self.context['user'].username:
  50. raise serializers.ValidationError(
  51. _("New username is same as current one."))
  52. validate_username(username)
  53. return data
  54. def change_username(self, changed_by):
  55. self.context['user'].set_username(
  56. self.validated_data['username'], changed_by=changed_by)
  57. self.context['user'].save(update_fields=['username', 'slug'])
  58. class ChangePasswordSerializer(serializers.Serializer):
  59. password = serializers.CharField(max_length=200)
  60. new_password = serializers.CharField(max_length=200)
  61. def validate_password(self, value):
  62. if not self.context['user'].check_password(value):
  63. raise serializers.ValidationError(_("Entered password is invalid."))
  64. return value
  65. def validate_new_password(self, value):
  66. validate_password(value, user=self.context['user'])
  67. return value
  68. class ChangeEmailSerializer(serializers.Serializer):
  69. password = serializers.CharField(max_length=200)
  70. new_email = serializers.CharField(max_length=200)
  71. def validate_password(self, value):
  72. if not self.context['user'].check_password(value):
  73. raise serializers.ValidationError(_("Entered password is invalid."))
  74. return value
  75. def validate_new_email(self, value):
  76. if not value:
  77. raise serializers.ValidationError(_("You have to enter new e-mail address."))
  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