admin.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. from django.contrib.auth import get_user_model
  2. from django.utils.translation import ugettext_lazy as _
  3. from misago.core import forms
  4. from misago.core.validators import validate_sluggable
  5. from misago.acl.models import Role
  6. from misago.users.models import Rank
  7. from misago.users.validators import (validate_username, validate_email,
  8. validate_password)
  9. class UserBaseForm(forms.ModelForm):
  10. username = forms.CharField(
  11. label=_("Username"))
  12. title = forms.CharField(
  13. label=_("Custom title"),
  14. required=False)
  15. email = forms.EmailField(
  16. label=_("E-mail address"))
  17. def clean_username(self):
  18. data = self.cleaned_data['username']
  19. validate_username(data)
  20. return data
  21. def clean_email(self):
  22. data = self.cleaned_data['email']
  23. validate_email(data)
  24. return data
  25. def clean_new_password(self):
  26. data = self.cleaned_data['new_password']
  27. validate_password(data)
  28. return data
  29. class NewUserForm(UserBaseForm):
  30. new_password = forms.CharField(
  31. label=_("Password"),
  32. widget=forms.PasswordInput)
  33. class Meta:
  34. model = get_user_model()
  35. fields = ['username', 'email']
  36. class EditUserForm(forms.ModelForm):
  37. new_password = forms.CharField(
  38. label=_("Change password to"),
  39. widget=forms.PasswordInput,
  40. required=False)
  41. class Meta:
  42. model = get_user_model()
  43. def UserFormFactory(FormType, instance):
  44. extra_fields = {}
  45. ranks = Rank.objects.order_by('name')
  46. if ranks.exists():
  47. extra_fields['rank'] = forms.ModelChoiceField(
  48. label=_("Rank"),
  49. help_text=_("Ranks are used to group and distinguish users. "
  50. "They are also used to add permissions to groups of "
  51. "users."),
  52. queryset=ranks,
  53. initial=instance.rank,
  54. required=False,
  55. empty_label=_("No rank"))
  56. roles = Role.objects.order_by('name')
  57. if roles.exists():
  58. extra_fields['roles'] = forms.ModelMultipleChoiceField(
  59. label=_("Roles"),
  60. help_text=_("Individual roles of this user."),
  61. queryset=roles,
  62. initial=instance.roles.all() if instance.pk else None,
  63. required=False,
  64. widget=forms.CheckboxSelectMultiple)
  65. return type('UserFormFinal', (FormType,), extra_fields)
  66. def StaffFlagUserFormFactory(FormType, instance, add_staff_field):
  67. FormType = UserFormFactory(FormType, instance)
  68. if add_staff_field:
  69. staff_levels = (
  70. (0, _("No access")),
  71. (1, _("Administrator")),
  72. (2, _("Superadmin")),
  73. )
  74. staff_fields = {
  75. 'staff_level': forms.TypedChoiceField(
  76. label=_("Admin level"),
  77. help_text=_('Only administrators can access admin sites. '
  78. 'In addition to admin site access, superadmins '
  79. 'can also change other members admin levels.'),
  80. coerce=int,
  81. choices=staff_levels,
  82. initial=instance.staff_level),
  83. }
  84. return type('StaffUserForm', (FormType,), staff_fields)
  85. else:
  86. return FormType
  87. class RankForm(forms.ModelForm):
  88. name = forms.CharField(
  89. label=_("Name"),
  90. validators=[validate_sluggable()],
  91. help_text=_('Short and descriptive name of all users with this rank. '
  92. '"The Team" or "Game Masters" are good examples.'))
  93. title = forms.CharField(
  94. label=_("User title"), required=False,
  95. help_text=_('Optional, singular version of rank name displayed by '
  96. 'user names. For example "GM" or "Dev".'))
  97. description = forms.CharField(
  98. label=_("Description"), max_length=2048, required=False,
  99. widget=forms.Textarea(attrs={'rows': 3}),
  100. help_text=_("Optional description explaining function or status of "
  101. "members distincted with this rank."))
  102. roles = forms.ModelMultipleChoiceField(
  103. label=_("User roles"), queryset=Role.objects.order_by('name'),
  104. required=False, widget=forms.CheckboxSelectMultiple,
  105. help_text=_('Rank can give users with it additional roles.'))
  106. css_class = forms.CharField(
  107. label=_("CSS class"), required=False,
  108. help_text=_("Optional css class added to content belonging to this "
  109. "rank owner."))
  110. is_tab = forms.BooleanField(
  111. label=_("Give rank dedicated tab on users list"), required=False,
  112. help_text=_("Selecting this option will make users with this rank "
  113. "easily discoverable by others trough dedicated page on "
  114. "forum users list."))
  115. is_on_index = forms.BooleanField(
  116. label=_("Show users online on forum index"), required=False,
  117. help_text=_("Selecting this option will make forum inform other "
  118. "users of their availability by displaying them on forum "
  119. "index page."))
  120. class Meta:
  121. model = Rank
  122. fields = [
  123. 'name',
  124. 'description',
  125. 'css_class',
  126. 'title',
  127. 'roles',
  128. 'is_tab',
  129. 'is_on_index',
  130. ]
  131. def clean(self):
  132. data = super(RankForm, self).clean()
  133. self.instance.set_name(data.get('name'))
  134. return data