--- loncom/interface/londocs.pm 2006/05/30 20:09:25 1.229 +++ loncom/interface/londocs.pm 2006/07/20 20:42:48 1.242 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.229 2006/05/30 20:09:25 raeburn Exp $ +# $Id: londocs.pm,v 1.242 2006/07/20 20:42:48 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -121,21 +121,18 @@ sub authorhosts { sub dumpbutton { my ($home,$other,%outhash)=&authorhosts(); - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } + my $type = &Apache::loncommon::course_type(); if ($home+$other==0) { return ''; } my $output=''; if ($home) { return ''. ''. + &mt('Dump '.$type.' DOCS to Construction Space').'" />'. &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs'); } else { return''. - &mt('Dump [_1] DOCS to Construction Space: available on other servers', - $type); + &mt('Dump '.$type. + ' DOCS to Construction Space: available on other servers'); } } @@ -148,12 +145,9 @@ sub clean { sub dumpcourse { my ($r) = @_; - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } - $r->print(&Apache::loncommon::start_page('Dump [_1] DOCS to Construction Space', - $type).'
'); + my $type = &Apache::loncommon::course_type(); + $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space'). + ''); my ($home,$other,%outhash)=&authorhosts(); unless ($home) { return ''; } my $origcrsid=$env{'request.course.id'}; @@ -243,8 +237,10 @@ sub dumpcourse { 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}}; $title=~s/:/:/g; $r->print(''.($title?$title:' ').''); - unless ($title) { + if (!$title) { $title=$_; + } else { + $title=~s|/|_|g; } $title=~s/\.(\w+)$//; $title=&clean($title); @@ -261,22 +257,16 @@ sub dumpcourse { # ------------------------------------------------------ Generate "export" button sub exportbutton { - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } + my $type = &Apache::loncommon::course_type(); return ''. ''. + &mt('Export '.$type.' to IMS').'" />'. &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs'); } sub exportcourse { my $r=shift; - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } + my $type = &Apache::loncommon::course_type(); my %discussiontime = &Apache::lonnet::dump('discussiontimes', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); my $numdisc = keys %discussiontime; @@ -317,7 +307,7 @@ sub exportcourse { open(OUTPUT, "zip -r $imszip * 2> /dev/null |"); close(OUTPUT); chdir $cwd; - $outcome .= &mt('Download the zip file from IMS [_2] archive
',$imszipfile,lc($type)); + $outcome .= &mt('Download the zip file from IMS '.lc($type).' archive
',$imszipfile,); if ($copyresult) { $outcome .= 'The following errors occurred during export - '.$copyresult; } @@ -331,7 +321,7 @@ sub exportcourse { } else { my $display; $display = ''."\n"; - $display .= &mt('Choose which items you wish to export from your [_1].

',$type); + $display .= &mt('Choose which items you wish to export from your '.$type.'.

'); $display .= ''. '
 Content items'. 'print($display.'
'. '

'. '

'. + &mt('Export '.$type.' DOCS').'" />

'. &Apache::loncommon::end_page()); } } @@ -966,12 +956,14 @@ sub breadcrumbs { my $folderpath; my $cpinfo=''; if ($env{'form.markedcopy_url'}) { - &Apache::lonnet::logthis('Found '.$env{'form.markedcopy_url'}); $cpinfo='&markedcopy_url='. &escape($env{'form.markedcopy_url'}). '&markedcopy_title='. &escape($env{'form.markedcopy_title'}); } + my $randompick=-1; + my $isencrypted=0; + my $ishidden=0; while (@folders) { my $folder=shift(@folders); my $foldername=shift(@folders); @@ -979,16 +971,25 @@ sub breadcrumbs { $folderpath.=$folder.'&'.$foldername; my $url='/adm/coursedocs?folderpath='. &escape($folderpath); + my $name=&unescape($foldername); +# randompick number, hidden, encrypted is appended with ":"s to the foldername + $name=~s/\:(\d*)\:(\w*)\:(\w*)$//; + if ($1 ne '') { + $randompick=$1; + } else { + $randompick=-1; + } + if ($2) { $ishidden=1; } + if ($3) { $isencrypted=1; } &Apache::lonhtmlcommon::add_breadcrumb( {'href'=>$url.$cpinfo, - 'title'=>&unescape($foldername), + 'title'=>$name, 'text'=>''. - &unescape($foldername).'' + $name.'' }); - - } - return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp'); + return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp', + 'LC_docs_path'),$randompick,$ishidden,$isencrypted); } sub editor { @@ -1013,7 +1014,8 @@ sub editor { $env{'form.markedcopy_title'}=$title; $env{'form.markedcopy_url'}=$url; } - $r->print(&breadcrumbs($folder)); + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted)=&breadcrumbs($folder); + $r->print($breadcrumbtrail); if ($fatal) { $r->print('

'.$errtext.'

'); } else { @@ -1173,6 +1175,11 @@ sub editor { $Apache::lonratedt::order[$idx]]= $comment.':'.join(':',@rrest); } +# Devalidate title cache + my $renamed_url=$rrest[0]; +# Has the :-escaping + $renamed_url=~s/\&colon\;/\:/g; + &Apache::lonnet::devalidate_title_cache($renamed_url); } # Store the changed version ($errtext,$fatal)=&storemap($coursenum,$coursedom, @@ -1185,6 +1192,7 @@ sub editor { # Group import/search if ($env{'form.importdetail'}) { my @imports; + &Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'}); foreach (split(/\&/,$env{'form.importdetail'})) { if (defined($_)) { my ($name,$url)=split(/\=/,$_); @@ -1227,6 +1235,16 @@ sub editor { # ---------------------------------------------------------------- Print screen my $idx=0; my $shown=0; + if (($ishidden) || ($isencrypted) || ($randompick>=0)) { + $r->print('

'.&mt('Parameters').':

'); + } + if ($randompick>=0) { + $r->print('

'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'

'); + } $r->print(''); foreach (@Apache::lonratedt::order) { my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]); @@ -1595,7 +1613,11 @@ END } elsif ($url=~m|^/ext/|) { $url='/adm/wrapper'.$url; } - $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); + if (&Apache::lonnet::symbverify($symb,$url)) { + $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); + } else { + $url=''; + } if ($container eq 'page') { my $symb=$env{'form.pagesymb'}; @@ -1608,7 +1630,14 @@ END my $foldername=&escape($foldertitle); my $folderpath=$env{'form.folderpath'}; if ($folderpath) { $folderpath.='&' }; - $folderpath.=$folderarg.'&'.$foldername; +# Append randompick number, hidden, and encrypted with ":" to foldername, +# so it gets transferred between levels + $folderpath.=$folderarg.'&'.$foldername.':'.(&Apache::lonratedt::getparameter($orderidx, + 'parameter_randompick'))[0] + .':'.((&Apache::lonratedt::getparameter($orderidx, + 'parameter_hiddenresource'))[0]=~/^yes$/i) + .':'.((&Apache::lonratedt::getparameter($orderidx, + 'parameter_encrypturl'))[0]=~/^yes$/i); $url.='folderpath='.&escape($folderpath).$cpinfo; $parameterset='"; + ""; if (($allowed) && ($folder!~/^supplemental/)) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', @@ -1780,10 +1810,7 @@ sub list_symbs { # sub verifycontent { my ($r) = @_; - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } + my $type = &Apache::loncommon::course_type(); my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents')); @@ -1795,7 +1822,7 @@ sub verifycontent { if ($hash{$_}=~/\.(page|sequence)$/) { if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) { $r->print('
'. - &mt('The following sequence or page is included more than once in your [_1]: ',$type). + &mt('The following sequence or page is included more than once in your '.$type.': '). &unescape($hash{$_}).'
'. &mt('Note that grading records for problems included in this sequence or folder will overlap.
')); } @@ -1820,10 +1847,7 @@ sub devalidateversioncache { sub checkversions { my ($r) = @_; - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } + my $type = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page("Check $type Document Versions")); my $header=''; my $startsel=''; @@ -1885,7 +1909,7 @@ sub checkversions { &changewarning($r,''); if ($env{'form.timerange'} eq 'all') { # show all documents - $header=&mt('All Documents in [_1]',$type); + $header=&mt('All Documents in '.$type); $allsel=1; foreach (keys %hash) { if ($_=~/^ids\_(\/res\/.+)$/) { @@ -2101,10 +2125,7 @@ sub changewarning { } $url='/adm/coursedocs?'.$pathvar.'='.$path; } - my $crstype = 'course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; - } + my $course_type = &Apache::loncommon::course_type(); if (!defined($message)) { $message='Changes will become active for your current session after [_1], or the next time you log in.'; } @@ -2115,7 +2136,7 @@ sub changewarning { '" />

'. &mt($message,' '). + &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />'). $help{'Caching'}.'

'."\n\n"); } @@ -2125,12 +2146,7 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; -# Identify type - Course or Group. - my $type = 'Course'; - if (defined($env{'course.'.$env{'request.course.id'}.'.type'})) { - $type = $env{'course.'.$env{'request.course.id'}.'.type'}; - } - + my $type = &Apache::loncommon::course_type(); # --------------------------------------------- Initialize help topics for this foreach ('Adding_Course_Doc','Main_Course_Documents', @@ -2199,7 +2215,7 @@ sub handler { $showdoc='/'.$1; } unless ($showdoc) { # got called from remote - if (($env{'form.folder'}=~/^default_/) || + if (($env{'form.folder'}=~/^(?:group|default)_/) || ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) { $forcestandard = 1; } @@ -2234,7 +2250,7 @@ sub handler { $script = ''; $r->print(&Apache::loncommon::start_page("$type Documents", $script, {'force_register' => $showdoc,}). - &Apache::loncommon::help_open_menu('','','','',273,'RAT')); + &Apache::loncommon::help_open_menu('','',273,'RAT')); my %allfiles = (); my %codebase = (); @@ -2330,6 +2346,7 @@ sub handler { 'upld' => 'Upload Document', 'srch' => 'Search', 'impo' => 'Import', + 'book' => 'Import Bookmarks', 'selm' => 'Select Map', 'load' => 'Load Map', 'reco' => 'Recover Deleted Resources', @@ -2366,7 +2383,7 @@ sub handler { if ($env{'form.folder'} eq '' || $env{'form.folder'} eq 'supplemental') { $folderpath='default&'. - &escape(&mt('Main [_1] Documents',$type)); + &escape(&mt('Main '.$type.' Documents')); } } unless ($env{'form.pagepath'}) { @@ -2399,7 +2416,7 @@ $exportbut ENDCOURSEVERIFY $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc', - &mt('Editing the Table of Contents for your [_1]',$type))); + &mt('Editing the Table of Contents for your '.$type))); } # --------------------------------------------------------- Standard documents $r->print('
$title".($url?"":'').$title. + ($url?'':' '.&mt('(re-initialize course to access)').'')."
'); @@ -2410,7 +2427,7 @@ ENDCOURSEVERIFY my $folder=$env{'form.folder'}; if ($folder eq '' || $folder eq 'supplemental') { $folder='default'; - $env{'form.folderpath'}='default&'.&escape(&mt('Main [_1] Documents',$type)); + $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents')); } my $postexec=''; if ($folder eq 'default') { @@ -2466,11 +2483,14 @@ $uploadtag $lt{'pubd'}
$uploadtag - + +
- + $help{'Importing_LON-CAPA_Resource'} +
+


$lt{'copm'}
@@ -2483,7 +2503,7 @@ $help{'Load_Map'}
- + ENDFORM unless ($env{'form.pagepath'}) { @@ -2641,7 +2661,7 @@ ENDBLOCK if ($folder =~ /^supplemental$/ && $env{'form.folderpath'} =~ /^default\&/) { $env{'form.folderpath'}='supplemental&'. - &escape(&mt('Supplemental [_1] Documents',$type)); + &escape(&mt('Supplemental '.$type.' Documents')); } &editor($r,$coursenum,$coursedom,$folder,$allowed); if ($allowed) { @@ -2746,7 +2766,7 @@ sub editing_js { function makenewfolder(targetform,folderseq) { var foldername=prompt('Name of New Folder','New Folder'); if (foldername) { - targetform.importdetail.value=foldername+"="+folderseq; + targetform.importdetail.value=escape(foldername)+"="+folderseq; targetform.submit(); } } @@ -2754,7 +2774,7 @@ function makenewfolder(targetform,folder function makenewpage(targetform,folderseq) { var pagename=prompt('Name of New Page','New Page'); if (pagename) { - targetform.importdetail.value=pagename+"="+folderseq; + targetform.importdetail.value=escape(pagename)+"="+folderseq; targetform.submit(); } } @@ -2768,7 +2788,7 @@ function makeexamupload() { var title=prompt('Listed Title for the Uploaded Score'); if (title) { this.document.forms.newexamupload.importdetail.value= - title+'=/res/lib/templates/examupload.problem'; + escape(title)+'=/res/lib/templates/examupload.problem'; this.document.forms.newexamupload.submit(); } } @@ -2777,7 +2797,7 @@ function makesmppage() { var title=prompt('Listed Title for the Page'); if (title) { this.document.forms.newsmppg.importdetail.value= - title+'=/adm/$udom/$uname/$now/smppg'; + escape(title)+'=/adm/$udom/$uname/$now/smppg'; this.document.forms.newsmppg.submit(); } } @@ -2786,7 +2806,7 @@ function makesmpproblem() { var title=prompt('Listed Title for the Problem'); if (title) { this.document.forms.newsmpproblem.importdetail.value= - title+'=/res/lib/templates/simpleproblem.problem'; + escape(title)+'=/res/lib/templates/simpleproblem.problem'; this.document.forms.newsmpproblem.submit(); } } @@ -2795,7 +2815,7 @@ function makedropbox() { var title=prompt('Listed Title for the Drop Box'); if (title) { this.document.forms.newdropbox.importdetail.value= - title+'=/res/lib/templates/DropBox.problem'; + escape(title)+'=/res/lib/templates/DropBox.problem'; this.document.forms.newdropbox.submit(); } } @@ -2804,26 +2824,26 @@ function makebulboard() { var title=prompt('Listed Title for the Bulletin Board'); if (title) { this.document.forms.newbul.importdetail.value= - title+'=/adm/$udom/$uname/$now/bulletinboard'; + escape(title)+'=/adm/$udom/$uname/$now/bulletinboard'; this.document.forms.newbul.submit(); } } function makeabout() { - var user=prompt("Enter user\@domain for User's 'About Me' Page"); + var user=prompt("Enter user:domain for User's 'About Me' Page"); if (user) { var comp=new Array(); - comp=user.split('\@'); + comp=user.split(':'); if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) { if ((comp[0]) && (comp[1])) { this.document.forms.newaboutsomeone.importdetail.value= - 'About '+user+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme'; + 'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme'; this.document.forms.newaboutsomeone.submit(); } else { - alert("Not a valid user\@domain"); + alert("Not a valid user:domain"); } } else { - alert("Please enter both user and domain in the format user\@domain"); + alert("Please enter both user and domain in the format user:domain"); } } }