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