diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index e3bc20fb7..4d36cba0c 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -327,6 +327,7 @@ class CompetitionCreateSerializer(CompetitionSerializer): class CompetitionDetailSerializer(serializers.ModelSerializer): created_by = serializers.CharField(source='created_by.username', read_only=True) + owner_display_name = serializers.SerializerMethodField() logo_icon = NamedBase64ImageField(allow_null=True) pages = PageSerializer(many=True) phases = PhaseDetailSerializer(many=True) @@ -346,6 +347,7 @@ class Meta: 'published', 'secret_key', 'created_by', + 'owner_display_name', 'created_when', 'logo', 'logo_icon', @@ -371,7 +373,7 @@ class Meta: 'reward', 'contact_email', 'report', - 'whitelist_emails' + 'whitelist_emails', ) def get_leaderboards(self, instance): @@ -389,9 +391,14 @@ def get_whitelist_emails(self, instance): whitelist_emails_list = [entry.email for entry in whitelist_emails_query] return whitelist_emails_list + def get_owner_display_name(self, obj): + # Get the user's display name if not None, otherwise return username + return obj.created_by.display_name if obj.created_by.display_name else obj.created_by.username + class CompetitionSerializerSimple(serializers.ModelSerializer): - created_by = serializers.CharField(source='created_by.username') + created_by = serializers.CharField(source='created_by.username', read_only=True) + owner_display_name = serializers.SerializerMethodField() participant_count = serializers.IntegerField(read_only=True) class Meta: @@ -400,6 +407,7 @@ class Meta: 'id', 'title', 'created_by', + 'owner_display_name', 'created_when', 'published', 'participant_count', @@ -411,6 +419,14 @@ class Meta: 'report', ) + def get_created_by(self, obj): + # Get the user's display name if not None, otherwise return username + return obj.created_by.display_name if obj.created_by.display_name else obj.created_by.username + + def get_owner_display_name(self, obj): + # Get the user's display name if not None, otherwise return username + return obj.created_by.display_name if obj.created_by.display_name else obj.created_by.username + PageSerializer.competition = CompetitionSerializer(many=True, source='competition') diff --git a/src/apps/api/serializers/datasets.py b/src/apps/api/serializers/datasets.py index 25e069afc..7543afe54 100644 --- a/src/apps/api/serializers/datasets.py +++ b/src/apps/api/serializers/datasets.py @@ -74,7 +74,8 @@ class Meta: class DataDetailSerializer(serializers.ModelSerializer): - created_by = serializers.CharField(source='created_by.username') + created_by = serializers.CharField(source='created_by.username', read_only=True) + owner_display_name = serializers.SerializerMethodField() competition = serializers.SerializerMethodField() value = serializers.CharField(source='key', required=False) @@ -83,6 +84,7 @@ class Meta: fields = ( 'id', 'created_by', + 'owner_display_name', 'created_when', 'name', 'type', @@ -108,6 +110,9 @@ def get_competition(self, obj): } return None + def get_owner_display_name(self, instance): + return instance.created_by.display_name if instance.created_by.display_name else instance.created_by.username + class DataGroupSerializer(serializers.ModelSerializer): class Meta: diff --git a/src/apps/api/serializers/tasks.py b/src/apps/api/serializers/tasks.py index 1526a1980..62080890d 100644 --- a/src/apps/api/serializers/tasks.py +++ b/src/apps/api/serializers/tasks.py @@ -90,7 +90,8 @@ def get_validated(self, instance): class TaskDetailSerializer(WritableNestedModelSerializer): - created_by = serializers.CharField(source='created_by.username', read_only=True, required=False) + created_by = serializers.CharField(source='created_by.username', read_only=True) + owner_display_name = serializers.SerializerMethodField() input_data = DataSimpleSerializer(read_only=True) ingestion_program = DataSimpleSerializer(read_only=True) reference_data = DataSimpleSerializer(read_only=True) @@ -107,6 +108,7 @@ class Meta: 'description', 'key', 'created_by', + 'owner_display_name', 'created_when', 'is_public', 'validated', @@ -126,12 +128,18 @@ def get_validated(self, task): def get_shared_with(self, instance): return self.context['shared_with'][instance.pk] + def get_owner_display_name(self, instance): + # Get the user's display name if not None, otherwise return username + return instance.created_by.display_name if instance.created_by.display_name else instance.created_by.username + class TaskListSerializer(serializers.ModelSerializer): solutions = SolutionListSerializer(many=True, required=False, read_only=True) value = serializers.CharField(source='key', required=False) competitions = serializers.SerializerMethodField() shared_with = serializers.SerializerMethodField() + created_by = serializers.CharField(source='created_by.username', read_only=True) + owner_display_name = serializers.SerializerMethodField() class Meta: model = Task @@ -139,6 +147,7 @@ class Meta: 'id', 'created_when', 'created_by', + 'owner_display_name', 'key', 'name', 'solutions', @@ -160,6 +169,10 @@ def get_competitions(self, instance): def get_shared_with(self, instance): return self.context['shared_with'][instance.pk] + def get_owner_display_name(self, instance): + # Get the user's display name if not None, otherwise return username + return instance.created_by.display_name if instance.created_by.display_name else instance.created_by.username + class PhaseTaskInstanceSerializer(serializers.HyperlinkedModelSerializer): task = serializers.SlugRelatedField(queryset=Task.objects.all(), required=True, allow_null=False, slug_field='key', diff --git a/src/apps/pages/views.py b/src/apps/pages/views.py index c3ade0ae4..fad6d33cd 100644 --- a/src/apps/pages/views.py +++ b/src/apps/pages/views.py @@ -100,6 +100,9 @@ def get_context_data(self, *args, **kwargs): queue_name = "*" if submission.queue is None else submission.queue.name submission.competition_queue = queue_name + # Add submission owner display name + submission.owner_display_name = submission.owner.display_name if submission.owner.display_name else submission.owner.username + return context def format_file_size(self, file_size): diff --git a/src/static/riot/competitions/detail/_header.tag b/src/static/riot/competitions/detail/_header.tag index d6cda97d4..9d826abb8 100644 --- a/src/static/riot/competitions/detail/_header.tag +++ b/src/static/riot/competitions/detail/_header.tag @@ -41,7 +41,7 @@
Organized by: - {competition.created_by} + {competition.owner_display_name} ({competition.contact_email})
diff --git a/src/static/riot/datasets/management.tag b/src/static/riot/datasets/management.tag index 5d2ba198e..60553652a 100644 --- a/src/static/riot/datasets/management.tag +++ b/src/static/riot/datasets/management.tag @@ -116,7 +116,7 @@ {selected_row.key} - {selected_row.created_by} + {selected_row.owner_display_name} {pretty_date(selected_row.created_when)} {_.startCase(selected_row.type)} {_.startCase(selected_row.is_public)} diff --git a/src/static/riot/profiles/profile_detail.tag b/src/static/riot/profiles/profile_detail.tag index 714a6e2ab..3281ad99b 100644 --- a/src/static/riot/profiles/profile_detail.tag +++ b/src/static/riot/profiles/profile_detail.tag @@ -34,47 +34,125 @@
- - {selected_user.first_name} {selected_user.last_name} + + +
Personal Info
+ + +
+
+
Name
+
{selected_user.first_name} {selected_user.last_name}
+
+
+ + +
+ +
+
+
Email
+
{selected_user.email}
+
+
+ + +
+
+
Username
+
{selected_user.username}
+
+
+ + +
+
+
Display Name
+
{selected_user.display_name}
+
+
+
- +
About
-
- - Location - {selected_user.location} + + +
+
+
Location
+
{selected_user.location}
+
-
- - Job Title - {selected_user.title} + + +
+
+
Job Title
+
{selected_user.title}
+
- + + Update your profile to show your job title and location here. + + + +
Bio
- No bio found! Update your profile to show your bio here. +
{selected_user.biography}
- + + Update your profile to show your bio here. + + +
Links
-
-