__init__.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from django.utils.module_loading import import_string
  2. from misago.conf import settings
  3. from .base import ProfileField, TextProfileField
  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 extend_admin_form(self, form, user):
  35. class ProfileFieldsForm(form, ProfileFieldsMixin):
  36. profile_fields_groups = []
  37. new_form = ProfileFieldsForm
  38. if not self.is_loaded:
  39. self.load()
  40. for group in self.fields_groups:
  41. group_dict = {
  42. 'name': group['name'],
  43. 'fields': [],
  44. }
  45. for field_path in group['fields']:
  46. old_form = new_form
  47. field = self.fields_dict[field_path]()
  48. new_form = field.extend_admin_form(old_form, user)
  49. if new_form != old_form:
  50. group_dict['fields'].append(field.fieldname)
  51. if group_dict['fields']:
  52. new_form.profile_fields_groups.append(group_dict)
  53. return new_form
  54. class ProfileFieldsMixin(object):
  55. def get_profile_fields_groups(self):
  56. profile_fields_groups = []
  57. for group in self.profile_fields_groups:
  58. fields_group = {
  59. 'name': group['name'],
  60. 'fields': [],
  61. }
  62. for fieldname in group['fields']:
  63. fields_group['fields'].append(self[fieldname])
  64. profile_fields_groups.append(fields_group)
  65. return profile_fields_groups
  66. profilefields = ProfileFields(settings.MISAGO_PROFILE_FIELDS)