diff --git a/ietf/meeting/tasks.py b/ietf/meeting/tasks.py index d67c1c2869..f5186e6bc2 100644 --- a/ietf/meeting/tasks.py +++ b/ietf/meeting/tasks.py @@ -67,7 +67,10 @@ def fetch_meeting_attendance_task(): @shared_task def resolve_meeting_materials_task( - *, meetings: list[str]=None, meetings_since: str=None, meetings_until: str=None + *, # only allow kw arguments + meetings: list[str] | None=None, + meetings_since: str | None=None, + meetings_until: str | None=None ): """Run materials resolver on meetings @@ -77,11 +80,14 @@ def resolve_meeting_materials_task( """ # IETF-1 = 1986-01-16 EARLIEST_MEETING_DATE = datetime.datetime(1986, 1, 1) + meetings_since_dt: datetime.datetime | None = None + meetings_until_dt: datetime.datetime | None = None + if meetings_since == "zero": - meetings_since = EARLIEST_MEETING_DATE + meetings_since_dt = EARLIEST_MEETING_DATE elif meetings_since is not None: try: - meetings_since = datetime.datetime.fromisoformat(meetings_since) + meetings_since_dt = datetime.datetime.fromisoformat(meetings_since) except ValueError: log.log( "Failed to parse meetings_since='{meetings_since}' with fromisoformat" @@ -90,37 +96,37 @@ def resolve_meeting_materials_task( if meetings_until is not None: try: - meetings_until = datetime.datetime.fromisoformat(meetings_until) + meetings_until_dt = datetime.datetime.fromisoformat(meetings_until) except ValueError: log.log( "Failed to parse meetings_until='{meetings_until}' with fromisoformat" ) raise - if meetings_since is None: + if meetings_since_dt is None: # if we only got meetings_until, start from the first meeting - meetings_since = EARLIEST_MEETING_DATE + meetings_since_dt = EARLIEST_MEETING_DATE if meetings is None: - if meetings_since is None: + if meetings_since_dt is None: log.log("No meetings requested, doing nothing.") return - meetings = Meeting.objects.filter(date__gte=meetings_since) - if meetings_until is not None: - meetings = meetings.filter(date__lte=meetings_until) + meetings_qs = Meeting.objects.filter(date__gte=meetings_since_dt) + if meetings_until_dt is not None: + meetings_qs = meetings_qs.filter(date__lte=meetings_until_dt) log.log( "Resolving materials for meetings " - f"between {meetings_since} and {meetings_until}" + f"between {meetings_since_dt} and {meetings_until_dt}" ) else: - log.log(f"Resolving materials for meetings since {meetings_since}") + log.log(f"Resolving materials for meetings since {meetings_since_dt}") else: - if meetings_since is not None: + if meetings_since_dt is not None: log.log( "Ignoring meetings_since and meetings_until " "because specific meetings were requested." ) - meetings = Meeting.objects.filter(number__in=meetings) - for meeting in meetings.order_by("date"): + meetings_qs = Meeting.objects.filter(number__in=meetings) + for meeting in meetings_qs.order_by("date"): log.log( f"Resolving materials for {meeting.type_id} " f"meeting {meeting.number} ({meeting.date})..." diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index 719c604e70..9f5e3d76f6 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -863,6 +863,10 @@ class BlobSpec: def resolve_one_material( doc: Document | DocHistory, rev: str | None, ext: str | None ) -> BlobSpec | None: + if doc.type_id is None: + log(f"Cannot resolve a doc with no type: {doc.name}") + return None + # Get the Document's base name. It may or may not have an extension. if rev is None: basename = Path(doc.get_base_name()) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 38696a51b9..6132540e3b 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -275,7 +275,7 @@ def _matches_meeting(doc, meeting=None): return doc.get_related_meeting() == meeting # try an exact match first - doc = Document.objects.filter(name=name).first() + doc: Document | DocHistory | None = Document.objects.filter(name=name).first() if doc is not None and _matches_meeting(doc, meeting): return doc, None