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