From 068793bc0abe796473cb252ed7481b56b91f47bc Mon Sep 17 00:00:00 2001 From: INOPIAE Date: Tue, 22 Dec 2020 21:25:26 +0100 Subject: [PATCH] add: configuration of timespan between entering of two motions Change-Id: I255f871095479d12a535595647cf8ae6a693f02e --- config.py.example | 2 ++ motion.py | 15 +++++++++++++++ tests/test_basics.py | 1 - tests/test_motion.py | 19 ++++++++++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/config.py.example b/config.py.example index 56ce4bc..e56352d 100644 --- a/config.py.example +++ b/config.py.example @@ -15,6 +15,8 @@ GROUP_PREFIX={'hostname': {'group1': 'g1', 'group2': 'g2'}} # motion types and t MAX_PROXY=2 # user is allowed to hold up to MAX_PROXY votes +MOTION_WAIT_MINUTES={'hostname':'1'} # timespan between the entering of two motions + DURATION={'hostname':[3, 7, 14]} # duration period for motions #DEBUGUSER={'hostname':'username/create:* vote:*'} # remove # at beginning of line to use local debuguser diff --git a/motion.py b/motion.py index 99daaf6..21e3e16 100644 --- a/motion.py +++ b/motion.py @@ -61,6 +61,7 @@ class ConfigProxy: prefix = ConfigProxy("GROUP_PREFIX") times = ConfigProxy("DURATION") debuguser = ConfigProxy("DEBUGUSER") +motion_wait_minutes = ConfigProxy("MOTION_WAIT_MINUTES") max_proxy=app.config.get("MAX_PROXY") @@ -262,6 +263,17 @@ def init_db(): init_db() +def is_in_ratelimit(group): + rv = get_db().prepare("SELECT EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - posed)) AS timedifference FROM motion WHERE type=$1 AND host=$2 ORDER BY posed DESC LIMIT 1")(group, request.host) + if len(rv) == 0: + return True + rate_limit = motion_wait_minutes.per_host + if rate_limit is None: + rate_limit = 0 + if rv[0]['timedifference'] > rate_limit*60: + return True + else: + return _('Error, time between last motion to short. The current setting is %s minute(s).') % (str(rate_limit)) @app.route("/") def main(): @@ -309,6 +321,9 @@ def put_motion(): content=content.strip() if content =='': return _('Error, missing content'), 400 + ratelimit = is_in_ratelimit(cat) + if ratelimit is not True: + return ratelimit, 400 db = get_db() with db.xact(): diff --git a/tests/test_basics.py b/tests/test_basics.py index f886c34..b6f111c 100644 --- a/tests/test_basics.py +++ b/tests/test_basics.py @@ -17,7 +17,6 @@ app.config.update( app.config['TESTING'] = True app.config['DEBUG'] = False - class BasicTest(TestCase): def init_test(self): diff --git a/tests/test_motion.py b/tests/test_motion.py index 769deb1..7ef5cea 100644 --- a/tests/test_motion.py +++ b/tests/test_motion.py @@ -1,6 +1,5 @@ from datetime import datetime from tests.test_basics import BasicTest -import postgresql from motion import app # no specific rights required @@ -479,6 +478,24 @@ class CreateMotionTests(BasicTest): self.assertEqual(response.status_code, 403) self.assertIn(str.encode('Error, out of time'), response.data) + def test_createMotionWait(self): + # test no limit given + self.db_sampledata() + title='My Motion' + content='My body' + response = self.createMotion(user, title, content, '3', 'group1') + self.assertEqual(response.status_code, 302) + + # test different host + app.config.update(MOTION_WAIT_MINUTES={'127.0.0.1:5001':1}) + response = self.createMotion(user, title, content, '3', 'group1') + self.assertEqual(response.status_code, 302) + + # test 3 minutes + app.config.update(MOTION_WAIT_MINUTES={'127.0.0.1:5000':3}) + response = self.createMotion(user, title, content, '3', 'group1') + self.assertIn(str.encode('Error, time between last motion to short. The current setting is 3 minute(s).'), response.data) + class AuditMotionTests(BasicTest): def setUp(self): -- 2.39.2