s4

changeset 222:d320c73bf16f

Add "team" attributes in groups.
author HIROSE Yuuji <yuuji@gentei.org>
date Mon, 20 Jun 2016 00:02:52 +0859
parents acd904062e55
children 8e60f95046b0
files s4-blog.sh s4-cgi.sh s4-funcs.sh
diffstat 3 files changed, 229 insertions(+), 38 deletions(-) [+]
line diff
     1.1 --- a/s4-blog.sh	Sat Jun 18 21:02:19 2016 +0859
     1.2 +++ b/s4-blog.sh	Mon Jun 20 00:02:52 2016 +0859
     1.3 @@ -16,13 +16,14 @@
     1.4    mode=`getgroupattr $grp regmode`
     1.5  }
     1.6  blog_notify_reply() (
     1.7 -  # $1=articleid $2=ReplyingUser $3=WrittenText $4(optional)=Action
     1.8 +  # $1=blogid $2=ReplyingUser $3=WrittenText $4(optional)=Action
     1.9    blogowner=`getvalbyid blog owner "$1"`
    1.10    [ x"$2" = x"$blogowner" ] && return # If author=blogowner, unnecessary
    1.11    blogtitle=`getvalbyid blog title "$1"`
    1.12    blogurl="$urlbase?replyblog+$1"
    1.13    action=${4:-書き込み}
    1.14    mode=`getvalbyid blog notify "$1"`
    1.15 +  EXCEPT=`sqlquote "$user"`
    1.16    case $mode in
    1.17      admin)
    1.18        if isgroup "$blogowner"; then
    1.19 @@ -36,7 +37,12 @@
    1.20        fi
    1.21  	;;
    1.22      no)		return ;;
    1.23 -    *)		emails=`collectemail $blogowner` ;;
    1.24 +    *) team=`query "SELECT val FROM blog_s
    1.25 +		    WHERE id=(SELECT id FROM blog WHERE rowid=$1)
    1.26 +			   AND key='team';"`
    1.27 +       # team cannot get `getvalbyid blog team "$1"` because it's not
    1.28 +       # defined in blog.def.  Yes, it is Illegal USE!!
    1.29 +       emails=`TEAM=$team collectemail $blogowner` ;;
    1.30    esac
    1.31    err notify: user=$user Admins=`getgroupadmins $blogowner` Mode=$mode Emails="[$emails]"
    1.32    SMAIL_TO="`echo "$blogowner" | nkf -jM | tr -d '\n'` readers <$admin>" \
    1.33 @@ -535,7 +541,7 @@
    1.34  
    1.35  blog_reply() {
    1.36    rowid=$1
    1.37 -err  rowid=$1
    1.38 +  err  rowid=$1
    1.39  
    1.40    if [ -z "$rowid" ]; then
    1.41      echo "表示する日記番号が未指定です。" | html p
    1.42 @@ -547,7 +553,12 @@
    1.43      subtitle="`gecos $owner` さんの話題"
    1.44    else
    1.45      grprowid=`query "select rowid from grp where gname=\"$owner\";"`
    1.46 -    subtitle="グループ <a href=\"?grp+$grprowid\">$owner</a> での話題"
    1.47 +    subtitle="グループ <a href=\"?grp+$grprowid\">$owner</a> での話題
    1.48 +    	`query \"SELECT printf('(チーム:%s)', val)\
    1.49 +		 FROM blog_s
    1.50 +		 WHERE id=(SELECT id FROM blog WHERE rowid=$rowid)
    1.51 +		       AND key='team';
    1.52 +	 \"|htmlescape`"
    1.53    fi
    1.54    if [ -z "$title" ]; then
    1.55      echo "日記番号指定が無効です。" | html p
     2.1 --- a/s4-cgi.sh	Sat Jun 18 21:02:19 2016 +0859
     2.2 +++ b/s4-cgi.sh	Mon Jun 20 00:02:52 2016 +0859
     2.3 @@ -114,6 +114,24 @@
     2.4    # $1=name $2=val(filename)
     2.5    cgi_multi $1 "$2" cgi_file "$3"
     2.6  }
     2.7 +cgi_datalist_h() {
     2.8 +  # $1=id $2...=hexed-args
     2.9 +  echo "<datalist id=\"$1\">"
    2.10 +  shift
    2.11 +  for i; do
    2.12 +    echo "<option value=\"`echo "$i"|unhexize`\"></option>"
    2.13 +  done
    2.14 +  echo "</datalist>"
    2.15 +}
    2.16 +cgi_select_h() {
    2.17 +  # $1=name $2...=hexed-args
    2.18 +  echo "<select name=\"$1\"${CGI_SELECT_MULTI:+ multiple}>"
    2.19 +  shift
    2.20 +  for i; do
    2.21 +    echo "<option>`echo \"$i\"|unhexize|htmlescape`</option>"
    2.22 +  done
    2.23 +  echo "</select>"
    2.24 +}
    2.25  
    2.26  html() {
    2.27    echo "<$*>"
     3.1 --- a/s4-funcs.sh	Sat Jun 18 21:02:19 2016 +0859
     3.2 +++ b/s4-funcs.sh	Mon Jun 20 00:02:52 2016 +0859
     3.3 @@ -1134,10 +1134,13 @@
     3.4  }
     3.5  collectemail() (
     3.6    # Collect email addresses for group $1
     3.7 +  # If $TEAM is set, filter by team name
     3.8 +  # If $EXCEPT is set as username(s) delimited by comma,
     3.9 +  # remove $EXCEPT from list: ....NOT IN ($EXCEPT)
    3.10    for e; do
    3.11      if isuser "$e"; then
    3.12 -    em=`query "select val from user_m where name='$e' and key='email';"`
    3.13 -    [ -n "$em" ] && echo "$em" || echo "$e"
    3.14 +      em=`query "select val from user_m where name='$e' and key='email';"`
    3.15 +      [ -n "$em" ] && echo "$em" || echo "$e"
    3.16      else
    3.17   #    sql="with recursive allmem as
    3.18   #        (select gname,val from grp_m where gname='$1'
    3.19 @@ -1149,11 +1152,18 @@
    3.20   # where a.val in (select name from user) limit 10000;"
    3.21        # tmp tmp tmp tmp tmp tmp tmp
    3.22        qgrp=`sqlquote "$e"`
    3.23 +      if [ -z "$TEAM" ]; then
    3.24 +	gmem="grp_mem"
    3.25 +      else
    3.26 +	tm=`sqlquote "$TEAM"`
    3.27 +	gmem="(SELECT gname, user FROM grp_mem_m WHERE gname='$e' AND key='team' AND val=$tm)"
    3.28 +      fi
    3.29 +      ex=${EXCEPT:+"AND g.user NOT IN ($EXCEPT)"}
    3.30        sql="select coalesce(s.val,um.val,g.user) from
    3.31 -	 grp_mem g left join grp_mem_s s
    3.32 +	 $gmem g left join grp_mem_s s
    3.33  	 on g.gname=s.gname and g.user=s.user and s.key='email'
    3.34  	 left join user_m um on g.user=um.name and um.key='email'
    3.35 -	 where g.gname=$qgrp;"
    3.36 +	 where g.gname=$qgrp $ex;"
    3.37        err CollectEmail: `echo "$sql"`
    3.38        query "$sql"
    3.39      fi
    3.40 @@ -1244,8 +1254,9 @@
    3.41        $layout/login.m4.html
    3.42    return
    3.43  }
    3.44 -newgrpchk() {
    3.45 -  # Check if $1 is existing and 
    3.46 +group_safename() {
    3.47 +  # Convert $1 to safe group name
    3.48 +  echo "$1" | tr -d '"'"'",
    3.49  }
    3.50  groupupdate() {
    3.51    gname=`getpar gname`
    3.52 @@ -1253,7 +1264,7 @@
    3.53    err Enter:groupupdate
    3.54    if [ -n "$gname" ]; then
    3.55      # See ALSO same job in showgroup()
    3.56 -    newgname=`echo "$gname"|tr -d '\"'"'"`
    3.57 +    newgname=`group_safename "$gname"`
    3.58      err newgname=$newgname
    3.59      if [ x"$newgname" != x"$gname" ]; then
    3.60        err NewGNAME: gname=$newgname
    3.61 @@ -1698,6 +1709,11 @@
    3.62  listgroup() {
    3.63    listentry group "$@"
    3.64  }
    3.65 +hexteams() {	# $1=gname, $2(optional)=user
    3.66 +  cond=${2:+" AND user='$2'"}
    3.67 +  query "SELECT DISTINCT hex(val) FROM grp_mem_m
    3.68 +	 WHERE gname='$1' AND key='team'$cond;"
    3.69 +}
    3.70  showgroup() { # $1=group-rowid
    3.71  #   gname=`getpar gname`
    3.72  #   if [ -n "$gname" ]; then
    3.73 @@ -1769,7 +1785,7 @@
    3.74  err ismember $user $grp
    3.75    ismember "$user" "$grp" && ismem='checked' || nomem='checked'
    3.76    # このグループでの加入アドレス
    3.77 -  eml=`query "select val from grp_mem_s where gname='$2' and user='$user' \
    3.78 +  eml=`query "select val from grp_mem_s where gname=$qgrp and user='$user' \
    3.79  	and key='email';"`
    3.80  err EML: "select val from grp_mem_s where gname='$2' and user='$user' \
    3.81  	and key='email';"
    3.82 @@ -1805,14 +1821,26 @@
    3.83  EOF
    3.84    cond="where a.id in (select id from blog_s where key='owner' and val=$qgrp) order by ctime desc"
    3.85    DT_CHLD=article:blogid \
    3.86 -	 DT_VIEW=replyblog dumptable html blog 'ctime title heading' "$cond"
    3.87 +	 DT_VIEW=replyblog dumptable html blog 'ctime team title heading' "$cond"
    3.88  
    3.89    getgname="(select gname from grp where rowid=$rowid)"
    3.90    c="group by b.name having b.name in (select user from grp_mem where gname=$getgname)"
    3.91    cm="?commission+$rowid"
    3.92    thumbxy=50x50 listmember "" "$c" \
    3.93        |sed -e "s|\(<br>\),not=\(.*\)|\1|"	# 間違って押しやすい
    3.94 -  ##    |sed -e "s|\(<br>\),not=\(.*\)|\1<a href=\"$cm+\2\">管理者委託</a>|"
    3.95 +  # team list
    3.96 +  hexteams=`hexteams "$grp"`
    3.97 +  if [ -n "$hexteams" ]; then
    3.98 +    echo "チーム一覧" | html h2
    3.99 +    echo '<div class="dumptable"><table class="b">'
   3.100 +    sq $db -html -header<<-EOF
   3.101 +	SELECT val TEAM,
   3.102 +       	       group_concat((SELECT gecos FROM gecoses WHERE name=user), ',')
   3.103 +		MEMBERS
   3.104 +	       FROM grp_mem_m WHERE gname='foo' AND key='team' GROUP BY val;
   3.105 +	EOF
   3.106 +    echo '</table></div>'
   3.107 +  fi
   3.108  }
   3.109  grpaction() {			# $1=group-rowid
   3.110    err GRP_ACTION:IN
   3.111 @@ -1896,16 +1924,38 @@
   3.112        fi
   3.113      elif [ x"$rm" = x"commission" ]; then
   3.114        grp_reg_adm $grid $usel
   3.115 +    elif [ x"$rm" = x"addteam" ]; then
   3.116 +      team=`getpar team|sed "s/'/''/g"`	# for single quotation
   3.117 +      newteam=`echo "$team"|tr -d ,`
   3.118 +      if [ x"$team" != x"$newteam" ]; then
   3.119 +	echo "チーム名に使えない文字を除去しました" | html p
   3.120 +	team=newteam
   3.121 +      fi
   3.122 +      if [ -z "$team" -o x"$team" = x"なし" ]; then
   3.123 +	cat<<-EOF | html p
   3.124 +	有効なチーム名を入力してください。
   3.125 +	カンマだけ、「なし」という名前は使えません。
   3.126 +	EOF
   3.127 +	echo "有効なチーム名を入力してください。" | html p
   3.128 +      else
   3.129 +	grp_add_team $grid "$team" $usel
   3.130 +      fi
   3.131 +    elif [ x"$rm" = x"rmteam" ]; then
   3.132 +      if [ x"yes" = x"`getpar teamconfirm`" ]; then
   3.133 +	rmteam=`getpar rmteam|sed "s/'/''/g"`
   3.134 +	if [ -n "`query \"SELECT val FROM grp_mem_m WHERE\
   3.135 +		gname='$grp' AND user='$user' AND key='team'\
   3.136 +		AND val='$rmteam';\"`" ]; then
   3.137 +	  grp_rm_team $grid "$rmteam" $usel
   3.138 +	else
   3.139 +	  echo "所属していないチームの除去操作はできません。"|html p
   3.140 +	fi
   3.141 +      else
   3.142 +	echo "確認チェックなしなのでチーム除去しませんでした。"|html p
   3.143 +      fi
   3.144      fi
   3.145    fi
   3.146    # New entry
   3.147 -  sql="select u.rowid||','||j.* from user u
   3.148 -	 join (select a.user as name,coalesce(b.val,a.user)
   3.149 -		 from (select gname,user from grp_mem
   3.150 -		 where gname=(select gname from grp where rowid=$1))
   3.151 -	 a left join (select gname,user,val from grp_mem_s where key='email')
   3.152 -	 b using(gname,user))
   3.153 -	j using(name) order by u.name;"
   3.154    sql="select 	/* Ahh, ugly SQL, I wanna fix... */
   3.155  	 case
   3.156  	 when (select user from grp_adm where
   3.157 @@ -1914,39 +1964,68 @@
   3.158  	      then 'k'
   3.159  	 else ''
   3.160  	 end || a.rowid||
   3.161 -	 ','||coalesce(val,a.name) as name from
   3.162 +	 ','||coalesce(val,a.name) as name,
   3.163 +	 (SELECT group_concat(val, ',')
   3.164 +	  FROM	 grp_mem_m
   3.165 +	  WHERE	 gname='$grp' AND user=a.name AND key='team') as TEAM
   3.166 +	 from
   3.167  	 (select rowid,name from user where name in
   3.168  		 (select user from grp_mem where
   3.169  		 gname=(select gname from grp where rowid=$grid)))
   3.170  	  a left join user_s on a.name=user_s.name and key='gecos'
   3.171  	order by coalesce(val,a.name);"
   3.172    err grpaction: `echo $sql`
   3.173 -  b1='<label> <input type="checkbox" name="usel" value="'
   3.174 -  ba='<label class="admin"><input type="checkbox" name="usel" value="'
   3.175 -  b2='"> <span>' b3='</span></label>'
   3.176    tf=$tmpd/title.$$
   3.177 -  echo "グループ[$grp]参加メンバーに対する操作" > $tf
   3.178 +  echo "グループ[<a href=\"?grp+$grid\">$grp<a>]参加メンバーに対する操作" > $tf
   3.179    cmmsg="<div class=\"fold\">
   3.180 -`cgi_radio rm commission id=\"cmadmin\"` <label
   3.181 +`cgi_radio rm commission id=\"cmadmin\"`<label
   3.182   for=\"cmadmin\">下でチェックした人にグループ管理者委任</label>
   3.183  <div><p>このグループでの全権を付与します。信頼できる人に託してください。
   3.184  </p></div></div>"
   3.185    excmsg="<div class=\"fold\">
   3.186 -`cgi_radio rm yes ` 下でチェックした人のグループ登録解除
   3.187 +`cgi_radio rm yes `下でチェックした人のグループ登録解除
   3.188  <div>
   3.189  本当に消します! `cgi_checkbox confirm yes` 確認
   3.190  <p>この操作による通知は本人に行きません。
   3.191  あらかじめ通知するか、登録解除してよい状況かしっかり確認してください。</p>
   3.192  </div>
   3.193  </div>"
   3.194 +  # Get team list to which current user belongs into $hexteams
   3.195 +  myhexteams=$(hexteams "$grp" "$user")
   3.196 +  allhexteams=$(hexteams "$grp")
   3.197 +  if [ -n "$hexteams" ]; then
   3.198 +    rmteam="<div class=\"fold\">
   3.199 +`cgi_radio rm rmteam 'id=\"cmrmteam\"'`<label
   3.200 +for=\"cmrmteam\">下でチェックした人からチーム属性を除去する</label>
   3.201 +<div>チーム属性:`cgi_select_h rmteam $myhexteams`
   3.202 +を除去します: `cgi_checkbox teamconfirm yes` 確認
   3.203 +<p>この操作による通知は本人に行きません。
   3.204 +あらかじめ通知するか、登録解除してよい状況かしっかり確認してください。</p>
   3.205 +</div>
   3.206 +</div>
   3.207 +"
   3.208 +  fi
   3.209 +  b1='<label> <input type="checkbox" name="usel" value="'
   3.210 +  ba='<label class="admin"><input type="checkbox" name="usel" value="'
   3.211 +  #b2='"> <span>' b3='</span></label>'
   3.212 +  #    	| sed  -e "s|^\(<TR><TD>\)k\([0-9]*\),\([^<]*\)|\1$ba\2$b2\3$b3|" \
   3.213 +  #	       -e "s|^\(<TR><TD>\)\([0-9]*\),\([^<]*\)|\1$b1\2$b2\3$b3|" \
   3.214 +  lnk='"> <span>\3</span></label> [<a href="?home+\2">HOME</a>]'
   3.215    cgi_form grpaction<<EOF \
   3.216 -      	| sed  -e "s|^\(<TR><TD>\)k\([0-9]*\),\([^<]*\)|\1$ba\2$b2\3$b3|" \
   3.217 -	       -e "s|^\(<TR><TD>\)\([0-9]*\),\([^<]*\)|\1$b1\2$b2\3$b3|" \
   3.218 +      	| sed  -e "s|^\(<TR><TD>\)k\([0-9]*\),\([^<]*\)|\1$ba\2$lnk|" \
   3.219 +	       -e "s|^\(<TR><TD>\)\([0-9]*\),\([^<]*\)|\1$b1\2$lnk|" \
   3.220  	| _m4 -D_TITLE_="spaste(\`$tf')" \
   3.221  	      -D_SUBTITLE_="チェック後操作ボタン" \
   3.222  	      -D_FORM_="syscmd(cat)" -D_DUMPTABLE_="" \
   3.223  	      $layout/form+dump.m4.html
   3.224  <div class="fold">
   3.225 +`cgi_radio rm addteam 'id="cmteam"'`<label
   3.226 +for="cmteam">下でチェックした人で同じチーム属性を与える</label>
   3.227 +<div>チーム名:`cgi_text team "" 'id="inteam" list="teams"'`
   3.228 +`cgi_datalist_h teams $allhexteams`
   3.229 +</div></div>
   3.230 +${rmteam}
   3.231 +<div class="fold">
   3.232  `cgi_radio rm send id="sendmsg"`<label
   3.233   for="sendmsg">下でチェックした人にメッセージを送信する</label>
   3.234  <div>
   3.235 @@ -1956,12 +2035,13 @@
   3.236  ${isowner:+$cmmsg$excmsg}
   3.237  <h4>$grp 参加者一覧</h4>
   3.238  <table>
   3.239 -`sq $db -html "$sql"`
   3.240 +`sq $db -header -html "$sql"`
   3.241  </table>
   3.242  `cgi_hidden grp $grid`
   3.243  EOF
   3.244  }
   3.245  crview4article() { # $1=rowid of blog, $2(optional)=extra SQL
   3.246 +  # Create TEMPORARY VIEW
   3.247    query<<EOF
   3.248  CREATE TEMPORARY VIEW writeusers AS
   3.249   SELECT DISTINCT author FROM article
   3.250 @@ -2032,22 +2112,45 @@
   3.251  	</div>
   3.252  	EOF
   3.253      fi
   3.254 +    # end of isuser "$owner"
   3.255 +  elif { hexteams=$(hexteams "$owner" )	# blog is of GROUP 
   3.256 +	 [ -n "$hexteams" ];}; then
   3.257 +    none="`echo なし|hexize`"
   3.258 +    cat<<-EOF
   3.259 +	<div class="fold">
   3.260 +	`cgi_checkbox mv2team send id="mv2team"`<label
   3.261 +	 for="mv2team">この話題を以下のチームのものにする</label>
   3.262 +	<div><p>現在の所属チーム設定:
   3.263 +	`query "SELECT
   3.264 +           coalesce((SELECT val FROM blog_s
   3.265 +            WHERE id=(SELECT id FROM blog WHERE rowid=$rowid)
   3.266 +            AND key='team'),
   3.267 +	   ':なし');"`</p>
   3.268 +	<form action="?mvart" method="POST" enctype="multipart/form-data">
   3.269 +	移動先チーム: `cgi_select_h mv2team $none $hexteams`
   3.270 +	<p>`cgi_checkbox cfm yes`<label>確認</label></p>
   3.271 +	`cgi_hidden blogrowid $rowid`<br>
   3.272 +	`cgi_submit 移動`
   3.273 +	`cgi_reset Reset`
   3.274 +	</form></div></div>
   3.275 +	EOF
   3.276    fi
   3.277  }
   3.278 -mvart() {
   3.279 +mvart() {	# move diary to some group or team
   3.280 +		# or move blog of group to team which belong to the group
   3.281    blogrowid=`getpar blogrowid`
   3.282 -  mv2grp=`getpar mv2grp`
   3.283    cfm=`getpar cfm`
   3.284    ##### echo move blog:$blogrowid to $mv2grp | html p
   3.285    blogrowid=${blogrowid%%[!A-Z0-9a-z_]*}	# Purify
   3.286 -  mv2grp=${mv2grp%%[!A-Z0-9a-z_]*}		# Purify
   3.287    . ./s4-blog.sh
   3.288 -  if [ -z "$blogrowid" -o -z "$mv2grp" ]; then
   3.289 +  if [ -z "$blogrowid" ]; then
   3.290      echo "無効な指定です(mvart)。" | html p
   3.291      return
   3.292    elif [ x"$cfm" != x"yes" ]; then
   3.293      echo "記事移動の確認にチェックがないので通常表示に戻ります。" | html p
   3.294 -  else				# OK to go
   3.295 +  elif { mv2grp=`getpar mv2grp`
   3.296 +         mv2grp=${mv2grp%%[!A-Z0-9a-z_]*}		# Purify
   3.297 +	 [ -n "$mv2grp" ]; }; then
   3.298      crview4article $blogrowid
   3.299      ########## TRANSACTION BEGIN
   3.300      query "BEGIN;"
   3.301 @@ -2063,6 +2166,29 @@
   3.302      fi
   3.303      query "END;"
   3.304      ########## TRANSACTION END
   3.305 +  elif { mv2team=`getpar mv2team|sed "s/'/''/g"`
   3.306 +	 [ -n "$mv2team" ];}; then
   3.307 +    # blog owner can move it to ANY team
   3.308 +    case "$mv2team" in
   3.309 +      'なし')
   3.310 +	cat<<-EOF
   3.311 +	  DELETE FROM blog_s
   3.312 +	  WHERE  id=(SELECT id FROM blog WHERE rowid=$blogrowid)
   3.313 +		 AND key='team';
   3.314 +	EOF
   3.315 +	;;
   3.316 +      "") ;;
   3.317 +      *)cat<<-EOF
   3.318 +	  BEGIN;
   3.319 +	  REPLACE INTO blog_s(id, key, val)
   3.320 +	  VALUES((SELECT id FROM blog WHERE rowid=$blogrowid),
   3.321 +		 'team', '$mv2team');
   3.322 +	  REPLACE INTO blog_s(id, key, val)
   3.323 +	  VALUES((SELECT id FROM blog WHERE rowid=$blogrowid),
   3.324 +		 'notify', 'all');	-- Change notify to all
   3.325 +	  END;
   3.326 +	EOF
   3.327 +    esac | query
   3.328    fi
   3.329    blog_reply $blogrowid
   3.330    echo yes | html p
   3.331 @@ -2187,8 +2313,14 @@
   3.332  }
   3.333  joingrp() {
   3.334    # $1=group $2=user $3=yes/no $4=email(if any $5=AsAdmin)
   3.335 -err joingrp: \$1=$1 \$2=$2 \$3=$3 \$4=$4
   3.336 -  isgrpowner "$user" "$1" && isowner="yes" || isowner=""
   3.337 +  err joingrp: \$1=$1 \$2=$2 \$3=$3 \$4=$4
   3.338 +  if isgrpowner "$user" "$1"; then
   3.339 +    isowner="yes"
   3.340 +  elif [ -n "$5" ]; then
   3.341 +    isowner="yes"
   3.342 +  else
   3.343 +    isowner=""
   3.344 +  fi
   3.345    err jg:isgrpowner: isowner="$isowner"
   3.346    if [ -n "$isowner" ]; then
   3.347      : # GROUP OWNER CAN DO EVERYTHING ABOUT REGISTRATION/RETIREMENT
   3.348 @@ -2242,6 +2374,36 @@
   3.349  delete from grp_mem_m $cond;"
   3.350    fi
   3.351  }
   3.352 +grp_add_team() (
   3.353 +  # $1=grp-rowid $2=team $3...=user-rowid(s)
   3.354 +  grp=`getgroupbyid $1`
   3.355 +  team=$2; shift; shift
   3.356 +  [ -z "$grid" -o -z "$team" -o -z "$1" ] && return
   3.357 +  { echo "BEGIN;"
   3.358 +    for user; do
   3.359 +      echo "REPLACE INTO grp_mem_m(gname, user, key, type, val) VALUES(\
   3.360 +		'$grp',\
   3.361 +		(SELECT name FROM user WHERE rowid=$user),\
   3.362 +		'team', 'string', '$team');"
   3.363 +    done
   3.364 +    echo "END;"
   3.365 +  } | query
   3.366 +)
   3.367 +grp_rm_team() (
   3.368 +  # $1=grp-rowid $2=team $3...=user-rowid(s)
   3.369 +  grp=`getgroupbyid $1`
   3.370 +  team=$2; shift; shift
   3.371 +  [ -z "$grid" -o -z "$team" -o -z "$1" ] && return
   3.372 +  { echo "BEGIN;"
   3.373 +    for user; do
   3.374 +      echo "DELETE FROM grp_mem_m\
   3.375 +	    WHERE gname='$grp'\
   3.376 +	    AND user=(SELECT name FROM user WHERE rowid=$user)\
   3.377 +	    AND key='team' AND val='$team';"
   3.378 +    done
   3.379 +    echo "END;"
   3.380 +  } | query
   3.381 +)
   3.382  grp_reg_adm() {
   3.383    # $1=grp-rowid $2...=user-rowid
   3.384    grid=$1