--- loncom/interface/lonsyllabus.pm 2013/05/09 05:43:30 1.121 +++ loncom/interface/lonsyllabus.pm 2013/05/10 17:49:11 1.122 @@ -1,7 +1,7 @@ # The LearningOnline Network # Syllabus # -# $Id: lonsyllabus.pm,v 1.121 2013/05/09 05:43:30 raeburn Exp $ +# $Id: lonsyllabus.pm,v 1.122 2013/05/10 17:49:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -100,13 +100,23 @@ sub handler { # -------------------------------------------------- Let's see who handles this my $external=$courseenv{'externalsyllabus'}; my $uploaded=$courseenv{'uploadedsyllabus'}; + my $minimal=$courseenv{'minimalsyllabus'}; - if ($uploaded =~/\w/) { - if ($external =~ m{\Q$uploaded\E$}) { - undef($external); + if (($minimal =~/\w/) || ($uploaded =~/\w/)) { + my $item; + if ($minimal =~/\w/) { + if ($external =~ m{\Q$minimal\E$}) { + undef($external); + } + $item = $minimal; + } elsif ($uploaded =~/\w/) { + if ($external =~ m{\Q$uploaded\E$}) { + undef($external); + } + $item = $uploaded; } unless ($allowed && $forceedit) { - my $file=&Apache::lonnet::filelocation("",$uploaded); + my $file=&Apache::lonnet::filelocation("",$item); if ($file =~ /\.(sty|css|js|txt|tex|html?)$/) { my $filetype; if ($file =~ /\.(sty|css|js|txt|tex)$/) { @@ -122,7 +132,7 @@ sub handler { my %mystyle; &Apache::structuretags::reset_problem_globals(); my $oldfile = $env{'request.filename'}; - $env{'request.filename'} = $uploaded; + $env{'request.filename'} = $item; $result = &Apache::lonxml::xmlparse($r,'web',$filecontents, '',%mystyle); &Apache::structuretags::reset_problem_globals(); @@ -132,7 +142,7 @@ sub handler { $r->print($result); } } else { - $r->print(&Apache::lonwrapper::wrapper($uploaded)); + $r->print(&Apache::lonwrapper::wrapper($item)); } return OK; } @@ -170,17 +180,25 @@ sub handler { # This handler might be called anonymously ... # ----------------------------------------------------- Only if not public call if ($allowed) { - if (($env{'form.choice'} =~ /^(template|url|file)$/) || + if (($env{'form.choice'} =~ /^(template|minimal|url|file)$/) || ($env{'form.phase'} =~ /^(upload|check)_embedded$/)) { my $earlyout; - ($earlyout,$uploaded,$external,$output) = - &save_changes($cnum,$cdom,$uploaded,$external,\%syllabus, - \%syllabusfields,\%courseenv); + ($earlyout,$uploaded,$external,$minimal,$output) = + &save_changes($cnum,$cdom,$uploaded,$external,$minimal, + \%syllabus,\%syllabusfields,\%courseenv); + if (($env{'form.choice'} eq 'minimal') && + ($minimal eq "/uploaded/$cdom/$cnum/portfolio/syllabus/loncapa.html")) { + delete($env{'form.symb'}); + delete($env{'request.symb'}); + $r->internal_redirect("$minimal?editmode=1&forceedit=1"); + return OK; + } if ($earlyout) { if ($target ne 'tex') { &print_header($r,$cnum,$cdom,$crstype,$allowed,$forceedit, \%syllabus,\%syllabusfields); - $r->print($output); + $r->print($output. + &Apache::loncommon::end_page()); } return OK; } @@ -237,8 +255,8 @@ sub handler { .'' .'
'."\n"); my $lonhost = $r->dir_config('lonHostID'); - $r->print(&chooser($external,$uploaded,$cdom,$cnum,$lonhost,\%syllabusfields, - \%syllabus)); + $r->print(&chooser($external,$uploaded,$minimal,$cdom,$cnum,$lonhost, + \%syllabusfields,\%syllabus)); } } else { #--------------------------------------------- Print last update unless editing @@ -277,7 +295,7 @@ sub handler { #-------------------------------------------------------------- Print Headtitle if ($target ne 'tex') { my $display = 'block'; - if ($external || $uploaded) { + if ($external || $uploaded || $minimal) { $display = 'none'; } $r->print('
'. @@ -536,7 +554,7 @@ ENDREGEXP // print($start_page); + if ($start_page) { + $r->print($start_page); + } } sub chooser { - my ($external,$uploaded,$cdom,$cnum,$lonhost,$fields,$values) = @_; + my ($external,$uploaded,$minimal,$cdom,$cnum,$lonhost,$fields,$values) = @_; my %lt = &Apache::lonlocal::texthash( 'type' => 'Syllabus Type', 'url' => 'External URL', - 'file' => 'Uploaded File', - 'template' => 'Syllabus Template', + 'file' => 'Uploaded file', + 'minimal' => 'Minimal template', + 'template' => 'Standard template', 'templateboxes' => 'Choose template items ... ', 'curr' => 'Current:', 'rep' => 'Replace:', 'upl' => 'Upload:', 'pr' => 'Preview', 'save' => 'Save', - 'chourl' => 'Choose external URL', + 'sved' => 'Save and Edit', + 'chourl' => 'External URL', 'chofile' => 'Uploaded syllabus file', 'parse' => 'Upload embedded images/multimedia files if HTML file', ); my %checked = ( file => '', + minimal => '', url => '', template => '', ); my %display = ( file => 'none', + minimal => 'none', url => 'none', templatebox => 'none', ); @@ -712,6 +736,9 @@ sub chooser { } elsif ($external) { $checked{'url'} = $check; $display{'url'} = 'block'; + } elsif ($minimal) { + $checked{'minimal'} = $check; + $display{'minimal'} = 'block'; } else { $checked{'template'} = $check; $checked{'templatebox'} = $check; @@ -722,7 +749,7 @@ sub chooser { '
'."\n". ''."\n". '
'.$lt{'type'}.''; - foreach my $item ('template','url','file') { + foreach my $item ('minimal','template','url','file') { $output .= '
'; } @@ -733,38 +760,23 @@ sub chooser { ''."\n". ' '."\n". '
'."\n". - '
'.$lt{'file'}.''; + '
'."\n". + '
'.$lt{'minimal'}.''; + if ($minimal) { + my ($absurl,$filename,$depbutton) = &syllabus_file_info($minimal,$cnum,$cdom,$lonhost,'minimal'); + $output .= ''.$lt{'pr'}.''. + ''. + $depbutton; + } else { + $output .= &mt('Title of Syllabus Page:').' '. + ''."\n". + ' '."\n"; + } + $output .= '
'."\n". + '
'."\n". + '
'.$lt{'file'}.''; if ($uploaded) { - my $protocol = $Apache::lonnet::protocol{$lonhost}; - $protocol = 'http' if ($protocol ne 'https'); - my $absurl = $protocol.'://'.&Apache::lonnet::hostname($lonhost).$uploaded; - my ($filename) = ($uploaded =~ m{([^/]+)$}); - my $file=&Apache::lonnet::filelocation("",$uploaded); - my $depbutton; - if ($file =~ /\.html?$/) { - my $filecontents=&Apache::lonnet::getfile($file); - unless ($filecontents eq -1) { - my $mm = new File::MMagic; - my $mimetype = $mm->checktype_contents($filecontents); - if ($mimetype eq 'text/html') { - my (%codebase,%allfiles); - my $parse_result = &Apache::lonnet::extract_embedded_items($uploaded,\%allfiles, - \%codebase,\$filecontents); - my $actionurl = "/public/$cdom/$cnum/syllabus"; - my ($ignore,$num,$numpathchanges,$existing,$mapping) = - &Apache::loncommon::ask_for_embedded_content($actionurl,undef,\%allfiles, - \%codebase, - {'context' => 'rewrites', - 'ignore_remote_references' => 1,}); - if (keys(%allfiles)) { - $depbutton = (' ' x 3). - &editfile_button(). - &editbutton_js($uploaded); - } - } - } - } - + my ($absurl,$filename,$depbutton) = &syllabus_file_info($uploaded,$cnum,$cdom,$lonhost,'file'); $output .= ''.$lt{'curr'}.' '. ''. ''.$filename.''.$depbutton. @@ -772,7 +784,6 @@ sub chooser { } else { $output .= $lt{'upl'}; } - $output .= '
'."\n". ''. ''."\n". @@ -799,6 +810,38 @@ sub chooser { return $output; } +sub syllabus_file_info { + my ($item,$cnum,$cdom,$lonhost,$context) = @_; + my $protocol = $Apache::lonnet::protocol{$lonhost}; + $protocol = 'http' if ($protocol ne 'https'); + my $absurl = $protocol.'://'.&Apache::lonnet::hostname($lonhost).$item; + my ($filename) = ($item =~ m{([^/]+)$}); + my $file=&Apache::lonnet::filelocation("",$item); + my $depbutton; + if ($file =~ /\.html?$/) { + my $filecontents=&Apache::lonnet::getfile($file); + unless ($filecontents eq -1) { + my $mm = new File::MMagic; + my $mimetype = $mm->checktype_contents($filecontents); + if ($mimetype eq 'text/html') { + my (%codebase,%allfiles); + my $parse_result = &Apache::lonnet::extract_embedded_items($item,\%allfiles, + \%codebase,\$filecontents); + my $actionurl = "/public/$cdom/$cnum/syllabus"; + my ($ignore,$num,$numpathchanges,$existing,$mapping) = + &Apache::loncommon::ask_for_embedded_content($actionurl,undef,\%allfiles, + \%codebase, + {'context' => 'rewrites', + 'ignore_remote_references' => 1,}); + $depbutton = (' ' x 3). + &editfile_button($item,$context). + &editbutton_js(); + } + } + } + return ($absurl,$filename,$depbutton); +} + sub fields_check_uncheck { my ($fields,$values) = @_; return unless ((ref($fields) eq 'HASH') && (ref($values) eq 'HASH')); @@ -927,13 +970,34 @@ sub get_personnel { } sub save_changes { - my ($cnum,$cdom,$uploaded,$external,$syllabus,$syllabusfields,$courseenv) = @_; + my ($cnum,$cdom,$uploaded,$external,$minimal,$syllabus,$syllabusfields,$courseenv) = @_; my ($earlyout,$output); unless ((ref($syllabus) eq 'HASH') && (ref($syllabusfields) eq 'HASH')) { - return ($earlyout,$uploaded,$external,$output); + return ($earlyout,$uploaded,$external,$minimal,$output); } + if ($env{'form.deleteuploaded'}) { + my %storehash; + if (($env{'form.choice'} eq 'file') && + ($env{'form.deleteuploaded'} eq 'file') && ($uploaded =~ /\w/)) { + &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.uploadedsyllabus'); + &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus'); + $storehash{'uploadedsyllabus'} = ''; + $storehash{'externalsyllabus'} = ''; + my $putres = &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum); + undef($uploaded); + undef($external); + } elsif (($env{'form.choice'} eq 'minimal') && + ($env{'form.deleteuploaded'} eq 'minimal') && ($minimal =~ /\w/)) { + &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus'); + &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.minimalsyllabus'); + $storehash{'externalsyllabus'} = ''; + $storehash{'minimalsyllabus'} = ''; + my $putres = &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum); + undef($external); + undef($minimal); + } + } elsif ($env{'form.choice'} eq 'template') { #store what the user typed in to the template - if ($env{'form.choice'} eq 'template') { my @shown = &Apache::loncommon::get_env_multiple('form.showfield'); $syllabus->{'uploaded.fields'} = ''; if (@shown == 0) { @@ -1004,12 +1068,18 @@ sub save_changes { &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus'); $storehash{'externalsyllabus'} = ''; } + if ($courseenv->{'minimalsyllabus'}) { + &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.minimalsyllabus'); + $storehash{'minimalsyllabus'} = ''; + } $storehash{'updatedsyllabus'} = $now; &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum); &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.updatedsyllabus' => $now}); - if ($courseenv->{'externalsyllabus'} || $courseenv->{'uploadedsyllabus'}) { + if (($courseenv->{'externalsyllabus'} || $courseenv->{'uploadedsyllabus'}) || + ($courseenv->{'minimalsyllabus'})) { undef($uploaded); undef($external); + undef($minimal); } $output = '
'. &Apache::lonhtmlcommon::confirm_success(&mt('Template saved.')). @@ -1038,7 +1108,6 @@ sub save_changes { &Apache::lonnet::put('environment',{uploadedsyllabus => ''}, $cdom,$cnum); undef($uploaded); - $earlyout = 1; } } } else { @@ -1078,48 +1147,98 @@ sub save_changes { &mt('External URL not saved -- invalid URL.'). '
'; } - } elsif ($env{'form.choice'} eq 'file') { + } elsif (($env{'form.choice'} eq 'file') || ($env{'form.choice'} eq 'minimal')) { # Process file upload - phase one - upload and parse primary file. - my %allfiles = (); - my %codebase = (); - my ($upload_result,$uploadphase); - if ($env{'form.syllabusfile.filename'}) { - my ($url,$needlink) = &process_upload(\$output,$cnum,$cdom, - \%allfiles,\%codebase); - if ($url =~ m{^/uploaded/\Q$cdom\E/\Q$cnum\E.*/[^/]+$}) { - my $exturl; - my $home=&Apache::lonnet::homeserver($cnum,$cdom); - if ($home ne 'no_host') { - my $protocol = $Apache::lonnet::protocol{$home}; - $protocol = 'http' if ($protocol ne 'https'); - $exturl = $protocol.'://'.&Apache::lonnet::hostname($home).$url; - } - my %storehash = ( - uploadedsyllabus => $url, - ); - if ($exturl) { - $storehash{'externalsyllabus'} = $exturl; - if ($exturl =~ /\.(html?|txt|js|css)$/) { - $exturl .= '?inhibitmenu=yes'; - } - } else { - $storehash{'externalsyllabus'} = '', + my ($upload_result,$uploadphase,$url,$needlink,$error,$errormsg); + if ($env{'form.choice'} eq 'file') { + if ($env{'form.syllabusfile.filename'}) { + my %allfiles = (); + my %codebase = (); + ($url,$needlink) = &process_upload(\$output,$cnum,$cdom, + \%allfiles,\%codebase); + } else { + $output = '
'; + &mt('No file uploaded'). + '
'; + } + } elsif ($env{'form.choice'} eq 'minimal') { + my $title = $env{'form.syllabustitle'}; + $title =~ s{`}{}g; + $title=~s/^\s+//; + $title=~s/\s+$//; + if ($title eq '') { + $title = &mt('Syllabus'); + } + my $initialtext = &mt('Replace with your own content.'); + my $newhtml = < + +$title + + +

