From b75b560deacbc0f9709aa4ae38623b82b6eab769 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Fri, 9 Jun 2023 17:07:31 -0500 Subject: [PATCH] feat: import IAB minutes from the IAB wordpress site (#5689) * feat: import IAB minutes from the IAB wordpress site Work in Progress * fix: refactor as management commands * fix: use datetime.timezone.utc for comparisons * fix: coerce an argument. Command now runs * chore: extend queryset in a better way * fix: fetch kesara's repo and move files into place. * fix: add a DocEvent explaining where the Documents came from * fix: small optimizations and typo fixes * fix: performance compromise for very old meetings * fix: ensure variable is initialized * fix: avoid operating on null by changing method signature - address review comments * fix: repair html typo and address pyflake complaint * chore: run black on a new and changed things --- ietf/group/views.py | 69 +- .../commands/data_for_import_iab_minutes | 1 + .../management/commands/import_iab_minutes.py | 141 +++ .../regenerate_data_for_import_iab_minutes.py | 872 ++++++++++++++++++ ietf/meeting/models.py | 9 +- ietf/templates/group/meetings-row.html | 4 +- ietf/templates/group/meetings.html | 77 +- ietf/utils/decorators.py | 2 +- 8 files changed, 1144 insertions(+), 31 deletions(-) create mode 100644 ietf/meeting/management/commands/data_for_import_iab_minutes create mode 100644 ietf/meeting/management/commands/import_iab_minutes.py create mode 100644 ietf/meeting/management/commands/regenerate_data_for_import_iab_minutes.py diff --git a/ietf/group/views.py b/ietf/group/views.py index a6e10926f..ce7ce6c64 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -83,7 +83,7 @@ from ietf.group.utils import (get_charter_text, can_manage_all_groups_of_type, from ietf.ietfauth.utils import has_role, is_authorized_in_group from ietf.mailtrigger.utils import gather_relevant_expansions from ietf.meeting.helpers import get_meeting -from ietf.meeting.utils import group_sessions, add_event_info_to_session_qs +from ietf.meeting.utils import group_sessions from ietf.name.models import GroupTypeName, StreamName from ietf.person.models import Email, Person from ietf.review.models import (ReviewRequest, ReviewAssignment, ReviewerSettings, @@ -828,18 +828,22 @@ def email_aliases(request, acronym=None, group_type=None): return render(request,'group/email_aliases.html',{'aliases':aliases,'ietf_domain':settings.IETF_DOMAIN,'group':group}) -def meetings(request, acronym=None, group_type=None): - group = get_group_or_404(acronym,group_type) if acronym else None +def meetings(request, acronym, group_type=None): + group = get_group_or_404(acronym, group_type) - four_years_ago = timezone.now()-datetime.timedelta(days=4*365) + four_years_ago = timezone.now() - datetime.timedelta(days=4 * 365) - sessions = add_event_info_to_session_qs( - group.session_set.filter( - meeting__date__gt=four_years_ago, - type__in=['regular','plenary','other'] + sessions = ( + group.session_set.with_current_status() + .filter( + meeting__date__gt=four_years_ago + if group.acronym != "iab" + else datetime.date(1970, 1, 1), + type__in=["regular", "plenary", "other"], + ) + .filter( + current_status__in=["sched", "schedw", "appr", "canceled"], ) - ).filter( - current_status__in=['sched','schedw','appr','canceled'], ) sessions = list(sessions) for s in sessions: @@ -847,19 +851,40 @@ def meetings(request, acronym=None, group_type=None): future, in_progress, recent, past = group_sessions(sessions) - can_edit = group.has_role(request.user,group.features.groupman_roles) - can_always_edit = has_role(request.user,["Secretariat","Area Director"]) + can_edit = group.has_role(request.user, group.features.groupman_roles) + can_always_edit = has_role(request.user, ["Secretariat", "Area Director"]) + + far_past = [] + if group.acronym == "iab": + recent_past = [] + for s in past: + if s.time >= four_years_ago: + recent_past.append(s) + else: + far_past.append(s) + past = recent_past + + return render( + request, + "group/meetings.html", + construct_group_menu_context( + request, + group, + "meetings", + group_type, + { + "group": group, + "future": future, + "in_progress": in_progress, + "recent": recent, + "past": past, + "far_past": far_past, + "can_edit": can_edit, + "can_always_edit": can_always_edit, + }, + ), + ) - return render(request,'group/meetings.html', - construct_group_menu_context(request, group, "meetings", group_type, { - 'group':group, - 'future':future, - 'in_progress':in_progress, - 'recent':recent, - 'past':past, - 'can_edit':can_edit, - 'can_always_edit':can_always_edit, - })) def chair_photos(request, group_type=None): roles = sorted(Role.objects.filter(group__type=group_type, group__state='active', name_id='chair'),key=lambda x: x.person.last_name()+x.person.name+x.group.acronym) diff --git a/ietf/meeting/management/commands/data_for_import_iab_minutes b/ietf/meeting/management/commands/data_for_import_iab_minutes new file mode 100644 index 000000000..5df3b280b --- /dev/null +++ b/ietf/meeting/management/commands/data_for_import_iab_minutes @@ -0,0 +1 @@ +{"1988": [[3, 21, "md", 12, 0, 300], [7, 12, "md", 12, 0, 300]], "1990": [[1, 3, "md", 12, 0, 300], [4, 26, "md", 12, 0, 300], [6, 28, "md", 12, 0, 300], [10, 11, "md", 12, 0, 300]], "1991": [[1, 8, "md", 12, 0, 300], [6, 14, "md", 12, 0, 300], [10, 10, "md", 12, 0, 300], [11, 19, "md", 12, 0, 300]], "1992": [[1, 7, "md", 12, 0, 300], [6, 18, "md", 12, 0, 300], [7, 17, "md", 12, 0, 300], [10, 29, "md", 12, 0, 300]], "1993": [[3, 30, "md", 12, 0, 300], [7, 13, "md", 12, 0, 300]], "1994": [[3, 30, "md", 12, 0, 300], [4, 29, "md", 12, 0, 300], [5, 24, "md", 12, 0, 300], [7, 5, "md", 12, 0, 300], [7, 27, "md", 12, 0, 300], [9, 23, "md", 12, 0, 300], [10, 13, "md", 12, 0, 300], [11, 9, "md", 12, 0, 300], [12, 7, "md", 12, 0, 300], [12, 9, "md", 12, 0, 300]], "1995": [[1, 10, "md", 12, 0, 300], [2, 7, "md", 12, 0, 300], [2, 28, "md", 12, 0, 300], [3, 22, "md", 12, 0, 300], [4, 2, "md", 12, 0, 300], [4, 5, "md", 12, 0, 300], [4, 19, "md", 12, 0, 300], [5, 10, "md", 12, 0, 300], [6, 7, "md", 12, 0, 300], [6, 29, "md", 12, 0, 300], [7, 19, "md", 12, 0, 300], [8, 8, "md", 12, 0, 300], [9, 12, "md", 12, 0, 300], [10, 10, "md", 12, 0, 300], [11, 14, "md", 12, 0, 300], [12, 3, "md", 12, 0, 300]], "1996": [[1, 9, "md", 12, 0, 300], [2, 13, "md", 12, 0, 300], [3, 5, "md", 12, 0, 300], [3, 6, "md", 12, 0, 300], [4, 9, "md", 12, 0, 300], [5, 14, "md", 12, 0, 300], [6, 11, "md", 12, 0, 300], [6, 26, "md", 12, 0, 300], [7, 9, "md", 12, 0, 300], [8, 13, "md", 12, 0, 300], [9, 12, "md", 12, 0, 300], [10, 8, "md", 12, 0, 300], [11, 12, "md", 12, 0, 300], [12, 10, "md", 12, 0, 300]], "1997": [[1, 14, "md", 12, 0, 300], [3, 11, "md", 12, 0, 300], [4, 8, "md", 12, 0, 300], [4, 9, "md", 12, 0, 300], [6, 17, "md", 12, 0, 300], [7, 15, "md", 12, 0, 300], [8, 12, "md", 12, 0, 300], [8, 13, "md", 12, 0, 300], [9, 9, "md", 12, 0, 300], [10, 14, "md", 12, 0, 300], [11, 11, "md", 12, 0, 300], [12, 9, "md", 12, 0, 300], [12, 10, "md", 12, 0, 300]], "1998": [[1, 20, "md", 12, 0, 300], [2, 10, "md", 12, 0, 300], [3, 10, "md", 12, 0, 300], [3, 31, "md", 12, 0, 300], [3, 31, "pdf", 12, 0, 300], [4, 2, "md", 12, 0, 300], [5, 12, "md", 12, 0, 300], [6, 9, "md", 12, 0, 300], [7, 14, "md", 12, 0, 300], [8, 4, "md", 12, 0, 300], [8, 23, "md", 12, 0, 300], [9, 15, "md", 12, 0, 300], [10, 13, "md", 12, 0, 300], [11, 10, "md", 12, 0, 300], [12, 8, "md", 12, 0, 300]], "1999": [[1, 12, "md", 12, 0, 300], [2, 9, "md", 12, 0, 300], [3, 16, "md", 12, 0, 300], [4, 13, "md", 12, 0, 300], [5, 11, "md", 12, 0, 300], [6, 15, "md", 12, 0, 300], [7, 11, "md", 12, 0, 300], [8, 10, "md", 12, 0, 300], [9, 14, "md", 12, 0, 300], [10, 19, "md", 12, 0, 300], [11, 9, "md", 12, 0, 300], [12, 14, "md", 12, 0, 300]], "2000": [[1, 10, "md", 12, 0, 300], [2, 14, "md", 12, 0, 300], [3, 26, "md", 12, 0, 300], [4, 10, "md", 12, 0, 300], [5, 8, "md", 12, 0, 300], [6, 12, "md", 12, 0, 300], [7, 10, "md", 12, 0, 300], [8, 1, "md", 12, 0, 300], [8, 14, "md", 12, 0, 300], [9, 11, "md", 12, 0, 300], [10, 16, "md", 12, 0, 300], [11, 13, "md", 12, 0, 300], [12, 12, "md", 12, 0, 300]], "2001": [[1, 9, "md", 12, 0, 300], [2, 13, "md", 12, 0, 300], [3, 20, "md", 12, 0, 300], [4, 10, "md", 12, 0, 300], [5, 8, "md", 12, 0, 300], [6, 12, "md", 12, 0, 300], [7, 10, "md", 12, 0, 300], [8, 7, "md", 12, 0, 300], [9, 11, "md", 12, 0, 300], [9, 11, "pdf", 12, 0, 300], [9, 24, "md", 12, 0, 300], [10, 9, "md", 12, 0, 300], [11, 20, "md", 12, 0, 300], [12, 11, "md", 12, 0, 300]], "2002": [[1, 8, "md", 12, 0, 300], [2, 12, "md", 12, 0, 300], [2, 15, "md", 12, 0, 300], [3, 12, "md", 12, 0, 300], [3, 19, "md", 12, 0, 300], [4, 9, "md", 12, 0, 300], [5, 14, "md", 12, 0, 300], [6, 11, "md", 12, 0, 300], [7, 16, "md", 12, 0, 300], [8, 13, "md", 12, 0, 300], [9, 10, "md", 12, 0, 300], [10, 8, "md", 12, 0, 300], [11, 17, "md", 12, 0, 300], [12, 10, "md", 12, 0, 300]], "2003": [[1, 14, "md", 12, 0, 300], [2, 11, "md", 12, 0, 300], [3, 11, "md", 12, 0, 300], [3, 18, "md", 12, 0, 300], [4, 8, "md", 12, 0, 300], [5, 13, "md", 12, 0, 300], [6, 10, "md", 12, 0, 300], [7, 8, "md", 12, 0, 300], [7, 17, "md", 12, 0, 300], [8, 12, "md", 12, 0, 300], [9, 9, "md", 12, 0, 300], [10, 14, "md", 12, 0, 300], [11, 4, "md", 12, 0, 300], [11, 9, "md", 12, 0, 300], [12, 9, "md", 12, 0, 300]], "2004": [[1, 13, "md", 12, 0, 300], [2, 10, "md", 12, 0, 300], [3, 2, "md", 12, 0, 300], [4, 13, "md", 12, 0, 300], [5, 11, "md", 12, 0, 300], [6, 8, "md", 12, 0, 300], [7, 13, "md", 12, 0, 300], [8, 3, "md", 12, 0, 300], [9, 14, "md", 12, 0, 300], [10, 12, "md", 12, 0, 300], [11, 7, "md", 12, 0, 300], [12, 14, "md", 12, 0, 300]], "2005": [[1, 11, "md", 12, 0, 300], [2, 8, "md", 12, 0, 300], [3, 1, "md", 12, 0, 300], [3, 7, "md", 12, 0, 300], [4, 13, "md", 12, 0, 300], [5, 11, "md", 12, 0, 300], [6, 10, "md", 12, 0, 300], [7, 13, "md", 12, 0, 300], [8, 2, "md", 12, 0, 300], [9, 14, "md", 12, 0, 300], [10, 12, "md", 12, 0, 300], [11, 2, "md", 12, 0, 300], [11, 10, "md", 12, 0, 300], [12, 7, "md", 12, 0, 300], [12, 21, "md", 12, 0, 300]], "2006": [[1, 4, "md", 12, 0, 300], [1, 18, "md", 12, 0, 300], [2, 1, "md", 12, 0, 300], [2, 15, "md", 12, 0, 300], [3, 15, "md", 12, 0, 300], [3, 19, "md", 12, 0, 300], [4, 5, "md", 12, 0, 300], [4, 17, "md", 12, 0, 300], [5, 3, "md", 12, 0, 300], [5, 17, "md", 12, 0, 300], [6, 7, "md", 12, 0, 300], [6, 21, "md", 12, 0, 300], [7, 5, "md", 12, 0, 300], [7, 9, "md", 12, 0, 300], [8, 2, "md", 12, 0, 300], [8, 30, "md", 12, 0, 300], [9, 6, "md", 12, 0, 300], [9, 20, "md", 12, 0, 300], [10, 4, "md", 12, 0, 300], [10, 25, "md", 12, 0, 300], [11, 1, "md", 12, 0, 300], [11, 5, "md", 12, 0, 300], [11, 22, "md", 12, 0, 300], [12, 6, "md", 12, 0, 300], [12, 20, "md", 12, 0, 300]], "2007": [[1, 10, "md", 12, 0, 300], [1, 24, "md", 12, 0, 300], [2, 7, "md", 12, 0, 300], [2, 21, "md", 12, 0, 300], [3, 7, "md", 12, 0, 300], [3, 18, "md", 12, 0, 300], [4, 4, "md", 12, 0, 300], [4, 18, "md", 12, 0, 300], [5, 2, "md", 12, 0, 300], [5, 16, "md", 12, 0, 300], [6, 6, "md", 12, 0, 300], [6, 20, "md", 12, 0, 300], [7, 11, "md", 12, 0, 300], [7, 24, "md", 12, 0, 300], [7, 26, "md", 12, 0, 300], [8, 15, "md", 12, 0, 300], [9, 5, "md", 12, 0, 300], [9, 19, "md", 12, 0, 300], [10, 3, "md", 12, 0, 300], [10, 17, "md", 12, 0, 300], [11, 7, "md", 12, 0, 300], [11, 21, "md", 12, 0, 300], [12, 19, "md", 12, 0, 300]], "2008": [[1, 9, "md", 12, 0, 300], [1, 16, "md", 12, 0, 300], [1, 30, "md", 12, 0, 300], [2, 6, "md", 12, 0, 300], [2, 13, "md", 12, 0, 300], [2, 20, "md", 12, 0, 300], [3, 26, "md", 12, 0, 300], [4, 2, "md", 12, 0, 300], [4, 16, "md", 12, 0, 300], [5, 7, "md", 12, 0, 300], [5, 21, "md", 12, 0, 300], [5, 28, "md", 12, 0, 300], [6, 4, "md", 12, 0, 300], [6, 12, "md", 12, 0, 300], [6, 18, "md", 12, 0, 300], [6, 25, "md", 12, 0, 300], [7, 2, "md", 12, 0, 300], [7, 16, "md", 12, 0, 300], [7, 23, "md", 12, 0, 300], [8, 6, "md", 12, 0, 300], [8, 13, "md", 12, 0, 300], [8, 20, "md", 12, 0, 300], [8, 27, "md", 12, 0, 300], [9, 3, "md", 12, 0, 300], [9, 17, "md", 12, 0, 300], [9, 24, "md", 12, 0, 300], [10, 1, "md", 12, 0, 300], [10, 3, "md", 12, 0, 300], [10, 8, "md", 12, 0, 300], [10, 15, "md", 12, 0, 300], [11, 5, "md", 12, 0, 300], [12, 3, "md", 12, 0, 300], [12, 17, "md", 12, 0, 300]], "2009": [[1, 7, "md", 12, 0, 300], [1, 14, "md", 12, 0, 300], [1, 21, "md", 12, 0, 300], [1, 28, "md", 12, 0, 300], [2, 4, "md", 12, 0, 300], [2, 5, "md", 12, 0, 300], [2, 18, "md", 12, 0, 300], [2, 25, "md", 12, 0, 300], [3, 4, "md", 12, 0, 300], [3, 18, "md", 12, 0, 300], [4, 1, "md", 12, 0, 300], [4, 8, "md", 12, 0, 300], [5, 13, "md", 12, 0, 300], [5, 27, "md", 12, 0, 300], [6, 3, "md", 12, 0, 300], [6, 10, "md", 12, 0, 300], [6, 24, "md", 12, 0, 300], [7, 1, "md", 12, 0, 300], [8, 12, "md", 12, 0, 300], [9, 2, "md", 12, 0, 300], [9, 9, "md", 12, 0, 300], [9, 23, "md", 12, 0, 300], [9, 25, "md", 12, 0, 300], [10, 7, "md", 12, 0, 300], [10, 14, "md", 12, 0, 300], [10, 21, "md", 12, 0, 300], [10, 28, "md", 12, 0, 300], [11, 4, "md", 12, 0, 300], [11, 25, "md", 12, 0, 300], [12, 2, "md", 12, 0, 300], [12, 9, "md", 12, 0, 300]], "2010": [[1, 6, "md", 12, 0, 300], [1, 7, "md", 12, 0, 300], [1, 13, "md", 12, 0, 300], [1, 20, "md", 12, 0, 300], [1, 27, "md", 12, 0, 300], [2, 1, "md", 12, 0, 300], [2, 3, "md", 12, 0, 300], [2, 10, "md", 12, 0, 300], [2, 24, "md", 12, 0, 300], [3, 3, "md", 12, 0, 300], [3, 10, "md", 12, 0, 300], [4, 7, "md", 12, 0, 300], [4, 14, "md", 12, 0, 300], [4, 28, "md", 12, 0, 300], [5, 12, "md", 12, 0, 300], [6, 2, "md", 12, 0, 300], [6, 23, "md", 12, 0, 300], [7, 7, "md", 12, 0, 300], [7, 14, "md", 12, 0, 300], [8, 11, "md", 12, 0, 300], [8, 25, "md", 12, 0, 300], [9, 1, "md", 12, 0, 300], [9, 8, "md", 12, 0, 300], [9, 16, "md", 12, 0, 300], [9, 22, "md", 12, 0, 300], [9, 29, "md", 12, 0, 300], [10, 13, "md", 12, 0, 300], [10, 27, "md", 12, 0, 300], [11, 24, "md", 12, 0, 300], [12, 1, "md", 12, 0, 300], [12, 22, "md", 12, 0, 300]], "2011": [[1, 5, "md", 12, 0, 300], [1, 12, "md", 12, 0, 300], [1, 19, "md", 12, 0, 300], [1, 26, "md", 12, 0, 300], [2, 1, "md", 12, 0, 300], [2, 2, "md", 12, 0, 300], [2, 9, "md", 12, 0, 300], [2, 23, "md", 12, 0, 300], [3, 2, "md", 12, 0, 300], [3, 9, "md", 12, 0, 300], [3, 29, "md", 12, 0, 300], [4, 6, "md", 16, 30, 5400], [4, 13, "md", 16, 30, 5400], [4, 27, "md", 16, 30, 5400], [5, 4, "md", 16, 30, 5400], [5, 12, "md", 16, 30, 5400], [5, 25, "md", 16, 30, 5400], [6, 1, "md", 16, 30, 5400], [6, 8, "md", 16, 30, 5400], [6, 15, "md", 16, 30, 5400], [6, 22, "md", 16, 30, 5400], [6, 29, "md", 16, 30, 5400], [7, 6, "md", 16, 30, 5400], [7, 13, "md", 16, 30, 5400], [7, 24, "md", 16, 30, 5400], [7, 26, "md", 16, 30, 5400], [7, 28, "md", 16, 30, 5400], [8, 10, "md", 16, 30, 5400], [8, 24, "md", 16, 30, 5400], [9, 7, "md", 16, 30, 5400], [9, 14, "md", 16, 30, 5400], [9, 21, "md", 16, 30, 5400], [9, 28, "md", 16, 30, 5400], [10, 5, "md", 16, 30, 5400], [10, 12, "md", 16, 30, 5400], [10, 26, "md", 16, 30, 5400], [11, 2, "md", 16, 30, 5400], [11, 13, "md", 17, 30, 5400], [11, 15, "md", 17, 30, 5400], [11, 17, "md", 17, 30, 5400], [11, 30, "md", 17, 30, 5400], [12, 7, "md", 17, 30, 5400], [12, 14, "md", 17, 30, 5400], [12, 21, "md", 17, 30, 5400]], "2012": [[1, 4, "md", 17, 30, 5400], [1, 11, "md", 17, 30, 5400], [1, 18, "md", 17, 30, 5400], [1, 25, "md", 17, 30, 5400], [2, 8, "md", 17, 30, 5400], [2, 22, "md", 17, 30, 5400], [2, 29, "md", 17, 30, 5400], [3, 7, "md", 17, 30, 5400], [3, 14, "md", 16, 30, 5400], [3, 25, "md", 16, 30, 5400], [3, 27, "md", 16, 30, 5400], [3, 29, "md", 16, 30, 5400], [4, 11, "md", 16, 30, 5400], [4, 18, "md", 16, 30, 5400], [4, 25, "md", 16, 30, 5400], [5, 2, "md", 16, 30, 5400], [5, 10, "md", 16, 30, 5400], [5, 16, "md", 16, 30, 5400], [5, 23, "md", 16, 30, 5400], [5, 30, "md", 16, 30, 5400], [6, 6, "md", 16, 30, 5400], [6, 13, "md", 16, 30, 5400], [6, 27, "md", 16, 30, 5400], [7, 11, "md", 16, 30, 5400], [7, 18, "md", 16, 30, 5400], [7, 25, "md", 16, 30, 5400], [7, 29, "md", 16, 30, 5400], [7, 31, "md", 16, 30, 5400], [8, 2, "md", 16, 30, 5400], [8, 15, "md", 16, 30, 5400], [8, 22, "md", 16, 30, 5400], [8, 29, "md", 16, 30, 5400], [9, 5, "md", 16, 30, 5400], [9, 12, "md", 16, 30, 5400], [9, 19, "md", 16, 30, 5400], [10, 3, "md", 16, 30, 5400], [10, 10, "md", 16, 30, 5400], [10, 24, "md", 16, 30, 5400], [11, 4, "md", 17, 30, 5400], [11, 6, "md", 17, 30, 5400], [11, 8, "md", 17, 30, 5400], [11, 28, "md", 17, 30, 5400], [12, 5, "md", 17, 30, 5400], [12, 12, "md", 17, 30, 5400], [12, 19, "md", 17, 30, 5400]], "2013": [[1, 9, "md", 17, 30, 5400], [1, 16, "md", 17, 30, 5400], [1, 30, "md", 17, 30, 5400], [2, 6, "md", 17, 30, 5400], [2, 13, "md", 17, 30, 5400], [2, 27, "md", 17, 30, 5400], [3, 10, "md", 12, 0, 300], [3, 12, "md", 12, 0, 300], [3, 14, "md", 12, 0, 300], [3, 27, "md", 14, 0, 5400], [4, 3, "md", 14, 0, 5400], [4, 10, "md", 14, 0, 5400], [4, 24, "md", 14, 0, 5400], [5, 1, "md", 14, 0, 5400], [5, 9, "md", 14, 0, 5400], [5, 22, "md", 14, 0, 5400], [6, 3, "md", 14, 0, 5400], [6, 12, "md", 14, 0, 5400], [6, 19, "md", 14, 0, 5400], [6, 26, "md", 14, 0, 5400], [7, 3, "md", 14, 0, 5400], [7, 10, "md", 14, 0, 5400], [7, 17, "md", 14, 0, 5400], [7, 28, "md", 14, 0, 5400], [7, 30, "md", 14, 0, 5400], [8, 1, "md", 14, 0, 5400], [8, 14, "md", 14, 0, 5400], [8, 28, "md", 14, 0, 5400], [9, 4, "md", 14, 0, 5400], [9, 11, "md", 14, 0, 5400], [9, 18, "md", 14, 0, 5400], [9, 25, "md", 14, 0, 5400], [10, 2, "md", 14, 0, 5400], [10, 9, "md", 14, 0, 5400], [10, 23, "md", 14, 0, 5400], [11, 3, "md", 15, 0, 5400], [11, 5, "md", 15, 0, 5400], [11, 7, "md", 15, 0, 5400], [11, 8, "md", 15, 0, 5400], [11, 13, "md", 15, 0, 5400], [11, 20, "md", 15, 0, 5400], [11, 27, "md", 15, 0, 5400], [12, 11, "md", 15, 0, 5400], [12, 18, "md", 15, 0, 5400]], "2014": [[1, 8, "md", 15, 0, 5400], [1, 15, "md", 15, 0, 5400], [1, 22, "md", 15, 0, 5400], [1, 29, "md", 15, 0, 5400], [2, 5, "md", 15, 0, 5400], [2, 12, "md", 15, 0, 5400], [2, 19, "md", 15, 0, 5400], [3, 2, "md", 15, 0, 5400], [3, 4, "md", 15, 0, 5400], [3, 6, "md", 15, 0, 5400], [3, 19, "md", 14, 0, 5400], [3, 26, "md", 14, 0, 5400], [4, 2, "md", 14, 0, 5400], [4, 9, "md", 14, 0, 5400], [4, 16, "md", 14, 0, 5400], [4, 30, "md", 14, 0, 5400], [5, 8, "md", 14, 0, 5400], [5, 14, "md", 14, 0, 5400], [5, 28, "md", 14, 0, 5400], [6, 4, "md", 14, 0, 5400], [6, 11, "md", 14, 0, 5400], [6, 25, "md", 14, 0, 5400], [7, 2, "md", 14, 0, 5400], [7, 9, "md", 14, 0, 5400], [7, 20, "md", 14, 0, 5400], [8, 6, "md", 14, 0, 5400], [8, 13, "md", 14, 0, 5400], [8, 27, "md", 14, 0, 5400], [9, 3, "md", 14, 0, 5400], [9, 10, "md", 14, 0, 5400], [9, 24, "md", 14, 0, 5400], [10, 1, "md", 14, 0, 5400], [10, 8, "md", 14, 0, 5400], [10, 22, "md", 14, 0, 5400], [10, 29, "md", 14, 0, 5400], [11, 9, "md", 15, 0, 5400], [11, 10, "md", 15, 0, 5400], [11, 11, "md", 15, 0, 5400], [11, 13, "md", 15, 0, 5400], [11, 26, "md", 15, 0, 5400], [12, 3, "md", 15, 0, 5400], [12, 10, "md", 15, 0, 5400]], "2015": [[1, 7, "md", 15, 0, 5400], [1, 14, "md", 15, 0, 5400], [1, 21, "md", 15, 0, 5400], [2, 4, "md", 15, 0, 5400], [2, 11, "md", 15, 0, 5400], [2, 25, "md", 15, 0, 5400], [3, 4, "md", 15, 0, 5400], [3, 11, "md", 14, 0, 5400], [3, 22, "md", 14, 0, 5400], [3, 24, "md", 14, 0, 5400], [3, 26, "md", 14, 0, 5400], [4, 8, "md", 14, 0, 5400], [4, 15, "md", 15, 0, 5400], [4, 29, "md", 15, 0, 5400], [5, 13, "md", 15, 0, 5400], [5, 27, "md", 15, 0, 5400], [6, 3, "md", 15, 0, 5400], [6, 10, "md", 15, 0, 5400], [6, 24, "md", 15, 0, 5400], [7, 1, "md", 15, 0, 5400], [7, 8, "md", 15, 0, 5400], [7, 19, "md", 15, 0, 5400], [7, 20, "md", 15, 0, 5400], [7, 23, "md", 15, 0, 5400], [7, 24, "md", 15, 0, 5400], [8, 5, "md", 15, 0, 5400], [8, 12, "md", 15, 0, 5400], [8, 26, "md", 15, 0, 5400], [9, 2, "md", 15, 0, 5400], [9, 9, "md", 15, 0, 5400], [9, 23, "md", 15, 0, 5400], [10, 7, "md", 15, 0, 5400], [10, 14, "md", 15, 0, 5400], [10, 21, "md", 15, 0, 5400], [11, 1, "md", 16, 0, 5400], [11, 5, "md", 16, 0, 5400], [11, 18, "md", 16, 0, 5400], [11, 25, "md", 16, 0, 5400], [12, 9, "md", 16, 0, 5400], [12, 16, "md", 16, 0, 5400]], "2016": [[1, 6, "md", 16, 0, 5400], [1, 13, "md", 16, 0, 5400], [1, 27, "md", 16, 0, 5400], [2, 3, "md", 16, 0, 5400], [2, 10, "md", 16, 0, 5400], [2, 24, "md", 16, 0, 5400], [3, 2, "md", 16, 0, 5400], [3, 9, "md", 16, 0, 5400], [3, 23, "md", 15, 0, 5400], [4, 3, "md", 12, 0, 300], [4, 7, "md", 12, 0, 300], [4, 20, "md", 12, 0, 300], [4, 27, "md", 12, 0, 300], [5, 4, "md", 12, 0, 300], [5, 11, "md", 12, 0, 300], [5, 25, "md", 12, 0, 300], [6, 1, "md", 12, 0, 300], [6, 8, "md", 12, 0, 300], [6, 22, "md", 12, 0, 300], [7, 6, "md", 12, 0, 300], [7, 17, "md", 12, 0, 300], [7, 21, "md", 12, 0, 300], [8, 3, "md", 12, 0, 300], [8, 17, "md", 12, 0, 300], [8, 31, "md", 12, 0, 300], [9, 14, "md", 12, 0, 300], [9, 28, "md", 12, 0, 300], [10, 5, "md", 12, 0, 300], [10, 12, "md", 12, 0, 300], [10, 26, "md", 12, 0, 300], [11, 2, "md", 12, 0, 300], [11, 13, "md", 12, 0, 300], [11, 17, "md", 12, 0, 300], [11, 30, "md", 20, 0, 5400], [12, 7, "md", 20, 0, 5400], [12, 14, "md", 20, 0, 5400]], "2017": [[1, 4, "md", 20, 0, 5400], [1, 11, "md", 20, 0, 5400], [1, 25, "md", 20, 0, 5400], [2, 1, "md", 20, 0, 5400], [2, 8, "md", 20, 0, 5400], [2, 22, "md", 20, 0, 5400], [3, 1, "md", 20, 0, 5400], [3, 8, "md", 20, 0, 5400], [3, 15, "md", 20, 0, 5400], [3, 26, "md", 20, 0, 5400], [3, 29, "md", 20, 0, 5400], [3, 30, "md", 20, 0, 5400], [4, 12, "md", 20, 0, 5400], [4, 26, "md", 20, 0, 5400], [5, 3, "md", 20, 0, 5400], [5, 10, "md", 20, 0, 5400], [5, 24, "md", 20, 0, 5400], [6, 7, "md", 20, 0, 5400], [6, 14, "md", 20, 0, 5400], [6, 28, "md", 20, 0, 5400], [7, 5, "md", 20, 0, 5400], [7, 16, "md", 20, 0, 5400], [7, 17, "md", 20, 0, 5400], [7, 20, "md", 20, 0, 5400], [8, 2, "md", 20, 0, 5400], [8, 9, "md", 20, 0, 5400], [8, 23, "md", 20, 0, 5400], [9, 6, "md", 20, 0, 5400], [9, 13, "md", 20, 0, 5400], [9, 27, "md", 20, 0, 5400], [10, 4, "md", 20, 0, 5400], [10, 18, "md", 20, 0, 5400], [10, 25, "md", 20, 0, 5400], [11, 1, "md", 20, 0, 5400], [11, 12, "md", 20, 0, 5400], [11, 13, "md", 20, 0, 5400], [11, 29, "md", 20, 0, 5400], [12, 6, "md", 20, 0, 5400], [12, 13, "md", 20, 0, 5400]], "2018": [[1, 10, "md", 20, 0, 5400], [1, 17, "md", 20, 0, 5400], [1, 31, "md", 20, 0, 5400], [2, 7, "md", 20, 0, 5400], [2, 14, "md", 20, 0, 5400], [2, 28, "md", 20, 0, 5400], [3, 7, "md", 20, 0, 5400], [3, 18, "md", 20, 0, 5400], [3, 19, "md", 20, 0, 5400], [3, 22, "md", 20, 0, 5400], [4, 4, "md", 20, 0, 5400], [4, 11, "md", 20, 0, 5400], [5, 9, "md", 20, 0, 5400], [5, 16, "md", 20, 0, 5400], [5, 30, "md", 20, 0, 5400], [6, 6, "md", 20, 0, 5400], [6, 13, "md", 20, 0, 5400], [6, 27, "md", 20, 0, 5400], [7, 3, "md", 20, 0, 5400], [7, 15, "md", 20, 0, 5400], [7, 16, "md", 20, 0, 5400], [7, 19, "md", 20, 0, 5400], [8, 1, "md", 20, 0, 5400], [8, 8, "md", 20, 0, 5400], [8, 22, "md", 20, 0, 5400], [9, 5, "md", 20, 0, 5400], [9, 12, "md", 20, 0, 5400], [9, 26, "md", 20, 0, 5400], [10, 3, "md", 20, 0, 5400], [10, 10, "md", 20, 0, 5400], [10, 24, "md", 20, 0, 5400], [11, 4, "md", 20, 0, 5400], [11, 5, "md", 20, 0, 5400], [11, 8, "md", 20, 0, 5400], [11, 21, "md", 20, 0, 5400], [11, 28, "md", 20, 0, 5400], [12, 5, "md", 20, 0, 5400], [12, 19, "md", 20, 0, 5400]], "2019": [[1, 9, "md", 20, 0, 5400], [1, 16, "md", 20, 0, 5400], [1, 23, "md", 20, 0, 5400], [2, 6, "md", 20, 0, 5400], [2, 13, "md", 20, 0, 5400], [2, 27, "md", 20, 0, 5400], [3, 6, "md", 20, 0, 5400], [3, 13, "md", 20, 0, 5400], [3, 24, "md", 12, 0, 300], [3, 25, "md", 12, 0, 300], [3, 28, "md", 12, 0, 300], [4, 10, "md", 13, 30, 3600], [4, 17, "md", 13, 30, 3600], [5, 1, "md", 13, 30, 3600], [5, 8, "md", 13, 30, 3600], [5, 29, "md", 13, 30, 3600], [6, 12, "md", 13, 30, 3600], [6, 26, "md", 13, 30, 3600], [7, 10, "md", 13, 30, 3600], [7, 21, "md", 13, 30, 3600], [7, 25, "md", 13, 30, 3600], [8, 7, "md", 13, 30, 3600], [8, 21, "md", 13, 30, 3600], [8, 28, "md", 13, 30, 3600], [9, 4, "md", 13, 30, 3600], [9, 18, "md", 13, 30, 3600], [10, 2, "md", 13, 30, 3600], [10, 16, "md", 21, 30, 3600], [10, 30, "md", 21, 30, 3600], [11, 17, "md", 21, 30, 3600], [11, 18, "md", 21, 30, 3600], [11, 21, "md", 21, 30, 3600], [12, 4, "md", 21, 30, 3600], [12, 11, "md", 21, 30, 3600], [12, 18, "md", 21, 30, 3600]], "2020": [[1, 8, "md", 21, 30, 3600], [1, 15, "md", 21, 30, 3600], [1, 22, "md", 21, 30, 3600], [2, 5, "md", 21, 30, 3600], [2, 12, "md", 21, 30, 3600], [2, 19, "md", 21, 30, 3600], [3, 4, "md", 21, 30, 3600], [3, 11, "md", 21, 30, 3600], [3, 18, "md", 21, 30, 3600], [4, 1, "md", 13, 30, 3600], [4, 8, "md", 13, 30, 3600], [4, 15, "md", 13, 30, 3600], [4, 29, "md", 13, 30, 3600], [5, 13, "md", 13, 30, 3600], [5, 20, "md", 13, 30, 3600], [5, 27, "md", 13, 30, 3600], [6, 10, "md", 13, 30, 3600], [6, 17, "md", 13, 30, 3600], [7, 1, "md", 13, 30, 3600], [7, 15, "md", 13, 30, 3600], [8, 12, "md", 13, 30, 3600], [8, 26, "md", 13, 30, 3600], [9, 9, "md", 13, 30, 3600], [9, 23, "md", 13, 30, 3600], [10, 7, "md", 13, 30, 3600], [10, 14, "md", 13, 30, 3600], [10, 21, "md", 21, 30, 3600], [11, 4, "md", 21, 30, 3600], [12, 2, "md", 21, 30, 3600], [12, 16, "md", 21, 30, 3600]], "2021": [[1, 6, "md", 21, 30, 3600], [1, 13, "md", 21, 30, 3600], [1, 20, "md", 21, 30, 3600], [1, 27, "md", 21, 30, 3600], [2, 3, "md", 21, 30, 3600], [2, 10, "md", 21, 30, 3600], [2, 17, "md", 21, 30, 3600], [2, 24, "md", 21, 30, 3600], [3, 3, "md", 21, 30, 3600], [3, 24, "md", 14, 0, 3600], [3, 31, "md", 14, 0, 3600], [4, 7, "md", 14, 0, 3600], [4, 14, "md", 14, 0, 3600], [4, 21, "md", 14, 0, 3600], [5, 5, "md", 14, 0, 3600], [5, 12, "md", 14, 0, 3600], [5, 19, "md", 14, 0, 3600], [5, 26, "md", 14, 0, 3600], [6, 2, "md", 14, 0, 3600], [6, 16, "md", 14, 0, 3600], [6, 23, "md", 14, 0, 3600], [6, 30, "md", 14, 0, 3600], [7, 14, "md", 14, 0, 3600], [7, 21, "md", 14, 0, 3600], [8, 11, "md", 14, 0, 3600], [8, 25, "md", 14, 0, 3600], [9, 1, "md", 14, 0, 3600], [9, 8, "md", 14, 0, 3600], [9, 22, "md", 14, 0, 3600], [10, 6, "md", 14, 0, 3600], [10, 20, "md", 14, 0, 3600], [10, 27, "md", 14, 0, 3600], [11, 17, "md", 15, 0, 3600], [12, 1, "md", 15, 0, 3600], [12, 8, "md", 15, 0, 3600], [12, 15, "md", 15, 0, 3600]], "2022": [[1, 12, "md", 15, 0, 3600], [1, 19, "md", 15, 0, 3600], [2, 2, "md", 15, 0, 3600], [2, 16, "md", 15, 0, 3600], [2, 23, "md", 15, 0, 3600], [3, 2, "md", 15, 0, 3600], [3, 9, "md", 15, 0, 3600], [3, 20, "md", 14, 0, 3600], [4, 6, "md", 14, 0, 3600], [4, 13, "md", 14, 0, 3600], [4, 20, "md", 14, 0, 3600], [4, 27, "md", 14, 0, 3600], [5, 4, "md", 14, 0, 3600], [5, 11, "md", 14, 0, 3600], [6, 1, "md", 14, 0, 3600], [6, 15, "md", 14, 0, 3600], [6, 22, "md", 14, 0, 3600], [6, 29, "md", 14, 0, 3600], [7, 6, "md", 14, 0, 3600], [7, 24, "md", 14, 0, 3600], [7, 26, "md", 14, 0, 3600], [8, 10, "md", 14, 0, 3600], [8, 24, "md", 14, 0, 3600], [9, 7, "md", 14, 0, 3600], [9, 21, "md", 14, 0, 3600], [9, 28, "md", 14, 0, 3600], [10, 5, "md", 14, 0, 3600], [10, 12, "md", 14, 0, 3600], [10, 26, "md", 14, 0, 3600], [11, 6, "md", 15, 0, 3600], [11, 8, "md", 15, 0, 3600], [11, 10, "md", 15, 0, 3600], [11, 23, "md", 15, 0, 3600], [12, 7, "md", 15, 0, 3600], [12, 14, "md", 15, 0, 3600]]} diff --git a/ietf/meeting/management/commands/import_iab_minutes.py b/ietf/meeting/management/commands/import_iab_minutes.py new file mode 100644 index 000000000..d8b819490 --- /dev/null +++ b/ietf/meeting/management/commands/import_iab_minutes.py @@ -0,0 +1,141 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +import datetime +import json +import os +import shutil +import subprocess +import tempfile + +from pathlib import Path +from django.conf import settings +from django.core.management.base import BaseCommand + +from ietf.doc.models import Document, DocAlias, DocEvent +from ietf.meeting.models import ( + Meeting, + Schedule, + Session, + SchedulingEvent, + SchedTimeSessAssignment, + TimeSlot, +) + + +def nametimes_by_year(): + with Path(__file__).parent.joinpath("data_for_import_iab_minutes").open() as file: + return json.loads(file.read()) + + +class Command(BaseCommand): + help = "Performs a one-time import of older IAB minutes, creating Meetings to attach them to" + + def handle(self, *args, **options): + tmpdir = tempfile.mkdtemp() + process = subprocess.Popen( + ["git", "clone", "https://github.com/kesara/iab-scraper.git", tmpdir], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = process.communicate() + if not Path(tmpdir).joinpath("iab_minutes", "2022-12-14.md").exists(): + print("Git clone of the iab-scraper directory did not go as expected") + print("stdout:", stdout) + print("stderr:", stderr) + print(f"Clean up {tmpdir} manually") + exit(-1) + + ntby = nametimes_by_year() + for year in ntby: + counter = 1 + for month, day, ext, start_hour, start_minute, duration in ntby[year]: + start = datetime.datetime( + int(year), + month, + day, + start_hour, + start_minute, + tzinfo=datetime.timezone.utc, + ) + meeting_name = f"interim-{year}-iab-{counter:02d}" + minutes_docname = f"minutes-interim-{year}-iab-{counter:02d}-{start:%Y%m%d}" # Note violating the convention of having the start time... + minutes_filename = f"{minutes_docname}-00.{ext}" + # Create Document + doc = Document.objects.create( + name=minutes_docname, + type_id="minutes", + title=f"Minutes {meeting_name} {start:%Y-%m-%d}", # Another violation of convention, + group_id=7, # The IAB group + rev="00", + uploaded_filename=minutes_filename, + ) + DocAlias.objects.create(name=doc.name).docs.add(doc) + e = DocEvent.objects.create( + type="comment", + doc=doc, + rev="00", + by_id=1, # The "(System)" person + desc="Minutes moved into datatracker from iab wordpress website", + ) + doc.save_with_history([e]) + # Create Meeting - Add a note about noon utc fake meeting times + meeting = Meeting.objects.create( + number=meeting_name, + type_id="interim", + date=start.date(), + days=1, + time_zone=start.tzname(), + ) + schedule = Schedule.objects.create( + meeting=meeting, + owner_id=1, # The "(System)" person + visible=True, + public=True, + ) + meeting.schedule = schedule + if start.timetz() == datetime.time( + 12, 0, 0, tzinfo=datetime.timezone.utc + ): + meeting.agenda_note = "The actual time of this meeting was not recorded and was likely not at noon UTC" + meeting.save() + # Create Session + session = Session.objects.create( + meeting=meeting, + group_id=7, # The IAB group + type_id="regular", + purpose_id="regular", + ) + # Schedule the Session + SchedulingEvent.objects.create( + session=session, + status_id="sched", + by_id=1, # (System) + ) + timeslot = TimeSlot.objects.create( + meeting=meeting, + type_id="regular", + time=start, + duration=datetime.timedelta(seconds=duration), + ) + SchedTimeSessAssignment.objects.create( + timeslot=timeslot, session=session, schedule=schedule + ) + # Add Document to Session + session.sessionpresentation_set.create(document=doc, rev=doc.rev) + + # Put file in place + source = Path(tmpdir).joinpath( + "iab_minutes", f"{year}-{month:02d}-{day:02d}.{ext}" + ) + dest = Path(settings.AGENDA_PATH).joinpath( + meeting_name, "minutes", minutes_filename + ) + if dest.exists(): + print(f"WARNING: {dest} already exists - not overwriting it.") + else: + os.makedirs(dest.parent, exist_ok=True) + shutil.copy(source, dest) + + counter += 1 + + shutil.rmtree(tmpdir) diff --git a/ietf/meeting/management/commands/regenerate_data_for_import_iab_minutes.py b/ietf/meeting/management/commands/regenerate_data_for_import_iab_minutes.py new file mode 100644 index 000000000..1420094c6 --- /dev/null +++ b/ietf/meeting/management/commands/regenerate_data_for_import_iab_minutes.py @@ -0,0 +1,872 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +import datetime +import json + +from collections import defaultdict +from pathlib import Path +from zoneinfo import ZoneInfo + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + help = "Regenerates the json used by import_iab_minutes" + + def handle(self, *args, **options): + ntby = build_nametimes_by_year() + with Path(__file__).parent.joinpath("data_for_import_iab_minutes").open( + "w" + ) as file: + file.write(json.dumps(ntby, sort_keys=True)) + + +def make_time_tuple(date, start_hour, start_minute, end_hour, end_minute, tz): + start = datetime.datetime( + date.year, date.month, date.day, start_hour, start_minute, tzinfo=ZoneInfo(tz) + ).astimezone(datetime.timezone.utc) + end = datetime.datetime( + date.year, date.month, date.day, end_hour, end_minute, tzinfo=ZoneInfo(tz) + ).astimezone(datetime.timezone.utc) + return (start.hour, start.minute, (end - start).seconds) + + +def get_time(name): + """ + From Cindy: + 2011-04-06 (and likely earlier) - 2013-02-27: 0930-1100 PST8PDT + 2013-03-27 - 2015-04-08: 0700-0830 PST8PDT + 2015-04-15 - 2016-03-23: 0800-0930 PST8PDT + 2016-04-20 - 2016-11-02: 0700-0830 PST8PDT + 2016-11-20 - 2019-03-13: 2000-2130 UTC + 2019-04-10 - 2019-10-02: 1330-1430 UTC + 2019-10-16 - 2020-03-18: 2130-2230 UTC + 2020-04-01 - 2020-10-14: 1330-1430 UTC + 2020-10-21 - 2021-03-03: 2130-2230 UTC + 2021-03-24 - Present: 0700-0800 PST8PDT + """ + date_string = name.split(".")[0] + date = datetime.date(*map(int, date_string.split("-"))) + times = None + if datetime.date(2011, 4, 6) <= date <= datetime.date(2013, 2, 27): + times = make_time_tuple(date, 9, 30, 11, 0, "PST8PDT") + elif datetime.date(2013, 3, 27) <= date <= datetime.date(2015, 4, 8): + times = make_time_tuple(date, 7, 0, 8, 30, "PST8PDT") + elif datetime.date(2015, 4, 15) <= date <= datetime.date(2016, 3, 23): + times = make_time_tuple(date, 8, 0, 9, 30, "PST8PDT") + elif datetime.date(2016, 11, 20) <= date <= datetime.date(2019, 3, 13): + times = make_time_tuple(date, 20, 0, 21, 30, "UTC") + elif datetime.date(2019, 4, 10) <= date <= datetime.date(2019, 10, 2): + times = make_time_tuple(date, 13, 30, 14, 30, "UTC") + elif datetime.date(2019, 10, 16) <= date <= datetime.date(2020, 3, 18): + times = make_time_tuple(date, 21, 30, 22, 30, "UTC") + elif datetime.date(2020, 4, 1) <= date <= datetime.date(2020, 10, 14): + times = make_time_tuple(date, 13, 30, 14, 30, "UTC") + elif datetime.date(2020, 10, 21) <= date <= datetime.date(2021, 3, 3): + times = make_time_tuple(date, 21, 30, 22, 30, "UTC") + elif datetime.date(2021, 3, 24) <= date: + times = make_time_tuple(date, 7, 0, 8, 0, "PST8PDT") + else: + times = make_time_tuple(date, 12, 0, 12, 5, "UTC") + return times + + +def build_nametimes_by_year(): + scraped_basenames = [ + "2022-12-14.md", + "2022-12-07.md", + "2022-11-23.md", + "2022-11-10.md", + "2022-11-08.md", + "2022-11-06.md", + "2022-10-26.md", + "2022-10-12.md", + "2022-10-05.md", + "2022-09-28.md", + "2022-09-21.md", + "2022-09-07.md", + "2022-08-24.md", + "2022-08-10.md", + "2022-07-26.md", + "2022-07-24.md", + "2022-07-06.md", + "2022-06-29.md", + "2022-06-22.md", + "2022-06-15.md", + "2022-06-01.md", + "2022-05-11.md", + "2022-05-04.md", + "2022-04-27.md", + "2022-04-20.md", + "2022-04-13.md", + "2022-04-06.md", + "2022-03-20.md", + "2022-03-09.md", + "2022-03-02.md", + "2022-02-23.md", + "2022-02-16.md", + "2022-02-02.md", + "2022-01-19.md", + "2022-01-12.md", + "2021-12-15.md", + "2021-12-08.md", + "2021-12-01.md", + "2021-11-17.md", + "2021-10-27.md", + "2021-10-20.md", + "2021-10-06.md", + "2021-09-22.md", + "2021-09-08.md", + "2021-09-01.md", + "2021-08-25.md", + "2021-08-11.md", + "2021-07-21.md", + "2021-07-14.md", + "2021-06-30.md", + "2021-06-23.md", + "2021-06-16.md", + "2021-06-02.md", + "2021-05-26.md", + "2021-05-19.md", + "2021-05-12.md", + "2021-05-05.md", + "2021-04-21.md", + "2021-04-14.md", + "2021-04-07.md", + "2021-03-31.md", + "2021-03-24.md", + "2021-03-03.md", + "2021-02-24.md", + "2021-02-17.md", + "2021-02-10.md", + "2021-02-03.md", + "2021-01-27.md", + "2021-01-20.md", + "2021-01-13.md", + "2021-01-06.md", + "2020-12-16.md", + "2020-12-02.md", + "2020-11-04.md", + "2020-10-21.md", + "2020-10-14.md", + "2020-10-07.md", + "2020-09-23.md", + "2020-09-09.md", + "2020-08-26.md", + "2020-08-12.md", + "2020-07-15.md", + "2020-07-01.md", + "2020-06-17.md", + "2020-06-10.md", + "2020-05-27.md", + "2020-05-20.md", + "2020-05-13.md", + "2020-04-29.md", + "2020-04-15.md", + "2020-04-08.md", + "2020-04-01.md", + "2020-03-18.md", + "2020-03-11.md", + "2020-03-04.md", + "2020-02-19.md", + "2020-02-12.md", + "2020-02-05.md", + "2020-01-22.md", + "2020-01-15.md", + "2020-01-08.md", + "2019-12-18.md", + "2019-12-11.md", + "2019-12-04.md", + "2019-11-21.md", + "2019-11-18.md", + "2019-11-17.md", + "2019-10-30.md", + "2019-10-16.md", + "2019-10-02.md", + "2019-09-18.md", + "2019-09-04.md", + "2019-08-28.md", + "2019-08-21.md", + "2019-08-07.md", + "2019-07-25.md", + "2019-07-21.md", + "2019-07-10.md", + "2019-06-26.md", + "2019-06-12.md", + "2019-05-29.md", + "2019-05-08.md", + "2019-05-01.md", + "2019-04-17.md", + "2019-04-10.md", + "2019-03-28.md", + "2019-03-25.md", + "2019-03-24.md", + "2019-03-13.md", + "2019-03-06.md", + "2019-02-27.md", + "2019-02-13.md", + "2019-02-06.md", + "2019-01-23.md", + "2019-01-16.md", + "2019-01-09.md", + "2018-12-19.md", + "2018-12-05.md", + "2018-11-28.md", + "2018-11-21.md", + "2018-11-08.md", + "2018-11-05.md", + "2018-11-04.md", + "2018-10-24.md", + "2018-10-10.md", + "2018-10-03.md", + "2018-09-26.md", + "2018-09-12.md", + "2018-09-05.md", + "2018-08-22.md", + "2018-08-08.md", + "2018-08-01.md", + "2018-07-19.md", + "2018-07-16.md", + "2018-07-15.md", + "2018-07-03.md", + "2018-06-27.md", + "2018-06-13.md", + "2018-06-06.md", + "2018-05-30.md", + "2018-05-16.md", + "2018-05-09.md", + "2018-04-11.md", + "2018-04-04.md", + "2018-03-22.md", + "2018-03-19.md", + "2018-03-18.md", + "2018-03-07.md", + "2018-02-28.md", + "2018-02-14.md", + "2018-02-07.md", + "2018-01-31.md", + "2018-01-17.md", + "2018-01-10.md", + "2017-12-13.md", + "2017-12-06.md", + "2017-11-29.md", + "2017-11-13.md", + "2017-11-12.md", + "2017-11-01.md", + "2017-10-25.md", + "2017-10-18.md", + "2017-10-04.md", + "2017-09-27.md", + "2017-09-13.md", + "2017-09-06.md", + "2017-08-23.md", + "2017-08-09.md", + "2017-08-02.md", + "2017-07-20.md", + "2017-07-17.md", + "2017-07-16.md", + "2017-07-05.md", + "2017-06-28.md", + "2017-06-14.md", + "2017-06-07.md", + "2017-05-24.md", + "2017-05-10.md", + "2017-05-03.md", + "2017-04-26.md", + "2017-04-12.md", + "2017-03-30.md", + "2017-03-29.md", + "2017-03-26.md", + "2017-03-15.md", + "2017-03-08.md", + "2017-03-01.md", + "2017-02-22.md", + "2017-02-08.md", + "2017-02-01.md", + "2017-01-25.md", + "2017-01-11.md", + "2017-01-04.md", + "2016-12-14.md", + "2016-12-07.md", + "2016-11-30.md", + "2016-11-17.md", + "2016-11-13.md", + "2016-11-02.md", + "2016-10-26.md", + "2016-10-12.md", + "2016-10-05.md", + "2016-09-28.md", + "2016-09-14.md", + "2016-08-31.md", + "2016-08-17.md", + "2016-08-03.md", + "2016-07-21.md", + "2016-07-17.md", + "2016-07-06.md", + "2016-06-22.md", + "2016-06-08.md", + "2016-06-01.md", + "2016-05-25.md", + "2016-05-11.md", + "2016-05-04.md", + "2016-04-27.md", + "2016-04-20.md", + "2016-04-07.md", + "2016-04-03.md", + "2016-03-23.md", + "2016-03-09.md", + "2016-03-02.md", + "2016-02-24.md", + "2016-02-10.md", + "2016-02-03.md", + "2016-01-27.md", + "2016-01-13.md", + "2016-01-06.md", + "2015-12-16.md", + "2015-12-09.md", + "2015-11-25.md", + "2015-11-18.md", + "2015-11-05.md", + "2015-11-01.md", + "2015-10-21.md", + "2015-10-14.md", + "2015-10-07.md", + "2015-09-23.md", + "2015-09-09.md", + "2015-09-02.md", + "2015-08-26.md", + "2015-08-12.md", + "2015-08-05.md", + "2015-07-24.md", + "2015-07-23.md", + "2015-07-20.md", + "2015-07-19.md", + "2015-07-08.md", + "2015-07-01.md", + "2015-06-24.md", + "2015-06-10.md", + "2015-06-03.md", + "2015-05-27.md", + "2015-05-13.md", + "2015-04-29.md", + "2015-04-15.md", + "2015-04-08.md", + "2015-03-26.md", + "2015-03-24.md", + "2015-03-22.md", + "2015-03-11.md", + "2015-03-04.md", + "2015-02-25.md", + "2015-02-11.md", + "2015-02-04.md", + "2015-01-21.md", + "2015-01-14.md", + "2015-01-07.md", + "2014-12-10.md", + "2014-12-03.md", + "2014-11-26.md", + "2014-11-13.md", + "2014-11-11.md", + "2014-11-10.md", + "2014-11-09.md", + "2014-10-29.md", + "2014-10-22.md", + "2014-10-08.md", + "2014-10-01.md", + "2014-09-24.md", + "2014-09-10.md", + "2014-09-03.md", + "2014-08-27.md", + "2014-08-13.md", + "2014-08-06.md", + "2014-07-20.md", + "2014-07-09.md", + "2014-07-02.md", + "2014-06-25.md", + "2014-06-11.md", + "2014-06-04.md", + "2014-05-28.md", + "2014-05-14.md", + "2014-05-08.md", + "2014-04-30.md", + "2014-04-16.md", + "2014-04-09.md", + "2014-04-02.md", + "2014-03-26.md", + "2014-03-19.md", + "2014-03-06.md", + "2014-03-04.md", + "2014-03-02.md", + "2014-02-19.md", + "2014-02-12.md", + "2014-02-05.md", + "2014-01-29.md", + "2014-01-22.md", + "2014-01-15.md", + "2014-01-08.md", + "2013-12-18.md", + "2013-12-11.md", + "2013-11-27.md", + "2013-11-20.md", + "2013-11-13.md", + "2013-11-08.md", + "2013-11-07.md", + "2013-11-05.md", + "2013-11-03.md", + "2013-10-23.md", + "2013-10-09.md", + "2013-10-02.md", + "2013-09-25.md", + "2013-09-18.md", + "2013-09-11.md", + "2013-09-04.md", + "2013-08-28.md", + "2013-08-14.md", + "2013-08-01.md", + "2013-07-30.md", + "2013-07-28.md", + "2013-07-17.md", + "2013-07-10.md", + "2013-07-03.md", + "2013-06-26.md", + "2013-06-19.md", + "2013-06-12.md", + "2013-06-03.md", + "2013-05-22.md", + "2013-05-09.md", + "2013-05-01.md", + "2013-04-24.md", + "2013-04-10.md", + "2013-04-03.md", + "2013-03-27.md", + "2013-03-14.md", + "2013-03-12.md", + "2013-03-10.md", + "2013-02-27.md", + "2013-02-13.md", + "2013-02-06.md", + "2013-01-30.md", + "2013-01-16.md", + "2013-01-09.md", + "2012-12-19.md", + "2012-12-12.md", + "2012-12-05.md", + "2012-11-28.md", + "2012-11-08.md", + "2012-11-06.md", + "2012-11-04.md", + "2012-10-24.md", + "2012-10-10.md", + "2012-10-03.md", + "2012-09-19.md", + "2012-09-12.md", + "2012-09-05.md", + "2012-08-29.md", + "2012-08-22.md", + "2012-08-15.md", + "2012-08-02.md", + "2012-07-31.md", + "2012-07-29.md", + "2012-07-25.md", + "2012-07-18.md", + "2012-07-11.md", + "2012-06-27.md", + "2012-06-13.md", + "2012-06-06.md", + "2012-05-30.md", + "2012-05-23.md", + "2012-05-16.md", + "2012-05-10.md", + "2012-05-02.md", + "2012-04-25.md", + "2012-04-18.md", + "2012-04-11.md", + "2012-03-29.md", + "2012-03-27.md", + "2012-03-25.md", + "2012-03-14.md", + "2012-03-07.md", + "2012-02-29.md", + "2012-02-22.md", + "2012-02-08.md", + "2012-01-25.md", + "2012-01-18.md", + "2012-01-11.md", + "2012-01-04.md", + "2011-12-21.md", + "2011-12-14.md", + "2011-12-07.md", + "2011-11-30.md", + "2011-11-17.md", + "2011-11-15.md", + "2011-11-13.md", + "2011-11-02.md", + "2011-10-26.md", + "2011-10-12.md", + "2011-10-05.md", + "2011-09-28.md", + "2011-09-21.md", + "2011-09-14.md", + "2011-09-07.md", + "2011-08-24.md", + "2011-08-10.md", + "2011-07-28.md", + "2011-07-26.md", + "2011-07-24.md", + "2011-07-13.md", + "2011-07-06.md", + "2011-06-29.md", + "2011-06-22.md", + "2011-06-15.md", + "2011-06-08.md", + "2011-06-01.md", + "2011-05-25.md", + "2011-05-12.md", + "2011-05-04.md", + "2011-04-27.md", + "2011-04-13.md", + "2011-04-06.md", + "2011-03-29.md", + "2011-03-09.md", + "2011-03-02.md", + "2011-02-23.md", + "2011-02-09.md", + "2011-02-02.md", + "2011-02-01.md", + "2011-01-26.md", + "2011-01-19.md", + "2011-01-12.md", + "2011-01-05.md", + "2010-12-22.md", + "2010-12-01.md", + "2010-11-24.md", + "2010-10-27.md", + "2010-10-13.md", + "2010-09-29.md", + "2010-09-22.md", + "2010-09-16.md", + "2010-09-08.md", + "2010-09-01.md", + "2010-08-25.md", + "2010-08-11.md", + "2010-07-14.md", + "2010-07-07.md", + "2010-06-23.md", + "2010-06-02.md", + "2010-05-12.md", + "2010-04-28.md", + "2010-04-14.md", + "2010-04-07.md", + "2010-03-10.md", + "2010-03-03.md", + "2010-02-24.md", + "2010-02-10.md", + "2010-02-03.md", + "2010-02-01.md", + "2010-01-27.md", + "2010-01-20.md", + "2010-01-13.md", + "2010-01-07.md", + "2010-01-06.md", + "2009-12-09.md", + "2009-12-02.md", + "2009-11-25.md", + "2009-11-04.md", + "2009-10-28.md", + "2009-10-21.md", + "2009-10-14.md", + "2009-10-07.md", + "2009-09-25.md", + "2009-09-23.md", + "2009-09-09.md", + "2009-09-02.md", + "2009-08-12.md", + "2009-07-01.md", + "2009-06-24.md", + "2009-06-10.md", + "2009-06-03.md", + "2009-05-27.md", + "2009-05-13.md", + "2009-04-08.md", + "2009-04-01.md", + "2009-03-18.md", + "2009-03-04.md", + "2009-02-25.md", + "2009-02-18.md", + "2009-02-05.md", + "2009-02-04.md", + "2009-01-28.md", + "2009-01-21.md", + "2009-01-14.md", + "2009-01-07.md", + "2008-12-17.md", + "2008-12-03.md", + "2008-11-05.md", + "2008-10-15.md", + "2008-10-08.md", + "2008-10-03.md", + "2008-10-01.md", + "2008-09-24.md", + "2008-09-17.md", + "2008-09-03.md", + "2008-08-27.md", + "2008-08-20.md", + "2008-08-13.md", + "2008-08-06.md", + "2008-07-23.md", + "2008-07-16.md", + "2008-07-02.md", + "2008-06-25.md", + "2008-06-18.md", + "2008-06-12.md", + "2008-06-04.md", + "2008-05-28.md", + "2008-05-21.md", + "2008-05-07.md", + "2008-04-16.md", + "2008-04-02.md", + "2008-03-26.md", + "2008-02-20.md", + "2008-02-13.md", + "2008-02-06.md", + "2008-01-30.md", + "2008-01-16.md", + "2008-01-09.md", + "2007-12-19.md", + "2007-11-21.md", + "2007-11-07.md", + "2007-10-17.md", + "2007-10-03.md", + "2007-09-19.md", + "2007-09-05.md", + "2007-08-15.md", + "2007-07-26.md", + "2007-07-24.md", + "2007-07-11.md", + "2007-06-20.md", + "2007-06-06.md", + "2007-05-16.md", + "2007-05-02.md", + "2007-04-18.md", + "2007-04-04.md", + "2007-03-18.md", + "2007-03-07.md", + "2007-02-21.md", + "2007-02-07.md", + "2007-01-24.md", + "2007-01-10.md", + "2006-12-20.md", + "2006-12-06.md", + "2006-11-22.md", + "2006-11-05.md", + "2006-11-01.md", + "2006-10-25.md", + "2006-10-04.md", + "2006-09-20.md", + "2006-09-06.md", + "2006-08-30.md", + "2006-08-02.md", + "2006-07-09.md", + "2006-07-05.md", + "2006-06-21.md", + "2006-06-07.md", + "2006-05-17.md", + "2006-05-03.md", + "2006-04-17.md", + "2006-04-05.md", + "2006-03-19.md", + "2006-03-15.md", + "2006-02-15.md", + "2006-02-01.md", + "2006-01-18.md", + "2006-01-04.md", + "2005-12-21.md", + "2005-12-07.md", + "2005-11-10.md", + "2005-11-02.md", + "2005-10-12.md", + "2005-09-14.md", + "2005-08-02.md", + "2005-07-13.md", + "2005-06-10.md", + "2005-05-11.md", + "2005-04-13.md", + "2005-03-07.md", + "2005-03-01.md", + "2005-02-08.md", + "2005-01-11.md", + "2004-12-14.md", + "2004-11-07.md", + "2004-10-12.md", + "2004-09-14.md", + "2004-08-03.md", + "2004-07-13.md", + "2004-06-08.md", + "2004-05-11.md", + "2004-04-13.md", + "2004-03-02.md", + "2004-02-10.md", + "2004-01-13.md", + "2003-12-09.md", + "2003-11-09.md", + "2003-11-04.md", + "2003-10-14.md", + "2003-09-09.md", + "2003-08-12.md", + "2003-07-17.md", + "2003-07-08.md", + "2003-06-10.md", + "2003-05-13.md", + "2003-04-08.md", + "2003-03-18.md", + "2003-03-11.md", + "2003-02-11.md", + "2003-01-14.md", + "2002-12-10.md", + "2002-11-17.md", + "2002-10-08.md", + "2002-09-10.md", + "2002-08-13.md", + "2002-07-16.md", + "2002-06-11.md", + "2002-05-14.md", + "2002-04-09.md", + "2002-03-19.md", + "2002-03-12.md", + "2002-02-15.md", + "2002-02-12.md", + "2002-01-08.md", + "2001-12-11.md", + "2001-11-20.md", + "2001-10-09.md", + "2001-09-24.md", + "2001-09-11.pdf", + "2001-09-11.md", + "2001-08-07.md", + "2001-07-10.md", + "2001-06-12.md", + "2001-05-08.md", + "2001-04-10.md", + "2001-03-20.md", + "2001-02-13.md", + "2001-01-09.md", + "2000-12-12.md", + "2000-11-13.md", + "2000-10-16.md", + "2000-09-11.md", + "2000-08-14.md", + "2000-08-01.md", + "2000-07-10.md", + "2000-06-12.md", + "2000-05-08.md", + "2000-04-10.md", + "2000-03-26.md", + "2000-02-14.md", + "2000-01-10.md", + "1999-12-14.md", + "1999-11-09.md", + "1999-10-19.md", + "1999-09-14.md", + "1999-08-10.md", + "1999-07-11.md", + "1999-06-15.md", + "1999-05-11.md", + "1999-04-13.md", + "1999-03-16.md", + "1999-02-09.md", + "1999-01-12.md", + "1998-12-08.md", + "1998-11-10.md", + "1998-10-13.md", + "1998-09-15.md", + "1998-08-23.md", + "1998-08-04.md", + "1998-07-14.md", + "1998-06-09.md", + "1998-05-12.md", + "1998-04-02.md", + "1998-03-31.pdf", + "1998-03-31.md", + "1998-03-10.md", + "1998-02-10.md", + "1998-01-20.md", + "1997-12-10.md", + "1997-12-09.md", + "1997-11-11.md", + "1997-10-14.md", + "1997-09-09.md", + "1997-08-13.md", + "1997-08-12.md", + "1997-07-15.md", + "1997-06-17.md", + "1997-04-09.md", + "1997-04-08.md", + "1997-03-11.md", + "1997-01-14.md", + "1996-12-10.md", + "1996-11-12.md", + "1996-10-08.md", + "1996-09-12.md", + "1996-08-13.md", + "1996-07-09.md", + "1996-06-26.md", + "1996-06-11.md", + "1996-05-14.md", + "1996-04-09.md", + "1996-03-06.md", + "1996-03-05.md", + "1996-02-13.md", + "1996-01-09.md", + "1995-12-03.md", + "1995-11-14.md", + "1995-10-10.md", + "1995-09-12.md", + "1995-08-08.md", + "1995-07-19.md", + "1995-06-29.md", + "1995-06-07.md", + "1995-05-10.md", + "1995-04-19.md", + "1995-04-05.md", + "1995-04-02.md", + "1995-03-22.md", + "1995-02-28.md", + "1995-02-07.md", + "1995-01-10.md", + "1994-12-09.md", + "1994-12-07.md", + "1994-11-09.md", + "1994-10-13.md", + "1994-09-23.md", + "1994-07-27.md", + "1994-07-05.md", + "1994-05-24.md", + "1994-04-29.md", + "1994-03-30.md", + "1993-07-13.md", + "1993-03-30.md", + "1992-10-29.md", + "1992-07-17.md", + "1992-06-18.md", + "1992-01-07.md", + "1991-11-19.md", + "1991-10-10.md", + "1991-06-14.md", + "1991-01-08.md", + "1990-10-11.md", + "1990-06-28.md", + "1990-04-26.md", + "1990-01-03.md", + "1988-07-12.md", + "1988-03-21.md", + ] + + nametimes_by_year = defaultdict(list) + for name in sorted(scraped_basenames): + date, ext = name.split(".") + year, month, day = map(int, date.split("-")) + start_hour, start_minute, duration = get_time(name) + nametimes_by_year[year].append( + (month, day, ext, start_hour, start_minute, duration) + ) + return nametimes_by_year diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 31a887e46..6f8963b64 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -1254,7 +1254,9 @@ class Session(models.Model): return Constraint.objects.filter(target=self.group, meeting=self.meeting).order_by('name__name') def official_timeslotassignment(self): - return self.timeslotassignments.filter(schedule__in=[self.meeting.schedule, self.meeting.schedule.base if self.meeting.schedule else None]).first() + if not hasattr(self, "_cache_official_timeslotassignment"): + self._cache_official_timeslotassignment = self.timeslotassignments.filter(schedule__in=[self.meeting.schedule, self.meeting.schedule.base if self.meeting.schedule else None]).first() + return self._cache_official_timeslotassignment @property def people_constraints(self): @@ -1317,8 +1319,11 @@ class Session(models.Model): def notes_url(self): return urljoin(settings.IETF_NOTES_URL, self.notes_id()) + def group_at_the_time(self): - return self.meeting.group_at_the_time(self.group) + if not hasattr(self,"_cached_group_at_the_time"): + self._cached_group_at_the_time = self.meeting.group_at_the_time(self.group) + return self._cached_group_at_the_time def group_parent_at_the_time(self): if self.group_at_the_time().parent: diff --git a/ietf/templates/group/meetings-row.html b/ietf/templates/group/meetings-row.html index 6dc65ab7f..487c8f7e1 100644 --- a/ietf/templates/group/meetings-row.html +++ b/ietf/templates/group/meetings-row.html @@ -11,7 +11,6 @@ {% endif %} - {% if s.name %}{{ s.name }}{% endif %} {% if s.current_status == "sched" %} {{ s.time|date:"Y-m-d" }} {% else %} @@ -26,6 +25,9 @@ {% endif %} {% endif %} + + {% if s.name %}{{ s.name }}{% endif %} + {% if s.current_status == "sched" %}{{ s.time|date:"D" }}{% endif %} diff --git a/ietf/templates/group/meetings.html b/ietf/templates/group/meetings.html index fbbfd661f..eddf374de 100644 --- a/ietf/templates/group/meetings.html +++ b/ietf/templates/group/meetings.html @@ -28,6 +28,7 @@ Meeting Date + Materials @@ -53,6 +54,7 @@ Meeting Date + Materials @@ -64,13 +66,14 @@ {% endif %} {% if past or recent %} -

Past Meetings

+

Past Meetings (within the last four years)

+ @@ -84,8 +87,72 @@
Meeting Date Materials
{% endif %} -

- This page shows meetings within the last four years. For earlier meetings, please see the - proceedings. -

+ {# The following is a temporary performance workaround, not long term design #} + {% if group.acronym != "iab" %} +

+ This page shows meetings within the last four years. For earlier meetings, please see the + proceedings. +

+ {% else %} + {% comment %} + Note: This block is only capable of correctly processing interim sessions. + If the view starts sending other types of meetings with a non-empty + older_sessions value, this block will need to be adjusted. + {% endcomment %} + {% if far_past %} +

Meetings more than four years ago

+ + + + + + + + + + + + {% for s in far_past %} + + + + + + + + {% endfor %} + +
MeetingDateMaterials
+ {% if s.meeting.type.slug == 'ietf' %} + IETF {{ s.meeting.number }} + {% else %} + {{ s.meeting.number }} + {% endif %} + {% if s.current_status == "sched" %} + {{ s.time|date:"Y-m-d" }} + {% else %} + {{ s.current_status_name }} + {% endif %} + + {% if s.name %}{{ s.name }}{% endif %} + + {% if s.current_status == "sched" %}{{ s.time|date:"D" }}{% endif %} + + {% if not s.canceled %} + + Minutes + + + {% if can_always_edit or can_edit_materials %} + + + {% endif %} + Materials + + {% endif %} +
+ {% endif %} + {% endif %} {% endblock %} diff --git a/ietf/utils/decorators.py b/ietf/utils/decorators.py index db919bd4b..254854a6c 100644 --- a/ietf/utils/decorators.py +++ b/ietf/utils/decorators.py @@ -91,7 +91,7 @@ def require_api_key(f): def _memoize(func, self, *args, **kwargs): - ''''Memoize wrapper for instance methouds. Use @lru_cache for functions.''' + '''Memoize wrapper for instance methods. Use @lru_cache for functions.''' if kwargs: # frozenset is used to ensure hashability key = args, frozenset(list(kwargs.items())) else: