changeset 382:7b1c44bf12e8

Add feature of cloning a group
author HIROSE Yuuji <yuuji@gentei.org>
date Mon, 28 Nov 2016 09:24:20 +0859
parents 879d7f1cd676
children 93ba4a8f3398
files examples/sns/form/grp.def s4-funcs.sh s4.cgi
diffstat 3 files changed, 54 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/examples/sns/form/grp.def	Mon Nov 28 07:46:35 2016 +0859
+++ b/examples/sns/form/grp.def	Mon Nov 28 09:24:20 2016 +0859
@@ -9,3 +9,4 @@
 プロフィール画像:profimg:m:image:
 メンバー:member:m:*grp_mem:maxlength="4M"
 更新:mtime:s:stamp:
+書込:wtime:s:stamp:
--- 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
--- a/s4.cgi	Mon Nov 28 07:46:35 2016 +0859
+++ b/s4.cgi	Mon Nov 28 09:24:20 2016 +0859
@@ -48,7 +48,7 @@
     showattc "$@"
     exit 0			# Do not output further chunks
     ;;
-  invite|groupman|userconf|groupconf|mems|grps|grp|groupupdate|grpaction|joingrpadmit|commission|editheading|editart|showattc|send2mem|mvart)
+  invite|groupman|userconf|groupconf|mems|grps|grp|groupupdate|groupclone|grpaction|joingrpadmit|commission|editheading|editart|showattc|send2mem|mvart)
     contenttype; echo
     [ -n "$1" ] && shift
     $stage "$@"

yatex.org