$title

+$initialtext + + +END + $env{'form.output'}=$newhtml; + $url = + &Apache::lonnet::finishuserfileupload($cnum,$cdom,'output', + 'portfolio/syllabus/loncapa.html'); + } + if ($url =~ m{^/uploaded/\Q$cdom\E/\Q$cnum\E.*/[^/]+$}) { + my $exturl; + my $home=&Apache::lonnet::homeserver($cnum,$cdom); + if ($home ne 'no_host') { + my $protocol = $Apache::lonnet::protocol{$home}; + $protocol = 'http' if ($protocol ne 'https'); + $exturl = $protocol.'://'.&Apache::lonnet::hostname($home).$url; + } + my %storehash; + if ($env{'form.choice'} eq 'minimal') { + $storehash{'minimalsyllabus'} = $url; + } else { + $storehash{'uploadedsyllabus'} = $url; + } + if ($exturl) { + $storehash{'externalsyllabus'} = $exturl; + if ($exturl =~ /\.(html?|txt|js|css)$/) { + $exturl .= '?inhibitmenu=yes'; } - my $putres = - &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum); - if ($putres eq 'ok') { - &Apache::lonnet::make_public_indefinitely($url); - foreach my $key (keys(%storehash)) { - &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash{$key}}); - } + } else { + $storehash{'externalsyllabus'} = '', + } + my $putres = + &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum); + if ($putres eq 'ok') { + &Apache::lonnet::make_public_indefinitely($url); + foreach my $key (keys(%storehash)) { + &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash{$key}}); + } + if ($env{'form.choice'} eq 'minimal') { + $minimal = $url; + } else { $uploaded = $url; - if ($needlink) { - $output .= &return_to_editor($cdom,$cnum). - &Apache::loncommon::end_page(); - $earlyout = 1; - } } + if ($needlink) { + $output .= &return_to_editor($cdom,$cnum); + $earlyout = 1; + } + } else { + $error = 1; + $errormsg = $putres; + } + } else { + $error = 1; + } + if ($error) { + $output = '
'; + if ($env{'form.choice'} eq 'minimal') { + $output = &mt('An error occurred creating the minimal template file [_1]',$errormsg); + } else { + $output = &mt('An error occurred storing the uploaded file [_1]',$errormsg); } + $output .= '
'; } } elsif ($env{'form.phase'} eq 'upload_embedded') { # Process file upload - phase two - upload embedded objects @@ -1139,8 +1258,7 @@ sub save_changes { '/userfiles',$env{'form.primaryurl'}); $result .= $modres; } - $output = $result.&return_to_editor($cdom,$cnum). - &Apache::loncommon::end_page(); + $output = $result.&return_to_editor($cdom,$cnum); $earlyout = 1; } elsif ($env{'form.phase'} eq 'check_embedded') { # Process file upload - phase three - modify references in HTML file @@ -1149,11 +1267,10 @@ sub save_changes { &Apache::loncommon::modify_html_refs('syllabus','portfolio/syllabus', $cnum,$cdom, '/userfiles',$env{'form.primaryurl'}); - $output = $result.&return_to_editor($cdom,$cnum). - &Apache::loncommon::end_page(); + $output = $result.&return_to_editor($cdom,$cnum); $earlyout = 1; } - return ($earlyout,$uploaded,$external,$output); + return ($earlyout,$uploaded,$external,$minimal,$output); } sub process_upload { @@ -1241,19 +1358,27 @@ sub return_to_editor { } sub editfile_button { - my $buttontext=&mt('Edit'); + my ($url,$context) = @_; + my $edittext=&mt('Edit'); + my $deltext=&mt('Delete'); return <<"END"; - + +     + + END } sub editbutton_js { - my ($url) = @_; return < //