basefields.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from django import forms
  2. __all__ = [
  3. 'ProfileField',
  4. 'TextProfileField',
  5. 'UrlProfileField',
  6. 'TextareaProfileField',
  7. 'ChoiceProfileField',
  8. ]
  9. class ProfileField(object):
  10. """
  11. Basic profile field
  12. """
  13. fieldname = None
  14. label = None
  15. help_text = None
  16. readonly = False
  17. def get_label(self, user):
  18. if not self.label:
  19. raise NotImplementedError(
  20. "profile field class has to define label "
  21. "attribute or get_label(user) method"
  22. )
  23. return self.label
  24. def get_help_text(self, user):
  25. return self.help_text
  26. def get_admin_field(self, user):
  27. return None
  28. def clean_admin_form(self, form, data):
  29. return data
  30. def admin_update_extra(self, user, cleaned_data):
  31. if self.readonly:
  32. return
  33. user.extra[self.fieldname] = cleaned_data.get(self.fieldname)
  34. class ChoiceProfileField(ProfileField):
  35. choices = None
  36. def get_choices(self, user):
  37. if not self.choices:
  38. raise NotImplementedError(
  39. "profile field ChoiceProfileField has to define "
  40. "choices attribute or get_choices(user) method"
  41. )
  42. return self.choices
  43. def get_admin_field(self, user):
  44. return forms.ChoiceField(
  45. label=self.get_label(user),
  46. help_text=self.get_help_text(user),
  47. initial=user.extra.get(self.fieldname),
  48. choices=self.get_choices(user),
  49. disabled=self.readonly,
  50. required=False,
  51. )
  52. class TextProfileField(ProfileField):
  53. def get_admin_field(self, user):
  54. return forms.CharField(
  55. label=self.get_label(user),
  56. help_text=self.get_help_text(user),
  57. initial=user.extra.get(self.fieldname),
  58. max_length=250,
  59. disabled=self.readonly,
  60. required=False,
  61. )
  62. class TextareaProfileField(ProfileField):
  63. def get_admin_field(self, user):
  64. return forms.CharField(
  65. label=self.get_label(user),
  66. help_text=self.get_help_text(user),
  67. initial=user.extra.get(self.fieldname),
  68. max_length=250,
  69. widget=forms.Textarea(
  70. attrs={'rows': 4},
  71. ),
  72. disabled=self.readonly,
  73. required=False,
  74. )
  75. class SlugProfileField(ProfileField):
  76. def get_admin_field(self, user):
  77. return forms.SlugField(
  78. label=self.get_label(user),
  79. help_text=self.get_help_text(user),
  80. initial=user.extra.get(self.fieldname),
  81. max_length=250,
  82. disabled=self.readonly,
  83. required=False,
  84. )
  85. class UrlProfileField(ProfileField):
  86. def get_admin_field(self, user):
  87. return forms.URLField(
  88. label=self.get_label(user),
  89. help_text=self.get_help_text(user),
  90. initial=user.extra.get(self.fieldname),
  91. max_length=250,
  92. disabled=self.readonly,
  93. required=False,
  94. )