Annotation of loncom/interface/londocs.pm, revision 1.324
1.1 www 1: # The LearningOnline Network
1.2 www 2: # Documents
1.1 www 3: #
1.324 ! raeburn 4: # $Id: londocs.pm,v 1.323 2008/12/15 06:32:01 raeburn 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:
1.321 raeburn 1273: if (!$env{'form.pastemarked'}) {
1274: return;
1275: }
1.292 albertel 1276:
1.289 albertel 1277: # paste resource to end of list
1278: my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
1279: my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
1280: # Maps need to be copied first
1281: if (($url=~/\.(page|sequence)$/) && ($url=~/^\/uploaded\//)) {
1282: $title=&mt('Copy of').' '.$title;
1.323 raeburn 1283: my $newid=$$.int(rand(100)).time;
1.322 raeburn 1284: my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
1285: if ($oldid =~ m{^(/uploaded/\Q$coursedom\E/\Q$coursenum\E/)(\D+)(\d+)$}) {
1286: my $path = $1;
1287: my $prefix = $2;
1288: my $ancestor = $3;
1289: if (length($ancestor) > 10) {
1290: $ancestor = substr($ancestor,-10,10);
1291: }
1292: $oldid = $path.$prefix.$ancestor;
1293: }
1294: my $counter = 0;
1295: my $newurl=$oldid.$newid.'.'.$ext;
1296: my $is_unique = &uniqueness_check($newurl);
1297: while (!$is_unique && $counter < 100) {
1298: $counter ++;
1299: $newid ++;
1300: $newurl = $oldid.$newid;
1301: $is_unique = &uniqueness_check($newurl);
1302: }
1303: if (!$is_unique) {
1304: if ($url=~/\.page$/) {
1305: return &mt('Paste failed: an error occurred creating a unique URL for the composite page');
1306: } else {
1307: return &mt('Paste failed: an error occurred creating a unique URL for the folder');
1308: }
1309: }
1.289 albertel 1310: my $storefn=$newurl;
1311: $storefn=~s{^/\w+/$match_domain/$match_username/}{};
1.321 raeburn 1312: my $paste_map_result =
1313: &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
1314: &Apache::lonnet::getfile($url));
1315: if ($paste_map_result eq '/adm/notfound.html') {
1316: if ($url=~/\.page$/) {
1317: return &mt('Paste failed: an error occurred saving the composite page');
1318: } else {
1319: return &mt('Paste failed: an error occurred saving the folder');
1320: }
1321: }
1.289 albertel 1322: $url = $newurl;
1323: }
1.290 albertel 1324: # published maps can only exists once, so remove it from paste buffer when done
1.289 albertel 1325: if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) {
1326: &Apache::lonnet::delenv('docs\\.markedcopy');
1327: }
1.290 albertel 1328: if ($url=~ m{/smppg$}) {
1329: my $db_name = &Apache::lonsimplepage::get_db_name($url);
1330: if ($db_name =~ /^smppage_/) {
1331: #simple pages, need to copy the db contents to a new one.
1332: my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
1333: my $now = time();
1334: $db_name =~ s{_\d*$ }{_$now}x;
1335: my $result=&Apache::lonnet::put($db_name,\%contents,
1336: $coursedom,$coursenum);
1337: $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
1338: $title=&mt('Copy of').' '.$title;
1339: }
1340: }
1.289 albertel 1341: $title = &LONCAPA::map::qtunescape($title);
1342: my $ext='false';
1343: if ($url=~m{^http(|s)://}) { $ext='true'; }
1344: $url = &LONCAPA::map::qtunescape($url);
1345: # Now insert the URL at the bottom
1346: my $newidx = &LONCAPA::map::getresidx($url);
1.311 raeburn 1347: if ($env{'docs.markedcopy_supplemental'}) {
1348: if ($folder =~ /^supplemental/) {
1349: $title = $env{'docs.markedcopy_supplemental'};
1350: } else {
1351: (undef,undef,$title) =
1352: &parse_supplemental_title($env{'docs.markedcopy_supplemental'});
1353: }
1354: } else {
1355: if ($folder=~/^supplemental/) {
1356: $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
1357: $env{'user.domain'}.'___&&&___'.$title;
1358: }
1359: }
1360:
1.289 albertel 1361: $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
1362: push(@LONCAPA::map::order, $newidx);
1.321 raeburn 1363: return 'ok';
1.289 albertel 1364: # Store the result
1.292 albertel 1365: }
1366:
1.322 raeburn 1367: sub uniqueness_check {
1368: my ($newurl) = @_;
1369: my $unique = 1;
1370: foreach my $res (@LONCAPA::map::order) {
1371: my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
1372: $url=&LONCAPA::map::qtescape($url);
1373: if ($newurl eq $url) {
1374: $unique = 0;
1375: last;
1376: }
1377: }
1378: return $unique;
1379: }
1380:
1.292 albertel 1381: my %parameter_type = ( 'randompick' => 'int_pos',
1382: 'hiddenresource' => 'string_yesno',
1.296 albertel 1383: 'encrypturl' => 'string_yesno',
1384: 'randomorder' => 'string_yesno',);
1.292 albertel 1385: my $valid_parameters_re = join('|',keys(%parameter_type));
1386: # set parameters
1387: sub update_parameter {
1388:
1389: return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
1390:
1391: my $which = $env{'form.changeparms'};
1392: my $idx = $env{'form.setparms'};
1393: if ($env{'form.'.$which.'_'.$idx}) {
1394: my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx}
1395: : 'yes';
1396: &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
1397: $parameter_type{$which});
1398: &remember_parms($idx,$which,'set',$value);
1399: } else {
1400: &LONCAPA::map::delparameter($idx,'parameter_'.$which);
1401:
1402: &remember_parms($idx,$which,'del');
1403: }
1404: return 1;
1405: }
1406:
1407:
1408: sub handle_edit_cmd {
1409: my ($coursenum,$coursedom) =@_;
1410:
1411: my ($cmd,$idx)=split('_',$env{'form.cmd'});
1412:
1413: my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1414: my ($title, $url, @rrest) = split(':', $ratstr);
1415:
1416: if ($cmd eq 'del') {
1417: if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1418: ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1419: &Apache::lonnet::removeuploadedurl($url);
1420: } else {
1421: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1422: }
1423: splice(@LONCAPA::map::order, $idx, 1);
1424:
1425: } elsif ($cmd eq 'cut') {
1426: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1427: splice(@LONCAPA::map::order, $idx, 1);
1428:
1429: } elsif ($cmd eq 'up'
1430: && ($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
1431: @LONCAPA::map::order[$idx-1,$idx] = @LONCAPA::map::order[$idx,$idx-1];
1432:
1433: } elsif ($cmd eq 'down'
1434: && defined($LONCAPA::map::order[$idx+1])) {
1435: @LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1];
1436:
1437: } elsif ($cmd eq 'rename') {
1438:
1439: my $comment = &LONCAPA::map::qtunescape($env{'form.title'});
1440: if ($comment=~/\S/) {
1441: $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
1442: $comment.':'.join(':', $url, @rrest);
1443: }
1444: # Devalidate title cache
1445: my $renamed_url=&LONCAPA::map::qtescape($url);
1446: &Apache::lonnet::devalidate_title_cache($renamed_url);
1447: } else {
1448: return 0;
1449: }
1450: return 1;
1.289 albertel 1451: }
1452:
1.7 www 1453: sub editor {
1.309 raeburn 1454: my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_;
1.292 albertel 1455:
1456: my $container= ($env{'form.pagepath'}) ? 'page'
1457: : 'sequence';
1458:
1459: my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
1460: $folder.'.'.$container);
1461: return $errtext if ($fatal);
1462:
1.245 albertel 1463: if ($#LONCAPA::map::order<1) {
1464: my $idx=&LONCAPA::map::getresidx();
1.178 www 1465: if ($idx<=0) { $idx=1; }
1.245 albertel 1466: $LONCAPA::map::order[0]=$idx;
1467: $LONCAPA::map::resources[$idx]='';
1.17 www 1468: }
1.281 albertel 1469:
1.296 albertel 1470: my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=
1.309 raeburn 1471: &breadcrumbs($folder,$allowed,$type);
1.242 www 1472: $r->print($breadcrumbtrail);
1.292 albertel 1473:
1.7 www 1474: # ------------------------------------------------------------ Process commands
1.121 www 1475:
1.16 www 1476: # ---------------- if they are for this folder and user allowed to make changes
1.292 albertel 1477: if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123 www 1478: # set parameters and change order
1.292 albertel 1479: &snapshotbefore();
1480:
1481: if (&update_parameter()) {
1482: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1483: return $errtext if ($fatal);
1484: }
1.121 www 1485:
1.292 albertel 1486: if ($env{'form.newpos'} && $env{'form.currentpos'}) {
1.123 www 1487: # change order
1.292 albertel 1488: my $res = splice(@LONCAPA::map::order,$env{'form.currentpos'}-1,1);
1489: splice(@LONCAPA::map::order,$env{'form.newpos'}-1,0,$res);
1490:
1491: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1492: return $errtext if ($fatal);
1493: }
1494:
1495: if ($env{'form.pastemarked'}) {
1.321 raeburn 1496: my $paste_res =
1497: &do_paste_from_buffer($coursenum,$coursedom,$folder);
1498: if ($paste_res eq 'ok') {
1499: ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
1500: return $errtext if ($fatal);
1501: } elsif ($paste_res ne '') {
1502: $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');
1503: }
1.292 albertel 1504: }
1505:
1506: $r->print($upload_output);
1507:
1508: if (&handle_edit_cmd()) {
1509: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1510: return $errtext if ($fatal);
1511: }
1512: # Group import/search
1513: if ($env{'form.importdetail'}) {
1514: my @imports;
1.320 raeburn 1515: foreach my $item (split(/\&/,$env{'form.importdetail'})) {
1516: if (defined($item)) {
1.292 albertel 1517: my ($name,$url,$residx)=
1.320 raeburn 1518: map {&unescape($_)} split(/\=/,$item);
1.292 albertel 1519: push(@imports, [$name, $url, $residx]);
1.123 www 1520: }
1.247 www 1521: }
1.292 albertel 1522: ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
1523: $container,'londocs',@imports);
1524: return $errtext if ($fatal);
1525: }
1526: # Loading a complete map
1527: if ($env{'form.loadmap'}) {
1528: if ($env{'form.importmap'}=~/\w/) {
1529: foreach my $res (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
1530: my ($title,$url,$ext,$type)=split(/\:/,$res);
1531: my $idx=&LONCAPA::map::getresidx($url);
1532: $LONCAPA::map::resources[$idx]=$res;
1533: $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.168 www 1534: }
1.104 albertel 1535: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142 raeburn 1536: $folder.'.'.$container);
1.292 albertel 1537: return $errtext if ($fatal);
1538: } else {
1539: $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');
1540:
1541: }
1.281 albertel 1542: }
1.292 albertel 1543: &log_differences($plain);
1544: }
1.16 www 1545: # ---------------------------------------------------------------- End commands
1.7 www 1546: # ---------------------------------------------------------------- Print screen
1.292 albertel 1547: my $idx=0;
1548: my $shown=0;
1.296 albertel 1549: if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) {
1.292 albertel 1550: $r->print('<p>'.&mt('Parameters').':<ul>'.
1551: ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
1552: ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
1553: ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
1554: '</ul></p>');
1555: }
1556: if ($randompick>=0) {
1557: $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>');
1558: }
1.296 albertel 1559: if ($is_random_order) {
1560: $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>');
1561: }
1.292 albertel 1562: $r->print('<table class="LC_docs_editor">');
1563: foreach my $res (@LONCAPA::map::order) {
1564: my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
1565: $name=&LONCAPA::map::qtescape($name);
1566: $url=&LONCAPA::map::qtescape($url);
1567: unless ($name) { $name=(split(/\//,$url))[-1]; }
1568: unless ($name) { $idx++; next; }
1569: $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res,
1570: $coursenum));
1571: $idx++;
1572: $shown++;
1573: }
1574: unless ($shown) {
1575: $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
1.7 www 1576: }
1.292 albertel 1577: $r->print("\n</table>\n");
1.310 raeburn 1578: if ($allowed) {
1579: &print_paste_buffer($r,$container);
1580: }
1.292 albertel 1581: return;
1.7 www 1582: }
1.1 www 1583:
1.188 raeburn 1584: sub process_file_upload {
1.194 raeburn 1585: my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188 raeburn 1586: # upload a file, if present
1587: my $parseaction;
1.190 albertel 1588: if ($env{'form.parserflag'}) {
1.188 raeburn 1589: $parseaction = 'parse';
1590: }
1591: my $phase_status;
1592: my $folder=$env{'form.folder'};
1.194 raeburn 1593: if ($folder eq '') {
1.188 raeburn 1594: $folder='default';
1595: }
1.194 raeburn 1596: if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188 raeburn 1597: my $errtext='';
1598: my $fatal=0;
1599: my $container='sequence';
1600: if ($env{'form.pagepath'}) {
1601: $container='page';
1602: }
1603: ($errtext,$fatal)=
1604: &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245 albertel 1605: if ($#LONCAPA::map::order<1) {
1606: $LONCAPA::map::order[0]=1;
1607: $LONCAPA::map::resources[1]='';
1.188 raeburn 1608: }
1609: if ($fatal) {
1610: return 'failed';
1611: }
1612: my $destination = 'docs/';
1.194 raeburn 1613: if ($folder =~ /^supplemental/) {
1614: $destination = 'supplemental/';
1615: }
1616: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1617: $destination .= 'default/';
1.194 raeburn 1618: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1619: $destination .= $2.'/';
1.188 raeburn 1620: }
1621: # this is for a course, not a user, so set coursedoc flag
1622: # probably the only place in the system where this should be "1"
1.245 albertel 1623: my $newidx=&LONCAPA::map::getresidx();
1.188 raeburn 1624: $destination .= $newidx;
1.190 albertel 1625: my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
1626: $parseaction,$allfiles,
1627: $codebase);
1.188 raeburn 1628: my $ext='false';
1.287 albertel 1629: if ($url=~m{^http://}) { $ext='true'; }
1.270 albertel 1630: $url = &LONCAPA::map::qtunescape($url);
1.188 raeburn 1631: my $comment=$env{'form.comment'};
1.270 albertel 1632: $comment = &LONCAPA::map::qtunescape($comment);
1.188 raeburn 1633: if ($folder=~/^supplemental/) {
1634: $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
1635: $env{'user.domain'}.'___&&&___'.$comment;
1636: }
1637:
1.245 albertel 1638: $LONCAPA::map::resources[$newidx]=
1639: $comment.':'.$url.':'.$ext.':normal:res';
1640: $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190 albertel 1641: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1642: $folder.'.'.$container);
1.188 raeburn 1643: if ($fatal) {
1.283 albertel 1644: $$upload_output .= '<p><span class="LC_error">'.$errtext.'</span></p>';
1.188 raeburn 1645: return 'failed';
1646: } else {
1647: if ($parseaction eq 'parse') {
1.190 albertel 1648: my $total_embedded = keys(%{$allfiles});
1.188 raeburn 1649: if ($total_embedded > 0) {
1650: my $num = 0;
1.269 albertel 1651: my $state = '
1.282 albertel 1652: <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
1.269 albertel 1653: <input type="hidden" name="cmd" value="upload_embedded" />
1.188 raeburn 1654: <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228 www 1655: <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188 raeburn 1656: <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
1.269 albertel 1657: $phase_status = 'phasetwo';
1658:
1659: $$upload_output .=
1660: 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'.
1.308 raeburn 1661: &Apache::loncommon::ask_for_embedded_content(
1662: '/adm/coursedocs',$state,$allfiles,$codebase);
1.188 raeburn 1663: } else {
1664: $$upload_output .= 'No embedded items identified<br />';
1665: }
1666: }
1667: }
1668: }
1669: return $phase_status;
1670: }
1671:
1672: sub process_secondary_uploads {
1673: my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
1674: my $folder=$env{'form.folder'};
1675: my $destination = 'docs/';
1.195 raeburn 1676: if ($folder =~ /^supplemental/) {
1677: $destination = 'supplemental/';
1678: }
1679: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1680: $destination .= 'default/';
1.195 raeburn 1681: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217 raeburn 1682: $destination .= $2.'/';
1.188 raeburn 1683: }
1684: $destination .= $newidx;
1685: my ($url,$filename);
1686: $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
1.265 albertel 1687: ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
1.188 raeburn 1688: return $filename;
1689: }
1690:
1.281 albertel 1691: sub is_supplemental_title {
1692: my ($title) = @_;
1693: return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/);
1694: }
1695:
1696: sub parse_supplemental_title {
1697: my ($title) = @_;
1698:
1699: my ($foldertitle,$renametitle);
1700: if ($title =~ /&&&/) {
1701: $title = &HTML::Entites::decode($title);
1702: }
1703: if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) {
1704: $renametitle=$4;
1705: my ($time,$uname,$udom) = ($1,$2,$3);
1706: $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
1707: my $name = &Apache::loncommon::plainname($uname,$udom);
1708: $name = &HTML::Entities::encode($name,'"<>&\'');
1709: $title='<i>'.&Apache::lonlocal::locallocaltime($time).'</i> '.
1710: $name.': <br />'.$foldertitle;
1711: }
1712: if (wantarray) {
1713: return ($title,$foldertitle,$renametitle);
1714: }
1715: return $title;
1716: }
1717:
1.8 www 1718: # --------------------------------------------------------------- An entry line
1719:
1720: sub entryline {
1.112 raeburn 1721: my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.281 albertel 1722:
1723: my ($foldertitle,$pagetitle,$renametitle);
1724: if (&is_supplemental_title($title)) {
1725: ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title);
1726: $pagetitle = $foldertitle;
1727: } else {
1728: $title=&HTML::Entities::encode($title,'"<>&\'');
1729: $renametitle=$title;
1730: $foldertitle=$title;
1731: $pagetitle=$title;
1732: }
1733:
1.245 albertel 1734: my $orderidx=$LONCAPA::map::order[$index];
1.281 albertel 1735:
1736:
1.222 albertel 1737: $renametitle=~s/\\/\\\\/g;
1.38 www 1738: $renametitle=~s/\"\;/\\\"/g;
1.286 albertel 1739: $renametitle=~s/ /%20/g;
1.8 www 1740: my $line='<tr>';
1.286 albertel 1741: my ($form_start,$form_end);
1.8 www 1742: # Edit commands
1.280 albertel 1743: my ($container, $type, $esc_path, $path, $symb);
1.174 albertel 1744: if ($env{'form.folderpath'}) {
1.280 albertel 1745: $type = 'folder';
1.142 raeburn 1746: $container = 'sequence';
1.282 albertel 1747: $esc_path=&escape($env{'form.folderpath'});
1748: $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
1.174 albertel 1749: # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120 www 1750: }
1.174 albertel 1751: if ($env{'form.pagepath'}) {
1.280 albertel 1752: $type = $container = 'page';
1753: $esc_path=&escape($path = $env{'form.pagepath'});
1.282 albertel 1754: $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
1.280 albertel 1755: $symb=&escape($env{'form.pagesymb'});
1.142 raeburn 1756: }
1.168 www 1757: my $cpinfo='';
1.109 albertel 1758: if ($allowed) {
1.123 www 1759: my $incindex=$index+1;
1760: my $selectbox='';
1.168 www 1761: if (($folder!~/^supplemental/) &&
1.245 albertel 1762: ($#LONCAPA::map::order>0) &&
1.168 www 1763: ((split(/\:/,
1.245 albertel 1764: $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]
1.168 www 1765: ne '') &&
1766: ((split(/\:/,
1.245 albertel 1767: $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1]
1.168 www 1768: ne '')) {
1.123 www 1769: $selectbox=
1.124 www 1770: '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123 www 1771: '<select name="newpos" onChange="this.form.submit()">';
1.245 albertel 1772: for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123 www 1773: if ($i==$incindex) {
1774: $selectbox.='<option value="" selected="1">('.$i.')</option>';
1775: } else {
1776: $selectbox.='<option value="'.$i.'">'.$i.'</option>';
1777: }
1778: }
1779: $selectbox.='</select>';
1780: }
1.119 www 1781: my %lt=&Apache::lonlocal::texthash(
1782: 'up' => 'Move Up',
1.109 albertel 1783: 'dw' => 'Move Down',
1784: 'rm' => 'Remove',
1.171 www 1785: 'ct' => 'Cut',
1.168 www 1786: 'rn' => 'Rename',
1787: 'cp' => 'Copy');
1.211 www 1788: my $nocopy=0;
1.268 www 1789: my $nocut=0;
1.211 www 1790: if ($url=~/\.(page|sequence)$/) {
1.289 albertel 1791: if ($url =~ m{/res/}) {
1792: # no copy for published maps
1793: $nocopy = 1;
1794: } else {
1.320 raeburn 1795: foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
1796: my ($title,$url,$ext,$type)=split(/\:/,$item);
1.289 albertel 1797: if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
1798: $nocopy=1;
1799: last;
1800: }
1.211 www 1801: }
1802: }
1803: }
1.268 www 1804: if ($url=~/^\/res\/lib\/templates\//) {
1805: $nocopy=1;
1806: $nocut=1;
1807: }
1.211 www 1808: my $copylink=' ';
1.267 www 1809: my $cutlink=' ';
1.280 albertel 1810:
1.291 albertel 1811: my $skip_confirm = 0;
1812: if ( $folder =~ /^supplemental/
1813: || ($url =~ m{( /smppg$
1814: |/syllabus$
1815: |/aboutme$
1816: |/navmaps$
1817: |/bulletinboard$
1818: |\.html$
1819: |^/adm/wrapper/ext)}x)) {
1820: $skip_confirm = 1;
1821: }
1822:
1.280 albertel 1823: if (!$nocopy) {
1824: $copylink=(<<ENDCOPY);
1.284 albertel 1825: <a href='javascript:markcopy("$esc_path","$index","$renametitle","$container","$symb","$folder");' class="LC_docs_copy">$lt{'cp'}</a>
1.211 www 1826: ENDCOPY
1.280 albertel 1827: }
1828: if (!$nocut) {
1829: $cutlink=(<<ENDCUT);
1.291 albertel 1830: <a href='javascript:cutres("$esc_path","$index","$renametitle","$container","$symb","$folder",$skip_confirm);' class="LC_docs_cut">$lt{'ct'}</a>
1.267 www 1831: ENDCUT
1.280 albertel 1832: }
1.286 albertel 1833: $form_start = (<<END);
1834: <form action="/adm/coursedocs" method="post">
1.280 albertel 1835: <input type="hidden" name="${type}path" value="$path" />
1836: <input type="hidden" name="${type}symb" value="$symb" />
1837: <input type="hidden" name="setparms" value="$orderidx" />
1838: <input type="hidden" name="changeparms" value="0" />
1.286 albertel 1839: END
1840: $form_end = '</form>';
1841: $line.=(<<END);
1.280 albertel 1842: <td>
1.285 albertel 1843: <table class="LC_docs_entry_move">
1.280 albertel 1844: <tr>
1.285 albertel 1845: <td>
1.282 albertel 1846: <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 1847: </td>
1848: </tr>
1849: <tr>
1.285 albertel 1850: <td>
1.282 albertel 1851: <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 1852: </td>
1853: </tr>
1854: </table>
1855: </td>
1856: <td>
1.286 albertel 1857: $form_start
1.280 albertel 1858: $selectbox
1.286 albertel 1859: $form_end
1.280 albertel 1860: </td>
1.285 albertel 1861: <td class="LC_docs_entry_commands">
1.291 albertel 1862: <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
1.267 www 1863: $cutlink
1.284 albertel 1864: <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a>
1.211 www 1865: $copylink
1.280 albertel 1866: </td>
1.142 raeburn 1867: END
1.280 albertel 1868:
1.8 www 1869: }
1.16 www 1870: # Figure out what kind of a resource this is
1871: my ($extension)=($url=~/\.(\w+)$/);
1872: my $uploaded=($url=~/^\/*uploaded\//);
1.97 albertel 1873: my $icon=&Apache::loncommon::icon($url);
1.17 www 1874: my $isfolder=0;
1.142 raeburn 1875: my $ispage=0;
1.114 albertel 1876: my $folderarg;
1.142 raeburn 1877: my $pagearg;
1878: my $pagefile;
1.16 www 1879: if ($uploaded) {
1.135 albertel 1880: if ($extension eq 'sequence') {
1881: $icon=$iconpath.'/folder_closed.gif';
1.264 albertel 1882: $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
1.135 albertel 1883: $url='/adm/coursedocs?';
1884: $folderarg=$1;
1885: $isfolder=1;
1.142 raeburn 1886: } elsif ($extension eq 'page') {
1887: $icon=$iconpath.'/page.gif';
1.264 albertel 1888: $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
1.142 raeburn 1889: $pagearg=$1;
1890: $url='/adm/coursedocs?';
1891: $ispage=1;
1.135 albertel 1892: } else {
1893: &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
1894: }
1.16 www 1895: }
1.287 albertel 1896:
1897: my $orig_url = $url;
1898: my $external = ($url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/});
1.142 raeburn 1899: if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113 albertel 1900: my $symb=&Apache::lonnet::symbclean(
1.50 www 1901: &Apache::lonnet::declutter('uploaded/'.
1.174 albertel 1902: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1903: $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50 www 1904: '.sequence').
1905: '___'.$residx.'___'.
1.113 albertel 1906: &Apache::lonnet::declutter($url));
1907: (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
1908: $url=&Apache::lonnet::clutter($url);
1.127 albertel 1909: if ($url=~/^\/*uploaded\//) {
1910: $url=~/\.(\w+)$/;
1911: my $embstyle=&Apache::loncommon::fileembstyle($1);
1912: if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
1913: $url='/adm/wrapper'.$url;
1914: } elsif ($embstyle eq 'ssi') {
1915: #do nothing with these
1916: } elsif ($url!~/\.(sequence|page)$/) {
1917: $url='/adm/coursedocs/showdoc'.$url;
1918: }
1.145 albertel 1919: } elsif ($url=~m|^/ext/|) {
1920: $url='/adm/wrapper'.$url;
1.287 albertel 1921: $external = 1;
1.127 albertel 1922: }
1.241 www 1923: if (&Apache::lonnet::symbverify($symb,$url)) {
1924: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1925: } else {
1926: $url='';
1927: }
1.152 albertel 1928: if ($container eq 'page') {
1.174 albertel 1929: my $symb=$env{'form.pagesymb'};
1.152 albertel 1930:
1931: $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228 www 1932: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152 albertel 1933: }
1.50 www 1934: }
1.296 albertel 1935: my ($parameterset,$rand_order_text) = (' ', ' ');
1.216 albertel 1936: if ($isfolder || $extension eq 'sequence') {
1.228 www 1937: my $foldername=&escape($foldertitle);
1.174 albertel 1938: my $folderpath=$env{'form.folderpath'};
1.114 albertel 1939: if ($folderpath) { $folderpath.='&' };
1.242 www 1940: # Append randompick number, hidden, and encrypted with ":" to foldername,
1941: # so it gets transferred between levels
1.245 albertel 1942: $folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242 www 1943: 'parameter_randompick'))[0]
1.245 albertel 1944: .':'.((&LONCAPA::map::getparameter($orderidx,
1.242 www 1945: 'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245 albertel 1946: .':'.((&LONCAPA::map::getparameter($orderidx,
1.296 albertel 1947: 'parameter_encrypturl'))[0]=~/^yes$/i)
1948: .':'.((&LONCAPA::map::getparameter($orderidx,
1949: 'parameter_randomorder'))[0]=~/^yes$/i);
1.228 www 1950: $url.='folderpath='.&escape($folderpath).$cpinfo;
1.147 matthew 1951: $parameterset='<label>'.&mt('Randomly Pick: ').
1.292 albertel 1952: '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randompick_'.$orderidx.'" value="'.
1.245 albertel 1953: (&LONCAPA::map::getparameter($orderidx,
1.147 matthew 1954: 'parameter_randompick'))[0].
1.165 www 1955: '" />'.
1.285 albertel 1956: '<a href="javascript:void(0)">'.&mt('Save').'</a></label>';
1.296 albertel 1957: my $ro_set=
1958: ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
1959: $rand_order_text ='
1.319 bisitz 1960: <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 1961: }
1.142 raeburn 1962: if ($ispage) {
1.228 www 1963: my $pagename=&escape($pagetitle);
1.142 raeburn 1964: my $pagepath;
1.174 albertel 1965: my $folderpath=$env{'form.folderpath'};
1.142 raeburn 1966: if ($folderpath) { $pagepath = $folderpath.'&' };
1967: $pagepath.=$pagearg.'&'.$pagename;
1.174 albertel 1968: my $symb=$env{'form.pagesymb'};
1.152 albertel 1969: if (!$symb) {
1970: my $path='uploaded/'.
1.174 albertel 1971: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1972: $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152 albertel 1973: $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
1974: $residx,
1975: $path.$pagearg.'.page');
1976: }
1.228 www 1977: $url.='pagepath='.&escape($pagepath).
1.282 albertel 1978: '&pagesymb='.&escape($symb).$cpinfo;
1.142 raeburn 1979: }
1.287 albertel 1980: if ($external) {
1981: my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';
1982: $external = ' <a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';
1983: } else {
1984: undef($external);
1985: }
1.285 albertel 1986: $line.='
1987: <td class="LC_docs_entry_icon">
1.287 albertel 1988: '.($url?'<a href="'.$url.'">':'').'<img src="'.$icon.'" alt="" class="LC_icon" />'.($url?'</a>':'').'
1.285 albertel 1989: </td>
1990: <td class="LC_docs_entry_title">
1.287 albertel 1991: '.($url?"<a href=\"$url\">":'').$title.($url?'</a>':' <span class="LC_docs_reinit_warn">'.&mt('(re-initialize course to access)').'</span>').$external."
1.285 albertel 1992: </td>";
1.120 www 1993: if (($allowed) && ($folder!~/^supplemental/)) {
1994: my %lt=&Apache::lonlocal::texthash(
1995: 'hd' => 'Hidden',
1.165 www 1996: 'ec' => 'URL hidden');
1.122 www 1997: my $enctext=
1.245 albertel 1998: ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122 www 1999: my $hidtext=
1.245 albertel 2000: ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120 www 2001: $line.=(<<ENDPARMS);
1.285 albertel 2002: <td class="LC_docs_entry_parameter">
1.286 albertel 2003: $form_start
1.292 albertel 2004: <label><input type="checkbox" name="hiddenresource_$orderidx" onClick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
1.286 albertel 2005: $form_end
1.285 albertel 2006: </td>
2007: <td class="LC_docs_entry_parameter">
1.286 albertel 2008: $form_start
1.292 albertel 2009: <label><input type="checkbox" name="encrypturl_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>
1.286 albertel 2010: $form_end
1.285 albertel 2011: </td>
1.296 albertel 2012: <td class="LC_docs_entry_parameter">$form_start $rand_order_text $form_end</td>
1.286 albertel 2013: <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td>
1.120 www 2014: ENDPARMS
1.119 www 2015: }
1.286 albertel 2016: $line.="</tr>";
1.8 www 2017: return $line;
2018: }
2019:
1.315 jms 2020: =pod
2021:
2022: =item tiehash()
2023:
2024: tie the hash
2025:
2026: =cut
1.27 www 2027:
2028: sub tiehash {
1.136 albertel 2029: my ($mode)=@_;
1.27 www 2030: $hashtied=0;
1.174 albertel 2031: if ($env{'request.course.fn'}) {
1.136 albertel 2032: if ($mode eq 'write') {
1.174 albertel 2033: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 2034: &GDBM_WRCREAT(),0640)) {
2035: $hashtied=2;
2036: }
2037: } else {
1.174 albertel 2038: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 2039: &GDBM_READER(),0640)) {
1.27 www 2040: $hashtied=1;
1.136 albertel 2041: }
2042: }
1.27 www 2043: }
2044: }
2045:
2046: sub untiehash {
2047: if ($hashtied) { untie %hash; }
2048: $hashtied=0;
1.221 albertel 2049: return OK;
1.27 www 2050: }
2051:
1.315 jms 2052:
2053:
1.29 www 2054:
2055: sub checkonthis {
2056: my ($r,$url,$level,$title)=@_;
1.228 www 2057: $url=&unescape($url);
1.29 www 2058: $alreadyseen{$url}=1;
2059: $r->rflush();
1.41 www 2060: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108 albertel 2061: $r->print("\n<br />");
1.313 bisitz 2062: if ($level==0) {
2063: $r->print("<br />");
2064: }
1.29 www 2065: for (my $i=0;$i<=$level*5;$i++) {
2066: $r->print(' ');
2067: }
2068: $r->print('<a href="'.$url.'" target="cat">'.
2069: ($title?$title:$url).'</a> ');
2070: if ($url=~/^\/res\//) {
2071: my $result=&Apache::lonnet::repcopy(
2072: &Apache::lonnet::filelocation('',$url));
1.172 raeburn 2073: if ($result eq 'ok') {
1.313 bisitz 2074: $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.29 www 2075: $r->rflush();
1.34 www 2076: &Apache::lonnet::countacc($url);
2077: $url=~/\.(\w+)$/;
2078: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
2079: $r->print('<br />');
2080: $r->rflush();
2081: for (my $i=0;$i<=$level*5;$i++) {
2082: $r->print(' ');
2083: }
1.313 bisitz 2084: $r->print('- '.&mt('Rendering:').' ');
1.170 www 2085: my ($errorcount,$warningcount)=split(/:/,
2086: &Apache::lonnet::ssi_body($url,
1.173 albertel 2087: ('grade_target'=>'web',
2088: 'return_only_error_and_warning_counts' => 1)));
1.170 www 2089: if (($errorcount) ||
2090: ($warningcount)) {
2091: if ($errorcount) {
1.283 albertel 2092: $r->print('<img src="/adm/lonMisc/bomb.gif" /><span class="LC_error">'.
1.313 bisitz 2093: &mt('[quant,_1,error]',$errorcount).'</span>');
1.34 www 2094: }
1.170 www 2095: if ($warningcount) {
1.283 albertel 2096: $r->print('<span class="LC_warning">'.
1.313 bisitz 2097: &mt('[quant,_1,warning]',$warningcount).'</span>');
1.34 www 2098: }
2099: } else {
1.283 albertel 2100: $r->print('<span class="LC_success">'.&mt('ok').'</span>');
1.34 www 2101: }
2102: $r->rflush();
2103: }
1.29 www 2104: my $dependencies=
2105: &Apache::lonnet::metadata($url,'dependencies');
1.320 raeburn 2106: foreach my $dep (split(/\,/,$dependencies)) {
2107: if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) {
2108: &checkonthis($r,$dep,$level+1);
1.29 www 2109: }
2110: }
1.172 raeburn 2111: } elsif ($result eq 'unavailable') {
1.283 albertel 2112: $r->print('<span class="LC_error">'.&mt('connection down').'</span>');
1.172 raeburn 2113: } elsif ($result eq 'not_found') {
1.100 www 2114: unless ($url=~/\$/) {
1.313 bisitz 2115: $r->print('<span class="LC_error">'.&mt('not found').'</b></span>');
1.100 www 2116: } else {
1.283 albertel 2117: $r->print('<span class="LC_unknown">'.&mt('unable to verify variable URL').'</span>');
1.100 www 2118: }
1.29 www 2119: } else {
1.283 albertel 2120: $r->print('<span class="LC_error">'.&mt('access denied').'</span>');
1.29 www 2121: }
1.313 bisitz 2122: }
2123: }
1.29 www 2124: }
2125:
1.1 www 2126:
1.315 jms 2127:
2128: =pod
2129:
2130: =item list_symbs()
2131:
2132: List Symbs
2133:
2134: =cut
2135:
1.208 albertel 2136: sub list_symbs {
1.224 albertel 2137: my ($r) = @_;
2138:
2139: $r->print(&Apache::loncommon::start_page('Symb List'));
1.257 www 2140: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
1.224 albertel 2141: my $navmap = Apache::lonnavmaps::navmap->new();
2142: $r->print("<pre>\n");
2143: foreach my $res ($navmap->retrieveResources()) {
2144: $r->print($res->compTitle()."\t".$res->symb()."\n");
2145: }
2146: $r->print("\n</pre>\n");
2147: $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208 albertel 2148: }
2149:
2150:
1.315 jms 2151:
1.75 www 2152: sub verifycontent {
1.224 albertel 2153: my ($r) = @_;
1.230 albertel 2154: my $type = &Apache::loncommon::course_type();
1.26 www 2155: my $loaderror=&Apache::lonnet::overloaderror($r);
2156: if ($loaderror) { return $loaderror; }
1.229 raeburn 2157: $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.257 www 2158: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
1.27 www 2159: $hashtied=0;
1.30 www 2160: undef %alreadyseen;
2161: %alreadyseen=();
1.27 www 2162: &tiehash();
1.320 raeburn 2163: foreach my $key (keys(%hash)) {
2164: if ($hash{$key}=~/\.(page|sequence)$/) {
2165: if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) {
1.283 albertel 2166: $r->print('<hr /><span class="LC_error">'.
1.230 albertel 2167: &mt('The following sequence or page is included more than once in your '.$type.': ').
1.320 raeburn 2168: &unescape($hash{$key}).'</span><br />'.
1.140 www 2169: &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
2170: }
2171: }
1.320 raeburn 2172: if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {
2173: &checkonthis($r,$hash{$key},0,$hash{'title_'.$1});
1.27 www 2174: }
2175: }
2176: &untiehash();
1.108 albertel 2177: $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
2178: &mt('Return to DOCS').'</a>');
1.75 www 2179: }
2180:
2181:
1.192 www 2182: sub devalidateversioncache {
2183: my $src=shift;
2184: &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
2185: &Apache::lonnet::clutter($src));
2186: }
2187:
1.75 www 2188: sub checkversions {
1.224 albertel 2189: my ($r) = @_;
1.230 albertel 2190: my $type = &Apache::loncommon::course_type();
1.229 raeburn 2191: $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.257 www 2192: $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
1.89 www 2193: my $header='';
2194: my $startsel='';
2195: my $monthsel='';
2196: my $weeksel='';
2197: my $daysel='';
2198: my $allsel='';
2199: my %changes=();
2200: my $starttime=0;
1.91 www 2201: my $haschanged=0;
1.92 www 2202: my %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 2203: $env{'course.'.$env{'request.course.id'}.'.domain'},
2204: $env{'course.'.$env{'request.course.id'}.'.num'});
1.92 www 2205:
2206: $hashtied=0;
2207: &tiehash();
2208: my %newsetversions=();
1.174 albertel 2209: if ($env{'form.setmostrecent'}) {
1.91 www 2210: $haschanged=1;
1.320 raeburn 2211: foreach my $key (keys(%hash)) {
2212: if ($key=~/^ids\_(\/res\/.+)$/) {
1.93 www 2213: $newsetversions{$1}='mostrecent';
1.192 www 2214: &devalidateversioncache($1);
1.92 www 2215: }
2216: }
1.174 albertel 2217: } elsif ($env{'form.setcurrent'}) {
1.91 www 2218: $haschanged=1;
1.320 raeburn 2219: foreach my $key (keys(%hash)) {
2220: if ($key=~/^ids\_(\/res\/.+)$/) {
1.93 www 2221: my $getvers=&Apache::lonnet::getversion($1);
2222: if ($getvers>0) {
2223: $newsetversions{$1}=$getvers;
1.192 www 2224: &devalidateversioncache($1);
1.93 www 2225: }
1.92 www 2226: }
2227: }
1.174 albertel 2228: } elsif ($env{'form.setversions'}) {
1.91 www 2229: $haschanged=1;
1.320 raeburn 2230: foreach my $key (keys(%env)) {
2231: if ($key=~/^form\.set_version_(.+)$/) {
1.92 www 2232: my $src=$1;
1.320 raeburn 2233: if (($env{$key}) && ($env{$key} ne $setversions{$src})) {
2234: $newsetversions{$src}=$env{$key};
1.192 www 2235: &devalidateversioncache($src);
1.92 www 2236: }
2237: }
2238: }
1.91 www 2239: }
2240: if ($haschanged) {
1.92 www 2241: if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174 albertel 2242: $env{'course.'.$env{'request.course.id'}.'.domain'},
2243: $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
1.272 albertel 2244: $r->print('<h1>'.&mt('Your Version Settings have been Saved').'</h1>');
1.92 www 2245: } else {
1.283 albertel 2246: $r->print('<h1><span class="LC_error">'.&mt('An Error Occured while Attempting to Save your Version Settings').'</span></h1>');
1.92 www 2247: }
1.136 albertel 2248: &mark_hash_old();
1.91 www 2249: }
1.136 albertel 2250: &changewarning($r,'');
1.174 albertel 2251: if ($env{'form.timerange'} eq 'all') {
1.89 www 2252: # show all documents
1.230 albertel 2253: $header=&mt('All Documents in '.$type);
1.91 www 2254: $allsel=1;
1.320 raeburn 2255: foreach my $key (keys(%hash)) {
2256: if ($key=~/^ids\_(\/res\/.+)$/) {
1.90 www 2257: my $src=$1;
2258: $changes{$src}=1;
2259: }
2260: }
1.89 www 2261: } else {
2262: # show documents which changed
2263: %changes=&Apache::lonnet::dump
1.174 albertel 2264: ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
2265: $env{'course.'.$env{'request.course.id'}.'.num'});
1.320 raeburn 2266: my $firstkey=(keys(%changes))[0];
1.89 www 2267: unless ($firstkey=~/^error\:/) {
1.174 albertel 2268: unless ($env{'form.timerange'}) {
2269: $env{'form.timerange'}=604800;
1.89 www 2270: }
1.174 albertel 2271: my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89 www 2272: .&mt('seconds');
1.174 albertel 2273: if ($env{'form.timerange'}==-1) {
1.89 www 2274: $seltext='since start of course';
2275: $startsel='selected';
1.174 albertel 2276: $env{'form.timerange'}=time;
1.89 www 2277: }
1.174 albertel 2278: $starttime=time-$env{'form.timerange'};
2279: if ($env{'form.timerange'}==2592000) {
1.89 www 2280: $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2281: $monthsel='selected';
1.174 albertel 2282: } elsif ($env{'form.timerange'}==604800) {
1.89 www 2283: $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2284: $weeksel='selected';
1.174 albertel 2285: } elsif ($env{'form.timerange'}==86400) {
1.89 www 2286: $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2287: $daysel='selected';
2288: }
2289: $header=&mt('Content changed').' '.$seltext;
2290: } else {
2291: $header=&mt('No content modifications yet.');
2292: }
2293: }
1.92 www 2294: %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 2295: $env{'course.'.$env{'request.course.id'}.'.domain'},
2296: $env{'course.'.$env{'request.course.id'}.'.num'});
1.89 www 2297: my %lt=&Apache::lonlocal::texthash
1.229 raeburn 2298: ('st' => 'Version changes since start of '.$type,
1.88 www 2299: 'lm' => 'Version changes since last Month',
2300: 'lw' => 'Version changes since last Week',
2301: 'sy' => 'Version changes since Yesterday',
1.91 www 2302: 'al' => 'All Resources (possibly large output)',
1.88 www 2303: 'sd' => 'Display',
1.84 www 2304: 'fi' => 'File',
2305: 'md' => 'Modification Date',
1.87 www 2306: 'mr' => 'Most recently published Version',
1.229 raeburn 2307: 've' => 'Version used in '.$type,
2308: 'vu' => 'Set Version to be used in '.$type,
2309: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91 www 2310: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
2311: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84 www 2312: 'di' => 'Differences');
1.89 www 2313: $r->print(<<ENDHEADERS);
1.31 www 2314: <form action="/adm/coursedocs" method="post">
1.91 www 2315: <input type="hidden" name="versions" value="1" />
2316: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
2317: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31 www 2318: <select name="timerange">
1.88 www 2319: <option value='all' $allsel>$lt{'al'}</option>
1.84 www 2320: <option value="-1" $startsel>$lt{'st'}</option>
2321: <option value="2592000" $monthsel>$lt{'lm'}</option>
2322: <option value="604800" $weeksel>$lt{'lw'}</option>
2323: <option value="86400" $daysel>$lt{'sy'}</option>
1.31 www 2324: </select>
1.91 www 2325: <input type="submit" name="display" value="$lt{'sd'}" />
1.89 www 2326: <h3>$header</h3>
1.91 www 2327: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103 matthew 2328: <table border="0">
1.31 www 2329: ENDHEADERS
1.320 raeburn 2330: foreach my $key (sort(keys(%changes))) {
2331: if ($changes{$key}>$starttime) {
2332: my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
2333: my $currentversion=&Apache::lonnet::getversion($key);
1.93 www 2334: if ($currentversion<0) {
2335: $currentversion=&mt('Could not be determined.');
2336: }
1.320 raeburn 2337: my $linkurl=&Apache::lonnet::clutter($key);
1.89 www 2338: $r->print(
1.103 matthew 2339: '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91 www 2340: &Apache::lonnet::gettitle($linkurl).
1.103 matthew 2341: '</b></font></td></tr>'.
2342: '<tr><td> </td>'.
2343: '<td colspan="4">'.
2344: '<a href="'.$linkurl.'" target="cat">'.$linkurl.
2345: '</a></td></tr>'.
2346: '<tr><td></td>'.
2347: '<td title="'.$lt{'md'}.'">'.
1.102 matthew 2348: &Apache::lonlocal::locallocaltime(
2349: &Apache::lonnet::metadata($root.'.'.$extension,
2350: 'lastrevisiondate')
2351: ).
1.103 matthew 2352: '</td>'.
1.284 albertel 2353: '<td title="'.$lt{'mr'}.'"><span class="LC_nobreak">Most Recent: '.
1.103 matthew 2354: '<font size="+1">'.$currentversion.'</font>'.
1.284 albertel 2355: '</span></td>'.
2356: '<td title="'.$lt{'ve'}.'"><span class="LC_nobreak">In '.$type.': '.
1.103 matthew 2357: '<font size="+1">');
1.87 www 2358: # Used in course
1.89 www 2359: my $usedversion=$hash{'version_'.$linkurl};
1.93 www 2360: if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89 www 2361: $r->print($usedversion);
2362: } else {
2363: $r->print($currentversion);
2364: }
1.284 albertel 2365: $r->print('</font></span></td><td title="'.$lt{'vu'}.'">'.
2366: '<span class="LC_nobreak">Use: ');
1.87 www 2367: # Set version
1.92 www 2368: $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89 www 2369: 'set_version_'.$linkurl,
1.136 albertel 2370: ('select_form_order' =>
2371: ['',1..$currentversion,'mostrecent'],
2372: '' => '',
1.93 www 2373: 'mostrecent' => 'most recent',
1.89 www 2374: map {$_,$_} (1..$currentversion))));
1.284 albertel 2375: $r->print('</span></td></tr><tr><td></td>');
1.89 www 2376: my $lastold=1;
2377: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
2378: my $url=$root.'.'.$prevvers.'.'.$extension;
2379: if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
2380: $starttime) {
2381: $lastold=$prevvers;
2382: }
2383: }
1.103 matthew 2384: #
2385: # Code to figure out how many version entries should go in
2386: # each of the four columns
2387: my $entries_per_col = 0;
2388: my $num_entries = ($currentversion-$lastold);
2389: if ($num_entries % 4 == 0) {
2390: $entries_per_col = $num_entries/4;
2391: } else {
2392: $entries_per_col = $num_entries/4 + 1;
2393: }
2394: my $entries_count = 0;
2395: $r->print('<td valign="top"><font size="-2">');
2396: my $cols_output = 1;
1.32 www 2397: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89 www 2398: my $url=$root.'.'.$prevvers.'.'.$extension;
1.284 albertel 2399: $r->print('<span class="LC_nobreak"><a href="'.&Apache::lonnet::clutter($url).
1.91 www 2400: '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103 matthew 2401: &Apache::lonlocal::locallocaltime(
2402: &Apache::lonnet::metadata($url,
2403: 'lastrevisiondate')
2404: ).
1.91 www 2405: ')');
1.89 www 2406: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33 www 2407: $r->print(' <a href="/adm/diff?filename='.
1.89 www 2408: &Apache::lonnet::clutter($root.'.'.$extension).
2409: '&versionone='.$prevvers.
2410: '">'.&mt('Diffs').'</a>');
2411: }
1.284 albertel 2412: $r->print('</span><br />');
1.103 matthew 2413: if (++$entries_count % $entries_per_col == 0) {
2414: $r->print('</font></td>');
2415: if ($cols_output != 4) {
2416: $r->print('<td valign="top"><font size="-2">');
2417: $cols_output++;
2418: }
2419: }
1.89 www 2420: }
1.103 matthew 2421: while($cols_output++ < 4) {
2422: $r->print('</font></td><td><font>')
2423: }
2424: $r->print('</font></td></tr>'."\n");
1.89 www 2425: }
2426: }
1.92 www 2427: $r->print('</table></form>');
1.89 www 2428: $r->print('<h1>'.&mt('Done').'.</h1>');
2429:
2430: &untiehash();
1.75 www 2431: }
2432:
1.136 albertel 2433: sub mark_hash_old {
2434: my $retie_hash=0;
2435: if ($hashtied) {
2436: $retie_hash=1;
2437: &untiehash();
2438: }
2439: &tiehash('write');
2440: $hash{'old'}=1;
2441: &untiehash();
2442: if ($retie_hash) { &tiehash(); }
2443: }
2444:
2445: sub is_hash_old {
2446: my $untie_hash=0;
2447: if (!$hashtied) {
2448: $untie_hash=1;
2449: &tiehash();
2450: }
2451: my $return=$hash{'old'};
2452: if ($untie_hash) { &untiehash(); }
2453: return $return;
2454: }
2455:
1.91 www 2456: sub changewarning {
1.177 albertel 2457: my ($r,$postexec,$message,$url)=@_;
1.136 albertel 2458: if (!&is_hash_old()) { return; }
1.150 albertel 2459: my $pathvar='folderpath';
1.228 www 2460: my $path=&escape($env{'form.folderpath'});
1.177 albertel 2461: if (!defined($url)) {
2462: if (defined($env{'form.pagepath'})) {
2463: $pathvar='pagepath';
1.228 www 2464: $path=&escape($env{'form.pagepath'});
2465: $path.='&pagesymb='.&escape($env{'form.pagesymb'});
1.177 albertel 2466: }
2467: $url='/adm/coursedocs?'.$pathvar.'='.$path;
2468: }
1.230 albertel 2469: my $course_type = &Apache::loncommon::course_type();
1.177 albertel 2470: if (!defined($message)) {
2471: $message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150 albertel 2472: }
1.185 www 2473: $r->print("\n\n".
1.286 albertel 2474: '<script type="text/javascript">function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n".
1.185 www 2475: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177 albertel 2476: '<input type="hidden" name="orgurl" value="'.$url.
1.283 albertel 2477: '" /><input type="hidden" name="selectrole" value="1" /><h3><span class="LC_warning">'.
1.177 albertel 2478: &mt($message,' <input type="hidden" name="'.
2479: $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230 albertel 2480: &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.283 albertel 2481: $help{'Caching'}.'</span></h3></form>'."\n\n");
1.91 www 2482: }
2483:
1.257 www 2484:
2485: sub init_breadcrumbs {
2486: my ($form,$text)=@_;
2487: &Apache::lonhtmlcommon::clear_breadcrumbs();
2488: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
1.297 albertel 2489: text=>"Edit ".&Apache::loncommon::course_type(),
1.257 www 2490: faq=>273,
2491: bug=>'Instructor Interface',
2492: help => 'Docs_Adding_Course_Doc'});
2493: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
2494: text=>$text,
2495: faq=>273,
2496: bug=>'Instructor Interface'});
2497: }
2498:
1.315 jms 2499:
2500:
2501:
1.75 www 2502: sub handler {
2503: my $r = shift;
1.82 www 2504: &Apache::loncommon::content_type($r,'text/html');
1.75 www 2505: $r->send_http_header;
2506: return OK if $r->header_only;
1.230 albertel 2507: my $type = &Apache::loncommon::course_type();
1.75 www 2508:
2509: # --------------------------------------------- Initialize help topics for this
1.320 raeburn 2510: foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
2511: 'Adding_External_Resource','Navigate_Content',
2512: 'Adding_Folders','Docs_Overview', 'Load_Map',
2513: 'Supplemental','Score_Upload_Form','Adding_Pages',
2514: 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
2515: 'Check_Resource_Versions','Verify_Content') {
2516: $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
1.209 albertel 2517: }
1.75 www 2518: # Composite help files
2519: $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
2520: 'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
2521: $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
2522: 'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86 albertel 2523: $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
2524: 'Option_Response_Simple');
1.75 www 2525: $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
2526: 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
2527: $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
2528: 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
1.255 raeburn 2529: $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
1.75 www 2530: $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142 raeburn 2531:
1.209 albertel 2532: # does this user have privileges to modify docs
2533: my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
2534: if ($allowed && $env{'form.verify'}) {
1.257 www 2535: &init_breadcrumbs('verify','Verify Content');
1.75 www 2536: &verifycontent($r);
1.209 albertel 2537: } elsif ($allowed && $env{'form.listsymbs'}) {
1.257 www 2538: &init_breadcrumbs('listsymbs','List Symbs');
1.208 albertel 2539: &list_symbs($r);
1.247 www 2540: } elsif ($allowed && $env{'form.docslog'}) {
1.257 www 2541: &init_breadcrumbs('docslog','Show Log');
1.247 www 2542: &docs_change_log($r);
1.209 albertel 2543: } elsif ($allowed && $env{'form.versions'}) {
1.257 www 2544: &init_breadcrumbs('versions','Check/Set Resource Versions');
1.75 www 2545: &checkversions($r);
1.209 albertel 2546: } elsif ($allowed && $env{'form.dumpcourse'}) {
1.257 www 2547: &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space');
1.75 www 2548: &dumpcourse($r);
1.209 albertel 2549: } elsif ($allowed && $env{'form.exportcourse'}) {
1.257 www 2550: &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
1.138 raeburn 2551: &exportcourse($r);
1.26 www 2552: } else {
1.7 www 2553: # is this a standard course?
2554:
1.174 albertel 2555: my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155 raeburn 2556: my $forcestandard = 0;
1.15 www 2557: my $forcesupplement;
2558: my $script='';
1.19 www 2559: my $showdoc=0;
1.142 raeburn 2560: my $containertag;
2561: my $uploadtag;
1.15 www 2562: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224 albertel 2563: ['folderpath','pagepath',
1.281 albertel 2564: 'pagesymb']);
1.307 www 2565: # No folderpath, no pagepath, see if we have something stored
2566: if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
2567: &Apache::loncommon::restore_course_settings('docs_folderpath',
2568: {'folderpath' => 'scalar'});
2569: }
2570: if (!$env{'form.folderpath'}) {
2571: &Apache::loncommon::restore_course_settings('docs_folderpath',
2572: {'pagepath' => 'scalar'});
2573: }
2574: if ($env{'form.pagepath'}) {
2575: $env{'form.folderpath'}='';
2576: }
1.309 raeburn 2577: if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
2578: $env{'form.folderpath'} = 'supplemental&'.
2579: &escape(&mt('Supplemental '.$type.' Documents')).'&'.
2580: $env{'form.folderpath'};
2581: }
1.307 www 2582: &Apache::loncommon::store_course_settings('docs_folderpath',
2583: {'pagepath' => 'scalar',
2584: 'folderpath' => 'scalar'});
1.174 albertel 2585: if ($env{'form.folderpath'}) {
2586: my (@folderpath)=split('&',$env{'form.folderpath'});
1.228 www 2587: $env{'form.foldername'}=&unescape(pop(@folderpath));
1.174 albertel 2588: $env{'form.folder'}=pop(@folderpath);
2589: }
2590: if ($env{'form.pagepath'}) {
2591: my (@pagepath)=split('&',$env{'form.pagepath'});
1.228 www 2592: $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174 albertel 2593: $env{'form.folder'}=pop(@pagepath);
1.156 albertel 2594: $containertag = '<input type="hidden" name="pagepath" value="" />'.
2595: '<input type="hidden" name="pagesymb" value="" />';
1.282 albertel 2596: $uploadtag = '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
2597: '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />';
1.142 raeburn 2598: }
1.21 www 2599: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127 albertel 2600: $showdoc='/'.$1;
1.21 www 2601: }
2602: unless ($showdoc) { # got called from remote
1.237 albertel 2603: if (($env{'form.folder'}=~/^(?:group|default)_/) ||
1.209 albertel 2604: ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155 raeburn 2605: $forcestandard = 1;
2606: }
1.174 albertel 2607: $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7 www 2608:
1.15 www 2609: if ($allowed) {
2610: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
2611: $script=&Apache::lonratedt::editscript('simple');
2612: }
2613: } else { # got called in sequence from course
2614: $allowed=0;
1.3 www 2615: }
1.4 www 2616:
2617: # get course data
1.174 albertel 2618: my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
2619: my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4 www 2620:
1.225 albertel 2621: # get personal data
1.174 albertel 2622: my $uname=$env{'user.name'};
2623: my $udom=$env{'user.domain'};
1.245 albertel 2624: my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14 www 2625:
1.8 www 2626: # graphics settings
1.4 www 2627:
1.176 albertel 2628: $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8 www 2629:
1.224 albertel 2630: if ($allowed) {
2631: $script .= &editing_js($udom,$uname);
1.171 www 2632: }
1.42 www 2633: # -------------------------------------------------------------------- Body tag
1.224 albertel 2634: $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.324 ! raeburn 2635: my $brcrum = [{href=>"/adm/createuser",text=>"$type Documents"}];
1.229 raeburn 2636: $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.324 ! raeburn 2637: {'force_register' => $showdoc,
! 2638: 'bread_crumbs' => $brcrum}).
1.233 albertel 2639: &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224 albertel 2640:
1.188 raeburn 2641: my %allfiles = ();
2642: my %codebase = ();
2643: my ($upload_result,$upload_output);
2644: if ($allowed) {
1.264 albertel 2645: if (($env{'form.uploaddoc.filename'}) &&
2646: ($env{'form.cmd'}=~/^upload_(\w+)/)) {
1.188 raeburn 2647: # Process file upload - phase one - upload and parse primary file.
1.298 albertel 2648: undef($hadchanges);
1.190 albertel 2649: $upload_result = &process_file_upload(\$upload_output,$coursenum,
2650: $coursedom,\%allfiles,
1.194 raeburn 2651: \%codebase,$1);
1.298 albertel 2652: if ($hadchanges) {
2653: &mark_hash_old();
2654: }
1.188 raeburn 2655: if ($upload_result eq 'phasetwo') {
2656: $r->print($upload_output);
2657: }
2658: } elsif ($env{'form.phasetwo'}) {
2659: my %newname = ();
2660: my %origname = ();
2661: my %attribs = ();
2662: my $updateflag = 0;
2663: my $residx = $env{'form.newidx'};
1.228 www 2664: my $primary_url = &unescape($env{'form.primaryurl'});
1.188 raeburn 2665: # Process file upload - phase two - gather secondary files.
2666: for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
2667: if ($env{'form.embedded_item_'.$i.'.filename'}) {
2668: my $javacodebase;
2669: $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228 www 2670: $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188 raeburn 2671: if (exists($env{'form.embedded_codebase_'.$i})) {
1.228 www 2672: $javacodebase = &unescape($env{'form.embedded_codebase_'.$i});
1.188 raeburn 2673: $origname{$i} =~ s#^\Q$javacodebase\E/##;
2674: }
2675: my @attributes = ();
2676: if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
1.320 raeburn 2677: @attributes = split(/:/,$env{'form.embedded_attrib_'.$i});
1.188 raeburn 2678: } else {
2679: @attributes = ($env{'form.embedded_attrib_'.$i});
2680: }
1.320 raeburn 2681: foreach my $attr (@attributes) {
2682: push(@{$attribs{$i}},&unescape($attr));
1.188 raeburn 2683: }
2684: if ($javacodebase) {
2685: $codebase{$i} = $javacodebase;
2686: $codebase{$i} =~ s#/$##;
2687: $updateflag = 1;
2688: }
2689: }
2690: unless ($newname{$i} eq $origname{$i}) {
2691: $updateflag = 1;
2692: }
2693: }
2694: # Process file upload - phase three - modify primary file
2695: if ($updateflag) {
2696: my ($content,$rtncode);
2697: my $updateflag = 0;
2698: my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
2699: if ($getstatus eq 'ok') {
1.320 raeburn 2700: foreach my $item (keys(%newname)) {
1.188 raeburn 2701: if ($newname{$item} ne $origname{$item}) {
2702: my $attrib_regexp = '';
2703: if (@{$attribs{$item}} > 1) {
2704: $attrib_regexp = join('|',@{$attribs{$item}});
2705: } else {
2706: $attrib_regexp = $attribs{$item}[0];
2707: }
2708: if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
2709: }
2710: $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi;
2711: }
2712: if (exists($codebase{$item})) {
1.224 albertel 2713: $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188 raeburn 2714: }
2715: }
2716: # Save edited file.
2717: my $saveresult;
2718: my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
2719: my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191 raeburn 2720: my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188 raeburn 2721: } else {
2722: &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus);
2723: }
2724: }
2725: }
2726: }
2727:
2728: unless ($showdoc || $upload_result eq 'phasetwo') {
1.81 www 2729: # -----------------------------------------------------------------------------
2730: my %lt=&Apache::lonlocal::texthash(
1.229 raeburn 2731: 'uplm' => 'Upload a new main '.lc($type).' document',
2732: 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168 www 2733: 'impp' => 'Import a document',
2734: 'pubd' => 'Published documents',
1.181 www 2735: 'copm' => 'All documents out of a published map into this folder',
1.81 www 2736: 'spec' => 'Special documents',
2737: 'upld' => 'Upload Document',
2738: 'srch' => 'Search',
2739: 'impo' => 'Import',
1.232 www 2740: 'book' => 'Import Bookmarks',
1.81 www 2741: 'selm' => 'Select Map',
2742: 'load' => 'Load Map',
1.186 www 2743: 'reco' => 'Recover Deleted Resources',
1.81 www 2744: 'newf' => 'New Folder',
1.142 raeburn 2745: 'newp' => 'New Composite Page',
1.81 www 2746: 'extr' => 'External Resource',
2747: 'syll' => 'Syllabus',
2748: 'navc' => 'Navigate Contents',
2749: 'sipa' => 'Simple Page',
2750: 'sipr' => 'Simple Problem',
1.219 www 2751: 'drbx' => 'Drop Box',
1.81 www 2752: 'scuf' => 'Score Upload Form',
2753: 'bull' => 'Bulletin Board',
1.96 sakharuk 2754: 'mypi' => 'My Personal Info',
1.255 raeburn 2755: 'grpo' => 'Group Files',
1.294 raeburn 2756: 'rost' => 'Course Roster',
1.101 www 2757: 'abou' => 'About User',
1.110 raeburn 2758: 'imsf' => 'Import IMS package',
1.96 sakharuk 2759: 'file' => 'File',
2760: 'title' => 'Title',
1.188 raeburn 2761: 'comment' => 'Comment',
2762: 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81 www 2763: );
2764: # -----------------------------------------------------------------------------
1.42 www 2765: if ($allowed) {
1.281 albertel 2766: &update_paste_buffer($coursenum,$coursedom);
1.74 www 2767: my $dumpbut=&dumpbutton();
1.138 raeburn 2768: my $exportbut=&exportbutton();
1.88 www 2769: my %lt=&Apache::lonlocal::texthash(
2770: 'vc' => 'Verify Content',
2771: 'cv' => 'Check/Set Resource Versions',
1.208 albertel 2772: 'ls' => 'List Symbs',
1.247 www 2773: 'sl' => 'Show Log'
1.88 www 2774: );
1.118 albertel 2775:
1.174 albertel 2776: my $folderpath=$env{'form.folderpath'};
1.118 albertel 2777: if (!$folderpath) {
1.174 albertel 2778: if ($env{'form.folder'} eq '' ||
2779: $env{'form.folder'} eq 'supplemental') {
1.118 albertel 2780: $folderpath='default&'.
1.230 albertel 2781: &escape(&mt('Main '.$type.' Documents'));
1.118 albertel 2782: }
2783: }
1.174 albertel 2784: unless ($env{'form.pagepath'}) {
1.142 raeburn 2785: $containertag = '<input type="hidden" name="folderpath" value="" />';
1.282 albertel 2786: $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
1.142 raeburn 2787: }
2788:
1.42 www 2789: $r->print(<<ENDCOURSEVERIFY);
1.36 www 2790: <form name="renameform" method="post" action="/adm/coursedocs">
1.283 albertel 2791: <input type="hidden" name="title" />
2792: <input type="hidden" name="cmd" />
2793: <input type="hidden" name="markcopy" />
2794: <input type="hidden" name="copyfolder" />
2795: $containertag
1.36 www 2796: </form>
1.39 www 2797: <form name="simpleedit" method="post" action="/adm/coursedocs">
1.283 albertel 2798: <input type="hidden" name="importdetail" value="" />
2799: $uploadtag
1.39 www 2800: </form>
1.26 www 2801: <form action="/adm/coursedocs" method="post" name="courseverify">
1.283 albertel 2802: <div class="LC_docs_course_commands">
2803:
2804: <div>
2805: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
2806: </div>
2807: <div>
2808: <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
2809: </div>
2810: $dumpbut
2811: $exportbut
2812: <div>
2813: <input type="submit" name="listsymbs" value="$lt{'ls'}" />
2814: </div>
2815: <div>
2816: <input type="hidden" name="folder" value="$env{'form.folder'}" />
2817: <input type="submit" name="docslog" value="$lt{'sl'}" />
2818: </div>
2819: </div>
1.25 www 2820: </form>
1.283 albertel 2821: <div style="clear: both; height: 0px;"> </div>
1.25 www 2822: ENDCOURSEVERIFY
1.74 www 2823: $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230 albertel 2824: &mt('Editing the Table of Contents for your '.$type)));
1.25 www 2825: }
1.17 www 2826: # --------------------------------------------------------- Standard documents
1.293 albertel 2827: $r->print('<table class="LC_docs_documents">');
2828:
1.7 www 2829: if (($standard) && ($allowed) && (!$forcesupplement)) {
1.285 albertel 2830: $r->print('<tr><td class="LC_docs_document">');
1.116 albertel 2831: # '<h2>'.&mt('Main Course Documents').
2832: # ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174 albertel 2833: my $folder=$env{'form.folder'};
1.117 albertel 2834: if ($folder eq '' || $folder eq 'supplemental') {
1.112 raeburn 2835: $folder='default';
1.230 albertel 2836: $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.293 albertel 2837: $uploadtag = '<input type="hidden" name="folderpath" value="'.
2838: &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
1.112 raeburn 2839: }
1.51 www 2840: my $postexec='';
2841: if ($folder eq 'default') {
1.286 albertel 2842: $r->print('<script type="text/javascript">this.window.name="loncapaclient";</script>');
1.51 www 2843: } else {
1.117 albertel 2844: #$postexec='self.close();';
1.51 www 2845: }
1.40 www 2846: $hadchanges=0;
1.292 albertel 2847: my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,
1.309 raeburn 2848: $upload_output,$type);
1.292 albertel 2849: if ($error) {
2850: $r->print('<p><span class="LC_error">'.$error.'</span></p>');
2851: }
1.40 www 2852: if ($hadchanges) {
1.320 raeburn 2853: &mark_hash_old();
1.40 www 2854: }
1.136 albertel 2855: &changewarning($r,$postexec);
1.16 www 2856: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2857: '.sequence';
1.142 raeburn 2858: my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2859: '.page';
1.186 www 2860: my $container='sequence';
2861: if ($env{'form.pagepath'}) {
2862: $container='page';
2863: }
2864: my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8 www 2865: $r->print(<<ENDFORM);
1.285 albertel 2866: <table class="LC_docs_adddocs">
2867: <tr>
2868: <th>$lt{'uplm'}</th>
2869: <th>$lt{'impp'}</th>
2870: <th>$lt{'spec'}</th>
1.11 www 2871: </tr>
1.285 albertel 2872: <tr>
2873: <td>
1.96 sakharuk 2874: $lt{'file'}:<br />
1.182 albertel 2875: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.286 albertel 2876: <input type="file" name="uploaddoc" size="40" />
1.8 www 2877: <br />
1.96 sakharuk 2878: $lt{'title'}:<br />
1.286 albertel 2879: <input type="text" size="50" name="comment" />
1.142 raeburn 2880: $uploadtag
1.286 albertel 2881: <input type="hidden" name="cmd" value="upload_default" />
1.188 raeburn 2882: <br />
1.284 albertel 2883: <span class="LC_nobreak">
1.190 albertel 2884: <label>$lt{'parse'}?
1.306 www 2885: <input type="checkbox" name="parserflag" checked="checked" />
1.190 albertel 2886: </label>
1.284 albertel 2887: </span>
1.188 raeburn 2888: <br />
2889: <br />
1.284 albertel 2890: <span class="LC_nobreak">
1.286 albertel 2891: <input type="submit" value="$lt{'upld'}" />
1.60 albertel 2892: $help{'Uploading_From_Harddrive'}
1.284 albertel 2893: </span>
1.60 albertel 2894: </form>
1.11 www 2895: </td>
1.285 albertel 2896: <td>
1.39 www 2897: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168 www 2898: $lt{'pubd'}<br />
1.142 raeburn 2899: $uploadtag
1.286 albertel 2900: <input type="button" onClick="javascript:groupsearch()" value="$lt{'srch'}" />
1.232 www 2901: <br />
1.284 albertel 2902: <span class="LC_nobreak">
1.286 albertel 2903: <input type="button" onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58 albertel 2904: $help{'Importing_LON-CAPA_Resource'}
1.284 albertel 2905: </span>
1.232 www 2906: <br />
1.286 albertel 2907: <input type="button" onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
2908: <hr />
1.59 www 2909: <p>
1.181 www 2910: $lt{'copm'}<br />
1.282 albertel 2911: <input type="text" size="40" name="importmap" /><br />
1.286 albertel 2912: <span class="LC_nobreak"><input type="button"
1.52 www 2913: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.282 albertel 2914: value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />
1.284 albertel 2915: $help{'Load_Map'}</span>
1.59 www 2916: </p>
1.52 www 2917: </form>
1.186 www 2918: <hr />
2919: <form action="/adm/groupsort" method="post" name="recover">
1.232 www 2920: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186 www 2921: </form>
1.142 raeburn 2922: ENDFORM
1.174 albertel 2923: unless ($env{'form.pagepath'}) {
1.168 www 2924: $r->print(<<ENDFORM);
2925: <hr />
2926: <form action="/adm/coursedocs" method="post" name="newext">
2927: $uploadtag
1.256 albertel 2928: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2929: <span class="LC_nobreak">
1.168 www 2930: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
2931: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.284 albertel 2932: </span>
1.168 www 2933: </form>
1.214 www 2934: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168 www 2935: <input type="hidden" name="folder" value="$folder" />
2936: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
2937: </form>
2938: ENDFORM
2939: }
1.285 albertel 2940: $r->print('</td><td>');
1.174 albertel 2941: unless ($env{'form.pagepath'}) {
1.282 albertel 2942: my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
1.142 raeburn 2943: $r->print(<<ENDFORM);
1.214 www 2944: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.282 albertel 2945: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 2946: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2947: <span class="LC_nobreak">
1.16 www 2948: <input name="newfolder" type="button"
2949: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 2950: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.284 albertel 2951: </span>
1.11 www 2952: </form>
1.214 www 2953: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.282 albertel 2954: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 2955: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2956: <span class="LC_nobreak">
1.142 raeburn 2957: <input name="newpage" type="button"
2958: onClick="javascript:makenewpage(this.form,'$pageseq');"
2959: value="$lt{'newp'}" />$help{'Adding_Pages'}
1.284 albertel 2960: </span>
1.142 raeburn 2961: </form>
1.214 www 2962: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142 raeburn 2963: $uploadtag
1.256 albertel 2964: <input type="hidden" name="importdetail"
1.305 bisitz 2965: value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
1.284 albertel 2966: <span class="LC_nobreak">
1.81 www 2967: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 2968: $help{'Syllabus'}
1.284 albertel 2969: </span>
1.58 albertel 2970: </form>
1.214 www 2971: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142 raeburn 2972: $uploadtag
1.256 albertel 2973: <input type="hidden" name="importdetail"
1.305 bisitz 2974: value="$lt{'navc'}=/adm/navmaps" />
1.284 albertel 2975: <span class="LC_nobreak">
1.81 www 2976: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47 www 2977: $help{'Navigate_Content'}
1.284 albertel 2978: </span>
1.22 www 2979: </form>
1.214 www 2980: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142 raeburn 2981: $uploadtag
1.256 albertel 2982: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2983: <span class="LC_nobreak">
1.81 www 2984: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65 bowersj2 2985: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.284 albertel 2986: </span>
1.55 www 2987: </form>
1.214 www 2988: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142 raeburn 2989: $uploadtag
1.256 albertel 2990: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2991: <span class="LC_nobreak">
1.81 www 2992: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65 bowersj2 2993: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.284 albertel 2994: </span>
1.62 www 2995: </form>
1.219 www 2996: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
2997: $uploadtag
1.256 albertel 2998: <input type="hidden" name="importdetail" value="" />
1.284 albertel 2999: <span class="LC_nobreak">
1.219 www 3000: <input name="newdropbox" type="button" value="$lt{'drbx'}"
3001: onClick="javascript:makedropbox();" />
1.284 albertel 3002: </span>
1.219 www 3003: </form>
1.214 www 3004: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 3005: $uploadtag
1.256 albertel 3006: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3007: <span class="LC_nobreak">
1.81 www 3008: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62 www 3009: onClick="javascript:makeexamupload();" />
1.66 bowersj2 3010: $help{'Score_Upload_Form'}
1.284 albertel 3011: </span>
1.22 www 3012: </form>
1.214 www 3013: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142 raeburn 3014: $uploadtag
1.256 albertel 3015: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3016: <span class="LC_nobreak">
1.81 www 3017: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22 www 3018: onClick="javascript:makebulboard();" />
1.65 bowersj2 3019: $help{'Bulletin Board'}
1.284 albertel 3020: </span>
1.58 albertel 3021: </form>
1.214 www 3022: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142 raeburn 3023: $uploadtag
1.256 albertel 3024: <input type="hidden" name="importdetail"
3025: value="$plainname=/adm/$udom/$uname/aboutme" />
1.284 albertel 3026: <span class="LC_nobreak">
1.81 www 3027: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 3028: $help{'My Personal Info'}
1.284 albertel 3029: </span>
1.101 www 3030: </form>
1.214 www 3031: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142 raeburn 3032: $uploadtag
1.256 albertel 3033: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3034: <span class="LC_nobreak">
1.101 www 3035: <input name="newaboutsomeone" type="button" value="$lt{'abou'}"
3036: onClick="javascript:makeabout();" />
1.284 albertel 3037: </span>
1.182 albertel 3038: </form>
1.255 raeburn 3039: <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
3040: $uploadtag
1.256 albertel 3041: <input type="hidden" name="importdetail"
1.305 bisitz 3042: value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
1.284 albertel 3043: <span class="LC_nobreak">
1.255 raeburn 3044: <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
3045: $help{'Group Files'}
1.284 albertel 3046: </span>
1.255 raeburn 3047: </form>
1.294 raeburn 3048: <br /><form action="/adm/coursedocs" method="post" name="newroster">
3049: $uploadtag
3050: <input type="hidden" name="importdetail"
1.305 bisitz 3051: value="$lt{'rost'}=/adm/viewclasslist" />
1.294 raeburn 3052: <span class="LC_nobreak">
3053: <input name="newroster" type="submit" value="$lt{'rost'}" />
3054: $help{'Course Roster'}
3055: </span>
3056: </form>
1.142 raeburn 3057: ENDFORM
3058: }
1.174 albertel 3059: if ($env{'form.pagepath'}) {
1.142 raeburn 3060: $r->print(<<ENDBLOCK);
3061: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
3062: $uploadtag
1.256 albertel 3063: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3064: <span class="LC_nobreak">
1.142 raeburn 3065: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
3066: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.284 albertel 3067: </span>
1.142 raeburn 3068: </form>
1.214 www 3069: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 3070: $uploadtag
1.256 albertel 3071: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3072: <span class="LC_nobreak">
1.142 raeburn 3073: <input name="newexamupload" type="button" value="$lt{'scuf'}"
3074: onClick="javascript:makeexamupload();" />
3075: $help{'Score_Upload_Form'}
1.284 albertel 3076: </span>
1.182 albertel 3077: </form>
1.142 raeburn 3078: ENDBLOCK
3079: }
3080: $r->print('</td></tr>'."\n".
3081: '</table>');
1.24 www 3082: $r->print('</td></tr>');
1.7 www 3083: }
3084: # ----------------------------------------------------- Supplemental documents
3085: if (!$forcestandard) {
1.285 albertel 3086: $r->print('<tr><td class="LC_docs_document">');
1.116 albertel 3087: # '<h2>'.&mt('Supplemental Course Documents').
3088: # ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174 albertel 3089: my $folder=$env{'form.folder'};
1.117 albertel 3090: unless ($folder=~/^supplemental/) {
1.116 albertel 3091: $folder='supplemental';
1.117 albertel 3092: }
3093: if ($folder =~ /^supplemental$/ &&
1.309 raeburn 3094: (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
3095: $env{'form.folderpath'} = 'supplemental&'.
3096: &escape(&mt('Supplemental '.$type.' Documents'));
1.116 albertel 3097: }
1.309 raeburn 3098: my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type);
1.292 albertel 3099: if ($error) {
3100: $r->print('<p><span class="LC_error">'.$error.'</span></p>');
3101: }
1.8 www 3102: if ($allowed) {
1.282 albertel 3103: my $folderseq=
3104: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
3105: '.sequence';
1.17 www 3106:
1.282 albertel 3107: my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
3108: $r->print(<<ENDSUPFORM);
1.285 albertel 3109: <table class="LC_docs_adddocs"><tr>
3110: <th>$lt{'upls'}</th>
3111: <th>$lt{'spec'}</th>
1.17 www 3112: </tr>
1.285 albertel 3113: <tr><td>
1.10 www 3114: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.286 albertel 3115: <input type="file" name="uploaddoc" size="40" />
1.196 raeburn 3116: <br />
3117: <br />
1.284 albertel 3118: <span class="LC_nobreak">
1.196 raeburn 3119: <label>$lt{'parse'}?
3120: <input type="checkbox" name="parserflag" />
3121: </label>
1.284 albertel 3122: </span>
1.196 raeburn 3123: <br /><br />
3124: $lt{'comment'}:<br />
1.4 www 3125: <textarea cols=50 rows=4 name='comment'>
3126: </textarea>
1.115 albertel 3127: <br />
1.282 albertel 3128: <input type="hidden" name="folderpath" value="$path" />
1.286 albertel 3129: <input type="hidden" name="cmd" value="upload_supplemental" />
1.284 albertel 3130: <span class="LC_nobreak">
1.286 albertel 3131: <input type="submit" value="$lt{'upld'}" />
1.58 albertel 3132: $help{'Uploading_From_Harddrive'}
1.284 albertel 3133: </span>
1.58 albertel 3134: </form>
1.17 www 3135: </td>
1.285 albertel 3136: <td>
1.18 www 3137: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.282 albertel 3138: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3139: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3140: <span class="LC_nobreak">
1.17 www 3141: <input name="newfolder" type="button"
3142: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 3143: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.284 albertel 3144: </span>
1.17 www 3145: </form>
1.214 www 3146: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.282 albertel 3147: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3148: <input type="hidden" name="importdetail" value="" />
1.284 albertel 3149: <span class="LC_nobreak">
1.18 www 3150: <input name="newext" type="button"
3151: onClick="javascript:makenewext('supnewext');"
1.81 www 3152: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.284 albertel 3153: </span>
1.17 www 3154: </form>
1.214 www 3155: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.282 albertel 3156: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3157: <input type="hidden" name="importdetail"
3158: value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
1.284 albertel 3159: <span class="LC_nobreak">
1.81 www 3160: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 3161: $help{'Syllabus'}
1.284 albertel 3162: </span>
1.58 albertel 3163: </form>
1.214 www 3164: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.282 albertel 3165: <input type="hidden" name="folderpath" value="$path" />
1.256 albertel 3166: <input type="hidden" name="importdetail"
3167: value="$plainname=/adm/$udom/$uname/aboutme" />
1.284 albertel 3168: <span class="LC_nobreak">
1.81 www 3169: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 3170: $help{'My Personal Info'}
1.284 albertel 3171: </span>
1.58 albertel 3172: </form>
1.17 www 3173: </td></tr>
1.24 www 3174: </table></td></tr>
1.8 www 3175: ENDSUPFORM
3176: }
1.7 www 3177: }
1.286 albertel 3178: $r->print('</table>');
1.18 www 3179: if ($allowed) {
1.287 albertel 3180: $r->print('
3181: <form method="post" name="extimport" action="/adm/coursedocs">
3182: <input type="hidden" name="title" />
3183: <input type="hidden" name="url" />
3184: <input type="hidden" name="useform" />
3185: <input type="hidden" name="residx" />
3186: </form>');
1.18 www 3187: }
1.19 www 3188: } else {
1.188 raeburn 3189: unless ($upload_result eq 'phasetwo') {
1.19 www 3190: # -------------------------------------------------------- This is showdoc mode
1.188 raeburn 3191: $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141 albertel 3192: &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.286 albertel 3193: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".
3194: &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');
1.188 raeburn 3195: }
1.19 www 3196: }
1.26 www 3197: }
1.224 albertel 3198: $r->print(&Apache::loncommon::end_page());
1.26 www 3199: return OK;
1.1 www 3200: }
3201:
1.224 albertel 3202:
3203: sub editing_js {
3204: my ($udom,$uname) = @_;
3205: my $now = time();
1.302 bisitz 3206: my %lt = &Apache::lonlocal::texthash(
3207: p_mnf => 'Name of New Folder',
3208: t_mnf => 'New Folder',
3209: p_mnp => 'Name of New Page',
3210: t_mnp => 'New Page',
1.305 bisitz 3211: p_mxu => 'Title for the Uploaded Score',
3212: p_msp => 'Title for the Page',
3213: p_msb => 'Title for the Problem',
3214: p_mdb => 'Title for the Drop Box',
3215: p_mbb => 'Title for the Bulletin Board',
1.302 bisitz 3216: p_mab => "Enter user:domain for User's 'About Me' Page",
3217: p_mab2 => "About [_99]",
3218: p_mab_alrt1 => 'Not a valid user:domain',
3219: p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',
3220: p_chn => 'New Title',
3221: p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',
3222: p_rmr2a => 'Remove[_99]',
3223: p_rmr2b => '?[_99]',
1.303 raeburn 3224: p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',
3225: p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',
1.302 bisitz 3226: p_ctr2a => 'Cut[_98]',
3227: p_ctr2b => '?[_98]'
3228: );
1.224 albertel 3229:
3230: return <<ENDNEWSCRIPT;
3231: function makenewfolder(targetform,folderseq) {
1.302 bisitz 3232: var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
1.224 albertel 3233: if (foldername) {
1.236 albertel 3234: targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224 albertel 3235: targetform.submit();
3236: }
3237: }
3238:
3239: function makenewpage(targetform,folderseq) {
1.302 bisitz 3240: var pagename=prompt('$lt{"p_mnp"}','$lt{"t_mnp"}');
1.224 albertel 3241: if (pagename) {
1.236 albertel 3242: targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224 albertel 3243: targetform.submit();
3244: }
3245: }
3246:
3247: function makenewext(targetname) {
3248: this.document.forms.extimport.useform.value=targetname;
1.287 albertel 3249: this.document.forms.extimport.title.value='';
3250: this.document.forms.extimport.url.value='';
3251: this.document.forms.extimport.residx.value='';
3252: window.open('/adm/rat/extpickframe.html');
3253: }
3254:
3255: function edittext(targetname,residx,title,url) {
3256: this.document.forms.extimport.useform.value=targetname;
3257: this.document.forms.extimport.residx.value=residx;
3258: this.document.forms.extimport.url.value=url;
3259: this.document.forms.extimport.title.value=title;
1.224 albertel 3260: window.open('/adm/rat/extpickframe.html');
3261: }
3262:
3263: function makeexamupload() {
1.302 bisitz 3264: var title=prompt('$lt{"p_mxu"}');
1.224 albertel 3265: if (title) {
3266: this.document.forms.newexamupload.importdetail.value=
1.236 albertel 3267: escape(title)+'=/res/lib/templates/examupload.problem';
1.224 albertel 3268: this.document.forms.newexamupload.submit();
3269: }
3270: }
3271:
3272: function makesmppage() {
1.302 bisitz 3273: var title=prompt('$lt{"p_msp"}');
1.224 albertel 3274: if (title) {
3275: this.document.forms.newsmppg.importdetail.value=
1.236 albertel 3276: escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224 albertel 3277: this.document.forms.newsmppg.submit();
3278: }
3279: }
3280:
3281: function makesmpproblem() {
1.302 bisitz 3282: var title=prompt('$lt{"p_msb"}');
1.224 albertel 3283: if (title) {
3284: this.document.forms.newsmpproblem.importdetail.value=
1.236 albertel 3285: escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224 albertel 3286: this.document.forms.newsmpproblem.submit();
3287: }
3288: }
3289:
3290: function makedropbox() {
1.302 bisitz 3291: var title=prompt('$lt{"p_mdb"}');
1.224 albertel 3292: if (title) {
3293: this.document.forms.newdropbox.importdetail.value=
1.236 albertel 3294: escape(title)+'=/res/lib/templates/DropBox.problem';
1.224 albertel 3295: this.document.forms.newdropbox.submit();
3296: }
3297: }
3298:
3299: function makebulboard() {
1.302 bisitz 3300: var title=prompt('$lt{"p_mbb"}');
1.224 albertel 3301: if (title) {
3302: this.document.forms.newbul.importdetail.value=
1.236 albertel 3303: escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224 albertel 3304: this.document.forms.newbul.submit();
3305: }
3306: }
3307:
3308: function makeabout() {
1.303 raeburn 3309: var user=prompt("$lt{'p_mab'}");
1.224 albertel 3310: if (user) {
3311: var comp=new Array();
1.236 albertel 3312: comp=user.split(':');
1.224 albertel 3313: if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
3314: if ((comp[0]) && (comp[1])) {
3315: this.document.forms.newaboutsomeone.importdetail.value=
1.302 bisitz 3316: '$lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224 albertel 3317: this.document.forms.newaboutsomeone.submit();
3318: } else {
1.302 bisitz 3319: alert("$lt{'p_mab_alrt1'}");
1.224 albertel 3320: }
3321: } else {
1.302 bisitz 3322: alert("$lt{'p_mab_alrt2'}");
1.224 albertel 3323: }
3324: }
3325: }
3326:
3327: function makeims() {
3328: var caller = document.forms.ims.folder.value;
3329: var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
3330: newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
3331: newWindow.location.href = newlocation;
3332: }
3333:
3334:
3335: function finishpick() {
3336: var title=this.document.forms.extimport.title.value;
3337: var url=this.document.forms.extimport.url.value;
3338: var form=this.document.forms.extimport.useform.value;
1.287 albertel 3339: var residx=this.document.forms.extimport.residx.value;
3340: eval('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+'='+residx+'";this.document.forms.'+form+'.submit();');
1.224 albertel 3341: }
3342:
3343: function changename(folderpath,index,oldtitle,container,pagesymb) {
1.302 bisitz 3344: var title=prompt('$lt{"p_chn"}',oldtitle);
1.224 albertel 3345: if (title) {
1.281 albertel 3346: this.document.forms.renameform.markcopy.value=-1;
1.224 albertel 3347: this.document.forms.renameform.title.value=title;
3348: this.document.forms.renameform.cmd.value='rename_'+index;
3349: if (container == 'sequence') {
3350: this.document.forms.renameform.folderpath.value=folderpath;
3351: }
3352: if (container == 'page') {
3353: this.document.forms.renameform.pagepath.value=folderpath;
3354: this.document.forms.renameform.pagesymb.value=pagesymb;
3355: }
3356: this.document.forms.renameform.submit();
3357: }
3358: }
3359:
1.291 albertel 3360: function removeres(folderpath,index,oldtitle,container,pagesymb,skip_confirm) {
1.302 bisitz 3361: if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
1.281 albertel 3362: this.document.forms.renameform.markcopy.value=-1;
1.224 albertel 3363: this.document.forms.renameform.cmd.value='del_'+index;
3364: if (container == 'sequence') {
3365: this.document.forms.renameform.folderpath.value=folderpath;
3366: }
3367: if (container == 'page') {
3368: this.document.forms.renameform.pagepath.value=folderpath;
3369: this.document.forms.renameform.pagesymb.value=pagesymb;
3370: }
3371: this.document.forms.renameform.submit();
3372: }
3373: }
3374:
1.291 albertel 3375: function cutres(folderpath,index,oldtitle,container,pagesymb,folder,skip_confirm) {
1.303 raeburn 3376: if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
1.224 albertel 3377: this.document.forms.renameform.cmd.value='cut_'+index;
3378: this.document.forms.renameform.markcopy.value=index;
1.281 albertel 3379: this.document.forms.renameform.copyfolder.value=folder+'.'+container;
1.224 albertel 3380: if (container == 'sequence') {
3381: this.document.forms.renameform.folderpath.value=folderpath;
3382: }
3383: if (container == 'page') {
3384: this.document.forms.renameform.pagepath.value=folderpath;
3385: this.document.forms.renameform.pagesymb.value=pagesymb;
3386: }
3387: this.document.forms.renameform.submit();
3388: }
3389: }
3390:
1.281 albertel 3391: function markcopy(folderpath,index,oldtitle,container,pagesymb,folder) {
1.224 albertel 3392: this.document.forms.renameform.markcopy.value=index;
1.281 albertel 3393: this.document.forms.renameform.copyfolder.value=folder+'.'+container;
1.224 albertel 3394: if (container == 'sequence') {
3395: this.document.forms.renameform.folderpath.value=folderpath;
3396: }
3397: if (container == 'page') {
3398: this.document.forms.renameform.pagepath.value=folderpath;
3399: this.document.forms.renameform.pagesymb.value=pagesymb;
3400: }
3401: this.document.forms.renameform.submit();
3402: }
3403:
3404: ENDNEWSCRIPT
3405: }
1.1 www 3406: 1;
3407: __END__
1.315 jms 3408:
1.317 jms 3409:
3410: =head1 NAME
3411:
3412: Apache::londocs.pm
3413:
3414: =head1 SYNOPSIS
3415:
3416: This is part of the LearningOnline Network with CAPA project
3417: described at http://www.lon-capa.org.
3418:
3419: =head1 SUBROUTINES
3420:
3421: =over
3422:
3423: =item %help=()
3424:
3425: Available help topics
3426:
3427: =item mapread()
3428:
3429: Mapread read maps into LONCAPA::map:: global arrays
3430: @order and @resources, determines status
3431: sets @order - pointer to resources in right order
3432: sets @resources - array with the resources with correct idx
3433:
3434: =item authorhosts()
3435:
3436: Return hash with valid author names
3437:
3438: =item dumpbutton()
3439:
3440: Generate "dump" button
3441:
3442: =item clean()
3443:
3444: =item dumpcourse()
3445:
3446: Actually dump course
3447:
3448:
3449: =item exportbutton()
3450:
3451: Generate "export" button
3452:
3453: =item exportcourse()
3454:
3455: =item create_ims_store()
3456:
3457: =item build_package()
3458:
3459: =item get_dependencies()
3460:
3461: =item process_content()
3462:
3463: =item replicate_content()
3464:
3465: =item extract_media()
3466:
3467: =item store_template()
3468:
3469: =item group_import()
3470:
3471: Imports the given (name, url) resources into the course
3472: coursenum, coursedom, and folder must precede the list
3473:
3474: =item breadcrumbs()
3475:
3476: =item log_docs()
3477:
3478: =item docs_change_log()
3479:
3480: =item update_paste_buffer()
3481:
3482: =item print_paste_buffer()
3483:
3484: =item do_paste_from_buffer()
3485:
3486: =item update_parameter()
3487:
3488: =item handle_edit_cmd()
3489:
3490: =item editor()
3491:
3492: =item process_file_upload()
3493:
3494: =item process_secondary_uploads()
3495:
3496: =item is_supplemental_title()
3497:
3498: =item parse_supplemental_title()
3499:
3500: =item entryline()
3501:
3502: =item tiehash()
3503:
3504: =item untiehash()
3505:
3506: =item checkonthis()
3507:
3508: check on this
3509:
3510: =item verifycontent()
3511:
3512: Verify Content
3513:
3514: =item devalidateversioncache() & checkversions()
3515:
3516: Check Versions
3517:
3518: =item mark_hash_old()
3519:
3520: =item is_hash_old()
3521:
3522: =item changewarning()
3523:
3524: =item init_breadcrumbs()
3525:
3526: Breadcrumbs for special functions
1.315 jms 3527:
3528: =back
3529:
3530: =cut
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>