Add mostly untested way to update field values via API

This commit is contained in:
Kevin Chung
2020-08-15 03:35:16 -04:00
parent f88d9dd340
commit b0f85aef26
4 changed files with 28 additions and 2 deletions

View File

@@ -305,6 +305,13 @@ class UserPrivate(Resource):
if response.errors: if response.errors:
return {"success": False, "errors": response.errors}, 400 return {"success": False, "errors": response.errors}, 400
from CTFd.models import FieldEntries
fields = data.get("fields")
for k, v in fields.items():
field_id = int(k.split('-')[1])
e = FieldEntries.query.filter_by(field_id=field_id, user_id=session["id"]).first()
e.value = v
db.session.commit() db.session.commit()
# Update user's session for the new session hash # Update user's session for the new session hash

View File

@@ -1,10 +1,11 @@
from flask import session
from wtforms import PasswordField, SelectField, StringField from wtforms import PasswordField, SelectField, StringField
from wtforms.fields.html5 import DateField, URLField from wtforms.fields.html5 import DateField, URLField
from CTFd.forms import BaseForm from CTFd.forms import BaseForm
from CTFd.forms.fields import SubmitField from CTFd.forms.fields import SubmitField
from CTFd.utils.countries import SELECT_COUNTRIES_LIST from CTFd.utils.countries import SELECT_COUNTRIES_LIST
from CTFd.models import Fields from CTFd.models import Fields, FieldEntries
def SettingsForm(*args, **kwargs): def SettingsForm(*args, **kwargs):
@@ -22,8 +23,15 @@ def SettingsForm(*args, **kwargs):
def extra(self): def extra(self):
fields = [] fields = []
new_fields = Fields.query.all() new_fields = Fields.query.all()
user_fields = {}
for f in FieldEntries.query.filter_by(user_id=session["id"]).all():
user_fields[f.field_id] = f.value
for field in new_fields: for field in new_fields:
entry = (field.name, getattr(self, f"field-{field.id}")) form_field = getattr(self, f"field-{field.id}")
form_field.data = user_fields.get(field.id, "")
entry = (field.name, form_field)
fields.append(entry) fields.append(entry)
return fields return fields

View File

@@ -276,6 +276,8 @@ class Users(db.Model):
# Relationship for Teams # Relationship for Teams
team_id = db.Column(db.Integer, db.ForeignKey("teams.id")) team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
fields = db.relationship("FieldEntries", foreign_keys="FieldEntries.user_id", lazy="select")
created = db.Column(db.DateTime, default=datetime.datetime.utcnow) created = db.Column(db.DateTime, default=datetime.datetime.utcnow)
__mapper_args__ = {"polymorphic_identity": "user", "polymorphic_on": type} __mapper_args__ = {"polymorphic_identity": "user", "polymorphic_on": type}

View File

@@ -24,6 +24,15 @@ function profileUpdate(event) {
const $form = $(this); const $form = $(this);
let params = $form.serializeJSON(true); let params = $form.serializeJSON(true);
params.fields = {}
for (const property in params) {
if (property.startsWith("field-")) {
params.fields[property] = params[property];
delete params[property];
}
}
CTFd.api.patch_user_private({}, params).then(response => { CTFd.api.patch_user_private({}, params).then(response => {
if (response.success) { if (response.success) {
$("#results").html(success_template); $("#results").html(success_template);