From 940813fc9315618bb81fe5c425605caf952dcd62 Mon Sep 17 00:00:00 2001 From: Patrick Uiterwijk Date: Wed, 18 Mar 2015 18:29:40 +0100 Subject: [PATCH] Implement one-shot filters After being ran one, call fired() to disable them Signed-off-by: Patrick Uiterwijk --- fmn/lib/__init__.py | 1 + fmn/lib/models.py | 22 ++++++++++++++++++++-- fmn/lib/tests/test_models.py | 15 +++++++++++++++ fmn/lib/tests/test_recipients.py | 3 +++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/fmn/lib/__init__.py b/fmn/lib/__init__.py index 3ca3ce8..eb234ae 100644 --- a/fmn/lib/__init__.py +++ b/fmn/lib/__init__.py @@ -51,6 +51,7 @@ def recipients(preferences, message, valid_paths, config): context['detail_name']: detail_value, 'filter_name': filter['name'], 'filter_id': filter['id'], + 'filter_oneshot': filter['oneshot'], 'markup_messages': preference['markup_messages'], 'triggered_by_links': preference['triggered_by_links'], 'shorten_links': preference['shorten_links'], diff --git a/fmn/lib/models.py b/fmn/lib/models.py index c315c9d..85fad7c 100644 --- a/fmn/lib/models.py +++ b/fmn/lib/models.py @@ -318,6 +318,7 @@ class Filter(BASE): created_on = sa.Column(sa.DateTime, default=datetime.datetime.utcnow) name = sa.Column(sa.String(50)) active = sa.Column(sa.Boolean, default=True, nullable=False) + oneshot = sa.Column(sa.Boolean, default=False, nullable=False) preference_id = sa.Column( sa.Integer, @@ -329,7 +330,8 @@ def __json__(self, reify=False): 'id': self.id, 'name': self.name, 'created_on': self.created_on, - 'rules': [r.__json__(reify=reify) for r in self.rules] + 'rules': [r.__json__(reify=reify) for r in self.rules], + 'oneshot': self.oneshot } def __repr__(self): @@ -343,6 +345,16 @@ def create(cls, session, name): session.commit() return filter + def fired(self, session): + if self.oneshot: + self.active = False + session.flush() + session.commit() + + pref = self.preference + if pref: + self.notify(pref.openid, pref.context_name, "filters") + def add_rule(self, session, paths, rule, **kw): if isinstance(rule, basestring): rule = Rule.create_from_code_path(session, paths, rule, **kw) @@ -632,7 +644,13 @@ def add_filter(self, session, filter, notify=True): def set_filter_active(self, session, filter_name, active): filter = self.get_filter_name(session, filter_name) - filter.active = active; + filter.active = active + session.commit() + self.notify(self.openid, self.context_name, "filters") + + def set_filter_oneshot(self, session, filter_name, oneshot): + filter = self.get_filter_name(session, filter_name) + filter.oneshot = oneshot session.commit() self.notify(self.openid, self.context_name, "filters") diff --git a/fmn/lib/tests/test_models.py b/fmn/lib/tests/test_models.py index 0bf0adc..e3c6fe6 100644 --- a/fmn/lib/tests/test_models.py +++ b/fmn/lib/tests/test_models.py @@ -60,6 +60,21 @@ def test_context_all(self): detail_name="registration id", icon="phone") eq_(len(fmn.lib.models.Context.all(self.sess)), 2) + def test_filter_oneshot(self): + filter = fmn.lib.models.Filter.create(self.sess, name="test filter") + filter.oneshot = True + eq_(filter.active, True) + eq_(filter.oneshot, True) + filter.fired(self.sess) + eq_(filter.active, False) + + filter = fmn.lib.models.Filter.create(self.sess, name="test filter 2") + filter.oneshot = False + eq_(filter.active, True) + eq_(filter.oneshot, False) + filter.fired(self.sess) + eq_(filter.active, True) + class TestPreferences(fmn.lib.tests.Base): def setUp(self): diff --git a/fmn/lib/tests/test_recipients.py b/fmn/lib/tests/test_recipients.py index 8316f96..c20171a 100644 --- a/fmn/lib/tests/test_recipients.py +++ b/fmn/lib/tests/test_recipients.py @@ -101,6 +101,7 @@ def test_basic_recipients_list(self): 'user': 'ralph.id.fedoraproject.org', 'filter_name': 'test filter', 'filter_id': 1, + 'filter_oneshot': False, }) def test_miss_recipients_list(self): @@ -171,6 +172,7 @@ def test_multiple_identical_filters_hit(self): 'user': 'ralph.id.fedoraproject.org', 'filter_name': 'test filter', 'filter_id': 1, + 'filter_oneshot': False } eq_(recipients['irc'][0], expected) @@ -203,6 +205,7 @@ def test_multiple_different_filters_hit(self): 'user': 'ralph.id.fedoraproject.org', 'filter_name': 'test filter', 'filter_id': 1, + 'filter_oneshot': False, }) def test_load_preferences(self):