Skip to content

Commit 01ea42b

Browse files
Add course profile link to overview
Closes #78
1 parent e3bf246 commit 01ea42b

3 files changed

Lines changed: 64 additions & 3 deletions

File tree

courses/templates/courses/course_list.html

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,21 @@ <h3 class="mt-2 text-xl font-semibold md:text-2xl">
115115
{% if course.home_registration_open %}
116116
<div class="flex flex-wrap gap-3 md:justify-end">
117117
<a href="{{ course.registration_url }}"
118-
class="inline-flex items-center font-medium app-link">
118+
class="primer-button primer-button-secondary whitespace-nowrap">
119+
<i class="fas fa-user-plus"></i>
119120
Register
120121
</a>
121122
</div>
122123
{% endif %}
124+
{% if course.home_is_enrolled %}
125+
<div class="flex flex-wrap gap-3 md:justify-end">
126+
<a href="{% url 'enrollment' course.slug %}"
127+
class="primer-button primer-button-secondary whitespace-nowrap">
128+
<i class="fas fa-user-edit"></i>
129+
Edit profile
130+
</a>
131+
</div>
132+
{% endif %}
123133
</div>
124134
</article>
125135
{% endfor %}
@@ -151,6 +161,11 @@ <h4 class="text-lg font-semibold app-link md:text-xl">{{ course.title }}</h4>
151161
<div class="flex flex-wrap gap-x-3 gap-y-1 text-sm app-muted md:justify-end">
152162
<span>{{ course.homework_count }} homework</span>
153163
<span>{{ course.project_count }} projects</span>
164+
{% if course.home_is_enrolled %}
165+
<span>
166+
<a href="{% url 'enrollment' course.slug %}" class="app-link">Edit profile</a>
167+
</span>
168+
{% endif %}
154169
</div>
155170
<span class="hidden shrink-0 app-link md:block" aria-hidden="true">&rarr;</span>
156171
</a>

courses/tests/test_course.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,36 @@ def test_course_list_shows_registration_before_course_start(self):
983983
response,
984984
"https://courses.datatalks.club/test-course/register",
985985
)
986+
987+
def test_course_list_shows_edit_profile_for_enrolled_courses(self):
988+
other_course = Course.objects.create(
989+
title="Other Course",
990+
slug="other-course",
991+
visible=True,
992+
)
993+
994+
self.client.login(**credentials)
995+
996+
url = reverse("course_list")
997+
response = self.client.get(url)
998+
999+
self.assertEqual(response.status_code, 200)
1000+
1001+
courses_by_slug = {
1002+
course.slug: course
1003+
for course in response.context["active_courses"]
1004+
}
1005+
1006+
self.assertTrue(courses_by_slug[self.course.slug].home_is_enrolled)
1007+
self.assertFalse(courses_by_slug[other_course.slug].home_is_enrolled)
1008+
self.assertContains(
1009+
response,
1010+
reverse("enrollment", kwargs={"course_slug": self.course.slug}),
1011+
)
1012+
self.assertNotContains(
1013+
response,
1014+
reverse("enrollment", kwargs={"course_slug": other_course.slug}),
1015+
)
9861016

9871017
def test_hidden_course_accessible_via_direct_link(self):
9881018
"""Test that non-visible courses are still accessible via direct link"""

courses/views/course.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,17 @@ def current_assignment_info(course: Course, now) -> tuple[str, dict | None]:
157157
return "Last assignment", assignments[-1]
158158

159159

160-
def add_course_homepage_info(course: Course, now) -> None:
160+
def add_course_homepage_info(
161+
course: Course,
162+
now,
163+
enrolled_course_ids: set[int] | None = None,
164+
) -> None:
161165
today = timezone.localdate(now)
166+
enrolled_course_ids = enrolled_course_ids or set()
162167

163168
course.home_outcome = get_course_outcome(course)
164169
course.home_year = course_year(course)
170+
course.home_is_enrolled = course.id in enrolled_course_ids
165171
course.home_duration_label = course_duration_label(course)
166172
course.home_registration_open = (
167173
bool(course.registration_url)
@@ -176,6 +182,16 @@ def add_course_homepage_info(course: Course, now) -> None:
176182

177183
def course_list(request):
178184
now = timezone.now()
185+
enrolled_course_ids = set()
186+
187+
if request.user.is_authenticated:
188+
enrolled_course_ids = set(
189+
Enrollment.objects.filter(student=request.user).values_list(
190+
"course_id",
191+
flat=True,
192+
)
193+
)
194+
179195
courses = (
180196
Course.objects.filter(visible=True)
181197
.annotate(
@@ -192,7 +208,7 @@ def course_list(request):
192208
archive_courses_by_year = defaultdict(list)
193209

194210
for course in courses:
195-
add_course_homepage_info(course, now)
211+
add_course_homepage_info(course, now, enrolled_course_ids)
196212

197213
if course.finished:
198214
finished_courses.append(course)

0 commit comments

Comments
 (0)