Skip to content

Commit 1524d3e

Browse files
Show public profile prompt on own leaderboard record
1 parent ed6ce67 commit 1524d3e

5 files changed

Lines changed: 77 additions & 6 deletions

File tree

courses/templates/courses/course.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ <h1 class="text-3xl font-semibold leading-tight tracking-normal md:text-4xl">
2424
</div>
2525

2626
<div class="course-actions mt-5 flex flex-wrap gap-3 md:mt-8 md:gap-4">
27-
{% if course.registration_url %}
27+
{% if course.home_registration_open %}
2828
<a href="{{ course.registration_url }}" class="primer-button primer-button-secondary whitespace-nowrap">
2929
<i class="fas fa-user-plus"></i> Register
3030
</a>

courses/templates/courses/course_list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ <h3 class="mt-2 text-xl font-semibold md:text-2xl">
116116
<p class="mt-1 font-semibold app-heading">TBA</p>
117117
{% endif %}
118118
</div>
119-
{% if course.registration_url %}
119+
{% if course.home_registration_open %}
120120
<div class="flex flex-wrap gap-3 md:justify-end">
121121
<a href="{{ course.registration_url }}"
122122
class="primer-button primer-button-secondary whitespace-nowrap">

courses/templates/courses/leaderboard_score_breakdown.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ <h1 class="text-2xl font-semibold app-heading md:text-3xl">{{ enrollment.display
4646
<i class="fas fa-cog"></i> Admin
4747
</a>
4848
{% endif %}
49+
{% if show_public_profile_settings_link %}
50+
<a href="{% url 'enrollment' enrollment.course.slug %}"
51+
class="primer-button">
52+
Show public profile
53+
</a>
54+
{% endif %}
4955
<button type="button"
5056
class="leaderboard-flag-button primer-button primer-button-secondary"
5157
data-flag-url="{% url 'leaderboard_complaint' course_slug=enrollment.course.slug enrollment_id=enrollment.id %}"

courses/tests/test_course.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ def test_course_detail_unauthenticated_user(self):
169169
self.assertFalse(hasattr(hw, "submitted_at"))
170170

171171
def test_course_detail_shows_registration_url(self):
172+
self.course.start_date = timezone.localdate() + timezone.timedelta(
173+
days=7
174+
)
172175
self.course.registration_url = (
173176
"https://courses.datatalks.club/test-course/register"
174177
)
@@ -491,6 +494,58 @@ def test_score_breakdown_has_flag_button(self):
491494
self.assertEqual(response.status_code, 200)
492495
self.assertContains(response, "Flag this record")
493496

497+
def test_score_breakdown_prompts_owner_to_show_public_profile(self):
498+
self.client.force_login(self.user)
499+
500+
url = reverse(
501+
"leaderboard_score_breakdown",
502+
kwargs={
503+
"course_slug": self.course.slug,
504+
"enrollment_id": self.enrollment.id,
505+
},
506+
)
507+
response = self.client.get(url)
508+
509+
self.assertEqual(response.status_code, 200)
510+
self.assertContains(response, "Show public profile")
511+
self.assertContains(
512+
response,
513+
f'href="{reverse("enrollment", args=[self.course.slug])}"',
514+
)
515+
516+
def test_score_breakdown_does_not_prompt_for_other_record(self):
517+
target = self.create_enrollment("e1", 100, 1)
518+
self.client.force_login(self.user)
519+
520+
url = reverse(
521+
"leaderboard_score_breakdown",
522+
kwargs={
523+
"course_slug": self.course.slug,
524+
"enrollment_id": target.id,
525+
},
526+
)
527+
response = self.client.get(url)
528+
529+
self.assertEqual(response.status_code, 200)
530+
self.assertNotContains(response, "Show public profile")
531+
532+
def test_score_breakdown_does_not_prompt_when_profile_public(self):
533+
self.enrollment.display_public_profile = True
534+
self.enrollment.save()
535+
self.client.force_login(self.user)
536+
537+
url = reverse(
538+
"leaderboard_score_breakdown",
539+
kwargs={
540+
"course_slug": self.course.slug,
541+
"enrollment_id": self.enrollment.id,
542+
},
543+
)
544+
response = self.client.get(url)
545+
546+
self.assertEqual(response.status_code, 200)
547+
self.assertNotContains(response, "Show public profile")
548+
494549
def test_score_breakdown_shows_score_equations(self):
495550
self.submission1.questions_score = 7
496551
self.submission1.faq_score = 2
@@ -1026,7 +1081,7 @@ def test_course_list_shows_active_course_metadata(self):
10261081
self.assertContains(response, "Apr 15, 2026")
10271082
self.assertContains(response, "13 weeks")
10281083
self.assertContains(response, "Submitted Homework")
1029-
self.assertContains(
1084+
self.assertNotContains(
10301085
response,
10311086
"https://courses.datatalks.club/test-course/register",
10321087
)

courses/views/course.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ def update_project_with_additional_info(project: Project) -> None:
359359

360360
def course_view(request: HttpRequest, course_slug: str) -> HttpResponse:
361361
course = get_object_or_404(Course, slug=course_slug)
362+
add_course_homepage_info(course, timezone.now())
362363

363364
user = request.user
364365
homeworks = get_homeworks_for_course(course, user)
@@ -689,11 +690,20 @@ def leaderboard_score_breakdown_view(
689690
enrollment=enrollment
690691
).order_by("project__id")
691692

693+
is_own_record = (
694+
request.user.is_authenticated
695+
and request.user.id == enrollment.student_id
696+
)
697+
public_profile = (
698+
enrollment.student if enrollment.display_public_profile else None
699+
)
700+
692701
context = {
693702
"enrollment": enrollment,
694-
"public_profile": enrollment.student
695-
if enrollment.display_public_profile
696-
else None,
703+
"public_profile": public_profile,
704+
"show_public_profile_settings_link": (
705+
is_own_record and public_profile is None
706+
),
697707
"submissions": homework_submissions,
698708
"project_submissions": project_submissions,
699709
}

0 commit comments

Comments
 (0)