__init__.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. fieldnames = {}
  12. for group in self.fields_groups:
  13. for field_path in group['fields']:
  14. field = import_string(field_path)
  15. field._field_path = field_path
  16. if field_path in self.fields_dict:
  17. raise ValueError(
  18. "{} profile field has been specified twice".format(field._field_path)
  19. )
  20. if not getattr(field, 'fieldname', None):
  21. raise ValueError(
  22. "{} profile field has to specify fieldname attribute".format(
  23. field._field_path,
  24. )
  25. )
  26. if field.fieldname in fieldnames:
  27. raise ValueError(
  28. (
  29. '{} profile field defines fieldname "{}" '
  30. 'that is already in use by the {}'
  31. ).format(
  32. field._field_path,
  33. field.fieldname,
  34. fieldnames[field.fieldname],
  35. )
  36. )
  37. fieldnames[field.fieldname] = field_path
  38. self.fields_dict[field_path] = field()
  39. self.is_loaded = True
  40. def update_admin_form(self, form):
  41. if not self.is_loaded:
  42. self.load()
  43. for group in self.fields_groups:
  44. group_dict = {
  45. 'name': group['name'],
  46. 'fields': [],
  47. }
  48. for field_path in group['fields']:
  49. field = self.fields_dict[field_path]
  50. admin_field = field.get_admin_field(form.instance)
  51. if admin_field:
  52. form.fields[field.fieldname] = admin_field
  53. group_dict['fields'].append(field.fieldname)
  54. form._profile_fields_groups.append(group_dict)
  55. def clean_admin_form(self, form, data):
  56. for field in self.fields_dict.values():
  57. data = field.clean_admin_form(form, data) or data
  58. return data
  59. def admin_update_extra(self, user, cleaned_data):
  60. for field in self.fields_dict.values():
  61. field.admin_update_extra(user, cleaned_data)
  62. profilefields = ProfileFields(settings.MISAGO_PROFILE_FIELDS)