More work on generic RSS renderer base class. Make the kiosk have a countdown
[kiosk.git] / generic_news_rss_renderer.py
index ec7a7a5d0e840c65a27284fbb98f9e6ea5e91dd2..798c06c90962d001a87ed93f1a9a2114a3ccbc88 100644 (file)
@@ -1,3 +1,5 @@
+import datetime
+from dateutil.parser import parse
 import file_writer
 import grab_bag
 import renderer
@@ -10,7 +12,8 @@ import xml.etree.ElementTree as ET
 
 class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
     def __init__(self, name_to_timeout_dict, feed_site, feed_uris, page_title):
-        super(generic_news_rss_renderer, self).__init__(name_to_timeout_dict, False)
+        super(generic_news_rss_renderer, self).__init__(name_to_timeout_dict,
+                                                        False)
         self.debug = 1
         self.feed_site = feed_site
         self.feed_uris = feed_uris
@@ -28,6 +31,12 @@ class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
     def get_details_page_prefix(self):
         pass
 
+    def get_headlines_page_priority(self):
+        return "4"
+
+    def get_details_page_priority(self):
+        return "6"
+
     def should_use_https(self):
         pass
 
@@ -50,14 +59,37 @@ class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
     def find_link(self, item):
         return item.findtext('link')
 
+    def munge_link(self, link):
+        return link
+
     def find_image(self, item):
         return item.findtext('image')
 
+    def munge_image(self, image):
+        return image
+
+    def find_pubdate(self, item):
+        return item.findtext('pubDate')
+
+    def munge_pubdate(self, pubdate):
+        return pubdate
+
     def item_is_interesting_for_headlines(self, title, description, item):
-        pass
+        return True
+
+    def is_item_older_than_n_days(self, item, n):
+        pubdate = self.find_pubdate(item)
+        if pubdate is not None:
+            pubdate = parse(pubdate)
+            tzinfo = pubdate.tzinfo
+            now = datetime.datetime.now(tzinfo)
+            delta = (now - pubdate).total_seconds() / (60 * 60 * 24)
+            if (delta > n):
+                return True
+        return False
 
     def item_is_interesting_for_article(self, title, description, item):
-        pass
+        return True
 
     def periodic_render(self, key):
         if key == "Fetch News":
@@ -77,13 +109,50 @@ class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
             return False
         for msg in subset:
             headlines.add_item(msg)
-        f = file_writer.file_writer('%s_4_none.html' % (
-            self.get_headlines_page_prefix()))
+        headlines.set_custom_html("""
+<STYLE>
+a:link {
+  color: black;
+  text-decoration: none;
+  font-weight: bold;
+}
+a:visited {
+  color: black;
+  text-decoration: none;
+  font-weight: bold;
+}
+a:active {
+  color: black;
+  text-decoration: none;
+  font-weight: bold;
+}
+</STYLE>""")
+        f = file_writer.file_writer('%s_%s_none.html' % (
+            self.get_headlines_page_prefix(),
+            self.get_headlines_page_priority()))
         headlines.render_html(f)
         f.close()
 
         details = page_builder.page_builder()
         details.set_layout(page_builder.page_builder.LAYOUT_ONE_ITEM)
+        details.set_custom_html("""
+<STYLE>
+a:link {
+  color: black;
+  text-decoration: none;
+  font-weight: bold;
+}
+a:visited {
+  color: black;
+  text-decoration: none;
+  font-weight: bold;
+}
+a:active {
+  color: black;
+  text-decoration: none;
+  font-weight: bold;
+}
+</STYLE>""")
         details.set_title("%s" % self.page_title)
         subset = self.details.subset(1)
         if subset is None:
@@ -93,8 +162,9 @@ class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
             blurb = msg
             blurb += u'</TD>'
             details.add_item(blurb)
-        g = file_writer.file_writer('%s_6_none.html' % (
-            self.get_details_page_prefix()))
+        g = file_writer.file_writer('%s_%s_none.html' % (
+            self.get_details_page_prefix(),
+            self.get_details_page_priority()))
         details.render_html(g)
         g.close()
         return True
@@ -132,8 +202,12 @@ class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
                 description = item.findtext('description')
                 if description is not None:
                     description = self.munge_description(description)
+                image = self.find_image(item)
+                if image is not None:
+                    image = self.munge_image(image)
                 link = item.findtext('link')
-                image = item.findtext('image')
+                if link is not None:
+                    link = self.munge_link(link)
 
                 if (title is None or
                     not self.item_is_interesting_for_headlines(title,
@@ -148,19 +222,31 @@ class generic_news_rss_renderer(renderer.debuggable_abstaining_renderer):
                     self.debug_print('Found bad words in item "%s"' % title)
                     continue
 
-                #print u"Title: %s\nDescription: %s\nLink: %s\nImage: %s\n" % (
-                #    title, description, link, image)
-
                 blurb = u"""<DIV style="padding:8px;
                                  font-size:34pt;
                                  -webkit-column-break-inside:avoid;">"""
                 if image is not None:
-                    blurb += u'<IMG SRC="%s" ALIGN=LEFT HEIGHT=115 style="padding:8px;">' % image
-                blurb += u'<P><B>%s</B>' % title
+                    blurb += u'<IMG SRC="%s" ALIGN=LEFT HEIGHT=115 ' % image
+                    blurb += u'style="padding:8px;">'
+
+                if link is None:
+                    blurb += u'<P><B>%s</B>' % title
+                else:
+                    blurb += u'<P><B><A HREF="%s">%s</A></B>' % (link, title)
+
+                pubdate = self.find_pubdate(item)
+                if pubdate is not None:
+                    pubdate = self.munge_pubdate(pubdate)
+                    ts = parse(pubdate)
+                    blurb += u" <FONT COLOR=#cccccc>%s</FONT>" % (
+                        ts.strftime("%b %d"))
 
                 if (description is not None and
-                    self.item_is_interesting_for_article(title, description, item)):
+                    self.item_is_interesting_for_article(title,
+                                                         description,
+                                                         item)):
                     longblurb = blurb
+
                     longblurb += u"<BR>"
                     longblurb += description
                     longblurb += u"</DIV>"