# -*- python -*- import __main__, dbagg, logging, iso8601, time, dbagg.web # TODO: Number of items shown as per-source pref # TODO: Implement source priorities in sorting class SourceIndexPage(dbagg.web.AggPage): templateFile = 'bysources.html.tmpl' def initialize(self, *args, **kwargs): self.log = logging.getLogger("%s"%self.__class__) self.conn = kwargs['conn'] self.sources = kwargs['sources'] self.items = kwargs['items'] def wmfactory_max_sources(self, request): return int(request.args.get('max_sources', ['200'])[0]) def wmfactory_offset_sources(self, request): return int(request.args.get('offset_sources', ['0'])[0]) def wmfactory_max_per_source(self, request): return int(request.args.get('max_per_source', ['20'])[0]) def wmfactory_since(self, request): return request.args.get('since', [iso8601.ctime(time.time() - (60*60*12*1))])[0] def wmfactory_fsources_count(self, request): since = self.wmfactory_since(request) cursor = self.conn.cursor() cursor.execute( \ """ SELECT count(*) FROM sources_meta WHERE (name="last_updated" AND value > %s) """, ( since ) ); count = cursor.fetchone()[0] return count def wmfactory_fitems_count(self, request): since = self.wmfactory_since(request) cursor = self.conn.cursor() cursor.execute( \ """ SELECT count(items.id) FROM items LEFT JOIN items_meta AS b ON (b.item=items.id AND b.name="hidden") WHERE (b.value IS null OR b.value='0') AND items.created>%s """, ( since ) ); count = cursor.fetchone()[0] return count def wmfactory_fsources(self, request): max_sources = self.wmfactory_max_sources(request) offset_sources = self.wmfactory_offset_sources(request) max_per_source = self.wmfactory_max_per_source(request) since = self.wmfactory_since(request) filtered_sources = self.sources.sql_iter( \ """ SELECT sources.* FROM sources LEFT JOIN sources_meta AS t_hidden ON (t_hidden.source=sources.id AND t_hidden.name="hidden") LEFT JOIN sources_meta AS t_updated ON (t_updated.source=sources.id AND t_updated.name="last_updated") WHERE (t_hidden.value IS null OR t_hidden.value='0') AND (t_updated.value > %s) ORDER BY t_updated.value DESC LIMIT %s OFFSET %s """, ( since, max_sources, offset_sources ) ); pair_list = [] curr_source = None curr_pair = None for curr_source in filtered_sources: curr_pair = { 'source':dbagg.web.SourceModel(sources=self.sources, \ items=self.items, \ source=curr_source), 'items':[] } curr_items = self.items.sql_iter( \ """ SELECT * FROM items LEFT JOIN items_meta AS t_hidden ON (t_hidden.item=items.id AND t_hidden.name="hidden") WHERE (source=%s AND created>%s) AND (t_hidden.value IS null OR t_hidden.value='0') ORDER BY items.created DESC LIMIT %s """, ( curr_source.id, since, max_per_source)); for curr_item in curr_items: curr_pair['items'].append( dbagg.web.ItemModel(item=curr_item, sources=self.sources)) if len(curr_pair['items']) > 0: pair_list.append(curr_pair) return pair_list ################################################################################ resource = SourceIndexPage(conn=__main__.conn, \ sources=__main__.sources, \ items=__main__.items)