diff --git a/CTFd/forms/auth.py b/CTFd/forms/auth.py index ead98d5d..308953cf 100644 --- a/CTFd/forms/auth.py +++ b/CTFd/forms/auth.py @@ -3,6 +3,7 @@ from wtforms.fields.html5 import EmailField from wtforms.validators import InputRequired from CTFd.forms import BaseForm +from CTFd.forms.users import attach_custom_user_fields from CTFd.forms.fields import SubmitField from CTFd.models import UserFields @@ -23,18 +24,7 @@ def RegistrationForm(*args, **kwargs): fields.append(entry) return fields - new_fields = UserFields.query.all() - for field in new_fields: - validators = [] - if field.required: - validators.append(InputRequired()) - setattr( - _RegistrationForm, - f"fields[{field.id}]", - StringField( - field.name, description=field.description, validators=validators - ), - ) + attach_custom_user_fields(_RegistrationForm) return _RegistrationForm(*args, **kwargs) diff --git a/CTFd/forms/self.py b/CTFd/forms/self.py index b6d2f405..a817d6c3 100644 --- a/CTFd/forms/self.py +++ b/CTFd/forms/self.py @@ -3,6 +3,7 @@ from wtforms import PasswordField, SelectField, StringField from wtforms.fields.html5 import DateField, URLField from CTFd.forms import BaseForm +from CTFd.forms.users import attach_custom_user_fields from CTFd.forms.fields import SubmitField from CTFd.models import FieldEntries, UserFields from CTFd.utils.countries import SELECT_COUNTRIES_LIST @@ -33,26 +34,14 @@ def SettingsForm(*args, **kwargs): initial = user_fields.get(field.id, "") form_field.data = initial if form_field.render_kw: - form_field.render_kw["initial"] = initial + form_field.render_kw["data-initial"] = initial else: form_field.render_kw = {"data-initial": initial} entry = (field.name, form_field) fields.append(entry) return fields - new_fields = UserFields.query.filter_by(editable=True).all() - for field in new_fields: - validators = [] - if field.required: - validators.append(InputRequired()) - - setattr( - _SettingsForm, - f"fields[{field.id}]", - StringField( - field.name, description=field.description, validators=validators - ), - ) + attach_custom_user_fields(_SettingsForm, editable=True) return _SettingsForm(*args, **kwargs) diff --git a/CTFd/forms/users.py b/CTFd/forms/users.py index a88f6ca8..50899e95 100644 --- a/CTFd/forms/users.py +++ b/CTFd/forms/users.py @@ -7,6 +7,25 @@ from CTFd.forms.fields import SubmitField from CTFd.models import FieldEntries, UserFields from CTFd.utils.countries import SELECT_COUNTRIES_LIST +def build_custom_user_fields(): + pass + + +def attach_custom_user_fields(form_cls, **kwargs): + new_fields = UserFields.filter_by(**kwargs).query.all() + for field in new_fields: + validators = [] + if field.required: + validators.append(InputRequired()) + + setattr( + form_cls, + f"fields[{field.id}]", + StringField( + field.name, description=field.description, validators=validators + ), + ) + class UserSearchForm(BaseForm): field = SelectField( @@ -89,19 +108,7 @@ def UserEditForm(*args, **kwargs): if obj: self.obj = obj - new_fields = UserFields.query.all() - for field in new_fields: - validators = [] - if field.required: - validators.append(InputRequired()) - - setattr( - _UserEditForm, - f"fields[{field.id}]", - StringField( - field.name, description=field.description, validators=validators - ), - ) + attach_custom_user_fields(_UserEditForm) return _UserEditForm(*args, **kwargs) @@ -121,18 +128,6 @@ def UserCreateForm(*args, **kwargs): fields.append(entry) return fields - new_fields = UserFields.query.all() - for field in new_fields: - validators = [] - if field.required: - validators.append(InputRequired()) - - setattr( - _UserCreateForm, - f"fields[{field.id}]", - StringField( - field.name, description=field.description, validators=validators - ), - ) + attach_custom_user_fields(_UserCreateForm) return _UserCreateForm(*args, **kwargs)