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