Rafał Pitoń 8 лет назад
Родитель
Сommit
30574b1425

+ 1 - 1
misago/users/profilefields/__init__.py

@@ -2,7 +2,7 @@ from django.utils.module_loading import import_string
 
 from misago.conf import settings
 
-from .base import ProfileField, TextProfileField, TextareaProfileField
+from .basefields import *
 
 
 class ProfileFields(object):

+ 0 - 52
misago/users/profilefields/base.py

@@ -1,52 +0,0 @@
-from django import forms
-
-
-class ProfileField(object):
-    """
-    Basic profile field
-    """
-    fieldname = None
-    label = None
-    readonly = False
-
-    def get_label(self, user):
-        if not self.label:
-            raise NotImplementedError(
-                "profile field class has to define label "
-                "attribute or get_label(user) method"
-            )
-        return self.label
-
-    def get_admin_field(self, user):
-        return None
-
-    def clean_admin_form(self, form, data):
-        return data
-
-    def admin_update_extra(self, user, cleaned_data):
-        if self.readonly:
-            return
-        user.extra[self.fieldname] = cleaned_data.get(self.fieldname)
-
-
-class TextProfileField(ProfileField):
-    def get_admin_field(self, user):
-        return forms.CharField(
-            label=self.get_label(user),
-            initial=user.extra.get(self.fieldname),
-            max_length=250,
-            required=False,
-        )
-
-
-class TextareaProfileField(TextProfileField):
-    def get_admin_field(self, user):
-        return forms.CharField(
-            label=self.get_label(user),
-            initial=user.extra.get(self.fieldname),
-            max_length=250,
-            widget=forms.Textarea(
-                attrs={'rows': 4},
-            ),
-            required=False,
-        )

+ 116 - 0
misago/users/profilefields/basefields.py

@@ -0,0 +1,116 @@
+from django import forms
+
+
+__all__ = [
+    'ProfileField',
+    'TextProfileField',
+    'UrlProfileField',
+    'TextareaProfileField',
+    'ChoiceProfileField',
+]
+
+
+class ProfileField(object):
+    """
+    Basic profile field
+    """
+    fieldname = None
+    label = None
+    help_text = None
+    readonly = False
+
+    def get_label(self, user):
+        if not self.label:
+            raise NotImplementedError(
+                "profile field class has to define label "
+                "attribute or get_label(user) method"
+            )
+        return self.label
+
+    def get_help_text(self, user):
+        return self.help_text
+
+    def get_admin_field(self, user):
+        return None
+
+    def clean_admin_form(self, form, data):
+        return data
+
+    def admin_update_extra(self, user, cleaned_data):
+        if self.readonly:
+            return
+
+        user.extra[self.fieldname] = cleaned_data.get(self.fieldname)
+
+
+class ChoiceProfileField(ProfileField):
+    choices = None
+
+    def get_choices(self, user):
+        if not self.choices:
+            raise NotImplementedError(
+                "profile field ChoiceProfileField has to define "
+                "choices attribute or get_choices(user) method"
+            )
+        return self.choices
+
+    def get_admin_field(self, user):
+        return forms.ChoiceField(
+            label=self.get_label(user),
+            help_text=self.get_help_text(user),
+            initial=user.extra.get(self.fieldname),
+            choices=self.get_choices(user),
+            disabled=self.readonly,
+            required=False,
+        )
+
+
+class TextProfileField(ProfileField):
+    def get_admin_field(self, user):
+        return forms.CharField(
+            label=self.get_label(user),
+            help_text=self.get_help_text(user),
+            initial=user.extra.get(self.fieldname),
+            max_length=250,
+            disabled=self.readonly,
+            required=False,
+        )
+
+
+class TextareaProfileField(ProfileField):
+    def get_admin_field(self, user):
+        return forms.CharField(
+            label=self.get_label(user),
+            help_text=self.get_help_text(user),
+            initial=user.extra.get(self.fieldname),
+            max_length=250,
+            widget=forms.Textarea(
+                attrs={'rows': 4},
+            ),
+            disabled=self.readonly,
+            required=False,
+        )
+
+
+class SlugProfileField(ProfileField):
+    def get_admin_field(self, user):
+        return forms.SlugField(
+            label=self.get_label(user),
+            help_text=self.get_help_text(user),
+            initial=user.extra.get(self.fieldname),
+            max_length=250,
+            disabled=self.readonly,
+            required=False,
+        )
+
+
+class UrlProfileField(ProfileField):
+    def get_admin_field(self, user):
+        return forms.URLField(
+            label=self.get_label(user),
+            help_text=self.get_help_text(user),
+            initial=user.extra.get(self.fieldname),
+            max_length=250,
+            disabled=self.readonly,
+            required=False,
+        )

+ 32 - 4
misago/users/profilefields/default.py

@@ -1,18 +1,46 @@
 from django.utils.translation import ugettext_lazy as _
 
-from . import TextProfileField, TextareaProfileField
+from . import basefields
 
 
-class BioField(TextareaProfileField):
+class BioField(basefields.TextareaProfileField):
     fieldname = 'bio'
     label = _("Bio")
 
 
-class FullNameField(TextProfileField):
+class FullNameField(basefields.TextProfileField):
     fieldname = 'fullname'
     label = _("Full name")
 
 
-class LocationField(TextProfileField):
+class LocationField(basefields.TextProfileField):
     fieldname = 'location'
     label = _("Location")
+
+
+class GenderField(basefields.ChoiceProfileField):
+    fieldname = 'gender'
+    label = _("Gender")
+
+    choices = (
+        ('', _('Not specified')),
+        ('secret', _('Not telling')),
+        ('f', _('Female')),
+        ('f', _('Male')),
+    )
+
+
+class WebsiteField(basefields.UrlProfileField):
+    fieldname = 'website'
+    label = _("Website")
+
+
+class SkypeHandleField(basefields.TextProfileField):
+    fieldname = 'skype'
+    label = _("Skype ID")
+
+
+class TwitterHandleField(basefields.SlugProfileField):
+    fieldname = 'twitter'
+    label = _("Twitter handle")
+    help_text = _('Without leading "@" sign.')

+ 0 - 0
misago/users/tests/test_profilefields.py