base.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from django import forms
  2. class ProfileField(object):
  3. """
  4. Basic profile field
  5. """
  6. fieldname = None
  7. label = None
  8. def get_label(self, user):
  9. if not self.label:
  10. raise NotImplementedError(
  11. "profile field class has to define label "
  12. "attribute or get_label(user) method"
  13. )
  14. return self.label
  15. def extend_admin_form(self, form, user):
  16. return form
  17. class TextProfileField(ProfileField):
  18. def extend_admin_form(self, form, user):
  19. fieldname = self.fieldname
  20. return type('TextProfileFieldForm', (form,), {
  21. fieldname: self.get_admin_form_field(
  22. user, fieldname, self.get_label(user)),
  23. 'clean_{}'.format(fieldname): self.get_admin_form_field_clean(
  24. user, fieldname),
  25. })
  26. def get_admin_form_field(self, user, fieldname, label):
  27. return forms.CharField(
  28. label=label,
  29. initial=user.extra.get(fieldname),
  30. max_length=250,
  31. required=False,
  32. )
  33. def get_admin_form_field_clean(self, user, fieldname):
  34. def clean_field(self):
  35. data = self.cleaned_data.get(fieldname)
  36. user.extra[fieldname] = data
  37. return data
  38. return clean_field
  39. class TextareaProfileField(TextProfileField):
  40. pass