Skip to content

Commit 9195f43

Browse files
making certificate name for student (partially addresses #78)
1 parent 4bca37e commit 9195f43

4 files changed

Lines changed: 125 additions & 3 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.7 on 2025-05-12 16:30
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('accounts', '0002_token'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='customuser',
15+
name='certificate_name',
16+
field=models.CharField(blank=True, help_text='Your actual name that will appear on your certificates', max_length=255, null=True, verbose_name='Certificate name'),
17+
),
18+
]

accounts/models.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import secrets
32

43
from django.db import models
@@ -12,6 +11,13 @@ class CustomUser(AbstractUser):
1211
)
1312

1413
role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='student')
14+
certificate_name = models.CharField(
15+
verbose_name="Certificate name",
16+
max_length=255,
17+
blank=True,
18+
null=True,
19+
help_text="Your actual name that will appear on your certificates"
20+
)
1521

1622

1723
class Token(models.Model):

courses/models/course.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from django.db import models
22

33
from django.core.validators import URLValidator
4-
from django.contrib.auth import get_user_model
4+
from accounts.models import CustomUser
55

66
from courses.random_names import generate_random_name
77

8-
User = get_user_model()
8+
User = CustomUser
99

1010

1111
class Course(models.Model):
@@ -106,6 +106,15 @@ class Meta:
106106
def save(self, *args, **kwargs):
107107
if not self.display_name:
108108
self.display_name = generate_random_name()
109+
110+
# If certificate_name is being set, update the user's certificate_name
111+
if self.certificate_name and self.certificate_name != self.student.certificate_name:
112+
self.student.certificate_name = self.certificate_name
113+
self.student.save()
114+
# If certificate_name is not set but user has one, use the user's certificate_name
115+
elif not self.certificate_name and self.student.certificate_name:
116+
self.certificate_name = self.student.certificate_name
117+
109118
super().save(*args, **kwargs)
110119

111120
def __str__(self):
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from django.test import TestCase
2+
3+
from accounts.models import CustomUser
4+
from courses.models import Course, Enrollment
5+
6+
7+
class CertificateNameTests(TestCase):
8+
def setUp(self):
9+
self.user = CustomUser.objects.create_user(
10+
username="test@test.com",
11+
email="test@test.com",
12+
password="12345"
13+
)
14+
self.course1 = Course.objects.create(
15+
title="Test Course 1",
16+
slug="test-course-1"
17+
)
18+
self.course2 = Course.objects.create(
19+
title="Test Course 2",
20+
slug="test-course-2"
21+
)
22+
23+
def test_certificate_name_sync_to_user(self):
24+
"""Test that updating certificate name in enrollment updates it for the user but not other enrollments"""
25+
# Create two enrollments for the same user
26+
enrollment1 = Enrollment.objects.create(
27+
student=self.user,
28+
course=self.course1
29+
)
30+
enrollment2 = Enrollment.objects.create(
31+
student=self.user,
32+
course=self.course2
33+
)
34+
35+
# Initially both enrollments and user should have no certificate name
36+
self.assertIsNone(enrollment1.certificate_name)
37+
self.assertIsNone(enrollment2.certificate_name)
38+
self.assertIsNone(self.user.certificate_name)
39+
40+
# Update certificate name in first enrollment
41+
enrollment1.certificate_name = "John Doe"
42+
enrollment1.save()
43+
44+
# Refresh objects from database
45+
self.user.refresh_from_db()
46+
enrollment1.refresh_from_db()
47+
enrollment2.refresh_from_db()
48+
49+
# Check that only the user and the updated enrollment have the new certificate name
50+
self.assertEqual(enrollment1.certificate_name, "John Doe")
51+
self.assertIsNone(enrollment2.certificate_name) # Other enrollment should not be affected
52+
self.assertEqual(self.user.certificate_name, "John Doe") # User should be updated
53+
54+
def test_certificate_name_sync_on_new_enrollment(self):
55+
"""Test that new enrollment gets certificate name from user if set"""
56+
# Set certificate name on user
57+
self.user.certificate_name = "Jane Doe"
58+
self.user.save()
59+
60+
# Create new enrollment
61+
enrollment = Enrollment.objects.create(
62+
student=self.user,
63+
course=self.course1
64+
)
65+
66+
# Refresh enrollment from database
67+
enrollment.refresh_from_db()
68+
69+
# Check that enrollment got the certificate name from user
70+
self.assertEqual(enrollment.certificate_name, "Jane Doe")
71+
72+
def test_certificate_name_not_overwritten(self):
73+
"""Test that existing certificate name in enrollment is not overwritten by user's name"""
74+
# Create enrollment with certificate name
75+
enrollment = Enrollment.objects.create(
76+
student=self.user,
77+
course=self.course1,
78+
certificate_name="Original Name"
79+
)
80+
81+
# Set different certificate name on user
82+
self.user.certificate_name = "Different Name"
83+
self.user.save()
84+
85+
# Refresh enrollment from database
86+
enrollment.refresh_from_db()
87+
88+
# Check that enrollment's certificate name was not changed
89+
self.assertEqual(enrollment.certificate_name, "Original Name")

0 commit comments

Comments
 (0)