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
This commit is contained in:
Robert Sparks 2023-06-09 17:07:31 -05:00 committed by GitHub
parent c7d98a1cdb
commit b75b560dea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 1144 additions and 31 deletions

View file

@ -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)

File diff suppressed because one or more lines are too long

View file

@ -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)

View file

@ -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

View file

@ -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:

View file

@ -11,7 +11,6 @@
{% endif %}
</td>
<td>
{% if s.name %}{{ s.name }}{% endif %}
{% if s.current_status == "sched" %}
{{ s.time|date:"Y-m-d" }}
{% else %}
@ -26,6 +25,9 @@
{% endif %}
{% endif %}
</td>
<td>
{% if s.name %}{{ s.name }}{% endif %}
</td>
<td>
{% if s.current_status == "sched" %}{{ s.time|date:"D" }}{% endif %}
</td>

View file

@ -28,6 +28,7 @@
<th scope="col" data-sort="meeting">Meeting</th>
<th scope="col" data-sort="date">Date</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col">Materials</th>
</tr>
</thead>
@ -53,6 +54,7 @@
<th scope="col" data-sort="meeting">Meeting</th>
<th scope="col" data-sort="date">Date</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col">Materials</th>
</tr>
</thead>
@ -64,13 +66,14 @@
</table>
{% endif %}
{% if past or recent %}
<h2 class="mt-3" id="pastmeets">Past Meetings</h2>
<h2 class="mt-3" id="pastmeets">Past Meetings (within the last four years)</h2>
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
<th scope="col" data-sort="meeting">Meeting</th>
<th scope="col" data-sort="date">Date</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col">Materials</th>
</tr>
</thead>
@ -84,8 +87,72 @@
</tbody>
</table>
{% endif %}
<p class="alert alert-info my-3">
This page shows meetings within the last four years. For earlier meetings, please see the
<a href="https://www.ietf.org/how/meetings/past/">proceedings</a>.
</p>
{# The following is a temporary performance workaround, not long term design #}
{% if group.acronym != "iab" %}
<p class="alert alert-info my-3">
This page shows meetings within the last four years. For earlier meetings, please see the
<a href="https://www.ietf.org/how/meetings/past/">proceedings</a>.
</p>
{% 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 %}
<h2 class="mt-3" id="farpastmeets">Meetings more than four years ago</h2>
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
<th scope="col" data-sort="meeting">Meeting</th>
<th scope="col" data-sort="date">Date</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col">Materials</th>
</tr>
</thead>
<tbody>
{% for s in far_past %}
<tr>
<td>
{% if s.meeting.type.slug == 'ietf' %}
IETF {{ s.meeting.number }}
{% else %}
{{ s.meeting.number }}
{% endif %} </td>
<td>
{% if s.current_status == "sched" %}
{{ s.time|date:"Y-m-d" }}
{% else %}
<i>{{ s.current_status_name }}</i>
{% endif %}
</td>
<td>
{% if s.name %}{{ s.name }}{% endif %}
</td>
<td>
{% if s.current_status == "sched" %}{{ s.time|date:"D" }}{% endif %}
</td>
<td>
{% if not s.canceled %}
<a class="btn btn-sm {% if not s.minutes %}btn-secondary disabled{% else %}btn-primary{% endif %}"
{% if s.minutes %}href="{{ s.minutes.get_absolute_url }}"{% endif %}>
Minutes
</a>
<a class="btn btn-primary btn-sm"
href="{% url 'ietf.meeting.views.session_details' num=s.meeting.number acronym=s.group.acronym %}">
{% if can_always_edit or can_edit_materials %}
<i class="bi bi-pencil-square">
</i>
{% endif %}
Materials
</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% endif %}
{% endblock %}

View file

@ -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: