--- loncom/interface/lonfeedback.pm 2001/02/06 18:17:34 1.4
+++ loncom/interface/lonfeedback.pm 2004/06/28 16:41:08 1.96
@@ -1,139 +1,775 @@
# The LearningOnline Network
# Feedback
#
-# (Internal Server Error Handler
+# $Id: lonfeedback.pm,v 1.96 2004/06/28 16:41:08 albertel Exp $
#
-# (Login Screen
-# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,
-# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)
+# Copyright Michigan State University Board of Trustees
#
-# 3/1/1 Gerd Kortemeyer)
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
-# 3/1,2/3,2/5,2/6 Gerd Kortemeyer
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+###
+
package Apache::lonfeedback;
use strict;
use Apache::Constants qw(:common);
use Apache::lonmsg();
+use Apache::loncommon();
+use Apache::lontexconvert();
+use Apache::lonlocal; # must not have ()
+use Apache::lonhtmlcommon();
-sub handler {
- my $r = shift;
- $r->content_type('text/html');
- $r->send_http_header;
- return OK if $r->header_only;
+sub discussion_open {
+ my ($status)=@_;
+ if (defined($status) &&
+ !($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER'
+ || $status eq 'OPEN')) {
+ return 0;
+ }
+ my $close=&Apache::lonnet::EXT('resource.0.discussend');
+ if (defined($close) && $close ne '' && $close < time) {
+ return 0;
+ }
+ return 1;
+}
- my $feedurl=$ENV{'form.postdata'};
- $feedurl=~s/^http\:\/\///;
- $feedurl=~s/^$ENV{'SERVER_NAME'}//;
- $feedurl=~s/^$ENV{'HTTP_HOST'}//;
+sub discussion_visible {
+ my ($status)=@_;
+ if (not &discussion_open($status)) {
+ my $hidden=&Apache::lonnet::EXT('resource.0.discusshide');
+ if (lc($hidden) eq 'yes' or $hidden eq '' or !defined($hidden)) {
+ return 0;
+ }
+ }
+ return 1;
+}
- if (($feedurl=~/^\/res/) || ($ENV{'request.course.id'})) {
-# --------------------------------------------------- Print login screen header
- unless ($ENV{'form.sendit'}) {
- my $options='';
- if ($feedurl=~/^\/res/) {
- $options=
- '
Feedback to resource author';
- }
- if ($ENV{'course.'.$ENV{'request.course.id'}.'.question.email'}) {
- $options.=
- ' Question about resource content';
- }
- if ($ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}) {
- $options.=
- ' '.
- 'Question/Comment/Feedback about course content';
- }
- if ($ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'}) {
- $options.=
- ' '.
- 'Question/Comment/Feedback about course policy';
+sub list_discussion {
+ my ($mode,$status,$symb)=@_;
+
+ my $outputtarget=$ENV{'form.grade_target'};
+ if (not &discussion_visible($status)) { return ''; }
+ my @bgcols = ("#cccccc","#eeeeee");
+ my $discussiononly=0;
+ if ($mode eq 'board') { $discussiononly=1; }
+ unless ($ENV{'request.course.id'}) { return ''; }
+ my $crs='/'.$ENV{'request.course.id'};
+ if ($ENV{'request.course.sec'}) {
+ $crs.='_'.$ENV{'request.course.sec'};
+ }
+ $crs=~s/\_/\//g;
+ unless ($symb) {
+ $symb=&Apache::lonnet::symbread();
+ }
+ unless ($symb) { return ''; }
+
+# backward compatibility (bulletin boards used to be 'wrapped')
+ my $ressymb=$symb;
+ if ($mode eq 'board') {
+ unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
+ $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
+ }
+ }
+
+# Get discussion display settings for this discussion
+ my $lastkey = $ressymb.'_lastread';
+ my $showkey = $ressymb.'_showonlyunread';
+ my $visitkey = $ressymb.'_visit';
+ my $ondispkey = $ressymb.'_markondisp';
+ my %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$visitkey,$ondispkey],$ENV{'user.domain'},$ENV{'user.name'});
+ my %discinfo = ();
+ my $showonlyunread = 0;
+ my $markondisp = 0;
+ my $prevread = 0;
+ my $previous = 0;
+ my $visit = 0;
+ my $newpostsflag = 0;
+
+# Retain identification of "NEW" posts identified in last display, if continuing 'previous' browsing of posts.
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['previous']);
+ $previous = $ENV{'form.previous'};
+ if ($previous > 0) {
+ $prevread = $previous;
+ } elsif (defined($dischash{$lastkey})) {
+ unless ($dischash{$lastkey} eq '') {
+ $prevread = $dischash{$lastkey};
+ }
+ }
+
+# Get discussion display default settings for user
+ my %userenv = &Apache::lonnet::get('environment',['discdisplay','discmarkread'],$ENV{'user.domain'},$ENV{'user.name'});
+ my $discdisplay=$userenv{'discdisplay'};
+ if ($discdisplay eq 'unread') {
+ $showonlyunread = 1;
+ }
+ my $discmarkread=$userenv{'discmarkread'};
+ if ($discmarkread eq 'ondisp') {
+ $markondisp = 1;
+ }
+
+# Override user's default if user specified display setting for this discussion
+ if (defined($dischash{$ondispkey})) {
+ $markondisp = $dischash{$ondispkey};
+ }
+ if ($markondisp) {
+ $discinfo{$lastkey} = time;
+ }
+
+ if (defined($dischash{$showkey})) {
+ $showonlyunread = $dischash{$showkey};
+ }
+
+ if (defined($dischash{$visitkey})) {
+ $visit = $dischash{$visitkey};
+ }
+ $visit ++;
+
+ my $seeid=&Apache::lonnet::allowed('rin',$crs);
+ my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
+ && ($symb=~/\.(problem|exam|quiz|assess|survey|form)$/));
+ my @discussionitems=();
+ my %contrib=&Apache::lonnet::restore($ressymb,$ENV{'request.course.id'},
+ $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+ $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ my $visible=0;
+ my @depth=();
+ my @original=();
+ my @index=();
+ my @replies=();
+ my %alldiscussion=();
+ my %notshown = ();
+ my %newitem = ();
+ my $maxdepth=0;
+
+ my $target='';
+ unless ($ENV{'browser.interface'} eq 'textual' ||
+ $ENV{'environment.remote'} eq 'off' ) {
+ $target='target="LONcom"';
+ }
+
+ my $now = time;
+ $discinfo{$visitkey} = $visit;
+
+ &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
+
+ if ($contrib{'version'}) {
+ my $oldest = $contrib{'1:timestamp'};
+ if ($prevread eq '0') {
+ $prevread = $oldest-1;
}
- $r->print(<$maxdepth) { $maxdepth=$depth[$idx]; }
+ } else {
+# this is an original message
+ $original[$idx]=0;
+ $depth[$idx]=0;
+ }
+ if ($replies[$depth[$idx]]) {
+ $replies[$depth[$idx]]++;
+ } else {
+ $replies[$depth[$idx]]=1;
+ }
+ unless ((($hidden) && (!$seeid)) || ($deleted)) {
+ $visible++;
+ my $message=$contrib{$idx.':message'};
+ $message=~s/\n/\ /g;
+ $message=&Apache::lontexconvert::msgtexconverted($message);
+ my $subject=$contrib{$idx.':subject'};
+ if (defined($subject)) {
+ $subject=~s/\n/\ /g;
+ $subject=&Apache::lontexconvert::msgtexconverted($subject);
+ }
+ if ($contrib{$idx.':attachmenturl'}) {
+ my ($fname)
+ =($contrib{$idx.':attachmenturl'}=~m|/([^/]+)$|);
+ &Apache::lonnet::allowuploaded('/adm/feedback',
+ $contrib{$idx.':attachmenturl'});
+ $message.='