]> WPIA git - motion.git/commitdiff
allow hosting for multiple hostnames
authorFelix Dörre <et@felixdoerre.de>
Mon, 31 Dec 2018 15:34:17 +0000 (15:34 +0000)
committerFelix Dörre <et@felixdoerre.de>
Mon, 31 Dec 2018 15:34:17 +0000 (15:34 +0000)
config.py.example
motion.py
sql/from_2.sql [new file with mode: 0644]
sql/schema.sql

index daa9594dfa3f1801b1a8ce900fda8f03b903db94..f15a40014012550e9469d18c685e83d26c3b1ca1 100644 (file)
@@ -1,3 +1,8 @@
 DATABASE="..."
 USER="..."
 PASSWORD="..."
+
+DEFAULT_HOST="hostname for migration from db version < 2"
+
+groups=["group1", "group1"] # kinds of motion
+group_prefix={"group1": "g1", "group2": "g2"} # prefixes for motion identifiers
index ee1c3a8a86abcff5ca30d5916584724c6799c8d6..c5fbe7de6ce3eccd787b736da97710ab4f703292 100644 (file)
--- a/motion.py
+++ b/motion.py
@@ -20,8 +20,8 @@ app.register_blueprint(filters.blueprint)
 # Load config
 app.config.from_pyfile('config.py')
 
-groups=["fellowship", "board"]
-prefix={"fellowship": "f", "board": "m"}
+groups=app.config.get("groups")
+prefix=app.config.get("group_prefix")
 
 @app.before_request
 def lookup_user():
@@ -110,6 +110,14 @@ def init_db():
                 db.prepare("UPDATE \"schema_version\" SET \"version\"=2")()
                 db.prepare("CREATE UNIQUE INDEX motion_ident ON motion (identifier)")()
 
+        if ver < 3:
+            with app.open_resource('sql/from_2.sql', mode='r') as f:
+                db.execute(f.read())
+                db.prepare("UPDATE \"motion\" SET \"host\"=$1")(app.config.get("DEFAULT_HOST"))
+                db.prepare("ALTER TABLE \"motion\" ALTER COLUMN \"host\" SET NOT NULL")()
+                db.prepare("UPDATE \"schema_version\" SET \"version\"=3")()
+
+
 init_db()
 
 @app.route("/")
@@ -124,12 +132,12 @@ def main():
                              + "LEFT JOIN voter canceler ON canceler.id = motion.canceled_by "
     prev=None
     if start == -1:
-        p = get_db().prepare(q + "ORDER BY motion.id DESC LIMIT 11")
-        rv = p()
+        p = get_db().prepare(q + "WHERE motion.host = $1 ORDER BY motion.id DESC LIMIT 11")
+        rv = p(request.host)
     else:
-        p = get_db().prepare(q + "WHERE motion.id <= $1 ORDER BY motion.id DESC LIMIT 11")
-        rv = p(start)
-        rs = get_db().prepare("SELECT id FROM motion WHERE motion.id > $1 ORDER BY id ASC LIMIT 10")(start)
+        p = get_db().prepare(q + "WHERE motion.host = $1 AND motion.id <= $2 ORDER BY motion.id DESC LIMIT 11")
+        rv = p(request.host, start)
+        rs = get_db().prepare("SELECT id FROM motion WHERE motion.host = $1 AND motion.id > $2 ORDER BY id ASC LIMIT 10")(request.host, start)
         if len(rs) == 10:
             prev = rs[9][0]
         else:
@@ -153,15 +161,15 @@ def put_motion():
     db = get_db()
     with db.xact():
         t = db.prepare("SELECT CURRENT_TIMESTAMP")()[0][0];
-        s = db.prepare("SELECT MAX(\"identifier\") FROM \"motion\" WHERE \"type\"=$1 AND DATE(\"posed\")=DATE(CURRENT_TIMESTAMP)")
-        sr = s(cat)
+        s = db.prepare("SELECT MAX(\"identifier\") FROM \"motion\" WHERE \"type\"=$1 AND \"host\"=$2 DATE(\"posed\")=DATE(CURRENT_TIMESTAMP)")
+        sr = s(cat, request.host)
         ident=""
         if len(sr) == 0 or sr[0][0] is None:
             ident=prefix[cat]+"."+t.strftime("%Y%m%d")+".001"
         else:
             ident=prefix[cat]+"."+t.strftime("%Y%m%d")+"."+("%03d" % (int(sr[0][0].split(".")[2])+1))
-        p = db.prepare("INSERT INTO motion(\"name\", \"content\", \"deadline\", \"posed_by\", \"type\", \"identifier\") VALUES($1, $2, CURRENT_TIMESTAMP + $3 * interval '1 days', $4, $5, $6)")
-        p(request.form.get("title", ""), request.form.get("content",""), time, g.voter, cat, ident)
+        p = db.prepare("INSERT INTO motion(\"name\", \"content\", \"deadline\", \"posed_by\", \"type\", \"identifier\", \"host\") VALUES($1, $2, CURRENT_TIMESTAMP + $3 * interval '1 days', $4, $5, $6, $7)")
+        p(request.form.get("title", ""), request.form.get("content",""), time, g.voter, cat, ident, request.host)
     return rel_redirect("/")
 
 def motion_edited(motion):
