- source_config2 = source_config.copy()
- hook_name = 'frontpage_updates_' + source_config2.pop('__type__')
- source_config2.update(global_config)
-
- # Hooks should return a list of FrontPageUpdate objects, making this
- # return value a list of lists
- updates_lol = run_hooks(hook_name, **source_config2)
- updates += sum(updates_lol, [])
-
- # Sort everything by descending time, then crop to the right number of
- # items
- updates.sort(key=lambda obj: obj.time)
- updates.reverse()
- c.updates = updates[:global_config['limit']]
+ hook_name = 'frontpage_updates_' + source_config['__type__']
+
+ # Merge with the global config
+ merged_config = source_config.copy()
+ del merged_config['__type__']
+
+ merged_config['limit'] = min(
+ merged_config.get('limit', global_limit),
+ global_limit,
+ )
+
+ try:
+ local_max_age = now - datetime.timedelta(
+ seconds=merged_config['max_age'])
+ except KeyError:
+ local_max_age = None
+
+ if global_max_age and local_max_age:
+ merged_config['max_age'] = max(global_max_age, local_max_age)
+ else:
+ merged_config['max_age'] = global_max_age or local_max_age
+
+ # XXX bleh
+ updates_lol = run_hooks(hook_name, **merged_config)
+ source_obj = updates_lol[0]
+ updates += source_obj.poll(merged_config['limit'], merged_config['max_age'])
+
+ # Little optimization: maximum age effectively becomes the age of
+ # the oldest thing that would still appear on the page, as anything
+ # older would drop off the end no matter what.
+ # So sort by descending time and crop each iteration...
+ updates.sort(key=lambda obj: obj.time, reverse=True)
+ updates = updates[:global_limit]
+
+ if updates and len(updates) == global_limit:
+ global_max_age = updates[-1].time
+
+ c.updates = updates