|
1 | 1 | import calendar |
| 2 | +import csv |
2 | 3 | import html |
3 | 4 | import ipaddress |
4 | 5 | import json |
@@ -1904,6 +1905,48 @@ def course_progress_overview(request, slug): |
1904 | 1905 |
|
1905 | 1906 |
|
1906 | 1907 | @login_required |
| 1908 | +def export_course_progress_csv(request, slug): |
| 1909 | + """Export student progress data for a course as a CSV file.""" |
| 1910 | + course = get_object_or_404(Course, slug=slug) |
| 1911 | + if request.user != course.teacher: |
| 1912 | + messages.error(request, "Only the course teacher can export progress data.") |
| 1913 | + return redirect("course_detail", slug=slug) |
| 1914 | + response = HttpResponse(content_type="text/csv") |
| 1915 | + response["Content-Disposition"] = f'attachment; filename="{course.slug}-progress.csv"' |
| 1916 | + writer = csv.writer(response) |
| 1917 | + writer.writerow([ |
| 1918 | + "Student Name", |
| 1919 | + "Username", |
| 1920 | + "Email", |
| 1921 | + "Enrollment Date", |
| 1922 | + "Completion %", |
| 1923 | + "Sessions Attended", |
| 1924 | + "Total Sessions", |
| 1925 | + "Attendance Rate %", |
| 1926 | + "Last Accessed", |
| 1927 | + ]) |
| 1928 | + enrollments = course.enrollments.filter(status="approved").select_related("student") |
| 1929 | + total_sessions = course.sessions.count() |
| 1930 | + for enrollment in enrollments: |
| 1931 | + progress, _ = CourseProgress.objects.get_or_create(enrollment=enrollment) |
| 1932 | + attended = SessionAttendance.objects.filter( |
| 1933 | + student=enrollment.student, |
| 1934 | + session__course=course, |
| 1935 | + status__in=["present", "late"], |
| 1936 | + ).count() |
| 1937 | + writer.writerow([ |
| 1938 | + enrollment.student.get_full_name() or enrollment.student.username, |
| 1939 | + enrollment.student.username, |
| 1940 | + enrollment.student.email, |
| 1941 | + enrollment.enrollment_date.strftime("%Y-%m-%d"), |
| 1942 | + progress.completion_percentage, |
| 1943 | + attended, |
| 1944 | + total_sessions, |
| 1945 | + progress.attendance_rate, |
| 1946 | + progress.last_accessed.strftime("%Y-%m-%d") if progress.last_accessed else "", |
| 1947 | + ]) |
| 1948 | + return response |
| 1949 | + |
1907 | 1950 | def upload_material(request, slug): |
1908 | 1951 | course = get_object_or_404(Course, slug=slug) |
1909 | 1952 | if request.user != course.teacher: |
|
0 commit comments