version 1.52, 2013/07/27 22:04:49
|
version 1.57, 2018/05/02 17:08:40
|
Line 29
|
Line 29
|
package Apache::imsprocessor; |
package Apache::imsprocessor; |
|
|
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::loncommon; |
use Apache::loncleanup; |
use Apache::loncleanup; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use LWP::UserAgent; |
|
use HTTP::Request::Common; |
use HTTP::Request::Common; |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
|
use LONCAPA::LWPReq; |
use strict; |
use strict; |
|
|
sub ims_config { |
sub ims_config { |
Line 99 sub create_tempdir {
|
Line 100 sub create_tempdir {
|
my ($context,$pathinfo,$timenow) = @_; |
my ($context,$pathinfo,$timenow) = @_; |
my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); |
my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); |
my $tempdir; |
my $tempdir; |
|
$pathinfo = &Apache::loncommon::clean_path($pathinfo); |
|
# Collapse dots |
|
$pathinfo =~ s/\.+/./g; |
if ($context eq 'DOCS') { |
if ($context eq 'DOCS') { |
$tempdir = $$configvars{'lonDaemons'}.'/tmp/'.$pathinfo; |
$tempdir = $$configvars{'lonDaemons'}.'/tmp/'.$pathinfo; |
if (!-e "$tempdir") { |
if (!-e "$tempdir") { |
Line 130 sub uploadzip {
|
Line 134 sub uploadzip {
|
$fname=~s/\s+/\_/g; |
$fname=~s/\s+/\_/g; |
# Replace all other weird characters by nothing |
# Replace all other weird characters by nothing |
$fname=~s/[^\w\.\-]//g; |
$fname=~s/[^\w\.\-]//g; |
|
# Collapse dots |
|
$fname=~s/\.+/./g; |
# See if there is anything left |
# See if there is anything left |
unless ($fname) { return 'error: no uploaded file'; } |
unless ($fname) { return 'error: no uploaded file'; } |
# Save the file |
# Save the file |
chomp($env{'form.uploadname'}); |
chomp($env{'form.uploadname'}); |
open(my $fh,'>'.$tempdir.'/'.$fname); |
open(my $fh,'>',"$tempdir/$fname"); |
print $fh $env{'form.uploadname'}; |
print $fh $env{'form.uploadname'}; |
close($fh); |
close($fh); |
} elsif ($context eq 'CSTR') { |
} elsif ($context eq 'CSTR') { |
Line 334 sub parse_manifest {
|
Line 340 sub parse_manifest {
|
$$resources{$identifier}{file} = $attr->{href}; |
$$resources{$identifier}{file} = $attr->{href}; |
} else { |
} else { |
push(@{$$hrefs{$identifier}},$attr->{href}); |
push(@{$$hrefs{$identifier}},$attr->{href}); |
} |
} |
} |
} |
} elsif ($cms eq 'angel5') { |
} elsif ($cms eq 'angel5') { |
if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) { |
if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) { |
Line 371 sub parse_manifest {
|
Line 377 sub parse_manifest {
|
} |
} |
if ("@state" eq "manifest webct:ContentObject webct:Name") { |
if ("@state" eq "manifest webct:ContentObject webct:Name") { |
if ($cms eq 'webctvista4') { |
if ($cms eq 'webctvista4') { |
$$resources{$identifier}{title} = (split(/,/,$text))[-1]; |
if ($text =~ /,/) { |
|
$$resources{$identifier}{title} = (split(/,/,$text))[-1]; |
|
} else { |
|
$$resources{$identifier}{title} = $text; |
|
} |
} |
} |
} |
} |
}, "dtext"], |
}, "dtext"], |
Line 383 sub parse_manifest {
|
Line 393 sub parse_manifest {
|
); |
); |
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
foreach my $itm (keys %contents) { |
foreach my $itm (keys(%contents)) { |
@{$$items{$itm}{contents}} = @{$contents{$itm}}; |
@{$$items{$itm}{contents}} = @{$contents{$itm}}; |
} |
} |
} |
} |
Line 434 sub target_resources {
|
Line 444 sub target_resources {
|
sub copy_resources { |
sub copy_resources { |
my ($context,$cms,$hrefs,$resources,$tempdir,$targets,$url,$crs,$cdom,$destdir,$timenow,$assessmentfiles,$total) = @_; |
my ($context,$cms,$hrefs,$resources,$tempdir,$targets,$url,$crs,$cdom,$destdir,$timenow,$assessmentfiles,$total) = @_; |
if ($context eq 'DOCS') { |
if ($context eq 'DOCS') { |
foreach my $key (sort keys %{$hrefs}) { |
foreach my $key (sort(keys(%{$hrefs}))) { |
if (grep/^$key$/,@{$targets}) { |
if (grep/^$key$/,@{$targets}) { |
%{$$url{$key}} = (); |
%{$$url{$key}} = (); |
foreach my $file (@{$$hrefs{$key}}) { |
foreach my $file (@{$$hrefs{$key}}) { |
Line 563 sub copy_resources {
|
Line 573 sub copy_resources {
|
if (ref($$resources{$$resources{$key}{usedby}}{imagetitle}) eq 'ARRAY') { |
if (ref($$resources{$$resources{$key}{usedby}}{imagetitle}) eq 'ARRAY') { |
$imgtitle = $$resources{$$resources{$key}{usedby}}{imagetitle}[$i]; |
$imgtitle = $$resources{$$resources{$key}{usedby}}{imagetitle}[$i]; |
} |
} |
if (($img =~ /^\Q$filestem\E/i) && ($imgtitle =~ /\Q$extension\E/i)) { |
if ($imgtitle =~ /\Q$extension\E/i) { |
$copyfile = $img.'_'.$imgtitle; |
$copyfile = $imgtitle; |
last; |
last; |
} elsif ($img =~ /^\Q$filestem\E/i) { |
} elsif ($img =~ /^\Q$filestem\E/i) { |
$copyfile = $img.'.'.$extension; |
$copyfile = $img.'.'.$extension; |
Line 613 sub process_resinfo {
|
Line 623 sub process_resinfo {
|
} |
} |
if ($cms eq 'angel5') { |
if ($cms eq 'angel5') { |
my $currboard = ''; |
my $currboard = ''; |
foreach my $key (sort keys %{$resources}) { |
foreach my $key (sort(keys(%{$resources}))) { |
if (grep/^$key$/,@{$targets}) { |
if (grep/^$key$/,@{$targets}) { |
if ($$resources{$key}{type} eq "BOARD") { |
if ($$resources{$key}{type} eq "BOARD") { |
push @{$boards}, $key; |
push @{$boards}, $key; |
Line 642 sub process_resinfo {
|
Line 652 sub process_resinfo {
|
} |
} |
} |
} |
} elsif ($cms eq 'bb5' || $cms eq 'bb6') { |
} elsif ($cms eq 'bb5' || $cms eq 'bb6') { |
foreach my $key (sort keys %{$resources}) { |
foreach my $key (sort(keys(%{$resources}))) { |
if (grep/^$key$/,@{$targets}) { |
if (grep/^$key$/,@{$targets}) { |
if ($$resources{$key}{type} eq "resource/x-bb-document") { |
if ($$resources{$key}{type} eq "resource/x-bb-document") { |
unless ($$items{$$resources{$key}{revitm}}{filepath} eq 'Top') { |
unless ($$items{$$resources{$key}{revitm}}{filepath} eq 'Top') { |
Line 710 sub process_resinfo {
|
Line 720 sub process_resinfo {
|
$$items{'Top'}{'contentscount'} ++; |
$$items{'Top'}{'contentscount'} ++; |
} |
} |
} elsif ($cms eq 'webctce4') { |
} elsif ($cms eq 'webctce4') { |
foreach my $key (sort keys %{$resources}) { |
foreach my $key (sort(keys(%{$resources}))) { |
if (grep/^$key$/,@{$targets}) { |
if (grep/^$key$/,@{$targets}) { |
if ($$resources{$key}{type} eq "webcontent") { |
if ($$resources{$key}{type} eq "webcontent") { |
%{$$resinfo{$key}} = (); |
%{$$resinfo{$key}} = (); |
Line 725 sub process_resinfo {
|
Line 735 sub process_resinfo {
|
} |
} |
} |
} |
} elsif ($cms eq 'webctvista4') { |
} elsif ($cms eq 'webctvista4') { |
foreach my $key (sort keys %{$resources}) { |
foreach my $key (sort(keys(%{$resources}))) { |
if (grep/^$key$/,@{$targets}) { |
if (grep/^$key$/,@{$targets}) { |
%{$$resinfo{$key}} = (); |
%{$$resinfo{$key}} = (); |
if ($$resources{$key}{type} eq 'webct.question') { |
if ($$resources{$key}{type} eq 'webct.question') { |
Line 812 sub build_structure {
|
Line 822 sub build_structure {
|
$srcstem = "/res/$udom/$uname/$newdir"; |
$srcstem = "/res/$udom/$uname/$newdir"; |
} |
} |
|
|
foreach my $key (sort keys %{$items}) { |
foreach my $key (sort(keys(%{$items}))) { |
if ($$includeditems{$key}) { |
if ($$includeditems{$key}) { |
%{$flag{$key}} = ( |
%{$flag{$key}} = ( |
page => 0, |
page => 0, |
Line 1030 sub build_structure {
|
Line 1040 sub build_structure {
|
$filestem = "/res/$udom/$uname/$newdir"; |
$filestem = "/res/$udom/$uname/$newdir"; |
} |
} |
|
|
foreach my $key (sort keys %pagecontents) { |
foreach my $key (sort(keys(%pagecontents))) { |
for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { |
for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { |
my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; |
my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; |
my $resource = "$filestem/resfiles/$$items{$pagecontents{$key}[$i][0]}{resnum}.html"; |
my $resource = "$filestem/resfiles/$$items{$pagecontents{$key}[$i][0]}{resnum}.html"; |
Line 1346 sub process_user {
|
Line 1356 sub process_user {
|
my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); |
my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); |
my $xmlstem = $$configvars{'lonDaemons'}."/tmp/".$user_cdom."_".$user_crs."_"; |
my $xmlstem = $$configvars{'lonDaemons'}."/tmp/".$user_cdom."_".$user_crs."_"; |
|
|
foreach my $user_id (keys %{$settings}) { |
foreach my $user_id (keys(%{$settings})) { |
if ($$settings{$user_id}{user_role} eq "s") { |
if ($$settings{$user_id}{user_role} eq "s") { |
|
|
} elsif ($user_handling eq 'enrollall') { |
} elsif ($user_handling eq 'enrollall') { |
Line 1866 sub addposting {
|
Line 1876 sub addposting {
|
&Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs); |
&Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs); |
} |
} |
my %record=&Apache::lonnet::restore('_discussion'); |
my %record=&Apache::lonnet::restore('_discussion'); |
my ($temp)=keys %record; |
my ($temp)=keys(%record); |
unless ($temp=~/^error\:/) { |
unless ($temp=~/^error\:/) { |
my %newrecord=(); |
my %newrecord=(); |
$newrecord{'resource'}=$symb; |
$newrecord{'resource'}=$symb; |
Line 2408 sub parse_webctvista4_question {
|
Line 2418 sub parse_webctvista4_question {
|
@{$$settings{$id}{numids}} = (); |
@{$$settings{$id}{numids}} = (); |
%{$$allanswers{$id}} = (); |
%{$$allanswers{$id}} = (); |
$$settings{$id}{title} = $attr->{title}; |
$$settings{$id}{title} = $attr->{title}; |
|
$$settings{$id}{title} =~ s/\%/pct_/g; |
} |
} |
if ("@state" eq "questestinterop item presentation flow material mat_extension webct:calculated webct:var") { |
if ("@state" eq "questestinterop item presentation flow material mat_extension webct:calculated webct:var") { |
$currvar = $attr->{'webct:name'}; |
$currvar = $attr->{'webct:name'}; |
Line 2642 sub parse_webctvista4_question {
|
Line 2653 sub parse_webctvista4_question {
|
text_h => |
text_h => |
[sub { |
[sub { |
my ($text) = @_; |
my ($text) = @_; |
|
$text =~ s/\s*\&\s*/_and_/g; |
if ($currtexttype eq '/text/html') { |
if ($currtexttype eq '/text/html') { |
$text =~ s#(<img\ssrc=")([^"]+)">#$1../resfiles/$2#g; |
$text =~ s#(<img\ssrc=")([^"]+)">#$1../resfiles/$2#g; |
} |
} |
if ("@state" eq "questestinterop item presentation flow material matimage") { |
if ("@state" eq "questestinterop item presentation flow material matimage") { |
my $imagetitle = (split(/,/,$text))[-1]; |
my $imagetitle; |
|
if ($text =~ /,/) { |
|
$imagetitle = (split(/,/,$text))[-1]; |
|
} else { |
|
$imagetitle = $text; |
|
} |
$$settings{$id}{imagetitle} = $imagetitle; |
$$settings{$id}{imagetitle} = $imagetitle; |
push(@{$$resources{$res}{imagetitle}},$imagetitle); |
push(@{$$resources{$res}{imagetitle}},$imagetitle); |
} |
} |
Line 3252 sub parse_webct4_questionDB {
|
Line 3269 sub parse_webct4_questionDB {
|
$p->parse_file($xmlfile); |
$p->parse_file($xmlfile); |
$p->eof; |
$p->eof; |
my $boxcount; |
my $boxcount; |
foreach my $id (keys %{$settings}) { |
foreach my $id (keys(%{$settings})) { |
if ($$settings{$id}{class} eq 'string') { |
if ($$settings{$id}{class} eq 'string') { |
$boxcount = 0; |
$boxcount = 0; |
if (@{$$settings{$id}{boxes}} > 1) { |
if (@{$$settings{$id}{boxes}} > 1) { |
Line 3329 sub process_assessment {
|
Line 3346 sub process_assessment {
|
} |
} |
} elsif ($cms eq 'webctvista4') { |
} elsif ($cms eq 'webctvista4') { |
unless($$dbparse) { |
unless($$dbparse) { |
foreach my $res (sort keys %{$allquestions}) { |
foreach my $res (sort(keys(%{$allquestions}))) { |
my $parent = $$allquestions{$res}; |
my $parent = $$allquestions{$res}; |
&parse_webctvista4_question($res,$docroot,$resources,$hrefs,$qzdbsettings,\@allquestids,\%allanswers,\%allchoices,$parent,$catinfo); |
&parse_webctvista4_question($res,$docroot,$resources,$hrefs,$qzdbsettings,\@allquestids,\%allanswers,\%allchoices,$parent,$catinfo); |
} |
} |
Line 3378 sub build_category_sequences {
|
Line 3395 sub build_category_sequences {
|
if (!-e "$destdir/sequences") { |
if (!-e "$destdir/sequences") { |
mkdir("$destdir/sequences",0755); |
mkdir("$destdir/sequences",0755); |
} |
} |
my $numcats = scalar(keys %{$catinfo}); |
my $numcats = scalar(keys(%{$catinfo})); |
my $curr_id = 0; |
my $curr_id = 0; |
my $next_id = 1; |
my $next_id = 1; |
my $fh; |
my $fh; |
open($fh,">$destdir/sequences/question_database.sequence"); |
open($fh,">$destdir/sequences/question_database.sequence"); |
push @{$sequencesfiles},'question_database.sequence'; |
push @{$sequencesfiles},'question_database.sequence'; |
foreach my $category (sort keys %{$catinfo}) { |
foreach my $category (sort(keys(%{$catinfo}))) { |
my $seqname; |
my $seqname; |
if ($cms eq 'webctce4') { |
if ($cms eq 'webctce4') { |
$seqname = $$catinfo{$category}{title}.'_'.$category; |
$seqname = $$catinfo{$category}{title}.'_'.$category; |
Line 3474 sub build_problem_container {
|
Line 3491 sub build_problem_container {
|
$probtitle{$id} =~ s/\s+/_/g; |
$probtitle{$id} =~ s/\s+/_/g; |
$probtitle{$id} =~ s/:/_/g; |
$probtitle{$id} =~ s/:/_/g; |
$probtitle{$id} =~ s/\//_/g; |
$probtitle{$id} =~ s/\//_/g; |
$probtitle{$id} .= '_'.$id; |
if ($cms eq 'webctce4') { |
|
$probtitle{$id} .= '_'.$id; |
|
} |
} |
} |
if (($cms eq 'webctce4' && $container ne 'database') || |
if (($cms eq 'webctce4' && $container ne 'database') || |
($cms eq 'webctvista4')) { |
($cms eq 'webctvista4')) { |
Line 3949 sub write_webct4_questions {
|
Line 3968 sub write_webct4_questions {
|
} |
} |
if ($$settings{$id}{class} eq 'numerical') { |
if ($$settings{$id}{class} eq 'numerical') { |
foreach my $numid (@{$$settings{$id}{numids}}) { |
foreach my $numid (@{$$settings{$id}{numids}}) { |
foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) { |
foreach my $var (keys(%{$$settings{$id}{$numid}{vars}})) { |
if ($cms eq 'webctce4') { |
if ($cms eq 'webctce4') { |
$$settings{$id}{text} =~ s/{($var)}/\$$1 /g; |
$$settings{$id}{text} =~ s/{($var)}/\$$1 /g; |
} elsif ($cms eq 'webctvista4') { |
} elsif ($cms eq 'webctvista4') { |
Line 3996 sub write_webct4_questions {
|
Line 4015 sub write_webct4_questions {
|
if (($cms eq 'webctvista4') && (defined($$settings{$id}{image}))) { |
if (($cms eq 'webctvista4') && (defined($$settings{$id}{image}))) { |
my $imgsrc = '../../resfiles/'.$$settings{$id}{image}; |
my $imgsrc = '../../resfiles/'.$$settings{$id}{image}; |
if (defined($$settings{$id}{imagetitle})) { |
if (defined($$settings{$id}{imagetitle})) { |
$imgsrc .= '_'.$$settings{$id}{imagetitle}; |
$imgsrc = '../../resfiles/'.$$settings{$id}{imagetitle}; |
} |
} |
$questionimage = qq|<p><img src="$imgsrc" /></p>|; |
$questionimage = qq|<p><img src="$imgsrc" /></p>|; |
} |
} |
Line 4436 $$settings{$id}{$list}{jumbledtext}[$k]
|
Line 4455 $$settings{$id}{$list}{jumbledtext}[$k]
|
|; |
|; |
foreach my $numid (@{$$settings{$id}{numids}}) { |
foreach my $numid (@{$$settings{$id}{numids}}) { |
my $formula = $$settings{$id}{$numid}{formula}; |
my $formula = $$settings{$id}{$numid}{formula}; |
my $pattern = join('|',(sort (keys (%mathfns)))); |
my $pattern = join('|',(sort(keys(%mathfns)))); |
$formula =~ s/($pattern)/\&$mathfns{$1}/g; |
$formula =~ s/($pattern)/\&$mathfns{$1}/g; |
foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) { |
foreach my $var (keys(%{$$settings{$id}{$numid}{vars}})) { |
my $decnum = $$settings{$id}{$numid}{vars}{$var}{dec}; |
my $decnum = $$settings{$id}{$numid}{vars}{$var}{dec}; |
my $increment = '0.'; |
my $increment = '0.'; |
if ($decnum == 0) { |
if ($decnum == 0) { |
Line 4530 $$settings{$id}{$list}{jumbledtext}[$k]
|
Line 4549 $$settings{$id}{$list}{jumbledtext}[$k]
|
$title =~ s/\s/_/g; |
$title =~ s/\s/_/g; |
$title =~ s/:/_/g; |
$title =~ s/:/_/g; |
$title =~ s/\//_/g; |
$title =~ s/\//_/g; |
$title .= '_'.$id; |
|
open(PROB,">$destdir/problems/$probdir/$title.problem"); |
open(PROB,">$destdir/problems/$probdir/$title.problem"); |
print PROB $output; |
print PROB $output; |
close PROB; |
close PROB; |
Line 4945 sub retrieve_image {
|
Line 4963 sub retrieve_image {
|
my ($context,$res,$dirname,$cdom,$cname,$docroot,$destdir,$urlpath,$filename) = @_; |
my ($context,$res,$dirname,$cdom,$cname,$docroot,$destdir,$urlpath,$filename) = @_; |
my $contents; |
my $contents; |
my $url = $urlpath.$filename; |
my $url = $urlpath.$filename; |
my $ua=new LWP::UserAgent; |
my $lonhost = $Apache::lonnet::perlvar{'lonHostID'}; |
my $request=new HTTP::Request('GET',$url); |
my $request=new HTTP::Request('GET',$url); |
my $response=$ua->request($request); |
my $response=&LONCAPA::LWPReq::makerequest($lonhost,$request); |
if ($response->is_success) { |
if ($response->is_success) { |
$contents = $response->content; |
$contents = $response->content; |
if (!-e "$docroot/$res") { |
if (!-e "$docroot/$res") { |
Line 5209 sub process_content {
|
Line 5227 sub process_content {
|
if ($$settings{newwindow} eq "true") { |
if ($$settings{newwindow} eq "true") { |
$linktag .= qq| target="$res$filecount"|; |
$linktag .= qq| target="$res$filecount"|; |
} |
} |
foreach my $entry (keys %{$$settings{files}[$filecount]{registry}}) { |
foreach my $entry (keys(%{$$settings{files}[$filecount]{registry}})) { |
$linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|; |
$linktag .= qq| $entry="$$settings{files}[$filecount]{registry}{$entry}"|; |
} |
} |
$linktag .= qq|>$$settings{files}[$filecount]{linkname}</a><br/>\n|; |
$linktag .= qq|>$$settings{files}[$filecount]{linkname}</a><br/>\n|; |