diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py index 15389edf..29e732cc 100644 --- a/CTFd/models/__init__.py +++ b/CTFd/models/__init__.py @@ -276,7 +276,7 @@ class Users(db.Model): # Relationship for Teams team_id = db.Column(db.Integer, db.ForeignKey("teams.id")) - fields = db.relationship( + field_entries = db.relationship( "FieldEntries", foreign_keys="FieldEntries.user_id", lazy="joined" ) @@ -313,6 +313,10 @@ class Users(db.Model): elif user_mode == "users": return self + @property + def fields(self): + return self.get_fields(admin=False) + @property def solves(self): return self.get_solves(admin=False) @@ -338,6 +342,12 @@ class Users(db.Model): else: return None + def get_fields(self, admin=False): + if admin: + return self.field_entries + + return [entry for entry in self.field_entries if entry.field.public] + def get_solves(self, admin=False): from CTFd.utils import get_config @@ -828,3 +838,11 @@ class FieldEntries(db.Model): user = db.relationship("Users", foreign_keys="FieldEntries.user_id") field = db.relationship("Fields", foreign_keys="FieldEntries.field_id") + + @hybrid_property + def name(self): + return self.field.name + + @hybrid_property + def description(self): + return self.field.description diff --git a/CTFd/schemas/users.py b/CTFd/schemas/users.py index f6a88568..624dbd55 100644 --- a/CTFd/schemas/users.py +++ b/CTFd/schemas/users.py @@ -51,7 +51,7 @@ class UserSchema(ma.ModelSchema): ) country = field_for(Users, "country", validate=[validate_country_code]) password = field_for(Users, "password") - fields = Nested(FieldEntriesSchema, partial=True, many=True) + fields = Nested(FieldEntriesSchema, partial=True, many=True, attribute="field_entries") @pre_load def validate_name(self, data): diff --git a/CTFd/themes/admin/templates/users/user.html b/CTFd/themes/admin/templates/users/user.html index c615f13e..9458190a 100644 --- a/CTFd/themes/admin/templates/users/user.html +++ b/CTFd/themes/admin/templates/users/user.html @@ -132,6 +132,12 @@ {% endif %} + {% for field in user.get_fields(true) %} +

+ {{ field.name }}: {{ field.value }} +

+ {% endfor %} +

{% if place %} {{ place }} diff --git a/CTFd/themes/core/templates/users/private.html b/CTFd/themes/core/templates/users/private.html index 089c4a7e..d265a3f6 100644 --- a/CTFd/themes/core/templates/users/private.html +++ b/CTFd/themes/core/templates/users/private.html @@ -39,6 +39,12 @@

{% endif %} + {% for field in user.fields %} +

+ {{ field.name }}: {{ field.value }} +

+ {% endfor %} +

{% if account.place %} diff --git a/CTFd/themes/core/templates/users/public.html b/CTFd/themes/core/templates/users/public.html index 8e9439c6..92dad5f3 100644 --- a/CTFd/themes/core/templates/users/public.html +++ b/CTFd/themes/core/templates/users/public.html @@ -39,6 +39,12 @@

{% endif %} + {% for field in user.get_fields() %} +

+ {{ field.name }}: {{ field.value }} +

+ {% endfor %} +

{% if account.place %}