forms.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django import forms
  4. from django.contrib.auth.forms import PasswordResetForm, ReadOnlyPasswordHashField
  5. from django.forms.utils import ErrorList
  6. from coin.members.models import Member
  7. class MemberCreationForm(forms.ModelForm):
  8. """
  9. This form was inspired from django.contrib.auth.forms.UserCreationForm
  10. and adapted to coin specificities
  11. """
  12. username = forms.RegexField(required=False,
  13. label="Nom d'utilisateur", max_length=30, regex=r"^[\w.@+-]+$",
  14. help_text="Laisser vide pour le générer automatiquement à partir du "
  15. "nom d'usage, nom et prénom, ou nom de l'organisme")
  16. password = forms.CharField(
  17. required=False, label='Mot de passe', widget=forms.PasswordInput,
  18. help_text="Laisser vide et envoyer un mail de bienvenue pour que "
  19. "l'utilisateur choisisse son mot de passe lui-même")
  20. class Meta:
  21. model = Member
  22. fields = '__all__'
  23. def save(self, commit=True):
  24. """
  25. Save member, then set his password
  26. """
  27. member = super(MemberCreationForm, self).save(commit=False)
  28. member.set_password(self.cleaned_data["password"])
  29. if commit:
  30. member.member()
  31. return member
  32. class AbstractMemberChangeForm(forms.ModelForm):
  33. """
  34. This form was inspired from django.contrib.auth.forms.UserChangeForm
  35. and adapted to coin specificities
  36. """
  37. class Meta:
  38. model = Member
  39. fields = '__all__'
  40. def __init__(self, *args, **kwargs):
  41. super(AbstractMemberChangeForm, self).__init__(*args, **kwargs)
  42. f = self.fields.get('user_permissions', None)
  43. if f is not None:
  44. f.queryset = f.queryset.select_related('content_type')
  45. def clean_password(self):
  46. # Regardless of what the user provides, return the initial value.
  47. # This is done here, rather than on the field, because the
  48. # field does not have access to the initial value
  49. return self.initial["password"]
  50. def clean_username(self):
  51. # idem clean_password
  52. return self.initial["username"]
  53. class AdminMemberChangeForm(AbstractMemberChangeForm):
  54. password = ReadOnlyPasswordHashField()
  55. class SpanError(ErrorList):
  56. def __unicode__(self):
  57. return self.as_spans()
  58. def __str__(self):
  59. return self.as_spans()
  60. def as_spans(self):
  61. if not self: return ''
  62. return ''.join(['<span class="error">%s</span>' % e for e in self])
  63. class PersonMemberChangeForm(AbstractMemberChangeForm):
  64. """
  65. Form use to allow natural person to change their info
  66. """
  67. class Meta:
  68. model = Member
  69. fields = ['first_name', 'last_name', 'email', 'nickname',
  70. 'home_phone_number', 'mobile_phone_number',
  71. 'address', 'postal_code', 'city', 'country']
  72. def __init__(self, *args, **kwargs):
  73. super(PersonMemberChangeForm, self).__init__(*args, **kwargs)
  74. self.error_class = SpanError
  75. for fieldname in self.fields:
  76. self.fields[fieldname].help_text = None
  77. class OrganizationMemberChangeForm(AbstractMemberChangeForm):
  78. """
  79. Form use to allow organization to change their info
  80. """
  81. class Meta:
  82. model = Member
  83. fields = ['organization_name', 'email', 'nickname',
  84. 'home_phone_number', 'mobile_phone_number',
  85. 'address', 'postal_code', 'city', 'country']
  86. def __init__(self, *args, **kwargs):
  87. super(OrganizationChangeForm, self).__init__(*args, **kwargs)
  88. self.error_class = SpanError
  89. for fieldname in self.fields:
  90. self.fields[fieldname].help_text = None
  91. class MemberPasswordResetForm(PasswordResetForm):
  92. pass