# HG changeset patch # User Goffi # Date 1452180043 -3600 # Node ID 8496af26be450f045e72693c5474ee109a7fce71 # Parent 54d90c73b8b51838b66d34ca8dedfa4113173293 mam: added filtering by category diff -r 54d90c73b8b5 -r 8496af26be45 sat_pubsub/const.py --- a/sat_pubsub/const.py Tue Jan 05 23:13:13 2016 +0100 +++ b/sat_pubsub/const.py Thu Jan 07 16:20:43 2016 +0100 @@ -73,3 +73,4 @@ VAL_RSM_MAX_DEFAULT = 10 # None for no limit FLAG_ENABLE_RSM = True FLAG_ENABLE_MAM = True +MAM_FILTER_CATEGORY = 'http://salut-a-toi.org/protocols/mam_filter_category' diff -r 54d90c73b8b5 -r 8496af26be45 sat_pubsub/pgsql_storage.py --- a/sat_pubsub/pgsql_storage.py Tue Jan 05 23:13:13 2016 +0100 +++ b/sat_pubsub/pgsql_storage.py Thu Jan 07 16:20:43 2016 +0100 @@ -57,6 +57,7 @@ from twisted.internet import defer from twisted.words.protocols.jabber import jid +from twisted.python import log from wokkel import generic from wokkel.pubsub import Subscription @@ -701,12 +702,13 @@ _getItems """ # SOURCES + query.append("FROM nodes INNER JOIN items USING (node_id)") + if unrestricted: - query.append("""FROM nodes - INNER JOIN items USING (node_id) - WHERE node_id=%s""") + query_filters = ["WHERE node_id=%s"] args.append(self.nodeDbId) else: + query.append("LEFT JOIN item_groups_authorized USING (item_id)") args.append(self.nodeDbId) if authorized_groups: get_groups = " or (items.access_model='roster' and groupname in %s)" @@ -714,29 +716,33 @@ else: get_groups = "" - query.append("""FROM nodes - INNER JOIN items USING (node_id) - LEFT JOIN item_groups_authorized USING (item_id) - WHERE node_id=%s AND - (items.access_model='open'""" + get_groups + ")") + query_filters = ["WHERE node_id=%s AND (items.access_model='open'" + get_groups + ")"] # FILTERS if 'filters' in ext_data: # MAM filters for filter_ in ext_data['filters']: if filter_.var == 'start': - query.append("AND date>=%s") + query_filters.append("AND date>=%s") args.append(filter_.value) - if filter_.var == 'end': - query.append("AND date<=%s") + elif filter_.var == 'end': + query_filters.append("AND date<=%s") args.append(filter_.value) - if filter_.var == 'with': + elif filter_.var == 'with': jid_s = filter_.value if '/' in jid_s: - query.append("AND publisher=%s") + query_filters.append("AND publisher=%s") args.append(filter_.value) else: - query.append("AND publisher LIKE %s") + query_filters.append("AND publisher LIKE %s") args.append(u"{}%".format(filter_.value)) + elif filter_.var == const.MAM_FILTER_CATEGORY: + query.append("LEFT JOIN item_categories USING (item_id)") + query_filters.append("AND category=%s") + args.append(filter_.value) + else: + log.msg("WARNING: unknown filter: {}".format(filter_.encode('utf-8'))) + + query.extend(query_filters) return "ORDER BY item_id DESC" diff -r 54d90c73b8b5 -r 8496af26be45 sat_pubsub/tap.py --- a/sat_pubsub/tap.py Tue Jan 05 23:13:13 2016 +0100 +++ b/sat_pubsub/tap.py Thu Jan 07 16:20:43 2016 +0100 @@ -59,7 +59,10 @@ from wokkel.disco import DiscoHandler from wokkel.generic import FallbackHandler, VersionHandler from wokkel.iwokkel import IPubSubResource -from wokkel import pubsub, rsm, mam +from wokkel import data_form +from wokkel import pubsub +from wokkel import rsm +from wokkel import mam from sat_pubsub import __version__ from sat_pubsub import const @@ -155,6 +158,7 @@ if const.FLAG_ENABLE_MAM: mam_resource = pubsub_mam.MAMResource(bs) mam_s = mam.MAMService(mam_resource) + mam_s.addFilter(data_form.Field(var=const.MAM_FILTER_CATEGORY)) mam_s.setHandlerParent(cs) # XXX: delegation must be instancied at the end,