@@ -169,7 +177,7 @@ def motion_edited(motion):
 
 @app.route("/motion/<string:motion>/cancel", methods=['POST'])
 def cancel_motion(motion):
-    rv = get_db().prepare("SELECT id, type FROM motion WHERE identifier=$1")(motion);
+    rv = get_db().prepare("SELECT id, type FROM motion WHERE identifier=$1 AND request.host")(motion, request.host);
     if len(rv) == 0:
         return "Error, Not found", 404
     id = rv[0].get("id")
@@ -177,7 +185,7 @@ def cancel_motion(motion):
         return "Forbidden", 403
     if request.form.get("reason", "none") == "none":
         return "Error, form requires reason", 500
-    rv = get_db().prepare("UPDATE motion SET canceled=CURRENT_TIMESTAMP, cancelation_reason=$1, canceled_by=$2 WHERE identifier=$3 AND canceled is NULL")(request.form.get("reason", ""), g.voter, motion)
+    rv = get_db().prepare("UPDATE motion SET canceled=CURRENT_TIMESTAMP, cancelation_reason=$1, canceled_by=$2 WHERE identifier=$3 AND host=$4 AND canceled is NULL")(request.form.get("reason", ""), g.voter, motion, request.host)
     return motion_edited(id)
 
 @app.route("/motion/<string:motion>")
@@ -186,8 +194,8 @@ def show_motion(motion):
                          + "LEFT JOIN vote on vote.motion_id=motion.id AND vote.voter_id=$2 "\
                          + "LEFT JOIN voter poser ON poser.id = motion.posed_by "\
                          + "LEFT JOIN voter canceler ON canceler.id = motion.canceled_by "
-                         + "WHERE motion.identifier=$1")
-    rv = p(motion, g.voter)
+                         + "WHERE motion.identifier=$1 AND motion.host=$3")
+    rv = p(motion, g.voter, request.host)
     votes = None
     if may("audit", rv[0].get("type")) and not rv[0].get("running") and not rv[0].get("canceled"):
         votes = get_db().prepare("SELECT vote.result, voter.email FROM vote INNER JOIN voter ON voter.id = vote.voter_id WHERE vote.motion_id=$1")(rv[0].get("id"));
@@ -198,17 +206,17 @@ def vote(motion):
     v = request.form.get("vote", "abstain")
     db = get_db()
     with db.xact():
-        rv = db.prepare("SELECT id, type FROM motion WHERE identifier=$1")(motion);
+        rv = db.prepare("SELECT id, type FROM motion WHERE identifier=$1 AND host=$2")(motion, host);
         if len(rv) == 0:
             return "Error, Not found", 404
         if not may("vote", rv[0].get("type")):
             return "Forbidden", 403
-        p = db.prepare("SELECT deadline > CURRENT_TIMESTAMP FROM motion WHERE identifier = $1")
+        p = db.prepare("SELECT deadline > CURRENT_TIMESTAMP FROM motion WHERE identifier = $1 AND host=$2")
         id = rv[0].get("id")
-        if not p(motion)[0][0]:
+        if not p(motion, request.host)[0][0]:
             return "Error, motion deadline has passed", 500
-        p = db.prepare("SELECT * FROM vote WHERE motion_id = $1 AND voter_id = $2")
-        rv = p(id, g.voter)
+        p = db.prepare("SELECT * FROM vote WHERE motion_id = $1 AND voter_id = $2 AND host=$3")
+        rv = p(id, g.voter, request.host)
         if len(rv) == 0:
             db.prepare("INSERT INTO vote(motion_id, voter_id, result) VALUES($1,$2,$3)")(id, g.voter, v)
         else:
diff --git a/sql/from_2.sql b/sql/from_2.sql
new file mode 100644 (file)
index 0000000..ade9ae1
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE "motion" ADD COLUMN "host" VARCHAR(500) DEFAULT NULL;\r
index c374ed7afded8040937724aa7ab8869d5e272466..cd47201bc863ba6eb894c6a3e9d7d041bf017e1f 100644 (file)
@@ -7,6 +7,7 @@ CREATE TABLE motion (id serial NOT NULL,
                    identifier VARCHAR(20) NOT NULL,
                    name VARCHAR(250) NOT NULL,
                    type VARCHAR(250) NOT NULL,
+                   host VARCHAR(500) NOT NULL,
                    content text NOT NULL,
                    posed timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                    posed_by int NOT NULL,
@@ -28,4 +29,4 @@ CREATE TABLE vote (motion_id INTEGER NOT NULL,
 
 DROP TABLE IF EXISTS schema_version;
 CREATE TABLE schema_version (version INTEGER NOT NULL);
-INSERT INTO schema_version(version) VALUES(2);
+INSERT INTO schema_version(version) VALUES(3);