diff --git a/tools/events/meetup-automation/event.py b/tools/events/meetup-automation/event.py index 14b08b8cc..4e2e64f8c 100644 --- a/tools/events/meetup-automation/event.py +++ b/tools/events/meetup-automation/event.py @@ -76,6 +76,7 @@ class Event: virtual: bool organizer_name: str organizer_url: str + no_venue: bool def __post_init__(self): """ Normalize the event data here """ @@ -91,7 +92,8 @@ def to_dict(self) -> dict: "url": self.url, "virtual": self.virtual, "organizer_name": self.organizer_name, - "organizer_url": self.organizer_url + "organizer_url": self.organizer_url, + "no_venue": self.no_venue } def to_markdown_string(self) -> str: @@ -111,9 +113,9 @@ class RawGqlEvent: date_time_str: str event_url_str: str venue_type: None | str - event_location: Location - lat: float - long: float + event_location: None | Location + lat: None | float + long: None | float def __init__(self, **kwargs) -> None: logger.debug(f"Constructing RawGqlEvent from: {kwargs}") @@ -128,22 +130,29 @@ def __init__(self, **kwargs) -> None: self.date_time_str = node["dateTime"] self.event_url_str = node["eventUrl"] - venue = node["venue"] - self.venue_type = venue["venueType"] - # TODO: do we need these lat longs? - self.lat = venue["lat"] - self.long = venue["lng"] - self.event_location = Location(venue["city"], venue["state"], venue["country"]) + if node["venue"]: + venue = node["venue"] + self.venue_type = venue["venueType"] + # TODO: do we need these lat longs? + self.lat = venue["lat"] + self.long = venue["lng"] + self.event_location = Location(venue["city"], venue["state"], venue["country"]) + else: + self.event_location = None + self.venue_type = None + self.lat = None + self.long = None def to_event(self, group_url: str) -> Event: - is_virtual = self.venue_type == "online" + is_virtual = self.venue_type is not None and self.venue_type == "online" + no_venue = self.event_location is None # this is a bit weird because we want a naive datetime object that just contains the year/month/day because we get # timestamps with tz info like "2025-01-16T19:00+01:00", just strip the time and tz info before parsing date = datetime.strptime(self.date_time_str.split('T')[0], '%Y-%m-%d') # prefer the event specific location, otherwise fall back to the group's location - if self.event_location.fields_present() > self.group_location.fields_present(): + if self.event_location and self.event_location.fields_present() > self.group_location.fields_present(): location = self.event_location else: location = self.group_location @@ -155,6 +164,6 @@ def to_event(self, group_url: str) -> Event: url=self.event_url_str, virtual=is_virtual, organizer_name=self.group_name, - organizer_url=group_url + organizer_url=group_url, + no_venue=no_venue ) - diff --git a/tools/events/meetup-automation/generate_events_meetup.py b/tools/events/meetup-automation/generate_events_meetup.py index c6b1f565b..00843c40d 100644 --- a/tools/events/meetup-automation/generate_events_meetup.py +++ b/tools/events/meetup-automation/generate_events_meetup.py @@ -103,8 +103,7 @@ def _parse_event_listing_gql_response(self, response: dict) -> List[RawGqlEvent] # TODO: maybe move this validation somewhere else? for edge_kwargs in edges: if not edge_kwargs["node"]["venue"]: - logger.error(f"Event response missing venue: {edge_kwargs}") - continue + logger.info(f"Event response missing venue: {edge_kwargs}") events.append(RawGqlEvent(**edge_kwargs)) diff --git a/tools/events/meetup-automation/main.py b/tools/events/meetup-automation/main.py index 7d06414ef..3e869059a 100644 --- a/tools/events/meetup-automation/main.py +++ b/tools/events/meetup-automation/main.py @@ -105,11 +105,18 @@ def group_virtual_continent(event_list): for event in event_list: # Separates Events by Virtual or by Continent - key = "Virtual" if event.virtual else country_code_to_continent(event.location.country) + key = determine_event_key(event) separated_event_list.setdefault(key, []).append(event) return separated_event_list +def determine_event_key(event: Event): + if event.virtual: + return "Virtual" + elif event.no_venue: + return "No Venue" + else: + return country_code_to_continent(event.location.country) def remove_duplicate_events(events: List[Event]) -> List[Event]: # Identifies possible duplicate Events within Event List.