From 7604dc4fa66f1bd44598ac08f4c5c5ec970ecdf2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:14:32 +0000 Subject: [PATCH 1/5] Initial plan From ad6d1a7d21caede045b53a51554d0bc2a36add31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:18:22 +0000 Subject: [PATCH 2/5] Initial exploration of admin page functionality Co-authored-by: karbassi <17738+karbassi@users.noreply.github.com> --- uv.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uv.lock b/uv.lock index 834ce08e..b4904b15 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = "==3.11.*" [[package]] @@ -923,7 +923,7 @@ requires-dist = [ { name = "django-cleanup", specifier = ">=9.0.0,<10.0.0" }, { name = "django-common-helpers", specifier = ">=0.9.2,<1.0.0" }, { name = "django-cron", specifier = ">=0.6.0,<0.7.0" }, - { name = "django-debug-toolbar", specifier = ">=5.2.0,<6.0.0" }, + { name = "django-debug-toolbar", specifier = ">=5.2.0,<7.0.0" }, { name = "django-environ", specifier = ">=0.12.0,<0.13.0" }, { name = "django-fullurl", specifier = ">=1.4,<2.0" }, { name = "django-heroku", specifier = ">=0.3.1,<0.4.0" }, From ab422a6541d5f189aba38c4cfb7a8035a202c9f3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:23:00 +0000 Subject: [PATCH 3/5] Limit admin page to show only last 5 classes for better performance Co-authored-by: karbassi <17738+karbassi@users.noreply.github.com> --- coderdojochi/old_views.py | 2 +- coderdojochi/templates/dashboard/admin.html | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/coderdojochi/old_views.py b/coderdojochi/old_views.py index a4b5a340..8c0ba37c 100644 --- a/coderdojochi/old_views.py +++ b/coderdojochi/old_views.py @@ -236,7 +236,7 @@ def cdc_admin(request, template_name="admin.html"): output_field=IntegerField(), ), ) - .order_by("-start_date") + .order_by("-start_date")[:5] ) meetings = ( diff --git a/coderdojochi/templates/dashboard/admin.html b/coderdojochi/templates/dashboard/admin.html index bb442eeb..4faab733 100644 --- a/coderdojochi/templates/dashboard/admin.html +++ b/coderdojochi/templates/dashboard/admin.html @@ -183,9 +183,6 @@

Classes {{ sessions|length }} 5 %} - collapse session-collapse - {% endif %} " > {{ session.start_date|date:"M j, Y" }} @@ -258,15 +255,6 @@

Classes {{ sessions|length }} {% endfor %} - {% if sessions.count > 5 %} - - - - - - - - {% endif %} {% else %}

No past sessions.

From 66991985444162d730ab2a87eb3d88c5a0025543 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:33:01 +0000 Subject: [PATCH 4/5] Add AJAX "Load More" functionality for admin sessions page Co-authored-by: karbassi <17738+karbassi@users.noreply.github.com> --- coderdojochi/old_views.py | 51 ++++++++++++ coderdojochi/templates/dashboard/admin.html | 63 ++++++++++++++- .../dashboard/admin_sessions_rows.html | 80 +++++++++++++++++++ coderdojochi/urls.py | 2 + 4 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 coderdojochi/templates/dashboard/admin_sessions_rows.html diff --git a/coderdojochi/old_views.py b/coderdojochi/old_views.py index 8c0ba37c..afa805aa 100644 --- a/coderdojochi/old_views.py +++ b/coderdojochi/old_views.py @@ -15,9 +15,11 @@ from django.db.models import IntegerField from django.db.models import When from django.http import HttpResponse +from django.http import JsonResponse from django.shortcuts import get_object_or_404 from django.shortcuts import redirect from django.shortcuts import render +from django.template.loader import render_to_string from django.urls import reverse from django.utils import timezone from django.views.decorators.cache import never_cache @@ -308,6 +310,55 @@ def cdc_admin(request, template_name="admin.html"): ) +@login_required +def load_more_sessions(request): + """AJAX endpoint to load additional sessions for admin page""" + if not request.user.is_staff: + return JsonResponse({"error": "Permission denied"}, status=403) + + # Get offset from request, default to 5 (after the initial 5 sessions) + offset = int(request.GET.get("offset", 5)) + limit = int(request.GET.get("limit", 10)) # Load 10 more at a time + + # Limit to sessions within the last 365 days + one_year_ago = timezone.now() - timedelta(days=365) + + sessions = ( + Session.objects.select_related() + .annotate( + num_orders=Count("order"), + num_attended=Count( + Case(When(order__check_in__isnull=False, then=1)), + ), + is_future=Case( + When(start_date__gte=timezone.now(), then=1), + default=0, + output_field=IntegerField(), + ), + ) + .filter(start_date__gte=one_year_ago) + .order_by("-start_date")[offset:offset+limit] + ) + + # Render the sessions to HTML + html = render_to_string( + "dashboard/admin_sessions_rows.html", + {"sessions": sessions}, + request=request + ) + + # Check if there are more sessions to load + has_more = Session.objects.filter( + start_date__gte=one_year_ago + ).count() > offset + limit + + return JsonResponse({ + "html": html, + "has_more": has_more, + "next_offset": offset + limit + }) + + @login_required @never_cache def session_stats(request, pk, template_name="session_stats.html"): diff --git a/coderdojochi/templates/dashboard/admin.html b/coderdojochi/templates/dashboard/admin.html index 4faab733..4b00aaf1 100644 --- a/coderdojochi/templates/dashboard/admin.html +++ b/coderdojochi/templates/dashboard/admin.html @@ -173,7 +173,7 @@

