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

yatex.org