Various changes including adding new stevens renderer.
[kiosk.git] / bellevue_city_calendar_renderer.py
1 #!/usr/bin/env python3
2
3 import datetime
4 import logging
5 import re
6 from typing import Dict, List, Optional
7 import xml
8
9 from dateutil.parser import parse
10
11 import generic_news_rss_renderer as gnrss
12
13
14 logger = logging.getLogger(__file__)
15
16
17 class bellevue_city_calendar_renderer(gnrss.generic_news_rss_renderer):
18     """Read the Bellevue City Calendar feed."""
19
20     def __init__(
21         self,
22         name_to_timeout_dict: Dict[str, int],
23         feed_site: str,
24         feed_uris: List[str],
25         page_title: str,
26     ):
27         super().__init__(
28             name_to_timeout_dict, feed_site, feed_uris, page_title
29         )
30
31     def get_headlines_page_prefix(self) -> str:
32         return "bellevue-calendar"
33
34     def get_details_page_prefix(self) -> str:
35         return "bellevue-calendar-details"
36
37     def should_use_https(self) -> bool:
38         return True
39
40     def get_event_time(self, item: xml.etree.ElementTree.Element) -> Optional[datetime.datetime]:
41         return parse(self.find_pubdate(item))
42
43     def find_pubdate(self, item: xml.etree.ElementTree.Element) -> Optional[str]:
44         descr = item.findtext("description")
45         if descr is None:
46             return None
47         m = re.search(r'time datetime="([^"]+)"', descr)
48         if m is None:
49             return None
50         return m.group(1)
51
52     def item_is_interesting_for_headlines(
53         self, title: str, description: str, item: xml.etree.ElementTree.Element
54     ) -> bool:
55         if "City Council" in title:
56             return False
57         if "City Offices Closed" in title:
58             return False
59         if "Regular Meeting" in title:
60             return False
61         if "Commission" in title:
62             return False
63         date = self.get_event_time(item)
64         if date is None:
65             return False
66         tzinfo = date.tzinfo
67         now = datetime.datetime.now(tzinfo)
68         delta = (now - date).total_seconds() / (60 * 60 * 24)
69         return delta < 0
70
71     def do_details(self) -> bool:
72         logger.debug('No Bellevue city calendar items are interesting for articles...')
73         return False
74
75     def item_is_interesting_for_article(
76         self, title: str, description: str, item: xml.etree.ElementTree.Element
77     ) -> bool:
78         logger.debug('No Bellevue city calendar items are interesting for articles...')
79         return False
80
81
82 # Test
83 #x = bellevue_city_calendar_renderer(
84 #   {"Fetch News" : 1,
85 #    "Shuffle News" : 1},
86 #   "bellevuewa.gov",
87 #   [ "/calendar/events.xml" ],
88 #   "Test" )
89 #if x.fetch_news() == 0:
90 #    print("Error fetching news, no items fetched.")
91 #else:
92 #    x.shuffle_news()