--- loncom/interface/lonfeedback.pm 2004/11/15 21:51:19 1.134
+++ loncom/interface/lonfeedback.pm 2005/11/09 11:41:02 1.172
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Feedback
#
-# $Id: lonfeedback.pm,v 1.134 2004/11/15 21:51:19 albertel Exp $
+# $Id: lonfeedback.pm,v 1.172 2005/11/09 11:41:02 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -35,6 +35,7 @@ use Apache::lonmsg();
use Apache::loncommon();
use Apache::lontexconvert();
use Apache::lonlocal; # must not have ()
+use Apache::lonnet;
use Apache::lonhtmlcommon();
use Apache::lonnavmaps;
use Apache::lonenc();
@@ -44,6 +45,7 @@ use Cwd;
sub discussion_open {
my ($status,$symb)=@_;
+ if ($env{'request.role.adv'}) { return 1; }
if (defined($status) &&
!($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER'
|| $status eq 'OPEN')) {
@@ -61,37 +63,42 @@ sub discussion_visible {
if (not &discussion_open($status)) {
my $hidden=&Apache::lonnet::EXT('resource.0.discusshide');
if (lc($hidden) eq 'yes' or $hidden eq '' or !defined($hidden)) {
- if (!$ENV{'request.role.adv'}) { return 0; }
+ if (!$env{'request.role.adv'}) { return 0; }
}
}
return 1;
}
sub list_discussion {
- my ($mode,$status,$ressymb)=@_;
- my $outputtarget=$ENV{'form.grade_target'};
- if (defined($ENV{'form.export'})) {
- if($ENV{'form.export'}) {
+ my ($mode,$status,$ressymb,$imsextras)=@_;
+ my $outputtarget=$env{'form.grade_target'};
+ if (defined($env{'form.export'})) {
+ if($env{'form.export'}) {
$outputtarget = 'export';
}
- }
+ }
+ if (defined($imsextras)) {
+ if ($$imsextras{'caller'} eq 'imsexport') {
+ $outputtarget = 'export';
+ }
+ }
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'};
- my $cid=$ENV{'request.course.id'};
- if ($ENV{'request.course.sec'}) {
- $crs.='_'.$ENV{'request.course.sec'};
- }
+ unless ($env{'request.course.id'}) { return ''; }
+ my $crs='/'.$env{'request.course.id'};
+ my $cid=$env{'request.course.id'};
+ if ($env{'request.course.sec'}) {
+ $crs.='_'.$env{'request.course.sec'};
+ }
$crs=~s/\_/\//g;
unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); }
unless ($ressymb) { return ''; }
$ressymb=&wrap_symb($ressymb);
my $encsymb=&Apache::lonenc::check_encrypt($ressymb);
my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
- && ($ressymb=~/\.(problem|exam|quiz|assess|survey|form)$/));
+ && ($ressymb=~/\.(problem|exam|quiz|assess|survey|form|task)$/));
my %usernamesort = ();
my %namesort =();
@@ -106,8 +113,8 @@ sub list_discussion {
my $userpickkey = $ressymb.'_userpick';
my $toggkey = $ressymb.'_readtoggle';
my $readkey = $ressymb.'_read';
-
- my %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$markkey,$visitkey,$ondispkey,$userpickkey,$toggkey,$readkey],$ENV{'user.domain'},$ENV{'user.name'});
+ $ressymb=$encsymb;
+ my %dischash = &Apache::lonnet::get('nohist_'.$cid.'_discuss',[$lastkey,$showkey,$markkey,$visitkey,$ondispkey,$userpickkey,$toggkey,$readkey],$env{'user.domain'},$env{'user.name'});
my %discinfo = ();
my $showonlyunread = 0;
my $showunmark = 0;
@@ -120,11 +127,22 @@ sub list_discussion {
# Retain identification of "NEW" posts identified in last display, if continuing 'previous' browsing of posts.
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['previous','sortposts','rolefilter','statusfilter','sectionpick','totposters']);
- my $sortposts = $ENV{'form.sortposts'};
- my $statusfilter = $ENV{'form.statusfilter'};
- my $sectionpick = $ENV{'form.sectionpick'};
- my $totposters = $ENV{'form.totposters'};
- $previous = $ENV{'form.previous'};
+ my $sortposts = $env{'form.sortposts'};
+ my $statusfilter = $env{'form.statusfilter'};
+ my @sectionpick = ();
+ if ($env{'form.sectionpick'} =~ /,/) {
+ @sectionpick = split/,/,$env{'form.sectionpick'};
+ } else {
+ $sectionpick[0] = $env{'form.sectionpick'};
+ }
+ my @rolefilter = ();
+ if ($env{'form.rolefilter'} =~ /,/) {
+ @rolefilter = split/,/,$env{'form.rolefilter'};
+ } else {
+ $rolefilter[0] = $env{'form.rolefilter'};
+ }
+ my $totposters = $env{'form.totposters'};
+ $previous = $env{'form.previous'};
if ($previous > 0) {
$prevread = $previous;
} elsif (defined($dischash{$lastkey})) {
@@ -132,27 +150,32 @@ sub list_discussion {
$prevread = $dischash{$lastkey};
}
}
- &Apache::lonnet::logthis("\n last read r symb ".$lastkey);
# Get information about students and non-students in course for filtering display of posts
my %roleshash = ();
my %roleinfo = ();
- if ($ENV{'form.rolefilter'}) {
- %roleshash = &Apache::lonnet::dump('nohist_userroles',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},$ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ if ($env{'form.rolefilter'}) {
+ %roleshash = &Apache::lonnet::dump('nohist_userroles',
+ $env{'course.'.$cid.'.domain'},
+ $env{'course.'.$cid.'.num'});
foreach (keys %roleshash) {
my ($role,$uname,$udom,$sec) = split/:/,$_;
+ if ($role =~ /^cr/) {
+ $role = 'cr';
+ }
my ($end,$start) = split/:/,$roleshash{$_};
my $now = time;
my $status = 'Active';
if (($now < $start) || ($end > 0 && $now > $end)) {
$status = 'Expired';
}
- push @{$roleinfo{$uname.':'.$udom}}, $role.':'.$sec.':'.$status;
+ if ($uname && $udom) {
+ push @{$roleinfo{$uname.':'.$udom}}, $role.':'.$sec.':'.$status;
+ }
}
my ($classlist) = &Apache::loncoursedata::get_classlist(
- $ENV{'request.course.id'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ $env{'course.'.$cid.'.domain'},
+ $env{'course.'.$cid.'.num'});
my $sec_index = &Apache::loncoursedata::CL_SECTION();
my $status_index = &Apache::loncoursedata::CL_STATUS();
while (my ($student,$data) = each %$classlist) {
@@ -163,10 +186,10 @@ sub list_discussion {
}
# Get discussion display default settings for user
- if ($ENV{'environment.discdisplay'} eq 'unread') {
+ if ($env{'environment.discdisplay'} eq 'unread') {
$showonlyunread = 1;
}
- if ($ENV{'environment.discmarkread'} eq 'ondisp') {
+ if ($env{'environment.discmarkread'} eq 'ondisp') {
$markondisp = 1;
}
@@ -216,16 +239,16 @@ sub list_discussion {
my $maxdepth=0;
my $target='';
- unless ($ENV{'browser.interface'} eq 'textual' ||
- $ENV{'environment.remote'} eq 'off' ) {
+ 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'});
- &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$encsymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$ENV{'form.rolefilter'},$sectionpick,$statusfilter,$toggkey,$outputtarget);
+ &Apache::lonnet::put('nohist_'.$cid.'_discuss',\%discinfo,$env{'user.domain'},$env{'user.name'});
+ &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$encsymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,$statusfilter,$toggkey,$outputtarget);
my $discussion='';
my $manifestfile;
@@ -236,7 +259,7 @@ sub list_discussion {
my $function = &Apache::loncommon::get_users_function();
my $color = &Apache::loncommon::designparm($function.'.tabbg',
- $ENV{'user.domain'});
+ $env{'user.domain'});
my %lt = &Apache::lonlocal::texthash(
'cuse' => 'Current discussion settings',
'allposts' => 'All posts',
@@ -302,23 +325,34 @@ sub list_discussion {
if ($visible) {
# Print the discusssion
if ($outputtarget eq 'tex') {
- $discussion.='\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}'.
+ $discussion.='{\tiny \vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}'.
'\textbf{DISCUSSIONS}\makebox[2 cm][b]{\hrulefill}'.
'\vskip 0 mm\noindent\textbf{'.$lt{'cuse'}.'}:\vskip 0 mm'.
'\noindent\textbf{'.$lt{'disa'}.'}: \textit{'.$currdisp.'}\vskip 0 mm'.
- '\noindent\textbf{'.$lt{'npce'}.'}: \textit{'.$currmark.'} ';
+ '\noindent\textbf{'.$lt{'npce'}.'}: \textit{'.$currmark.'}} ';
} elsif ($outputtarget eq 'export') {
# Create temporary directory if this is an export
my $now = time;
- $tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
- if (!-e $tempexport) {
- mkdir($tempexport,0700);
- }
- $tempexport .= '/'.$now;
- if (!-e $tempexport) {
- mkdir($tempexport,0700);
+ if ((defined($imsextras)) && ($$imsextras{'caller'} eq 'imsexport')) {
+ $tempexport = $$imsextras{'tempexport'};
+ if (!-e $tempexport) {
+ mkdir($tempexport,0700);
+ }
+ $tempexport .= '/'.$$imsextras{'count'};
+ if (!-e $tempexport) {
+ mkdir($tempexport,0700);
+ }
+ } else {
+ $tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
+ if (!-e $tempexport) {
+ mkdir($tempexport,0700);
+ }
+ $tempexport .= '/'.$now;
+ if (!-e $tempexport) {
+ mkdir($tempexport,0700);
+ }
+ $tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
}
- $tempexport .= '/'.$ENV{'user.domain'}.'_'.$ENV{'user.name'};
if (!-e $tempexport) {
mkdir($tempexport,0700);
}
@@ -360,17 +394,17 @@ imscp_v1p1.xsd http://www.imsglobal.org/
'
END
+ if ($sortposts) {
+ my %sort_types = ();
+ my %role_types = ();
+ my %status_types = ();
+ &sort_filter_names(\%sort_types,\%role_types,\%status_types);
+
+ $discussion .= ''.&mt('Sorted by').' : '.$sort_types{$sortposts}.' ';
+ if (defined($env{'form.totposters'})) {
+ $discussion .= &mt('Posts by').':';
+ if ($totposters > 0) {
+ foreach my $poster (@posters) {
+ $poster =~ s/:/\@/;
+ $discussion .= ' '.$poster.',';
+ }
+ $discussion =~ s/,$//;
+ } else {
+ $discussion .= &mt('None selected');
+ }
+ } else {
+ my $filterchoice ='';
+ if (@sectionpick > 0) {
+ $filterchoice = ''.&mt('sections').' - '.$env{'form.sectionpick'};
+ $filterchoice .= ' ';
+ }
+ if (@rolefilter > 0) {
+ $filterchoice .= ''.&mt('roles').' -';
+ foreach (@rolefilter) {
+ $filterchoice .= ' '.$role_types{$_}.',';
+ }
+ $filterchoice =~ s/,$//;
+ $filterchoice .= '     ';
+ }
+ if ($statusfilter) {
+ $filterchoice .= ''.&mt('status').' - '.$status_types{$statusfilter};
+ }
+ if ($filterchoice) {
+ $discussion .= ''.&mt('Filters').' : '.$filterchoice;
+ }
+ $discussion .= ' ';
+ }
+ }
if ($dischash{$toggkey}) {
my $storebutton = &mt('Store read/unread changes');
$discussion.=''.
@@ -579,27 +653,25 @@ END
|;
close($manifestfile);
+ if ((defined($imsextras)) && ($$imsextras{'caller'} eq 'imsexport')) {
+ $discussion = $copyresult;
+ } else {
#Create zip file in prtspool
- my $imszipfile = '/prtspool/'.
- $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
- time.'_'.rand(1000000000).'.zip';
- # zip can cause an sh launch which can pass along all of %ENV
- # which can be too large for /bin/sh to handle
- my %oldENV=%ENV;
- undef(%ENV);
- my $cwd = &getcwd();
- my $imszip = '/home/httpd/'.$imszipfile;
- chdir $tempexport;
- open(OUTPUT, "zip -r $imszip * 2> /dev/null |");
- close(OUTPUT);
- chdir $cwd;
- %ENV=%oldENV;
- undef(%oldENV);
- $discussion .= 'Download the zip file from Discussion Posting Archive ';
- if ($copyresult) {
- $discussion .= 'The following errors occurred during export - '.$copyresult;
+ my $imszipfile = '/prtspool/'.
+ $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
+ time.'_'.rand(1000000000).'.zip';
+ my $cwd = &getcwd();
+ my $imszip = '/home/httpd/'.$imszipfile;
+ chdir $tempexport;
+ open(OUTPUT, "zip -r $imszip * 2> /dev/null |");
+ close(OUTPUT);
+ chdir $cwd;
+ $discussion .= 'Download the zip file from Discussion Posting Archive ';
+ if ($copyresult) {
+ $discussion .= 'The following errors occurred during export - '.$copyresult;
+ }
}
} else {
$discussion .= ' Unfortunately you will not be able to retrieve an archive of the discussion posts at this time, because there was a problem creating a manifest file. ';
@@ -615,10 +687,10 @@ END
my @currdelold = ();
my $comment = '';
my $subject = '';
- if ($ENV{'form.origpage'}) {
+ if ($env{'form.origpage'}) {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['addnewattach','deloldattach','delnewattach','timestamp','idx','subject','comment']);
- $subject = &Apache::lonnet::unescape($ENV{'form.subject'});
- $comment = &Apache::lonnet::unescape($ENV{'form.comment'});
+ $subject = &Apache::lonnet::unescape($env{'form.subject'});
+ $comment = &Apache::lonnet::unescape($env{'form.comment'});
my @keepold = ();
&process_attachments(\@currnewattach,\@currdelold,\@keepold);
if (@currnewattach > 0) {
@@ -639,42 +711,42 @@ to course faculty
Title:
ENDDISCUSS
- if ($ENV{'form.origpage'}) {
- $discussion.=' '."\n";
- foreach (@currnewattach) {
- $discussion.=' '."\n";
- }
- }
- $discussion.="\n";
- if ($outputtarget ne 'tex') {
- $discussion.=&generate_attachments_button('',$attachnum,$ressymb,$now,\@currnewattach,\@currdelold,'',$mode);
- if (@currnewattach > 0) {
- $newattachmsg .= 'New attachments ';
- if (@currnewattach > 1) {
- $newattachmsg .= '';
- foreach my $item (@currnewattach) {
- $item =~ m#.*/([^/]+)$#;
- $newattachmsg .= ''.$1.' '."\n";
+ if ($env{'form.origpage'}) {
+ $discussion.=' '."\n";
+ foreach (@currnewattach) {
+ $discussion.=' '."\n";
+ }
+ }
+ $discussion.="\n";
+ if ($outputtarget ne 'tex') {
+ $discussion.=&generate_attachments_button('',$attachnum,$ressymb,$now,\@currnewattach,\@currdelold,'',$mode);
+ if (@currnewattach > 0) {
+ $newattachmsg .= 'New attachments ';
+ if (@currnewattach > 1) {
+ $newattachmsg .= '';
+ foreach my $item (@currnewattach) {
+ $item =~ m#.*/([^/]+)$#;
+ $newattachmsg .= ''.$1.' '."\n";
+ }
+ $newattachmsg .= ' '."\n";
+ } else {
+ $currnewattach[0] =~ m#.*/([^/]+)$#;
+ $newattachmsg .= ''.$1.' '."\n";
}
- $newattachmsg .= ' '."\n";
- } else {
- $currnewattach[0] =~ m#.*/([^/]+)$#;
- $newattachmsg .= ''.$1.' '."\n";
}
- }
- $discussion.=$newattachmsg;
- $discussion.=&generate_preview_button();
- }
+ $discussion.=$newattachmsg;
+ $discussion.=&generate_preview_button();
+ }
}
- } else {
- if (&discussion_open($status) &&
- &Apache::lonnet::allowed('pch',
- $ENV{'request.course.id'}.
- ($ENV{'request.course.sec'}?'/'.$ENV{'request.course.sec'}:''))) {
+ } else {
+ if (&discussion_open($status) &&
+ &Apache::lonnet::allowed('pch',
+ $env{'request.course.id'}.
+ ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
if ($outputtarget ne 'tex') {
$discussion.='';
}
}
@@ -684,19 +756,23 @@ ENDDISCUSS
sub build_posting_display {
my ($usernamesort,$subjectsort,$namesort,$notshown,$newitem,$dischash,$shown,$alldiscussion,$imsitems,$imsfiles,$roleinfo,$discussionitems,$replies,$depth,$posters,$maxdepth,$visible,$newpostsflag,$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$ressymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$statusfilter,$toggkey,$outputtarget) = @_;
-
my @original=();
my @index=();
my $symb=&Apache::lonenc::check_decrypt($ressymb);
- my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
if ($contrib{'version'}) {
my $oldest = $contrib{'1:timestamp'};
if ($prevread eq '0') {
$prevread = $oldest-1;
}
+ my ($skiptest,$rolematch,$roleregexp,$secregexp,$statusregexp);
+ if ($sortposts) {
+ ($skiptest,$roleregexp,$secregexp,$statusregexp) = &filter_regexp($rolefilter,$sectionpick,$statusfilter);
+ $rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp;
+ }
for (my $id=1;$id<=$contrib{'version'};$id++) {
my $idx=$id;
my $posttime = $contrib{$idx.':timestamp'};
@@ -709,7 +785,7 @@ sub build_posting_display {
my $origindex='0.';
my $numoldver=0;
if ($contrib{$idx.':replyto'}) {
- if ( (($ENV{'environment.threadeddiscussion'}) && (($sortposts eq '') || ($sortposts eq 'ascdate'))) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
+ if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
# this is a follow-up message
$original[$idx]=$original[$contrib{$idx.':replyto'}];
$$depth[$idx]=$$depth[$contrib{$idx.':replyto'}]+1;
@@ -784,7 +860,7 @@ sub build_posting_display {
$contrib{$idx.':sendername'}.' at '.
$contrib{$idx.':senderdomain'}.')';
if ($contrib{$idx.':anonymous'}) {
- $sender.=' ['.&mt('anonymous').'] '.
+ $sender.=' ['.&mt('anonymous').'] '.
$screenname;
}
@@ -817,8 +893,8 @@ sub build_posting_display {
} else {
@{$$namesort{$lastname}{$firstname}} = ("$idx");
}
- if ($ENV{'course.'.$ENV{'request.course.id'}.'.allow_discussion_post_editing'} =~ m/yes/i) {
- if (($ENV{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($ENV{'user.name'} eq $contrib{$idx.':sendername'})) {
+ if ($env{'course.'.$env{'request.course.id'}.'.allow_discussion_post_editing'} =~ m/yes/i) {
+ if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {
$sender.=' '.&mt('Mark unread').'? ';
+ $ctlink = ''.&mt('Mark unread').'? ';
} else {
- $ctlink = ''.&mt('Mark read').'? ';
+ $ctlink = ''.&mt('Mark read').'? ';
}
}
#figure out at what position this needs to print
}
if ($outputtarget eq 'export' || $message) {
my $thisindex=$idx;
- if ( (($ENV{'environment.threadeddiscussion'}) && (($sortposts eq '') || ($sortposts eq 'ascdate'))) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
+ if ( (($env{'environment.threadeddiscussion'}) && ($sortposts eq '')) || ($sortposts eq 'thread') || ($outputtarget eq 'export')) {
$thisindex=$origindex.substr('00'.$$replies[$$depth[$idx]],-2,2);
}
$$alldiscussion{$thisindex}=$idx;
@@ -945,48 +1021,33 @@ sub build_posting_display {
my $uname = $contrib{$idx.':sendername'};
my $udom = $contrib{$idx.':senderdomain'};
my $poster = $uname.':'.$udom;
- my $rolematch = '';
- my $skiptest = 1;
- if ($totposters > 0) {
- if (grep/^$poster$/,@{$posters}) {
- $$shown{$idx} = 1;
- }
- } else {
- if ($rolefilter) {
- if ($rolefilter eq 'all') {
- $rolematch = '([^:]+)';
- } else {
- $rolematch = $rolefilter;
- $skiptest = 0;
- }
- }
- if ($sectionpick) {
- if ($sectionpick eq 'all') {
- $rolematch .= ':([^:]*)';
- } else {
- $rolematch .= ':'.$sectionpick;
- $skiptest = 0;
- }
- }
- if ($statusfilter) {
- if ($statusfilter eq 'all') {
- $rolematch .= ':([^:]+)';
- } else {
- $rolematch .= ':'.$statusfilter;
- $skiptest = 0;
+ if (defined($env{'form.totposters'})) {
+ if ($totposters == 0) {
+ $$shown{$idx} = 0;
+ } elsif ($totposters > 0) {
+ if (grep/^$poster$/,@{$posters}) {
+ $$shown{$idx} = 1;
}
}
+ } elsif ($sortposts) {
if ($skiptest) {
$$shown{$idx} = 1;
} else {
foreach my $role (@{$$roleinfo{$poster}}) {
- &Apache::lonnet::logthis("\n rolematch $rolematch\nrole $role");
- if ($role =~ m/^$rolematch$/) {
+ if ($role =~ /^cc:/) {
+ my $cc_regexp = $roleregexp.':[^:]*:'.$statusregexp;
+ if ($role =~ /$cc_regexp/) {
+ $$shown{$idx} = 1;
+ last;
+ }
+ } elsif ($role =~ /^$rolematch$/) {
$$shown{$idx} = 1;
last;
}
}
}
+ } else {
+ $$shown{$idx} = 1;
}
}
unless ($$notshown{$idx} == 1) {
@@ -1036,6 +1097,60 @@ sub build_posting_display {
}
}
+sub filter_regexp {
+ my ($rolefilter,$sectionpick,$statusfilter) = @_;
+ my ($roleregexp,$secregexp,$statusregexp);
+ my $skiptest = 1;
+ if (@{$rolefilter} > 0) {
+ my @okrolefilter = ();
+ foreach (@{$rolefilter}) {
+ unless ($_ eq '') {
+ push @okrolefilter, $_;
+ }
+ }
+ if (@okrolefilter > 0) {
+ if (grep/^all$/,@okrolefilter) {
+ $roleregexp='[^:]+';
+ } else {
+ if (@okrolefilter == 1) {
+ $roleregexp=$okrolefilter[0];
+ } else {
+ $roleregexp='('.join('|',@okrolefilter).')';
+ }
+ $skiptest = 0;
+ }
+ }
+ }
+ if (@{$sectionpick} > 0) {
+ my @oksectionpick = ();
+ foreach (@{$sectionpick}) {
+ unless ($_ eq '') {
+ push @oksectionpick, $_;
+ }
+ }
+ if ((@oksectionpick > 0) && (!grep/^all$/,@oksectionpick)) {
+ if (@oksectionpick == 1) {
+ $secregexp = $oksectionpick[0];
+ } else {
+ $secregexp .= '('.join('|',@oksectionpick).')';
+ }
+ $skiptest = 0;
+ } else {
+ $secregexp .= '[^:]*';
+ }
+ }
+ if (defined($statusfilter) && $statusfilter ne '') {
+ if ($statusfilter eq 'all') {
+ $statusregexp = '[^:]+';
+ } else {
+ $statusregexp = $statusfilter;
+ $skiptest = 0;
+ }
+ }
+ return ($skiptest,$roleregexp,$secregexp,$statusregexp);
+}
+
+
sub get_post_contents {
my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_;
my $discussion = '';
@@ -1051,11 +1166,11 @@ sub get_post_contents {
# $$screenname=&Apache::loncommon::screenname(
# $$contrib{$idx.':sendername'},
# $$contrib{$idx.':senderdomain'});
-# $$plainname=&Apache::loncommon::nickname(
-# $$contrib{$idx.':sendername'},
-# $$contrib{$idx.':senderdomain'});
- ($$screenname,$$plainname)=($$contrib{$idx.':screenname'},
- $$contrib{$idx.':plainname'});
+ $$plainname=&Apache::loncommon::nickname(
+ $$contrib{$idx.':sendername'},
+ $$contrib{$idx.':senderdomain'});
+ $$screenname=$$contrib{$idx.':screenname'};
+
my $sender=&Apache::loncommon::aboutmewrapper(
$$plainname,
$$contrib{$idx.':sendername'},
@@ -1092,7 +1207,7 @@ sub get_post_contents {
my ($timesent,$attachmsg);
my %currattach = ();
$timesent = &Apache::lonlocal::locallocaltime($postversions[$i]);
- $$messages{$i}=~s/\n/\ /g;
+ &newline_to_br(\$messages->{$i});
$$messages{$i}=&Apache::lontexconvert::msgtexconverted($$messages{$i});
$$subjects{$i}=~s/\n/\ /g;
$$subjects{$i}=&Apache::lontexconvert::msgtexconverted($$subjects{$i});
@@ -1174,7 +1289,7 @@ sub replicate_attachments {
sub mail_screen {
my ($r,$feedurl,$options) = @_;
- if (exists($ENV{'form.origpage'})) {
+ if (exists($env{'form.origpage'})) {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['subject','comment','currnewattach','addnewattach','deloldattach','delnewattach','timestamp','idx','anondiscuss','discuss']);
}
my $bodytag=&Apache::loncommon::bodytag('Resource Feedback and Discussion',
@@ -1208,11 +1323,11 @@ sub mail_screen {
}
END
my $anonscript;
- if (exists($ENV{'form.origpage'})) {
+ if (exists($env{'form.origpage'})) {
$anonscript = (</g;
+ &newline_to_br(\$message);
$quote=''.&Apache::lontexconvert::msgtexconverted($message).' ';
if ($idx > 0) {
my %subversions = ();
@@ -1283,7 +1398,7 @@ END
if (defined($contrib{$idx.':replyto'})) {
$parentmsg = $contrib{$idx.':replyto'};
}
- unless (exists($ENV{'form.origpage'})) {
+ unless (exists($env{'form.origpage'})) {
my $anonflag = 0;
if ($contrib{$idx.':anonymous'}) {
$anonflag = 1;
@@ -1305,21 +1420,22 @@ END
}
}
}
- if ($ENV{'form.previous'}) {
- $prevtag = ' ';
+ if ($env{'form.previous'}) {
+ $prevtag = ' ';
}
}
- if ($ENV{'form.origpage'}) {
- $subject = &Apache::lonnet::unescape($ENV{'form.subject'});
- $comment = &Apache::lonnet::unescape($ENV{'form.comment'});
+ if ($env{'form.origpage'}) {
+ $subject = &Apache::lonnet::unescape($env{'form.subject'});
+ $comment = &Apache::lonnet::unescape($env{'form.comment'});
&process_attachments(\@currnewattach,\@currdelold,\@keepold);
}
my $latexHelp=&Apache::loncommon::helpLatexCheatsheet();
my $htmlheader=&Apache::lonhtmlcommon::htmlareaheaders();
my $send=&mt('Send');
+ my $html=&Apache::lonxml::xmlbegin();
$r->print(<
+$html
The LearningOnline Network with CAPA
@@ -1380,13 +1496,13 @@ enctype="multipart/form-data">
$prevtag
END
- if ($ENV{'form.replydisc'}) {
+ if ($env{'form.replydisc'}) {
$r->print(<
+
END
- } elsif ($ENV{'form.editdisc'}) {
+ } elsif ($env{'form.editdisc'}) {
$r->print(<
+
END
}
@@ -1403,8 +1519,8 @@ Title:
END
- if ( ($ENV{'form.editdisc'}) || ($ENV{'form.replydisc'}) ) {
- if ($ENV{'form.origpage'}) {
+ if ( ($env{'form.editdisc'}) || ($env{'form.replydisc'}) ) {
+ if ($env{'form.origpage'}) {
foreach (@currnewattach) {
$r->print(' '."\n");
}
@@ -1412,7 +1528,7 @@ END
$r->print(' '."\n");
}
}
- if ($ENV{'form.editdisc'}) {
+ if ($env{'form.editdisc'}) {
if ($attachmenturls) {
&extract_attachments($attachmenturls,$idx,$numoldver,\$attachmsg,\%attachments,\%currattach,\@currdelold);
$attachnum = scalar(keys %currattach);
@@ -1434,11 +1550,11 @@ END
END
- if ($ENV{'form.editdisc'} || $ENV{'form.replydisc'}) {
+ if ($env{'form.editdisc'} || $env{'form.replydisc'}) {
my $now = time;
my $ressymb = $symb;
my $postidx = '';
- if ($ENV{'form.editdisc'}) {
+ if ($env{'form.editdisc'}) {
$postidx = $idx;
}
if (@currnewattach > 0) {
@@ -1475,11 +1591,12 @@ END
sub print_display_options {
my ($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl) = @_;
- &dewrapper(\$feedurl);
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
my $function = &Apache::loncommon::get_users_function();
my $tabcolor = &Apache::loncommon::designparm($function.'.tabbg',
- $ENV{'user.domain'});
+ $env{'user.domain'});
my $bodytag=&Apache::loncommon::bodytag('Discussion options',
'','');
@@ -1542,8 +1659,9 @@ sub print_display_options {
$currtogg = $lt{'toggon'};
$disctogg = 'toggon';
}
+ my $html=&Apache::lonxml::xmlbegin();
$r->print(<
+$html
$lt{'dido'}
@@ -1634,18 +1752,18 @@ $lt{'sdpf'} $lt{'prca'} $l
$lt{'disa'}
$lt{$discdisp}
- $lt{'chgt'} "$dispchangeA"
+ $lt{'chgt'} "$dispchangeA"
- $lt{'chgt'} "$dispchangeB"
+ $lt{'chgt'} "$dispchangeB"
$lt{'npmr'}
$lt{$discmark}
- $lt{'chgt'} "$markchange"
+ $lt{'chgt'} "$markchange"
$lt{'dotm'}
$lt{$disctogg}
- $lt{'chgt'} "$toggchange"
+ $lt{'chgt'} "$toggchange"
@@ -1656,6 +1774,7 @@ $lt{'sdpf'} $lt{'prca'} $l
+
@@ -1674,35 +1793,21 @@ END
sub print_sortfilter_options {
my ($r,$symb,$previous,$feedurl) = @_;
- &dewrapper(\$feedurl);
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+
+ &Apache::lonenc::check_encrypt(\$symb);
my @sections = ();
my $section_sel = '';
my $numsections = 0;
my $numvisible = 5;
- my ($classlist) = &Apache::loncoursedata::get_classlist(
- $ENV{'request.course.id'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
-
- my $sec_index = &Apache::loncoursedata::CL_SECTION();
- my $status_index = &Apache::loncoursedata::CL_STATUS();
my %sectioncount = ();
- while (my ($student,$data) = each %$classlist) {
- my ($section,$status) = ($data->[$sec_index],
- $data->[$status_index]);
- unless ($section eq '' || $section =~ /^\s*$/) {
- if (!defined($sectioncount{$section})) {
- $sectioncount{$section} = 1;
- $numsections ++;
- } else {
- $sectioncount{$section} ++;
- }
- }
- }
-
- if ($ENV{'request.course.sec'} !~ /^\s*$/) {
- @sections = ($ENV{'request.course.sec'});
- $numvisible = 1;
+
+ $numsections = &Apache::loncommon::get_sections($env{'course.'.$env{'request.course.id'}.'.domain'},$env{'course.'.$env{'request.course.id'}.'.num'},\%sectioncount);
+
+ if ($env{'request.course.sec'} !~ /^\s*$/) { #Restrict section choice to current section
+ @sections = ('all',$env{'request.course.sec'});
+ $numvisible = 2;
} else {
@sections = sort {$a cmp $b} keys(%sectioncount);
unshift(@sections,'all'); # Put 'all' at the front of the list
@@ -1716,7 +1821,7 @@ sub print_sortfilter_options {
my $function = &Apache::loncommon::get_users_function();
my $tabcolor = &Apache::loncommon::designparm($function.'.tabbg',
- $ENV{'user.domain'});
+ $env{'user.domain'});
my $bodytag=&Apache::loncommon::bodytag('Discussion options',
'','');
my %lt = &Apache::lonlocal::texthash(
@@ -1724,19 +1829,49 @@ sub print_sortfilter_options {
'diop' => 'Display Options',
'curr' => 'Current setting ',
'actn' => 'Action',
- 'prca' => 'Options can be set that control the sort order of the posts, in addition to which posts are displayed.',
+ 'prca' => 'Set options that control the sort order of posts, and/or which posts are displayed.',
'soor' => 'Sort order',
- 'disp' => 'Specific user roles',
- 'actv' => 'Specific role status',
+ 'spur' => 'Specific user roles',
+ 'sprs' => 'Specific role status',
'spse' => 'Specific sections',
'psub' => 'Pick specific users (by name)',
'shal' => 'Show a list of current posters'
);
+
+ my %sort_types = ();
+ my %role_types = ();
+ my %status_types = ();
+ &sort_filter_names(\%sort_types,\%role_types,\%status_types);
+ my $html=&Apache::lonxml::xmlbegin();
$r->print(<
+$html
$lt{'diso'}
+
$bodytag
@@ -1811,17 +1947,19 @@ END
sub print_showposters {
my ($r,$symb,$previous,$feedurl,$sortposts) = @_;
-# backward compatibility (bulletin boards used to be 'wrapped')
- my $ressymb=&wrap_symb($symb);
- my $crs='/'.$ENV{'request.course.id'};
- if ($ENV{'request.course.sec'}) {
- $crs.='_'.$ENV{'request.course.sec'};
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+
+ &Apache::lonenc::check_encrypt(\$symb);
+ my $crs='/'.$env{'request.course.id'};
+ if ($env{'request.course.sec'}) {
+ $crs.='_'.$env{'request.course.sec'};
}
$crs=~s/\_/\//g;
my $seeid=&Apache::lonnet::allowed('rin',$crs);
- 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 %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
my %namesort = ();
my %postcounts = ();
my %lt=&Apache::lonlocal::texthash(
@@ -1860,8 +1998,9 @@ sub print_showposters {
}
}
}
+ my $html=&Apache::lonxml::xmlbegin();
$r->print(<
+$html
$lt{'diso'}
@@ -1888,7 +2027,7 @@ END
next;
} else {
$count ++;
- $r->print(''.$count.' '.$last.', '.$first.' ('.$uname.','.$udom.') '.$postcounts{$_}.' ');
+ $r->print(''.$count.' '.$last.', '.$first.' ('.$uname.','.$udom.') '.$postcounts{$_}.' ');
}
}
}
@@ -1969,17 +2108,20 @@ sub get_post_attachments {
return;
}
-sub fail_redirect {;
+sub fail_redirect {
my ($r,$feedurl) = @_;
if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
+ my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
+ my $html=&Apache::lonxml::xmlbegin();
$r->print (<
-Feedback not sent
+$html
+
+Feedback not sent
-
+
Sorry, no recipients ...
Continue
@@ -1988,7 +2130,7 @@ ENDFAILREDIR
}
sub redirect_back {
- my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$status,$previous,$sort,$rolefilter,$statusfilter,$secpick,$numpicks) = @_;
+ my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$status,$previous,$sort,$rolefilter,$statusfilter,$sectionpick,$numpicks) = @_;
my $sorttag = '';
my $roletag = '';
my $statustag = '';
@@ -1997,6 +2139,9 @@ sub redirect_back {
my $qrystr = '';
my $prevtag = '';
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+
&dewrapper(\$feedurl);
if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
if ($previous > 0) {
@@ -2016,30 +2161,55 @@ sub redirect_back {
$feedurl .= '?'.$sortqry;
}
$sorttag = ' ';
- if ( (defined($numpicks)) && ($numpicks > 0) ) {
+ if (defined($numpicks)) {
my $userpickqry = 'totposters='.$numpicks;
$feedurl .= '&'.$userpickqry;
$userpicktag = ' ';
} else {
- my $roleqry = 'rolefilter='.$rolefilter;
- $feedurl .= '&'.$roleqry;
- $roletag = ' ';
+ if (ref($sectionpick) eq 'ARRAY') {
+ $feedurl .= '§ionpick=';
+ $sectag .= ' ';
+ } else {
+ $feedurl .= '§ionpick='.$sectionpick;
+ $sectag = ' ';
+ }
+ if (ref($rolefilter) eq 'ARRAY') {
+ $feedurl .= '&rolefilter=';
+ $roletag .= ' ';
+ } else {
+ $feedurl .= '&rolefilter='.$rolefilter;
+ $roletag = ' ';
+ }
$feedurl .= '&statusfilter='.$statusfilter;
$statustag =' ';
- $feedurl .= '§ionpick='.$secpick;
- $sectag = ' ';
}
}
$feedurl=&Apache::lonenc::check_encrypt($feedurl);
+ my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
+ my $html=&Apache::lonxml::xmlbegin();
$r->print (<
+$html
Feedback sent
-
+
$typestyle
Sent $sendsomething message(s), and $sendposts post(s).
$status
@@ -2061,9 +2231,11 @@ sub no_redirect_back {
my ($r,$feedurl) = @_;
my $nofeed=&mt('Sorry, no feedback possible on this resource ...');
my $continue=&mt('Continue');
+ my $html=&Apache::lonxml::xmlbegin();
$r->print (<
-Feedback not sent
+$html
+
+Feedback not sent
ENDNOREDIR
@@ -2072,10 +2244,11 @@ ENDNOREDIR
&Apache::lonenc::check_encrypt($feedurl).'">');
}
$feedurl=&Apache::lonenc::check_encrypt($feedurl);
+ my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
$r->print (<
-
+
$nofeed
$continue
@@ -2084,47 +2257,49 @@ ENDNOREDIRTWO
}
sub screen_header {
- my ($feedurl) = @_;
+ my ($feedurl,$symb) = @_;
my $msgoptions='';
my $discussoptions='';
- unless (($ENV{'form.replydisc'}) || ($ENV{'form.editdisc'})) {
- if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/)) {
+ unless (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {
+ if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {
$msgoptions=
- ' '.
- &mt('Feedback to resource author').'
';
+ ' '.
+ &mt('Feedback to resource author').'
';
}
if (&feedback_available(1)) {
$msgoptions.=
- ' '.
- &mt('Question about resource content');
+ ' '.
+ &mt('Question about resource content').'
';
}
if (&feedback_available(0,1)) {
$msgoptions.=
- ' '.
- &mt('Question/Comment/Feedback about course content');
+ ' '.
+ &mt('Question/Comment/Feedback about course content').
+ '
';
}
if (&feedback_available(0,0,1)) {
$msgoptions.=
- ' '.
- &mt('Question/Comment/Feedback about course policy');
+ ' '.
+ &mt('Question/Comment/Feedback about course policy').
+ '
';
}
}
- if ($ENV{'request.course.id'}) {
- if (&discussion_open() &&
+ if ($env{'request.course.id'}) {
+ if (&discussion_open(undef,$symb) &&
&Apache::lonnet::allowed('pch',
- $ENV{'request.course.id'}.
- ($ENV{'request.course.sec'}?'/'.$ENV{'request.course.sec'}:''))) {
- $discussoptions=' '.
+ $env{'request.course.id'}.
+ ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
+ $discussoptions=' '.
&mt('Contribution to course discussion of resource');
- $discussoptions.=' '.
+ $discussoptions.=' '.
&mt('Anonymous contribution to course discussion of resource').
- ' ('.&mt('name only visible to course faculty').') ';
- }
+ ' ('.&mt('name only visible to course faculty').') ';
+ }
}
- if ($msgoptions) { $msgoptions=' '.&mt('Sending Messages').' '.$msgoptions; }
+ if ($msgoptions) { $msgoptions=' '.&mt('Sending Messages').' '.$msgoptions; }
if ($discussoptions) {
- $discussoptions=' '.&mt('Discussion Contributions').' '.$discussoptions; }
+ $discussoptions=' '.&mt('Discussion Contributions').' '.$discussoptions; }
return $msgoptions.$discussoptions;
}
@@ -2147,15 +2322,15 @@ sub clear_out_html {
# Always allow the -tag
my %html=(M=>1);
# Check if more is allowed
- my $cid=$ENV{'request.course.id'};
- if (($ENV{"course.$cid.allow_limited_html_in_feedback"} =~ m/yes/i) ||
+ my $cid=$env{'request.course.id'};
+ if (($env{"course.$cid.allow_limited_html_in_feedback"} =~ m/yes/i) ||
($override)) {
# allows
#
#
%html=(B=>1, I=>1, P=>1, A=>1, LI=>1, OL=>1, UL=>1, EM=>1,
BR=>1, TT=>1, STRONG=>1, BLOCKQUOTE=>1, DIV=>1, IMG=>1,
- M=>1, SUB=>1, SUP=>1, SPAN=>1,
+ M=>1, ALGEBRA=>1, SUB=>1, SUP=>1, SPAN=>1,
H1=>1, H2=>1, H3=>1, H4=>1, H5=>1);
}
# Do the substitution of everything that is not explicitly allowed
@@ -2191,7 +2366,7 @@ sub secapply {
my ($adr,$sections)=($rec=~/^([^\(]+)\(([^\)]+)\)/);
if ($sections) {
foreach (split(/\;/,$sections)) {
- if (($_ eq $ENV{'request.course.sec'}) ||
+ if (($_ eq $env{'request.course.sec'}) ||
($defaultflag && ($_ eq '*'))) {
return $adr;
}
@@ -2202,37 +2377,68 @@ sub secapply {
return '';
}
+=pod
+
+=over 4
+
+=item *
+
+decide_receiver($feedurl,$author,$question,$course,$policy,$defaultflag);
+
+Arguments
+ $feedurl - /res/ url of resource (only need if $author is true)
+ $author,$question,$course,$policy - all true/false parameters
+ if true will attempt to find the addresses of user that should receive
+ this type of feedback (author - feedback to author of resource $feedurl,
+ $question 'Resource Content Questions', $course 'Course Content Question',
+ $policy 'Course Policy')
+ (Additionally it also checks $env for whether the corresponding form.
+ element exists, for ease of use in a html response context)
+
+ $defaultflag - (internal should be left blank) if true gather addresses
+ that aren't for a section even if I have a section
+ (used for reccursion internally, first we look for
+ addresses for our specific section then we recurse
+ and look for non section addresses)
+
+Returns
+ $typestyle - string of html text, describing what addresses were found
+ %to - a hash, which keys are addresses of users to send messages to
+ the keys will look like name:domain
+
+=cut
+
sub decide_receiver {
my ($feedurl,$author,$question,$course,$policy,$defaultflag) = @_;
my $typestyle='';
my %to=();
- if ($ENV{'form.author'}||$author) {
- $typestyle.='Submitting as Author Feedback ';
+ if ($env{'form.author'}||$author) {
+ $typestyle.='Submitting as Author Feedback ';
$feedurl=~/^\/res\/(\w+)\/(\w+)\//;
$to{$2.':'.$1}=1;
}
- if ($ENV{'form.question'}||$question) {
- $typestyle.='Submitting as Question ';
+ if ($env{'form.question'}||$question) {
+ $typestyle.='Submitting as Question ';
foreach (split(/\,/,
- $ENV{'course.'.$ENV{'request.course.id'}.'.question.email'})
+ $env{'course.'.$env{'request.course.id'}.'.question.email'})
) {
my $rec=&secapply($_,$defaultflag);
if ($rec) { $to{$rec}=1; }
}
}
- if ($ENV{'form.course'}||$course) {
+ if ($env{'form.course'}||$course) {
$typestyle.='Submitting as Comment ';
foreach (split(/\,/,
- $ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'})
+ $env{'course.'.$env{'request.course.id'}.'.comment.email'})
) {
my $rec=&secapply($_,$defaultflag);
if ($rec) { $to{$rec}=1; }
}
}
- if ($ENV{'form.policy'}||$policy) {
+ if ($env{'form.policy'}||$policy) {
$typestyle.='Submitting as Policy Feedback ';
foreach (split(/\,/,
- $ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'})
+ $env{'course.'.$env{'request.course.id'}.'.policy.email'})
) {
my $rec=&secapply($_,$defaultflag);
if ($rec) { $to{$rec}=1; }
@@ -2292,40 +2498,40 @@ sub adddiscuss {
$realsymb=&Apache::lonnet::symbread($filename);
}
if (&discussion_open(undef,$realsymb) &&
- &Apache::lonnet::allowed('pch',$ENV{'request.course.id'}.
- ($ENV{'request.course.sec'}?'/'.$ENV{'request.course.sec'}:''))) {
+ &Apache::lonnet::allowed('pch',$env{'request.course.id'}.
+ ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
my %contrib=('message' => $email,
- 'sendername' => $ENV{'user.name'},
- 'senderdomain' => $ENV{'user.domain'},
- 'screenname' => $ENV{'environment.screenname'},
- 'plainname' => $ENV{'environment.firstname'}.' '.
- $ENV{'environment.middlename'}.' '.
- $ENV{'environment.lastname'}.' '.
- $ENV{'enrironment.generation'},
+ 'sendername' => $env{'user.name'},
+ 'senderdomain' => $env{'user.domain'},
+ 'screenname' => $env{'environment.screenname'},
+ 'plainname' => $env{'environment.firstname'}.' '.
+ $env{'environment.middlename'}.' '.
+ $env{'environment.lastname'}.' '.
+ $env{'enrironment.generation'},
'attachmenturl'=> $attachmenturl,
'subject' => $subject);
- if ($ENV{'form.replydisc'}) {
- $contrib{'replyto'}=(split(/\:\:\:/,$ENV{'form.replydisc'}))[1];
+ if ($env{'form.replydisc'}) {
+ $contrib{'replyto'}=(split(/\:\:\:/,$env{'form.replydisc'}))[1];
}
if ($anon) {
$contrib{'anonymous'}='true';
}
if (($symb) && ($email)) {
- if ($ENV{'form.editdisc'}) {
+ if ($env{'form.editdisc'}) {
my %newcontrib = ();
$contrib{'ip'}=$ENV{'REMOTE_ADDR'};
$contrib{'host'}=$Apache::lonnet::perlvar{'lonHostID'};
$contrib{'timestamp'} = time;
$contrib{'history'} = '';
my $numoldver = 0;
- my ($oldsymb,$oldidx)=split(/\:\:\:/,$ENV{'form.editdisc'});
+ my ($oldsymb,$oldidx)=split(/\:\:\:/,$env{'form.editdisc'});
&Apache::lonenc::check_decrypt(\$oldsymb);
$oldsymb=~s|(bulletin___\d+___)adm/wrapper/|$1|;
# get timestamp for last post and history
- my %oldcontrib=&Apache::lonnet::restore($oldsymb,$ENV{'request.course.id'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ my %oldcontrib=&Apache::lonnet::restore($oldsymb,$env{'request.course.id'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
if (defined($oldcontrib{$oldidx.':replyto'})) {
$contrib{'replyto'} = $oldcontrib{$oldidx.':replyto'};
}
@@ -2360,22 +2566,22 @@ sub adddiscuss {
my $key = $oldidx.':'.&Apache::lonnet::escape($oldsymb).':'.$_;
$newcontrib{$key} = $contrib{$_};
}
- my $put_reply = &Apache::lonnet::putstore($ENV{'request.course.id'},
+ my $put_reply = &Apache::lonnet::putstore($env{'request.course.id'},
\%newcontrib,
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
$status='Editing class discussion'.($anon?' (anonymous)':'');
} else {
$status='Adding to class discussion'.($anon?' (anonymous)':'').': '.
- &Apache::lonnet::store(\%contrib,$symb,$ENV{'request.course.id'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ &Apache::lonnet::store(\%contrib,$symb,$env{'request.course.id'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
}
my %storenewentry=($symb => time);
$status.=' '.&mt('Updating discussion time').': '.
&Apache::lonnet::put('discussiontimes',\%storenewentry,
- $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
- $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
}
my %record=&Apache::lonnet::restore('_discussion');
my ($temp)=keys %record;
@@ -2396,38 +2602,67 @@ sub adddiscuss {
sub show_preview {
my $r=shift;
- my $message=&clear_out_html($ENV{'form.comment'});
- $message=~s/\n/\ /g;
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->send_http_header;
+ my $message=&clear_out_html($env{'form.comment'});
+ &newline_to_br(\$message);
$message=&Apache::lonspeller::markeduptext($message);
$message=&Apache::lontexconvert::msgtexconverted($message);
- my $subject=&clear_out_html($ENV{'form.subject'});
+ my $subject=&clear_out_html($env{'form.subject'});
$subject=~s/\n/\ /g;
$subject=&Apache::lontexconvert::msgtexconverted($subject);
- $r->print(''.
- 'Subject: '.$subject.' '.
- $message.'
');
+ my $html=&Apache::lonxml::xmlbegin();
+ $r->print($html.''.
+ ''.
+ 'Subject: '.$subject.' '.
+ $message.'
');
+}
+
+
+sub newline_to_br {
+ my ($message)=@_;
+ my $newmessage;
+ my $parser=HTML::LCParser->new($message);
+ while (my $token=$parser->get_token()) {
+ if ($token->[0] eq 'T') {
+ my $text=$token->[1];
+ $text=~s/\n/\ /g;
+ $newmessage.=$text;
+ } elsif ($token->[0] eq 'D' || $token->[0] eq 'C') {
+ $newmessage.=$token->[1];
+ } elsif ($token->[0] eq 'PI' || $token->[0] eq 'E') {
+ $newmessage.=$token->[2];
+ } elsif ($token->[0] eq 'S') {
+ $newmessage.=$token->[4];
+ }
+
+ }
+ $$message=$newmessage;
}
sub generate_preview_button {
+ my ($formname,$fieldname)=@_;
+ unless ($formname) { $formname='mailform'; }
+ unless ($fieldname) { $fieldname='comment'; }
my $pre=&mt("Show Preview and Check Spelling");
return(<
+onClick="if (typeof(document.$formname.onsubmit)=='function') {document.$formname.onsubmit();};this.form.comment.value=document.$formname.$fieldname.value;this.form.subject.value=document.$formname.subject.value;this.form.submit();" />
ENDPREVIEW
}
sub modify_attachments {
my ($r,$currnewattach,$currdelold,$symb,$idx,$attachmenturls)=@_;
- my $orig_subject = &Apache::lonnet::unescape($ENV{'form.subject'});
+ my $orig_subject = &Apache::lonnet::unescape($env{'form.subject'});
my $subject=&clear_out_html($orig_subject);
$subject=~s/\n/\ /g;
$subject=&Apache::lontexconvert::msgtexconverted($subject);
- my $timestamp=$ENV{'form.timestamp'};
- my $numoldver=$ENV{'form.numoldver'};
+ my $timestamp=$env{'form.timestamp'};
+ my $numoldver=$env{'form.numoldver'};
my $bodytag=&Apache::loncommon::bodytag('Discussion Post Attachments',
'','');
my $msg = '';
@@ -2436,8 +2671,10 @@ sub modify_attachments {
if ($idx) {
&extract_attachments($attachmenturls,$idx,$numoldver,\$msg,\%attachments,\%currattach,$currdelold);
}
+ &Apache::lonenc::check_encrypt(\$symb);
+ my $html=&Apache::lonxml::xmlbegin();
$r->print(<
+$html
Managing Attachments