s4
changeset 443:f1744a954888
New blog mode "quiz" introduced,
which allows normal users to view only administrators' or each one's own
article. But administrators can always see all articles.
author | HIROSE Yuuji <yuuji@gentei.org> |
---|---|
date | Sat, 01 Jul 2017 20:13:34 +0859 |
parents | 14764da097ec |
children | a4eb02e51a9c |
files | examples/sns/form/blog.def s4-blog.sh s4-funcs.sh |
diffstat | 3 files changed, 55 insertions(+), 9 deletions(-) [+] |
line diff
1.1 --- a/examples/sns/form/blog.def Sat Jul 01 12:05:07 2017 +0859 1.2 +++ b/examples/sns/form/blog.def Sat Jul 01 20:13:34 2017 +0859 1.3 @@ -1,5 +1,5 @@ 1.4 シリアル:id:p:serial: 1.5 -用途:mode:s:select:普通の掲示板=normal レポート提出用(相互に参照可能)=report-open レポート提出用(管理者のみ参照可能)=report-closed 1.6 +用途:mode:s:select:普通の掲示板=normal レポート提出用(相互に参照可能)=report-open レポート提出用(添付ファイルは管理者のみ参照可能)=report-closed クイズ(管理者以外は本人の記事のみ見える) 1.7 タイトル:title:s:text:maxlength="200" 1.8 コメント書込通知:notify:s:select:管理者のみに通知(グループの場合のみ)=admin 所有者全員に通知=all しない=no 1.9 稼動状態:state:s:select:稼動=active 凍結(新規書込停止)=frozen
2.1 --- a/s4-blog.sh Sat Jul 01 12:05:07 2017 +0859 2.2 +++ b/s4-blog.sh Sat Jul 01 20:13:34 2017 +0859 2.3 @@ -129,11 +129,13 @@ 2.4 # blog_s: title,ctime,heading 2.5 # blog_m: *article 2.6 2.7 + blogowner=`getvalbyid blog owner "$2"` 2.8 + isgroup "$blogowner" && isgroup=true || isgroup=false 2.9 + 2.10 # 2015-10-05 check readable 2.11 if ! $iswritable; then 2.12 - blogowner=`getvalbyid blog owner "$2"` 2.13 # err blogowner=$blogowner 2.14 - if isgroup "$blogowner"; then 2.15 + if $isgroup; then 2.16 regmode=`getgroupattr $blogowner regmode` 2.17 # err regmode=$regmode 2.18 if [ x"$regmode" = x"moderated" ]; then 2.19 @@ -172,6 +174,7 @@ 2.20 href3="(<a href=\"?gethandout+$rowid\" accesskey=\"f\" title=\"F\">ファイル取得</a>)" 2.21 fi 2.22 href4='<a href="#bottom" accesskey="b" title="B"> 末尾へ</a>' 2.23 + quizmodefile=$td/quiz; rm -f "$quizmodefile" # XXX: Global state 2.24 2.25 query<<-EOF | 2.26 SELECT coalesce((SELECT "yes" FROM blog 2.27 @@ -196,6 +199,18 @@ 2.28 2.29 <table class="blog_replies"> 2.30 EOF 2.31 + if [ x"$blogtype" = x"クイズ" ]; then 2.32 + if $isgroup; then 2.33 + if ! isgrpowner "$user" "$blogowner"; then 2.34 + qgrp=`sqlquote "$blogowner"` 2.35 + cat<<-EOF > $quizmodefile 2.36 + AND (author IN (SELECT user FROM grp_adm WHERE gname=$qgrp) 2.37 + OR 2.38 + author='$user') 2.39 + EOF 2.40 + fi 2.41 + fi 2.42 + fi 2.43 } 2.44 lkhome="<a href=\"$myname?home" lke='">' 2.45 lkedit="<a href=\"$myname?editart" 2.46 @@ -206,6 +221,7 @@ 2.47 atime=`query "SELECT time FROM acclog 2.48 WHERE tbl='blog' AND tblrowid=$rowid AND user='$user';"` 2.49 iconcleaner=$tmpd/iconcleaner.$$ 2.50 + [ -s $quizmodefile ] && cond_qz=`cat $quizmodefile` 2.51 # *** DO NOT USE query(), use "sq $db" instead here *** 2.52 # because the next block in pipe line uses query() repeatedly. 2.53 sq $db<<EOF | 2.54 @@ -239,8 +255,10 @@ 2.55 (SELECT group_concat(rowid||':'||length(bin)||':'||hex(val), ' ') 2.56 FROM article_m 2.57 WHERE id=a.id AND key='image') imxgids 2.58 -FROM (select rowid,id,author from article where blogid in 2.59 - (select id from blog where rowid=$rowid)) a 2.60 +FROM (select rowid,id,author from article 2.61 + where blogid in 2.62 + (select id from blog where rowid=$rowid) 2.63 + $cond_qz) a 2.64 LEFT JOIN 2.65 a_s s 2.66 ON a.id=s.id;
3.1 --- a/s4-funcs.sh Sat Jul 01 12:05:07 2017 +0859 3.2 +++ b/s4-funcs.sh Sat Jul 01 20:13:34 2017 +0859 3.3 @@ -1232,6 +1232,27 @@ 3.4 ## err email4gByid `echo $sql` 3.5 query "$sql" 3.6 } 3.7 +collectmembersbyid() { 3.8 + # Collect user names of group specified by grid 3.9 + rid=${1%%[!0-9]*} # Cleaning 3.10 + query "SELECT user FROM grp_mem \ 3.11 + WHERE gname=(SELECT gname FROM grp WHERE rowid=$rid);" 3.12 +} 3.13 +collectmembersbyid() { 3.14 + # Collect user names of group name 3.15 + qgrp=`sqlquote "$1"` 3.16 + query "SELECT user FROM grp_mem WHERE gname=$qgrp;" 3.17 +} 3.18 +collectgecosesbyid() { 3.19 + # Collect user gecoses of group 3.20 + rid=${1%%[!0-9]*} # Cleaning 3.21 + query<<-EOF 3.22 + SELECT gecos 3.23 + FROM gecoses 3.24 + WHERE name IN (SELECT user FROM grp_mem 3.25 + WHERE gname=(SELECT gname FROM grp WHERE rowid=$rid)); 3.26 + EOF 3.27 +} 3.28 collectemail() ( 3.29 # Collect email addresses for group $1 3.30 # If $TEAM is set, filter by team name 3.31 @@ -2520,7 +2541,10 @@ 3.32 SELECT blog.rowid rid, id, author 3.33 FROM blog 3.34 NATURAL JOIN 3.35 - (SELECT id, val owner FROM blog_s WHERE key='owner') bs 3.36 + (SELECT id, 3.37 + max(CASE key WHEN 'owner' THEN val END) owner, 3.38 + max(CASE key WHEN 'mode' THEN val END) mode 3.39 + FROM blog_s GROUP by id) bs 3.40 WHERE CASE WHEN (SELECT name FROM user where name=bs.owner) IS NOT NULL 3.41 THEN 1 -- blog owner is an user, READABLE 3.42 WHEN (SELECT val FROM grp_s 3.43 @@ -2529,6 +2553,8 @@ 3.44 (SELECT user FROM grp_mem 3.45 WHERE gname=bs.owner AND user='$user') IS NULL 3.46 THEN 0 3.47 + WHEN mode = 'quiz' 3.48 + THEN 0 -- "quiz" mode blog cannot be searched 3.49 ELSE 1 3.50 END; 3.51 EOF 3.52 @@ -2698,6 +2724,7 @@ 3.53 } 3.54 send2mem() { 3.55 rowid=`getpar grp` 3.56 + rowid=${rowid%%[!0-9]*} # Cleaning 3.57 if [ -z "$rowid" ]; then 3.58 echo "グループが未指定です。" | html p 3.59 return 3.60 @@ -2710,7 +2737,8 @@ 3.61 grp=`getgroupbyid $rowid` 3.62 members=`collectemail $grp` 3.63 # smail rcpt subj (file) 3.64 - smail "$members" "グループ $grp 宛メッセージ(from `gecos $user`)" <<EOF 3.65 + SMAIL_TO="`echo "$grp" | nkf -jM | tr -d '\n'` readers <$admin>" \ 3.66 + smail "$members" "グループ $grp 宛メッセージ(from `gecos $user`)" <<EOF 3.67 $urlbase?grp+$rowid 3.68 グループ $grp に所属する 3.69 `gecos $user` さんよりメッセージ: 3.70 @@ -2718,9 +2746,9 @@ 3.71 $message 3.72 EOF 3.73 cat<<EOF 3.74 -<p>以下の宛先に送信しました。</p> 3.75 +<p>以下のユーザに送信しました。</p> 3.76 <pre> 3.77 -$members 3.78 +`collectgecosesbyid "$rowid" | sed 's/$/ さん/'` 3.79 </pre> 3.80 <p><a href="?grp+$rowid">グループ $grp</a>に戻る。</p> 3.81 EOF