diff --git a/CTFd/forms/auth.py b/CTFd/forms/auth.py index 7708b561..5fa6d785 100644 --- a/CTFd/forms/auth.py +++ b/CTFd/forms/auth.py @@ -4,13 +4,30 @@ from wtforms.validators import InputRequired from CTFd.forms import BaseForm from CTFd.forms.fields import SubmitField +from CTFd.models import Fields -class RegistrationForm(BaseForm): - name = StringField("User Name", validators=[InputRequired()]) - email = EmailField("Email", validators=[InputRequired()]) - password = PasswordField("Password", validators=[InputRequired()]) - submit = SubmitField("Submit") +def RegistrationForm(*args, **kwargs): + class _RegistrationForm(BaseForm): + name = StringField("User Name", validators=[InputRequired()]) + email = EmailField("Email", validators=[InputRequired()]) + password = PasswordField("Password", validators=[InputRequired()]) + submit = SubmitField("Submit") + + @property + def extra(self): + fields = [] + new_fields = Fields.query.all() + for field in new_fields: + entry = (field.name, getattr(self, field.name)) + fields.append(entry) + return fields + + new_fields = Fields.query.all() + for field in new_fields: + setattr(_RegistrationForm, field.name, StringField(field.name)) + + return _RegistrationForm(*args, **kwargs) class LoginForm(BaseForm): diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py index af9b08bf..c9675435 100644 --- a/CTFd/models/__init__.py +++ b/CTFd/models/__init__.py @@ -781,3 +781,35 @@ class TeamComments(Comments): class PageComments(Comments): __mapper_args__ = {"polymorphic_identity": "page"} page_id = db.Column(db.Integer, db.ForeignKey("pages.id", ondelete="CASCADE")) + + +class Fields(db.Model): + __tablename__ = "fields" + id = db.Column(db.Integer, primary_key=True) + + # Name of the field. Used as label. + name = db.Column(db.Text) + + # What type of field it is (user or team) + type = db.Column(db.String(80), default="standard") + + # The actual type of field (text, boolean) + field_type = db.Column(db.String(80)) + + # Help text used for the input + description = db.Column(db.Text) + + # Required on form submission + required = db.Column(db.Boolean) + + # show_on_profile + public = db.Column(db.Boolean) + + # User can edit this field in settings. All fields should be edittable by an admin + editable = db.Column(db.Boolean) + + __mapper_args__ = {"polymorphic_identity": "standard", "polymorphic_on": type} + + +class UserFields(Comments): + __mapper_args__ = {"polymorphic_identity": "user"} \ No newline at end of file diff --git a/CTFd/themes/core/templates/register.html b/CTFd/themes/core/templates/register.html index 8fe19ba0..7b51471a 100644 --- a/CTFd/themes/core/templates/register.html +++ b/CTFd/themes/core/templates/register.html @@ -37,6 +37,14 @@ {{ form.password(class="form-control", value=password) }} {{ form.nonce() }} + + {% for k, v in form.extra %} +
+ {{ v.label }} + {{ v(class="form-control") }} +
+ {% endfor %} +
{{ form.submit(class="btn btn-md btn-primary btn-outlined float-right") }}