diff --git a/ietf/stats/tests.py b/ietf/stats/tests.py index 373f06e3431..dc5b5d6ae88 100644 --- a/ietf/stats/tests.py +++ b/ietf/stats/tests.py @@ -1,18 +1,19 @@ -# Copyright The IETF Trust 2016-2020, All Rights Reserved -# -*- coding: utf-8 -*- - +# Copyright The IETF Trust 2016-2026, All Rights Reserved import calendar import json import datetime +from django.http import Http404 from pyquery import PyQuery import debug # pyflakes:ignore +from django.test import RequestFactory from django.urls import reverse as urlreverse from django.utils import timezone +from ietf.meeting.models import Meeting from ietf.utils.test_utils import login_testing_unauthorized, TestCase import ietf.stats.views @@ -87,7 +88,29 @@ def test_meeting_stats(self): self.assertContains(r, "/stats/meeting/124/country") self.assertContains(r, "/stats/meeting/125/country") self.assertContains(r, "This page provides a timeline of meeting registrations.") - + + def test_meeting_stats_for_bad_meeting(self): + self.assertFalse(Meeting.objects.filter(number=676767).exists()) + for stats_type in ["affiliation", "country"]: + r = self.client.get( + urlreverse( + "ietf.stats.views.meeting_stats", + kwargs={"meeting_number": 676767, "stats_type": stats_type}, + ) + ) + self.assertEqual(r.status_code, 404) + + # We don't have a URL for an interim, but make sure the view will 404 if + # somehow a non-interim gets selected... + interim_num = MeetingFactory(type_id="interim").number + request_factory = RequestFactory() + with self.assertRaises(Http404): + ietf.stats.views.meeting_stats( + request_factory.get(f"/stats/meeting/{interim_num}/{stats_type}"), + meeting_number=interim_num, + stats_type=stats_type, + ) + def test_known_country_list(self): # check redirect url = urlreverse(ietf.stats.views.known_countries_list) diff --git a/ietf/stats/views.py b/ietf/stats/views.py index d61b6730754..d61c9cab64d 100644 --- a/ietf/stats/views.py +++ b/ietf/stats/views.py @@ -13,7 +13,7 @@ from django.contrib.auth.decorators import login_required from django.core.cache import cache from django.http import HttpResponseRedirect -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404 from django.urls import reverse as urlreverse from django.db.models import Count @@ -27,11 +27,11 @@ from ietf.group.models import Role, Group from ietf.person.models import Person from ietf.name.models import ReviewResultName, CountryName, ReviewAssignmentStateName -from ietf.meeting.models import Registration +from ietf.meeting.models import Registration, Meeting from ietf.ietfauth.utils import has_role from ietf.utils.response import permission_denied from ietf.utils.timezone import date_today, DEADLINE_TZINFO -from ietf.meeting.helpers import get_current_ietf_meeting_num, get_ietf_meeting +from ietf.meeting.helpers import get_current_ietf_meeting_num # Color palette for lines colors = [ @@ -568,12 +568,12 @@ def meeting_stats(request, meeting_number=None, stats_type='country'): Returns: Rendered response for the meeting stats template. """ - - current_meeting = get_current_ietf_meeting_num() + current_meeting_number = get_current_ietf_meeting_num() if meeting_number is None: - meeting_number = current_meeting - - this_meeting = get_ietf_meeting(meeting_number) + meeting_number = current_meeting_number + this_meeting = get_object_or_404( + Meeting.objects.filter(type_id="ietf"), number=meeting_number + ) if stats_type == 'affiliation': minimum_required = 4 @@ -616,7 +616,7 @@ def meeting_stats(request, meeting_number=None, stats_type='country'): if int(meeting_number) > 72: # No registration data before IETF-72 possible_meeting_numbers.append((int(meeting_number)-1, urlreverse(meeting_stats, kwargs={'meeting_number': int(meeting_number)-1, 'stats_type': stats_type}))) possible_meeting_numbers.append((meeting_number, urlreverse(meeting_stats, kwargs={'meeting_number': meeting_number, 'stats_type': stats_type}))) - if int(meeting_number) <= int(current_meeting): # Allow current meeting +1 + if int(meeting_number) <= int(current_meeting_number): # Allow current meeting +1 possible_meeting_numbers.append((int(meeting_number)+1, urlreverse(meeting_stats, kwargs={'meeting_number': int(meeting_number)+1, 'stats_type': stats_type}))) return render(request, "stats/meeting_stats.html", {