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