From: Felix Dörre Date: Sun, 10 Jan 2021 22:16:14 +0000 (+0100) Subject: Merge branch 'admin_cleanup' into 'master' X-Git-Url: https://code.wpia.club/?p=motion.git;a=commitdiff_plain;h=7f7b44cb967ae9b99ddcbf3879c92d448570d49c;hp=11e82f491ae15d3b7d9f1f88db2ab79d1fe131bf Merge branch 'admin_cleanup' into 'master' add: implement motion cleanup See merge request felixdoerre/motion!28 --- 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 51ec30b..c4337f9 100644 --- a/motion.py +++ b/motion.py @@ -62,6 +62,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") @@ -268,6 +269,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(): @@ -321,6 +333,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 85dc7b6..0f27f48 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 f699296..b1ec433 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):