Classes {{ sessions|length }}C - + {% for session in sessions %} Classes {{ sessions|length }} {% endfor %} + + + + + + + + {% else %}

No past sessions.

@@ -360,6 +368,59 @@

Meetings {{ meetings|length }}No upcoming meetings.

{% endif %} + + + {% endblock %} {% block footer_base %}{% endblock %} diff --git a/coderdojochi/templates/dashboard/admin_sessions_rows.html b/coderdojochi/templates/dashboard/admin_sessions_rows.html new file mode 100644 index 00000000..ab22119c --- /dev/null +++ b/coderdojochi/templates/dashboard/admin_sessions_rows.html @@ -0,0 +1,80 @@ +{% for session in sessions %} + + {{ session.start_date|date:"M j, Y" }} + {{ session.start_date|time:"H:i" }} + {{ session.end_date|time:"H:i" }} + {{ session.course.title }} + {{ session.instructor }} + {{ session.location.name }} + + {% if session.announced_date_guardians|yesno:'yes,no' == 'yes' %} + + {% endif %} + + + {% if not session.external_enrollment_url %} + {{ session.num_attended|default:'-' }} + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + {{ session.num_orders|default:'-' }} + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + {{ session.capacity|default:'-' }} + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + {{ session.get_checked_in_mentor_orders|length|default:'-' }} + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + {{ session.get_mentor_orders|length|default:'-' }} + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + {{ session.mentor_capacity|default:'-' }} + {% else %} + × + {% endif %} + + + {% if not session.external_enrollment_url %} + + {% else %} + × + {% endif %} + + +{% endfor %} \ No newline at end of file diff --git a/coderdojochi/urls.py b/coderdojochi/urls.py index 72162815..e9a91d13 100644 --- a/coderdojochi/urls.py +++ b/coderdojochi/urls.py @@ -105,6 +105,8 @@ # Admin # /admin/ path("", old_views.cdc_admin, name="cdc-admin"), + # /admin/load-more-sessions/ + path("load-more-sessions/", old_views.load_more_sessions, name="load-more-sessions"), path( "classes/", include( From 7d8c6e110c3787d70f5f90d1c387cfc141e77857 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:35:04 +0000 Subject: [PATCH 5/5] Improve Load More functionality with conditional display and tests Co-authored-by: karbassi <17738+karbassi@users.noreply.github.com> --- coderdojochi/old_views.py | 8 +++ coderdojochi/templates/dashboard/admin.html | 4 +- .../tests/test_admin_load_more_sessions.py | 72 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 coderdojochi/tests/test_admin_load_more_sessions.py diff --git a/coderdojochi/old_views.py b/coderdojochi/old_views.py index afa805aa..e6502e47 100644 --- a/coderdojochi/old_views.py +++ b/coderdojochi/old_views.py @@ -241,6 +241,13 @@ def cdc_admin(request, template_name="admin.html"): .order_by("-start_date")[:5] ) + # Check if there are more sessions available (within the last 365 days) + one_year_ago = timezone.now() - timedelta(days=365) + total_recent_sessions_count = Session.objects.filter( + start_date__gte=one_year_ago + ).count() + has_more_sessions = total_recent_sessions_count > 5 + meetings = ( Meeting.objects.select_related() .annotate( @@ -300,6 +307,7 @@ def cdc_admin(request, template_name="admin.html"): # 'past_sessions': past_sessions, # 'past_sessions_count': past_sessions_count, "sessions": sessions, + "has_more_sessions": has_more_sessions, "total_checked_in_orders_count": total_checked_in_orders_count, "total_past_orders_count": total_past_orders_count, # 'upcoming_meetings': upcoming_meetings, diff --git a/coderdojochi/templates/dashboard/admin.html b/coderdojochi/templates/dashboard/admin.html index 4b00aaf1..869b9e9f 100644 --- a/coderdojochi/templates/dashboard/admin.html +++ b/coderdojochi/templates/dashboard/admin.html @@ -255,6 +255,7 @@

Classes {{ sessions|length }} {% endfor %} + {% if has_more_sessions %} @@ -263,6 +264,7 @@

Classes {{ sessions|length }} + {% endif %} {% else %}

No past sessions.

@@ -376,7 +378,7 @@

Meetings {{ meetings|length }}