--- loncom/interface/londocs.pm 2008/05/28 14:21:30 1.307 +++ loncom/interface/londocs.pm 2008/12/10 21:46:58 1.318 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.307 2008/05/28 14:21:30 www Exp $ +# $Id: londocs.pm,v 1.318 2008/12/10 21:46:58 kaisler Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,8 @@ # http://www.lon-capa.org/ # + + package Apache::londocs; use strict; @@ -53,15 +55,10 @@ my %alreadyseen=(); my $hadchanges; -# Available help topics my %help=(); -# Mapread read maps into LONCAPA::map:: global arrays -# @order and @resources, determines status -# sets @order - pointer to resources in right order -# sets @resources - array with the resources with correct idx -# + sub mapread { my ($coursenum,$coursedom,$map)=@_; @@ -81,7 +78,7 @@ sub storemap { return ($errtext,0); } -# ----------------------------------------- Return hash with valid author names + sub authorhosts { my %outhash=(); @@ -116,7 +113,7 @@ sub authorhosts { } return ($home,$other,%outhash); } -# ------------------------------------------------------ Generate "dump" button + sub dumpbutton { my ($home,$other,%outhash)=&authorhosts(); @@ -141,7 +138,8 @@ sub clean { $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs; return $title; } -# -------------------------------------------------------- Actually dump course + + sub dumpcourse { my ($r) = @_; @@ -228,11 +226,19 @@ sub dumpcourse { my $title=$origcrsdata{'description'}; $title=~s/[\/\s]+/\_/gs; $title=&clean($title); - $r->print('

'.&mt('Folder in Construction Space').'


'); + $r->print('

'.&mt('Folder in Construction Space').'

' + .'
'); &tiehash(); - $r->print('

'.&mt('Filenames in Construction Space').'

'); + $r->print('

'.&mt('Filenames in Construction Space').'

' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row()); foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) { - $r->print(''); + $r->print(&Apache::loncommon::start_data_table_row() + .''); my ($ext)=($_=~/\.(\w+)$/); my $title=$hash{'title_'.$hash{ 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}}; @@ -245,16 +251,17 @@ sub dumpcourse { $title=~s/\.(\w+)$//; $title=&clean($title); $title.='.'.$ext; - $r->print("\n\n"); + $r->print("\n" + .&Apache::loncommon::end_data_table_row()); } - $r->print("
'.&mt('Internal Filename').''.&mt('Title').''.&mt('Save as ...').'
'.&mt('Internal Filename').''.&mt('Title').''.&mt('Save as ...').'
'.$_.''.$_.'
\n"); + $r->print(&Apache::loncommon::end_data_table()); &untiehash(); $r->print( - '

'); + '

