1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- from django.utils.module_loading import import_string
- from misago.conf import settings
- from .base import ProfileField, TextProfileField
- class ProfileFields(object):
- def __init__(self, fields_groups):
- self.is_loaded = False
- self.fields_groups = fields_groups
- self.fields_dict = {}
- def load(self):
- self.fields_dict = {}
- for group in self.fields_groups:
- for field_path in group['fields']:
- field = import_string(field_path)
- field._field_path = field_path
- if not field.fieldname:
- raise ValueError(
- "{} profile field has to specify fieldname attribute".format(
- field._field_path,
- )
- )
- if field.fieldname in self.fields_dict:
- raise ValueError(
- (
- '{} profile field defines fieldname "{}" '
- 'that is already in use by the {}'
- ).format(
- field._field_path,
- field.fieldname,
- dict_from_map[field.fieldname]._field_path,
- )
- )
- self.fields_dict[field_path] = field
- self.is_loaded = True
- def extend_admin_form(self, form, user):
- class ProfileFieldsForm(form, ProfileFieldsMixin):
- profile_fields_groups = []
- new_form = ProfileFieldsForm
- if not self.is_loaded:
- self.load()
- for group in self.fields_groups:
- group_dict = {
- 'name': group['name'],
- 'fields': [],
- }
- for field_path in group['fields']:
- old_form = new_form
- field = self.fields_dict[field_path]()
- new_form = field.extend_admin_form(old_form, user)
- if new_form != old_form:
- group_dict['fields'].append(field.fieldname)
- if group_dict['fields']:
- new_form.profile_fields_groups.append(group_dict)
- return new_form
- class ProfileFieldsMixin(object):
- def get_profile_fields_groups(self):
- profile_fields_groups = []
- for group in self.profile_fields_groups:
- fields_group = {
- 'name': group['name'],
- 'fields': [],
- }
- for fieldname in group['fields']:
- fields_group['fields'].append(self[fieldname])
- profile_fields_groups.append(fields_group)
- return profile_fields_groups
- profilefields = ProfileFields(settings.MISAGO_PROFILE_FIELDS)
|