Mercurial > hgrepos > hgweb.cgi > 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 wrap: on
line diff
--- a/examples/sns/form/blog.def Sat Jul 01 12:05:07 2017 +0859 +++ b/examples/sns/form/blog.def Sat Jul 01 20:13:34 2017 +0859 @@ -1,5 +1,5 @@ シリアル:id:p:serial: -用途:mode:s:select:普通の掲示板=normal レポート提出用(相互に参照可能)=report-open レポート提出用(管理者のみ参照可能)=report-closed +用途:mode:s:select:普通の掲示板=normal レポート提出用(相互に参照可能)=report-open レポート提出用(添付ファイルは管理者のみ参照可能)=report-closed クイズ(管理者以外は本人の記事のみ見える) タイトル:title:s:text:maxlength="200" コメント書込通知:notify:s:select:管理者のみに通知(グループの場合のみ)=admin 所有者全員に通知=all しない=no 稼動状態:state:s:select:稼動=active 凍結(新規書込停止)=frozen
--- a/s4-blog.sh Sat Jul 01 12:05:07 2017 +0859 +++ b/s4-blog.sh Sat Jul 01 20:13:34 2017 +0859 @@ -129,11 +129,13 @@ # blog_s: title,ctime,heading # blog_m: *article + blogowner=`getvalbyid blog owner "$2"` + isgroup "$blogowner" && isgroup=true || isgroup=false + # 2015-10-05 check readable if ! $iswritable; then - blogowner=`getvalbyid blog owner "$2"` # err blogowner=$blogowner - if isgroup "$blogowner"; then + if $isgroup; then regmode=`getgroupattr $blogowner regmode` # err regmode=$regmode if [ x"$regmode" = x"moderated" ]; then @@ -172,6 +174,7 @@ href3="(<a href=\"?gethandout+$rowid\" accesskey=\"f\" title=\"F\">ファイル取得</a>)" fi href4='<a href="#bottom" accesskey="b" title="B"> 末尾へ</a>' + quizmodefile=$td/quiz; rm -f "$quizmodefile" # XXX: Global state query<<-EOF | SELECT coalesce((SELECT "yes" FROM blog @@ -196,6 +199,18 @@ <table class="blog_replies"> EOF + if [ x"$blogtype" = x"クイズ" ]; then + if $isgroup; then + if ! isgrpowner "$user" "$blogowner"; then + qgrp=`sqlquote "$blogowner"` + cat<<-EOF > $quizmodefile + AND (author IN (SELECT user FROM grp_adm WHERE gname=$qgrp) + OR + author='$user') + EOF + fi + fi + fi } lkhome="<a href=\"$myname?home" lke='">' lkedit="<a href=\"$myname?editart" @@ -206,6 +221,7 @@ atime=`query "SELECT time FROM acclog WHERE tbl='blog' AND tblrowid=$rowid AND user='$user';"` iconcleaner=$tmpd/iconcleaner.$$ + [ -s $quizmodefile ] && cond_qz=`cat $quizmodefile` # *** DO NOT USE query(), use "sq $db" instead here *** # because the next block in pipe line uses query() repeatedly. sq $db<<EOF | @@ -239,8 +255,10 @@ (SELECT group_concat(rowid||':'||length(bin)||':'||hex(val), ' ') FROM article_m WHERE id=a.id AND key='image') imxgids -FROM (select rowid,id,author from article where blogid in - (select id from blog where rowid=$rowid)) a +FROM (select rowid,id,author from article + where blogid in + (select id from blog where rowid=$rowid) + $cond_qz) a LEFT JOIN a_s s ON a.id=s.id;
--- a/s4-funcs.sh Sat Jul 01 12:05:07 2017 +0859 +++ b/s4-funcs.sh Sat Jul 01 20:13:34 2017 +0859 @@ -1232,6 +1232,27 @@ ## err email4gByid `echo $sql` query "$sql" } +collectmembersbyid() { + # Collect user names of group specified by grid + rid=${1%%[!0-9]*} # Cleaning + query "SELECT user FROM grp_mem \ + WHERE gname=(SELECT gname FROM grp WHERE rowid=$rid);" +} +collectmembersbyid() { + # Collect user names of group name + qgrp=`sqlquote "$1"` + query "SELECT user FROM grp_mem WHERE gname=$qgrp;" +} +collectgecosesbyid() { + # Collect user gecoses of group + rid=${1%%[!0-9]*} # Cleaning + query<<-EOF + SELECT gecos + FROM gecoses + WHERE name IN (SELECT user FROM grp_mem + WHERE gname=(SELECT gname FROM grp WHERE rowid=$rid)); + EOF +} collectemail() ( # Collect email addresses for group $1 # If $TEAM is set, filter by team name @@ -2520,7 +2541,10 @@ SELECT blog.rowid rid, id, author FROM blog NATURAL JOIN - (SELECT id, val owner FROM blog_s WHERE key='owner') bs + (SELECT id, + max(CASE key WHEN 'owner' THEN val END) owner, + max(CASE key WHEN 'mode' THEN val END) mode + FROM blog_s GROUP by id) bs WHERE CASE WHEN (SELECT name FROM user where name=bs.owner) IS NOT NULL THEN 1 -- blog owner is an user, READABLE WHEN (SELECT val FROM grp_s @@ -2529,6 +2553,8 @@ (SELECT user FROM grp_mem WHERE gname=bs.owner AND user='$user') IS NULL THEN 0 + WHEN mode = 'quiz' + THEN 0 -- "quiz" mode blog cannot be searched ELSE 1 END; EOF @@ -2698,6 +2724,7 @@ } send2mem() { rowid=`getpar grp` + rowid=${rowid%%[!0-9]*} # Cleaning if [ -z "$rowid" ]; then echo "グループが未指定です。" | html p return @@ -2710,7 +2737,8 @@ grp=`getgroupbyid $rowid` members=`collectemail $grp` # smail rcpt subj (file) - smail "$members" "グループ $grp 宛メッセージ(from `gecos $user`)" <<EOF + SMAIL_TO="`echo "$grp" | nkf -jM | tr -d '\n'` readers <$admin>" \ + smail "$members" "グループ $grp 宛メッセージ(from `gecos $user`)" <<EOF $urlbase?grp+$rowid グループ $grp に所属する `gecos $user` さんよりメッセージ: @@ -2718,9 +2746,9 @@ $message EOF cat<<EOF -<p>以下の宛先に送信しました。</p> +<p>以下のユーザに送信しました。</p> <pre> -$members +`collectgecosesbyid "$rowid" | sed 's/$/ さん/'` </pre> <p><a href="?grp+$rowid">グループ $grp</a>に戻る。</p> EOF