'); } } -# ------------------------------------------------------ Generate "export" button + sub exportbutton { my $type = &Apache::loncommon::course_type(); @@ -264,6 +271,8 @@ sub exportbutton { &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').''; } + + sub exportcourse { my $r=shift; my $type = &Apache::loncommon::course_type(); @@ -309,10 +318,10 @@ sub exportcourse { chdir $cwd; $outcome .= &mt('Download the zip file from IMS '.lc($type).' archive
',$imszipfile,); if ($copyresult) { - $outcome .= 'The following errors occurred during export - '.$copyresult; + $outcome .= &mt('The following errors occurred during export - [_1]',$copyresult); } } else { - $outcome = '
Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.
'; + $outcome = '
'.&mt('Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.').'
'; } } $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package')); @@ -818,7 +827,7 @@ sub extract_media { $dirpath = $url; $container = ''; } - &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content); + &Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,$content); foreach my $embed_file (keys(%allfiles)) { my $filename; if ($embed_file =~ m#([^/]+)$#) { @@ -902,8 +911,7 @@ sub store_template { } } -# Imports the given (name, url) resources into the course -# coursenum, coursedom, and folder must precede the list + sub group_import { my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_; @@ -924,7 +932,7 @@ sub group_import { my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom, 'output',$1.$2); if ($result != m|^/uploaded/|) { - $errtext.='Map not saved: A network error occured when trying to save the new map. '; + $errtext.='Map not saved: A network error occurred when trying to save the new map. '; $fatal = 2; } if ($fatal) { @@ -949,7 +957,7 @@ sub group_import { } sub breadcrumbs { - my ($where)=@_; + my ($where,$allowed,$type)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); my (@folders); if ($env{'form.pagepath'}) { @@ -966,7 +974,7 @@ sub breadcrumbs { my $is_random_order=0; while (@folders) { my $folder=shift(@folders); - my $foldername=shift(@folders); + my $foldername=shift(@folders); if ($folderpath) {$folderpath.='&';} $folderpath.=$folder.'&'.$foldername; my $url='/adm/coursedocs?folderpath='. @@ -982,6 +990,13 @@ sub breadcrumbs { if ($2) { $ishidden=1; } if ($3) { $isencrypted=1; } if ($4 ne '') { $is_random_order = 1; } + if ($folder eq 'supplemental') { + if ($allowed) { + $name = &mt('Supplemental '.$type.' Documents'); + } else { + $name = &mt($type.' Documents'); + } + } &Apache::lonhtmlcommon::add_breadcrumb( {'href'=>$url.$cpinfo, 'title'=>$name, @@ -1058,9 +1073,9 @@ sub log_docs { } -# -# Docs Change Log -# + + + sub docs_change_log { my ($r)=@_; my $folder=$env{'form.folder'}; @@ -1201,7 +1216,10 @@ sub update_paste_buffer { # Mark for copying my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); if (&is_supplemental_title($title)) { + &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title}); ($title) = &parse_supplemental_title($title); + } elsif ($env{'docs.markedcopy_supplemental'}) { + &Apache::lonnet::delenv('docs\\.markedcopy_supplemental'); } $url=~s{http(:|:)//https(:|:)//}{https$2//}; @@ -1250,7 +1268,7 @@ ENDPASTE } sub do_paste_from_buffer { - my ($coursenum,$coursedom) = @_; + my ($coursenum,$coursedom,$folder) = @_; return 0 if (!$env{'form.pastemarked'}); @@ -1292,6 +1310,20 @@ sub do_paste_from_buffer { $url = &LONCAPA::map::qtunescape($url); # Now insert the URL at the bottom my $newidx = &LONCAPA::map::getresidx($url); + if ($env{'docs.markedcopy_supplemental'}) { + if ($folder =~ /^supplemental/) { + $title = $env{'docs.markedcopy_supplemental'}; + } else { + (undef,undef,$title) = + &parse_supplemental_title($env{'docs.markedcopy_supplemental'}); + } + } else { + if ($folder=~/^supplemental/) { + $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'. + $env{'user.domain'}.'___&&&___'.$title; + } + } + $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; push(@LONCAPA::map::order, $newidx); # Store the result @@ -1370,7 +1402,7 @@ sub handle_edit_cmd { } sub editor { - my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$which)=@_; + my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_; my $container= ($env{'form.pagepath'}) ? 'page' : 'sequence'; @@ -1387,7 +1419,7 @@ sub editor { } my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)= - &breadcrumbs($folder); + &breadcrumbs($folder,$allowed,$type); $r->print($breadcrumbtrail); # ------------------------------------------------------------ Process commands @@ -1412,7 +1444,7 @@ sub editor { } if ($env{'form.pastemarked'}) { - &do_paste_from_buffer($coursenum,$coursedom); + &do_paste_from_buffer($coursenum,$coursedom,$folder); ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container); return $errtext if ($fatal); } @@ -1489,8 +1521,9 @@ sub editor { $r->print(''.&mt('Currently no documents.').''); } $r->print("\n\n"); - - &print_paste_buffer($r,$container); + if ($allowed) { + &print_paste_buffer($r,$container); + } return; } @@ -1571,8 +1604,8 @@ sub process_file_upload { $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.
'. - &ask_for_embedded_content('/adm/coursedocs', - $state,$allfiles,$codebase); + &Apache::loncommon::ask_for_embedded_content( + '/adm/coursedocs',$state,$allfiles,$codebase); } else { $$upload_output .= 'No embedded items identified
'; } @@ -1582,55 +1615,6 @@ sub process_file_upload { return $phase_status; } -sub ask_for_embedded_content { - my ($actionurl,$state,$allfiles,$codebase,$args)=@_; - my $upload_output = ' -
'; - $upload_output .= $state; - $upload_output .= 'Upload embedded files:
'. - &Apache::loncommon::start_data_table(); - - my $num = 0; - foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) { - $upload_output .= &Apache::loncommon::start_data_table_row(). - ''.$embed_file.''; - if ($args->{'ignore_remote_references'} - && $embed_file =~ m{^\w+://}) { - $upload_output.=''.&mt("URL points to other server.").''; - } elsif ($args->{'error_on_invalid_names'} - && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { - - $upload_output.=''.&mt("Invalid characters").''; - - } else { - - $upload_output .=' - - '; - my $attrib = join(':',@{$$allfiles{$embed_file}}); - $upload_output .= - "\n\t\t". - ''; - if (exists($$codebase{$embed_file})) { - $upload_output .= - "\n\t\t". - ''; - } - } - $upload_output .= ''.&Apache::loncommon::end_data_table_row(); - $num++; - } - $upload_output .= &Apache::loncommon::end_data_table().'
- - - '.&mt('(only files for which a location has been provided will be uploaded)').' -
'; - return $upload_output; -} - sub process_secondary_uploads { my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_; my $folder=$env{'form.folder'}; @@ -1979,7 +1963,13 @@ ENDPARMS return $line; } -# ---------------------------------------------------------------- tie the hash +=pod + +=item tiehash() + +tie the hash + +=cut sub tiehash { my ($mode)=@_; @@ -2005,7 +1995,8 @@ sub untiehash { return OK; } -# --------------------------------------------------------------- check on this + + sub checkonthis { my ($r,$url,$level,$title)=@_; @@ -2014,6 +2005,9 @@ sub checkonthis { $r->rflush(); if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) { $r->print("\n
"); + if ($level==0) { + $r->print("
"); + } for (my $i=0;$i<=$level*5;$i++) { $r->print(' '); } @@ -2023,7 +2017,7 @@ sub checkonthis { my $result=&Apache::lonnet::repcopy( &Apache::lonnet::filelocation('',$url)); if ($result eq 'ok') { - $r->print(''.&mt('ok').''); + $r->print(''.&mt('ok').''); $r->rflush(); &Apache::lonnet::countacc($url); $url=~/\.(\w+)$/; @@ -2033,7 +2027,7 @@ sub checkonthis { for (my $i=0;$i<=$level*5;$i++) { $r->print(' '); } - $r->print('- '.&mt('Rendering').': '); + $r->print('- '.&mt('Rendering:').' '); my ($errorcount,$warningcount)=split(/:/, &Apache::lonnet::ssi_body($url, ('grade_target'=>'web', @@ -2042,13 +2036,11 @@ sub checkonthis { ($warningcount)) { if ($errorcount) { $r->print(''. - $errorcount.' '. - &mt('error(s)').' '); + &mt('[quant,_1,error]',$errorcount).''); } if ($warningcount) { $r->print(''. - $warningcount.' '. - &mt('warning(s)').''); + &mt('[quant,_1,warning]',$warningcount).''); } } else { $r->print(''.&mt('ok').''); @@ -2066,21 +2058,27 @@ sub checkonthis { $r->print(''.&mt('connection down').''); } elsif ($result eq 'not_found') { unless ($url=~/\$/) { - $r->print(''.&mt('not found').''); + $r->print(''.&mt('not found').''); } else { $r->print(''.&mt('unable to verify variable URL').''); } } else { $r->print(''.&mt('access denied').''); } - } - } + } + } } -# -# ----------------------------------------------------------------- List Symbs -# + +=pod + +=item list_symbs() + +List Symbs + +=cut + sub list_symbs { my ($r) = @_; @@ -2096,9 +2094,7 @@ sub list_symbs { } -# -# -------------------------------------------------------------- Verify Content -# + sub verifycontent { my ($r) = @_; my $type = &Apache::loncommon::course_type(); @@ -2129,8 +2125,6 @@ sub verifycontent { } -# -------------------------------------------------------------- Check Versions - sub devalidateversioncache { my $src=shift; &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'. @@ -2433,7 +2427,6 @@ sub changewarning { $help{'Caching'}.''."\n\n"); } -# =========================================== Breadcrumbs for special functions sub init_breadcrumbs { my ($form,$text)=@_; @@ -2449,7 +2442,9 @@ sub init_breadcrumbs { bug=>'Instructor Interface'}); } -# ================================================================ Main Handler + + + sub handler { my $r = shift; &Apache::loncommon::content_type($r,'text/html'); @@ -2525,6 +2520,11 @@ sub handler { if ($env{'form.pagepath'}) { $env{'form.folderpath'}=''; } + if ($env{'form.folderpath'} =~ /^supplemental_\d+/) { + $env{'form.folderpath'} = 'supplemental&'. + &escape(&mt('Supplemental '.$type.' Documents')).'&'. + $env{'form.folderpath'}; + } &Apache::loncommon::store_course_settings('docs_folderpath', {'pagepath' => 'scalar', 'folderpath' => 'scalar'}); @@ -2578,8 +2578,9 @@ sub handler { } # -------------------------------------------------------------------- Body tag $script = ''; + my @brcrum = [{href=>"/adm/createuser",text=>"$type Documents"}]; $r->print(&Apache::loncommon::start_page("$type Documents", $script, - {'force_register' => $showdoc,}). + {'force_register' => $showdoc, bread_crumbs => @brcrum}). &Apache::loncommon::help_open_menu('','',273,'RAT')); my %allfiles = (); @@ -2789,7 +2790,7 @@ ENDCOURSEVERIFY } $hadchanges=0; my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed, - $upload_output); + $upload_output,$type); if ($error) { $r->print('

'.$error.'

'); } @@ -3035,11 +3036,11 @@ ENDBLOCK $folder='supplemental'; } if ($folder =~ /^supplemental$/ && - $env{'form.folderpath'} =~ /^default\&/) { - $env{'form.folderpath'}='supplemental&'. - &escape(&mt('Supplemental '.$type.' Documents')); + (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) { + $env{'form.folderpath'} = 'supplemental&'. + &escape(&mt('Supplemental '.$type.' Documents')); } - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed); + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type); if ($error) { $r->print('

'.$error.'

'); } @@ -3349,3 +3350,126 @@ ENDNEWSCRIPT } 1; __END__ + + +=head1 NAME + +Apache::londocs.pm + +=head1 SYNOPSIS + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=item %help=() + +Available help topics + +=item mapread() + +Mapread read maps into LONCAPA::map:: global arrays +@order and @resources, determines status +sets @order - pointer to resources in right order +sets @resources - array with the resources with correct idx + +=item authorhosts() + +Return hash with valid author names + +=item dumpbutton() + +Generate "dump" button + +=item clean() + +=item dumpcourse() + + Actually dump course + + +=item exportbutton() + + Generate "export" button + +=item exportcourse() + +=item create_ims_store() + +=item build_package() + +=item get_dependencies() + +=item process_content() + +=item replicate_content() + +=item extract_media() + +=item store_template() + +=item group_import() + + Imports the given (name, url) resources into the course + coursenum, coursedom, and folder must precede the list + +=item breadcrumbs() + +=item log_docs() + +=item docs_change_log() + +=item update_paste_buffer() + +=item print_paste_buffer() + +=item do_paste_from_buffer() + +=item update_parameter() + +=item handle_edit_cmd() + +=item editor() + +=item process_file_upload() + +=item process_secondary_uploads() + +=item is_supplemental_title() + +=item parse_supplemental_title() + +=item entryline() + +=item tiehash() + +=item untiehash() + +=item checkonthis() + +check on this + +=item verifycontent() + +Verify Content + +=item devalidateversioncache() & checkversions() + +Check Versions + +=item mark_hash_old() + +=item is_hash_old() + +=item changewarning() + +=item init_breadcrumbs() + +Breadcrumbs for special functions + +=back + +=cut