From f88d9dd34094d6e2a7ac37805225e42bcd9222d2 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Sat, 15 Aug 2020 01:57:36 -0400 Subject: [PATCH] Add some more progress --- CTFd/auth.py | 19 +++++++++++++ CTFd/forms/auth.py | 4 +-- CTFd/forms/self.py | 35 ++++++++++++++++++------ CTFd/models/__init__.py | 13 ++++++++- CTFd/themes/core/templates/settings.html | 10 +++++++ 5 files changed, 69 insertions(+), 12 deletions(-) diff --git a/CTFd/auth.py b/CTFd/auth.py index f4ec1da4..455c2fae 100644 --- a/CTFd/auth.py +++ b/CTFd/auth.py @@ -252,6 +252,19 @@ def register(): if valid_affiliation is False: errors.append("Please provide a shorter affiliation") + from CTFd.models import Fields + + fields = {} + for field in Fields.query.all(): + fields[field.id] = field + + entries = {} + for field_id, field in fields.items(): + value = request.form.get(f"field-{field_id}", "").strip() + if field.required is True and (value is None or value == ""): + errors.append("Please enter in all required fields") + entries[field_id] = value + if len(errors) > 0: return render_template( "register.html", @@ -275,6 +288,12 @@ def register(): db.session.commit() db.session.flush() + from CTFd.models import FieldEntries + for field_id, value in entries.items(): + entry = FieldEntries(field_id=field_id, value=value, user_id=user.id) + db.session.add(entry) + db.session.commit() + login_user(user) if config.can_send_mail() and get_config( diff --git a/CTFd/forms/auth.py b/CTFd/forms/auth.py index 5fa6d785..a1348cbf 100644 --- a/CTFd/forms/auth.py +++ b/CTFd/forms/auth.py @@ -19,13 +19,13 @@ def RegistrationForm(*args, **kwargs): fields = [] new_fields = Fields.query.all() for field in new_fields: - entry = (field.name, getattr(self, field.name)) + entry = (field.name, getattr(self, f"field-{field.id}")) fields.append(entry) return fields new_fields = Fields.query.all() for field in new_fields: - setattr(_RegistrationForm, field.name, StringField(field.name)) + setattr(_RegistrationForm, f"field-{field.id}", StringField(field.name)) return _RegistrationForm(*args, **kwargs) diff --git a/CTFd/forms/self.py b/CTFd/forms/self.py index a57b2af2..81d1cc5e 100644 --- a/CTFd/forms/self.py +++ b/CTFd/forms/self.py @@ -4,17 +4,34 @@ from wtforms.fields.html5 import DateField, URLField from CTFd.forms import BaseForm from CTFd.forms.fields import SubmitField from CTFd.utils.countries import SELECT_COUNTRIES_LIST +from CTFd.models import Fields -class SettingsForm(BaseForm): - name = StringField("User Name") - email = StringField("Email") - password = PasswordField("Password") - confirm = PasswordField("Current Password") - affiliation = StringField("Affiliation") - website = URLField("Website") - country = SelectField("Country", choices=SELECT_COUNTRIES_LIST) - submit = SubmitField("Submit") +def SettingsForm(*args, **kwargs): + class _SettingsForm(BaseForm): + name = StringField("User Name") + email = StringField("Email") + password = PasswordField("Password") + confirm = PasswordField("Current Password") + affiliation = StringField("Affiliation") + website = URLField("Website") + country = SelectField("Country", choices=SELECT_COUNTRIES_LIST) + submit = SubmitField("Submit") + + @property + def extra(self): + fields = [] + new_fields = Fields.query.all() + for field in new_fields: + entry = (field.name, getattr(self, f"field-{field.id}")) + fields.append(entry) + return fields + + new_fields = Fields.query.all() + for field in new_fields: + setattr(_SettingsForm, f"field-{field.id}", StringField(field.name)) + + return _SettingsForm(*args, **kwargs) class TokensForm(BaseForm): diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py index c9675435..80f7c66a 100644 --- a/CTFd/models/__init__.py +++ b/CTFd/models/__init__.py @@ -812,4 +812,15 @@ class Fields(db.Model): class UserFields(Comments): - __mapper_args__ = {"polymorphic_identity": "user"} \ No newline at end of file + __mapper_args__ = {"polymorphic_identity": "user"} + + +class FieldEntries(db.Model): + __tablename__ = "field_entries" + id = db.Column(db.Integer, primary_key=True) + value = db.Column(db.Text) + field_id = db.Column(db.Integer, db.ForeignKey("fields.id", ondelete="CASCADE")) + user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE")) + + user = db.relationship("Users", foreign_keys="FieldEntries.user_id") + field = db.relationship("Fields", foreign_keys="FieldEntries.field_id") diff --git a/CTFd/themes/core/templates/settings.html b/CTFd/themes/core/templates/settings.html index 35d33d98..d10a7b4a 100644 --- a/CTFd/themes/core/templates/settings.html +++ b/CTFd/themes/core/templates/settings.html @@ -60,6 +60,16 @@ {{ form.country(class="form-control custom-select", value=country) }} +
+ + {% for k, v in form.extra %} +
+ {{ v.label }} + {{ v(class="form-control") }} +
+ {% endfor %} + +