--- loncom/interface/londocs.pm 2002/09/06 15:18:23 1.21 +++ loncom/interface/londocs.pm 2002/10/20 18:42:53 1.34 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.21 2002/09/06 15:18:23 www Exp $ +# $Id: londocs.pm,v 1.34 2002/10/20 18:42:53 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,15 +29,21 @@ package Apache::londocs; use strict; -use Apache::Constants qw(:common); +use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon; use Apache::lonratedt; use Apache::lonratsrv; use Apache::lonxml; +use GDBM_File; my $iconpath; +my %hash; + +my $hashtied; +my %alreadyseen=(); + # Mapread read maps into lonratedt::global arrays # @order and @resources, determines status # sets @order - pointer to resources in right order @@ -211,12 +217,99 @@ END $foldertitle; } if ($isfolder) { $url.='&foldername='.$foldertitle; } - $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="/adm/lonIcons/'. + $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'" target="cat_'.$folder. +'"><img src="/adm/lonIcons/'. $icon.'.gif" border="0"></a></td>'. - "<td bgcolor='#FFFFBB'><a href='$url'>$title</a></td></tr>"; + "<td bgcolor='#FFFFBB'><a href='$url' target='cat_$folder'>$title</a></td></tr>"; return $line; } +# ---------------------------------------------------------------- tie the hash + +sub tiehash { + $hashtied=0; + if ($ENV{'request.course.fn'}) { + if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db", + &GDBM_READER(),0640)) { + $hashtied=1; + } + } +} + +sub untiehash { + if ($hashtied) { untie %hash; } + $hashtied=0; +} + +# --------------------------------------------------------------- check on this + +sub checkonthis { + my ($r,$url,$level,$title)=@_; + $alreadyseen{$url}=1; + $r->rflush(); + if ($url) { + $r->print('<br />'); + for (my $i=0;$i<=$level*5;$i++) { + $r->print(' '); + } + $r->print('<a href="'.$url.'" target="cat">'. + ($title?$title:$url).'</a> '); + if ($url=~/^\/res\//) { + my $result=&Apache::lonnet::repcopy( + &Apache::lonnet::filelocation('',$url)); + if ($result==OK) { + $r->print('<font color="green">ok</font>'); + $r->rflush(); + &Apache::lonnet::countacc($url); + $url=~/\.(\w+)$/; + if (&Apache::loncommon::fileembstyle($1) eq 'ssi') { + $r->print('<br />'); + $r->rflush(); + my $default=''; + if ($1=~/(problem|exam|quiz|assess|survey|form|library)/) { + $default=&Apache::lonnet::getfile( + '/home/httpd/html/res/adm/includes/default_homework.lcpm'); + } + for (my $i=0;$i<=$level*5;$i++) { + $r->print(' '); + } + $r->print('- Rendering: '); + &Apache::lonxml::xmlparse($r,'web', + &Apache::lonnet::getfile( + &Apache::lonnet::filelocation('',$url)),$default); + if (($Apache::lonxml::errorcount) || + ($Apache::lonxml::warningcount)) { + if ($Apache::lonxml::errorcount) { + $r->print('<font color="red"><b>'. + $Apache::lonxml::errorcount.' error(s)</b></font> '); + } + if ($Apache::lonxml::warningcount) { + $r->print('<font color="blue">'. + $Apache::lonxml::warningcount.' warning(s)</font>'); + } + } else { + $r->print('<font color="green">ok</font>'); + } + $r->rflush(); + } + my $dependencies= + &Apache::lonnet::metadata($url,'dependencies'); + foreach (split(/\,/,$dependencies)) { + if (($_=~/^\/res\//) && (!$alreadyseen{$_})) { + &checkonthis($r,$_,$level+1); + } + } + } elsif ($result==HTTP_SERVICE_UNAVAILABLE) { + $r->print('<font color="red"><b>connection down</b></font>'); + } elsif ($result==HTTP_NOT_FOUND) { + $r->print('<font color="red"><b>not found</b></font>'); + } else { + $r->print('<font color="red"><b>access denied</b></font>'); + } + } + } +} + # ================================================================ Main Handler sub handler { my $r = shift; @@ -224,6 +317,116 @@ sub handler { $r->send_http_header; return OK if $r->header_only; + + if ($ENV{'form.verify'}) { + + my $loaderror=&Apache::lonnet::overloaderror($r); + if ($loaderror) { return $loaderror; } + + $r->print('<html><head><title>Verify Content</title></head>'. + &Apache::loncommon::bodytag('Verify Course Documents')); + $hashtied=0; + undef %alreadyseen; + %alreadyseen=(); + &tiehash(); + foreach (keys %hash) { + if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) { + &checkonthis($r,$hash{$_},0,$hash{'title_'.$1}); + } + } + &untiehash(); + } elsif ($ENV{'form.versions'}) { + $r->print('<html><head><title>Check Versions</title></head>'. + &Apache::loncommon::bodytag('Check Course Document Versions')); + $hashtied=0; + &tiehash(); + my %changes=&Apache::lonnet::dump + ('versionupdate',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, + $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + my $firstkey=(keys %changes)[0]; + unless ($firstkey=~/^error\:/) { + unless ($ENV{'form.timerange'}) { + $ENV{'form.timerange'}=604800; + } + my $seltext='during the last '.$ENV{'form.timerange'}.' seconds'; + my $startsel=''; + my $monthsel=''; + my $weeksel=''; + my $daysel=''; + if ($ENV{'form.timerange'}==-1) { + $seltext='since start of course'; + $startsel='selected'; + $ENV{'form.timerange'}=time; + } + my $starttime=time-$ENV{'form.timerange'}; + if ($ENV{'form.timerange'}==2592000) { + $seltext='during the last month ('.localtime($starttime).')'; + $monthsel='selected'; + } elsif ($ENV{'form.timerange'}==604800) { + $seltext='during the last week ('.localtime($starttime).')'; + $weeksel='selected'; + } elsif ($ENV{'form.timerange'}==86400) { + $seltext='since yesterday ('.localtime($starttime).')'; + $daysel='selected'; + } + + $r->print(<<ENDHEADERS); +<form action="/adm/coursedocs" method="post"> +<select name="timerange"> +<option value="-1" $startsel>Since Start of Course</option> +<option value="2592000" $monthsel>Last Month</option> +<option value="604800" $weeksel>Last Week</option> +<option value="86400" $daysel>Since Yesterday</option> +</select> +<input type="submit" name="versions" value="Display" /> +</form> +<h3>Content changed $seltext</h3> +<table border="2"> +<tr> +<th>File</th><th>Modification Date</th> +<th>Version</th><th>Differences</th></tr> +ENDHEADERS + foreach (keys %changes) { + if ($changes{$_}>$starttime) { + my ($root,$extension)=($_=~/^(.*)\.(\w+)$/); + my $currentversion=&Apache::lonnet::getversion($_); + my $linkurl=&Apache::lonnet::clutter($_); + $r->print( + '<tr><td><a href="'.$linkurl.'" target="cat">'.$linkurl. + '</a></td><td>'. + localtime($changes{$_}).'</td><td>'.$currentversion.'</td>'. + '<td>'); + my $lastold=1; + for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { + my $url=$root.'.'.$prevvers.'.'.$extension; + if (&Apache::lonnet::metadata($url,'lastrevisiondate')< + $starttime) { + $lastold=$prevvers; + } + } + for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) { + my $url=$root.'.'.$prevvers.'.'.$extension; + $r->print('<a href="'.&Apache::lonnet::clutter($url). + '">Version '.$prevvers.' ('. + localtime(&Apache::lonnet::metadata($url,'lastrevisiondate')). + ')</a>'); + if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') { + $r->print(' <a href="/adm/diff?filename='. + &Apache::lonnet::clutter($root.'.'.$extension). + '&versionone='.$prevvers. + '">Diffs</a>'); + } + $r->print('<br />'); + } + $r->print('</td></tr>'); + } + } + $r->print('</table>'); + } else { + $r->print('<p>No content modifications yet.</p>'); + } + &untiehash(); + } else { # is this a standard course? my $standard=($ENV{'request.course.uri'}=~/^\/uploaded\//); @@ -270,6 +473,8 @@ sub handler { $iconpath = $r->dir_config('lonIconsURL') . "/"; + my $now=time; + # print screen $r->print(<<ENDDOCUMENT); <html> @@ -295,6 +500,20 @@ function makenewext(targetname) { window.open('/adm/rat/extpickframe.html'); } +function makesmppage() { + var title=prompt('Listed Title for the Page'); + this.document.forms.newsmppg.importdetail.value= + title+'=/adm/$udom/$uname/$now/smppg'; + this.document.forms.newsmppg.submit(); +} + +function makebulboard() { + var title=prompt('Listed Title for the Bulletin Board'); + this.document.forms.newbul.importdetail.value= + title+'=/adm/$udom/$uname/$now/bulletinboard'; + this.document.forms.newbul.submit(); +} + function finishpick() { var title=this.document.forms.extimport.title.value; var url=this.document.forms.extimport.url.value; @@ -310,9 +529,18 @@ ENDNEWSCRIPT $r->print('</head>'. &Apache::loncommon::bodytag('Course Documents','',$events)); unless ($showdoc) { + if ($allowed) { + $r->print(<<ENDCOURSEVERIFY); +<form action="/adm/coursedocs" method="post" name="courseverify"> +<input type="submit" name="verify" value="Verify Content" /> +<input type="submit" name="versions" value="Check Resource Versions" /> +</form> +ENDCOURSEVERIFY + } # --------------------------------------------------------- Standard documents + $r->print('<table>'); if (($standard) && ($allowed) && (!$forcesupplement)) { - $r->print('<h2>Main Course Documents</h2>'); + $r->print('<tr><td bgcolor="#FFFFBB"><h2>Main Course Documents</h2>'); my $folder=$ENV{'form.folder'}; unless ($folder=~/^default/) { $folder='default'; } &editor($r,$coursenum,$coursedom,$folder,$allowed); @@ -376,6 +604,20 @@ value="Syllabus=/public/$coursedom/$cour value="Navigate Content=/adm/navmaps"> <input name="newnav" type="submit" value="Navigate Content" /> </form> +<form action="/adm/coursedocs" method="post" name="newsmppg"> +<input type="hidden" name="folder" value="$folder"> +<input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> +<input type=hidden name="importdetail" value=""> +<input name="newsmppg" type="button" value="Simple Page" +onClick="javascript:makesmppage();" /> +</form> +<form action="/adm/coursedocs" method="post" name="newbul"> +<input type="hidden" name="folder" value="$folder"> +<input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> +<input type=hidden name="importdetail" value=""> +<input name="newbulletin" type="button" value="Bulletin Board" +onClick="javascript:makebulboard();" /> +</form> <form action="/adm/coursedocs" method="post" name="newaboutme"> <input type="hidden" name="folder" value="$folder"> <input type="hidden" name="foldername" value="$ENV{'form.foldername'}"> @@ -386,11 +628,12 @@ value="$plainname=/adm/$udom/$uname/abou </td></tr> </table> ENDFORM - $r->print('<hr />'); + $r->print('</td></tr>'); } # ----------------------------------------------------- Supplemental documents if (!$forcestandard) { - $r->print('<h2>Supplemental Course Documents</h2>'); + $r->print( + '<tr><td bgcolor="#BBFFFF"><h2>Supplemental Course Documents</h2>'); my $folder=$ENV{'form.folder'}; unless ($folder=~/supplemental/) { $folder='supplemental'; } &editor($r,$coursenum,$coursedom,$folder,$allowed); @@ -458,20 +701,22 @@ value="$plainname=/adm/$udom/$uname/abou <input name="newaboutme" type="submit" value="My Personal Info" /> </form> </td></tr> -</table> +</table></td></tr> ENDSUPFORM } } if ($allowed) { $r->print('<form name="extimport"><input type="hidden" name="title"><input type="hidden" name="url"><input type="hidden" name="useform"></form>'); } + $r->print('</table>'); } else { # -------------------------------------------------------- This is showdoc mode $r->print("<h1>Uploaded Document</h1><p>It is recommended that you use an up-to-date virus scanner before handling this file.</p><p><table>". &entryline(0,"Click to download or use your browser's Save Link function",$showdoc).'</table></p>'); } - $r->print('</body></html>'); - return OK; + } + $r->print('</body></html>'); + return OK; } 1;