__init__.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.utils.module_loading import import_string
  2. from misago.conf import settings
  3. from .basefields import *
  4. class ProfileFields(object):
  5. def __init__(self, fields_groups):
  6. self.is_loaded = False
  7. self.fields_groups = fields_groups
  8. self.fields_dict = {}
  9. def load(self):
  10. self.fields_dict = {}
  11. for group in self.fields_groups:
  12. for field_path in group['fields']:
  13. field = import_string(field_path)
  14. field._field_path = field_path
  15. if not field.fieldname:
  16. raise ValueError(
  17. "{} profile field has to specify fieldname attribute".format(
  18. field._field_path,
  19. )
  20. )
  21. if field.fieldname in self.fields_dict:
  22. raise ValueError(
  23. (
  24. '{} profile field defines fieldname "{}" '
  25. 'that is already in use by the {}'
  26. ).format(
  27. field._field_path,
  28. field.fieldname,
  29. dict_from_map[field.fieldname]._field_path,
  30. )
  31. )
  32. self.fields_dict[field_path] = field()
  33. self.is_loaded = True
  34. def update_admin_form(self, form):
  35. if not self.is_loaded:
  36. self.load()
  37. for group in self.fields_groups:
  38. group_dict = {
  39. 'name': group['name'],
  40. 'fields': [],
  41. }
  42. for field_path in group['fields']:
  43. field = self.fields_dict[field_path]
  44. admin_field = field.get_admin_field(form.instance)
  45. if admin_field:
  46. form.fields[field.fieldname] = admin_field
  47. group_dict['fields'].append(field.fieldname)
  48. form._profile_fields_groups.append(group_dict)
  49. def clean_admin_form(self, form, data):
  50. for field in self.fields_dict.values():
  51. data = field.clean_admin_form(form, data) or data
  52. return data
  53. def admin_update_extra(self, user, cleaned_data):
  54. for field in self.fields_dict.values():
  55. field.admin_update_extra(user, cleaned_data)
  56. profilefields = ProfileFields(settings.MISAGO_PROFILE_FIELDS)