forms.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. from PIL import Image
  2. from django.core.exceptions import ValidationError
  3. from django.utils.translation import ugettext_lazy as _
  4. import floppyforms as forms
  5. from misago.conf import settings
  6. from misago.forms import Form, YesNoSwitch
  7. from misago.models import Rank, Role, User
  8. from misago.validators import validate_username, validate_password, validate_email
  9. class UserForm(Form):
  10. username = forms.CharField(label=_("Username"),
  11. help_text=_("Username is name under which user is known to other users. Between 3 and 15 characters, only letters and digits are allowed."),
  12. max_length=255)
  13. title = forms.CharField(label=_("User Title"),
  14. help_text=_("To override user title with custom one, enter it here."),
  15. max_length=255, required=False)
  16. rank = forms.ModelChoiceField(label=_("User Rank"),
  17. help_text=_("This user rank."),
  18. queryset=Rank.objects.order_by('order').all(), required=False, empty_label=_('No rank assigned'))
  19. roles = False
  20. email = forms.EmailField(label=_("E-mail Address"),
  21. help_text=_("Member e-mail address."),
  22. max_length=255)
  23. new_password = forms.CharField(label=_("Change User Password"),
  24. help_text=_("If you wish to change user password, enter here new password. Otherwhise leave this field blank."),
  25. max_length=255, required=False, widget=forms.PasswordInput)
  26. avatar_custom = forms.CharField(label=_("Set Non-Standard Avatar"),
  27. help_text=_("You can make this member use special avatar by entering name of image file located in avatars directory here."),
  28. max_length=255, required=False)
  29. avatar_ban = forms.BooleanField(label=_("Lock Member's Avatar"),
  30. 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."),
  31. widget=YesNoSwitch, required=False)
  32. avatar_ban_reason_user = forms.CharField(label=_("User-visible reason for lock"),
  33. 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."),
  34. widget=forms.Textarea, required=False)
  35. avatar_ban_reason_admin = forms.CharField(label=_("Forum Team-visible reason for lock"),
  36. help_text=_("You can leave message to other forum team members exmplaining why this member's avatar has been locked."),
  37. widget=forms.Textarea, required=False)
  38. signature = forms.CharField(label=_("Signature"),
  39. help_text=_("Signature is short message attached at end of member's messages."),
  40. widget=forms.Textarea, required=False)
  41. signature_ban = forms.BooleanField(label=_("Lock Member's Signature"),
  42. help_text=_("If you set this field to yes, this member will not be able to change his signature."),
  43. widget=YesNoSwitch, required=False)
  44. signature_ban_reason_user = forms.CharField(label=_("User-visible reason for lock"),
  45. 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."),
  46. widget=forms.Textarea, required=False)
  47. signature_ban_reason_admin = forms.CharField(label=_("Forum Team-visible reason for lock"),
  48. help_text=_("You can leave message to other forum team members exmplaining why this member's signature has been locked."),
  49. widget=forms.Textarea, required=False)
  50. def __init__(self, user=None, *args, **kwargs):
  51. self.request = kwargs['request']
  52. self.user = user
  53. super(UserForm, self).__init__(*args, **kwargs)
  54. def finalize_form(self):
  55. self.layout = [
  56. [
  57. _("Basic Account Settings"),
  58. [
  59. ('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.")}),
  60. ('title', {'label': _("User Title"), 'help_text': _("To override user title with custom one, enter it here.")}),
  61. ('rank', {'label': _("User Rank"), 'help_text': _("This user rank.")}),
  62. ('roles', {'label': _("User Roles"), 'help_text': _("This user roles. Roles are sets of user permissions")}),
  63. ],
  64. ],
  65. [
  66. _("Sign-in Credentials"),
  67. [
  68. ('email', {'label': _("E-mail Address"), 'help_text': _("Member e-mail address.")}),
  69. ('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}),
  70. ],
  71. ],
  72. [
  73. _("User Avatar"),
  74. [
  75. ('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.")}),
  76. ('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.")}),
  77. ('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.")}),
  78. ('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.")}),
  79. ],
  80. ],
  81. [
  82. _("User Signature"),
  83. [
  84. ('signature', {'label': _("Signature"), 'help_text': _("Signature is short message attached at end of member's messages.")}),
  85. ('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.")}),
  86. ('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.")}),
  87. ('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.")}),
  88. ],
  89. ],
  90. ]
  91. # Roles list
  92. if self.request.user.is_god():
  93. self.add_field('roles', forms.ModelMultipleChoiceField(label=_("User Roles"),
  94. help_text=_("This user roles. Roles are sets of user permissions"),
  95. widget=forms.CheckboxSelectMultiple, queryset=Role.objects.order_by('name').all(), error_messages={'required': _("User must have at least one role assigned.")}))
  96. else:
  97. self.add_field('roles', forms.ModelMultipleChoiceField(label=_("User Roles"),
  98. help_text=_("This user roles. Roles are sets of user permissions"),
  99. widget=forms.CheckboxSelectMultiple, queryset=Role.objects.filter(protected__exact=False).order_by('name').all(), required=False))
  100. # Keep non-gods from editing protected members sign-in credentials
  101. if self.user.is_protected() and not self.request.user.is_god() and self.user.pk != self.request.user.pk:
  102. del self.fields['email']
  103. del self.fields['new_password']
  104. def clean_username(self):
  105. org_username = self.user.username
  106. validate_username(self.cleaned_data['username'])
  107. self.user.set_username(self.cleaned_data['username'])
  108. try:
  109. self.user.full_clean()
  110. except ValidationError as e:
  111. self.user.is_username_valid(e)
  112. self.user.set_username(org_username)
  113. return self.cleaned_data['username']
  114. def clean_email(self):
  115. self.user.set_email(self.cleaned_data['email'])
  116. try:
  117. self.user.full_clean()
  118. except ValidationError as e:
  119. self.user.is_email_valid(e)
  120. return self.cleaned_data['email']
  121. def clean_new_password(self):
  122. if self.cleaned_data['new_password']:
  123. validate_password(self.cleaned_data['new_password'])
  124. self.user.set_password(self.cleaned_data['new_password'])
  125. try:
  126. self.user.full_clean()
  127. except ValidationError as e:
  128. self.user.is_password_valid(e)
  129. return self.cleaned_data['new_password']
  130. return ''
  131. def clean_avatar_custom(self):
  132. if self.cleaned_data['avatar_custom']:
  133. try:
  134. avatar_image = Image.open('%s/avatars/%s' % (settings.STATICFILES_DIRS[0], self.cleaned_data['avatar_custom']))
  135. except IOError:
  136. raise ValidationError(_("Avatar does not exist or is not image file."))
  137. return self.cleaned_data['avatar_custom']
  138. return ''
  139. class NewUserForm(Form):
  140. username = forms.CharField(label=_("Username"),
  141. help_text=_("Username is name under which user is known to other users. Between 3 and 15 characters, only letters and digits are allowed."),
  142. max_length=255)
  143. title = forms.CharField(label=_("User Title"),
  144. help_text=_("To override user title with custom one, enter it here."),
  145. max_length=255, required=False)
  146. rank = forms.ModelChoiceField(label=_("User Rank"),
  147. help_text=_("This user rank."),
  148. queryset=Rank.objects.order_by('order').all(), required=False, empty_label=_('No rank assigned'))
  149. roles = False
  150. email = forms.EmailField(label=_("E-mail Address"),
  151. help_text=_("Member e-mail address."),
  152. max_length=255)
  153. password = forms.CharField(label=_("User Password"),
  154. help_text=_("Member password."),
  155. max_length=255, widget=forms.PasswordInput)
  156. def finalize_form(self):
  157. if self.request.user.is_god():
  158. self.add_field('roles', forms.ModelMultipleChoiceField(label=_("User Roles"),
  159. help_text=_("This user roles. Roles are sets of user permissions"),
  160. widget=forms.CheckboxSelectMultiple, queryset=Role.objects.order_by('name').all(), error_messages={'required': _("User must have at least one role assigned.")}))
  161. else:
  162. self.add_field('roles', forms.ModelMultipleChoiceField(label=_("User Roles"),
  163. help_text=_("This user roles. Roles are sets of user permissions"),
  164. widget=forms.CheckboxSelectMultiple, queryset=Role.objects.filter(protected__exact=False).order_by('name').all(), required=False))
  165. def clean_username(self):
  166. validate_username(self.cleaned_data['username'])
  167. new_user = User.objects.get_blank_user()
  168. new_user.set_username(self.cleaned_data['username'])
  169. try:
  170. new_user.full_clean()
  171. except ValidationError as e:
  172. new_user.is_username_valid(e)
  173. return self.cleaned_data['username']
  174. def clean_email(self):
  175. new_user = User.objects.get_blank_user()
  176. new_user.set_email(self.cleaned_data['email'])
  177. try:
  178. new_user.full_clean()
  179. except ValidationError as e:
  180. new_user.is_email_valid(e)
  181. return self.cleaned_data['email']
  182. def clean_password(self):
  183. new_user = User.objects.get_blank_user()
  184. new_user.set_password(self.cleaned_data['password'])
  185. try:
  186. new_user.full_clean()
  187. except ValidationError as e:
  188. new_user.is_password_valid(e)
  189. validate_password(self.cleaned_data['password'])
  190. return self.cleaned_data['password']
  191. class SearchUsersForm(Form):
  192. username = forms.CharField(label=_("Username"), max_length=255, required=False)
  193. email = forms.CharField(label=_("E-mail Address"), max_length=255, required=False)
  194. activation = forms.TypedMultipleChoiceField(label=_("Activation Requirement"), widget=forms.CheckboxSelectMultiple, choices=((0, _("Already Active")), (1, _("By User")), (2, _("By Administrator"))), coerce=int, required=False)
  195. rank = forms.ModelMultipleChoiceField(label=_("Rank is"), widget=forms.CheckboxSelectMultiple, queryset=Rank.objects.order_by('order').all(), required=False)
  196. role = forms.ModelMultipleChoiceField(label=_("Has Role"), widget=forms.CheckboxSelectMultiple, queryset=Role.objects.order_by('name').all(), required=False)