--- loncom/imspackages/imsimport.pm 2004/02/10 23:36:32 1.1 +++ loncom/imspackages/imsimport.pm 2004/02/24 15:21:16 1.3 @@ -32,11 +32,28 @@ sub calculate_page($$) { # ---------------------------------------------------------------- Jscript Zero sub jscript_zero { - my ($fullpath,$jsref) = @_; + my ($fullpath,$jsref,$uname,$dom) = @_; my $source = ''; if (exists($ENV{'form.go'}) ) { $source = $ENV{'form.go'}; } + my %crsentry = (); + my $course_list; + my $title_list; + my @crslist = (); + @crslist = &get_ccroles($uname,$dom,\%crsentry); + if (@crslist > 0) { + $crsentry{$crslist[0]} =~ s/("|,)//g; + $title_list = '"'.$crsentry{$crslist[0]}.'"'; + if (@crslist > 1) { + for (my $i=1; $i<@crslist; $i++) { + $crsentry{$crslist[$i]} =~ s/("|,)//g; + $title_list .= ',"'.$crsentry{$crslist[$i]}.'"'; + } + } + } + $course_list = '"'.join('","',@crslist).'"'; + $$jsref = <<"END_OF_ONE"; function verify() { if ((document.forms.dataForm.newdir.value == '') || (!document.forms.dataForm.newdir.value)) { @@ -46,10 +63,10 @@ function verify() { if (document.forms.dataForm.source.selectedIndex == 0) { alert("You must choose the Course Management System from which the IMS package was exported"); return false - } + } return true } - + function nextPage() { if (verify()) { document.forms.dataForm.go.value="NextPage" @@ -80,16 +97,45 @@ function createWin() { newWindow.document.close() newWindow.focus() } + +function setCourse(caller) { + courseID_array = new Array($course_list) + courseTitle_array = new Array($title_list) + var step1Form = document.forms.dataForm + var curVal = step1Form.elements[caller*2+3].options[step1Form.elements[caller*2+3].selectedIndex].value + step1Form.elements[caller*2+4].length = 0 + if (step1Form.elements[caller*2+3].options[step1Form.elements[caller*2+3].selectedIndex].value == "-1") { + step1Form.elements[caller*2+4].options[0] = new Option("<--- Set type ","-1",true,true) + } + else { + if ((step1Form.elements[caller*2+3].selectedIndex == 2 ) || (step1Form.elements[caller*2+3].selectedIndex == 3)) { + step1Form.elements[caller*2+4].options[0] = new Option("Please Select","-1",true,true) + if (courseID_array.length > 0) { + step1Form.elements[caller*2+4].options[0] = new Option("Please Select","-1",true,true) + for (var i=0; iprint(<<"END_OF_ONE"); -

Step 1: Selection of IMS package type and destination directory for the package contents 

@@ -100,57 +146,58 @@ sub display_zero { - - - - - - - - - + + + - + Create a directory where you will unpack your IMS package.   - + + + + + + + @@ -158,14 +205,71 @@ Please choose a destination LON-CAPA dir - + - + - +
  +      - Specify the Course Management system used to create the package. -
 
  - -Please choose the CMS used to create your IMS content package. + Specify the Course Management system used to create the package.   +
 
  +Please choose the CMS used to create your IMS content package.   +
 
 
  +    - Create a directory where you will unpack your IMS package. -
 
  -Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file +Please choose a destination LON-CAPA directory in which to store the contents of the IMS package file. +
 

+    + Indicate how any discussion boards and user data in the package should be handled
  + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + +
Type of dataActionTarget course
  Discussion boards     + +    +    + +    +
  User information     + +    +    + + +    +
+
+
+
  

 If you have created a destination directory you should use the "Next Page" button to complete the process of unpacking your IMS package.If you have created a destination directory, and have made your selections for the disposition of bulletin boards and user information, you should click the 'Convert' button to unpack your IMS package.
@@ -183,10 +287,11 @@ Please choose a destination LON-CAPA dir -
  + + - +
@@ -200,10 +305,9 @@ Please choose a destination LON-CAPA dir END_OF_ONE } -# ---------------------------------------------------------------- Display One - +# ---------------------------------------------------------------- Expand bb5 sub expand_bb5 { - my ($r,$uname,$udom,$fn,$page) = @_; + my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling) = @_; my @state = (); my @seq = "Top"; my $lastitem; @@ -221,6 +325,14 @@ sub expand_bb5 { my %resinfo = (); my $numfolders = 0; my $numpages = 0; + my @timestamp = (); + my @boards = (); + my @groups = (); + my $board_count = 0; + my $board_id = time; + my $totseq = 0; + my $totpage = 0; + my $totprob = 0; my $docroot = $ENV{'form.newdir'}; if (!-e "$docroot/temp") { mkdir "$docroot/temp"; @@ -232,15 +344,14 @@ sub expand_bb5 { my $dirname = "/res/$udom/$uname/$newdir"; my $zipfile = '/home/'.$uname.'/public_html'.$fn; if ($fn =~ m|\.zip$|i) { - open(OUTPUT, "unzip -o $zipfile -d $docroot/temp 2> /dev/null |"); - while () { - print "$_
"; - } - close(OUTPUT); + open(OUTPUT, "unzip -o $zipfile -d $docroot/temp 2> /dev/null |"); + while () { + print "$_
"; + } + close(OUTPUT); } my $xmlfile = $docroot.'/temp/imsmanifest.xml'; -# print STDERR "XML file is $xmlfile\n"; my $p = HTML::Parser->new ( xml_mode => 1, @@ -252,57 +363,57 @@ sub expand_bb5 { my $start = $num; my $statestr = ''; foreach (@state) { - $statestr .= "$_ "; + $statestr .= "$_ "; } if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "tableofcontents") ) { - my $searchstr = "manifest organizations tableofcontents"; - while ($num > 0) { - $searchstr .= " item"; - $num --; - } - if (("@state" eq $searchstr) && (@state > 3)) { - my $itm = $attr->{identifier}; - $resnum{$itm} = $attr->{identifierref}; - $title{$itm} = $attr->{title}; - if ($start > @seq) { - unless ($lastitem eq '') { - push @seq, $lastitem; - unless ( defined($contents{$seq[-1]}) ) { - @{$contents{$seq[-1]}} = (); + my $searchstr = "manifest organizations tableofcontents"; + while ($num > 0) { + $searchstr .= " item"; + $num --; + } + if (("@state" eq $searchstr) && (@state > 3)) { + my $itm = $attr->{identifier}; + $resnum{$itm} = $attr->{identifierref}; + $title{$itm} = $attr->{title}; + if ($start > @seq) { + unless ($lastitem eq '') { + push @seq, $lastitem; + unless ( defined($contents{$seq[-1]}) ) { + @{$contents{$seq[-1]}} = (); + } + push @{$contents{$seq[-1]}},$itm; + $parentseq{$itm} = $seq[-1]; } - push @{$contents{$seq[-1]}},$itm; - $parentseq{$itm} = $seq[-1]; } + elsif ($start < @seq) { + my $diff = @seq - $start; + while ($diff > 0) { + pop @seq; + $diff --; + } + if (@seq) { + push @{$contents{$seq[-1]}}, $itm; + } + } else { + push @{$contents{$seq[-1]}}, $itm; + } + my $path; + if (@seq > 1) { + $path = join(',',@seq); + } elsif (@seq > 0) { + $path = $seq[0]; + } + $filepath{$itm} = $path; + $contentscount{$seq[-1]} ++; + $lastitem = $itm; } - elsif ($start < @seq) { - my $diff = @seq - $start; - while ($diff > 0) { - pop @seq; - $diff --; - } - if (@seq) { - push @{$contents{$seq[-1]}}, $itm; - } - } else { - push @{$contents{$seq[-1]}}, $itm; - } - my $path; - if (@seq > 1) { - $path = join(',',@seq); - } elsif (@seq > 0) { - $path = $seq[0]; - } - $filepath{$itm} = $path; - $contentscount{$seq[-1]} ++; - $lastitem = $itm; - } } elsif ("@state" eq "manifest resources resource" ) { $identifier = $attr->{identifier}; $base{$identifier} = $attr->{baseurl}; $file{$identifier} = $attr->{file}; $type{$identifier} = $attr->{type}; } elsif ("@state" eq "manifest resources resource file") { - push@{$href{$identifier}},$attr->{href}; + push @{$href{$identifier}},$attr->{href}; } }, "tagname, attr"], text_h => @@ -321,7 +432,6 @@ sub expand_bb5 { my $topnum = 0; my $destdir = $docroot; -# print STDERR "Destdir is $destdir\n"; if (!-e "$destdir") { mkdir("$destdir",0755); } @@ -337,9 +447,6 @@ sub expand_bb5 { if (!-e "$destdir/problems") { mkdir("$destdir/problems",0755); } - open(FILE,">$destdir/sequences/ims_import.sequence"); - print FILE "\n"; - foreach my $key (sort keys %href) { foreach my $file (@{$href{$key}}) { my $filepath = $file; @@ -362,31 +469,42 @@ sub expand_bb5 { &process_content($key,$docroot,$destdir,\%{$resinfo{$key}},$udom,$uname); } elsif ($type{$key} eq "resource/x-bb-staffinfo") { %{$resinfo{$key}} = (); - &process_staff($key,$docroot,$destdir,\%{$resinfo{$key}}); + &process_staff($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); } elsif ($type{$key} eq "resource/x-bb-externallink") { %{$resinfo{$key}} = (); - &process_link($key,$docroot,$destdir,\%{$resinfo{$key}}); + &process_link($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); } elsif ($type{$key} eq "resource/x-bb-discussionboard") { %{$resinfo{$key}} = (); - &process_db($key,$docroot,$destdir,\%{$resinfo{$key}}); + unless ($bb_handling eq 'ignore') { + $contentscount{Top} ++; + push @boards, $key; + $timestamp[$board_count] = $board_id; + &process_db($key,$docroot,$destdir,$board_id,$bb_crs,$bb_cdom,$bb_handling,$uname,\%{$resinfo{$key}}); + $board_id ++; + $board_count ++; + } } elsif ($type{$key} eq "resource/x-bb-announcement") { %{$resinfo{$key}} = (); &process_announce($key,$docroot,$destdir,\%{$resinfo{$key}}); } elsif ($type{$key} eq "assessment/x-bb-pool") { %{$resinfo{$key}} = (); - &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}}); + &process_assessment($key,$docroot,'pool',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob); } elsif ($type{$key} eq "assessment/x-bb-quiz") { %{$resinfo{$key}} = (); - &process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}}); + &process_assessment($key,$docroot,'quiz',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob); } elsif ($type{$key} eq "assessment/x-bb-survey") { %{$resinfo{$key}} = (); - &process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}}); + &process_assessment($key,$docroot,'survey',$dirname,$destdir,\%{$resinfo{$key}},\$totpage,\$totprob); } elsif ($type{$key} eq "assessment/x-bb-group") { %{$resinfo{$key}} = (); + $contentscount{Top} ++; + push @groups, $key; &process_group($key,$docroot,$destdir,\%{$resinfo{$key}}); } elsif ($type{$key} eq "resource/x-bb-user") { %{$resinfo{$key}} = (); - &process_user($key,$docroot,$destdir,\%{$resinfo{$key}}); + unless ($users_handling eq 'ignore') { + &process_user($key,$docroot,$destdir,\%{$resinfo{$key}},$users_crs,$users_cdom,$users_handling); + } } } @@ -405,7 +523,6 @@ sub expand_bb5 { my %seqcount = (); foreach my $key (sort keys %resnum) { -# print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n"; $pageflag{$key} = 0; $seqflag{$key} = 0; $seqcount{$key} = 0; @@ -453,7 +570,6 @@ sub expand_bb5 { $areacount = 0; } else { if ($filepath{$key} eq "Top,$areakey") { -# print STDERR "$key $filepath{$key} $resnum{$key} $title{$key}\n"; my $src = ''; if ($areacount == 0) { if ($resinfo{$resnum{$key}}{'isfolder'} eq "true") { @@ -512,16 +628,9 @@ sub expand_bb5 { my $next_id = 1; my $curr_id = 0; if ( (($type{$resnum{$key}} eq "resource/x-bb-document") || ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") || ($type{$resnum{$key}} eq "resource/x-bb-externallink")) && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) { -# if ( ($type{$resnum{$key}} eq "resource/x-bb-staffinfo") && ($resinfo{$resnum{$key}}{'isfolder'} eq "true") ) { -# print "$key $filepath{$key} $resnum{$key} $title{$key}\n"; -# print "Folder for item - $key - res - $resnum{$key}\n"; -# print "$key, $contentscount{$key}\n"; -# foreach (@{$contents{$key}}) { -# print "$key, $_\n"; -# } -# print STDERR "Contents Count for $key is $contentscount{$key}\n"; open(LOCFILE,">$destdir/sequences/$key.sequence"); print LOCFILE "\n"; + $totseq ++; if ($contentscount{$key} == 0) { print LOCFILE qq| @@ -603,7 +712,6 @@ sub expand_bb5 { } else { print LOCFILE qq| type="finish">\n|; } - print STDERR "seqcount is $seqcount{$key}, pagecount is $pagecount{$key} for $key\n"; } else { $curr_id ++; $next_id ++; @@ -618,12 +726,54 @@ sub expand_bb5 { } } } + if (@boards > 0) { + $topnum ++; + print TOPFILE qq| +\n|; + if ($topnum == $contentscount{'Top'}) { + print TOPFILE qq|\n|; + } + } else { + if ($topnum == $contentscount{'Top'}) { + print TOPFILE qq| type="finish">\n|; + } else { + print TOPFILE qq|> +\n|; + } + } + open(BOARD,">$destdir/sequences/bulletinboards.sequence"); + print BOARD qq| + +|; + if (@boards == 1) { + print BOARD qq| +\n|; + } else { + for (my $i=1; $i<@boards; $i++) { + print BOARD qq|\n|; + } else { + print BOARD qq|> +\n|; + } + } + } + print BOARD qq||; + close(BOARD); + } print TOPFILE ""; close(TOPFILE); foreach my $key (sort keys %pagecontents) { for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { my $filestem = "/res/$udom/$uname/$newdir"; my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; + $totpage ++; open(PAGEFILE,">$filename"); print PAGEFILE qq| @@ -648,10 +798,12 @@ sub expand_bb5 { } } system(" rm -r $docroot/temp"); + return($totseq,$totpage,$totprob); } + sub process_user { - my ($res,$docroot,$destdir,$settings) = @_; + my ($res,$docroot,$destdir,$settings,$user_crs,$user_cdom,$user_handling) = @_; my $xmlfile = $docroot."/temp/".$res.".dat"; my $filecount = 0; my @state; @@ -665,9 +817,9 @@ sub process_user { [sub { my ($tagname, $attr) = @_; push @state, $tagname; - if (@state eq " USERS USER") { + if (@state eq "USERS USER") { $userid = $attr->{value}; - %{$$$settings{$userid}} = (); + %{$$settings{$userid}} = (); @{$$settings{$userid}{links}} = (); } elsif (@state eq "USERS USER LOGINID") { $$settings{$userid}{loginid} = $attr->{value}; @@ -718,6 +870,17 @@ sub process_user { $p->unbroken_text(1); $p->parse_file($xmlfile); $p->eof; + + my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf'); + my $xmlstem = $$configvars{'lonDaemons'}."/tmp/".$user_cdom."_".$user_crs."_"; + + foreach my $user_id (keys %{$settings}) { + if ($$settings{$user_id}{user_role} eq "s") { + + } elsif ($user_handling eq 'enrollall') { + + } + } } sub process_group { @@ -771,7 +934,7 @@ sub process_group { } sub process_staff { - my ($res,$docroot,$destdir,$settings) = @_; + my ($res,$docroot,$dirname,$destdir,$settings) = @_; my $xmlfile = $docroot."/temp/".$res.".dat"; my $filecount = 0; my @state; @@ -787,10 +950,10 @@ sub process_staff { push @state, $tagname; if (@state eq "STAFFINFO TITLE") { $$settings{title} = $attr->{value}; - } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") { + } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") { $$settings{textcolor} = $attr->{value}; - } elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") { - $$settings{ishtml} = $attr->{value}; + } elsif (@state eq "STAFFINFO BIOGRAPHY FLAGS ISHTML") { + $$settings{ishtml} = $attr->{value}; } elsif ("@state" eq "STAFFINFO FLAGS ISAVAILABLE" ) { $$settings{isavailable} = $attr->{value}; } elsif ("@state" eq "STAFFINFO FLAGS ISFOLDER" ) { @@ -834,164 +997,415 @@ sub process_staff { $p->unbroken_text(1); $p->parse_file($xmlfile); $p->eof; + + my $fontcol = ''; + if (defined($$settings{textcolor})) { + $fontcol = qq|color="$$settings{textcolor}"|; + } + if (defined($$settings{text})) { + if ($$settings{ishtml} eq "true") { + $$settings{text} = &HTML::Entities::decode($$settings{text}); + } + } + my $staffentry = qq| + + + + + + + + +

$$settings{name}{formaltitle} $$settings{name}{given} $$settings{name}{family} +
+ |; + if ( defined($$settings{email}) && $$settings{email} ne '') { + $staffentry .= qq| + + + + + |; + } + if (defined($$settings{phone}) && $$settings{phone} ne '') { + $staffentry .= qq| + + + + + |; + } + if (defined($$settings{office}{address}) && $$settings{office}{address} ne '') { + $staffentry .= qq| + + + + + |; + } + if (defined($$settings{office}{hours}) && $$settings{office}{hours} ne '') { + $staffentry .= qq| + + + + + |; + } + if ( defined($$settings{homepage}) && $$settings{homepage} ne '') { + $staffentry .= qq| + + + + + |; + } + if (defined($$settings{text}) && $$settings{text} ne '') { + $staffentry .= qq| + + + + |; + } + $staffentry .= qq| +
+ Email: + + $$settings{email} +
+ Phone: + + $$settings{phone} +
+ Address: + + $$settings{office}{address} +
+ Office Hours: + + $$settings{office}{hours} +
+ Personal Link: + + $$settings{homepage} +
+ Other Information:
$$settings{text}
+
+
+ |; + if ( defined($$settings{image}) ) { + $staffentry .= qq| + + |; + } + $staffentry .= qq| +
+ |; + open(FILE,">$destdir/resfiles/$res.html"); + print FILE qq| + +$$settings{title} + + +$staffentry + +|; + close(FILE); } sub process_link { - my ($res,$docroot,$destdir,$settings) = @_; - my $xmlfile = $docroot."/temp/".$res.".dat"; - my @state = (); - %{$$settings{name}} = (); - %{$$settings{office}} = (); - - my $p = HTML::Parser->new + my ($res,$docroot,$dirname,$destdir,$settings) = @_; + my $xmlfile = $docroot."/temp/".$res.".dat"; + my @state = (); + my $p = HTML::Parser->new ( - xml_mode => 1, - start_h => - [sub { - my ($tagname, $attr) = @_; - push @state, $tagname; - if (@state eq "EXTERNALLINK TITLE") { - $$settings{title} = $attr->{value}; - } elsif (@state eq "EXTERNALLINK TEXTCOLOR") { - $$settings{textcolor} = $attr->{value}; - } elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") { - $$settings{ishtml} = $attr->{value}; - } elsif ("@state" eq "EXTERNALLINKS FLAGS ISAVAILABLE" ) { - $$settings{isavailable} = $attr->{value}; - } elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) { - $$settings{newwindow} = $attr->{value}; - } elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) { - $$settings{isfolder} = $attr->{value}; - } elsif ("@state" eq "EXTERNALLINKS POSITION" ) { - $$settings{position} = $attr->{value}; - } elsif ("@state" eq "EXTERNALLINKS URL" ) { - $$settings{url} = $attr->{value}; + xml_mode => 1, + start_h => + [sub { + my ($tagname, $attr) = @_; + push @state, $tagname; + if (@state eq "EXTERNALLINK TITLE") { + $$settings{title} = $attr->{value}; + } elsif (@state eq "EXTERNALLINK TEXTCOLOR") { + $$settings{textcolor} = $attr->{value}; + } elsif (@state eq "EXTERNALLINK DESCRIPTION FLAGS ISHTML") { + $$settings{ishtml} = $attr->{value}; + } elsif ("@state" eq "EXTERNALLINKS FLAGS ISAVAILABLE" ) { + $$settings{isavailable} = $attr->{value}; + } elsif ("@state" eq "EXTERNALLINKS FLAGS LAUNCHINNEWWINDOW" ) { + $$settings{newwindow} = $attr->{value}; + } elsif ("@state" eq "EXTERNALLINKS FLAGS ISFOLDER" ) { + $$settings{isfolder} = $attr->{value}; + } elsif ("@state" eq "EXTERNALLINKS POSITION" ) { + $$settings{position} = $attr->{value}; + } elsif ("@state" eq "EXTERNALLINKS URL" ) { + $$settings{url} = $attr->{value}; + } + }, "tagname, attr"], + text_h => + [sub { + my ($text) = @_; + if ("@state" eq "EXTERNALLINKS DESCRIPTION TEXT") { + $$settings{text} = $text; + } + }, "dtext"], + end_h => + [sub { + my ($tagname) = @_; + pop @state; + }, "tagname"], + ); + $p->unbroken_text(1); + $p->parse_file($xmlfile); + $p->eof; + + my $linktag = ''; + my $fontcol = ''; + if (defined($$settings{textcolor})) { + $fontcol = qq||; + } + if (defined($$settings{text})) { + if ($$settings{ishtml} eq "true") { + $$settings{text} = &HTML::Entities::decode($$settings{text}); } - }, "tagname, attr"], - text_h => - [sub { - my ($text) = @_; - if ("@state" eq "EXTERNALLINKS DESCRIPTION TEXT") { - $$settings{text} = $text; + } + + if (defined($$settings{url}) ) { + $linktag = qq| - [sub { - my ($tagname) = @_; - pop @state; - }, "tagname"], - ); - $p->unbroken_text(1); - $p->parse_file($xmlfile); - $p->eof; + $linktag .= qq|>$$settings{title}|; + } + + open(FILE,">$destdir/resfiles/$res.html"); + print FILE qq| + +$$settings{title} + + +$fontcol +$linktag +$$settings{text} +|; + if (defined($$settings{textcolor})) { + print FILE qq||; + } + print FILE qq| + + |; + close(FILE); } sub process_db { - my ($res,$docroot,$destdir,$settings) = @_; - my $xmlfile = $docroot."/temp/".$res.".dat"; - my @state = (); - my %threads; # all quotes, keyed by message ID - my $msg_id; # the current message ID - my %message; # the current message being accumulated for $msg_id + my ($res,$docroot,$destdir,$timestamp,$crs,$cdom,$handling,$uname,$settings) = @_; + my $xmlfile = $docroot."/temp/".$res.".dat"; + my @state = (); + my @allmsgs = (); + my %msgidx = (); + my $longcrs = ''; + if ($crs =~ m/^(\d)(\d)(\d)/) { + $longcrs = $1.'/'.$2.'/'.$3.'/'.$crs; + } + my %threads; # all quotes, keyed by message ID + my $msg_id; # the current message ID + my %message; # the current message being accumulated for $msg_id - my $p = HTML::Parser->new + my $p = HTML::Parser->new ( - xml_mode => 1, - start_h => - [sub { - my ($tagname, $attr) = @_; - push @state, $tagname; - my $depth = 0; - my @seq = (); - if (@state eq "FORUM TITLE") { - $$settings{title} = $attr->{value}; - } elsif (@state eq "STAFFINFO BIOGRAPHY TEXTCOLOR") { - $$settings{textcolor} = $attr->{value}; - } elsif (@state eq "FORUM DESCRIPTION FLAGS ISHTML") { - $$settings{ishtml} = $attr->{value}; - } elsif (@state eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") { - $$settings{newline} = $attr->{value}; - } elsif ("@state" eq "FORUM POSITION" ) { - $$settings{position} = $attr->{value}; - } elsif ("@state" eq "FORUM FLAGS ISREADONLY") { - $$settings{isavailable} = $attr->{value}; - } elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) { - $$settings{isavailable} = $attr->{value}; - } elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) { - $$settings{isfolder} = $attr->{value}; - } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { - if ($state[@state-1] eq "MSG") { - $depth = @state - 3; - if ($depth > @seq) { - unless ($msg_id eq '') { - push @seq, $msg_id; - } - } - if ($depth < @seq) { - pop @seq; - } - $msg_id = $attr->{value}; - %message = (); - $message{depth} = $depth; - if ($depth > 0) { - $message{parent} = $seq[-1]; - } else { - $message{parent} = "None"; - } - } elsif ($state[@state-1] eq "TITLE") { - $message{title} = $attr->{value}; - } elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISHTML" ) ) { - $message{ishtml} = $attr->{value}; - } elsif ( ( $state[@state-3] eq "MESSAGETEXT" ) && ( $state[@state-2] eq "FLAGS" ) && ( $state[@state-1] eq "ISNEWLINELITERAL" ) ) { - $message{newline} = $attr->{value}; - } elsif ( ( $state[@state-2] eq "DATES" ) && ( $state[@state-1] eq "CREATED" ) ) { - $message{created} = $attr->{value}; - } elsif ( $state[@state-2] eq "FLAGS") { - if ($state[@state-1] eq "ISANONYMOUS") { - $message{isanonymous} = $attr->{value}; - } - } elsif ( $state[@state-2] eq "USER" ) { - if ($state[@state-1] eq "USERID") { - $message{userid} = $attr->{value}; - } elsif ($state[@state-1] eq "USERNAME") { - $message{username} = $attr->{value}; - } elsif ($state[@state-1] eq "EMAIL") { - $message{email} = $attr->{value}; - } - } elsif ( ($state[@state-2] eq "FILELIST") && ($state[@state-2] eq "IMAGE") ) { - $message{attachment} = $attr->{value}; + xml_mode => 1, + start_h => + [sub { + my ($tagname, $attr) = @_; + push @state, $tagname; + my $depth = 0; + my @seq = (); + if ("@state" eq "FORUM TITLE") { + $$settings{title} = $attr->{value}; + } elsif ("@state" eq "FORUM DESCRIPTION TEXTCOLOR") { + $$settings{textcolor} = $attr->{value}; + } elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISHTML") { + $$settings{ishtml} = $attr->{value}; + } elsif ("@state" eq "FORUM DESCRIPTION FLAGS ISNEWLINELITERAL") { + $$settings{newline} = $attr->{value}; + } elsif ("@state" eq "FORUM POSITION" ) { + $$settings{position} = $attr->{value}; + } elsif ("@state" eq "FORUM FLAGS ISREADONLY") { + $$settings{isreadonly} = $attr->{value}; + } elsif ("@state" eq "FORUM FLAGS ISAVAILABLE" ) { + $$settings{isavailable} = $attr->{value}; + } elsif ("@state" eq "FORUM FLAGS ALLOWANONYMOUSPOSTINGS" ) { + $$settings{allowanon} = $attr->{value}; + } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { + if ($state[-1] eq "MSG") { + unless ($msg_id eq '') { + push @{$threads{$msg_id}}, { %message }; + $depth = @state - 3; + if ($depth > @seq) { + push @seq, $msg_id; + } + } + if ($depth < @seq) { + pop @seq; + } + $msg_id = $attr->{id}; + push @allmsgs, $msg_id; + $msgidx{$msg_id} = @allmsgs; + %message = (); + $message{depth} = $depth; + if ($depth > 0) { + $message{parent} = $seq[-1]; + } else { + $message{parent} = "None"; + } + } elsif ($state[-1] eq "TITLE") { + $message{title} = $attr->{value}; + } elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISHTML" ) ) { + $message{ishtml} = $attr->{value}; + } elsif ( ( $state[-3] eq "MESSAGETEXT" ) && ( $state[-2] eq "FLAGS" ) && ( $state[-1] eq "ISNEWLINELITERAL" ) ) { + $message{newline} = $attr->{value}; + } elsif ( ( $state[-2] eq "DATES" ) && ( $state[-1] eq "CREATED" ) ) { + $message{created} = $attr->{value}; + } elsif ( $state[@state-2] eq "FLAGS") { + if ($state[@state-1] eq "ISANONYMOUS") { + $message{isanonymous} = $attr->{value}; + } + } elsif ( $state[-2] eq "USER" ) { + if ($state[-1] eq "USERID") { + $message{userid} = $attr->{value}; + } elsif ($state[@state-1] eq "USERNAME") { + $message{username} = $attr->{value}; + } elsif ($state[@state-1] eq "EMAIL") { + $message{email} = $attr->{value}; + } + } elsif ( ($state[-2] eq "FILELIST") && ($state[-1] eq "IMAGE") ) { + $message{attachment} = $attr->{value}; + } + } + }, "tagname, attr"], + text_h => + [sub { + my ($text) = @_; + if ("@state" eq "FORUM DESCRIPTION TEXT") { + $$settings{text} = $text; + } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { + if ( ($state[-2] eq "MESSAGETEXT") && ($state[-1] eq "TEXT") ){ + $message{text} = $text; + } + } + }, "dtext"], + end_h => + [sub { + my ($tagname) = @_; + if ( $state[-1] eq "MESSAGETHREADS" ) { + push @{$threads{$msg_id}}, { %message }; + } + pop @state; + }, "tagname"], + ); + $p->unbroken_text(1); + $p->parse_file($xmlfile); + $p->eof; + + if (defined($$settings{text})) { + if ($$settings{ishtml} eq "false") { + if ($$settings{isnewline} eq "true") { + $$settings{text} =~ s#\n#
#g; } + } else { + $$settings{text} = &HTML::Entities::decode($$settings{text}); } - }, "tagname, attr"], - text_h => - [sub { - my ($text) = @_; - if ("@state" eq "FORUM DESCRIPTION TEXT") { - $$settings{text} = $text; - } elsif ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { - if ( ($state[@state-2] eq "MESSAGETEXT") && ($state[@state-1] eq "TEXT") ){ - $message{text} = $text; - } + if (defined($$settings{fontcolor}) ) { + $$settings{text} = "".$$settings{text}.""; } - }, "dtext"], - end_h => - [sub { - my ($tagname) = @_; - if ( ($state[0] eq "FORUM") && ($state[1] eq "MESSAGETHREADS") && ($state[2] eq "MSG") ) { - if ($state[@state-1] eq "MSG") { - push @{$threads{$msg_id}}, { %message }; + } + my $boardname = 'bulletinpage_'.$timestamp; + my %boardinfo = ( + 'aaa_title' => $$settings{title}, + 'bbb_content' => $$settings{text}, + 'ccc_webreferences' => '', + 'uploaded.lastmodified' => time, + ); + + my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$cdom,$crs); + if ($handling eq 'importall') { + foreach my $msg_id (@allmsgs) { + foreach my $message ( @{$threads{$msg_id}} ) { + my %contrib = ( + 'sendername' => $$message{userid}, + 'senderdomain' => $cdom, + 'screenname' => '', + 'plainname' => $$message{username}, + ); + unless ($$message{parent} eq 'None') { + $contrib{replyto} = $msgidx{$$message{parent}}; + } + if (defined($$message{isanonymous}) ) { + if ($$message{isanonymous} eq 'true') { + $contrib{'anonymous'} = 'true'; + } + } + if ( defined($$message{attachment}) ) { + my $url = $$message{attachment}; + my $oldurl = $url; + my $newurl = $url; + unless ($url eq '') { + $newurl =~ s/\//_/g; + unless ($longcrs eq '') { + if (!-e "/home/httpd/lonUsers/$cdom/$longcrs/userfiles") { + mkdir("/home/httpd/lonUsers/$cdom/$longcrs/userfiles",0755); + } + if (!-e "/home/httpd/lonUsers/$cdom/$longcrs/userfiles/$newurl") { + system("cp $destdir/resfiles/$res/$$message{attachment} /home/httpd/lonUsers/$cdom/$longcrs/userfiles/$newurl"); + } + $contrib{attachmenturl} = '/uploaded/'.$cdom.'/'.$crs.'/'.$newurl; + } + } + } + if (defined($$message{title}) ) { + $contrib{'message'} = $$message{title}; + } + if (defined($$message{text})) { + if ($$message{ishtml} eq "false") { + if ($$message{isnewline} eq "true") { + $$message{text} =~ s#\n#
#g; + } + } else { + $$message{text} = &HTML::Entities::decode($$message{text}); + } + $contrib{'message'} .= '

'.$$message{text}; + my $symb = 'bulletin___'.$timestamp.'___adm/wrapper/adm/'.$cdom.'/'.$uname.'/'.$timestamp.'/bulletinboard'; + my $postresult = &addposting($symb,\%contrib,$cdom,$crs); + } } } - pop @state; - }, "tagname"], - ); - $p->unbroken_text(1); - $p->parse_file($xmlfile); - $p->eof; + } +} + +sub addposting { + my ($symb,$contrib,$cdom,$crs)=@_; + my $status=''; + if (($symb) && ($$contrib{message})) { + my $crsdom = $cdom.'_'.$crs; + &Apache::lonnet::store($contrib,$symb,$crsdom,$cdom,$crs); + my %storenewentry=($symb => time); + &Apache::lonnet::put('discussiontimes',\%storenewentry,$cdom,$crs); + } + my %record=&Apache::lonnet::restore('_discussion'); + my ($temp)=keys %record; + unless ($temp=~/^error\:/) { + my %newrecord=(); + $newrecord{'resource'}=$symb; + $newrecord{'subnumber'}=$record{'subnumber'}+1; + &Apache::lonnet::cstore(\%newrecord,'_discussion'); + $status = 'ok'; + } else { + $status.='Failed.'; + } + return $status; } sub process_assessment { - my ($res,$docroot,$container,$dirname,$destdir,$settings) = @_; + my ($res,$docroot,$container,$dirname,$destdir,$settings,$totpageref,$totprobref) = @_; my $xmlfile = $docroot."/temp/".$res.".dat"; # print "XML file is $xmlfile\n"; my @state = (); @@ -1046,7 +1460,9 @@ sub process_assessment { } if ("@state" eq "$toptag{$container} QUESTIONLIST QUESTION") { $id = $attr->{id}; - push @allids, $id; + unless ($container eq 'pool') { + push @allids, $id; + } %{$$settings{$id}} = (); @{$allanswers{$id}} = (); $$settings{$id}{class} = $attr->{class}; @@ -1145,20 +1561,43 @@ sub process_assessment { mkdir("$destdir/problems/$dirtitle",0755); } my $newdir = "$destdir/problems/$dirtitle"; - foreach my $id (@allids) { -# print "Current ID is $id, type is $$settings{$id}{class} \n"; - if ($$settings{$id}{class} eq "QUESTION_ESSAY") { - my $output; - if ($container eq 'pool') { - $output = qq| - $$settings{$id}{text} + my $pagedir = "$destdir/pages"; + my $curr_id = 0; + my $next_id = 0; + unless ($container eq 'pool') { + open(PAGEFILE,">$pagedir/$res.page"); + print PAGEFILE qq| |; + $$totpageref ++; + } + foreach my $id (@allids) { + $curr_id ++; + $next_id = $curr_id + 1; + if ($curr_id == 0) { + print PAGEFILE qq|\n|; + } else { + print PAGEFILE qq| + +\n|; } else { - $output = qq| - $$settings{$id}{text} -|; + print PAGEFILE qq|>|; } - $output .= qq| + } +# print "Current ID is $id, type is $$settings{$id}{class} \n"; + if (@allids == 1) { + print PAGEFILE qq| +\n|; + } + + my $output = qq| +|; + $$totprobref ++; + if ($$settings{$id}{class} eq "QUESTION_ESSAY") { + $output .= qq|$$settings{$id}{text} @@ -1166,28 +1605,7 @@ sub process_assessment { $$settings{$id}{feedbackcorr} |; - if ($container eq 'pool') { - $output .= qq| - |; - open(PROB,">$newdir/$id.problem"); - print PROB $output; - close PROB; - } else { - $output .= qq| - |; - open(PROB,">$newdir/$id.problem"); - print PROB $output; - close PROB; - } } else { - my $output; - if ($container eq 'pool') { - $output = qq| -|; - } else { - $output = qq| -|; - } $output .= qq|$$settings{$id}{text}\n|; if ( defined($$settings{$id}{image}) ) { if ( $$settings{$id}{style} eq 'embed' ) { @@ -1274,7 +1692,7 @@ sub process_assessment { chomp($output); $output .= qq| - + |; } elsif ($$settings{$id}{class} eq 'QUESTION_ORDER') { my $numfoils = @{$allanswers{$id}}; @@ -1293,7 +1711,7 @@ sub process_assessment { } elsif ($$settings{$id}{class} eq 'QUESTION_FILLINBLANK') { my $numerical = 1; for (my $k=0; $k<@{$allanswers{$id}}; $k++) { - unless ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/^\d+\.?\d*$/) { + if ($$settings{$id}{$allanswers{$id}[$k]}{text} =~ m/([^\d\.]|\.\.)/) { $numerical = 0; } } @@ -1377,21 +1795,16 @@ sub process_assessment { |; } - if ($container eq 'pool') { - $output .= qq| - |; - open(PROB,">$newdir/$id.problem"); - print PROB $output; - close PROB; - } else { - $output .= qq| - |; - open(PROB,">$newdir/$id.problem"); - print PROB $output; - close PROB; - } - } + $output .= qq| +|; + open(PROB,">$newdir/$id.problem"); + print PROB $output; + close PROB; + } + unless ($container eq 'pool') { + print PAGEFILE qq|
|; + close(PAGEFILE); } } @@ -1436,6 +1849,7 @@ sub process_announce { my ($res,$docroot,$destdir,$settings) = @_; my $xmlfile = $docroot."/temp/".$res.".dat"; my @state = (); + my @assess = (); my $id; my $p = HTML::Parser->new ( @@ -1456,7 +1870,8 @@ sub process_announce { $$settings{ispermanent} = $attr->{value}; } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT" ) { $id = $attr->{id}; - $$settings{startassessment}{$id} = (); + %{$$settings{startassessment}{$id}} = (); + push @assess,$id; } elsif ("@state" eq "ANNOUNCEMENT FILES STARTASSESSMENT ATTRIB" ) { my $key = $attr->{key}; $$settings{startassessment}{$id}{$key} = $attr->{value}; @@ -1466,7 +1881,7 @@ sub process_announce { [sub { my ($text) = @_; if ("@state" eq "ANNOUNCEMENT DESCRIPTION TEXT") { - $$settings{maindata}{text} = $text; + $$settings{text} = $text; # print "TEXT $text\n"; } }, "dtext"], @@ -1479,6 +1894,38 @@ sub process_announce { $p->unbroken_text(1); $p->parse_file($xmlfile); $p->eof; + + if (defined($$settings{text})) { + if ($$settings{ishtml} eq "false") { + if ($$settings{isnewline} eq "true") { + $$settings{text} =~ s#\n#
#g; + } + } else { + $$settings{text} = &HTML::Entities::decode($$settings{text}); + } + } + + if (@assess > 0) { + foreach my $id (@assess) { + $$settings{text} .= "Please use 'NAV' to locate the link to the folder of problems entitled -"; + foreach my $key (keys %{$$settings{startassessment}{$id}}) { +# print STDERR "Quiz announcement - $id, key: $key, value: $$settings{startassessment}{$id}{$key}\n"; + } + } + } + + open(FILE,">$destdir/resfiles/$res.html"); + print FILE qq| + +$$settings{title} + + +$$settings{text} +|; + print FILE qq| + + |; + close(FILE); } sub process_content { @@ -1647,8 +2094,552 @@ $linktag|; close(FILE); } +sub expand_angel { + my ($r,$uname,$udom,$fn,$page,$bb_crs,$bb_cdom,$bb_handling) = @_; + my @state = (); + my @seq = "Top"; + my $lastitem; + my $itm = ''; + my %resnum = (); + my %revitm = (); + my %title = (); + my %filepath = (); + my %contentscount = ("Top" => 0); + my %contents = (); + my %parentseq = (); + my %file = (); + my %type = (); + my %href = (); + my $identifier = ''; + my %resinfo = (); + my $numfolders = 0; + my $numpages = 0; + my $docroot = $ENV{'form.newdir'}; + if (!-e "$docroot/temp") { + mkdir "$docroot/temp"; + } + my $newdir = ''; + if ($docroot =~ m|public_html/(.+)$|) { + $newdir = $1; + } + my $dirname = "/res/$udom/$uname/$newdir"; + my $zipfile = '/home/'.$uname.'/public_html'.$fn; + if ($fn =~ m|\.zip$|i) { + open(OUTPUT, "unzip -o $zipfile -d $docroot/temp 2> /dev/null |"); + while () { + print "$_
"; + } + close(OUTPUT); + } + + my $xmlfile = $docroot.'/temp/imsmanifest.xml'; + my $p = HTML::Parser->new + ( + xml_mode => 1, + start_h => + [sub { + my ($tagname, $attr) = @_; + push @state, $tagname; + my $num = @state - 3; + my $start = $num; + my $statestr = ''; + foreach (@state) { + $statestr .= "$_ "; + } + if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq "organization") ) { + my $searchstr = "manifest organizations organization"; + while ($num > 0) { + $searchstr .= " item"; + $num --; + } + if (("@state" eq $searchstr) && (@state > 3)) { + $itm = $attr->{identifier}; + if ($attr->{identifierref} =~ m/^res(.+)$/) { + $resnum{$itm} = $1; + } + $revitm{$resnum{$itm}} = $itm; + if ($start > @seq) { + unless ($lastitem eq '') { + push @seq, $lastitem; + unless ( defined($contents{$seq[-1]}) ) { + @{$contents{$seq[-1]}} = (); + } + push @{$contents{$seq[-1]}},$itm; + $parentseq{$itm} = $seq[-1]; + } + } + elsif ($start < @seq) { + my $diff = @seq - $start; + while ($diff > 0) { + pop @seq; + $diff --; + } + if (@seq) { + push @{$contents{$seq[-1]}}, $itm; + } + } else { + push @{$contents{$seq[-1]}}, $itm; + } + my $path; + if (@seq > 1) { + $path = join(',',@seq); + } elsif (@seq > 0) { + $path = $seq[0]; + } + $filepath{$itm} = $path; + $contentscount{$seq[-1]} ++; + $lastitem = $itm; + } + } elsif ("@state" eq "manifest resources resource" ) { + $identifier = $attr->{identifier}; + $identifier = substr($identifier,3); + if ($attr->{href} =~ m-^_assoc/$identifier/(.+)$-) { + $file{$identifier} = $1; + } + @{$href{$identifier}} = (); + } elsif ("@state" eq "manifest resources resource file") { + if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) { + push @{$href{$identifier}},$1; + } elsif ($attr->{href} =~ m/^Icons\\icon(\w+)\.gif/) { + $type{$identifier} = $1; + } + } + }, "tagname, attr"], + text_h => + [sub { + my ($text) = @_; + if ($state[0] eq "manifest" && $state[1] eq "organizations" && $state[2] eq "organization" && $state[-1] eq "title") { + $title{$itm} = $text; + } + }, "dtext"], + end_h => + [sub { + my ($tagname) = @_; + pop @state; + }, "tagname"], + ); + $p->parse_file($xmlfile); + $p->eof; + + my $topnum = 0; + my $destdir = $docroot; + if (!-e "$destdir") { + mkdir("$destdir",0755); + } + if (!-e "$destdir/sequences") { + mkdir("$destdir/sequences",0755); + } + if (!-e "$destdir/resfiles") { + mkdir("$destdir/resfiles",0755); + } + if (!-e "$destdir/pages") { + mkdir("$destdir/pages",0755); + } + if (!-e "$destdir/problems") { + mkdir("$destdir/problems",0755); + } + foreach my $key (sort keys %href) { + foreach my $file (@{$href{$key}}) { + print STDERR "File is $file, for $key\n"; + $file =~ s-\\-/-g; + my $filepath = $file; + if (!-e "$destdir/resfiles/$key") { + mkdir("$destdir/resfiles/$key",0755); + } + while ($filepath =~ m-(\w+)/(.+)-) { + $filepath = $2; + if (!-e "$destdir/resfiles/$key/$1") { + mkdir("$destdir/resfiles/$key/$1",0755); + } + } + system("cp $docroot/temp/_assoc/$key/$file $destdir/resfiles/$key/$file"); + } + } + + +# ANGEL types FILE FOLDER PAGE LINK MESSAGE FORM QUIZ BOARD + my $currboard = ''; + my @boards = (); + my %messages = (); + my @timestamp = (); + my %boardnum = (); + my $board_id = time; + my $board_count = 0; + foreach my $key (sort keys %type) { + if ($type{$key} eq "BOARD") { + push @boards, $key; + $boardnum{$revitm{$key}} = $board_count ; + $currboard = $key; + @{$messages{$key}} = (); + $timestamp[$board_count] = $board_id; + $board_id ++; + $board_count ++; + } elsif ($type{$key} eq "MESSAGE") { + push @{$messages{$currboard}}, $key; + } elsif ($type{$key} eq "FILE" || $type{$key} eq "FOLDER" || $type{$key} eq "PAGE" || $type{$key} eq "LINK") { + %{$resinfo{$key}} = (); + } elsif ($type{$key} eq "QUIZ") { + %{$resinfo{$key}} = (); +# &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); + } elsif ($type{$key} eq "FORM") { + %{$resinfo{$key}} = (); +# &angel_assessment($key,$docroot,$dirname,$destdir,\%{$resinfo{$key}}); + } + } + + my $longcrs = ''; + if ($bb_crs =~ m/^(\d)(\d)(\d)/) { + $longcrs = $1.'/'.$2.'/'.$3.'/'.$bb_crs; + } + for (my $i=0; $i<@boards; $i++) { + my %msgidx = (); + my $forumtext = ''; + my $boardname = 'bulletinpage_'.$timestamp[$i]; + my $forumfile = "$destdir/resfiles/$boards[$i]/$file{$boards[$i]}"; + my @state = (); + my $p = HTML::Parser->new + ( + xml_mode => 1, + start_h => + [sub { + my ($tagname, $attr) = @_; + push @state, $tagname; + }, "tagname, attr"], + text_h => + [sub { + my ($text) = @_; + if ("@state" eq "html body div div") { + $forumtext = $text; + } + }, "dtext"], + end_h => + [sub { + my ($tagname) = @_; + pop @state; + }, "tagname"], + ); + $p->parse_file($xmlfile); + $p->eof; + + my %boardinfo = ( + 'aaa_title' => $title{$revitm{$boards[$i]}}, + 'bbb_content' => $forumtext, + 'ccc_webreferences' => '', + 'uploaded.lastmodified' => time, + ); + my $msgcount = 0; + + my $putresult = &Apache::lonnet::put($boardname,\%boardinfo,$bb_cdom,$bb_crs); + if ($bb_handling eq 'importall') { + foreach my $msg_id (@{$messages{$boards[$i]}}) { + $msgcount ++; + $msgidx{$msg_id} = $msgcount; + my %contrib = ( + 'sendername' => 'Username not recorded', + 'senderdomain' => $bb_cdom, + 'screenname' => '', + 'message' => $title{$revitm{$msg_id}} + ); + unless ( $parentseq{$revitm{$msg_id}} eq $revitm{$boards[$i]} ) { + $contrib{replyto} = $msgidx{$resnum{$parentseq{$revitm{$msg_id}}}}; + } + if ( @{$href{$msg_id}} > 1 ) { + my $newurl = ''; + foreach my $file (@{$href{$msg_id}}) { + unless ($file eq 'pg'.$msg_id.'.htm') { + $newurl = $msg_id.$file; + unless ($longcrs eq '') { + if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles") { + mkdir("/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles",0755); + } + if (!-e "/home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl") { + system("cp $destdir/resfiles/$file /home/httpd/lonUsers/$bb_cdom/$longcrs/userfiles/$newurl"); + } + $contrib{attachmenturl} = '/uploaded/'.$bb_cdom.'/'.$bb_crs.'/'.$newurl; + } + } + } + } + my $xmlfile = "$destdir/resfiles/$msg_id/$file{$msg_id}"; + &angel_message($msg_id,\%contrib,$xmlfile); + unless ($file{$msg_id} eq '') { + unlink($xmlfile); + } + my $symb = 'bulletin___'.$timestamp[$i].'___adm/wrapper/adm/'.$bb_cdom.'/'.$uname.'/'.$timestamp[$i].'/bulletinboard'; + my $postresult = &addposting($symb,\%contrib,$bb_cdom,$bb_crs); + } + } + } + + my @resources = sort keys %resnum; + unshift @resources, "Top"; + $resnum{'Top'} = 'toplevel'; + $type{'toplevel'} = "FOLDER"; + + my %pagecount = (); + my %pagecontents = (); + my %pageflag = (); + my %seqflag = (); + my %seqcount = (); + my %boardflag = (); + my %boardcount = (); + + foreach my $key (@resources) { + print STDERR "Key is $key, resnum is $resnum{$key}, type is $type{$resnum{$key}}\n"; + $pageflag{$key} = 0; + $seqflag{$key} = 0; + $seqcount{$key} = 0; + $pagecount{$key} = -1; + $boardflag{$key} = 0; + $boardcount{$key} = 0; + my $src =""; + my $next_id = 1; + my $curr_id = 0; + if ($type{$resnum{$key}} eq "FOLDER") { + open(LOCFILE,">$destdir/sequences/$key.sequence"); + print LOCFILE "\n"; + if ($contentscount{$key} == 0) { + print LOCFILE qq| + +\n|; + } else { + if ($type{$resnum{$contents{$key}[0]}} eq "FOLDER") { + $src = 'sequences/'.$contents{$key}[0].".sequence"; + $pageflag{$key} = 0; + $seqflag{$key} = 1; + $seqcount{$key} ++; + } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") { + $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$key}]/bulletinboard"; + $pageflag{$key} = 0; + $boardflag{$key} = 1; + $boardcount{$key} ++; + } elsif ($type{$resnum{$contents{$key}[0]}} ne "MESSAGE") { + if ($pageflag{$key}) { + push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[0]; + } else { + $pagecount{$key} ++; + $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page'; + @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[0]"); + $seqflag{$key} = 0; + } + } + unless ($pageflag{$key}) { + print LOCFILE qq| + +\n|; + } else { + if ($contentscount{$key} > 2 ) { + for (my $i=1; $i<$contentscount{$key}-1; $i++) { + if ($type{$resnum{$contents{$key}[$i]}} eq "FOLDER") { + $src = 'sequences/'.$contents{$key}[$i].".sequence"; + $pageflag{$key} = 0; + $seqflag{$key} = 1; + $seqcount{$key} ++; + } elsif ($type{$resnum{$contents{$key}[0]}} eq "BOARD") { + $src = "/adm/$bb_cdom/$uname/$timestamp[$boardnum{$key}]/bulletinboard"; + $pageflag{$key} = 0; + $boardflag{$key} = 1; + $boardcount{$key} ++; + } elsif ($type{$resnum{$contents{$key}[0]}} ne "MESSAGE") { + if ($pageflag{$key}) { + push @{$pagecontents{$key}[$pagecount{$key}]},$contents{$key}[$i]; + } else { + $pagecount{$key} ++; + $src = 'pages/'.$key.'_'.$pagecount{$key}.'.page'; + @{$pagecontents{$key}[$pagecount{$key}]} = ("$contents{$key}[$i]"); + $seqflag{$key} = 0; + } + } + unless ($pageflag{$key}) { + $curr_id ++; + $next_id ++; + print LOCFILE qq|> + + + +\n|; + } else { + print LOCFILE qq| type="finish">\n|; + } + } else { + $curr_id ++; + $next_id ++; + print LOCFILE qq|> + +\n|; + } + } + } + print LOCFILE "\n"; + close(LOCFILE); + } + } + + foreach my $key (sort keys %pagecontents) { + for (my $i=0; $i<@{$pagecontents{$key}}; $i++) { + my $filestem = "/res/$udom/$uname/$newdir"; + my $filename = $destdir.'/pages/'.$key.'_'.$i.'.page'; + open(PAGEFILE,">$filename"); + print PAGEFILE qq| + +\n|; + if (@{$pagecontents{$key}[$i]} == 1) { + print PAGEFILE qq||; + } elsif (@{$pagecontents{$key}[$i]} == 2) { + print PAGEFILE qq||; + } else { + for (my $j=1; $j<@{$pagecontents{$key}[$i]}-1; $j++) { + my $curr_id = $j+1; + my $next_id = $j+2; + my $resource = $filestem.'/resfiles/'.$resnum{$pagecontents{$key}[$i][$j]}.'.html'; + print PAGEFILE qq| +\n|; + } + my $final_id = @{$pagecontents{$key}[$i]}; + print PAGEFILE qq|\n|; + } + print PAGEFILE ""; + close(PAGEFILE); + } + } +# system(" rm -r $docroot/temp"); +} + +sub angel_message { + my ($msg_id,$contrib,$xmlfile) = @_; + my @state = (); + my $p = HTML::Parser->new + ( + xml_mode => 1, + start_h => + [sub { + my ($tagname, $attr) = @_; + push @state, $tagname; + }, "tagname, attr"], + text_h => + [sub { + my ($text) = @_; + if ("@state" eq "html body table tr td div small span") { + $$contrib{'plainname'} = $text; + } elsif ("@state" eq "html body div div") { + $$contrib{'message'} .= '

'.$text; + } + }, "dtext"], + end_h => + [sub { + my ($tagname) = @_; + pop @state; + }, "tagname"], + ); + $p->parse_file($xmlfile); + $p->eof; +} + +sub get_ccroles { + my ($uname,$dom,$crsentry) = @_; + my %roles = (); + unless ($uname eq '') { + %roles = &Apache::lonnet::dump('roles',$dom,$uname); + } + my $iter = 0; + my @codes = (); + my %courses = (); + my @crslist = (); + my %descrip =(); + foreach my $key (keys %roles ) { + if ($key =~ m/^\/(\w+)\/(\w+)_cc$/) { + my $cdom = $1; + my $crs = $2; + my $role_end = 0; + my $role_start = 0; + my $active_chk = 1; + if ( $roles{$key} =~ m/^cc_(\d+)/ ) { + $role_end = $1; + if ( $roles{$key} =~ m/^cc_($role_end)_(\d+)$/ ) + { + $role_start = $2; + } + } + if ($role_start > 0) { + if (time < $role_start) { + $active_chk = 0; + } + } + if ($role_end > 0) { + if (time > $role_end) { + $active_chk = 0; + } + } + if ($active_chk) { + my $currcode = ''; + my %settings = &Apache::lonnet::get('environment',['internal.coursecode','description'],$cdom,$crs); + if (defined($settings{'description'}) ) { + $descrip{$crs} = $settings{'description'}; + } else { + $descrip{$crs} = 'Unknown'; + } + if (defined($settings{'internal.coursecode'}) ) { + $currcode = $settings{'internal.coursecode'}; + if ($currcode eq '') { + $currcode = "____".$iter; + $iter ++; + } + } else { + $currcode = "____".$iter; + $iter ++; + } + unless (grep/^$currcode$/,@codes) { + push @codes,$currcode; + @{$courses{$currcode}} = (); + } + push @{$courses{$currcode}}, $cdom.'/'.$crs; + } + } + } + foreach my $code (sort @codes) { + foreach my $crsdom (@{$courses{$code}}) { + my ($cdom,$crs) = split/\//,$crsdom; + my $showcode = ''; + unless ($code =~m/^____\d+$/) { $showcode = $code; } + $$crsentry{$crsdom} = $showcode.':'.$descrip{$crs}; + push @crslist, $crsdom; + } + } + return @crslist; +} - # ---------------------------------------------------------------- Main Handler sub handler { my $r=shift; @@ -1701,16 +2692,16 @@ sub handler { if ($ENV{'form.phase'} eq 'three') { $current_page = &display_control(); - my @PAGES = ('ChooseDir','Blackboard5','ANGEL','WebCT'); + my @PAGES = ('ChooseDir','Confirmation'); $page_name = $PAGES[$current_page]; if ($page_name eq 'ChooseDir') { - &jscript_zero($fullpath,\$javascript); + &jscript_zero($fullpath,\$javascript,$uname,$udom); } elsif ($page_name eq 'Confirmation') { - &jscript_two(\$javascript,$uname); +# &jscript_two(\$javascript,$uname); } } elsif ($ENV{'form.phase'} eq 'two') { - &jscript_zero($fullpath,\$javascript); + &jscript_zero($fullpath,\$javascript,$uname,$udom); } $r->print("LON-CAPA Construction Space\n"); @@ -1722,16 +2713,42 @@ sub handler { } if ($ENV{'form.phase'} eq 'three') { - &display_zero ($r,$uname,$fn,$current_page) if $page_name eq 'ChooseDir'; - &expand_bb5 ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'Blackboard5'; - &expand_angel ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'ANGEL'; - &expand_webct ($r,$uname,$udom,$fn,$fullpath,$current_page) if $page_name eq 'WebCT'; + my $bb_crs = ''; + my $bb_cdom = ''; + my $bb_handling = ''; + my $source = $ENV{'form.source'}; + if ( defined($ENV{'form.bb_crs'}) ) { + ($bb_cdom,$bb_crs) = split/\//,$ENV{'form.bb_crs'}; + } + if ( defined($ENV{'form.bb_handling'}) ) { + $bb_handling = $ENV{'form.bb_handling'}; + } + my $users_crs = ''; + my $users_cdom = ''; + my $users_handling = ''; + if ( defined($ENV{'form.user_crs'}) ) { + ($users_cdom,$users_crs) = split/\//,$ENV{'form.user_crs'}; + } + if ( defined($ENV{'form.user_handling'}) ) { + $users_handling = $ENV{'form.user_handling'}; + } + my ($totseq,$totpage,$totprob); + print STDERR "Page name is $page_name\n"; + if ($page_name eq 'ChooseDir') { + &display_zero ($r,$uname,$fn,$current_page,$fullpath); + } elsif ($page_name eq 'Confirmation') { + ($totseq,$totpage,$totprob) = &expand_bb5 ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling,$users_crs,$users_cdom,$users_handling) if $source eq 'bb5'; + ($totseq,$totpage,$totprob) = &expand_angel ($r,$uname,$udom,$fn,$current_page,$bb_crs,$bb_cdom,$bb_handling) if $source eq 'angel'; + &expand_webct ($r,$uname,$udom,$fn,$current_page) if $source eq 'webct'; + } + $r->print("

Step 3: Publish your new LON-CAPA materials

"); + $r->print("Your IMS package has been processed successfully. A total of $totseq sequences, $totpage pages, and $totprob problems have been created.

\n"); } elsif ($ENV{'form.phase'} eq 'two') { my $flag = &Apache::lonupload::phasetwo($r,$fn,$uname,$udom,'imsimport'); if ($flag eq 'ok') { my $current_page = 0; - &display_zero($r,$uname,$fn,$current_page); + &display_zero($r,$uname,$fn,$current_page,$fullpath); } } else { &Apache::lonupload::phaseone($r,$fn,$uname,$udom,'imsimport');