diff s4-funcs.sh @ 382:7b1c44bf12e8

Add feature of cloning a group
author HIROSE Yuuji <yuuji@gentei.org>
date Mon, 28 Nov 2016 09:24:20 +0859
parents 165fa0a61d18
children 93ba4a8f3398
line wrap: on
line diff
--- a/s4-funcs.sh	Mon Nov 28 07:46:35 2016 +0859
+++ b/s4-funcs.sh	Mon Nov 28 09:24:20 2016 +0859
@@ -1395,6 +1395,51 @@
   ## err grpupdate:new-grid=$grid, sql=$sql
   grp $grid
 }
+groupclone() {
+  # $1=grp-rowid of clone-base group
+  qgrp=`query "SELECT quote(gname) FROM grp WHERE rowid=$1;"`
+  if [ -z "$qgrp" ]; then
+    echo "無効なグループIDです($1)" | html p
+    return
+  fi
+  i=0
+  while true; do
+    copy="-copy$i"
+    newqname=`query "SELECT quote($qgrp || '$copy');"`
+    # err Trying new grp=$newqname with copy=$copy
+    test=`query "SELECT gname FROM grp WHERE gname=$newqname;"`
+    if [ -n "$test" ]; then
+      i=$((i++))
+      continue
+    fi
+    break
+  done
+  # Creating New group "$newqname" with members of old group
+  # err Creating new grp=$newqname with copy=$copy
+  query<<-EOF
+	BEGIN;
+	INSERT INTO grp VALUES($newqname);	-- Create NEW one
+	REPLACE INTO grp_s(gname, key, val)	-- Copy tag
+	       	     SELECT $newqname, key, val
+		     FROM grp_s WHERE gname=$qgrp AND key IN ('tag', 'mode');
+	REPLACE INTO grp_s(gname, key, type, val) -- Copy gecos with "copy$n"
+	       	     SELECT $newqname, key, type, val || '$copy'
+		     FROM grp_s WHERE gname=$qgrp AND key='gecos';
+	-- Copy members and their configuration --
+	REPLACE INTO grp_mem SELECT $newqname, user
+		     	     FROM grp_mem WHERE gname=$qgrp;
+	REPLACE INTO grp_mem_s SELECT $newqname, user, key, type, val, bin
+		     	       FROM grp_mem_s WHERE gname=$qgrp;
+	REPLACE INTO grp_mem_m SELECT $newqname, user, key, type, val, bin
+		     	       FROM grp_mem_m WHERE gname=$qgrp;
+	-- Copy administrators --
+	REPLACE INTO grp_adm SELECT $newqname, user
+		     	     FROM grp_mem WHERE gname=$qgrp;
+	COMMIT;
+	EOF
+  newrowid=`query "SELECT rowid FROM grp WHERE gname=$newqname;"`
+  STOPCLONEMSG=1 groupconf "$newrowid"
+}
 groupman() {
   note="<p>グループ名に使用できない文字は自動的に削除されます。</p>"
   
@@ -1419,6 +1464,9 @@
   rowid=${1%%[!A-Z0-9a-z_]*}
   # GF_ACTION="?grp+$1" edittable "$formdir/grp.def" "grp" "$rowid" #2015-0804
   GF_STAGE="groupupdate" edittable "$formdir/grp.def" "grp" "$rowid"
+  test -z "$STOPCLONEMSG" &&
+      echo "<a href=\"?groupclone+$rowid\">同じ構成員で新規グループ作成</a>" \
+	  | html p
 }
 mems() {
   _m4 -D_TITLE_="参加者一覧" -D_BODYCLASS_=listmember $layout/html.m4.html
@@ -2949,11 +2997,13 @@
 	#err "select quote($col) from $tbl where rowid=$rowid;"
 	old=`query "select quote($col) from $tbl where rowid=$rowid;"`
 	cat<<-EOF | query
-		BEGIN;
+		-- Here we cannot use BEGIN-COMMIT because groupupdate()
+		-- should use EXCLUSIVE transaction outside of this.
+		SAVEPOINT par2table;
 		$sql
 		update blog_s set val=$val
 		where key='owner' and val=$old;
-		COMMIT;
+		RELEASE SAVEPOINT par2table;
 		EOF
 	## XX: DIRTY Hack Ends here
 	## We should keep blog's owner as a single column which has

yatex.org