+ updates = []
+ global_limit = config['spline-frontpage.limit']
+ global_max_age = max_age_to_datetime(
+ config['spline-frontpage.max_age'])
+
+ c.sources = config['spline-frontpage.sources']
+ for source in c.sources:
+ new_updates = source.poll(global_limit, global_max_age)
+ updates.extend(new_updates)
+
+ # Little optimization: once there are global_limit items, anything
+ # older than the oldest cannot possibly make it onto the list. So,
+ # bump global_max_age to that oldest time if this is ever the case.
+ updates.sort(key=lambda obj: obj.time, reverse=True)
+ del updates[global_limit:]
+
+ if updates and len(updates) == global_limit:
+ global_max_age = updates[-1].time
+
+ # Find the oldest unseen item, to draw a divider after it.
+ # If this stays as None, the divider goes at the top
+ c.last_seen_item = None
+ # Could have a timestamp in the stash if this is a user, or in a cookie
+ # if this session has ever been logged out...
+ times = []
+ for source in (c.user.stash, request.cookies):
+ try:
+ times.append( int(source['frontpage-last-seen-time']) )
+ except (KeyError, ValueError):
+ pass
+
+ if times:
+ last_seen_time = datetime.datetime.fromtimestamp(max(times))
+ for update in updates:
+ if update.time > last_seen_time:
+ c.last_seen_item = update
+ else:
+ break
+
+ # Save ~now~ as the last-seen time
+ now = datetime.datetime.now().strftime('%s')
+ if c.user:
+ c.user.stash['frontpage-last-seen-time'] = now
+ meta.Session.add(c.user)
+ else:
+ response.set_cookie('frontpage-last-seen-time', now)
+
+ # Done! Feed to template
+ c.updates = updates
+
+ # Hook for non-update interesting things to put on the front page.
+ # This hook should return objects with a 'template' attribute, and
+ # whatever else they need
+ c.extras = run_hooks('frontpage_extras')
+
+ ret = render('/index.mako')