Annotation of loncom/interface/londocs.pm, revision 1.320
1.1 www 1: # The LearningOnline Network
1.2 www 2: # Documents
1.1 www 3: #
1.320 ! raeburn 4: # $Id: londocs.pm,v 1.319 2008/12/11 14:55:15 bisitz Exp $
1.1 www 5: #
1.3 www 6: # Copyright Michigan State University Board of Trustees
1.1 www 7: #
1.3 www 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
1.1 www 9: #
1.3 www 10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
1.1 www 14: #
1.3 www 15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28:
1.315 jms 29:
30:
1.2 www 31: package Apache::londocs;
1.1 www 32:
33: use strict;
1.28 www 34: use Apache::Constants qw(:common :http);
1.158 raeburn 35: use Apache::imsexport;
1.4 www 36: use Apache::lonnet;
37: use Apache::loncommon;
1.245 albertel 38: use LONCAPA::map();
39: use Apache::lonratedt();
1.15 www 40: use Apache::lonxml;
1.244 albertel 41: use Apache::lonclonecourse;
1.138 raeburn 42: use Apache::lonnavmaps;
1.38 www 43: use HTML::Entities;
1.27 www 44: use GDBM_File;
1.81 www 45: use Apache::lonlocal;
1.143 raeburn 46: use Cwd;
1.264 albertel 47: use LONCAPA qw(:DEFAULT :match);
1.7 www 48:
1.8 www 49: my $iconpath;
1.7 www 50:
1.27 www 51: my %hash;
52:
53: my $hashtied;
1.29 www 54: my %alreadyseen=();
1.27 www 55:
1.40 www 56: my $hadchanges;
57:
1.315 jms 58:
1.47 www 59: my %help=();
60:
1.315 jms 61:
1.7 www 62:
63: sub mapread {
64: my ($coursenum,$coursedom,$map)=@_;
65: return
1.245 albertel 66: &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
67: $map);
1.7 www 68: }
69:
70: sub storemap {
71: my ($coursenum,$coursedom,$map)=@_;
1.104 albertel 72: my ($outtext,$errtext)=
1.245 albertel 73: &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
74: $map,1);
1.104 albertel 75: if ($errtext) { return ($errtext,2); }
76:
77: $hadchanges=1;
78: return ($errtext,0);
1.7 www 79: }
80:
1.315 jms 81:
1.74 www 82:
83: sub authorhosts {
84: my %outhash=();
85: my $home=0;
86: my $other=0;
1.320 ! raeburn 87: foreach my $key (keys(%env)) {
! 88: if ($key=~/^user\.role\.(au|ca)\.(.+)$/) {
1.74 www 89: my $role=$1;
90: my $realm=$2;
1.320 ! raeburn 91: my ($start,$end)=split(/\./,$env{$key});
1.74 www 92: if (($start) && ($start>time)) { next; }
93: if (($end) && (time>$end)) { next; }
1.320 ! raeburn 94: my ($ca,$cd);
1.74 www 95: if ($1 eq 'au') {
1.174 albertel 96: $ca=$env{'user.name'};
97: $cd=$env{'user.domain'};
1.74 www 98: } else {
1.264 albertel 99: ($cd,$ca)=($realm=~/^\/($match_domain)\/($match_username)$/);
1.74 www 100: }
1.107 albertel 101: my $allowed=0;
102: my $myhome=&Apache::lonnet::homeserver($ca,$cd);
103: my @ids=&Apache::lonnet::current_machine_ids();
104: foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }
105: if ($allowed) {
1.74 www 106: $home++;
107: $outhash{'home_'.$ca.'@'.$cd}=1;
108: } else {
1.107 albertel 109: $outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;
1.74 www 110: $other++;
111: }
112: }
113: }
114: return ($home,$other,%outhash);
115: }
1.315 jms 116:
1.74 www 117:
118: sub dumpbutton {
119: my ($home,$other,%outhash)=&authorhosts();
1.230 albertel 120: my $type = &Apache::loncommon::course_type();
1.74 www 121: if ($home+$other==0) { return ''; }
122: if ($home) {
1.283 albertel 123: return '<div>'.
1.81 www 124: '<input type="submit" name="dumpcourse" value="'.
1.230 albertel 125: &mt('Dump '.$type.' DOCS to Construction Space').'" />'.
1.283 albertel 126: &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs').
127: '</div>';
1.74 www 128: } else {
1.283 albertel 129: return '<div>'.
1.230 albertel 130: &mt('Dump '.$type.
1.283 albertel 131: ' DOCS to Construction Space: available on other servers').
132: '</div>';
1.74 www 133: }
134: }
135:
1.164 albertel 136: sub clean {
137: my ($title)=@_;
138: $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
139: return $title;
140: }
1.315 jms 141:
142:
1.74 www 143:
144: sub dumpcourse {
1.224 albertel 145: my ($r) = @_;
1.230 albertel 146: my $type = &Apache::loncommon::course_type();
147: $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
148: '<form name="dumpdoc" method="post">');
1.257 www 149: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' DOCS to Construction Space'));
1.74 www 150: my ($home,$other,%outhash)=&authorhosts();
1.75 www 151: unless ($home) { return ''; }
1.174 albertel 152: my $origcrsid=$env{'request.course.id'};
1.76 www 153: my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
1.174 albertel 154: if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
1.76 www 155: # Do the dumping
1.174 albertel 156: unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; }
157: my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});
1.87 www 158: $r->print('<h3>'.&mt('Copying Files').'</h3>');
1.174 albertel 159: my $title=$env{'form.authorfolder'};
1.164 albertel 160: $title=&clean($title);
1.79 www 161: my %replacehash=();
1.320 ! raeburn 162: foreach my $key (keys(%env)) {
! 163: if ($key=~/^form\.namefor\_(.+)/) {
! 164: $replacehash{$1}=$env{$key};
1.79 www 165: }
166: }
1.174 albertel 167: my $crs='/uploaded/'.$env{'request.course.id'}.'/';
1.79 www 168: $crs=~s/\_/\//g;
1.320 ! raeburn 169: foreach my $item (keys(%replacehash)) {
! 170: my $newfilename=$title.'/'.$replacehash{$item};
1.205 albertel 171: $newfilename=~s/\.(\w+)$//;
172: my $ext=$1;
1.164 albertel 173: $newfilename=&clean($newfilename);
1.205 albertel 174: $newfilename.='.'.$ext;
1.79 www 175: my @dirs=split(/\//,$newfilename);
176: my $path='/home/'.$ca.'/public_html';
177: my $makepath=$path;
178: my $fail=0;
179: for (my $i=0;$i<$#dirs;$i++) {
180: $makepath.='/'.$dirs[$i];
181: unless (-e $makepath) {
182: unless(mkdir($makepath,0777)) { $fail=1; }
183: }
184: }
1.320 ! raeburn 185: $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ');
1.79 www 186: if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
1.320 ! raeburn 187: if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
1.244 albertel 188: print $fh &Apache::lonclonecourse::rewritefile(
1.320 ! raeburn 189: &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),
1.79 www 190: (%replacehash,$crs => '')
191: );
192: } else {
193: print $fh
1.320 ! raeburn 194: &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);
1.79 www 195: }
196: $fh->close();
197: } else {
198: $fail=1;
199: }
200: if ($fail) {
1.283 albertel 201: $r->print('<span class="LC_error">'.&mt('fail').'</span>');
1.79 www 202: } else {
1.283 albertel 203: $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.79 www 204: }
205: }
1.76 www 206: } else {
207: # Input form
208: unless ($home==1) {
209: $r->print(
1.81 www 210: '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');
1.76 www 211: }
1.320 ! raeburn 212: foreach my $key (sort(keys(%outhash))) {
! 213: if ($key=~/^home_(.+)$/) {
1.76 www 214: if ($home==1) {
215: $r->print(
216: '<input type="hidden" name="authorspace" value="'.$1.'" />');
217: } else {
1.133 www 218: $r->print('<option value="'.$1.'">'.$1.' - '.
219: &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');
1.76 www 220: }
221: }
222: }
223: unless ($home==1) {
224: $r->print('</select>');
225: }
226: my $title=$origcrsdata{'description'};
1.227 albertel 227: $title=~s/[\/\s]+/\_/gs;
1.164 albertel 228: $title=&clean($title);
1.314 bisitz 229: $r->print('<h3>'.&mt('Folder in Construction Space').'</h3>'
230: .'<input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
1.76 www 231: &tiehash();
1.314 bisitz 232: $r->print('<h3>'.&mt('Filenames in Construction Space').'</h3>'
233: .&Apache::loncommon::start_data_table()
234: .&Apache::loncommon::start_data_table_header_row()
235: .'<th>'.&mt('Internal Filename').'</th>'
236: .'<th>'.&mt('Title').'</th>'
237: .'<th>'.&mt('Save as ...').'</th>'
238: .&Apache::loncommon::end_data_table_header_row());
1.320 ! raeburn 239: foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
1.314 bisitz 240: $r->print(&Apache::loncommon::start_data_table_row()
1.320 ! raeburn 241: .'<td>'.$file.'</td>');
! 242: my ($ext)=($file=~/\.(\w+)$/);
1.78 www 243: my $title=$hash{'title_'.$hash{
1.320 ! raeburn 244: 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};
1.78 www 245: $r->print('<td>'.($title?$title:' ').'</td>');
1.235 albertel 246: if (!$title) {
1.320 ! raeburn 247: $title=$file;
1.235 albertel 248: } else {
249: $title=~s|/|_|g;
1.78 www 250: }
251: $title=~s/\.(\w+)$//;
1.164 albertel 252: $title=&clean($title);
1.78 www 253: $title.='.'.$ext;
1.320 ! raeburn 254: $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"
1.314 bisitz 255: .&Apache::loncommon::end_data_table_row());
1.76 www 256: }
1.314 bisitz 257: $r->print(&Apache::loncommon::end_data_table());
1.76 www 258: &untiehash();
259: $r->print(
1.314 bisitz 260: '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $type DOCS").'" /></p></form>');
1.75 www 261: }
1.74 www 262: }
1.76 www 263:
1.315 jms 264:
1.138 raeburn 265:
266: sub exportbutton {
1.230 albertel 267: my $type = &Apache::loncommon::course_type();
1.283 albertel 268: return '<div>'.
1.138 raeburn 269: '<input type="submit" name="exportcourse" value="'.
1.230 albertel 270: &mt('Export '.$type.' to IMS').'" />'.
1.283 albertel 271: &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'</div>';
1.138 raeburn 272: }
273:
1.315 jms 274:
275:
1.138 raeburn 276: sub exportcourse {
277: my $r=shift;
1.230 albertel 278: my $type = &Apache::loncommon::course_type();
1.138 raeburn 279: my %discussiontime = &Apache::lonnet::dump('discussiontimes',
1.174 albertel 280: $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
1.320 ! raeburn 281: my $numdisc = keys(%discussiontime);
1.138 raeburn 282: my $navmap = Apache::lonnavmaps::navmap->new();
283: my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
284: my $curRes;
1.143 raeburn 285: my $outcome;
1.138 raeburn 286:
287: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
288: ['finishexport']);
1.174 albertel 289: if ($env{'form.finishexport'}) {
1.138 raeburn 290: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
291: ['archive','discussion']);
292:
1.175 albertel 293: my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
294: my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
1.143 raeburn 295: if (@exportitems == 0 && @discussions == 0) {
296: $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created. Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
297: } else {
298: my $now = time;
299: my %symbs;
300: my $manifestok = 0;
301: my $imsresources;
302: my $tempexport;
303: my $copyresult;
304: my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
305: if ($manifestok) {
1.157 raeburn 306: &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
1.143 raeburn 307: close($ims_manifest);
308:
309: #Create zip file in prtspool
310: my $imszipfile = '/prtspool/'.
1.174 albertel 311: $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
1.143 raeburn 312: time.'_'.rand(1000000000).'.zip';
313: my $cwd = &Cwd::getcwd();
314: my $imszip = '/home/httpd/'.$imszipfile;
315: chdir $tempexport;
316: open(OUTPUT, "zip -r $imszip * 2> /dev/null |");
317: close(OUTPUT);
318: chdir $cwd;
1.230 albertel 319: $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,);
1.143 raeburn 320: if ($copyresult) {
1.312 bisitz 321: $outcome .= &mt('The following errors occurred during export - [_1]',$copyresult);
1.138 raeburn 322: }
1.143 raeburn 323: } else {
1.312 bisitz 324: $outcome = '<br />'.&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.').'<br />';
1.138 raeburn 325: }
326: }
1.229 raeburn 327: $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
1.257 www 328: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
1.143 raeburn 329: $r->print($outcome);
1.224 albertel 330: $r->print(&Apache::loncommon::end_page());
1.138 raeburn 331: } else {
332: my $display;
333: $display = '<form name="exportdoc" method="post">'."\n";
1.230 albertel 334: $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />');
1.138 raeburn 335: $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
336: '<tr><td><fieldset><legend> <b>Content items</b></legend>'.
337: '<input type="button" value="check all" '.
338: 'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
339: ' <input type="button" value="uncheck all"'.
340: ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
341: '<td> </td><td> </td>'.
342: '<td align="right"><fieldset><legend> <b>Discussion posts'.
343: '</b></legend><input type="button" value="check all"'.
344: ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
345: ' <input type="button" value="uncheck all"'.
346: ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
347: '</tr></table>';
348: my $curRes;
349: my $depth = 0;
350: my $count = 0;
351: my $boards = 0;
352: my $startcount = 5;
353: my %parent = ();
354: my %children = ();
355: my $lastcontainer = $startcount;
356: my @bgcolors = ('#F6F6F6','#FFFFFF');
357: $display .= '<table cellspacing="0"><tr>'.
358: '<td><b>Export content item?<br /></b></td><td> </td><td align="right">'."\n";
359: if ($numdisc > 0) {
360: $display.='<b>Export discussion posts?</b>'."\n";
361: }
362: $display.=' </td></tr>';
363: while ($curRes = $it->next()) {
364: if (ref($curRes)) {
365: $count ++;
366: }
367: if ($curRes == $it->BEGIN_MAP()) {
368: $depth++;
369: $parent{$depth} = $lastcontainer;
370: }
371: if ($curRes == $it->END_MAP()) {
372: $depth--;
373: $lastcontainer = $parent{$depth};
374: }
375: if (ref($curRes)) {
376: my $symb = $curRes->symb();
1.158 raeburn 377: my $ressymb = $symb;
1.264 albertel 378: if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
1.158 raeburn 379: unless ($ressymb =~ m|adm/wrapper/adm|) {
380: $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
381: }
382: }
1.138 raeburn 383: my $color = $count%2;
384: $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
385: '<input type="checkbox" name="archive" value="'.$count.'" ';
386: if (($curRes->is_sequence()) || ($curRes->is_page())) {
387: my $checkitem = $count + $boards + $startcount;
388: $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
389: }
390: $display .= ' />'."\n";
391: for (my $i=0; $i<$depth; $i++) {
1.282 albertel 392: $display .= '<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" /><img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" />'."\n";
1.138 raeburn 393: }
394: if ($curRes->is_sequence()) {
395: $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif"> '."\n";
396: $lastcontainer = $count + $startcount + $boards;
397: } elsif ($curRes->is_page()) {
398: $display .= '<img src="/adm/lonIcons/navmap.page.open.gif"> '."\n";
399: $lastcontainer = $count + $startcount + $boards;
400: }
401: my $currelem = $count+$boards+$startcount;
402: $children{$parent{$depth}} .= $currelem.':';
403: $display .= ' '.$curRes->title().'</td>';
1.158 raeburn 404: if ($discussiontime{$ressymb} > 0) {
1.138 raeburn 405: $boards ++;
406: $currelem = $count+$boards+$startcount;
407: $display .= '<td> </td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" /> </td>'."\n";
408: } else {
409: $display .= '<td colspan="2"> </td>'."\n";
410: }
411: }
412: }
413: my $scripttag = qq|
414: <script>
415:
416: function checkAll(field) {
1.158 raeburn 417: if (field.length > 0) {
418: for (i = 0; i < field.length; i++) {
419: field[i].checked = true ;
420: }
421: } else {
422: field.checked = true
423: }
1.138 raeburn 424: }
1.158 raeburn 425:
1.138 raeburn 426: function uncheckAll(field) {
1.158 raeburn 427: if (field.length > 0) {
428: for (i = 0; i < field.length; i++) {
429: field[i].checked = false ;
430: }
431: } else {
432: field.checked = false ;
433: }
1.138 raeburn 434: }
435:
436: function propagateCheck(item) {
437: if (document.exportdoc.elements[item].checked == true) {
438: containerCheck(item)
439: }
440: }
441:
442: function containerCheck(item) {
443: document.exportdoc.elements[item].checked = true
444: var numitems = $count + $boards + $startcount
445: var parents = new Array(numitems)
446: for (var i=$startcount; i<numitems; i++) {
447: parents[i] = new Array
448: }
449: |;
450:
1.320 ! raeburn 451: foreach my $container (sort { $a <=> $b } (keys(%children))) {
! 452: my @contents = split(/:/,$children{$container});
1.138 raeburn 453: for (my $i=0; $i<@contents; $i ++) {
454: $scripttag .= ' parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
455: }
456: }
457:
458: $scripttag .= qq|
459: if (parents[item].length > 0) {
460: for (var j=0; j<parents[item].length; j++) {
461: containerCheck(parents[item][j])
462: }
463: }
464: }
465:
466: </script>
467: |;
1.229 raeburn 468: $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
1.224 albertel 469: $scripttag));
1.257 www 470: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
1.224 albertel 471: $r->print($display.'</table>'.
1.138 raeburn 472: '<p><input type="hidden" name="finishexport" value="1">'.
473: '<input type="submit" name="exportcourse" value="'.
1.230 albertel 474: &mt('Export '.$type.' DOCS').'" /></p></form>'.
1.224 albertel 475: &Apache::loncommon::end_page());
1.138 raeburn 476: }
477: }
478:
1.143 raeburn 479: sub create_ims_store {
480: my ($now,$manifestok,$outcome,$tempexport) = @_;
481: $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
482: my $ims_manifest;
483: if (!-e $$tempexport) {
484: mkdir($$tempexport,0700);
485: }
486: $$tempexport .= '/'.$now;
487: if (!-e $$tempexport) {
488: mkdir($$tempexport,0700);
489: }
1.174 albertel 490: $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
1.143 raeburn 491: if (!-e $$tempexport) {
492: mkdir($$tempexport,0700);
493: }
1.159 raeburn 494: if (!-e "$$tempexport/resources") {
495: mkdir("$$tempexport/resources",0700);
496: }
1.143 raeburn 497: # open manifest file
498: my $manifest = '/imsmanifest.xml';
499: my $manifestfilename = $$tempexport.$manifest;
500: if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
501: $$manifestok=1;
502: print $ims_manifest
503: '<?xml version="1.0" encoding="UTF-8"?>'."\n".
504: '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
505: ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
506: ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'.
1.174 albertel 507: ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143 raeburn 508: ' xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
509: ' http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
1.199 raeburn 510: ' <metadata>
511: <schema></schema>
512: <imsmd:lom>
513: <imsmd:general>
514: <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
515: <imsmd:title>
516: <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
517: </imsmd:title>
518: </imsmd:general>
519: </imsmd:lom>
520: </metadata>'."\n".
1.174 albertel 521: ' <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
522: ' <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143 raeburn 523: ' structure="hierarchical">'."\n".
1.199 raeburn 524: ' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
1.143 raeburn 525: } else {
526: $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
527: ;
528: }
529: return $ims_manifest;
530: }
531:
532: sub build_package {
533: my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;
534: # first iterator to look for dependencies
535: my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
536: my $curRes;
537: my $count = 0;
538: my $depth = 0;
539: my $lastcontainer = 0;
540: my %parent = ();
541: my @dependencies = ();
1.174 albertel 542: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
543: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.143 raeburn 544: while ($curRes = $it->next()) {
545: if (ref($curRes)) {
546: $count ++;
547: }
548: if ($curRes == $it->BEGIN_MAP()) {
549: $depth++;
550: $parent{$depth} = $lastcontainer;
551: }
552: if ($curRes == $it->END_MAP()) {
553: $depth--;
554: $lastcontainer = $parent{$depth};
555: }
556: if (ref($curRes)) {
557: if ($curRes->is_sequence() || $curRes->is_page()) {
558: $lastcontainer = $count;
559: }
1.320 ! raeburn 560: if (grep(/^$count$/,@$exportitems)) {
1.143 raeburn 561: &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
562: }
563: }
564: }
565: # second iterator to build manifest and store resources
566: $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
567: $depth = 0;
568: my $prevdepth;
569: $count = 0;
570: my $imsresources;
571: my $pkgdepth;
1.157 raeburn 572: while ($curRes = $it->next()) {
573: if ($curRes == $it->BEGIN_MAP()) {
574: $prevdepth = $depth;
575: $depth++;
576: }
577: if ($curRes == $it->END_MAP()) {
1.143 raeburn 578: $prevdepth = $depth;
1.157 raeburn 579: $depth--;
580: }
581:
582: if (ref($curRes)) {
583: $count ++;
1.320 ! raeburn 584: if ((grep(/^$count$/,@$exportitems)) || (grep(/^$count$/,@dependencies))) {
1.157 raeburn 585: my $symb = $curRes->symb();
586: my $isvisible = 'true';
587: my $resourceref;
588: if ($curRes->randomout()) {
589: $isvisible = 'false';
590: }
591: unless ($curRes->is_sequence()) {
1.174 albertel 592: $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
1.157 raeburn 593: }
1.199 raeburn 594: my $step = $prevdepth - $depth;
595: if (($step >= 0) && ($count > 1)) {
596: while ($step >= 0) {
597: print $ims_manifest "\n".' </item>'."\n";
598: $step --;
599: }
1.157 raeburn 600: }
601: $prevdepth = $depth;
1.143 raeburn 602:
1.157 raeburn 603: my $itementry =
1.174 albertel 604: '<item identifier="ITEM-'.$env{'request.course.id'}.'-'.$count.
1.143 raeburn 605: '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
606: '<title>'.$curRes->title().'</title>';
1.157 raeburn 607: print $ims_manifest "\n".$itementry;
1.143 raeburn 608:
1.157 raeburn 609: unless ($curRes->is_sequence()) {
610: my $content_file;
611: my @hrefs = ();
612: &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
613: if ($content_file) {
614: $imsresources .= "\n".
1.174 albertel 615: ' <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
1.143 raeburn 616: '" type="webcontent" href="'.$content_file.'">'."\n".
617: ' <file href="'.$content_file.'" />'."\n";
1.320 ! raeburn 618: foreach my $item (@hrefs) {
1.157 raeburn 619: $imsresources .=
1.320 ! raeburn 620: ' <file href="'.$item.'" />'."\n";
1.157 raeburn 621: }
1.320 ! raeburn 622: if (grep(/^$count$/,@$discussions)) {
1.158 raeburn 623: my $ressymb = $symb;
624: my $mode;
1.264 albertel 625: if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
1.158 raeburn 626: unless ($ressymb =~ m|adm/wrapper/adm|) {
627: $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
628: }
629: $mode = 'board';
630: }
631: my %extras = (
632: caller => 'imsexport',
1.159 raeburn 633: tempexport => $tempexport.'/resources',
1.158 raeburn 634: count => $count
635: );
636: my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
637: }
1.157 raeburn 638: $imsresources .= ' </resource>'."\n";
1.143 raeburn 639: }
640: }
1.157 raeburn 641: $pkgdepth = $depth;
1.143 raeburn 642: }
643: }
644: }
1.157 raeburn 645: while ($pkgdepth > 0) {
1.143 raeburn 646: print $ims_manifest " </item>\n";
647: $pkgdepth --;
648: }
649: my $resource_text = qq|
650: </organization>
651: </organizations>
652: <resources>
653: $imsresources
654: </resources>
655: </manifest>
656: |;
657: print $ims_manifest $resource_text;
658: }
659:
660: sub get_dependencies {
661: my ($exportitems,$parent,$depth,$dependencies) = @_;
662: if ($depth > 1) {
1.320 ! raeburn 663: if ((!grep(/^$$parent{$depth}$/,@$exportitems)) && (!grep(/^$$parent{$depth}$/,@$dependencies))) {
! 664: push(@{$dependencies},$$parent{$depth});
1.143 raeburn 665: if ($depth > 2) {
666: &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
667: }
668: }
669: }
670: }
671:
672: sub process_content {
673: my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
674: my $content_type;
675: my $message;
1.158 raeburn 676: my @uploads = ();
1.157 raeburn 677: if ($curRes->is_sequence()) {
678: $content_type = 'sequence';
679: } elsif ($curRes->is_page()) {
680: $content_type = 'page'; # need to handle individual items in pages.
1.143 raeburn 681: } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
682: $content_type = 'syllabus';
1.158 raeburn 683: my $contents = &Apache::imsexport::templatedpage($content_type);
684: if ($contents) {
685: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
686: }
1.157 raeburn 687: } elsif ($symb =~ m-\.sequence___\d+___ext-) {
1.143 raeburn 688: $content_type = 'external';
1.158 raeburn 689: my $title = $curRes->title;
690: my $contents = &Apache::imsexport::external($symb,$title);
691: if ($contents) {
692: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
693: }
1.143 raeburn 694: } elsif ($symb =~ m-adm/navmaps$-) {
695: $content_type = 'navmap';
1.158 raeburn 696: } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
1.143 raeburn 697: $content_type = 'simplepage';
1.158 raeburn 698: my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
699: if ($contents) {
700: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
701: }
702: } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
1.143 raeburn 703: $content_type = 'simpleproblem';
1.158 raeburn 704: my $contents = &Apache::imsexport::simpleproblem($symb);
705: if ($contents) {
706: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
707: }
1.188 raeburn 708: } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
1.158 raeburn 709: $content_type = 'examupload';
1.264 albertel 710: } elsif ($symb =~ m-adm/($match_domain)/($match_username)/(\d+)/bulletinboard$-) {
1.143 raeburn 711: $content_type = 'bulletinboard';
1.158 raeburn 712: my $contents = &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
713: if ($contents) {
714: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
715: }
716: } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
1.143 raeburn 717: $content_type = 'aboutme';
1.158 raeburn 718: my $contents = &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
719: if ($contents) {
720: $$content_file = &store_template($contents,$tempexport,$count,$content_type);
721: }
1.157 raeburn 722: } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
723: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.162 raeburn 724: } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
1.143 raeburn 725: my $canedit = 0;
1.174 albertel 726: if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'}) {
1.143 raeburn 727: $canedit= 1;
728: }
1.200 raeburn 729: # only include problem code where current user is author
1.143 raeburn 730: if ($canedit) {
1.157 raeburn 731: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
1.143 raeburn 732: } else {
1.157 raeburn 733: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
1.143 raeburn 734: }
1.162 raeburn 735: } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
736: $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.143 raeburn 737: }
1.158 raeburn 738: if (@uploads > 0) {
739: foreach my $item (@uploads) {
740: my $uploadmsg = '';
1.159 raeburn 741: &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
1.158 raeburn 742: if ($uploadmsg) {
743: $$copyresult .= $uploadmsg."\n";
744: }
745: }
746: }
1.157 raeburn 747: if ($message) {
748: $$copyresult .= $message."\n";
749: }
1.143 raeburn 750: }
751:
752: sub replicate_content {
1.157 raeburn 753: my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
1.159 raeburn 754: my ($map,$ind,$url);
755: if ($caller eq 'templateupload') {
756: $url = $symb;
757: $url =~ s#//#/#g;
758: } else {
759: ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
760: }
1.143 raeburn 761: my $content;
762: my $filename;
763: my $repstatus;
1.157 raeburn 764: my $content_name;
765: if ($url =~ m-/([^/]+)$-) {
1.143 raeburn 766: $filename = $1;
767: if (!-e $tempexport.'/resources') {
768: mkdir($tempexport.'/resources',0700);
769: }
1.157 raeburn 770: if (!-e $tempexport.'/resources/'.$count) {
1.143 raeburn 771: mkdir($tempexport.'/resources/'.$count,0700);
772: }
1.157 raeburn 773: my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
1.143 raeburn 774: my $copiedfile;
775: if ($copiedfile = Apache::File->new('>'.$destination)) {
776: my $content;
1.157 raeburn 777: if ($caller eq 'resource') {
1.197 raeburn 778: my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
779: my $filepath = &Apache::lonnet::filelocation($respath,$url);
780: $content = &Apache::lonnet::getfile($filepath);
1.143 raeburn 781: if ($content eq -1) {
782: $$message = 'Could not copy file '.$filename;
783: } else {
1.197 raeburn 784: &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
1.143 raeburn 785: $repstatus = 'ok';
786: }
1.162 raeburn 787: } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
1.143 raeburn 788: my $rtncode;
1.157 raeburn 789: $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
790: if ($repstatus eq 'ok') {
791: if ($url =~ /\.html?$/i) {
1.197 raeburn 792: &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
1.157 raeburn 793: }
794: } else {
1.197 raeburn 795: $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
1.143 raeburn 796: }
1.162 raeburn 797: } elsif ($caller eq 'noedit') {
798: # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this.
799: $repstatus = 'ok';
800: $content = 'Not the owner of this resource';
1.143 raeburn 801: }
802: if ($repstatus eq 'ok') {
803: print $copiedfile $content;
804: }
805: close($copiedfile);
806: } else {
1.197 raeburn 807: $$message = 'Could not open destination file for '.$filename."<br />\n";
1.143 raeburn 808: }
809: } else {
1.197 raeburn 810: $$message = 'Could not determine name of file for '.$symb."<br />\n";
1.143 raeburn 811: }
1.157 raeburn 812: if ($repstatus eq 'ok') {
1.198 raeburn 813: $content_name = 'resources/'.$count.'/'.$filename;
1.157 raeburn 814: }
815: return $content_name;
816: }
817:
818: sub extract_media {
1.197 raeburn 819: my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
1.198 raeburn 820: my ($dirpath,$container);
1.197 raeburn 821: my %allfiles = ();
822: my %codebase = ();
1.198 raeburn 823: if ($url =~ m-(.*/)([^/]+)$-) {
824: $dirpath = $1;
825: $container = $2;
826: } else {
827: $dirpath = $url;
828: $container = '';
829: }
1.308 raeburn 830: &Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,$content);
1.197 raeburn 831: foreach my $embed_file (keys(%allfiles)) {
832: my $filename;
833: if ($embed_file =~ m#([^/]+)$#) {
834: $filename = $1;
835: } else {
836: $filename = $embed_file;
837: }
838: my $newname = 'res/'.$filename;
839: my ($rtncode,$embed_content,$repstatus);
840: my $embed_url;
841: if ($embed_file =~ m-^/-) {
842: $embed_url = $embed_file; # points to absolute path
843: } else {
844: if ($embed_file =~ m-https?://-) {
845: next; # points to url
846: } else {
1.198 raeburn 847: $embed_url = $dirpath.$embed_file; # points to relative path
1.197 raeburn 848: }
849: }
850: if ($caller eq 'resource') {
851: my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
852: my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url);
853: $embed_content = &Apache::lonnet::getfile($embed_path);
854: unless ($embed_content eq -1) {
855: $repstatus = 'ok';
856: }
857: } elsif ($caller eq 'uploaded') {
858:
859: $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
860: }
861: if ($repstatus eq 'ok') {
862: my $destination = $tempexport.'/resources/'.$count.'/res';
863: if (!-e "$destination") {
864: mkdir($destination,0755);
865: }
866: $destination .= '/'.$filename;
867: my $copiedfile;
868: if ($copiedfile = Apache::File->new('>'.$destination)) {
869: print $copiedfile $embed_content;
1.320 ! raeburn 870: push(@{$href},'resources/'.$count.'/res/'.$filename);
1.197 raeburn 871: my $attrib_regexp = '';
872: if (@{$allfiles{$embed_file}} > 1) {
873: $attrib_regexp = join('|',@{$allfiles{$embed_file}});
874: } else {
875: $attrib_regexp = $allfiles{$embed_file}[0];
876: }
877: $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
1.198 raeburn 878: if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
1.197 raeburn 879: $$content =~ s#\Q$embed_file\E#$newname#gi;
880: }
881: }
882: } else {
883: $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
884: }
885: }
1.157 raeburn 886: return;
1.143 raeburn 887: }
1.74 www 888:
1.158 raeburn 889: sub store_template {
890: my ($contents,$tempexport,$count,$content_type) = @_;
891: if ($contents) {
1.159 raeburn 892: if ($tempexport) {
893: if (!-e $tempexport.'/resources') {
894: mkdir($tempexport.'/resources',0700);
895: }
896: if (!-e $tempexport.'/resources/'.$count) {
897: mkdir($tempexport.'/resources/'.$count,0700);
898: }
899: my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
900: my $storetemplate;
901: if ($storetemplate = Apache::File->new('>'.$destination)) {
902: print $storetemplate $contents;
903: close($storetemplate);
904: }
905: if ($content_type eq 'external') {
1.198 raeburn 906: return 'resources/'.$count.'/'.$content_type.'.html';
1.159 raeburn 907: } else {
1.198 raeburn 908: return 'resources/'.$count.'/'.$content_type.'.xml';
1.159 raeburn 909: }
1.158 raeburn 910: }
911: }
912: }
913:
1.315 jms 914:
1.73 bowersj2 915: sub group_import {
1.277 albertel 916: my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
917:
918: while (@files) {
1.287 albertel 919: my ($name, $url, $residx) = @{ shift(@files) };
1.277 albertel 920: if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$})
921: && ($caller eq 'londocs')
922: && (!&Apache::lonnet::stat_file($url))) {
923:
1.142 raeburn 924: my $errtext = '';
925: my $fatal = 0;
926: my $newmapstr = '<map>'."\n".
927: '<resource id="1" src="" type="start"></resource>'."\n".
928: '<link from="1" to="2" index="1"></link>'."\n".
929: '<resource id="2" src="" type="finish"></resource>'."\n".
930: '</map>';
1.174 albertel 931: $env{'form.output'}=$newmapstr;
1.189 albertel 932: my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
1.142 raeburn 933: 'output',$1.$2);
934: if ($result != m|^/uploaded/|) {
1.312 bisitz 935: $errtext.='Map not saved: A network error occurred when trying to save the new map. ';
1.142 raeburn 936: $fatal = 2;
937: }
938: if ($fatal) {
939: return ($errtext,$fatal);
940: }
941: }
1.73 bowersj2 942: if ($url) {
1.288 albertel 943: if (!$residx
944: || defined($LONCAPA::map::zombies[$residx])) {
945: $residx = &LONCAPA::map::getresidx($url,$residx);
946: push(@LONCAPA::map::order, $residx);
1.287 albertel 947: }
1.73 bowersj2 948: my $ext = 'false';
1.263 albertel 949: if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
1.273 albertel 950: $url = &LONCAPA::map::qtunescape($url);
951: $name = &LONCAPA::map::qtunescape($name);
1.287 albertel 952: $LONCAPA::map::resources[$residx] =
953: join(':', ($name, $url, $ext, 'normal', 'res'));
1.73 bowersj2 954: }
955: }
1.142 raeburn 956: return &storemap($coursenum, $coursedom, $folder.'.'.$container);
1.73 bowersj2 957: }
958:
1.114 albertel 959: sub breadcrumbs {
1.309 raeburn 960: my ($where,$allowed,$type)=@_;
1.114 albertel 961: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.142 raeburn 962: my (@folders);
1.174 albertel 963: if ($env{'form.pagepath'}) {
964: @folders = split('&',$env{'form.pagepath'});
1.142 raeburn 965: } else {
1.174 albertel 966: @folders=split('&',$env{'form.folderpath'});
1.142 raeburn 967: }
1.116 albertel 968: my $folderpath;
1.168 www 969: my $cpinfo='';
1.251 www 970: my $plain='';
1.242 www 971: my $randompick=-1;
972: my $isencrypted=0;
973: my $ishidden=0;
1.296 albertel 974: my $is_random_order=0;
1.116 albertel 975: while (@folders) {
976: my $folder=shift(@folders);
1.309 raeburn 977: my $foldername=shift(@folders);
1.116 albertel 978: if ($folderpath) {$folderpath.='&';}
979: $folderpath.=$folder.'&'.$foldername;
980: my $url='/adm/coursedocs?folderpath='.
1.228 www 981: &escape($folderpath);
1.296 albertel 982: my $name=&unescape($foldername);
983: # randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername
984: $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
985: if ($1 ne '') {
1.242 www 986: $randompick=$1;
987: } else {
988: $randompick=-1;
989: }
990: if ($2) { $ishidden=1; }
991: if ($3) { $isencrypted=1; }
1.296 albertel 992: if ($4 ne '') { $is_random_order = 1; }
1.309 raeburn 993: if ($folder eq 'supplemental') {
994: if ($allowed) {
995: $name = &mt('Supplemental '.$type.' Documents');
996: } else {
997: $name = &mt($type.' Documents');
998: }
999: }
1.114 albertel 1000: &Apache::lonhtmlcommon::add_breadcrumb(
1.168 www 1001: {'href'=>$url.$cpinfo,
1.242 www 1002: 'title'=>$name,
1.117 albertel 1003: 'text'=>'<font size="+1">'.
1.266 albertel 1004: $name.'</font>',
1005: 'no_mt'=>1,
1.117 albertel 1006: });
1.251 www 1007: $plain.=$name.' > ';
1.114 albertel 1008: }
1.251 www 1009: $plain=~s/\>\;\s*$//;
1.242 www 1010: return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
1.296 albertel 1011: 'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain,$is_random_order);
1.114 albertel 1012: }
1013:
1.247 www 1014: sub log_docs {
1015: return &Apache::lonnet::instructor_log('docslog',@_);
1016: }
1017:
1018: {
1019: my @oldresources=();
1020: my @oldorder=();
1021: my $parmidx;
1022: my %parmaction=();
1023: my %parmvalue=();
1.249 www 1024: my $changedflag;
1.247 www 1025:
1026: sub snapshotbefore {
1.248 albertel 1027: @oldresources=@LONCAPA::map::resources;
1028: @oldorder=@LONCAPA::map::order;
1.247 www 1029: $parmidx=undef;
1030: %parmaction=();
1031: %parmvalue=();
1.249 www 1032: $changedflag=0;
1.247 www 1033: }
1034:
1035: sub remember_parms {
1036: my ($idx,$parameter,$action,$value)=@_;
1037: $parmidx=$idx;
1038: $parmaction{$parameter}=$action;
1039: $parmvalue{$parameter}=$value;
1.249 www 1040: $changedflag=1;
1.247 www 1041: }
1042:
1043: sub log_differences {
1.251 www 1044: my ($plain)=@_;
1.260 www 1045: my %storehash=('folder' => $plain,
1046: 'currentfolder' => $env{'form.folder'});
1.247 www 1047: if ($parmidx) {
1048: $storehash{'parameter_res'}=$oldresources[$parmidx];
1.320 ! raeburn 1049: foreach my $parm (keys(%parmaction)) {
1.247 www 1050: $storehash{'parameter_action_'.$parm}=$parmaction{$parm};
1051: $storehash{'parameter_value_'.$parm}=$parmvalue{$parm};
1052: }
1053: }
1054: my $maxidx=$#oldresources;
1.248 albertel 1055: if ($#LONCAPA::map::resources>$#oldresources) {
1056: $maxidx=$#LONCAPA::map::resources;
1.247 www 1057: }
1058: for (my $idx=0; $idx<=$maxidx; $idx++) {
1059: if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) {
1060: $storehash{'before_resources_'.$idx}=$oldresources[$idx];
1061: $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx];
1.249 www 1062: $changedflag=1;
1.247 www 1063: }
1064: if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) {
1.252 www 1065: $storehash{'before_order_res_'.$idx}=$oldresources[$oldorder[$idx]];
1066: $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.249 www 1067: $changedflag=1;
1.247 www 1068: }
1069: }
1.251 www 1070: $storehash{'maxidx'}=$maxidx;
1.249 www 1071: if ($changedflag) { &log_docs(\%storehash); }
1.247 www 1072: }
1073: }
1074:
1.315 jms 1075:
1076:
1.317 jms 1077:
1.247 www 1078:
1079: sub docs_change_log {
1080: my ($r)=@_;
1.260 www 1081: my $folder=$env{'form.folder'};
1.247 www 1082: $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
1083: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
1084: my %docslog=&Apache::lonnet::dump('nohist_docslog',
1085: $env{'course.'.$env{'request.course.id'}.'.domain'},
1086: $env{'course.'.$env{'request.course.id'}.'.num'});
1.254 albertel 1087:
1.247 www 1088: if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
1.254 albertel 1089:
1.247 www 1090: $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.
1091: '<input type="hidden" name="docslog" value="1" />');
1.254 albertel 1092:
1.247 www 1093: my %saveable_parameters = ('show' => 'scalar',);
1094: &Apache::loncommon::store_course_settings('docs_log',
1095: \%saveable_parameters);
1096: &Apache::loncommon::restore_course_settings('docs_log',
1097: \%saveable_parameters);
1098: if (!$env{'form.show'}) { $env{'form.show'}=10; }
1.254 albertel 1099: my %lt=('hiddenresource' => 'Resources hidden',
1100: 'encrypturl' => 'URL hidden',
1101: 'randompick' => 'Randomly pick',
1.296 albertel 1102: 'randomorder' => 'Randomly ordered',
1.254 albertel 1103: 'set' => 'set to',
1104: 'del' => 'deleted');
1.259 www 1105: $r->print(&Apache::loncommon::display_filter().
1.260 www 1106: '<input type="hidden" name="folder" value="'.$folder.'" />'.
1.247 www 1107: '<input type="submit" value="'.&mt('Display').'" /></form>');
1108: $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.251 www 1109: '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
1110: &mt('After').'</th>'.
1.247 www 1111: &Apache::loncommon::end_data_table_header_row());
1112: my $shown=0;
1113: foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
1.260 www 1114: if ($env{'form.displayfilter'} eq 'currentfolder') {
1115: if ($docslog{$id}{'logentry'}{'currentfolder'} ne $folder) { next; }
1116: }
1.247 www 1117: my @changes=keys(%{$docslog{$id}{'logentry'}});
1.261 www 1118: if ($env{'form.displayfilter'} eq 'containing') {
1119: my $wholeentry=$docslog{$id}{'exe_uname'}.':'.$docslog{$id}{'exe_udom'}.':'.
1120: &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},$docslog{$id}{'exe_udom'});
1121: foreach my $key (@changes) {
1122: $wholeentry.=':'.$docslog{$id}{'logentry'}{$key};
1123: }
1124: if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
1125: }
1.247 www 1126: my $count = 0;
1127: my $time =
1128: &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
1129: my $plainname =
1130: &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},
1131: $docslog{$id}{'exe_udom'});
1132: my $about_me_link =
1133: &Apache::loncommon::aboutmewrapper($plainname,
1134: $docslog{$id}{'exe_uname'},
1135: $docslog{$id}{'exe_udom'});
1136: my $send_msg_link='';
1137: if ((($docslog{$id}{'exe_uname'} ne $env{'user.name'})
1138: || ($docslog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1139: $send_msg_link ='<br />'.
1140: &Apache::loncommon::messagewrapper(&mt('Send message'),
1141: $docslog{$id}{'exe_uname'},
1142: $docslog{$id}{'exe_udom'});
1143: }
1144: $r->print(&Apache::loncommon::start_data_table_row());
1145: $r->print('<td>'.$time.'</td>
1146: <td>'.$about_me_link.
1147: '<br /><tt>'.$docslog{$id}{'exe_uname'}.
1148: ':'.$docslog{$id}{'exe_udom'}.'</tt>'.
1.249 www 1149: $send_msg_link.'</td><td>'.
1.251 www 1150: $docslog{$id}{'logentry'}{'folder'}.'</td><td>');
1151: # Before
1152: for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
1153: my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
1154: my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
1155: if ($oldname ne $newname) {
1.252 www 1156: $r->print(&LONCAPA::map::qtescape($oldname));
1.251 www 1157: }
1158: }
1.252 www 1159: $r->print('<ul>');
1160: for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
1161: if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) {
1162: $r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>');
1163: }
1164: }
1165: $r->print('</ul>');
1.251 www 1166: # After
1167: $r->print('</td><td>');
1168:
1169: for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
1170: my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
1171: my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
1.279 albertel 1172: if ($oldname ne '' && $oldname ne $newname) {
1.252 www 1173: $r->print(&LONCAPA::map::qtescape($newname));
1.251 www 1174: }
1175: }
1.252 www 1176: $r->print('<ul>');
1177: for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
1178: if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) {
1179: $r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>');
1180: }
1181: }
1182: $r->print('</ul>');
1183: if ($docslog{$id}{'logentry'}{'parameter_res'}) {
1184: $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');
1.296 albertel 1185: foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') {
1.252 www 1186: if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
1.254 albertel 1187: $r->print('<li>'.
1188: &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',
1189: $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})
1190: .'</li>');
1.252 www 1191: }
1192: }
1193: $r->print('</ul>');
1194: }
1.251 www 1195: # End
1196: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.247 www 1197: $shown++;
1198: if (!($env{'form.show'} eq &mt('all')
1199: || $shown<=$env{'form.show'})) { last; }
1200: }
1201: $r->print(&Apache::loncommon::end_data_table());
1202: }
1203:
1.281 albertel 1204: sub update_paste_buffer {
1205: my ($coursenum,$coursedom) = @_;
1206:
1207: return if (!defined($env{'form.markcopy'}));
1208: return if (!defined($env{'form.copyfolder'}));
1209: return if ($env{'form.markcopy'} < 0);
1210:
1211: my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
1212: $env{'form.copyfolder'});
1213:
1214: return if ($fatal);
1215:
1216: # Mark for copying
1217: my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
1218: if (&is_supplemental_title($title)) {
1.311 raeburn 1219: &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});
1.281 albertel 1220: ($title) = &parse_supplemental_title($title);
1.311 raeburn 1221: } elsif ($env{'docs.markedcopy_supplemental'}) {
1222: &Apache::lonnet::delenv('docs\\.markedcopy_supplemental');
1.281 albertel 1223: }
1.287 albertel 1224: $url=~s{http(:|:)//https(:|:)//}{https$2//};
1225:
1.304 raeburn 1226: &Apache::lonnet::appenv({'docs.markedcopy_title' => $title,
1227: 'docs.markedcopy_url' => $url});
1.281 albertel 1228: delete($env{'form.markcopy'});
1229: }
1230:
1231: sub print_paste_buffer {
1232: my ($r,$container) = @_;
1233: return if (!defined($env{'docs.markedcopy_url'}));
1234:
1235: $r->print(<<ENDPASTE);
1.286 albertel 1236: <form name="pasteform" action="/adm/coursedocs" method="post"><p>
1.281 albertel 1237: ENDPASTE
1238: $r->print('<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ');
1239:
1240: my $type;
1.287 albertel 1241: if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) {
1.281 albertel 1242: $type = &mt('External Resource');
1.287 albertel 1243: $r->print($type.': '.
1244: &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
1245: &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')');
1.281 albertel 1246: } else {
1247: my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];
1.299 albertel 1248: my $icon = &Apache::loncommon::icon($extension);
1249: if ($extension eq 'sequence' &&
1250: $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
1251: $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
1252: $icon .= '/folder_closed.gif';
1253: }
1.301 albertel 1254: $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
1.287 albertel 1255: $r->print($icon.$type.': '. &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})));
1.281 albertel 1256: }
1257: if ($container eq 'page') {
1.286 albertel 1258: $r->print('
1259: <input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />
1260: <input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />
1261: ');
1.281 albertel 1262: } else {
1.286 albertel 1263: $r->print('
1264: <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
1265: ');
1.281 albertel 1266: }
1.286 albertel 1267: $r->print('</p></form>');
1.281 albertel 1268: }
1269:
1.289 albertel 1270: sub do_paste_from_buffer {
1.311 raeburn 1271: my ($coursenum,$coursedom,$folder) = @_;
1.292 albertel 1272:
1273: return 0 if (!$env{'form.pastemarked'});
1274:
1.289 albertel 1275: # paste resource to end of list
1276: my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
1277: my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
1278: # Maps need to be copied first
1279: if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) {
1280: $title=&mt('Copy of').' '.$title;
1281: my $newid=$$.time;
1282: $url=~/^(.+)\.(\w+)$/;
1283: my $newurl=$1.$newid.'.'.$2;
1284: my $storefn=$newurl;
1285: $storefn=~s{^/\w+/$match_domain/$match_username/}{};
1286: &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
1287: &Apache::lonnet::getfile($url));
1288: $url = $newurl;
1289: }
1.290 albertel 1290: # published maps can only exists once, so remove it from paste buffer when done
1.289 albertel 1291: if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) {
1292: &Apache::lonnet::delenv('docs\\.markedcopy');
1293: }
1.290 albertel 1294: if ($url=~ m{/smppg$}) {
1295: my $db_name = &Apache::lonsimplepage::get_db_name($url);
1296: if ($db_name =~ /^smppage_/) {
1297: #simple pages, need to copy the db contents to a new one.
1298: my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
1299: my $now = time();
1300: $db_name =~ s{_\d*$ }{_$now}x;
1301: my $result=&Apache::lonnet::put($db_name,\%contents,
1302: $coursedom,$coursenum);
1303: $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
1304: $title=&mt('Copy of').' '.$title;
1305: }
1306: }
1.289 albertel 1307: $title = &LONCAPA::map::qtunescape($title);
1308: my $ext='false';
1309: if ($url=~m{^http(|s)://}) { $ext='true'; }
1310: $url = &LONCAPA::map::qtunescape($url);
1311: # Now insert the URL at the bottom
1312: my $newidx = &LONCAPA::map::getresidx($url);
1.311 raeburn 1313: if ($env{'docs.markedcopy_supplemental'}) {
1314: if ($folder =~ /^supplemental/) {
1315: $title = $env{'docs.markedcopy_supplemental'};
1316: } else {
1317: (undef,undef,$title) =
1318: &parse_supplemental_title($env{'docs.markedcopy_supplemental'});
1319: }
1320: } else {
1321: if ($folder=~/^supplemental/) {
1322: $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
1323: $env{'user.domain'}.'___&&&___'.$title;
1324: }
1325: }
1326:
1.289 albertel 1327: $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
1328: push(@LONCAPA::map::order, $newidx);
1329: # Store the result
1.292 albertel 1330: }
1331:
1332: my %parameter_type = ( 'randompick' => 'int_pos',
1333: 'hiddenresource' => 'string_yesno',
1.296 albertel 1334: 'encrypturl' => 'string_yesno',
1335: 'randomorder' => 'string_yesno',);
1.292 albertel 1336: my $valid_parameters_re = join('|',keys(%parameter_type));
1337: # set parameters
1338: sub update_parameter {
1339:
1340: return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
1341:
1342: my $which = $env{'form.changeparms'};
1343: my $idx = $env{'form.setparms'};
1344: if ($env{'form.'.$which.'_'.$idx}) {
1345: my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx}
1346: : 'yes';
1347: &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
1348: $parameter_type{$which});
1349: &remember_parms($idx,$which,'set',$value);
1350: } else {
1351: &LONCAPA::map::delparameter($idx,'parameter_'.$which);
1352:
1353: &remember_parms($idx,$which,'del');
1354: }
1355: return 1;
1356: }
1357:
1358:
1359: sub handle_edit_cmd {
1360: my ($coursenum,$coursedom) =@_;
1361:
1362: my ($cmd,$idx)=split('_',$env{'form.cmd'});
1363:
1364: my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1365: my ($title, $url, @rrest) = split(':', $ratstr);
1366:
1367: if ($cmd eq 'del') {
1368: if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1369: ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1370: &Apache::lonnet::removeuploadedurl($url);
1371: } else {
1372: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1373: }
1374: splice(@LONCAPA::map::order, $idx, 1);
1375:
1376: } elsif ($cmd eq 'cut') {
1377: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1378: splice(@LONCAPA::map::order, $idx, 1);
1379:
1380: } elsif ($cmd eq 'up'
1381: && ($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
1382: @LONCAPA::map::order[$idx-1,$idx] = @LONCAPA::map::order[$idx,$idx-1];
1383:
1384: } elsif ($cmd eq 'down'
1385: && defined($LONCAPA::map::order[$idx+1])) {
1386: @LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1];
1387:
1388: } elsif ($cmd eq 'rename') {
1389:
1390: my $comment = &LONCAPA::map::qtunescape($env{'form.title'});
1391: if ($comment=~/\S/) {
1392: $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
1393: $comment.':'.join(':', $url, @rrest);
1394: }
1395: # Devalidate title cache
1396: my $renamed_url=&LONCAPA::map::qtescape($url);
1397: &Apache::lonnet::devalidate_title_cache($renamed_url);
1398: } else {
1399: return 0;
1400: }
1401: return 1;
1.289 albertel 1402: }
1403:
1.7 www 1404: sub editor {
1.309 raeburn 1405: my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_;
1.292 albertel 1406:
1407: my $container= ($env{'form.pagepath'}) ? 'page'
1408: : 'sequence';
1409:
1410: my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
1411: $folder.'.'.$container);
1412: return $errtext if ($fatal);
1413:
1.245 albertel 1414: if ($#LONCAPA::map::order<1) {
1415: my $idx=&LONCAPA::map::getresidx();
1.178 www 1416: if ($idx<=0) { $idx=1; }
1.245 albertel 1417: $LONCAPA::map::order[0]=$idx;
1418: $LONCAPA::map::resources[$idx]='';
1.17 www 1419: }
1.281 albertel 1420:
1.296 albertel 1421: my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=
1.309 raeburn 1422: &breadcrumbs($folder,$allowed,$type);
1.242 www 1423: $r->print($breadcrumbtrail);
1.292 albertel 1424:
1.7 www 1425: # ------------------------------------------------------------ Process commands
1.121 www 1426:
1.16 www 1427: # ---------------- if they are for this folder and user allowed to make changes
1.292 albertel 1428: if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123 www 1429: # set parameters and change order
1.292 albertel 1430: &snapshotbefore();
1431:
1432: if (&update_parameter()) {
1433: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1434: return $errtext if ($fatal);
1435: }
1.121 www 1436:
1.292 albertel 1437: if ($env{'form.newpos'} && $env{'form.currentpos'}) {
1.123 www 1438: # change order
1.292 albertel 1439: my $res = splice(@LONCAPA::map::order,$env{'form.currentpos'}-1,1);
1440: splice(@LONCAPA::map::order,$env{'form.newpos'}-1,0,$res);
1441:
1442: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1443: return $errtext if ($fatal);
1444: }
1445:
1446: if ($env{'form.pastemarked'}) {
1.311 raeburn 1447: &do_paste_from_buffer($coursenum,$coursedom,$folder);
1.292 albertel 1448: ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
1449: return $errtext if ($fatal);
1450: }
1451:
1452: $r->print($upload_output);
1453:
1454: if (&handle_edit_cmd()) {
1455: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1456: return $errtext if ($fatal);
1457: }
1458: # Group import/search
1459: if ($env{'form.importdetail'}) {
1460: my @imports;
1.320 ! raeburn 1461: foreach my $item (split(/\&/,$env{'form.importdetail'})) {
! 1462: if (defined($item)) {
1.292 albertel 1463: my ($name,$url,$residx)=
1.320 ! raeburn 1464: map {&unescape($_)} split(/\=/,$item);
1.292 albertel 1465: push(@imports, [$name, $url, $residx]);
1.123 www 1466: }
1.247 www 1467: }
1.292 albertel 1468: ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
1469: $container,'londocs',@imports);
1470: return $errtext if ($fatal);
1471: }
1472: # Loading a complete map
1473: if ($env{'form.loadmap'}) {
1474: if ($env{'form.importmap'}=~/\w/) {
1475: foreach my $res (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
1476: my ($title,$url,$ext,$type)=split(/\:/,$res);
1477: my $idx=&LONCAPA::map::getresidx($url);
1478: $LONCAPA::map::resources[$idx]=$res;
1479: $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.168 www 1480: }
1.104 albertel 1481: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142 raeburn 1482: $folder.'.'.$container);
1.292 albertel 1483: return $errtext if ($fatal);
1484: } else {
1485: $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');
1486:
1487: }
1.281 albertel 1488: }
1.292 albertel 1489: &log_differences($plain);
1490: }
1.16 www 1491: # ---------------------------------------------------------------- End commands
1.7 www 1492: # ---------------------------------------------------------------- Print screen
1.292 albertel 1493: my $idx=0;
1494: my $shown=0;
1.296 albertel 1495: if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {
1.292 albertel 1496: $r->print('<p>'.&mt('Parameters').':<ul>'.
1497: ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
1498: ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
1499: ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
1500: '</ul></p>');
1501: }
1502: if ($randompick>=0) {
1503: $r->print('<p>'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'</p>');
1504: }
1.296 albertel 1505: if ($is_random_order) {
1506: $r->print('<p>'.&mt('Caution: this folder is set to randomly order its contents. Adding or removing resources from this folder will change the order of resources shown.').'</p>');
1507: }
1.292 albertel 1508: $r->print('<table class="LC_docs_editor">');
1509: foreach my $res (@LONCAPA::map::order) {
1510: my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
1511: $name=&LONCAPA::map::qtescape($name);
1512: $url=&LONCAPA::map::qtescape($url);
1513: unless ($name) { $name=(split(/\//,$url))[-1]; }
1514: unless ($name) { $idx++; next; }
1515: $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,
1516: $coursenum));
1517: $idx++;
1518: $shown++;
1519: }
1520: unless ($shown) {
1521: $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
1.7 www 1522: }
1.292 albertel 1523: $r->print("\n</table>\n");
1.310 raeburn 1524: if ($allowed) {
1525: &print_paste_buffer($r,$container);
1526: }
1.292 albertel 1527: return;
1.7 www 1528: }
1.1 www 1529:
1.188 raeburn 1530: sub process_file_upload {
1.194 raeburn 1531: my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188 raeburn 1532: # upload a file, if present
1533: my $parseaction;
1.190 albertel 1534: if ($env{'form.parserflag'}) {
1.188 raeburn 1535: $parseaction = 'parse';
1536: }
1537: my $phase_status;
1538: my $folder=$env{'form.folder'};
1.194 raeburn 1539: if ($folder eq '') {
1.188 raeburn 1540: $folder='default';
1541: }
1.194 raeburn 1542: if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188 raeburn 1543: my $errtext='';
1544: my $fatal=0;
1545: my $container='sequence';
1546: if ($env{'form.pagepath'}) {
1547: $container='page';
1548: }
1549: ($errtext,$fatal)=
1550: &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245 albertel 1551: if ($#LONCAPA::map::order<1) {
1552: $LONCAPA::map::order[0]=1;
1553: $LONCAPA::map::resources[1]='';
1.188 raeburn 1554: }
1555: if ($fatal) {
1556: return 'failed';
1557: }
1558: my $destination = 'docs/';
1.194 raeburn 1559: if ($folder =~ /^supplemental/) {
1560: $destination = 'supplemental/';
1561: }
1562: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1563: $destination .= 'default/';
1.194 raeburn 1564: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1565: $destination .= $2.'/';
1.188 raeburn 1566: }
1567: # this is for a course, not a user, so set coursedoc flag
1568: # probably the only place in the system where this should be "1"
1.245 albertel 1569: my $newidx=&LONCAPA::map::getresidx();
1.188 raeburn 1570: $destination .= $newidx;
1.190 albertel 1571: my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
1572: $parseaction,$allfiles,
1573: $codebase);
1.188 raeburn 1574: my $ext='false';
1.287 albertel 1575: if ($url=~m{^http://}) { $ext='true'; }
1.270 albertel 1576: $url = &LONCAPA::map::qtunescape($url);
1.188 raeburn 1577: my $comment=$env{'form.comment'};
1.270 albertel 1578: $comment = &LONCAPA::map::qtunescape($comment);
1.188 raeburn 1579: if ($folder=~/^supplemental/) {
1580: $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
1581: $env{'user.domain'}.'___&&&___'.$comment;
1582: }
1583:
1.245 albertel 1584: $LONCAPA::map::resources[$newidx]=
1585: $comment.':'.$url.':'.$ext.':normal:res';
1586: $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190 albertel 1587: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1588: $folder.'.'.$container);
1.188 raeburn 1589: if ($fatal) {
1.283 albertel 1590: $$upload_output .= '<p><span class="LC_error">'.$errtext.'</span></p>';
1.188 raeburn 1591: return 'failed';
1592: } else {
1593: if ($parseaction eq 'parse') {
1.190 albertel 1594: my $total_embedded = keys(%{$allfiles});
1.188 raeburn 1595: if ($total_embedded > 0) {
1596: my $num = 0;
1.269 albertel 1597: my $state = '
1.282 albertel 1598: <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
1.269 albertel 1599: <input type="hidden" name="cmd" value="upload_embedded" />
1.188 raeburn 1600: <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228 www 1601: <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188 raeburn 1602: <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
1.269 albertel 1603: $phase_status = 'phasetwo';
1604:
1605: $$upload_output .=
1606: 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.
1.308 raeburn 1607: &Apache::loncommon::ask_for_embedded_content(
1608: '/adm/coursedocs',$state,$allfiles,$codebase);
1.188 raeburn 1609: } else {
1610: $$upload_output .= 'No embedded items identified<br />';
1611: }
1612: }
1613: }
1614: }
1615: return $phase_status;
1616: }
1617:
1618: sub process_secondary_uploads {
1619: my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
1620: my $folder=$env{'form.folder'};
1621: my $destination = 'docs/';
1.195 raeburn 1622: if ($folder =~ /^supplemental/) {
1623: $destination = 'supplemental/';
1624: }
1625: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1626: $destination .= 'default/';
1.195 raeburn 1627: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217 raeburn 1628: $destination .= $2.'/';
1.188 raeburn 1629: }
1630: $destination .= $newidx;
1631: my ($url,$filename);
1632: $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
1.265 albertel 1633: ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
1.188 raeburn 1634: return $filename;
1635: }
1636:
1.281 albertel 1637: sub is_supplemental_title {
1638: my ($title) = @_;
1639: return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);
1640: }
1641:
1642: sub parse_supplemental_title {
1643: my ($title) = @_;
1644:
1645: my ($foldertitle,$renametitle);
1646: if ($title =~ /&&&/) {
1647: $title = &HTML::Entites::decode($title);
1648: }
1649: if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) {
1650: $renametitle=$4;
1651: my ($time,$uname,$udom) = ($1,$2,$3);
1652: $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
1653: my $name = &Apache::loncommon::plainname($uname,$udom);
1654: $name = &HTML::Entities::encode($name,'"<>&\'');
1655: $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '.
1656: $name.': <br />'.$foldertitle;
1657: }
1658: if (wantarray) {
1659: return ($title,$foldertitle,$renametitle);
1660: }
1661: return $title;
1662: }
1663:
1.8 www 1664: # --------------------------------------------------------------- An entry line
1665:
1666: sub entryline {
1.112 raeburn 1667: my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.281 albertel 1668:
1669: my ($foldertitle,$pagetitle,$renametitle);
1670: if (&is_supplemental_title($title)) {
1671: ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);
1672: $pagetitle = $foldertitle;
1673: } else {
1674: $title=&HTML::Entities::encode($title,'"<>&\'');
1675: $renametitle=$title;
1676: $foldertitle=$title;
1677: $pagetitle=$title;
1678: }
1679:
1.245 albertel 1680: my $orderidx=$LONCAPA::map::order[$index];
1.281 albertel 1681:
1682:
1.222 albertel 1683: $renametitle=~s/\\/\\\\/g;
1.38 www 1684: $renametitle=~s/\"\;/\\\"/g;
1.286 albertel 1685: $renametitle=~s/ /%20/g;
1.8 www 1686: my $line='<tr>';
1.286 albertel 1687: my ($form_start,$form_end);
1.8 www 1688: # Edit commands
1.280 albertel 1689: my ($container, $type, $esc_path, $path, $symb);
1.174 albertel 1690: if ($env{'form.folderpath'}) {
1.280 albertel 1691: $type = 'folder';
1.142 raeburn 1692: $container = 'sequence';
1.282 albertel 1693: $esc_path=&escape($env{'form.folderpath'});
1694: $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
1.174 albertel 1695: # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120 www 1696: }
1.174 albertel 1697: if ($env{'form.pagepath'}) {
1.280 albertel 1698: $type = $container = 'page';
1699: $esc_path=&escape($path = $env{'form.pagepath'});
1.282 albertel 1700: $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
1.280 albertel 1701: $symb=&escape($env{'form.pagesymb'});
1.142 raeburn 1702: }
1.168 www 1703: my $cpinfo='';
1.109 albertel 1704: if ($allowed) {
1.123 www 1705: my $incindex=$index+1;
1706: my $selectbox='';
1.168 www 1707: if (($folder!~/^supplemental/) &&
1.245 albertel 1708: ($#LONCAPA::map::order>0) &&
1.168 www 1709: ((split(/\:/,
1.245 albertel 1710: $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]
1.168 www 1711: ne '') &&
1712: ((split(/\:/,
1.245 albertel 1713: $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1]
1.168 www 1714: ne '')) {
1.123 www 1715: $selectbox=
1.124 www 1716: '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123 www 1717: '<select name="newpos" onChange="this.form.submit()">';
1.245 albertel 1718: for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123 www 1719: if ($i==$incindex) {
1720: $selectbox.='<option value="" selected="1">('.$i.')</option>';
1721: } else {
1722: $selectbox.='<option value="'.$i.'">'.$i.'</option>';
1723: }
1724: }
1725: $selectbox.='</select>';
1726: }
1.119 www 1727: my %lt=&Apache::lonlocal::texthash(
1728: 'up' => 'Move Up',
1.109 albertel 1729: 'dw' => 'Move Down',
1730: 'rm' => 'Remove',
1.171 www 1731: 'ct' => 'Cut',
1.168 www 1732: 'rn' => 'Rename',
1733: 'cp' => 'Copy');
1.211 www 1734: my $nocopy=0;
1.268 www 1735: my $nocut=0;
1.211 www 1736: if ($url=~/\.(page|sequence)$/) {
1.289 albertel 1737: if ($url =~ m{/res/}) {
1738: # no copy for published maps
1739: $nocopy = 1;
1740: } else {
1.320 ! raeburn 1741: foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
! 1742: my ($title,$url,$ext,$type)=split(/\:/,$item);
1.289 albertel 1743: if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
1744: $nocopy=1;
1745: last;
1746: }
1.211 www 1747: }
1748: }
1749: }
1.268 www 1750: if ($url=~/^\/res\/lib\/templates\//) {
1751: $nocopy=1;
1752: $nocut=1;
1753: }
1.211 www 1754: my $copylink=' ';
1.267 www 1755: my $cutlink=' ';
1.280 albertel 1756:
1.291 albertel 1757: my $skip_confirm = 0;
1758: if ( $folder =~ /^supplemental/
1759: || ($url =~ m{( /smppg$
1760: |/syllabus$
1761: |/aboutme$
1762: |/navmaps$
1763: |/bulletinboard$
1764: |\.html$
1765: |^/adm/wrapper/ext)}x)) {
1766: $skip_confirm = 1;
1767: }
1768:
1.280 albertel 1769: if (!$nocopy) {
1770: $copylink=(<<ENDCOPY);
1.284 albertel 1771: <a href='javascript:markcopy("$esc_path","$index","$renametitle","$container","$symb","$folder");' class="LC_docs_copy">$lt{'cp'}</a>
1.211 www 1772: ENDCOPY
1.280 albertel 1773: }
1774: if (!$nocut) {
1775: $cutlink=(<<ENDCUT);
1.291 albertel 1776: <a href='javascript:cutres("$esc_path","$index","$renametitle","$container","$symb","$folder",$skip_confirm);' class="LC_docs_cut">$lt{'ct'}</a>
1.267 www 1777: ENDCUT
1.280 albertel 1778: }
1.286 albertel 1779: $form_start = (<<END);
1780: <form action="/adm/coursedocs" method="post">
1.280 albertel 1781: <input type="hidden" name="${type}path" value="$path" />
1782: <input type="hidden" name="${type}symb" value="$symb" />
1783: <input type="hidden" name="setparms" value="$orderidx" />
1784: <input type="hidden" name="changeparms" value="0" />
1.286 albertel 1785: END
1786: $form_end = '</form>';
1787: $line.=(<<END);
1.280 albertel 1788: <td>
1.285 albertel 1789: <table class="LC_docs_entry_move">
1.280 albertel 1790: <tr>
1.285 albertel 1791: <td>
1.282 albertel 1792: <a href='/adm/coursedocs?cmd=up_$index&${type}path=$esc_path&${type}symb=$symb$cpinfo'><img src="${iconpath}move_up.gif" alt='$lt{'up'}' class="LC_icon" /></a>
1.280 albertel 1793: </td>
1794: </tr>
1795: <tr>
1.285 albertel 1796: <td>
1.282 albertel 1797: <a href='/adm/coursedocs?cmd=down_$index&${type}path=$esc_path&${type}symb=$symb$cpinfo'><img src="${iconpath}move_down.gif" alt='$lt{'dw'}' class="LC_icon" /></a>
1.280 albertel 1798: </td>
1799: </tr>
1800: </table>
1801: </td>
1802: <td>
1.286 albertel 1803: $form_start
1.280 albertel 1804: $selectbox
1.286 albertel 1805: $form_end
1.280 albertel 1806: </td>
1.285 albertel 1807: <td class="LC_docs_entry_commands">
1.291 albertel 1808: <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
1.267 www 1809: $cutlink
1.284 albertel 1810: <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a>
1.211 www 1811: $copylink
1.280 albertel 1812: </td>
1.142 raeburn 1813: END
1.280 albertel 1814:
1.8 www 1815: }
1.16 www 1816: # Figure out what kind of a resource this is
1817: my ($extension)=($url=~/\.(\w+)$/);
1818: my $uploaded=($url=~/^\/*uploaded\//);
1.97 albertel 1819: my $icon=&Apache::loncommon::icon($url);
1.17 www 1820: my $isfolder=0;
1.142 raeburn 1821: my $ispage=0;
1.114 albertel 1822: my $folderarg;
1.142 raeburn 1823: my $pagearg;
1824: my $pagefile;
1.16 www 1825: if ($uploaded) {
1.135 albertel 1826: if ($extension eq 'sequence') {
1827: $icon=$iconpath.'/folder_closed.gif';
1.264 albertel 1828: $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
1.135 albertel 1829: $url='/adm/coursedocs?';
1830: $folderarg=$1;
1831: $isfolder=1;
1.142 raeburn 1832: } elsif ($extension eq 'page') {
1833: $icon=$iconpath.'/page.gif';
1.264 albertel 1834: $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
1.142 raeburn 1835: $pagearg=$1;
1836: $url='/adm/coursedocs?';
1837: $ispage=1;
1.135 albertel 1838: } else {
1839: &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
1840: }
1.16 www 1841: }
1.287 albertel 1842:
1843: my $orig_url = $url;
1844: my $external = ($url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/});
1.142 raeburn 1845: if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113 albertel 1846: my $symb=&Apache::lonnet::symbclean(
1.50 www 1847: &Apache::lonnet::declutter('uploaded/'.
1.174 albertel 1848: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1849: $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50 www 1850: '.sequence').
1851: '___'.$residx.'___'.
1.113 albertel 1852: &Apache::lonnet::declutter($url));
1853: (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
1854: $url=&Apache::lonnet::clutter($url);
1.127 albertel 1855: if ($url=~/^\/*uploaded\//) {
1856: $url=~/\.(\w+)$/;
1857: my $embstyle=&Apache::loncommon::fileembstyle($1);
1858: if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
1859: $url='/adm/wrapper'.$url;
1860: } elsif ($embstyle eq 'ssi') {
1861: #do nothing with these
1862: } elsif ($url!~/\.(sequence|page)$/) {
1863: $url='/adm/coursedocs/showdoc'.$url;
1864: }
1.145 albertel 1865: } elsif ($url=~m|^/ext/|) {
1866: $url='/adm/wrapper'.$url;
1.287 albertel 1867: $external = 1;
1.127 albertel 1868: }
1.241 www 1869: if (&Apache::lonnet::symbverify($symb,$url)) {
1870: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1871: } else {
1872: $url='';
1873: }
1.152 albertel 1874: if ($container eq 'page') {
1.174 albertel 1875: my $symb=$env{'form.pagesymb'};
1.152 albertel 1876:
1877: $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228 www 1878: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152 albertel 1879: }
1.50 www 1880: }
1.296 albertel 1881: my ($parameterset,$rand_order_text) = (' ', ' ');
1.216 albertel 1882: if ($isfolder || $extension eq 'sequence') {
1.228 www 1883: my $foldername=&escape($foldertitle);
1.174 albertel 1884: my $folderpath=$env{'form.folderpath'};
1.114 albertel 1885: if ($folderpath) { $folderpath.='&' };
1.242 www 1886: # Append randompick number, hidden, and encrypted with ":" to foldername,
1887: # so it gets transferred between levels
1.245 albertel 1888: $folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242 www 1889: 'parameter_randompick'))[0]
1.245 albertel 1890: .':'.((&LONCAPA::map::getparameter($orderidx,
1.242 www 1891: 'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245 albertel 1892: .':'.((&LONCAPA::map::getparameter($orderidx,
1.296 albertel 1893: 'parameter_encrypturl'))[0]=~/^yes$/i)
1894: .':'.((&LONCAPA::map::getparameter($orderidx,
1895: 'parameter_randomorder'))[0]=~/^yes$/i);
1.228 www 1896: $url.='folderpath='.&escape($folderpath).$cpinfo;
1.147 matthew 1897: $parameterset='<label>'.&mt('Randomly Pick: ').
1.292 albertel 1898: '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randompick_'.$orderidx.'" value="'.
1.245 albertel 1899: (&LONCAPA::map::getparameter($orderidx,
1.147 matthew 1900: 'parameter_randompick'))[0].
1.165 www 1901: '" />'.
1.285 albertel 1902: '<a href="javascript:void(0)">'.&mt('Save').'</a></label>';
1.296 albertel 1903: my $ro_set=
1904: ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
1905: $rand_order_text ='
1.319 bisitz 1906: <span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onClick="this.form.changeparms.value=\'randomorder\';this.form.submit()" '.$ro_set.' /> '.&mt('Random Order').' </label></span>';
1.114 albertel 1907: }
1.142 raeburn 1908: if ($ispage) {
1.228 www 1909: my $pagename=&escape($pagetitle);
1.142 raeburn 1910: my $pagepath;
1.174 albertel 1911: my $folderpath=$env{'form.folderpath'};
1.142 raeburn 1912: if ($folderpath) { $pagepath = $folderpath.'&' };
1913: $pagepath.=$pagearg.'&'.$pagename;
1.174 albertel 1914: my $symb=$env{'form.pagesymb'};
1.152 albertel 1915: if (!$symb) {
1916: my $path='uploaded/'.
1.174 albertel 1917: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1918: $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152 albertel 1919: $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
1920: $residx,
1921: $path.$pagearg.'.page');
1922: }
1.228 www 1923: $url.='pagepath='.&escape($pagepath).
1.282 albertel 1924: '&pagesymb='.&escape($symb).$cpinfo;
1.142 raeburn 1925: }
1.287 albertel 1926: if ($external) {
1927: my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';
1928: $external = ' <a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';
1929: } else {
1930: undef($external);
1931: }
1.285 albertel 1932: $line.='
1933: <td class="LC_docs_entry_icon">
1.287 albertel 1934: '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'
1.285 albertel 1935: </td>
1936: <td class="LC_docs_entry_title">
1.287 albertel 1937: '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.&mt('(re-initialize course to access)').'</span>').$external."
1.285 albertel 1938: </td>";
1.120 www 1939: if (($allowed) && ($folder!~/^supplemental/)) {
1940: my %lt=&Apache::lonlocal::texthash(
1941: 'hd' => 'Hidden',
1.165 www 1942: 'ec' => 'URL hidden');
1.122 www 1943: my $enctext=
1.245 albertel 1944: ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122 www 1945: my $hidtext=
1.245 albertel 1946: ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120 www 1947: $line.=(<<ENDPARMS);
1.285 albertel 1948: <td class="LC_docs_entry_parameter">
1.286 albertel 1949: $form_start
1.292 albertel 1950: <label><input type="checkbox" name="hiddenresource_$orderidx" onClick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
1.286 albertel 1951: $form_end
1.285 albertel 1952: </td>
1953: <td class="LC_docs_entry_parameter">
1.286 albertel 1954: $form_start
1.292 albertel 1955: <label><input type="checkbox" name="encrypturl_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>
1.286 albertel 1956: $form_end
1.285 albertel 1957: </td>
1.296 albertel 1958: <td class="LC_docs_entry_parameter">$form_start $rand_order_text $form_end</td>
1.286 albertel 1959: <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td>
1.120 www 1960: ENDPARMS
1.119 www 1961: }
1.286 albertel 1962: $line.="</tr>";
1.8 www 1963: return $line;
1964: }
1965:
1.315 jms 1966: =pod
1967:
1968: =item tiehash()
1969:
1970: tie the hash
1971:
1972: =cut
1.27 www 1973:
1974: sub tiehash {
1.136 albertel 1975: my ($mode)=@_;
1.27 www 1976: $hashtied=0;
1.174 albertel 1977: if ($env{'request.course.fn'}) {
1.136 albertel 1978: if ($mode eq 'write') {
1.174 albertel 1979: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 1980: &GDBM_WRCREAT(),0640)) {
1981: $hashtied=2;
1982: }
1983: } else {
1.174 albertel 1984: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 1985: &GDBM_READER(),0640)) {
1.27 www 1986: $hashtied=1;
1.136 albertel 1987: }
1988: }
1.27 www 1989: }
1990: }
1991:
1992: sub untiehash {
1993: if ($hashtied) { untie %hash; }
1994: $hashtied=0;
1.221 albertel 1995: return OK;
1.27 www 1996: }
1997:
1.315 jms 1998:
1999:
1.29 www 2000:
2001: sub checkonthis {
2002: my ($r,$url,$level,$title)=@_;
1.228 www 2003: $url=&unescape($url);
1.29 www 2004: $alreadyseen{$url}=1;
2005: $r->rflush();
1.41 www 2006: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108 albertel 2007: $r->print("\n<br />");
1.313 bisitz 2008: if ($level==0) {
2009: $r->print("<br />");
2010: }
1.29 www 2011: for (my $i=0;$i<=$level*5;$i++) {
2012: $r->print(' ');
2013: }
2014: $r->print('<a href="'.$url.'" target="cat">'.
2015: ($title?$title:$url).'</a> ');
2016: if ($url=~/^\/res\//) {
2017: my $result=&Apache::lonnet::repcopy(
2018: &Apache::lonnet::filelocation('',$url));
1.172 raeburn 2019: if ($result eq 'ok') {
1.313 bisitz 2020: $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.29 www 2021: $r->rflush();
1.34 www 2022: &Apache::lonnet::countacc($url);
2023: $url=~/\.(\w+)$/;
2024: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
2025: $r->print('<br />');
2026: $r->rflush();
2027: for (my $i=0;$i<=$level*5;$i++) {
2028: $r->print(' ');
2029: }
1.313 bisitz 2030: $r->print('- '.&mt('Rendering:').' ');
1.170 www 2031: my ($errorcount,$warningcount)=split(/:/,
2032: &Apache::lonnet::ssi_body($url,
1.173 albertel 2033: ('grade_target'=>'web',
2034: 'return_only_error_and_warning_counts' => 1)));
1.170 www 2035: if (($errorcount) ||
2036: ($warningcount)) {
2037: if ($errorcount) {
1.283 albertel 2038: $r->print('<img src="/adm/lonMisc/bomb.gif" /><span class="LC_error">'.
1.313 bisitz 2039: &mt('[quant,_1,error]',$errorcount).'</span>');
1.34 www 2040: }
1.170 www 2041: if ($warningcount) {
1.283 albertel 2042: $r->print('<span class="LC_warning">'.
1.313 bisitz 2043: &mt('[quant,_1,warning]',$warningcount).'</span>');
1.34 www 2044: }
2045: } else {
1.283 albertel 2046: $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.34 www 2047: }
2048: $r->rflush();
2049: }
1.29 www 2050: my $dependencies=
2051: &Apache::lonnet::metadata($url,'dependencies');
1.320 ! raeburn 2052: foreach my $dep (split(/\,/,$dependencies)) {
! 2053: if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) {
! 2054: &checkonthis($r,$dep,$level+1);
1.29 www 2055: }
2056: }
1.172 raeburn 2057: } elsif ($result eq 'unavailable') {
1.283 albertel 2058: $r->print('<span class="LC_error">'.&mt('connection down').'</span>');
1.172 raeburn 2059: } elsif ($result eq 'not_found') {
1.100 www 2060: unless ($url=~/\$/) {
1.313 bisitz 2061: $r->print('<span class="LC_error">'.&mt('not found').'</b></span>');
1.100 www 2062: } else {
1.283 albertel 2063: $r->print('<span class="LC_unknown">'.&mt('unable to verify variable URL').'</span>');
1.100 www 2064: }
1.29 www 2065: } else {
1.283 albertel 2066: $r->print('<span class="LC_error">'.&mt('access denied').'</span>');
1.29 www 2067: }
1.313 bisitz 2068: }
2069: }
1.29 www 2070: }
2071:
1.1 www 2072:
1.315 jms 2073:
2074: =pod
2075:
2076: =item list_symbs()
2077:
2078: List Symbs
2079:
2080: =cut
2081:
1.208 albertel 2082: sub list_symbs {
1.224 albertel 2083: my ($r) = @_;
2084:
2085: $r->print(&Apache::loncommon::start_page('Symb List'));
1.257 www 2086: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
1.224 albertel 2087: my $navmap = Apache::lonnavmaps::navmap->new();
2088: $r->print("<pre>\n");
2089: foreach my $res ($navmap->retrieveResources()) {
2090: $r->print($res->compTitle()."\t".$res->symb()."\n");
2091: }
2092: $r->print("\n</pre>\n");
2093: $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208 albertel 2094: }
2095:
2096:
1.315 jms 2097:
1.75 www 2098: sub verifycontent {
1.224 albertel 2099: my ($r) = @_;
1.230 albertel 2100: my $type = &Apache::loncommon::course_type();
1.26 www 2101: my $loaderror=&Apache::lonnet::overloaderror($r);
2102: if ($loaderror) { return $loaderror; }
1.229 raeburn 2103: $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.257 www 2104: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
1.27 www 2105: $hashtied=0;
1.30 www 2106: undef %alreadyseen;
2107: %alreadyseen=();
1.27 www 2108: &tiehash();
1.320 ! raeburn 2109: foreach my $key (keys(%hash)) {
! 2110: if ($hash{$key}=~/\.(page|sequence)$/) {
! 2111: if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {
1.283 albertel 2112: $r->print('<hr /><span class="LC_error">'.
1.230 albertel 2113: &mt('The following sequence or page is included more than once in your '.$type.': ').
1.320 ! raeburn 2114: &unescape($hash{$key}).'</span><br />'.
1.140 www 2115: &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
2116: }
2117: }
1.320 ! raeburn 2118: if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {
! 2119: &checkonthis($r,$hash{$key},0,$hash{'title_'.$1});
1.27 www 2120: }
2121: }
2122: &untiehash();
1.108 albertel 2123: $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
2124: &mt('Return to DOCS').'</a>');
1.75 www 2125: }
2126:
2127:
1.192 www 2128: sub devalidateversioncache {
2129: my $src=shift;
2130: &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
2131: &Apache::lonnet::clutter($src));
2132: }
2133:
1.75 www 2134: sub checkversions {
1.224 albertel 2135: my ($r) = @_;
1.230 albertel 2136: my $type = &Apache::loncommon::course_type();
1.229 raeburn 2137: $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.257 www 2138: $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
1.89 www 2139: my $header='';
2140: my $startsel='';
2141: my $monthsel='';
2142: my $weeksel='';
2143: my $daysel='';
2144: my $allsel='';
2145: my %changes=();
2146: my $starttime=0;
1.91 www 2147: my $haschanged=0;
1.92 www 2148: my %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 2149: $env{'course.'.$env{'request.course.id'}.'.domain'},
2150: $env{'course.'.$env{'request.course.id'}.'.num'});
1.92 www 2151:
2152: $hashtied=0;
2153: &tiehash();
2154: my %newsetversions=();
1.174 albertel 2155: if ($env{'form.setmostrecent'}) {
1.91 www 2156: $haschanged=1;
1.320 ! raeburn 2157: foreach my $key (keys(%hash)) {
! 2158: if ($key=~/^ids\_(\/res\/.+)$/) {
1.93 www 2159: $newsetversions{$1}='mostrecent';
1.192 www 2160: &devalidateversioncache($1);
1.92 www 2161: }
2162: }
1.174 albertel 2163: } elsif ($env{'form.setcurrent'}) {
1.91 www 2164: $haschanged=1;
1.320 ! raeburn 2165: foreach my $key (keys(%hash)) {
! 2166: if ($key=~/^ids\_(\/res\/.+)$/) {
1.93 www 2167: my $getvers=&Apache::lonnet::getversion($1);
2168: if ($getvers>0) {
2169: $newsetversions{$1}=$getvers;
1.192 www 2170: &devalidateversioncache($1);
1.93 www 2171: }
1.92 www 2172: }
2173: }
1.174 albertel 2174: } elsif ($env{'form.setversions'}) {
1.91 www 2175: $haschanged=1;
1.320 ! raeburn 2176: foreach my $key (keys(%env)) {
! 2177: if ($key=~/^form\.set_version_(.+)$/) {
1.92 www 2178: my $src=$1;
1.320 ! raeburn 2179: if (($env{$key}) && ($env{$key} ne $setversions{$src})) {
! 2180: $newsetversions{$src}=$env{$key};
1.192 www 2181: &devalidateversioncache($src);
1.92 www 2182: }
2183: }
2184: }
1.91 www 2185: }
2186: if ($haschanged) {
1.92 www 2187: if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174 albertel 2188: $env{'course.'.$env{'request.course.id'}.'.domain'},
2189: $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
1.272 albertel 2190: $r->print('<h1>'.&mt('Your Version Settings have been Saved').'</h1>');
1.92 www 2191: } else {
1.283 albertel 2192: $r->print('<h1><span class="LC_error">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</span></h1>');
1.92 www 2193: }
1.136 albertel 2194: &mark_hash_old();
1.91 www 2195: }
1.136 albertel 2196: &changewarning($r,'');
1.174 albertel 2197: if ($env{'form.timerange'} eq 'all') {
1.89 www 2198: # show all documents
1.230 albertel 2199: $header=&mt('All Documents in '.$type);
1.91 www 2200: $allsel=1;
1.320 ! raeburn 2201: foreach my $key (keys(%hash)) {
! 2202: if ($key=~/^ids\_(\/res\/.+)$/) {
1.90 www 2203: my $src=$1;
2204: $changes{$src}=1;
2205: }
2206: }
1.89 www 2207: } else {
2208: # show documents which changed
2209: %changes=&Apache::lonnet::dump
1.174 albertel 2210: ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
2211: $env{'course.'.$env{'request.course.id'}.'.num'});
1.320 ! raeburn 2212: my $firstkey=(keys(%changes))[0];
1.89 www 2213: unless ($firstkey=~/^error\:/) {
1.174 albertel 2214: unless ($env{'form.timerange'}) {
2215: $env{'form.timerange'}=604800;
1.89 www 2216: }
1.174 albertel 2217: my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89 www 2218: .&mt('seconds');
1.174 albertel 2219: if ($env{'form.timerange'}==-1) {
1.89 www 2220: $seltext='since start of course';
2221: $startsel='selected';
1.174 albertel 2222: $env{'form.timerange'}=time;
1.89 www 2223: }
1.174 albertel 2224: $starttime=time-$env{'form.timerange'};
2225: if ($env{'form.timerange'}==2592000) {
1.89 www 2226: $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2227: $monthsel='selected';
1.174 albertel 2228: } elsif ($env{'form.timerange'}==604800) {
1.89 www 2229: $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2230: $weeksel='selected';
1.174 albertel 2231: } elsif ($env{'form.timerange'}==86400) {
1.89 www 2232: $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2233: $daysel='selected';
2234: }
2235: $header=&mt('Content changed').' '.$seltext;
2236: } else {
2237: $header=&mt('No content modifications yet.');
2238: }
2239: }
1.92 www 2240: %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 2241: $env{'course.'.$env{'request.course.id'}.'.domain'},
2242: $env{'course.'.$env{'request.course.id'}.'.num'});
1.89 www 2243: my %lt=&Apache::lonlocal::texthash
1.229 raeburn 2244: ('st' => 'Version changes since start of '.$type,
1.88 www 2245: 'lm' => 'Version changes since last Month',
2246: 'lw' => 'Version changes since last Week',
2247: 'sy' => 'Version changes since Yesterday',
1.91 www 2248: 'al' => 'All Resources (possibly large output)',
1.88 www 2249: 'sd' => 'Display',
1.84 www 2250: 'fi' => 'File',
2251: 'md' => 'Modification Date',
1.87 www 2252: 'mr' => 'Most recently published Version',
1.229 raeburn 2253: 've' => 'Version used in '.$type,
2254: 'vu' => 'Set Version to be used in '.$type,
2255: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91 www 2256: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
2257: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84 www 2258: 'di' => 'Differences');
1.89 www 2259: $r->print(<<ENDHEADERS);
1.31 www 2260: <form action="/adm/coursedocs" method="post">
1.91 www 2261: <input type="hidden" name="versions" value="1" />
2262: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
2263: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31 www 2264: <select name="timerange">
1.88 www 2265: <option value='all' $allsel>$lt{'al'}</option>
1.84 www 2266: <option value="-1" $startsel>$lt{'st'}</option>
2267: <option value="2592000" $monthsel>$lt{'lm'}</option>
2268: <option value="604800" $weeksel>$lt{'lw'}</option>
2269: <option value="86400" $daysel>$lt{'sy'}</option>
1.31 www 2270: </select>
1.91 www 2271: <input type="submit" name="display" value="$lt{'sd'}" />
1.89 www 2272: <h3>$header</h3>
1.91 www 2273: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103 matthew 2274: <table border="0">
1.31 www 2275: ENDHEADERS
1.320 ! raeburn 2276: foreach my $key (sort(keys(%changes))) {
! 2277: if ($changes{$key}>$starttime) {
! 2278: my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
! 2279: my $currentversion=&Apache::lonnet::getversion($key);
1.93 www 2280: if ($currentversion<0) {
2281: $currentversion=&mt('Could not be determined.');
2282: }
1.320 ! raeburn 2283: my $linkurl=&Apache::lonnet::clutter($key);
1.89 www 2284: $r->print(
1.103 matthew 2285: '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91 www 2286: &Apache::lonnet::gettitle($linkurl).
1.103 matthew 2287: '</b></font></td></tr>'.
2288: '<tr><td> </td>'.
2289: '<td colspan="4">'.
2290: '<a href="'.$linkurl.'" target="cat">'.$linkurl.
2291: '</a></td></tr>'.
2292: '<tr><td></td>'.
2293: '<td title="'.$lt{'md'}.'">'.
1.102 matthew 2294: &Apache::lonlocal::locallocaltime(
2295: &Apache::lonnet::metadata($root.'.'.$extension,
2296: 'lastrevisiondate')
2297: ).
1.103 matthew 2298: '</td>'.
1.284 albertel 2299: '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.
1.103 matthew 2300: '<font size="+1">'.$currentversion.'</font>'.
1.284 albertel 2301: '</span></td>'.
2302: '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$type.': '.
1.103 matthew 2303: '<font size="+1">');
1.87 www 2304: # Used in course
1.89 www 2305: my $usedversion=$hash{'version_'.$linkurl};
1.93 www 2306: if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89 www 2307: $r->print($usedversion);
2308: } else {
2309: $r->print($currentversion);
2310: }
1.284 albertel 2311: $r->print('</font></span></td><td title="'.$lt{'vu'}.'">'.
2312: '<span class="LC_nobreak">Use: ');
1.87 www 2313: # Set version
1.92 www 2314: $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89 www 2315: 'set_version_'.$linkurl,
1.136 albertel 2316: ('select_form_order' =>
2317: ['',1..$currentversion,'mostrecent'],
2318: '' => '',
1.93 www 2319: 'mostrecent' => 'most recent',
1.89 www 2320: map {$_,$_} (1..$currentversion))));
1.284 albertel 2321: $r->print('</span></td></tr><tr><td></td>');
1.89 www 2322: my $lastold=1;
2323: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
2324: my $url=$root.'.'.$prevvers.'.'.$extension;
2325: if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
2326: $starttime) {
2327: $lastold=$prevvers;
2328: }
2329: }
1.103 matthew 2330: #
2331: # Code to figure out how many version entries should go in
2332: # each of the four columns
2333: my $entries_per_col = 0;
2334: my $num_entries = ($currentversion-$lastold);
2335: if ($num_entries % 4 == 0) {
2336: $entries_per_col = $num_entries/4;
2337: } else {
2338: $entries_per_col = $num_entries/4 + 1;
2339: }
2340: my $entries_count = 0;
2341: $r->print('<td valign="top"><font size="-2">');
2342: my $cols_output = 1;
1.32 www 2343: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89 www 2344: my $url=$root.'.'.$prevvers.'.'.$extension;
1.284 albertel 2345: $r->print('<span class="LC_nobreak"><a href="'.&Apache::lonnet::clutter($url).
1.91 www 2346: '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103 matthew 2347: &Apache::lonlocal::locallocaltime(
2348: &Apache::lonnet::metadata($url,
2349: 'lastrevisiondate')
2350: ).
1.91 www 2351: ')');
1.89 www 2352: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33 www 2353: $r->print(' <a href="/adm/diff?filename='.
1.89 www 2354: &Apache::lonnet::clutter($root.'.'.$extension).
2355: '&versionone='.$prevvers.
2356: '">'.&mt('Diffs').'</a>');
2357: }
1.284 albertel 2358: $r->print('</span><br />');
1.103 matthew 2359: if (++$entries_count % $entries_per_col == 0) {
2360: $r->print('</font></td>');
2361: if ($cols_output != 4) {
2362: $r->print('<td valign="top"><font size="-2">');
2363: $cols_output++;
2364: }
2365: }
1.89 www 2366: }
1.103 matthew 2367: while($cols_output++ < 4) {
2368: $r->print('</font></td><td><font>')
2369: }
2370: $r->print('</font></td></tr>'."\n");
1.89 www 2371: }
2372: }
1.92 www 2373: $r->print('</table></form>');
1.89 www 2374: $r->print('<h1>'.&mt('Done').'.</h1>');
2375:
2376: &untiehash();
1.75 www 2377: }
2378:
1.136 albertel 2379: sub mark_hash_old {
2380: my $retie_hash=0;
2381: if ($hashtied) {
2382: $retie_hash=1;
2383: &untiehash();
2384: }
2385: &tiehash('write');
2386: $hash{'old'}=1;
2387: &untiehash();
2388: if ($retie_hash) { &tiehash(); }
2389: }
2390:
2391: sub is_hash_old {
2392: my $untie_hash=0;
2393: if (!$hashtied) {
2394: $untie_hash=1;
2395: &tiehash();
2396: }
2397: my $return=$hash{'old'};
2398: if ($untie_hash) { &untiehash(); }
2399: return $return;
2400: }
2401:
1.91 www 2402: sub changewarning {
1.177 albertel 2403: my ($r,$postexec,$message,$url)=@_;
1.136 albertel 2404: if (!&is_hash_old()) { return; }
1.150 albertel 2405: my $pathvar='folderpath';
1.228 www 2406: my $path=&escape($env{'form.folderpath'});
1.177 albertel 2407: if (!defined($url)) {
2408: if (defined($env{'form.pagepath'})) {
2409: $pathvar='pagepath';
1.228 www 2410: $path=&escape($env{'form.pagepath'});
2411: $path.='&pagesymb='.&escape($env{'form.pagesymb'});
1.177 albertel 2412: }
2413: $url='/adm/coursedocs?'.$pathvar.'='.$path;
2414: }
1.230 albertel 2415: my $course_type = &Apache::loncommon::course_type();
1.177 albertel 2416: if (!defined($message)) {
2417: $message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150 albertel 2418: }
1.185 www 2419: $r->print("\n\n".
1.286 albertel 2420: '<script type="text/javascript">function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n".
1.185 www 2421: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177 albertel 2422: '<input type="hidden" name="orgurl" value="'.$url.
1.283 albertel 2423: '" /><input type="hidden" name="selectrole" value="1" /><h3><span class="LC_warning">'.
1.177 albertel 2424: &mt($message,' <input type="hidden" name="'.
2425: $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230 albertel 2426: &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.283 albertel 2427: $help{'Caching'}.'</span></h3></form>'."\n\n");
1.91 www 2428: }
2429:
1.257 www 2430:
2431: sub init_breadcrumbs {
2432: my ($form,$text)=@_;
2433: &Apache::lonhtmlcommon::clear_breadcrumbs();
2434: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
1.297 albertel 2435: text=>"Edit ".&Apache::loncommon::course_type(),
1.257 www 2436: faq=>273,
2437: bug=>'Instructor Interface',
2438: help => 'Docs_Adding_Course_Doc'});
2439: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
2440: text=>$text,
2441: faq=>273,
2442: bug=>'Instructor Interface'});
2443: }
2444:
1.315 jms 2445:
2446:
2447:
1.75 www 2448: sub handler {
2449: my $r = shift;
1.82 www 2450: &Apache::loncommon::content_type($r,'text/html');
1.75 www 2451: $r->send_http_header;
2452: return OK if $r->header_only;
1.230 albertel 2453: my $type = &Apache::loncommon::course_type();
1.75 www 2454:
2455: # --------------------------------------------- Initialize help topics for this
1.320 ! raeburn 2456: foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
! 2457: 'Adding_External_Resource','Navigate_Content',
! 2458: 'Adding_Folders','Docs_Overview', 'Load_Map',
! 2459: 'Supplemental','Score_Upload_Form','Adding_Pages',
! 2460: 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
! 2461: 'Check_Resource_Versions','Verify_Content') {
! 2462: $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
1.209 albertel 2463: }
1.75 www 2464: # Composite help files
2465: $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
2466: 'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
2467: $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
2468: 'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86 albertel 2469: $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
2470: 'Option_Response_Simple');
1.75 www 2471: $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
2472: 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
2473: $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
2474: 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
1.255 raeburn 2475: $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
1.75 www 2476: $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142 raeburn 2477:
1.209 albertel 2478: # does this user have privileges to modify docs
2479: my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
2480: if ($allowed && $env{'form.verify'}) {
1.257 www 2481: &init_breadcrumbs('verify','Verify Content');
1.75 www 2482: &verifycontent($r);
1.209 albertel 2483: } elsif ($allowed && $env{'form.listsymbs'}) {
1.257 www 2484: &init_breadcrumbs('listsymbs','List Symbs');
1.208 albertel 2485: &list_symbs($r);
1.247 www 2486: } elsif ($allowed && $env{'form.docslog'}) {
1.257 www 2487: &init_breadcrumbs('docslog','Show Log');
1.247 www 2488: &docs_change_log($r);
1.209 albertel 2489: } elsif ($allowed && $env{'form.versions'}) {
1.257 www 2490: &init_breadcrumbs('versions','Check/Set Resource Versions');
1.75 www 2491: &checkversions($r);
1.209 albertel 2492: } elsif ($allowed && $env{'form.dumpcourse'}) {
1.257 www 2493: &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space');
1.75 www 2494: &dumpcourse($r);
1.209 albertel 2495: } elsif ($allowed && $env{'form.exportcourse'}) {
1.257 www 2496: &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
1.138 raeburn 2497: &exportcourse($r);
1.26 www 2498: } else {
1.7 www 2499: # is this a standard course?
2500:
1.174 albertel 2501: my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155 raeburn 2502: my $forcestandard = 0;
1.15 www 2503: my $forcesupplement;
2504: my $script='';
1.19 www 2505: my $showdoc=0;
1.142 raeburn 2506: my $containertag;
2507: my $uploadtag;
1.15 www 2508: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224 albertel 2509: ['folderpath','pagepath',
1.281 albertel 2510: 'pagesymb']);
1.307 www 2511: # No folderpath, no pagepath, see if we have something stored
2512: if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
2513: &Apache::loncommon::restore_course_settings('docs_folderpath',
2514: {'folderpath' => 'scalar'});
2515: }
2516: if (!$env{'form.folderpath'}) {
2517: &Apache::loncommon::restore_course_settings('docs_folderpath',
2518: {'pagepath' => 'scalar'});
2519: }
2520: if ($env{'form.pagepath'}) {
2521: $env{'form.folderpath'}='';
2522: }
1.309 raeburn 2523: if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
2524: $env{'form.folderpath'} = 'supplemental&'.
2525: &escape(&mt('Supplemental '.$type.' Documents')).'&'.
2526: $env{'form.folderpath'};
2527: }
1.307 www 2528: &Apache::loncommon::store_course_settings('docs_folderpath',
2529: {'pagepath' => 'scalar',
2530: 'folderpath' => 'scalar'});
1.174 albertel 2531: if ($env{'form.folderpath'}) {
2532: my (@folderpath)=split('&',$env{'form.folderpath'});
1.228 www 2533: $env{'form.foldername'}=&unescape(pop(@folderpath));
1.174 albertel 2534: $env{'form.folder'}=pop(@folderpath);
2535: }
2536: if ($env{'form.pagepath'}) {
2537: my (@pagepath)=split('&',$env{'form.pagepath'});
1.228 www 2538: $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174 albertel 2539: $env{'form.folder'}=pop(@pagepath);
1.156 albertel 2540: $containertag = '<input type="hidden" name="pagepath" value="" />'.
2541: '<input type="hidden" name="pagesymb" value="" />';
1.282 albertel 2542: $uploadtag = '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
2543: '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />';
1.142 raeburn 2544: }
1.21 www 2545: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127 albertel 2546: $showdoc='/'.$1;
1.21 www 2547: }
2548: unless ($showdoc) { # got called from remote
1.237 albertel 2549: if (($env{'form.folder'}=~/^(?:group|default)_/) ||
1.209 albertel 2550: ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155 raeburn 2551: $forcestandard = 1;
2552: }
1.174 albertel 2553: $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7 www 2554:
1.15 www 2555: if ($allowed) {
2556: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
2557: $script=&Apache::lonratedt::editscript('simple');
2558: }
2559: } else { # got called in sequence from course
2560: $allowed=0;
1.3 www 2561: }
1.4 www 2562:
2563: # get course data
1.174 albertel 2564: my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
2565: my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4 www 2566:
1.225 albertel 2567: # get personal data
1.174 albertel 2568: my $uname=$env{'user.name'};
2569: my $udom=$env{'user.domain'};
1.245 albertel 2570: my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14 www 2571:
1.8 www 2572: # graphics settings
1.4 www 2573:
1.176 albertel 2574: $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8 www 2575:
1.224 albertel 2576: if ($allowed) {
2577: $script .= &editing_js($udom,$uname);
1.171 www 2578: }
1.42 www 2579: # -------------------------------------------------------------------- Body tag
1.224 albertel 2580: $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.318 kaisler 2581: my @brcrum = [{href=>"/adm/createuser",text=>"$type Documents"}];
1.229 raeburn 2582: $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.318 kaisler 2583: {'force_register' => $showdoc, bread_crumbs => @brcrum}).
1.233 albertel 2584: &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224 albertel 2585:
1.188 raeburn 2586: my %allfiles = ();
2587: my %codebase = ();
2588: my ($upload_result,$upload_output);
2589: if ($allowed) {
1.264 albertel 2590: if (($env{'form.uploaddoc.filename'}) &&
2591: ($env{'form.cmd'}=~/^upload_(\w+)/)) {
1.188 raeburn 2592: # Process file upload - phase one - upload and parse primary file.
1.298 albertel 2593: undef($hadchanges);
1.190 albertel 2594: $upload_result = &process_file_upload(\$upload_output,$coursenum,
2595: $coursedom,\%allfiles,
1.194 raeburn 2596: \%codebase,$1);
1.298 albertel 2597: if ($hadchanges) {
2598: &mark_hash_old();
2599: }
1.188 raeburn 2600: if ($upload_result eq 'phasetwo') {
2601: $r->print($upload_output);
2602: }
2603: } elsif ($env{'form.phasetwo'}) {
2604: my %newname = ();
2605: my %origname = ();
2606: my %attribs = ();
2607: my $updateflag = 0;
2608: my $residx = $env{'form.newidx'};
1.228 www 2609: my $primary_url = &unescape($env{'form.primaryurl'});
1.188 raeburn 2610: # Process file upload - phase two - gather secondary files.
2611: for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
2612: if ($env{'form.embedded_item_'.$i.'.filename'}) {
2613: my $javacodebase;
2614: $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228 www 2615: $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188 raeburn 2616: if (exists($env{'form.embedded_codebase_'.$i})) {
1.228 www 2617: $javacodebase = &unescape($env{'form.embedded_codebase_'.$i});
1.188 raeburn 2618: $origname{$i} =~ s#^\Q$javacodebase\E/##;
2619: }
2620: my @attributes = ();
2621: if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
1.320 ! raeburn 2622: @attributes = split(/:/,$env{'form.embedded_attrib_'.$i});
1.188 raeburn 2623: } else {
2624: @attributes = ($env{'form.embedded_attrib_'.$i});
2625: }
1.320 ! raeburn 2626: foreach my $attr (@attributes) {
! 2627: push(@{$attribs{$i}},&unescape($attr));
1.188 raeburn 2628: }
2629: if ($javacodebase) {
2630: $codebase{$i} = $javacodebase;
2631: $codebase{$i} =~ s#/$##;
2632: $updateflag = 1;
2633: }
2634: }
2635: unless ($newname{$i} eq $origname{$i}) {
2636: $updateflag = 1;
2637: }
2638: }
2639: # Process file upload - phase three - modify primary file
2640: if ($updateflag) {
2641: my ($content,$rtncode);
2642: my $updateflag = 0;
2643: my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
2644: if ($getstatus eq 'ok') {
1.320 ! raeburn 2645: foreach my $item (keys(%newname)) {
1.188 raeburn 2646: if ($newname{$item} ne $origname{$item}) {
2647: my $attrib_regexp = '';
2648: if (@{$attribs{$item}} > 1) {
2649: $attrib_regexp = join('|',@{$attribs{$item}});
2650: } else {
2651: $attrib_regexp = $attribs{$item}[0];
2652: }
2653: if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
2654: }
2655: $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi;
2656: }
2657: if (exists($codebase{$item})) {
1.224 albertel 2658: $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188 raeburn 2659: }
2660: }
2661: # Save edited file.
2662: my $saveresult;
2663: my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
2664: my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191 raeburn 2665: my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188 raeburn 2666: } else {
2667: &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus);
2668: }
2669: }
2670: }
2671: }
2672:
2673: unless ($showdoc || $upload_result eq 'phasetwo') {
1.81 www 2674: # -----------------------------------------------------------------------------
2675: my %lt=&Apache::lonlocal::texthash(
1.229 raeburn 2676: 'uplm' => 'Upload a new main '.lc($type).' document',
2677: 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168 www 2678: 'impp' => 'Import a document',
2679: 'pubd' => 'Published documents',
1.181 www 2680: 'copm' => 'All documents out of a published map into this folder',
1.81 www 2681: 'spec' => 'Special documents',
2682: 'upld' => 'Upload Document',
2683: 'srch' => 'Search',
2684: 'impo' => 'Import',
1.232 www 2685: 'book' => 'Import Bookmarks',
1.81 www 2686: 'selm' => 'Select Map',
2687: 'load' => 'Load Map',
1.186 www 2688: 'reco' => 'Recover Deleted Resources',
1.81 www 2689: 'newf' => 'New Folder',
1.142 raeburn 2690: 'newp' => 'New Composite Page',
1.81 www 2691: 'extr' => 'External Resource',
2692: 'syll' => 'Syllabus',
2693: 'navc' => 'Navigate Contents',
2694: 'sipa' => 'Simple Page',
2695: 'sipr' => 'Simple Problem',
1.219 www 2696: 'drbx' => 'Drop Box',
1.81 www 2697: 'scuf' => 'Score Upload Form',
2698: 'bull' => 'Bulletin Board',
1.96 sakharuk 2699: 'mypi' => 'My Personal Info',
1.255 raeburn 2700: 'grpo' => 'Group Files',
1.294 raeburn 2701: 'rost' => 'Course Roster',
1.101 www 2702: 'abou' => 'About User',
1.110 raeburn 2703: 'imsf' => 'Import IMS package',
1.96 sakharuk 2704: 'file' => 'File',
2705: 'title' => 'Title',
1.188 raeburn 2706: 'comment' => 'Comment',
2707: 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81 www 2708: );
2709: # -----------------------------------------------------------------------------
1.42 www 2710: if ($allowed) {
1.281 albertel 2711: &update_paste_buffer($coursenum,$coursedom);
1.74 www 2712: my $dumpbut=&dumpbutton();
1.138 raeburn 2713: my $exportbut=&exportbutton();
1.88 www 2714: my %lt=&Apache::lonlocal::texthash(
2715: 'vc' => 'Verify Content',
2716: 'cv' => 'Check/Set Resource Versions',
1.208 albertel 2717: 'ls' => 'List Symbs',
1.247 www 2718: 'sl' => 'Show Log'
1.88 www 2719: );
1.118 albertel 2720:
1.174 albertel 2721: my $folderpath=$env{'form.folderpath'};
1.118 albertel 2722: if (!$folderpath) {
1.174 albertel 2723: if ($env{'form.folder'} eq '' ||
2724: $env{'form.folder'} eq 'supplemental') {
1.118 albertel 2725: $folderpath='default&'.
1.230 albertel 2726: &escape(&mt('Main '.$type.' Documents'));
1.118 albertel 2727: }
2728: }
1.174 albertel 2729: unless ($env{'form.pagepath'}) {
1.142 raeburn 2730: $containertag = '<input type="hidden" name="folderpath" value="" />';
1.282 albertel 2731: $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
1.142 raeburn 2732: }
2733:
1.42 www 2734: $r->print(<<ENDCOURSEVERIFY);
1.36 www 2735: <form name="renameform" method="post" action="/adm/coursedocs">
1.283 albertel 2736: <input type="hidden" name="title" />
2737: <input type="hidden" name="cmd" />
2738: <input type="hidden" name="markcopy" />
2739: <input type="hidden" name="copyfolder" />
2740: $containertag
1.36 www 2741: </form>
1.39 www 2742: <form name="simpleedit" method="post" action="/adm/coursedocs">
1.283 albertel 2743: <input type="hidden" name="importdetail" value="" />
2744: $uploadtag
1.39 www 2745: </form>
1.26 www 2746: <form action="/adm/coursedocs" method="post" name="courseverify">
1.283 albertel 2747: <div class="LC_docs_course_commands">
2748:
2749: <div>
2750: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
2751: </div>
2752: <div>
2753: <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
2754: </div>
2755: $dumpbut
2756: $exportbut
2757: <div>
2758: <input type="submit" name="listsymbs" value="$lt{'ls'}" />
2759: </div>
2760: <div>
2761: <input type="hidden" name="folder" value="$env{'form.folder'}" />
2762: <input type="submit" name="docslog" value="$lt{'sl'}" />
2763: </div>
2764: </div>
1.25 www 2765: </form>
1.283 albertel 2766: <div style="clear: both; height: 0px;"> </div>
1.25 www 2767: ENDCOURSEVERIFY
1.74 www 2768: $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230 albertel 2769: &mt('Editing the Table of Contents for your '.$type)));
1.25 www 2770: }
1.17 www 2771: # --------------------------------------------------------- Standard documents
1.293 albertel 2772: $r->print('<table class="LC_docs_documents">');
2773:
1.7 www 2774: if (($standard) && ($allowed) && (!$forcesupplement)) {
1.285 albertel 2775: $r->print('<tr><td class="LC_docs_document">');
1.116 albertel 2776: # '<h2>'.&mt('Main Course Documents').
2777: # ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174 albertel 2778: my $folder=$env{'form.folder'};
1.117 albertel 2779: if ($folder eq '' || $folder eq 'supplemental') {
1.112 raeburn 2780: $folder='default';
1.230 albertel 2781: $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.293 albertel 2782: $uploadtag = '<input type="hidden" name="folderpath" value="'.
2783: &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
1.112 raeburn 2784: }
1.51 www 2785: my $postexec='';
2786: if ($folder eq 'default') {
1.286 albertel 2787: $r->print('<script type="text/javascript">this.window.name="loncapaclient";</script>');
1.51 www 2788: } else {
1.117 albertel 2789: #$postexec='self.close();';
1.51 www 2790: }
1.40 www 2791: $hadchanges=0;
1.292 albertel 2792: my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,
1.309 raeburn 2793: $upload_output,$type);
1.292 albertel 2794: if ($error) {
2795: $r->print('<p><span class="LC_error">'.$error.'</span></p>');
2796: }
1.40 www 2797: if ($hadchanges) {
1.320 ! raeburn 2798: &mark_hash_old();
1.40 www 2799: }
1.136 albertel 2800: &changewarning($r,$postexec);
1.16 www 2801: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2802: '.sequence';
1.142 raeburn 2803: my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2804: '.page';
1.186 www 2805: my $container='sequence';
2806: if ($env{'form.pagepath'}) {
2807: $container='page';
2808: }
2809: my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8 www 2810: $r->print(<<ENDFORM);
1.285 albertel 2811: <table class="LC_docs_adddocs">
2812: <tr>
2813: <th>$lt{'uplm'}</th>
2814: <th>$lt{'impp'}</th>
2815: <th>$lt{'spec'}</th>
1.11 www 2816: </tr>
1.285 albertel 2817: <tr>
2818: <td>
1.96 sakharuk 2819: $lt{'file'}:<br />
1.182 albertel 2820: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.286 albertel 2821: <input type="file" name="uploaddoc" size="40" />
1.8 www 2822: <br />
1.96 sakharuk 2823: $lt{'title'}:<br />
1.286 albertel 2824: <input type="text" size="50" name="comment" />
1.142 raeburn 2825: $uploadtag
1.286 albertel 2826: <input type="hidden" name="cmd" value="upload_default" />
1.188 raeburn 2827: <br />
1.284 albertel 2828: <span class="LC_nobreak">
1.190 albertel 2829: <label>$lt{'parse'}?
1.306 www 2830: <input type="checkbox" name="parserflag" checked="checked" />
1.190 albertel 2831: </label>
1.284 albertel 2832: </span>
1.188 raeburn 2833: <br />
2834: <br />
1.284 albertel 2835: <span class="LC_nobreak">
1.286 albertel 2836: <input type="submit" value="$lt{'upld'}" />
1.60 albertel 2837: $help{'Uploading_From_Harddrive'}
1.284 albertel 2838: </span>
1.60 albertel 2839: </form>
1.11 www 2840: </td>
1.285 albertel 2841: <td>
1.39 www 2842: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168 www 2843: $lt{'pubd'}<br />
1.142 raeburn 2844: $uploadtag
1.286 albertel 2845: <input type="button" onClick="javascript:groupsearch()" value="$lt{'srch'}" />
1.232 www 2846: <br />
1.284 albertel 2847: <span class="LC_nobreak">
1.286 albertel 2848: <input type="button" onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58 albertel 2849: $help{'Importing_LON-CAPA_Resource'}
1.284 albertel 2850: </span>
1.232 www 2851: <br />
1.286 albertel 2852: <input type="button" onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
2853: <hr />
1.59 www 2854: <p>
1.181 www 2855: $lt{'copm'}<br />
1.282 albertel 2856: <input type="text" size="40" name="importmap" /><br />
1.286 albertel 2857: <span class="LC_nobreak"><input type="button"
1.52 www 2858: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.282 albertel 2859: value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />
1.284 albertel 2860: $help{'Load_Map'}</span>
1.59 www 2861: </p>
1.52 www 2862: </form>
1.186 www 2863: <hr />
2864: <form action="/adm/groupsort" method="post" name="recover">
1.232 www 2865: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186 www 2866: </form>
1.142 raeburn 2867: ENDFORM
1.174 albertel 2868: unless ($env{'form.pagepath'}) {
1.168 www 2869: $r->print(<<ENDFORM);
2870: <hr />
2871: <form action="/adm/coursedocs" method="post" name="newext">
2872: $uploadtag
1.256 albertel 2873: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2874: <span class="LC_nobreak">
1.168 www 2875: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
2876: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.284 albertel 2877: </span>
1.168 www 2878: </form>
1.214 www 2879: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168 www 2880: <input type="hidden" name="folder" value="$folder" />
2881: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
2882: </form>
2883: ENDFORM
2884: }
1.285 albertel 2885: $r->print('</td><td>');
1.174 albertel 2886: unless ($env{'form.pagepath'}) {
1.282 albertel 2887: my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
1.142 raeburn 2888: $r->print(<<ENDFORM);
1.214 www 2889: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.282 albertel 2890: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 2891: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2892: <span class="LC_nobreak">
1.16 www 2893: <input name="newfolder" type="button"
2894: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 2895: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.284 albertel 2896: </span>
1.11 www 2897: </form>
1.214 www 2898: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.282 albertel 2899: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 2900: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2901: <span class="LC_nobreak">
1.142 raeburn 2902: <input name="newpage" type="button"
2903: onClick="javascript:makenewpage(this.form,'$pageseq');"
2904: value="$lt{'newp'}" />$help{'Adding_Pages'}
1.284 albertel 2905: </span>
1.142 raeburn 2906: </form>
1.214 www 2907: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142 raeburn 2908: $uploadtag
1.256 albertel 2909: <input type="hidden" name="importdetail"
1.305 bisitz 2910: value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
1.284 albertel 2911: <span class="LC_nobreak">
1.81 www 2912: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 2913: $help{'Syllabus'}
1.284 albertel 2914: </span>
1.58 albertel 2915: </form>
1.214 www 2916: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142 raeburn 2917: $uploadtag
1.256 albertel 2918: <input type="hidden" name="importdetail"
1.305 bisitz 2919: value="$lt{'navc'}=/adm/navmaps" />
1.284 albertel 2920: <span class="LC_nobreak">
1.81 www 2921: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47 www 2922: $help{'Navigate_Content'}
1.284 albertel 2923: </span>
1.22 www 2924: </form>
1.214 www 2925: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142 raeburn 2926: $uploadtag
1.256 albertel 2927: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2928: <span class="LC_nobreak">
1.81 www 2929: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65 bowersj2 2930: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.284 albertel 2931: </span>
1.55 www 2932: </form>
1.214 www 2933: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142 raeburn 2934: $uploadtag
1.256 albertel 2935: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2936: <span class="LC_nobreak">
1.81 www 2937: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65 bowersj2 2938: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.284 albertel 2939: </span>
1.62 www 2940: </form>
1.219 www 2941: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
2942: $uploadtag
1.256 albertel 2943: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2944: <span class="LC_nobreak">
1.219 www 2945: <input name="newdropbox" type="button" value="$lt{'drbx'}"
2946: onClick="javascript:makedropbox();" />
1.284 albertel 2947: </span>
1.219 www 2948: </form>
1.214 www 2949: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 2950: $uploadtag
1.256 albertel 2951: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2952: <span class="LC_nobreak">
1.81 www 2953: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62 www 2954: onClick="javascript:makeexamupload();" />
1.66 bowersj2 2955: $help{'Score_Upload_Form'}
1.284 albertel 2956: </span>
1.22 www 2957: </form>
1.214 www 2958: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142 raeburn 2959: $uploadtag
1.256 albertel 2960: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2961: <span class="LC_nobreak">
1.81 www 2962: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22 www 2963: onClick="javascript:makebulboard();" />
1.65 bowersj2 2964: $help{'Bulletin Board'}
1.284 albertel 2965: </span>
1.58 albertel 2966: </form>
1.214 www 2967: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142 raeburn 2968: $uploadtag
1.256 albertel 2969: <input type="hidden" name="importdetail"
2970: value="$plainname=/adm/$udom/$uname/aboutme" />
1.284 albertel 2971: <span class="LC_nobreak">
1.81 www 2972: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 2973: $help{'My Personal Info'}
1.284 albertel 2974: </span>
1.101 www 2975: </form>
1.214 www 2976: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142 raeburn 2977: $uploadtag
1.256 albertel 2978: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2979: <span class="LC_nobreak">
1.101 www 2980: <input name="newaboutsomeone" type="button" value="$lt{'abou'}"
2981: onClick="javascript:makeabout();" />
1.284 albertel 2982: </span>
1.182 albertel 2983: </form>
1.255 raeburn 2984: <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
2985: $uploadtag
1.256 albertel 2986: <input type="hidden" name="importdetail"
1.305 bisitz 2987: value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
1.284 albertel 2988: <span class="LC_nobreak">
1.255 raeburn 2989: <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
2990: $help{'Group Files'}
1.284 albertel 2991: </span>
1.255 raeburn 2992: </form>
1.294 raeburn 2993: <br /><form action="/adm/coursedocs" method="post" name="newroster">
2994: $uploadtag
2995: <input type="hidden" name="importdetail"
1.305 bisitz 2996: value="$lt{'rost'}=/adm/viewclasslist" />
1.294 raeburn 2997: <span class="LC_nobreak">
2998: <input name="newroster" type="submit" value="$lt{'rost'}" />
2999: $help{'Course Roster'}
3000: </span>
3001: </form>
1.142 raeburn 3002: ENDFORM
3003: }
1.174 albertel 3004: if ($env{'form.pagepath'}) {
1.142 raeburn 3005: $r->print(<<ENDBLOCK);
3006: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
3007: $uploadtag
1.256 albertel 3008: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3009: <span class="LC_nobreak">
1.142 raeburn 3010: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
3011: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.284 albertel 3012: </span>
1.142 raeburn 3013: </form>
1.214 www 3014: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 3015: $uploadtag
1.256 albertel 3016: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3017: <span class="LC_nobreak">
1.142 raeburn 3018: <input name="newexamupload" type="button" value="$lt{'scuf'}"
3019: onClick="javascript:makeexamupload();" />
3020: $help{'Score_Upload_Form'}
1.284 albertel 3021: </span>
1.182 albertel 3022: </form>
1.142 raeburn 3023: ENDBLOCK
3024: }
3025: $r->print('</td></tr>'."\n".
3026: '</table>');
1.24 www 3027: $r->print('</td></tr>');
1.7 www 3028: }
3029: # ----------------------------------------------------- Supplemental documents
3030: if (!$forcestandard) {
1.285 albertel 3031: $r->print('<tr><td class="LC_docs_document">');
1.116 albertel 3032: # '<h2>'.&mt('Supplemental Course Documents').
3033: # ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174 albertel 3034: my $folder=$env{'form.folder'};
1.117 albertel 3035: unless ($folder=~/^supplemental/) {
1.116 albertel 3036: $folder='supplemental';
1.117 albertel 3037: }
3038: if ($folder =~ /^supplemental$/ &&
1.309 raeburn 3039: (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
3040: $env{'form.folderpath'} = 'supplemental&'.
3041: &escape(&mt('Supplemental '.$type.' Documents'));
1.116 albertel 3042: }
1.309 raeburn 3043: my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type);
1.292 albertel 3044: if ($error) {
3045: $r->print('<p><span class="LC_error">'.$error.'</span></p>');
3046: }
1.8 www 3047: if ($allowed) {
1.282 albertel 3048: my $folderseq=
3049: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
3050: '.sequence';
1.17 www 3051:
1.282 albertel 3052: my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
3053: $r->print(<<ENDSUPFORM);
1.285 albertel 3054: <table class="LC_docs_adddocs"><tr>
3055: <th>$lt{'upls'}</th>
3056: <th>$lt{'spec'}</th>
1.17 www 3057: </tr>
1.285 albertel 3058: <tr><td>
1.10 www 3059: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.286 albertel 3060: <input type="file" name="uploaddoc" size="40" />
1.196 raeburn 3061: <br />
3062: <br />
1.284 albertel 3063: <span class="LC_nobreak">
1.196 raeburn 3064: <label>$lt{'parse'}?
3065: <input type="checkbox" name="parserflag" />
3066: </label>
1.284 albertel 3067: </span>
1.196 raeburn 3068: <br /><br />
3069: $lt{'comment'}:<br />
1.4 www 3070: <textarea cols=50 rows=4 name='comment'>
3071: </textarea>
1.115 albertel 3072: <br />
1.282 albertel 3073: <input type="hidden" name="folderpath" value="$path" />
1.286 albertel 3074: <input type="hidden" name="cmd" value="upload_supplemental" />
1.284 albertel 3075: <span class="LC_nobreak">
1.286 albertel 3076: <input type="submit" value="$lt{'upld'}" />
1.58 albertel 3077: $help{'Uploading_From_Harddrive'}
1.284 albertel 3078: </span>
1.58 albertel 3079: </form>
1.17 www 3080: </td>
1.285 albertel 3081: <td>
1.18 www 3082: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.282 albertel 3083: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3084: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3085: <span class="LC_nobreak">
1.17 www 3086: <input name="newfolder" type="button"
3087: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 3088: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.284 albertel 3089: </span>
1.17 www 3090: </form>
1.214 www 3091: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.282 albertel 3092: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3093: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3094: <span class="LC_nobreak">
1.18 www 3095: <input name="newext" type="button"
3096: onClick="javascript:makenewext('supnewext');"
1.81 www 3097: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.284 albertel 3098: </span>
1.17 www 3099: </form>
1.214 www 3100: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.282 albertel 3101: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3102: <input type="hidden" name="importdetail"
3103: value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
1.284 albertel 3104: <span class="LC_nobreak">
1.81 www 3105: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 3106: $help{'Syllabus'}
1.284 albertel 3107: </span>
1.58 albertel 3108: </form>
1.214 www 3109: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.282 albertel 3110: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3111: <input type="hidden" name="importdetail"
3112: value="$plainname=/adm/$udom/$uname/aboutme" />
1.284 albertel 3113: <span class="LC_nobreak">
1.81 www 3114: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 3115: $help{'My Personal Info'}
1.284 albertel 3116: </span>
1.58 albertel 3117: </form>
1.17 www 3118: </td></tr>
1.24 www 3119: </table></td></tr>
1.8 www 3120: ENDSUPFORM
3121: }
1.7 www 3122: }
1.286 albertel 3123: $r->print('</table>');
1.18 www 3124: if ($allowed) {
1.287 albertel 3125: $r->print('
3126: <form method="post" name="extimport" action="/adm/coursedocs">
3127: <input type="hidden" name="title" />
3128: <input type="hidden" name="url" />
3129: <input type="hidden" name="useform" />
3130: <input type="hidden" name="residx" />
3131: </form>');
1.18 www 3132: }
1.19 www 3133: } else {
1.188 raeburn 3134: unless ($upload_result eq 'phasetwo') {
1.19 www 3135: # -------------------------------------------------------- This is showdoc mode
1.188 raeburn 3136: $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141 albertel 3137: &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.286 albertel 3138: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".
3139: &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');
1.188 raeburn 3140: }
1.19 www 3141: }
1.26 www 3142: }
1.224 albertel 3143: $r->print(&Apache::loncommon::end_page());
1.26 www 3144: return OK;
1.1 www 3145: }
3146:
1.224 albertel 3147:
3148: sub editing_js {
3149: my ($udom,$uname) = @_;
3150: my $now = time();
1.302 bisitz 3151: my %lt = &Apache::lonlocal::texthash(
3152: p_mnf => 'Name of New Folder',
3153: t_mnf => 'New Folder',
3154: p_mnp => 'Name of New Page',
3155: t_mnp => 'New Page',
1.305 bisitz 3156: p_mxu => 'Title for the Uploaded Score',
3157: p_msp => 'Title for the Page',
3158: p_msb => 'Title for the Problem',
3159: p_mdb => 'Title for the Drop Box',
3160: p_mbb => 'Title for the Bulletin Board',
1.302 bisitz 3161: p_mab => "Enter user:domain for User's 'About Me' Page",
3162: p_mab2 => "About [_99]",
3163: p_mab_alrt1 => 'Not a valid user:domain',
3164: p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',
3165: p_chn => 'New Title',
3166: p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',
3167: p_rmr2a => 'Remove[_99]',
3168: p_rmr2b => '?[_99]',
1.303 raeburn 3169: p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',
3170: p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',
1.302 bisitz 3171: p_ctr2a => 'Cut[_98]',
3172: p_ctr2b => '?[_98]'
3173: );
1.224 albertel 3174:
3175: return <<ENDNEWSCRIPT;
3176: function makenewfolder(targetform,folderseq) {
1.302 bisitz 3177: var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
1.224 albertel 3178: if (foldername) {
1.236 albertel 3179: targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224 albertel 3180: targetform.submit();
3181: }
3182: }
3183:
3184: function makenewpage(targetform,folderseq) {
1.302 bisitz 3185: var pagename=prompt('$lt{"p_mnp"}','$lt{"t_mnp"}');
1.224 albertel 3186: if (pagename) {
1.236 albertel 3187: targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224 albertel 3188: targetform.submit();
3189: }
3190: }
3191:
3192: function makenewext(targetname) {
3193: this.document.forms.extimport.useform.value=targetname;
1.287 albertel 3194: this.document.forms.extimport.title.value='';
3195: this.document.forms.extimport.url.value='';
3196: this.document.forms.extimport.residx.value='';
3197: window.open('/adm/rat/extpickframe.html');
3198: }
3199:
3200: function edittext(targetname,residx,title,url) {
3201: this.document.forms.extimport.useform.value=targetname;
3202: this.document.forms.extimport.residx.value=residx;
3203: this.document.forms.extimport.url.value=url;
3204: this.document.forms.extimport.title.value=title;
1.224 albertel 3205: window.open('/adm/rat/extpickframe.html');
3206: }
3207:
3208: function makeexamupload() {
1.302 bisitz 3209: var title=prompt('$lt{"p_mxu"}');
1.224 albertel 3210: if (title) {
3211: this.document.forms.newexamupload.importdetail.value=
1.236 albertel 3212: escape(title)+'=/res/lib/templates/examupload.problem';
1.224 albertel 3213: this.document.forms.newexamupload.submit();
3214: }
3215: }
3216:
3217: function makesmppage() {
1.302 bisitz 3218: var title=prompt('$lt{"p_msp"}');
1.224 albertel 3219: if (title) {
3220: this.document.forms.newsmppg.importdetail.value=
1.236 albertel 3221: escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224 albertel 3222: this.document.forms.newsmppg.submit();
3223: }
3224: }
3225:
3226: function makesmpproblem() {
1.302 bisitz 3227: var title=prompt('$lt{"p_msb"}');
1.224 albertel 3228: if (title) {
3229: this.document.forms.newsmpproblem.importdetail.value=
1.236 albertel 3230: escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224 albertel 3231: this.document.forms.newsmpproblem.submit();
3232: }
3233: }
3234:
3235: function makedropbox() {
1.302 bisitz 3236: var title=prompt('$lt{"p_mdb"}');
1.224 albertel 3237: if (title) {
3238: this.document.forms.newdropbox.importdetail.value=
1.236 albertel 3239: escape(title)+'=/res/lib/templates/DropBox.problem';
1.224 albertel 3240: this.document.forms.newdropbox.submit();
3241: }
3242: }
3243:
3244: function makebulboard() {
1.302 bisitz 3245: var title=prompt('$lt{"p_mbb"}');
1.224 albertel 3246: if (title) {
3247: this.document.forms.newbul.importdetail.value=
1.236 albertel 3248: escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224 albertel 3249: this.document.forms.newbul.submit();
3250: }
3251: }
3252:
3253: function makeabout() {
1.303 raeburn 3254: var user=prompt("$lt{'p_mab'}");
1.224 albertel 3255: if (user) {
3256: var comp=new Array();
1.236 albertel 3257: comp=user.split(':');
1.224 albertel 3258: if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
3259: if ((comp[0]) && (comp[1])) {
3260: this.document.forms.newaboutsomeone.importdetail.value=
1.302 bisitz 3261: '$lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224 albertel 3262: this.document.forms.newaboutsomeone.submit();
3263: } else {
1.302 bisitz 3264: alert("$lt{'p_mab_alrt1'}");
1.224 albertel 3265: }
3266: } else {
1.302 bisitz 3267: alert("$lt{'p_mab_alrt2'}");
1.224 albertel 3268: }
3269: }
3270: }
3271:
3272: function makeims() {
3273: var caller = document.forms.ims.folder.value;
3274: var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
3275: newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
3276: newWindow.location.href = newlocation;
3277: }
3278:
3279:
3280: function finishpick() {
3281: var title=this.document.forms.extimport.title.value;
3282: var url=this.document.forms.extimport.url.value;
3283: var form=this.document.forms.extimport.useform.value;
1.287 albertel 3284: var residx=this.document.forms.extimport.residx.value;
3285: eval('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+'='+residx+'";this.document.forms.'+form+'.submit();');
1.224 albertel 3286: }
3287:
3288: function changename(folderpath,index,oldtitle,container,pagesymb) {
1.302 bisitz 3289: var title=prompt('$lt{"p_chn"}',oldtitle);
1.224 albertel 3290: if (title) {
1.281 albertel 3291: this.document.forms.renameform.markcopy.value=-1;
1.224 albertel 3292: this.document.forms.renameform.title.value=title;
3293: this.document.forms.renameform.cmd.value='rename_'+index;
3294: if (container == 'sequence') {
3295: this.document.forms.renameform.folderpath.value=folderpath;
3296: }
3297: if (container == 'page') {
3298: this.document.forms.renameform.pagepath.value=folderpath;
3299: this.document.forms.renameform.pagesymb.value=pagesymb;
3300: }
3301: this.document.forms.renameform.submit();
3302: }
3303: }
3304:
1.291 albertel 3305: function removeres(folderpath,index,oldtitle,container,pagesymb,skip_confirm) {
1.302 bisitz 3306: if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
1.281 albertel 3307: this.document.forms.renameform.markcopy.value=-1;
1.224 albertel 3308: this.document.forms.renameform.cmd.value='del_'+index;
3309: if (container == 'sequence') {
3310: this.document.forms.renameform.folderpath.value=folderpath;
3311: }
3312: if (container == 'page') {
3313: this.document.forms.renameform.pagepath.value=folderpath;
3314: this.document.forms.renameform.pagesymb.value=pagesymb;
3315: }
3316: this.document.forms.renameform.submit();
3317: }
3318: }
3319:
1.291 albertel 3320: function cutres(folderpath,index,oldtitle,container,pagesymb,folder,skip_confirm) {
1.303 raeburn 3321: if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
1.224 albertel 3322: this.document.forms.renameform.cmd.value='cut_'+index;
3323: this.document.forms.renameform.markcopy.value=index;
1.281 albertel 3324: this.document.forms.renameform.copyfolder.value=folder+'.'+container;
1.224 albertel 3325: if (container == 'sequence') {
3326: this.document.forms.renameform.folderpath.value=folderpath;
3327: }
3328: if (container == 'page') {
3329: this.document.forms.renameform.pagepath.value=folderpath;
3330: this.document.forms.renameform.pagesymb.value=pagesymb;
3331: }
3332: this.document.forms.renameform.submit();
3333: }
3334: }
3335:
1.281 albertel 3336: function markcopy(folderpath,index,oldtitle,container,pagesymb,folder) {
1.224 albertel 3337: this.document.forms.renameform.markcopy.value=index;
1.281 albertel 3338: this.document.forms.renameform.copyfolder.value=folder+'.'+container;
1.224 albertel 3339: if (container == 'sequence') {
3340: this.document.forms.renameform.folderpath.value=folderpath;
3341: }
3342: if (container == 'page') {
3343: this.document.forms.renameform.pagepath.value=folderpath;
3344: this.document.forms.renameform.pagesymb.value=pagesymb;
3345: }
3346: this.document.forms.renameform.submit();
3347: }
3348:
3349: ENDNEWSCRIPT
3350: }
1.1 www 3351: 1;
3352: __END__
1.315 jms 3353:
1.317 jms 3354:
3355: =head1 NAME
3356:
3357: Apache::londocs.pm
3358:
3359: =head1 SYNOPSIS
3360:
3361: This is part of the LearningOnline Network with CAPA project
3362: described at http://www.lon-capa.org.
3363:
3364: =head1 SUBROUTINES
3365:
3366: =over
3367:
3368: =item %help=()
3369:
3370: Available help topics
3371:
3372: =item mapread()
3373:
3374: Mapread read maps into LONCAPA::map:: global arrays
3375: @order and @resources, determines status
3376: sets @order - pointer to resources in right order
3377: sets @resources - array with the resources with correct idx
3378:
3379: =item authorhosts()
3380:
3381: Return hash with valid author names
3382:
3383: =item dumpbutton()
3384:
3385: Generate "dump" button
3386:
3387: =item clean()
3388:
3389: =item dumpcourse()
3390:
3391: Actually dump course
3392:
3393:
3394: =item exportbutton()
3395:
3396: Generate "export" button
3397:
3398: =item exportcourse()
3399:
3400: =item create_ims_store()
3401:
3402: =item build_package()
3403:
3404: =item get_dependencies()
3405:
3406: =item process_content()
3407:
3408: =item replicate_content()
3409:
3410: =item extract_media()
3411:
3412: =item store_template()
3413:
3414: =item group_import()
3415:
3416: Imports the given (name, url) resources into the course
3417: coursenum, coursedom, and folder must precede the list
3418:
3419: =item breadcrumbs()
3420:
3421: =item log_docs()
3422:
3423: =item docs_change_log()
3424:
3425: =item update_paste_buffer()
3426:
3427: =item print_paste_buffer()
3428:
3429: =item do_paste_from_buffer()
3430:
3431: =item update_parameter()
3432:
3433: =item handle_edit_cmd()
3434:
3435: =item editor()
3436:
3437: =item process_file_upload()
3438:
3439: =item process_secondary_uploads()
3440:
3441: =item is_supplemental_title()
3442:
3443: =item parse_supplemental_title()
3444:
3445: =item entryline()
3446:
3447: =item tiehash()
3448:
3449: =item untiehash()
3450:
3451: =item checkonthis()
3452:
3453: check on this
3454:
3455: =item verifycontent()
3456:
3457: Verify Content
3458:
3459: =item devalidateversioncache() & checkversions()
3460:
3461: Check Versions
3462:
3463: =item mark_hash_old()
3464:
3465: =item is_hash_old()
3466:
3467: =item changewarning()
3468:
3469: =item init_breadcrumbs()
3470:
3471: Breadcrumbs for special functions
1.315 jms 3472:
3473: =back
3474:
3475: =cut
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>