__init__.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from django.utils.module_loading import import_string
  2. from django.utils.translation import ugettext as _
  3. from misago.conf import settings
  4. from .basefields import *
  5. from .serializers import serialize_profilefields_data
  6. class ProfileFields(object):
  7. def __init__(self, fields_groups):
  8. self.is_loaded = False
  9. self.fields_groups = fields_groups
  10. self.fields_dict = {}
  11. def load(self):
  12. self.fields_dict = {}
  13. fieldnames = {}
  14. for group in self.fields_groups:
  15. for field_path in group['fields']:
  16. field = import_string(field_path)
  17. field._field_path = field_path
  18. if field_path in self.fields_dict:
  19. raise ValueError(
  20. "{} profile field has been specified twice".format(field._field_path)
  21. )
  22. if not getattr(field, 'fieldname', None):
  23. raise ValueError(
  24. "{} profile field has to specify fieldname attribute".format(
  25. field._field_path,
  26. )
  27. )
  28. if field.fieldname in fieldnames:
  29. raise ValueError(
  30. (
  31. '{} profile field defines fieldname "{}" '
  32. 'that is already in use by the {}'
  33. ).format(
  34. field._field_path,
  35. field.fieldname,
  36. fieldnames[field.fieldname],
  37. )
  38. )
  39. fieldnames[field.fieldname] = field_path
  40. self.fields_dict[field_path] = field()
  41. self.is_loaded = True
  42. def update_admin_form(self, form):
  43. if not self.is_loaded:
  44. self.load()
  45. for group in self.fields_groups:
  46. group_dict = {
  47. 'name': _(group['name']),
  48. 'fields': [],
  49. }
  50. for field_path in group['fields']:
  51. field = self.fields_dict[field_path]
  52. admin_field = field.get_admin_field(form.instance)
  53. if admin_field:
  54. form.fields[field.fieldname] = admin_field
  55. group_dict['fields'].append(field.fieldname)
  56. form._profile_fields_groups.append(group_dict)
  57. def clean_admin_form(self, form, data):
  58. for field in self.fields_dict.values():
  59. data = field.clean_admin_form(form, data) or data
  60. return data
  61. def admin_update_profile_fields(self, user, cleaned_data):
  62. for field in self.fields_dict.values():
  63. field.admin_update_profile_fields(user, cleaned_data)
  64. def admin_search(self, criteria, queryset):
  65. if not self.is_loaded:
  66. self.load()
  67. q_obj = None
  68. for field in self.fields_dict.values():
  69. q = field.admin_search(criteria, queryset)
  70. if q:
  71. if q_obj:
  72. q_obj = q_obj | q
  73. else:
  74. q_obj = q
  75. if q_obj:
  76. return queryset.filter(q_obj)
  77. return queryset
  78. def get_fields(self):
  79. if not self.is_loaded:
  80. self.load()
  81. return self.fields_dict.values()
  82. def get_fields_groups(self):
  83. if not self.is_loaded:
  84. self.load()
  85. groups = []
  86. for group in self.fields_groups:
  87. group_dict = {
  88. 'name': _(group['name']),
  89. 'fields': [],
  90. }
  91. for field_path in group['fields']:
  92. field = self.fields_dict[field_path]
  93. group_dict['fields'].append(field)
  94. if group_dict['fields']:
  95. groups.append(group_dict)
  96. return groups
  97. profilefields = ProfileFields(settings.MISAGO_PROFILE_FIELDS)