diff --git a/ietf/meeting/management/commands/import_iab_agendas.py b/ietf/meeting/management/commands/import_iab_agendas.py new file mode 100644 index 000000000..a1b78003e --- /dev/null +++ b/ietf/meeting/management/commands/import_iab_agendas.py @@ -0,0 +1,240 @@ +# Copyright The IETF Trust 2023, All Rights Reserved + +import datetime +import os +import shutil +import subprocess +import tempfile + +from pathlib import Path + +from django.core.management.base import BaseCommand +from django.conf import settings + +from ietf.doc.models import Document, DocAlias, DocEvent +from ietf.meeting.models import Meeting, Session + + +def agendas_to_import(): + return [ + "2018-09-05.md", + "2018-09-12.md", + "2018-09-26.md", + "2018-10-03.md", + "2018-10-10.md", + "2018-10-24.md", + "2018-11-04.md", + "2018-11-05.md", + "2018-11-08.md", + "2018-11-21.md", + "2018-11-28.md", + "2018-12-05.md", + "2018-12-19.md", + "2019-01-09.md", + "2019-01-16.md", + "2019-01-23.md", + "2019-02-06.md", + "2019-02-13.md", + "2019-02-27.md", + "2019-03-06.md", + "2019-03-13.md", + "2019-03-24.md", + "2019-03-25.md", + "2019-03-28.md", + "2019-04-10.md", + "2019-04-17.md", + "2019-05-01.md", + "2019-05-08.md", + "2019-05-29.md", + "2019-06-12.md", + "2019-06-26.md", + "2019-07-10.md", + "2019-07-21.md", + "2019-07-25.md", + "2019-08-07.md", + "2019-08-21.md", + "2019-08-28.md", + "2019-09-04.md", + "2019-09-18.md", + "2019-10-02.md", + "2019-10-16.md", + "2019-10-30.md", + "2019-11-17.md", + "2019-11-18.md", + "2019-11-21.md", + "2019-12-04.md", + "2019-12-11.md", + "2019-12-18.md", + "2020-01-08.md", + "2020-01-15.md", + "2020-01-22.md", + "2020-02-05.md", + "2020-02-12.md", + "2020-02-19.md", + "2020-03-04.md", + "2020-03-11.md", + "2020-03-18.md", + "2020-04-01.md", + "2020-04-08.md", + "2020-04-15.md", + "2020-04-29.md", + "2020-05-13.md", + "2020-05-20.md", + "2020-05-27.md", + "2020-06-10.md", + "2020-06-17.md", + "2020-07-01.md", + "2020-07-15.md", + "2020-08-12.md", + "2020-08-26.md", + "2020-09-09.md", + "2020-09-23.md", + "2020-10-07.md", + "2020-10-14.md", + "2020-10-21.md", + "2020-11-04.md", + "2020-12-02.md", + "2020-12-16.md", + "2021-01-06.md", + "2021-01-13.md", + "2021-01-20.md", + "2021-01-27.md", + "2021-02-03.md", + "2021-02-10.md", + "2021-02-17.md", + "2021-02-24.md", + "2021-03-03.md", + "2021-03-24.md", + "2021-03-31.md", + "2021-04-07.md", + "2021-04-14.md", + "2021-04-21.md", + "2021-05-05.md", + "2021-05-12.md", + "2021-05-19.md", + "2021-05-26.md", + "2021-06-02.md", + "2021-06-16.md", + "2021-06-23.md", + "2021-06-30.md", + "2021-07-14.md", + "2021-07-21.md", + "2021-08-11.md", + "2021-08-25.md", + "2021-09-01.md", + "2021-09-08.md", + "2021-09-22.md", + "2021-10-06.md", + "2021-10-20.md", + "2021-10-27.md", + "2021-11-17.md", + "2021-12-01.md", + "2021-12-08.md", + "2021-12-15.md", + "2022-01-12.md", + "2022-01-19.md", + "2022-02-02.md", + "2022-02-16.md", + "2022-02-23.md", + "2022-03-02.md", + "2022-03-09.md", + "2022-03-20.md", + "2022-04-06.md", + "2022-04-13.md", + "2022-04-20.md", + "2022-04-27.md", + "2022-05-04.md", + "2022-05-11.md", + "2022-06-01.md", + "2022-06-15.md", + "2022-06-22.md", + "2022-06-29.md", + "2022-07-06.md", + "2022-07-24.md", + "2022-07-26.md", + "2022-08-10.md", + "2022-08-24.md", + "2022-09-07.md", + "2022-09-21.md", + "2022-09-28.md", + "2022-10-05.md", + "2022-10-12.md", + "2022-10-26.md", + "2022-11-06.md", + "2022-11-08.md", + "2022-11-10.md", + "2022-11-23.md", + "2022-12-07.md", + "2022-12-14.md", + ] + + +class Command(BaseCommand): + help = "Performs a one-time import of older IAB agendas" + + def handle(self, *args, **options): + if Document.objects.filter(name="agenda-interim-2018-iab-26-20180905").exists(): + print("Command has already been run - exiting") + exit(0) + + 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_agendas", "2018-09-05.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) + + agendas = agendas_to_import() + for agenda in agendas: + [year, month, day] = [int(part) for part in agenda[:10].split("-")] + agenda_date = datetime.date(year, month, day) + meeting = Meeting.objects.get( + date=agenda_date, type_id="interim", session__group__acronym="iab" + ) + counter = int(meeting.number.split("-")[3]) + agenda_docname = ( + f"agenda-interim-{year}-iab-{counter:02d}-{agenda_date:%Y%m%d}" + ) + agenda_filename = f"{agenda_docname}-00.md" + # Create Document + doc = Document.objects.create( + name=agenda_docname, + type_id="agenda", + title=f"Agenda {meeting.number} {agenda_date:%Y-%m-%d}", + group_id=7, # The IAB group + rev="00", + uploaded_filename=agenda_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="Agenda moved into datatracker from iab wordpress website", + ) + doc.save_with_history([e]) + + session = Session.objects.get(meeting=meeting) + # Add Document to Session + session.sessionpresentation_set.create(document=doc, rev=doc.rev) + + # Put file in place + source = Path(tmpdir).joinpath("iab_agendas", agenda) + dest = Path(settings.AGENDA_PATH).joinpath( + meeting.number, "agenda", agenda_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) + + shutil.rmtree(tmpdir) diff --git a/ietf/templates/group/meetings.html b/ietf/templates/group/meetings.html index eddf374de..a344e74d8 100644 --- a/ietf/templates/group/meetings.html +++ b/ietf/templates/group/meetings.html @@ -135,6 +135,10 @@