--- loncom/interface/lonfeedback.pm 2004/09/13 12:19:14 1.124 +++ loncom/interface/lonfeedback.pm 2004/11/15 21:51:19 1.134 @@ -1,7 +1,7 @@ # The LearningOnline Network # Feedback # -# $Id: lonfeedback.pm,v 1.124 2004/09/13 12:19:14 raeburn Exp $ +# $Id: lonfeedback.pm,v 1.134 2004/11/15 21:51:19 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,6 +36,8 @@ use Apache::loncommon(); use Apache::lontexconvert(); use Apache::lonlocal; # must not have () use Apache::lonhtmlcommon(); +use Apache::lonnavmaps; +use Apache::lonenc(); use HTML::LCParser(); use Apache::lonspeller(); use Cwd; @@ -66,7 +68,7 @@ sub discussion_visible { } sub list_discussion { - my ($mode,$status,$symb)=@_; + my ($mode,$status,$ressymb)=@_; my $outputtarget=$ENV{'form.grade_target'}; if (defined($ENV{'form.export'})) { if($ENV{'form.export'}) { @@ -84,20 +86,16 @@ sub list_discussion { $crs.='_'.$ENV{'request.course.sec'}; } $crs=~s/\_/\//g; - unless ($symb) { - $symb=&Apache::lonnet::symbread(); - } - unless ($symb) { return ''; } + 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)$/)); + my %usernamesort = (); my %namesort =(); my %subjectsort = (); -# 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'; @@ -123,7 +121,6 @@ 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 $rolefilter = $ENV{'form.rolefilter'}; my $statusfilter = $ENV{'form.statusfilter'}; my $sectionpick = $ENV{'form.sectionpick'}; my $totposters = $ENV{'form.totposters'}; @@ -135,11 +132,12 @@ 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 ($rolefilter) { + if ($ENV{'form.rolefilter'}) { %roleshash = &Apache::lonnet::dump('nohist_userroles',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},$ENV{'course.'.$ENV{'request.course.id'}.'.num'}); foreach (keys %roleshash) { my ($role,$uname,$udom,$sec) = split/:/,$_; @@ -165,13 +163,10 @@ sub list_discussion { } # 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') { + if ($ENV{'environment.discdisplay'} eq 'unread') { $showonlyunread = 1; } - my $discmarkread=$userenv{'discmarkread'}; - if ($discmarkread eq 'ondisp') { + if ($ENV{'environment.discmarkread'} eq 'ondisp') { $markondisp = 1; } @@ -205,8 +200,6 @@ sub list_discussion { $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 %shown = (); my @posteridentity=(); @@ -232,7 +225,7 @@ sub list_discussion { $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,$ressymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$statusfilter,$toggkey,$outputtarget); + &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); my $discussion=''; my $manifestfile; @@ -332,7 +325,6 @@ sub list_discussion { # open manifest file my $manifest = '/imsmanifest.xml'; my $manifestfilename = $tempexport.$manifest; - print STDERR "manifestfilename is $manifestfilename\n"; if ($manifestfile = Apache::File->new('>'.$manifestfilename)) { $manifestok=1; print $manifestfile qq| @@ -363,7 +355,7 @@ imscp_v1p1.xsd http://www.imsglobal.org/ } |; - $discussion.='
'; + $discussion.='
'; $discussion .='
'. ''; if ($visible>2) { @@ -482,7 +474,6 @@ imscp_v1p1.xsd http://www.imsglobal.org/ my $postfilename = $alldiscussion{$_}.'-'.$imsitems{$alldiscussion{$_}}{'timestamp'}.'.html'; if ($manifestok) { if (($depth[$alldiscussion{$_}] <= $currdepth) && ($alldiscussion{$_} != $firstidx)) { - print STDERR "depth is $depth[$alldiscussion{$_}], currdepth is $currdepth, idx is $alldiscussion{$_}, firstidx is $firstidx\n"; print $manifestfile ' '."\n"; } $currdepth = $depth[$alldiscussion{$_}]; @@ -608,7 +599,7 @@ END undef(%oldENV); $discussion .= 'Download the zip file from Discussion Posting Archive
'; if ($copyresult) { - $discussion .= 'The following errors occurred during export - '.$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.
'; @@ -682,7 +673,7 @@ ENDDISCUSS ($ENV{'request.course.sec'}?'/'.$ENV{'request.course.sec'}:''))) { if ($outputtarget ne 'tex') { $discussion.='
'. + $ressymb.':::" '.$target.'>'. ''. &mt('Post Discussion').'
'; } @@ -696,8 +687,8 @@ sub build_posting_display { my @original=(); my @index=(); - - my %contrib=&Apache::lonnet::restore($ressymb,$ENV{'request.course.id'}, + 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'}); @@ -989,6 +980,7 @@ sub build_posting_display { $$shown{$idx} = 1; } else { foreach my $role (@{$$roleinfo{$poster}}) { + &Apache::lonnet::logthis("\n rolematch $rolematch\nrole $role"); if ($role =~ m/^$rolematch$/) { $$shown{$idx} = 1; last; @@ -1056,12 +1048,14 @@ sub get_post_contents { return $discussion; } } - $$screenname=&Apache::loncommon::screenname( - $$contrib{$idx.':sendername'}, - $$contrib{$idx.':senderdomain'}); - $$plainname=&Apache::loncommon::nickname( - $$contrib{$idx.':sendername'}, - $$contrib{$idx.':senderdomain'}); +# $$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'}); my $sender=&Apache::loncommon::aboutmewrapper( $$plainname, $$contrib{$idx.':sendername'}, @@ -1159,22 +1153,23 @@ sub replicate_attachments { $i ++; } my ($content,$rtncode); - print STDERR "File to replicate is $$attachrefs{$id}{'filename'} in $1,$2\n"; my $uploadreply = &Apache::lonnet::getuploaded('GET',$$attachrefs{$id}{'filename'},$1,$2,$content,$rtncode); if ($uploadreply eq 'ok') { - my $attachcopy; - if ($attachcopy = Apache::File->new('>'.$destination)) { - print $attachcopy $content; - close($attachcopy); - } else { - $response .= 'Error copying a file attachment to IMS package: '.$!.'
'."\n"; - } + my $attachcopy; + if ($attachcopy = Apache::File->new('>'.$destination)) { + print $attachcopy $content; + close($attachcopy); + } else { + $response .= 'Error copying file attachment - '.$5.' to IMS package: '.$!.'
'."\n"; + } } else { - print STDERR "return code from lonnet was $rtncode\n"; + &Apache::lonnet::logthis("Replication of attachment failed when building IMS export of discussion posts - domain: $1, course: $2, file: $$attachrefs{$id}{'filename'} -error: $rtncode"); + $response .= 'Error copying file attachment - '.$5.' to IMS package: '.$rtncode.'
'."\n"; } } } } + return $response; } sub mail_screen { @@ -1480,10 +1475,7 @@ END sub print_display_options { my ($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl) = @_; - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } + &dewrapper(\$feedurl); my $function = &Apache::loncommon::get_users_function(); my $tabcolor = &Apache::loncommon::designparm($function.'.tabbg', @@ -1681,10 +1673,8 @@ END sub print_sortfilter_options { my ($r,$symb,$previous,$feedurl) = @_; - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } + + &dewrapper(\$feedurl); my @sections = (); my $section_sel = ''; my $numsections = 0; @@ -1820,17 +1810,9 @@ END sub print_showposters { my ($r,$symb,$previous,$feedurl,$sortposts) = @_; - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } + # backward compatibility (bulletin boards used to be 'wrapped') - my $ressymb=$symb; - if ($ressymb =~ /bulletin___\d+___/) { - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } - } + my $ressymb=&wrap_symb($symb); my $crs='/'.$ENV{'request.course.id'}; if ($ENV{'request.course.sec'}) { $crs.='_'.$ENV{'request.course.sec'}; @@ -2014,10 +1996,8 @@ sub redirect_back { my $userpicktag = ''; my $qrystr = ''; my $prevtag = ''; - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } + + &dewrapper(\$feedurl); if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' }; if ($previous > 0) { $qrystr = 'previous='.$previous; @@ -2050,6 +2030,7 @@ sub redirect_back { $sectag = ''; } } + $feedurl=&Apache::lonenc::check_encrypt($feedurl); $r->print (< @@ -2087,9 +2068,10 @@ sub no_redirect_back { ENDNOREDIR if ($feedurl!~/^\/adm\/feedback/) { - $r->print(''); + $r->print(''); } - + $feedurl=&Apache::lonenc::check_encrypt($feedurl); $r->print (< @@ -2187,8 +2169,6 @@ sub clear_out_html { sub assemble_email { my ($feedurl,$message,$prevattempts,$usersaw,$useranswer)=@_; my $email=<<"ENDEMAIL"; -Refers to $feedurl - $message ENDEMAIL my $citations=<<"ENDCITE"; @@ -2340,6 +2320,7 @@ sub adddiscuss { $contrib{'history'} = ''; my $numoldver = 0; 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'}, @@ -2718,6 +2699,24 @@ sub construct_attachmenturl { } return $newattachmenturl; } + +sub has_discussion { + my $resourcesref = shift; + my $navmap = Apache::lonnavmaps::navmap->new(); + my @allres=$navmap->retrieveResources(); + foreach my $resource (@allres) { + if ($resource->hasDiscussion()) { + my $ressymb; + if ($resource->symb() =~ m-(___adm/\w+/\w+)/(\d+)/bulletinboard$-) { + $ressymb = 'bulletin___'.$2.$1.'/'.$2.'/bulletinboard'; + } else { + $ressymb = $resource->symb(); + } + push @{$resourcesref}, $ressymb; + } + } + return; +} sub handler { my $r = shift; @@ -2730,13 +2729,12 @@ sub handler { # --------------------------- Get query string for limited number of parameters &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','threadedon','threadedoff','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navmaps','navurl','sortfilter','sortposts','applysort','rolefilter','statusfilter','sectionpick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export']); + ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','threadedon','threadedoff','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortfilter','sortposts','applysort','rolefilter','statusfilter','sectionpick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export']); if ($ENV{'form.discsymb'}) { - my $symb = $ENV{'form.discsymb'}; + my ($symb,$feedurl) = &get_feedurl_and_clean_symb($ENV{'form.discsymb'}); my $readkey = $symb.'_read'; - my %readinghash = (); my $chgcount = 0; - %readinghash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$readkey],$ENV{'user.domain'},$ENV{'user.name'}); + my %readinghash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$readkey],$ENV{'user.domain'},$ENV{'user.name'}); foreach my $key (keys %ENV) { if ($key =~ m/^form\.postunread_(\d+)/) { if ($readinghash{$readkey} =~ /\.$1\./) { @@ -2751,21 +2749,19 @@ sub handler { } } if ($chgcount > 0) { - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%readinghash,$ENV{'user.domain'},$ENV{'user.name'}); + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%readinghash,$ENV{'user.domain'},$ENV{'user.name'}); } &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - my $previous=$ENV{'form.previous'}; - my $feedurl = &Apache::lonnet::clutter($url); - &redirect_back($r,$feedurl,&mt('Marked postings read/unread').'
','0','0','',$previous,'','','',); + &redirect_back($r,$feedurl,&mt('Marked postings read/unread').'
', + '0','0','',$ENV{'form.previous'},'','','',); return OK; } if ($ENV{'form.allversions'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $bodytag=&Apache::loncommon::bodytag('Discussion Post Versions', - '',''); + my $bodytag=&Apache::loncommon::bodytag('Discussion Post Versions'); $r->print (< @@ -2778,13 +2774,10 @@ END if ($ENV{'request.course.sec'}) { $crs.='_'.$ENV{'request.course.sec'}; } - $crs=~s/\_/\//g; + $crs=~s|_|/|g; my $seeid=&Apache::lonnet::allowed('rin',$crs); my ($symb,$idx)=split(/\:\:\:/,$ENV{'form.allversions'}); - my $ressymb=$symb; - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } + ($symb)=&get_feedurl_and_clean_symb($symb); if ($idx > 0) { my %messages = (); my %subjects = (); @@ -2792,120 +2785,90 @@ END my %allattachments = (); my %imsfiles = (); my ($screenname,$plainname); - 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 $discussion = &get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname); - $r->print($discussion); + my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname)); } return OK; } if ($ENV{'form.posterlist'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.posterlist'}; - my $sortposts = $ENV{'form.sortposts'}; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - my $previous=$ENV{'form.previous'}; - my $feedurl = &Apache::lonnet::clutter($url); - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } - &print_showposters($r,$symb,$previous,$feedurl,$sortposts); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.applysort'}); + &print_showposters($r,$symb,$ENV{'form.previous'},$feedurl, + $ENV{'form.sortposts'}); return OK; } if ($ENV{'form.userpick'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.userpick'}; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - my $previous=$ENV{'form.previous'}; -# backward compatibility (bulletin boards used to be 'wrapped') - my $ressymb=$symb; - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } - my $sort=$ENV{'form.sortposts'}; - my @posters = (); - if (ref($ENV{'form.stuinfo'}) eq 'ARRAY') { - @posters = $ENV{'form.stuinfo'}; - } else { - $posters[0] = $ENV{'form.stuinfo'}; - } + my @posters = &Apache::loncommon::get_env_multiple('form.stuinfo'); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.userpick'}); my $numpicks = @posters; - if (defined($ENV{'form.userpick'})) { - my %discinfo = (); - $discinfo{$ressymb.'_userpick'} = join('&',@posters); - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); - } - my $feedurl = &Apache::lonnet::clutter($url); - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } - &redirect_back($r,$feedurl,&mt('Changed sort/filter').'
','0','0','',$previous,$sort,'','','',$numpicks); + my %discinfo; + $discinfo{$symb.'_userpick'} = join('&',@posters); + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); + &redirect_back($r,$feedurl,&mt('Changed sort/filter').'
','0','0', + '',$ENV{'form.previous'},$ENV{'form.sortposts'},'','','', + $numpicks); return OK; } if ($ENV{'form.applysort'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.applysort'}; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - my $previous=$ENV{'form.previous'}; - my $sort = $ENV{'form.sortposts'}; - my $rolefilter = $ENV{'form.rolefilter'}; - my $statusfilter = $ENV{'form.statusfilter'}; - my $secpick = $ENV{'form.sectionpick'}; - my $feedurl = &Apache::lonnet::clutter($url); - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } - &redirect_back($r,$feedurl,&mt('Changed sort/filter').'
','0','0','',$previous,$sort,$rolefilter,$statusfilter,$secpick); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.applysort'}); + &redirect_back($r,$feedurl,&mt('Changed sort/filter').'
','0','0', + '',$ENV{'form.previous'},$ENV{'form.sortposts'}, + $ENV{'form.rolefilter'},$ENV{'form.statusfilter'}, + $ENV{'form.secpick'}); return OK; } elsif ($ENV{'form.sortfilter'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.sortfilter'}; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - my $previous=$ENV{'form.previous'}; - my $feedurl = &Apache::lonnet::clutter($url); - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } - &print_sortfilter_options($r,$symb,$previous,$feedurl); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.sortfilter'}); + &print_sortfilter_options($r,$symb,$ENV{'form.previous'},$feedurl); return OK; - } elsif ($ENV{'form.navmaps'}) { + } elsif ($ENV{'form.navtime'}) { my %discinfo = (); my @resources = (); - if ($ENV{'form.navmaps'} =~ /:/) { - @resources = split/:/,$ENV{'form.navmaps'}; + if (defined($ENV{'form.navmaps'})) { + if ($ENV{'form.navmaps'} =~ /:/) { + @resources = split/:/,$ENV{'form.navmaps'}; + } else { + @resources = ("$ENV{'form.navmaps'}"); + } } else { - @resources = ("$ENV{'form.navmaps'}"); + &has_discussion(\@resources); } my $numitems = @resources; my $feedurl = '/adm/navmaps'; - if ($ENV{'form.navurl'}) { - $feedurl .= '?'.$ENV{'form.navurl'}; - } + if ($ENV{'form.navurl'}) { $feedurl .= '?'.$ENV{'form.navurl'}; } my %lt = &Apache::lonlocal::texthash( 'mnpa' => 'Marked "New" posts as read in a total of', - 'robb' => 'resources/bulletin boards.' + 'robb' => 'resources/bulletin boards.', + 'twnp' => 'There are currently no resources or bulletin boards with unread discussion postings.' ); foreach (@resources) { # backward compatibility (bulletin boards used to be 'wrapped') my $ressymb=$_; + &Apache::lonenc::check_decrypt(\$ressymb); if ($ressymb =~ m/bulletin___\d+___/) { unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper/|; } } my $lastkey = $ressymb.'_lastread'; - $discinfo{$lastkey} = time; + $discinfo{$lastkey} = $ENV{'form.navtime'}; + } + my $textline = "$lt{'mnpa'} $numitems $lt{'robb'}"; + if ($numitems > 0) { + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); + } else { + $textline = "$lt{'twnp'}"; } - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print (< -$lt{'mnpa'} $numitems $lt{'robb'} +$textline
Continue @@ -2928,63 +2891,51 @@ ENDREDIR } elsif ($ENV{'form.modifydisp'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.modifydisp'}; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - my $previous=$ENV{'form.previous'}; - my ($dispchgA,$dispchgB,$markchg,$toggchg) = split/_/,$ENV{'form.changes'}; - my $feedurl = &Apache::lonnet::clutter($url); - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } - &print_display_options($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.modifydisp'}); + my ($dispchgA,$dispchgB,$markchg,$toggchg) = + split(/_/,$ENV{'form.changes'}); + &print_display_options($r,$symb,$ENV{'form.previous'},$dispchgA, + $dispchgB,$markchg,$toggchg,$feedurl); return OK; - } elsif (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || $ENV{'form.onlyunmark'} || $ENV{'form.toggoff'} || $ENV{'form.toggon'} ) { + } elsif ($ENV{'form.markondisp'} || $ENV{'form.markonread'} || + $ENV{'form.allposts'} || $ENV{'form.onlyunread'} || + $ENV{'form.onlyunmark'} || $ENV{'form.toggoff'} || + $ENV{'form.toggon'} ) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $previous=$ENV{'form.previous'}; - my ($map,$ind,$url); + my $feedurl; if ( ($ENV{'form.toggoff'}) || ($ENV{'form.toggon'}) ) { -# ------------------------------ Modify setting for read/unread toggle for each post +# ------------------------ Modify setting for read/unread toggle for each post my $symb=$ENV{'form.toggoff'}?$ENV{'form.toggoff'}:$ENV{'form.toggon'}; - my $ressymb = $symb; - ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } - my %discinfo = (); - my $toggkey = $ressymb.'_readtoggle'; - if ($ENV{'form.toggon'}) { - $discinfo{$toggkey} = 1; - } elsif ($ENV{'form.toggoff'}) { - $discinfo{$toggkey} = 0; - } - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); + ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb); + my %discinfo; + $discinfo{$symb.'_readtoggle'}=1; + if ($ENV{'form.toggoff'}) { $discinfo{$symb.'_readtoggle'}=0; } + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); } if (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'})) { -# ---------------------- Modify setting for identification of 'NEW' posts in this discussion +# --------- Modify setting for identification of 'NEW' posts in this discussion my $symb=$ENV{'form.markondisp'}?$ENV{'form.markondisp'}:$ENV{'form.markonread'}; - my $ressymb = $symb; - ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } - my %discinfo = (); - my $lastkey = $ressymb.'_lastread'; - my $ondispkey = $ressymb.'_markondisp'; + ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb); + my %discinfo; + my $lastkey = $symb.'_lastread'; + my $ondispkey = $symb.'_markondisp'; if ($ENV{'form.markondisp'}) { $discinfo{$lastkey} = time; $discinfo{$ondispkey} = 1; } elsif ($ENV{'form.markonread'}) { - if ( $previous > 0 ) { - $discinfo{$lastkey} = $previous; + if ( $ENV{'form.previous'} > 0 ) { + $discinfo{$lastkey} = $ENV{'form.previous'}; } $discinfo{$ondispkey} = 0; } - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); } - if (($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || ($ENV{'form.onlyunmark'}) ) { -# ----------------------------------------------------------------- Modify display setting for this discussion + if ($ENV{'form.allposts'} || $ENV{'form.onlyunread'} || + $ENV{'form.onlyunmark'}) { +# --------------------------------- Modify display setting for this discussion my $symb; if ($ENV{'form.allposts'}) { $symb = $ENV{'form.allposts'}; @@ -2993,132 +2944,114 @@ ENDREDIR } else { $symb = $ENV{'form.onlyunmark'}; } - my $ressymb = $symb; - ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } - my %discinfo = (); + ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb); + my %discinfo; if ($ENV{'form.allposts'}) { - $discinfo{$ressymb.'_showonlyunread'} = 0; - $discinfo{$ressymb.'_showonlyunmark'} = 0; + $discinfo{$symb.'_showonlyunread'} = 0; + $discinfo{$symb.'_showonlyunmark'} = 0; } elsif ($ENV{'form.onlyunread'}) { - $discinfo{$ressymb.'_showonlyunread'} = 1; + $discinfo{$symb.'_showonlyunread'} = 1; } else { - $discinfo{$ressymb.'_showonlyunmark'} = 1; + $discinfo{$symb.'_showonlyunmark'} = 1; } - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); - } - if (($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || ($ENV{'form.onlyunmark'}) ||($ENV{'form.toggoff'}) || ($ENV{'form.toggon'}) ) { - &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'
','0','0','',$previous); - } else { - &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'
','0','0'); + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); } + my $previous=$ENV{'form.previous'}; + if ($ENV{'form.markondisp'}) { $previous=undef; } + &redirect_back($r,$feedurl,&mt('Changed display status').'
', + '0','0','',$previous); return OK; } elsif ($ENV{'form.markread'}) { -# ----------------------------------------------------------------- Mark new posts not NEW +# ----------------------------------------------------- Mark new posts not NEW &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.markread'}; - my $ressymb = $symb; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { - $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; - } - my %discinfo = (); - my $lastkey = $ressymb.'_lastread'; - $discinfo{$lastkey} = time; - &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); - &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed reading status').'
','0','0'); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.markread'}); + &Apache::lonnet::logthis("\n last read w symb ".$symb); + my %discinfo; + $discinfo{$symb.'_lastread'} = time; + &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss', + \%discinfo,$ENV{'user.domain'},$ENV{'user.name'}); + &redirect_back($r,$feedurl,&mt('Changed reading status').'
', + '0','0'); return OK; } elsif (($ENV{'form.hide'}) || ($ENV{'form.unhide'})) { # ----------------------------------------------------------------- Hide/unhide - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; - my $entry=$ENV{'form.hide'}?$ENV{'form.hide'}:$ENV{'form.unhide'}; + my $entry=$ENV{'form.hide'}?$ENV{'form.hide'}:$ENV{'form.unhide'}; + my ($symb,$idx)=split(/\:\:\:/,$entry); + ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); - my ($symb,$idx)=split(/\:\:\:/,$entry); - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); + 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'}); + my $currenthidden=$contrib{'hidden'}; + my $currentstudenthidden=$contrib{'studenthidden'}; - - my $currenthidden=$contrib{'hidden'}; - my $currentstudenthidden=$contrib{'studenthidden'}; + 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 $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); - - if ($ENV{'form.hide'}) { - $currenthidden.='.'.$idx.'.'; - unless ($seeid) { - $currentstudenthidden.='.'.$idx.'.'; - } - } else { - $currenthidden=~s/\.$idx\.//g; - } - my %newhash=('hidden' => $currenthidden); - if ( ($ENV{'form.hide'}) && (!$seeid) ) { - $newhash{'studenthidden'} = $currentstudenthidden; - } + if ($ENV{'form.hide'}) { + $currenthidden.='.'.$idx.'.'; + unless ($seeid) { + $currentstudenthidden.='.'.$idx.'.'; + } + } else { + $currenthidden=~s/\.$idx\.//g; + } + my %newhash=('hidden' => $currenthidden); + if ( ($ENV{'form.hide'}) && (!$seeid) ) { + $newhash{'studenthidden'} = $currentstudenthidden; + } - &Apache::lonnet::store(\%newhash,$symb,$ENV{'request.course.id'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + &Apache::lonnet::store(\%newhash,$symb,$ENV{'request.course.id'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); - &redirect_back($r,&Apache::lonnet::clutter($url), - &mt('Changed discussion status').'
','0','0','',$ENV{'form.previous'}); + &redirect_back($r,$feedurl,&mt('Changed discussion status').'
', + '0','0','',$ENV{'form.previous'}); } elsif (($ENV{'form.threadedon'}) || ($ENV{'form.threadedoff'})) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; + my $symb; if ($ENV{'form.threadedon'}) { + $symb=$ENV{'form.threadedon'}; &Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'}); &Apache::lonnet::appenv('environment.threadeddiscussion' => 'on'); } else { + $symb=$ENV{'form.threadedoff'}; &Apache::lonnet::del('environment',['threadeddiscussion']); &Apache::lonnet::delenv('environment\.threadeddiscussion'); } - my $symb=$ENV{'form.threadedon'}?$ENV{'form.threadedon'}:$ENV{'form.threadedoff'}; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - &redirect_back($r,&Apache::lonnet::clutter($url), - &mt('Changed discussion view mode').'
','0','0','',$ENV{'form.previous'}); + my ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb); + &redirect_back($r,$feedurl,&mt('Changed discussion view mode').'
', + '0','0','',$ENV{'form.previous'}); } elsif ($ENV{'form.deldisc'}) { # --------------------------------------------------------------- Hide for good - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - - my $entry=$ENV{'form.deldisc'}; - - my ($symb,$idx)=split(/\:\:\:/,$entry); - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - - 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 $currentdeleted=$contrib{'deleted'}; - - $currentdeleted.='.'.$idx.'.'; - - my %newhash=('deleted' => $currentdeleted); + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + my ($symb,$idx)=split(/\:\:\:/,$ENV{'form.deldisc'}); + ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb); + 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 %newhash=('deleted' => $contrib{'deleted'}.".$idx."); &Apache::lonnet::store(\%newhash,$symb,$ENV{'request.course.id'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); - - &redirect_back($r,&Apache::lonnet::clutter($url), - &mt('Changed discussion status').'
','0','0','',$ENV{'form.previous'}); + $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + &redirect_back($r,$feedurl,&mt('Changed discussion status').'
', + '0','0','',$ENV{'form.previous'}); } elsif ($ENV{'form.preview'}) { # -------------------------------------------------------- User wants a preview - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; &show_preview($r); } elsif ($ENV{'form.attach'}) { @@ -3126,9 +3059,7 @@ ENDREDIR &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['subject','comment','addnewattach','delnewattach','timestamp','numoldver','idx','anondiscuss','discuss']); - my @currnewattach = (); - my @currdelold = (); - my @keepold = (); + my (@currnewattach,@currdelold,@keepold); &process_attachments(\@currnewattach,\@currdelold,\@keepold); if (exists($ENV{'form.addnewattach.filename'})) { unless (length($ENV{'form.addnewattach'})>131072) { @@ -3137,36 +3068,30 @@ ENDREDIR push @currnewattach, $newattachment; } } - my $attachmenturls = ''; + my $attachmenturls; + my ($symb) = &get_feedurl_and_clean_symb($ENV{'form.attach'}); my $idx = $ENV{'form.idx'}; - my $symb = $ENV{'form.attach'}; if ($idx) { my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'}, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); $attachmenturls = $contrib{$idx.':attachmenturl'}; } - &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,$attachmenturls); + &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx, + $attachmenturls); } elsif ($ENV{'form.chgreads'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ENV{'form.chgreads'}); &redirect_back($r,&Apache::lonnet::clutter($url), - &mt('Changed read status').'
','0','0'); + &mt('Changed read status').'
','0','0'); } elsif ($ENV{'form.export'}) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - my $symb=$ENV{'form.export'}; - my $mode; + my ($symb,$feedurl) = &get_feedurl_and_clean_symb($ENV{'form.export'}); + my $mode='board'; my $status='OPEN'; - my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); my $previous=$ENV{'form.previous'}; - my $feedurl = &Apache::lonnet::clutter($url); - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $mode = 'board'; - $feedurl=~s|^/adm/wrapper||; - } if ($feedurl =~ /\.(problem|exam|quiz|assess|survey|form|library)$/) { $mode='problem'; $status=$Apache::inputtags::status[-1]; @@ -3177,69 +3102,78 @@ ENDREDIR return OK; } else { # ------------------------------------------------------------- Normal feedback - my $feedurl=$ENV{'form.postdata'}; - $feedurl=~s/^http\:\/\///; - $feedurl=~s/^$ENV{'SERVER_NAME'}//; - $feedurl=~s/^$ENV{'HTTP_HOST'}//; - $feedurl=~s/\?.+$//; + my $feedurl=$ENV{'form.postdata'}; + $feedurl=~s/^http\:\/\///; + $feedurl=~s/^$ENV{'SERVER_NAME'}//; + $feedurl=~s/^$ENV{'HTTP_HOST'}//; + $feedurl=~s/\?.+$//; - my $symb; - if ($ENV{'form.replydisc'}) { - $symb=(split(/\:\:\:/,$ENV{'form.replydisc'}))[0]; - my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb); - $feedurl=&Apache::lonnet::clutter($url); - } elsif ($ENV{'form.editdisc'}) { - $symb=(split(/\:\:\:/,$ENV{'form.editdisc'}))[0]; - my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb); - $feedurl=&Apache::lonnet::clutter($url); - } elsif ($ENV{'form.origpage'}) { - $symb=""; - } else { - $symb=&Apache::lonnet::symbread($feedurl); - } - unless ($symb) { - $symb=$ENV{'form.symb'}; - if ($symb) { + my $symb; + if ($ENV{'form.replydisc'}) { + $symb=(split(/\:\:\:/,$ENV{'form.replydisc'}))[0]; + my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb); + $feedurl=&Apache::lonnet::clutter($url); + } elsif ($ENV{'form.editdisc'}) { + $symb=(split(/\:\:\:/,$ENV{'form.editdisc'}))[0]; my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb); - $feedurl=&Apache::lonnet::clutter($url); + $feedurl=&Apache::lonnet::clutter($url); + } elsif ($ENV{'form.origpage'}) { + $symb=""; + } else { + $symb=&Apache::lonnet::symbread($feedurl); + } + unless ($symb) { + $symb=$ENV{'form.symb'}; + if ($symb) { + my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb); + $feedurl=&Apache::lonnet::clutter($url); + } + } + &Apache::lonenc::check_decrypt(\$symb); + my $goahead=1; + if ($feedurl=~/\.(problem|exam|quiz|assess|survey|form)$/) { + unless ($symb) { $goahead=0; } + } + # backward compatibility (bulletin boards used to be 'wrapped') + if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { + $feedurl=~s|^/adm/wrapper||; + } + if (!$goahead) { + # Ambiguous Problem Resource + $r->internal_redirect('/adm/ambiguous'); + return OK; } - } - my $goahead=1; - if ($feedurl=~/\.(problem|exam|quiz|assess|survey|form)$/) { - unless ($symb) { $goahead=0; } - } - # backward compatibility (bulletin boards used to be 'wrapped') - if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { - $feedurl=~s|^/adm/wrapper||; - } - if ($goahead) { # Go ahead with feedback, no ambiguous reference - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; - if ( - ( - ($feedurl=~m:^/res:) && ($feedurl!~m:^/res/adm:) - ) - || - ($ENV{'request.course.id'} && ($feedurl!~m:^/adm:)) - || - ($ENV{'request.course.id'} && ($symb=~/^bulletin\_\_\_/)) - ) { + unless ( + ( + ($feedurl=~m:^/res:) && ($feedurl!~m:^/res/adm:) + ) + || + ($ENV{'request.course.id'} && ($feedurl!~m:^/adm:)) + || + ($ENV{'request.course.id'} && ($symb=~/^bulletin\_\_\_/)) + ) { +# Unable to give feedback + &no_redirect_back($r,$feedurl); + } # --------------------------------------------------- Print login screen header - unless ($ENV{'form.sendit'}) { - my $options=&screen_header($feedurl); - if ($options) { - &mail_screen($r,$feedurl,$options); - } else { - &fail_redirect($r,$feedurl); + unless ($ENV{'form.sendit'}) { + my $options=&screen_header($feedurl); + if ($options) { + &mail_screen($r,$feedurl,$options); + } else { + &fail_redirect($r,$feedurl); + } + return OK; } - } else { # Get previous user input my $prevattempts=&Apache::loncommon::get_previous_attempt( - $symb,$ENV{'user.name'},$ENV{'user.domain'}, - $ENV{'request.course.id'}); + $symb,$ENV{'user.name'},$ENV{'user.domain'}, + $ENV{'request.course.id'}); # Get output from resource my $usersaw=&resource_output($feedurl); @@ -3247,26 +3181,28 @@ ENDREDIR # Get resource answer (need to allow student to view grades for this to work) &Apache::lonnet::appenv(('allowed.vgr'=>'F')); my $useranswer=&Apache::loncommon::get_student_answers( - $symb,$ENV{'user.name'},$ENV{'user.domain'}, - $ENV{'request.course.id'}); + $symb,$ENV{'user.name'},$ENV{'user.domain'}, + $ENV{'request.course.id'}); &Apache::lonnet::delenv('allowed.vgr'); # Get attachments, if any, and not too large my $attachmenturl=''; - if (($ENV{'form.origpage'}) || ($ENV{'form.editdisc'}) || ($ENV{'form.replydisc'})) { - my ($symb,$idx); - if ($ENV{'form.replydisc'}) { - ($symb,$idx)=split(/\:\:\:/,$ENV{'form.replydisc'}); - } elsif ($ENV{'form.editdisc'}) { - ($symb,$idx)=split(/\:\:\:/,$ENV{'form.editdisc'}); - } elsif ($ENV{'form.origpage'}) { - $symb = $ENV{'form.symb'}; - } - my @currnewattach = (); - my @deloldattach = (); - my @keepold = (); - &process_attachments(\@currnewattach,\@deloldattach,\@keepold); - $symb=~s|(bulletin___\d+___)adm/wrapper/|$1|; - $attachmenturl=&construct_attachmenturl(\@currnewattach,\@keepold,$symb,$idx); + if (($ENV{'form.origpage'}) || ($ENV{'form.editdisc'}) || + ($ENV{'form.replydisc'})) { + my ($symb,$idx); + if ($ENV{'form.replydisc'}) { + ($symb,$idx)=split(/\:\:\:/,$ENV{'form.replydisc'}); + } elsif ($ENV{'form.editdisc'}) { + ($symb,$idx)=split(/\:\:\:/,$ENV{'form.editdisc'}); + } elsif ($ENV{'form.origpage'}) { + $symb = $ENV{'form.symb'}; + } + &Apache::lonenc::check_decrypt(\$symb); + my @currnewattach = (); + my @deloldattach = (); + my @keepold = (); + &process_attachments(\@currnewattach,\@deloldattach,\@keepold); + $symb=~s|(bulletin___\d+___)adm/wrapper/|$1|; + $attachmenturl=&construct_attachmenturl(\@currnewattach,\@keepold,$symb,$idx); } elsif ($ENV{'form.attachment.filename'}) { unless (length($ENV{'form.attachment'})>131072) { $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback'); @@ -3277,49 +3213,65 @@ ENDREDIR # Assemble email my ($email,$citations)=&assemble_email($feedurl,$message,$prevattempts, - $usersaw,$useranswer); + $usersaw,$useranswer); # Who gets this? my ($typestyle,%to) = &decide_receiver($feedurl); # Actually send mail my ($status,$numsent)=&send_msg($feedurl,$email,$citations, - $attachmenturl,%to); + $attachmenturl,%to); # Discussion? Store that. my $numpost=0; - if ($ENV{'form.discuss'}) { - my $subject = &clear_out_html($ENV{'form.subject'}); - $typestyle.=&adddiscuss($symb,$message,0,$attachmenturl,$subject); + if ($ENV{'form.discuss'} || $ENV{'form.anondiscuss'}) { + my $subject = &clear_out_html($ENV{'form.subject'}); + my $anonmode=(defined($ENV{'form.anondiscuss'})); + $typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl, + $subject); $numpost++; } - - if ($ENV{'form.anondiscuss'}) { - my $subject = &clear_out_html($ENV{'form.subject'}); - $typestyle.=&adddiscuss($symb,$message,1,$attachmenturl,$subject); - $numpost++; - } - - + # Receipt screen and redirect back to where came from &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$status,$ENV{'form.previous'}); - - } - } else { -# Unable to give feedback - &no_redirect_back($r,$feedurl); - } - } else { -# Ambiguous Problem Resource - if ( &Apache::lonnet::mod_perl_version() == 2 ) { - &Apache::lonnet::cleanenv(); - } - $r->internal_redirect('/adm/ambiguous'); } -} return OK; } +sub wrap_symb { + my ($ressymb)=@_; + if ($ressymb =~ /bulletin___\d+___/) { + unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) { + $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|; + } + } + return $ressymb; +} +sub dewrapper { + my ($feedurl)=@_; + if ($$feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) { + $$feedurl=~s|^/adm/wrapper||; + } +} + +sub get_feedurl { + my ($symb)=@_; + my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); + my $feedurl = &Apache::lonnet::clutter($url); + &dewrapper(\$feedurl); + return $feedurl; +} + +sub get_feedurl_and_clean_symb { + my ($symb)=@_; + &Apache::lonenc::check_decrypt(\$symb); +# backward compatibility (bulletin boards used to be 'wrapped') + unless ($symb =~ m|bulletin___\d+___adm/wrapper|) { + $symb=~s|(bulletin___\d+___)|$1adm/wrapper|; + } + my $feedurl = &get_feedurl($symb); + return ($symb,$feedurl); +} 1; __END__