__init__.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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_profile_fields(self, user, cleaned_data):
  60. for field in self.fields_dict.values():
  61. field.admin_update_profile_fields(user, cleaned_data)
  62. def admin_search(self, criteria, queryset):
  63. if not self.is_loaded:
  64. self.load()
  65. q_obj = None
  66. for field in self.fields_dict.values():
  67. q = field.admin_search(criteria, queryset)
  68. if q:
  69. if q_obj:
  70. q_obj = q_obj | q
  71. else:
  72. q_obj = q
  73. if q_obj:
  74. return queryset.filter(q_obj)
  75. return queryset
  76. profilefields = ProfileFields(settings.MISAGO_PROFILE_FIELDS)