forms.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from django.conf import settings
  2. from django.core.exceptions import ValidationError
  3. from django.utils.translation import ugettext_lazy as _
  4. from django import forms
  5. from PIL import Image
  6. from misago.acl.models import Role
  7. from misago.users.models import User, Rank
  8. from misago.users.validators import validate_password, validate_email
  9. from misago.forms import Form, YesNoSwitch
  10. class UserForm(Form):
  11. username = forms.CharField(max_length=255)
  12. title = forms.CharField(max_length=255,required=False)
  13. rank = forms.ModelChoiceField(queryset=Rank.objects.order_by('order').all(),required=False,empty_label=_('No rank assigned'))
  14. roles = False
  15. email = forms.EmailField(max_length=255)
  16. new_password = forms.CharField(max_length=255,required=False,widget=forms.PasswordInput)
  17. signature = forms.CharField(widget=forms.Textarea,required=False)
  18. avatar_custom = forms.CharField(max_length=255,required=False)
  19. avatar_ban = forms.BooleanField(widget=YesNoSwitch,required=False)
  20. avatar_ban_reason_user = forms.CharField(widget=forms.Textarea,required=False)
  21. avatar_ban_reason_admin = forms.CharField(widget=forms.Textarea,required=False)
  22. signature_ban = forms.BooleanField(widget=YesNoSwitch,required=False)
  23. signature_ban_reason_user = forms.CharField(widget=forms.Textarea,required=False)
  24. signature_ban_reason_admin = forms.CharField(widget=forms.Textarea,required=False)
  25. layout = [
  26. [
  27. _("Basic Account Settings"),
  28. [
  29. ('username', {'label': _("Username"), 'help_text': _("Username is name under which user is known to other users. Between 3 and 15 characters, only letters and digits are allowed.")}),
  30. ('title', {'label': _("User Title"), 'help_text': _("To override user title with custom one, enter it here.")}),
  31. ('rank', {'label': _("User Rank"), 'help_text': _("This user rank.")}),
  32. ('roles', {'label': _("User Roles"), 'help_text': _("This user roles. Roles are sets of user permissions")}),
  33. ],
  34. ],
  35. [
  36. _("Sign-in Credentials"),
  37. [
  38. ('email', {'label': _("E-mail Address"), 'help_text': _("Username is name under which user is known to other users.")}),
  39. ('new_password', {'label': _("Change User Password"), 'help_text': _("If you wish to change user password, enter here new password. Otherwhise leave this field blank."), 'has_value': False}),
  40. ],
  41. ],
  42. [
  43. _("User Avatar"),
  44. [
  45. ('avatar_custom', {'label': _("Set Non-Standard Avatar"), 'help_text': _("You can make this member use special avatar by entering name of image file located in avatars directory here.")}),
  46. ('avatar_ban', {'label': _("Lock Member's Avatar"), 'help_text': _("If you set this field to yes, this member's avatar will be deleted and replaced with random one selected from _removed gallery and member will not be able to change his avatar.")}),
  47. ('avatar_ban_reason_user', {'label': _("User-visible reason for lock"), 'help_text': _("You can leave message to member explaining why he or she is unable to change his avatar anymore. This message will be displayed to member in his control panel.")}),
  48. ('avatar_ban_reason_admin', {'label': _("Forum Team-visible reason for lock"), 'help_text': _("You can leave message to other forum team members exmplaining why this member's avatar has been locked.")}),
  49. ],
  50. ],
  51. [
  52. _("User Signature"),
  53. [
  54. ('signature', {'label': _("Signature"), 'help_text': _("Signature is short message attached at end of member's messages.")}),
  55. ('signature_ban', {'label': _("Lock Member's Signature"), 'help_text': _("If you set this field to yes, this member will not be able to change his signature.")}),
  56. ('signature_ban_reason_user', {'label': _("User-visible reason for lock"), 'help_text': _("You can leave message to member explaining why he or she is unable to edit his signature anymore. This message will be displayed to member in his control panel.")}),
  57. ('signature_ban_reason_admin', {'label': _("Forum Team-visible reason for lock"), 'help_text': _("You can leave message to other forum team members exmplaining why this member's signature has been locked.")}),
  58. ],
  59. ],
  60. ]
  61. def __init__(self, user=None, *args, **kwargs):
  62. self.request = kwargs['request']
  63. self.user = user
  64. # Roles list
  65. if self.request.user.is_god():
  66. self.base_fields['roles'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=Role.objects.order_by('name').all(),error_messages={'required': _("User must have at least one role assigned.")})
  67. else:
  68. self.base_fields['roles'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=Role.objects.filter(protected__exact=False).order_by('name').all(),required=False)
  69. # Keep non-gods from editing protected members sign-in credentials
  70. if user.is_protected() and not self.request.user.is_god() and user.pk != self.request.user.pk:
  71. del self.base_fields['email']
  72. del self.base_fields['new_password']
  73. del self.layout[1]
  74. super(UserForm, self).__init__(*args, **kwargs)
  75. def clean_username(self):
  76. self.user.set_username(self.cleaned_data['username'])
  77. try:
  78. self.user.full_clean()
  79. except ValidationError as e:
  80. self.user.is_username_valid(e)
  81. return self.cleaned_data['username']
  82. def clean_email(self):
  83. self.user.set_email(self.cleaned_data['email'])
  84. try:
  85. self.user.full_clean()
  86. except ValidationError as e:
  87. self.user.is_email_valid(e)
  88. return self.cleaned_data['email']
  89. def clean_new_password(self):
  90. if self.cleaned_data['new_password']:
  91. self.user.set_password(self.cleaned_data['new_password'])
  92. try:
  93. self.user.full_clean()
  94. except ValidationError as e:
  95. self.user.is_password_valid(e)
  96. validate_password(self.cleaned_data['new_password'])
  97. return self.cleaned_data['new_password']
  98. return ''
  99. def clean_avatar_custom(self):
  100. if self.cleaned_data['avatar_custom']:
  101. try:
  102. avatar_image = Image.open('%s/avatars/%s' % (settings.STATICFILES_DIRS[0], self.cleaned_data['avatar_custom']))
  103. except IOError:
  104. raise ValidationError(_("Avatar does not exist or is not image file."))
  105. return self.cleaned_data['avatar_custom']
  106. return ''
  107. class SearchUsersForm(Form):
  108. username = forms.CharField(max_length=255, required=False)
  109. email = forms.CharField(max_length=255, required=False)
  110. activation = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=(('0', _("Already Active")), ('1', _("By User")), ('2', _("By Administrator")), ('3', _("Sign-In Credentials Change"))), required=False)
  111. rank = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Rank.objects.order_by('order').all(), required=False)
  112. role = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Role.objects.order_by('name').all(), required=False)
  113. layout = (
  114. (
  115. _("Search Users"),
  116. (
  117. ('username', {'label': _("Username"), 'attrs': {'placeholder': _("Username contains...")}}),
  118. ('email', {'label': _("E-mail Address"), 'attrs': {'placeholder': _("E-mail address contains...")}}),
  119. ('activation', {'label': _("Activation Requirement")}),
  120. ('rank', {'label': _("Rank is")}),
  121. ('role', {'label': _("Has Role")}),
  122. ),
  123. ),
  124. )