--- loncom/interface/londocs.pm 2002/10/11 18:06:32 1.26 +++ loncom/interface/londocs.pm 2002/10/18 13:47:57 1.32 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.26 2002/10/11 18:06:32 www Exp $ +# $Id: londocs.pm,v 1.32 2002/10/18 13:47:57 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 @@ -218,6 +224,60 @@ END 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(); + 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; @@ -225,6 +285,7 @@ sub handler { $r->send_http_header; return OK if $r->header_only; + if ($ENV{'form.verify'}) { my $loaderror=&Apache::lonnet::overloaderror($r); @@ -232,11 +293,100 @@ sub handler { $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><br />'); + } + $r->print('</td></tr>'); + } + } + $r->print('</table>'); + } else { + $r->print('<p>No content modifications yet.</p>'); + } + &untiehash(); } else { # is this a standard course?