Annotation of loncom/interface/londocs.pm, revision 1.249
1.1 www 1: # The LearningOnline Network
1.2 www 2: # Documents
1.1 www 3: #
1.249 ! www 4: # $Id: londocs.pm,v 1.248 2006/11/12 06:29:33 albertel 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=();
1.249 ! www 1004: my $changedflag;
1.247 www 1005:
1006: sub snapshotbefore {
1.248 albertel 1007: @oldresources=@LONCAPA::map::resources;
1008: @oldorder=@LONCAPA::map::order;
1.247 www 1009: $parmidx=undef;
1010: %parmaction=();
1011: %parmvalue=();
1.249 ! www 1012: $changedflag=0;
1.247 www 1013: }
1014:
1015: sub remember_parms {
1016: my ($idx,$parameter,$action,$value)=@_;
1017: $parmidx=$idx;
1018: $parmaction{$parameter}=$action;
1019: $parmvalue{$parameter}=$value;
1.249 ! www 1020: $changedflag=1;
1.247 www 1021: }
1022:
1023: sub log_differences {
1.249 ! www 1024: my ($coursenum,$coursedom,$folder)=@_;
! 1025: my %storehash=('folder' => '/uploaded/'.$coursedom.'/'.$coursenum.'/userfiles/'.$folder);
1.247 www 1026: if ($parmidx) {
1027: $storehash{'parameter_idx'}=$parmidx;
1028: $storehash{'parameter_res'}=$oldresources[$parmidx];
1029: foreach my $parm (keys %parmaction) {
1030: $storehash{'parameter_action_'.$parm}=$parmaction{$parm};
1031: $storehash{'parameter_value_'.$parm}=$parmvalue{$parm};
1032: }
1033: }
1034: my $maxidx=$#oldresources;
1.248 albertel 1035: if ($#LONCAPA::map::resources>$#oldresources) {
1036: $maxidx=$#LONCAPA::map::resources;
1.247 www 1037: }
1038: for (my $idx=0; $idx<=$maxidx; $idx++) {
1039: if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) {
1040: $storehash{'before_resources_'.$idx}=$oldresources[$idx];
1041: $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx];
1.249 ! www 1042: $changedflag=1;
1.247 www 1043: }
1044: if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) {
1045: $storehash{'before_order_'.$idx}=$oldorder[$idx];
1046: $storehash{'after_order_'.$idx}=$LONCAPA::map::order[$idx];
1047: $storehash{'before_order_res_'.$idx}=$oldresources[$idx];
1048: $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$idx];
1.249 ! www 1049: $changedflag=1;
1.247 www 1050: }
1051: }
1.249 ! www 1052: if ($changedflag) { &log_docs(\%storehash); }
1.247 www 1053: }
1054: }
1055:
1056:
1057: #
1058: # Docs Change Log
1059: #
1060: sub docs_change_log {
1061: my ($r)=@_;
1062: $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
1063: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
1064:
1065: my %docslog=&Apache::lonnet::dump('nohist_docslog',
1066: $env{'course.'.$env{'request.course.id'}.'.domain'},
1067: $env{'course.'.$env{'request.course.id'}.'.num'});
1068:
1069: if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
1070:
1071: $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.
1072: '<input type="hidden" name="docslog" value="1" />');
1073:
1074: my %saveable_parameters = ('show' => 'scalar',);
1075: &Apache::loncommon::store_course_settings('docs_log',
1076: \%saveable_parameters);
1077: &Apache::loncommon::restore_course_settings('docs_log',
1078: \%saveable_parameters);
1079: if (!$env{'form.show'}) { $env{'form.show'}=10; }
1080:
1081: my $countselect =
1082: &Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
1083: (&mt('all'),10,20,50,100,1000,10000));
1084:
1085: $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
1086: '<input type="submit" value="'.&mt('Display').'" /></form>');
1087: $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.249 ! www 1088: '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Users').'</th><th>'.
1.247 www 1089: &mt('Parameter').'</th><th>'.&mt('Part').'</th><th>'.&mt('New Value').'</th><th>'.&mt('Announce').'</th>'.
1090: &Apache::loncommon::end_data_table_header_row());
1091: my $shown=0;
1092: foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
1093: my @changes=keys(%{$docslog{$id}{'logentry'}});
1094: my $count = 0;
1095: my $time =
1096: &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
1097: my $plainname =
1098: &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},
1099: $docslog{$id}{'exe_udom'});
1100: my $about_me_link =
1101: &Apache::loncommon::aboutmewrapper($plainname,
1102: $docslog{$id}{'exe_uname'},
1103: $docslog{$id}{'exe_udom'});
1104: my $send_msg_link='';
1105: if ((($docslog{$id}{'exe_uname'} ne $env{'user.name'})
1106: || ($docslog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
1107: $send_msg_link ='<br />'.
1108: &Apache::loncommon::messagewrapper(&mt('Send message'),
1109: $docslog{$id}{'exe_uname'},
1110: $docslog{$id}{'exe_udom'});
1111: }
1112: $r->print(&Apache::loncommon::start_data_table_row());
1113: $r->print('<td>'.$time.'</td>
1114: <td>'.$about_me_link.
1115: '<br /><tt>'.$docslog{$id}{'exe_uname'}.
1116: ':'.$docslog{$id}{'exe_udom'}.'</tt>'.
1.249 ! www 1117: $send_msg_link.'</td><td>'.
! 1118: &Apache::lonnet::gettitle($docslog{$id}{'logentry'}{'folder'}).'</td>');
1.247 www 1119:
1120: $r->print(&Apache::loncommon::end_data_table_row());
1121: $shown++;
1122: if (!($env{'form.show'} eq &mt('all')
1123: || $shown<=$env{'form.show'})) { last; }
1124: }
1125: $r->print(&Apache::loncommon::end_data_table());
1126: $r->print(&Apache::loncommon::end_page());
1127: }
1128:
1.7 www 1129: sub editor {
1.188 raeburn 1130: my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
1.10 www 1131: my $errtext='';
1132: my $fatal=0;
1.142 raeburn 1133: my $container='sequence';
1.174 albertel 1134: if ($env{'form.pagepath'}) {
1.142 raeburn 1135: $container='page';
1136: }
1.10 www 1137: ($errtext,$fatal)=
1.142 raeburn 1138: &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245 albertel 1139: if ($#LONCAPA::map::order<1) {
1140: my $idx=&LONCAPA::map::getresidx();
1.178 www 1141: if ($idx<=0) { $idx=1; }
1.245 albertel 1142: $LONCAPA::map::order[0]=$idx;
1143: $LONCAPA::map::resources[$idx]='';
1.17 www 1144: }
1.174 albertel 1145: if (defined($env{'form.markcopy'})) {
1.168 www 1146: # Mark for copying
1.245 albertel 1147: my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
1.174 albertel 1148: $env{'form.markedcopy_title'}=$title;
1149: $env{'form.markedcopy_url'}=$url;
1.168 www 1150: }
1.242 www 1151: my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted)=&breadcrumbs($folder);
1152: $r->print($breadcrumbtrail);
1.7 www 1153: if ($fatal) {
1154: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1155: } else {
1156: # ------------------------------------------------------------ Process commands
1.121 www 1157:
1.16 www 1158: # ---------------- if they are for this folder and user allowed to make changes
1.174 albertel 1159: if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123 www 1160: # set parameters and change order
1.247 www 1161: &snapshotbefore();
1162: if ($env{'form.changeparms'}) {
1.174 albertel 1163: my $idx=$env{'form.setparms'};
1.123 www 1164: # set parameters
1.174 albertel 1165: if ($env{'form.randpick_'.$idx}) {
1.245 albertel 1166: &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
1.247 www 1167: &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
1.121 www 1168: } else {
1.245 albertel 1169: &LONCAPA::map::delparameter($idx,'parameter_randompick');
1.247 www 1170: &remember_parms($idx,'randompick','del');
1.121 www 1171: }
1.174 albertel 1172: if ($env{'form.hidprs_'.$idx}) {
1.245 albertel 1173: &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
1.247 www 1174: &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
1175: } else {
1.245 albertel 1176: &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
1.247 www 1177: &remember_parms($idx,'hiddenresource','del');
1178: }
1.174 albertel 1179: if ($env{'form.encprs_'.$idx}) {
1.245 albertel 1180: &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
1.247 www 1181: &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
1182: } else {
1.245 albertel 1183: &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
1.247 www 1184: &remember_parms($idx,'encrypturl','del');
1185: }
1186: }
1.121 www 1187:
1.247 www 1188: if ($env{'form.newpos'}) {
1.123 www 1189: # change order
1.247 www 1190: my $newpos=$env{'form.newpos'}-1;
1191: my $currentpos=$env{'form.currentpos'}-1;
1192: my $i;
1193: my @neworder=();
1194: if ($newpos>$currentpos) {
1.125 www 1195: # moving stuff up
1.247 www 1196: for ($i=0;$i<$currentpos;$i++) {
1197: $neworder[$i]=$LONCAPA::map::order[$i];
1198: }
1199: for ($i=$currentpos;$i<$newpos;$i++) {
1200: $neworder[$i]=$LONCAPA::map::order[$i+1];
1201: }
1202: $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
1203: for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) {
1204: $neworder[$i]=$LONCAPA::map::order[$i];
1205: }
1206: } else {
1.125 www 1207: # moving stuff down
1.247 www 1208: for ($i=0;$i<$newpos;$i++) {
1209: $neworder[$i]=$LONCAPA::map::order[$i];
1210: }
1211: $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
1212: for ($i=$newpos+1;$i<$currentpos+1;$i++) {
1213: $neworder[$i]=$LONCAPA::map::order[$i-1];
1214: }
1215: for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) {
1216: $neworder[$i]=$LONCAPA::map::order[$i];
1.125 www 1217: }
1.124 www 1218: }
1.247 www 1219: @LONCAPA::map::order=@neworder;
1.124 www 1220: # store the changed version
1.142 raeburn 1221: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1.124 www 1222: if ($fatal) {
1223: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1224: return;
1.123 www 1225: }
1.247 www 1226: }
1.124 www 1227:
1.174 albertel 1228: if ($env{'form.pastemarked'}) {
1.168 www 1229: # paste resource to end of list
1.174 albertel 1230: my $url=$env{'form.markedcopy_url'};
1231: my $title=$env{'form.markedcopy_title'};
1.168 www 1232: # Maps need to be copied first
1233: if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
1234: $title=&mt('Copy of').' '.$title;
1235: my $newid=$$.time;
1236: $url=~/^(.+)\.(\w+)$/;
1237: my $newurl=$1.$newid.'.'.$2;
1238: my $storefn=$newurl;
1239: $storefn=~s/^\/\w+\/\w+\/\w+\///;
1.244 albertel 1240: &Apache::lonclonecourse::writefile
1.174 albertel 1241: ($env{'request.course.id'},$storefn,
1.168 www 1242: &Apache::lonnet::getfile($url));
1243: $url=$newurl;
1244: }
1245: $title=~s/\</\<\;/g;
1246: $title=~s/\>/\>\;/g;
1247: $title=~s/\:/\:/g;
1248: my $ext='false';
1249: if ($url=~/^http\:\/\//) { $ext='true'; }
1250: $url=~s/\:/\:/g;
1251: # Now insert the URL at the bottom
1.245 albertel 1252: my $newidx=&LONCAPA::map::getresidx($url);
1253: $LONCAPA::map::resources[$newidx]=
1.168 www 1254: $title.':'.$url.':'.$ext.':normal:res';
1.245 albertel 1255: $LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
1.168 www 1256: # Store the result
1257: ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1258: if ($fatal) {
1259: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1260: return;
1261: }
1.123 www 1262:
1.168 www 1263: }
1.188 raeburn 1264: $r->print($upload_output);
1.174 albertel 1265: if ($env{'form.cmd'}) {
1266: my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
1.10 www 1267: if ($cmd eq 'del') {
1.245 albertel 1268: my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.187 www 1269: if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1.206 albertel 1270: ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1.187 www 1271: &Apache::lonnet::removeuploadedurl($url);
1272: } else {
1.245 albertel 1273: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1.128 albertel 1274: }
1.245 albertel 1275: for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
1276: $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.10 www 1277: }
1.245 albertel 1278: $#LONCAPA::map::order--;
1.171 www 1279: } elsif ($cmd eq 'cut') {
1.245 albertel 1280: my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1281: &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1282: for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
1283: $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.171 www 1284: }
1.245 albertel 1285: $#LONCAPA::map::order--;
1.10 www 1286: } elsif ($cmd eq 'up') {
1.245 albertel 1287: if (($idx) && (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.10 www 1292: } elsif ($cmd eq 'down') {
1.245 albertel 1293: if (defined($LONCAPA::map::order[$idx+1])) {
1294: my $i=$LONCAPA::map::order[$idx+1];
1295: $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx];
1296: $LONCAPA::map::order[$idx] = $i;
1.38 www 1297: }
1.36 www 1298: } elsif ($cmd eq 'rename') {
1.245 albertel 1299: my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.36 www 1300: my ($rtitle,@rrest)=split(/\:/,
1.245 albertel 1301: $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.38 www 1302: my $comment=
1.174 albertel 1303: &HTML::Entities::decode($env{'form.title'});
1.36 www 1304: $comment=~s/\</\<\;/g;
1305: $comment=~s/\>/\>\;/g;
1306: $comment=~s/\:/\:/g;
1.144 albertel 1307: if ($comment=~/\S/) {
1.245 albertel 1308: $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
1309: $comment.':'.join(':',@rrest);
1.144 albertel 1310: }
1.238 www 1311: # Devalidate title cache
1.240 www 1312: my $renamed_url=$rrest[0];
1313: # Has the :-escaping
1314: $renamed_url=~s/\&colon\;/\:/g;
1315: &Apache::lonnet::devalidate_title_cache($renamed_url);
1.10 www 1316: }
1317: # Store the changed version
1.104 albertel 1318: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142 raeburn 1319: $folder.'.'.$container);
1.104 albertel 1320: if ($fatal) {
1321: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1322: return;
1323: }
1.8 www 1324: }
1.11 www 1325: # Group import/search
1.174 albertel 1326: if ($env{'form.importdetail'}) {
1.73 bowersj2 1327: my @imports;
1.243 www 1328: # &Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
1.174 albertel 1329: foreach (split(/\&/,$env{'form.importdetail'})) {
1.73 bowersj2 1330: if (defined($_)) {
1331: my ($name,$url)=split(/\=/,$_);
1.228 www 1332: $name=&unescape($name);
1333: $url=&unescape($url);
1.73 bowersj2 1334: push @imports, $name, $url;
1335: }
1336: }
1.11 www 1337: # Store the changed version
1.249 ! www 1338: ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
1.142 raeburn 1339: $container,'londocs',@imports);
1.104 albertel 1340: if ($fatal) {
1341: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1342: return;
1343: }
1.11 www 1344: }
1.53 www 1345: # Loading a complete map
1.223 www 1346: if ($env{'form.loadmap'}) {
1347: if ($env{'form.importmap'}=~/\w/) {
1348: foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
1349: my ($title,$url,$ext,$type)=split(/\:/,$_);
1.245 albertel 1350: my $idx=&LONCAPA::map::getresidx($url);
1351: $LONCAPA::map::resources[$idx]=$_;
1352: $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.223 www 1353: }
1.53 www 1354: # Store the changed version
1.223 www 1355: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142 raeburn 1356: $folder.'.'.$container);
1.223 www 1357: if ($fatal) {
1358: $r->print('<p><font color="red">'.$errtext.'</font></p>');
1359: return;
1360: }
1361: } else {
1362: $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
1363: }
1.53 www 1364: }
1.249 ! www 1365: &log_differences($coursenum,$coursedom,
! 1366: $folder.'.'.$container);
1.16 www 1367: }
1368: # ---------------------------------------------------------------- End commands
1.7 www 1369: # ---------------------------------------------------------------- Print screen
1.10 www 1370: my $idx=0;
1.148 www 1371: my $shown=0;
1.242 www 1372: if (($ishidden) || ($isencrypted) || ($randompick>=0)) {
1373: $r->print('<p>'.&mt('Parameters').':<ul>'.
1374: ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
1375: ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
1376: ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
1377: '</ul></p>');
1378: }
1379: if ($randompick>=0) {
1380: $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>');
1381: }
1.10 www 1382: $r->print('<table>');
1.245 albertel 1383: foreach (@LONCAPA::map::order) {
1384: my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
1.246 raeburn 1385: $name=&LONCAPA::map::qtescape($name);
1386: $url=&LONCAPA::map::qtescape($url);
1.10 www 1387: unless ($name) { $name=(split(/\//,$url))[-1]; }
1.148 www 1388: unless ($name) { $idx++; next; }
1.112 raeburn 1389: $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
1.10 www 1390: $idx++;
1.148 www 1391: $shown++;
1.10 www 1392: }
1.148 www 1393: unless ($shown) {
1.131 www 1394: $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
1395: }
1.168 www 1396: $r->print("\n</table>\n");
1.174 albertel 1397: if ($env{'form.markedcopy_url'}) {
1.168 www 1398: $r->print(<<ENDPASTE);
1399: <p><form name="pasteform" action="/adm/coursedocs" method="post">
1.174 albertel 1400: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
1401: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.168 www 1402: ENDPASTE
1403: $r->print(
1404: '<input type="submit" name="pastemarked" value="'.&mt('Paste').
1405: '" /> '.&Apache::loncommon::filedescription(
1.174 albertel 1406: (split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.
1407: $env{'form.markedcopy_title'});
1.168 www 1408: if ($container eq 'page') {
1409: $r->print(<<PAGEINFO);
1.174 albertel 1410: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
1411: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1.168 www 1412: PAGEINFO
1413: } else {
1414: $r->print(<<FOLDERINFO);
1.174 albertel 1415: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.168 www 1416: FOLDERINFO
1417: }
1418: $r->print('</form></p>');
1419: }
1.7 www 1420: }
1421: }
1.1 www 1422:
1.188 raeburn 1423: sub process_file_upload {
1.194 raeburn 1424: my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188 raeburn 1425: # upload a file, if present
1426: my $parseaction;
1.190 albertel 1427: if ($env{'form.parserflag'}) {
1.188 raeburn 1428: $parseaction = 'parse';
1429: }
1430: my $phase_status;
1431: my $folder=$env{'form.folder'};
1.194 raeburn 1432: if ($folder eq '') {
1.188 raeburn 1433: $folder='default';
1434: }
1.194 raeburn 1435: if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188 raeburn 1436: my $errtext='';
1437: my $fatal=0;
1438: my $container='sequence';
1439: if ($env{'form.pagepath'}) {
1440: $container='page';
1441: }
1442: ($errtext,$fatal)=
1443: &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245 albertel 1444: if ($#LONCAPA::map::order<1) {
1445: $LONCAPA::map::order[0]=1;
1446: $LONCAPA::map::resources[1]='';
1.188 raeburn 1447: }
1448: if ($fatal) {
1449: return 'failed';
1450: }
1451: my $destination = 'docs/';
1.194 raeburn 1452: if ($folder =~ /^supplemental/) {
1453: $destination = 'supplemental/';
1454: }
1455: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1456: $destination .= 'default/';
1.194 raeburn 1457: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1458: $destination .= $2.'/';
1.188 raeburn 1459: }
1460: # this is for a course, not a user, so set coursedoc flag
1461: # probably the only place in the system where this should be "1"
1.245 albertel 1462: my $newidx=&LONCAPA::map::getresidx();
1.188 raeburn 1463: $destination .= $newidx;
1.190 albertel 1464: my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
1465: $parseaction,$allfiles,
1466: $codebase);
1.188 raeburn 1467: my $ext='false';
1468: if ($url=~/^http\:\/\//) { $ext='true'; }
1469: $url=~s/\:/\:/g;
1470: my $comment=$env{'form.comment'};
1471: $comment=~s/\</\<\;/g;
1472: $comment=~s/\>/\>\;/g;
1473: $comment=~s/\:/\:/g;
1474: if ($folder=~/^supplemental/) {
1475: $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
1476: $env{'user.domain'}.'___&&&___'.$comment;
1477: }
1478:
1.245 albertel 1479: $LONCAPA::map::resources[$newidx]=
1480: $comment.':'.$url.':'.$ext.':normal:res';
1481: $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190 albertel 1482: ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1483: $folder.'.'.$container);
1.188 raeburn 1484: if ($fatal) {
1485: $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
1486: return 'failed';
1487: } else {
1488: if ($parseaction eq 'parse') {
1.190 albertel 1489: my $total_embedded = keys(%{$allfiles});
1.188 raeburn 1490: if ($total_embedded > 0) {
1491: my $num = 0;
1492: $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
1493: <form name="upload_embedded" action="/adm/coursedocs"
1494: method="post" enctype="multipart/form-data">
1495: <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" /> <input type="hidden" name="cmd" value="upload_embedded" />
1496: <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228 www 1497: <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188 raeburn 1498: <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
1499: $$upload_output .= '<b>Upload embedded files</b>:<br />
1500: <table>';
1.190 albertel 1501: foreach my $embed_file (keys(%{$allfiles})) {
1.188 raeburn 1502: $$upload_output .= '<tr><td>'.$embed_file.
1.190 albertel 1503: '<input name="embedded_item_'.$num.'" type="file" />
1.228 www 1504: <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
1.188 raeburn 1505: my $attrib;
1506: if (@{$$allfiles{$embed_file}} > 1) {
1507: $attrib = join(':',@{$$allfiles{$embed_file}});
1508: } else {
1509: $attrib = $$allfiles{$embed_file}[0];
1510: }
1511: $$upload_output .=
1512: '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
1513: if (exists($$codebase{$embed_file})) {
1514: $$upload_output .=
1.228 www 1515: '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';
1.188 raeburn 1516: }
1517: $$upload_output .= '</td></tr>';
1518: $num ++;
1519: }
1520: $phase_status = 'phasetwo';
1521: $$upload_output .= '</table><br />
1522: <input type ="submit" value="Complete upload" />
1523: </form>';
1524: } else {
1525: $$upload_output .= 'No embedded items identified<br />';
1526: }
1527: }
1528: }
1529: }
1530: return $phase_status;
1531: }
1532:
1533: sub process_secondary_uploads {
1534: my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
1535: my $folder=$env{'form.folder'};
1536: my $destination = 'docs/';
1.195 raeburn 1537: if ($folder =~ /^supplemental/) {
1538: $destination = 'supplemental/';
1539: }
1540: if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188 raeburn 1541: $destination .= 'default/';
1.195 raeburn 1542: } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217 raeburn 1543: $destination .= $2.'/';
1.188 raeburn 1544: }
1545: $destination .= $newidx;
1546: my ($url,$filename);
1547: $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
1548: ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
1549: return $filename;
1550: }
1551:
1.8 www 1552: # --------------------------------------------------------------- An entry line
1553:
1554: sub entryline {
1.112 raeburn 1555: my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.38 www 1556: $title=~s/\&colon\;/\:/g;
1557: $title=&HTML::Entities::encode(&HTML::Entities::decode(
1.228 www 1558: &unescape($title)),'"<>&\'');
1.38 www 1559: my $renametitle=$title;
1560: my $foldertitle=$title;
1.142 raeburn 1561: my $pagetitle=$title;
1.245 albertel 1562: my $orderidx=$LONCAPA::map::order[$index];
1.109 albertel 1563: if ($title=~ /^(\d+)___&&&___(\w+)___&&&___(\w+)___&&&___(.*)$/ ) {
1564: $foldertitle=&Apache::lontexconvert::msgtexconverted($4);
1565: $renametitle=$4;
1566: $title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
1567: &Apache::loncommon::plainname($2,$3).': <br />'.
1568: $foldertitle;
1569: }
1.222 albertel 1570: $renametitle=~s/\\/\\\\/g;
1.38 www 1571: $renametitle=~s/\"\;/\\\"/g;
1.8 www 1572: my $line='<tr>';
1573: # Edit commands
1.142 raeburn 1574: my $container;
1.120 www 1575: my $folderpath;
1.174 albertel 1576: if ($env{'form.folderpath'}) {
1.142 raeburn 1577: $container = 'sequence';
1.228 www 1578: $folderpath=&escape($env{'form.folderpath'});
1.174 albertel 1579: # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120 www 1580: }
1.156 albertel 1581: my ($pagepath,$pagesymb);
1.174 albertel 1582: if ($env{'form.pagepath'}) {
1.142 raeburn 1583: $container = 'page';
1.228 www 1584: $pagepath=&escape($env{'form.pagepath'});
1585: $pagesymb=&escape($env{'form.pagesymb'});
1.142 raeburn 1586: }
1.168 www 1587: my $cpinfo='';
1.174 albertel 1588: if ($env{'form.markedcopy_url'}) {
1.168 www 1589: $cpinfo='&markedcopy_url='.
1.228 www 1590: &escape($env{'form.markedcopy_url'}).
1.168 www 1591: '&markedcopy_title='.
1.228 www 1592: &escape($env{'form.markedcopy_title'});
1.168 www 1593: }
1.109 albertel 1594: if ($allowed) {
1.123 www 1595: my $incindex=$index+1;
1596: my $selectbox='';
1.168 www 1597: if (($folder!~/^supplemental/) &&
1.245 albertel 1598: ($#LONCAPA::map::order>0) &&
1.168 www 1599: ((split(/\:/,
1.245 albertel 1600: $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1]
1.168 www 1601: ne '') &&
1602: ((split(/\:/,
1.245 albertel 1603: $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1]
1.168 www 1604: ne '')) {
1.123 www 1605: $selectbox=
1.124 www 1606: '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123 www 1607: '<select name="newpos" onChange="this.form.submit()">';
1.245 albertel 1608: for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123 www 1609: if ($i==$incindex) {
1610: $selectbox.='<option value="" selected="1">('.$i.')</option>';
1611: } else {
1612: $selectbox.='<option value="'.$i.'">'.$i.'</option>';
1613: }
1614: }
1615: $selectbox.='</select>';
1616: }
1.119 www 1617: my %lt=&Apache::lonlocal::texthash(
1618: 'up' => 'Move Up',
1.109 albertel 1619: 'dw' => 'Move Down',
1620: 'rm' => 'Remove',
1.171 www 1621: 'ct' => 'Cut',
1.168 www 1622: 'rn' => 'Rename',
1623: 'cp' => 'Copy');
1.211 www 1624: my $nocopy=0;
1625: if ($url=~/\.(page|sequence)$/) {
1626: foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
1627: my ($title,$url,$ext,$type)=split(/\:/,$_);
1628: if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
1629: $nocopy=1;
1630: last;
1631: }
1632: }
1633: }
1634: my $copylink=' ';
1.174 albertel 1635: if ($env{'form.pagepath'}) {
1.211 www 1636: unless ($nocopy) {
1637: $copylink=(<<ENDCOPY);
1638: <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
1639: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
1640: ENDCOPY
1641: }
1.142 raeburn 1642: $line.=(<<END);
1643: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174 albertel 1644: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
1645: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1646: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
1647: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.142 raeburn 1648: <input type="hidden" name="setparms" value="$orderidx" />
1.247 www 1649: <input type="hidden" name="changeparms" value="0" />
1.142 raeburn 1650: <td><table border='0' cellspacing='2' cellpadding='0'>
1651: <tr><td bgcolor="#DDDDDD">
1.168 www 1652: <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142 raeburn 1653: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1654: <tr><td bgcolor="#DDDDDD">
1.168 www 1655: <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142 raeburn 1656: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1657: </table></td>
1658: <td>$selectbox
1659: </td><td bgcolor="#DDDDDD">
1.156 albertel 1660: <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.142 raeburn 1661: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171 www 1662: <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1663: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.213 albertel 1664: <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.168 www 1665: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211 www 1666: $copylink
1.142 raeburn 1667: END
1668: } else {
1.211 www 1669: unless ($nocopy) {
1670: $copylink=(<<ENDCOPY);
1671: <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
1672: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
1673: ENDCOPY
1674: }
1.142 raeburn 1675: $line.=(<<END);
1.121 www 1676: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174 albertel 1677: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1678: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
1679: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.122 www 1680: <input type="hidden" name="setparms" value="$orderidx" />
1.247 www 1681: <input type="hidden" name="changeparms" value="0" />
1.54 www 1682: <td><table border='0' cellspacing='2' cellpadding='0'>
1683: <tr><td bgcolor="#DDDDDD">
1.168 www 1684: <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
1.90 www 1685: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1.54 www 1686: <tr><td bgcolor="#DDDDDD">
1.168 www 1687: <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
1.90 www 1688: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1.123 www 1689: </table></td>
1690: <td>$selectbox
1691: </td><td bgcolor="#DDDDDD">
1.142 raeburn 1692: <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
1.90 www 1693: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171 www 1694: <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
1695: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.142 raeburn 1696: <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
1.168 www 1697: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211 www 1698: $copylink
1.8 www 1699: END
1.142 raeburn 1700: }
1.8 www 1701: }
1.16 www 1702: # Figure out what kind of a resource this is
1703: my ($extension)=($url=~/\.(\w+)$/);
1704: my $uploaded=($url=~/^\/*uploaded\//);
1.97 albertel 1705: my $icon=&Apache::loncommon::icon($url);
1.17 www 1706: my $isfolder=0;
1.142 raeburn 1707: my $ispage=0;
1.114 albertel 1708: my $folderarg;
1.142 raeburn 1709: my $pagearg;
1710: my $pagefile;
1.16 www 1711: if ($uploaded) {
1.135 albertel 1712: if ($extension eq 'sequence') {
1713: $icon=$iconpath.'/folder_closed.gif';
1714: $url=~/$coursenum\/([\/\w]+)\.sequence$/;
1715: $url='/adm/coursedocs?';
1716: $folderarg=$1;
1717: $isfolder=1;
1.142 raeburn 1718: } elsif ($extension eq 'page') {
1719: $icon=$iconpath.'/page.gif';
1720: $url=~/$coursenum\/([\/\w]+)\.page$/;
1721: $pagearg=$1;
1722: $url='/adm/coursedocs?';
1723: $ispage=1;
1.135 albertel 1724: } else {
1725: &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
1726: }
1.16 www 1727: }
1.215 albertel 1728: $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
1.142 raeburn 1729: if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113 albertel 1730: my $symb=&Apache::lonnet::symbclean(
1.50 www 1731: &Apache::lonnet::declutter('uploaded/'.
1.174 albertel 1732: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1733: $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50 www 1734: '.sequence').
1735: '___'.$residx.'___'.
1.113 albertel 1736: &Apache::lonnet::declutter($url));
1737: (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
1738: $url=&Apache::lonnet::clutter($url);
1.127 albertel 1739: if ($url=~/^\/*uploaded\//) {
1740: $url=~/\.(\w+)$/;
1741: my $embstyle=&Apache::loncommon::fileembstyle($1);
1742: if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
1743: $url='/adm/wrapper'.$url;
1744: } elsif ($embstyle eq 'ssi') {
1745: #do nothing with these
1746: } elsif ($url!~/\.(sequence|page)$/) {
1747: $url='/adm/coursedocs/showdoc'.$url;
1748: }
1.145 albertel 1749: } elsif ($url=~m|^/ext/|) {
1750: $url='/adm/wrapper'.$url;
1.127 albertel 1751: }
1.241 www 1752: if (&Apache::lonnet::symbverify($symb,$url)) {
1753: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1754: } else {
1755: $url='';
1756: }
1.152 albertel 1757: if ($container eq 'page') {
1.174 albertel 1758: my $symb=$env{'form.pagesymb'};
1.152 albertel 1759:
1760: $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228 www 1761: $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152 albertel 1762: }
1.50 www 1763: }
1.120 www 1764: my $parameterset=' ';
1.216 albertel 1765: if ($isfolder || $extension eq 'sequence') {
1.228 www 1766: my $foldername=&escape($foldertitle);
1.174 albertel 1767: my $folderpath=$env{'form.folderpath'};
1.114 albertel 1768: if ($folderpath) { $folderpath.='&' };
1.242 www 1769: # Append randompick number, hidden, and encrypted with ":" to foldername,
1770: # so it gets transferred between levels
1.245 albertel 1771: $folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242 www 1772: 'parameter_randompick'))[0]
1.245 albertel 1773: .':'.((&LONCAPA::map::getparameter($orderidx,
1.242 www 1774: 'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245 albertel 1775: .':'.((&LONCAPA::map::getparameter($orderidx,
1.242 www 1776: 'parameter_encrypturl'))[0]=~/^yes$/i);
1.228 www 1777: $url.='folderpath='.&escape($folderpath).$cpinfo;
1.147 matthew 1778: $parameterset='<label>'.&mt('Randomly Pick: ').
1.247 www 1779: '<input type="text" size="4" onChange="this.form.changeparms.value=1;this.form.submit()" name="randpick_'.$orderidx.'" value="'.
1.245 albertel 1780: (&LONCAPA::map::getparameter($orderidx,
1.147 matthew 1781: 'parameter_randompick'))[0].
1.165 www 1782: '" />'.
1783: '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
1.147 matthew 1784:
1.114 albertel 1785: }
1.142 raeburn 1786: if ($ispage) {
1.228 www 1787: my $pagename=&escape($pagetitle);
1.142 raeburn 1788: my $pagepath;
1.174 albertel 1789: my $folderpath=$env{'form.folderpath'};
1.142 raeburn 1790: if ($folderpath) { $pagepath = $folderpath.'&' };
1791: $pagepath.=$pagearg.'&'.$pagename;
1.174 albertel 1792: my $symb=$env{'form.pagesymb'};
1.152 albertel 1793: if (!$symb) {
1794: my $path='uploaded/'.
1.174 albertel 1795: $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
1796: $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152 albertel 1797: $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
1798: $residx,
1799: $path.$pagearg.'.page');
1800: }
1.228 www 1801: $url.='pagepath='.&escape($pagepath).
1802: '&pagesymb='.&escape($symb).$cpinfo;
1.142 raeburn 1803: }
1.113 albertel 1804: $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
1805: '" border="0"></a></td>'.
1.241 www 1806: "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
1807: ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
1.120 www 1808: if (($allowed) && ($folder!~/^supplemental/)) {
1809: my %lt=&Apache::lonlocal::texthash(
1810: 'hd' => 'Hidden',
1.165 www 1811: 'ec' => 'URL hidden');
1.122 www 1812: my $enctext=
1.245 albertel 1813: ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122 www 1814: my $hidtext=
1.245 albertel 1815: ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120 www 1816: $line.=(<<ENDPARMS);
1817: <td bgcolor="#BBBBFF"><font size='-2'>
1.247 www 1818: <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 1819: <td bgcolor="#BBBBFF"><font size='-2'>
1.247 www 1820: <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 1821: <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
1822: ENDPARMS
1.119 www 1823: }
1.120 www 1824: $line.="</form></tr>";
1.8 www 1825: return $line;
1826: }
1827:
1.27 www 1828: # ---------------------------------------------------------------- tie the hash
1829:
1830: sub tiehash {
1.136 albertel 1831: my ($mode)=@_;
1.27 www 1832: $hashtied=0;
1.174 albertel 1833: if ($env{'request.course.fn'}) {
1.136 albertel 1834: if ($mode eq 'write') {
1.174 albertel 1835: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 1836: &GDBM_WRCREAT(),0640)) {
1837: $hashtied=2;
1838: }
1839: } else {
1.174 albertel 1840: if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136 albertel 1841: &GDBM_READER(),0640)) {
1.27 www 1842: $hashtied=1;
1.136 albertel 1843: }
1844: }
1.27 www 1845: }
1846: }
1847:
1848: sub untiehash {
1849: if ($hashtied) { untie %hash; }
1850: $hashtied=0;
1.221 albertel 1851: return OK;
1.27 www 1852: }
1853:
1.29 www 1854: # --------------------------------------------------------------- check on this
1855:
1856: sub checkonthis {
1857: my ($r,$url,$level,$title)=@_;
1.228 www 1858: $url=&unescape($url);
1.29 www 1859: $alreadyseen{$url}=1;
1860: $r->rflush();
1.41 www 1861: if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108 albertel 1862: $r->print("\n<br />");
1.29 www 1863: for (my $i=0;$i<=$level*5;$i++) {
1864: $r->print(' ');
1865: }
1866: $r->print('<a href="'.$url.'" target="cat">'.
1867: ($title?$title:$url).'</a> ');
1868: if ($url=~/^\/res\//) {
1869: my $result=&Apache::lonnet::repcopy(
1870: &Apache::lonnet::filelocation('',$url));
1.172 raeburn 1871: if ($result eq 'ok') {
1.87 www 1872: $r->print('<font color="green">'.&mt('ok').'</font>');
1.29 www 1873: $r->rflush();
1.34 www 1874: &Apache::lonnet::countacc($url);
1875: $url=~/\.(\w+)$/;
1876: if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
1877: $r->print('<br />');
1878: $r->rflush();
1879: for (my $i=0;$i<=$level*5;$i++) {
1880: $r->print(' ');
1881: }
1.84 www 1882: $r->print('- '.&mt('Rendering').': ');
1.170 www 1883: my ($errorcount,$warningcount)=split(/:/,
1884: &Apache::lonnet::ssi_body($url,
1.173 albertel 1885: ('grade_target'=>'web',
1886: 'return_only_error_and_warning_counts' => 1)));
1.170 www 1887: if (($errorcount) ||
1888: ($warningcount)) {
1889: if ($errorcount) {
1.98 www 1890: $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
1.170 www 1891: $errorcount.' '.
1.87 www 1892: &mt('error(s)').'</b></font> ');
1.34 www 1893: }
1.170 www 1894: if ($warningcount) {
1.34 www 1895: $r->print('<font color="blue">'.
1.170 www 1896: $warningcount.' '.
1.84 www 1897: &mt('warning(s)').'</font>');
1.34 www 1898: }
1899: } else {
1.87 www 1900: $r->print('<font color="green">'.&mt('ok').'</font>');
1.34 www 1901: }
1902: $r->rflush();
1903: }
1.29 www 1904: my $dependencies=
1905: &Apache::lonnet::metadata($url,'dependencies');
1906: foreach (split(/\,/,$dependencies)) {
1907: if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
1908: &checkonthis($r,$_,$level+1);
1909: }
1910: }
1.172 raeburn 1911: } elsif ($result eq 'unavailable') {
1.84 www 1912: $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
1.172 raeburn 1913: } elsif ($result eq 'not_found') {
1.100 www 1914: unless ($url=~/\$/) {
1915: $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
1916: } else {
1917: $r->print('<font color="yellow"><b>'.&mt('unable to verify variable URL').'</b></font>');
1918: }
1.29 www 1919: } else {
1.84 www 1920: $r->print('<font color="red"><b>'.&mt('access denied').'</b></font>');
1.29 www 1921: }
1922: }
1923: }
1924: }
1925:
1.1 www 1926:
1.75 www 1927: #
1.208 albertel 1928: # ----------------------------------------------------------------- List Symbs
1929: #
1930: sub list_symbs {
1.224 albertel 1931: my ($r) = @_;
1932:
1933: $r->print(&Apache::loncommon::start_page('Symb List'));
1934: my $navmap = Apache::lonnavmaps::navmap->new();
1935: $r->print("<pre>\n");
1936: foreach my $res ($navmap->retrieveResources()) {
1937: $r->print($res->compTitle()."\t".$res->symb()."\n");
1938: }
1939: $r->print("\n</pre>\n");
1940: $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208 albertel 1941: }
1942:
1943:
1944: #
1.75 www 1945: # -------------------------------------------------------------- Verify Content
1946: #
1947: sub verifycontent {
1.224 albertel 1948: my ($r) = @_;
1.230 albertel 1949: my $type = &Apache::loncommon::course_type();
1.26 www 1950: my $loaderror=&Apache::lonnet::overloaderror($r);
1951: if ($loaderror) { return $loaderror; }
1.229 raeburn 1952: $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.27 www 1953: $hashtied=0;
1.30 www 1954: undef %alreadyseen;
1955: %alreadyseen=();
1.27 www 1956: &tiehash();
1957: foreach (keys %hash) {
1.140 www 1958: if ($hash{$_}=~/\.(page|sequence)$/) {
1.228 www 1959: if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
1.140 www 1960: $r->print('<hr /><font color="red">'.
1.230 albertel 1961: &mt('The following sequence or page is included more than once in your '.$type.': ').
1.228 www 1962: &unescape($hash{$_}).'</font><br />'.
1.140 www 1963: &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
1964: }
1965: }
1.228 www 1966: if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
1.29 www 1967: &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
1.27 www 1968: }
1969: }
1970: &untiehash();
1.108 albertel 1971: $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
1972: &mt('Return to DOCS').'</a>');
1.75 www 1973: }
1974:
1.192 www 1975:
1.75 www 1976: # -------------------------------------------------------------- Check Versions
1977:
1.192 www 1978: sub devalidateversioncache {
1979: my $src=shift;
1980: &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
1981: &Apache::lonnet::clutter($src));
1982: }
1983:
1.75 www 1984: sub checkversions {
1.224 albertel 1985: my ($r) = @_;
1.230 albertel 1986: my $type = &Apache::loncommon::course_type();
1.229 raeburn 1987: $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.89 www 1988: my $header='';
1989: my $startsel='';
1990: my $monthsel='';
1991: my $weeksel='';
1992: my $daysel='';
1993: my $allsel='';
1994: my %changes=();
1995: my $starttime=0;
1.91 www 1996: my $haschanged=0;
1.92 www 1997: my %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 1998: $env{'course.'.$env{'request.course.id'}.'.domain'},
1999: $env{'course.'.$env{'request.course.id'}.'.num'});
1.92 www 2000:
2001: $hashtied=0;
2002: &tiehash();
2003: my %newsetversions=();
1.174 albertel 2004: if ($env{'form.setmostrecent'}) {
1.91 www 2005: $haschanged=1;
1.92 www 2006: foreach (keys %hash) {
2007: if ($_=~/^ids\_(\/res\/.+)$/) {
1.93 www 2008: $newsetversions{$1}='mostrecent';
1.192 www 2009: &devalidateversioncache($1);
1.92 www 2010: }
2011: }
1.174 albertel 2012: } elsif ($env{'form.setcurrent'}) {
1.91 www 2013: $haschanged=1;
1.92 www 2014: foreach (keys %hash) {
2015: if ($_=~/^ids\_(\/res\/.+)$/) {
1.93 www 2016: my $getvers=&Apache::lonnet::getversion($1);
2017: if ($getvers>0) {
2018: $newsetversions{$1}=$getvers;
1.192 www 2019: &devalidateversioncache($1);
1.93 www 2020: }
1.92 www 2021: }
2022: }
1.174 albertel 2023: } elsif ($env{'form.setversions'}) {
1.91 www 2024: $haschanged=1;
1.174 albertel 2025: foreach (keys %env) {
1.92 www 2026: if ($_=~/^form\.set_version_(.+)$/) {
2027: my $src=$1;
1.174 albertel 2028: if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
2029: $newsetversions{$src}=$env{$_};
1.192 www 2030: &devalidateversioncache($src);
1.92 www 2031: }
2032: }
2033: }
1.91 www 2034: }
2035: if ($haschanged) {
1.92 www 2036: if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174 albertel 2037: $env{'course.'.$env{'request.course.id'}.'.domain'},
2038: $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
1.92 www 2039: $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
2040: } else {
2041: $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
2042: }
1.136 albertel 2043: &mark_hash_old();
1.91 www 2044: }
1.136 albertel 2045: &changewarning($r,'');
1.174 albertel 2046: if ($env{'form.timerange'} eq 'all') {
1.89 www 2047: # show all documents
1.230 albertel 2048: $header=&mt('All Documents in '.$type);
1.91 www 2049: $allsel=1;
1.90 www 2050: foreach (keys %hash) {
2051: if ($_=~/^ids\_(\/res\/.+)$/) {
2052: my $src=$1;
2053: $changes{$src}=1;
2054: }
2055: }
1.89 www 2056: } else {
2057: # show documents which changed
2058: %changes=&Apache::lonnet::dump
1.174 albertel 2059: ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
2060: $env{'course.'.$env{'request.course.id'}.'.num'});
1.89 www 2061: my $firstkey=(keys %changes)[0];
2062: unless ($firstkey=~/^error\:/) {
1.174 albertel 2063: unless ($env{'form.timerange'}) {
2064: $env{'form.timerange'}=604800;
1.89 www 2065: }
1.174 albertel 2066: my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89 www 2067: .&mt('seconds');
1.174 albertel 2068: if ($env{'form.timerange'}==-1) {
1.89 www 2069: $seltext='since start of course';
2070: $startsel='selected';
1.174 albertel 2071: $env{'form.timerange'}=time;
1.89 www 2072: }
1.174 albertel 2073: $starttime=time-$env{'form.timerange'};
2074: if ($env{'form.timerange'}==2592000) {
1.89 www 2075: $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2076: $monthsel='selected';
1.174 albertel 2077: } elsif ($env{'form.timerange'}==604800) {
1.89 www 2078: $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2079: $weeksel='selected';
1.174 albertel 2080: } elsif ($env{'form.timerange'}==86400) {
1.89 www 2081: $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
2082: $daysel='selected';
2083: }
2084: $header=&mt('Content changed').' '.$seltext;
2085: } else {
2086: $header=&mt('No content modifications yet.');
2087: }
2088: }
1.92 www 2089: %setversions=&Apache::lonnet::dump('resourceversions',
1.174 albertel 2090: $env{'course.'.$env{'request.course.id'}.'.domain'},
2091: $env{'course.'.$env{'request.course.id'}.'.num'});
1.89 www 2092: my %lt=&Apache::lonlocal::texthash
1.229 raeburn 2093: ('st' => 'Version changes since start of '.$type,
1.88 www 2094: 'lm' => 'Version changes since last Month',
2095: 'lw' => 'Version changes since last Week',
2096: 'sy' => 'Version changes since Yesterday',
1.91 www 2097: 'al' => 'All Resources (possibly large output)',
1.88 www 2098: 'sd' => 'Display',
1.84 www 2099: 'fi' => 'File',
2100: 'md' => 'Modification Date',
1.87 www 2101: 'mr' => 'Most recently published Version',
1.229 raeburn 2102: 've' => 'Version used in '.$type,
2103: 'vu' => 'Set Version to be used in '.$type,
2104: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91 www 2105: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
2106: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84 www 2107: 'di' => 'Differences');
1.89 www 2108: $r->print(<<ENDHEADERS);
1.31 www 2109: <form action="/adm/coursedocs" method="post">
1.91 www 2110: <input type="hidden" name="versions" value="1" />
2111: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
2112: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31 www 2113: <select name="timerange">
1.88 www 2114: <option value='all' $allsel>$lt{'al'}</option>
1.84 www 2115: <option value="-1" $startsel>$lt{'st'}</option>
2116: <option value="2592000" $monthsel>$lt{'lm'}</option>
2117: <option value="604800" $weeksel>$lt{'lw'}</option>
2118: <option value="86400" $daysel>$lt{'sy'}</option>
1.31 www 2119: </select>
1.91 www 2120: <input type="submit" name="display" value="$lt{'sd'}" />
1.89 www 2121: <h3>$header</h3>
1.91 www 2122: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103 matthew 2123: <table border="0">
1.31 www 2124: ENDHEADERS
1.91 www 2125: foreach (sort keys %changes) {
1.89 www 2126: if ($changes{$_}>$starttime) {
2127: my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
2128: my $currentversion=&Apache::lonnet::getversion($_);
1.93 www 2129: if ($currentversion<0) {
2130: $currentversion=&mt('Could not be determined.');
2131: }
1.89 www 2132: my $linkurl=&Apache::lonnet::clutter($_);
2133: $r->print(
1.103 matthew 2134: '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91 www 2135: &Apache::lonnet::gettitle($linkurl).
1.103 matthew 2136: '</b></font></td></tr>'.
2137: '<tr><td> </td>'.
2138: '<td colspan="4">'.
2139: '<a href="'.$linkurl.'" target="cat">'.$linkurl.
2140: '</a></td></tr>'.
2141: '<tr><td></td>'.
2142: '<td title="'.$lt{'md'}.'">'.
1.102 matthew 2143: &Apache::lonlocal::locallocaltime(
2144: &Apache::lonnet::metadata($root.'.'.$extension,
2145: 'lastrevisiondate')
2146: ).
1.103 matthew 2147: '</td>'.
2148: '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '.
2149: '<font size="+1">'.$currentversion.'</font>'.
2150: '</nobr></td>'.
1.229 raeburn 2151: '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '.
1.103 matthew 2152: '<font size="+1">');
1.87 www 2153: # Used in course
1.89 www 2154: my $usedversion=$hash{'version_'.$linkurl};
1.93 www 2155: if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89 www 2156: $r->print($usedversion);
2157: } else {
2158: $r->print($currentversion);
2159: }
1.103 matthew 2160: $r->print('</font></nobr></td><td title="'.$lt{'vu'}.'">'.
2161: '<nobr>Use: ');
1.87 www 2162: # Set version
1.92 www 2163: $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89 www 2164: 'set_version_'.$linkurl,
1.136 albertel 2165: ('select_form_order' =>
2166: ['',1..$currentversion,'mostrecent'],
2167: '' => '',
1.93 www 2168: 'mostrecent' => 'most recent',
1.89 www 2169: map {$_,$_} (1..$currentversion))));
1.103 matthew 2170: $r->print('</nobr></td></tr><tr><td></td>');
1.89 www 2171: my $lastold=1;
2172: for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
2173: my $url=$root.'.'.$prevvers.'.'.$extension;
2174: if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
2175: $starttime) {
2176: $lastold=$prevvers;
2177: }
2178: }
1.103 matthew 2179: #
2180: # Code to figure out how many version entries should go in
2181: # each of the four columns
2182: my $entries_per_col = 0;
2183: my $num_entries = ($currentversion-$lastold);
2184: if ($num_entries % 4 == 0) {
2185: $entries_per_col = $num_entries/4;
2186: } else {
2187: $entries_per_col = $num_entries/4 + 1;
2188: }
2189: my $entries_count = 0;
2190: $r->print('<td valign="top"><font size="-2">');
2191: my $cols_output = 1;
1.32 www 2192: for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89 www 2193: my $url=$root.'.'.$prevvers.'.'.$extension;
1.103 matthew 2194: $r->print('<nobr><a href="'.&Apache::lonnet::clutter($url).
1.91 www 2195: '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103 matthew 2196: &Apache::lonlocal::locallocaltime(
2197: &Apache::lonnet::metadata($url,
2198: 'lastrevisiondate')
2199: ).
1.91 www 2200: ')');
1.89 www 2201: if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33 www 2202: $r->print(' <a href="/adm/diff?filename='.
1.89 www 2203: &Apache::lonnet::clutter($root.'.'.$extension).
2204: '&versionone='.$prevvers.
2205: '">'.&mt('Diffs').'</a>');
2206: }
1.103 matthew 2207: $r->print('</nobr><br />');
2208: if (++$entries_count % $entries_per_col == 0) {
2209: $r->print('</font></td>');
2210: if ($cols_output != 4) {
2211: $r->print('<td valign="top"><font size="-2">');
2212: $cols_output++;
2213: }
2214: }
1.89 www 2215: }
1.103 matthew 2216: while($cols_output++ < 4) {
2217: $r->print('</font></td><td><font>')
2218: }
2219: $r->print('</font></td></tr>'."\n");
1.89 www 2220: }
2221: }
1.92 www 2222: $r->print('</table></form>');
1.89 www 2223: $r->print('<h1>'.&mt('Done').'.</h1>');
2224:
2225: &untiehash();
1.75 www 2226: }
2227:
1.136 albertel 2228: sub mark_hash_old {
2229: my $retie_hash=0;
2230: if ($hashtied) {
2231: $retie_hash=1;
2232: &untiehash();
2233: }
2234: &tiehash('write');
2235: $hash{'old'}=1;
2236: &untiehash();
2237: if ($retie_hash) { &tiehash(); }
2238: }
2239:
2240: sub is_hash_old {
2241: my $untie_hash=0;
2242: if (!$hashtied) {
2243: $untie_hash=1;
2244: &tiehash();
2245: }
2246: my $return=$hash{'old'};
2247: if ($untie_hash) { &untiehash(); }
2248: return $return;
2249: }
2250:
1.91 www 2251: sub changewarning {
1.177 albertel 2252: my ($r,$postexec,$message,$url)=@_;
1.136 albertel 2253: if (!&is_hash_old()) { return; }
1.150 albertel 2254: my $pathvar='folderpath';
1.228 www 2255: my $path=&escape($env{'form.folderpath'});
1.177 albertel 2256: if (!defined($url)) {
2257: if (defined($env{'form.pagepath'})) {
2258: $pathvar='pagepath';
1.228 www 2259: $path=&escape($env{'form.pagepath'});
2260: $path.='&pagesymb='.&escape($env{'form.pagesymb'});
1.177 albertel 2261: }
2262: $url='/adm/coursedocs?'.$pathvar.'='.$path;
2263: }
1.230 albertel 2264: my $course_type = &Apache::loncommon::course_type();
1.177 albertel 2265: if (!defined($message)) {
2266: $message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150 albertel 2267: }
1.185 www 2268: $r->print("\n\n".
2269: '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n".
2270: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177 albertel 2271: '<input type="hidden" name="orgurl" value="'.$url.
1.117 albertel 2272: '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
1.177 albertel 2273: &mt($message,' <input type="hidden" name="'.
2274: $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230 albertel 2275: &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.185 www 2276: $help{'Caching'}.'</font></h3></form>'."\n\n");
1.91 www 2277: }
2278:
1.75 www 2279: # ================================================================ Main Handler
2280: sub handler {
2281: my $r = shift;
1.82 www 2282: &Apache::loncommon::content_type($r,'text/html');
1.75 www 2283: $r->send_http_header;
2284: return OK if $r->header_only;
1.230 albertel 2285: my $type = &Apache::loncommon::course_type();
1.75 www 2286:
2287: # --------------------------------------------- Initialize help topics for this
1.209 albertel 2288: foreach ('Adding_Course_Doc','Main_Course_Documents',
2289: 'Adding_External_Resource','Navigate_Content',
2290: 'Adding_Folders','Docs_Overview', 'Load_Map',
2291: 'Supplemental','Score_Upload_Form','Adding_Pages',
2292: 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
2293: 'Check_Resource_Versions','Verify_Content') {
2294: $help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
2295: }
1.75 www 2296: # Composite help files
2297: $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
2298: 'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
2299: $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
2300: 'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86 albertel 2301: $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
2302: 'Option_Response_Simple');
1.75 www 2303: $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
2304: 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
2305: $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
2306: 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
2307: $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142 raeburn 2308:
1.209 albertel 2309: # does this user have privileges to modify docs
2310: my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
2311:
2312: if ($allowed && $env{'form.verify'}) {
1.75 www 2313: &verifycontent($r);
1.209 albertel 2314: } elsif ($allowed && $env{'form.listsymbs'}) {
1.208 albertel 2315: &list_symbs($r);
1.247 www 2316: } elsif ($allowed && $env{'form.docslog'}) {
2317: &docs_change_log($r);
1.209 albertel 2318: } elsif ($allowed && $env{'form.versions'}) {
1.75 www 2319: &checkversions($r);
1.209 albertel 2320: } elsif ($allowed && $env{'form.dumpcourse'}) {
1.75 www 2321: &dumpcourse($r);
1.209 albertel 2322: } elsif ($allowed && $env{'form.exportcourse'}) {
1.138 raeburn 2323: &exportcourse($r);
1.26 www 2324: } else {
1.7 www 2325: # is this a standard course?
2326:
1.174 albertel 2327: my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155 raeburn 2328: my $forcestandard = 0;
1.15 www 2329: my $forcesupplement;
2330: my $script='';
1.19 www 2331: my $showdoc=0;
1.142 raeburn 2332: my $containertag;
2333: my $uploadtag;
1.15 www 2334: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224 albertel 2335: ['folderpath','pagepath',
2336: 'pagesymb','markedcopy_url',
2337: 'markedcopy_title']);
1.174 albertel 2338: if ($env{'form.folderpath'}) {
2339: my (@folderpath)=split('&',$env{'form.folderpath'});
1.228 www 2340: $env{'form.foldername'}=&unescape(pop(@folderpath));
1.174 albertel 2341: $env{'form.folder'}=pop(@folderpath);
2342: }
2343: if ($env{'form.pagepath'}) {
2344: my (@pagepath)=split('&',$env{'form.pagepath'});
1.228 www 2345: $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174 albertel 2346: $env{'form.folder'}=pop(@pagepath);
1.156 albertel 2347: $containertag = '<input type="hidden" name="pagepath" value="" />'.
2348: '<input type="hidden" name="pagesymb" value="" />';
1.174 albertel 2349: $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
2350: '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142 raeburn 2351: }
1.21 www 2352: if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127 albertel 2353: $showdoc='/'.$1;
1.21 www 2354: }
2355: unless ($showdoc) { # got called from remote
1.237 albertel 2356: if (($env{'form.folder'}=~/^(?:group|default)_/) ||
1.209 albertel 2357: ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155 raeburn 2358: $forcestandard = 1;
2359: }
1.174 albertel 2360: $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7 www 2361:
1.15 www 2362: if ($allowed) {
2363: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
2364: $script=&Apache::lonratedt::editscript('simple');
2365: }
2366: } else { # got called in sequence from course
2367: $allowed=0;
1.3 www 2368: }
1.4 www 2369:
2370: # get course data
1.174 albertel 2371: my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
2372: my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4 www 2373:
1.225 albertel 2374: # get personal data
1.174 albertel 2375: my $uname=$env{'user.name'};
2376: my $udom=$env{'user.domain'};
1.245 albertel 2377: my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14 www 2378:
1.8 www 2379: # graphics settings
1.4 www 2380:
1.176 albertel 2381: $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8 www 2382:
1.224 albertel 2383: if ($allowed) {
2384: $script .= &editing_js($udom,$uname);
1.171 www 2385: }
1.42 www 2386: # -------------------------------------------------------------------- Body tag
1.224 albertel 2387: $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229 raeburn 2388: $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225 albertel 2389: {'force_register' => $showdoc,}).
1.233 albertel 2390: &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224 albertel 2391:
1.188 raeburn 2392: my %allfiles = ();
2393: my %codebase = ();
2394: my ($upload_result,$upload_output);
2395: if ($allowed) {
2396: if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) {
2397: # Process file upload - phase one - upload and parse primary file.
1.190 albertel 2398: $upload_result = &process_file_upload(\$upload_output,$coursenum,
2399: $coursedom,\%allfiles,
1.194 raeburn 2400: \%codebase,$1);
1.188 raeburn 2401: if ($upload_result eq 'phasetwo') {
2402: $r->print($upload_output);
2403: }
2404: } elsif ($env{'form.phasetwo'}) {
2405: my %newname = ();
2406: my %origname = ();
2407: my %attribs = ();
2408: my $updateflag = 0;
2409: my $residx = $env{'form.newidx'};
1.228 www 2410: my $primary_url = &unescape($env{'form.primaryurl'});
1.188 raeburn 2411: # Process file upload - phase two - gather secondary files.
2412: for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
2413: if ($env{'form.embedded_item_'.$i.'.filename'}) {
2414: my $javacodebase;
2415: $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228 www 2416: $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188 raeburn 2417: if (exists($env{'form.embedded_codebase_'.$i})) {
1.228 www 2418: $javacodebase = &unescape($env{'form.embedded_codebase_'.$i});
1.188 raeburn 2419: $origname{$i} =~ s#^\Q$javacodebase\E/##;
2420: }
2421: my @attributes = ();
2422: if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
2423: @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
2424: } else {
2425: @attributes = ($env{'form.embedded_attrib_'.$i});
2426: }
2427: foreach (@attributes) {
1.228 www 2428: push(@{$attribs{$i}},&unescape($_));
1.188 raeburn 2429: }
2430: if ($javacodebase) {
2431: $codebase{$i} = $javacodebase;
2432: $codebase{$i} =~ s#/$##;
2433: $updateflag = 1;
2434: }
2435: }
2436: unless ($newname{$i} eq $origname{$i}) {
2437: $updateflag = 1;
2438: }
2439: }
2440: # Process file upload - phase three - modify primary file
2441: if ($updateflag) {
2442: my ($content,$rtncode);
2443: my $updateflag = 0;
2444: my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
2445: if ($getstatus eq 'ok') {
2446: foreach my $item (keys %newname) {
2447: if ($newname{$item} ne $origname{$item}) {
2448: my $attrib_regexp = '';
2449: if (@{$attribs{$item}} > 1) {
2450: $attrib_regexp = join('|',@{$attribs{$item}});
2451: } else {
2452: $attrib_regexp = $attribs{$item}[0];
2453: }
2454: if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
2455: }
2456: $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi;
2457: }
2458: if (exists($codebase{$item})) {
1.224 albertel 2459: $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188 raeburn 2460: }
2461: }
2462: # Save edited file.
2463: my $saveresult;
2464: my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
2465: my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191 raeburn 2466: my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188 raeburn 2467: } else {
2468: &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus);
2469: }
2470: }
2471: }
2472: }
2473:
2474: unless ($showdoc || $upload_result eq 'phasetwo') {
1.81 www 2475: # -----------------------------------------------------------------------------
2476: my %lt=&Apache::lonlocal::texthash(
1.229 raeburn 2477: 'uplm' => 'Upload a new main '.lc($type).' document',
2478: 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168 www 2479: 'impp' => 'Import a document',
2480: 'pubd' => 'Published documents',
1.181 www 2481: 'copm' => 'All documents out of a published map into this folder',
1.81 www 2482: 'spec' => 'Special documents',
2483: 'upld' => 'Upload Document',
2484: 'srch' => 'Search',
2485: 'impo' => 'Import',
1.232 www 2486: 'book' => 'Import Bookmarks',
1.81 www 2487: 'selm' => 'Select Map',
2488: 'load' => 'Load Map',
1.186 www 2489: 'reco' => 'Recover Deleted Resources',
1.81 www 2490: 'newf' => 'New Folder',
1.142 raeburn 2491: 'newp' => 'New Composite Page',
1.81 www 2492: 'extr' => 'External Resource',
2493: 'syll' => 'Syllabus',
2494: 'navc' => 'Navigate Contents',
2495: 'sipa' => 'Simple Page',
2496: 'sipr' => 'Simple Problem',
1.219 www 2497: 'drbx' => 'Drop Box',
1.81 www 2498: 'scuf' => 'Score Upload Form',
2499: 'bull' => 'Bulletin Board',
1.96 sakharuk 2500: 'mypi' => 'My Personal Info',
1.101 www 2501: 'abou' => 'About User',
1.110 raeburn 2502: 'imsf' => 'Import IMS package',
1.96 sakharuk 2503: 'file' => 'File',
2504: 'title' => 'Title',
1.188 raeburn 2505: 'comment' => 'Comment',
2506: 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81 www 2507: );
2508: # -----------------------------------------------------------------------------
1.42 www 2509: if ($allowed) {
1.74 www 2510: my $dumpbut=&dumpbutton();
1.138 raeburn 2511: my $exportbut=&exportbutton();
1.88 www 2512: my %lt=&Apache::lonlocal::texthash(
2513: 'vc' => 'Verify Content',
2514: 'cv' => 'Check/Set Resource Versions',
1.208 albertel 2515: 'ls' => 'List Symbs',
1.247 www 2516: 'sl' => 'Show Log'
1.88 www 2517: );
1.118 albertel 2518:
1.174 albertel 2519: my $folderpath=$env{'form.folderpath'};
1.118 albertel 2520: if (!$folderpath) {
1.174 albertel 2521: if ($env{'form.folder'} eq '' ||
2522: $env{'form.folder'} eq 'supplemental') {
1.118 albertel 2523: $folderpath='default&'.
1.230 albertel 2524: &escape(&mt('Main '.$type.' Documents'));
1.118 albertel 2525: }
2526: }
1.174 albertel 2527: unless ($env{'form.pagepath'}) {
1.142 raeburn 2528: $containertag = '<input type="hidden" name="folderpath" value="" />';
2529: $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
2530: }
2531:
1.42 www 2532: $r->print(<<ENDCOURSEVERIFY);
1.36 www 2533: <form name="renameform" method="post" action="/adm/coursedocs">
2534: <input type="hidden" name="title" />
2535: <input type="hidden" name="cmd" />
1.168 www 2536: <input type="hidden" name="markcopy" />
1.142 raeburn 2537: $containertag
1.36 www 2538: </form>
1.39 www 2539: <form name="simpleedit" method="post" action="/adm/coursedocs">
2540: <input type=hidden name="importdetail" value="">
1.142 raeburn 2541: $uploadtag
1.39 www 2542: </form>
1.26 www 2543: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74 www 2544: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
2545: <tr><td bgcolor="#DDDDCC">
1.130 www 2546: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74 www 2547: </td><td bgcolor="#DDDDCC">
1.130 www 2548: <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74 www 2549: $dumpbut
1.138 raeburn 2550: $exportbut
1.218 albertel 2551: </td><td bgcolor="#DDDDCC">
1.208 albertel 2552: <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.247 www 2553: </td><td bgcolor="#DDDDCC">
2554: <input type="submit" name="docslog" value="$lt{'sl'}" />
1.218 albertel 2555: </td></tr></table>
1.25 www 2556: </form>
2557: ENDCOURSEVERIFY
1.74 www 2558: $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230 albertel 2559: &mt('Editing the Table of Contents for your '.$type)));
1.25 www 2560: }
1.17 www 2561: # --------------------------------------------------------- Standard documents
1.43 www 2562: $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7 www 2563: if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116 albertel 2564: $r->print('<tr><td bgcolor="#BBBBBB">');
2565: # '<h2>'.&mt('Main Course Documents').
2566: # ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174 albertel 2567: my $folder=$env{'form.folder'};
1.117 albertel 2568: if ($folder eq '' || $folder eq 'supplemental') {
1.112 raeburn 2569: $folder='default';
1.230 albertel 2570: $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112 raeburn 2571: }
1.51 www 2572: my $postexec='';
2573: if ($folder eq 'default') {
2574: $r->print('<script>this.window.name="loncapaclient";</script>');
2575: } else {
1.117 albertel 2576: #$postexec='self.close();';
1.51 www 2577: }
1.40 www 2578: $hadchanges=0;
1.188 raeburn 2579: &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40 www 2580: if ($hadchanges) {
1.136 albertel 2581: &mark_hash_old()
1.40 www 2582: }
1.136 albertel 2583: &changewarning($r,$postexec);
1.16 www 2584: my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2585: '.sequence';
1.142 raeburn 2586: my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
2587: '.page';
1.186 www 2588: my $container='sequence';
2589: if ($env{'form.pagepath'}) {
2590: $container='page';
2591: }
2592: my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8 www 2593: $r->print(<<ENDFORM);
1.43 www 2594: <table cellspacing=4 cellpadding=4><tr>
1.81 www 2595: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
2596: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
2597: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11 www 2598: </tr>
1.16 www 2599: <tr><td bgcolor="#DDDDDD">
1.96 sakharuk 2600: $lt{'file'}:<br />
1.182 albertel 2601: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59 www 2602: <input type="file" name="uploaddoc" size="40">
1.8 www 2603: <br />
1.96 sakharuk 2604: $lt{'title'}:<br />
1.11 www 2605: <input type="text" size="50" name="comment">
1.142 raeburn 2606: $uploadtag
1.10 www 2607: <input type="hidden" name="cmd" value="upload_default">
1.188 raeburn 2608: <br />
2609: <nobr>
1.190 albertel 2610: <label>$lt{'parse'}?
1.188 raeburn 2611: <input type="checkbox" name="parserflag" />
1.190 albertel 2612: </label>
1.188 raeburn 2613: </nobr>
2614: <br />
2615: <br />
1.129 albertel 2616: <nobr>
1.81 www 2617: <input type="submit" value="$lt{'upld'}">
1.60 albertel 2618: $help{'Uploading_From_Harddrive'}
1.58 albertel 2619: </nobr>
1.60 albertel 2620: </form>
1.11 www 2621: </td>
1.16 www 2622: <td bgcolor="#DDDDDD">
1.39 www 2623: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168 www 2624: $lt{'pubd'}<br />
1.142 raeburn 2625: $uploadtag
1.232 www 2626: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
2627: <br />
1.58 albertel 2628: <nobr>
1.232 www 2629: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58 albertel 2630: $help{'Importing_LON-CAPA_Resource'}
2631: </nobr>
1.232 www 2632: <br />
2633: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59 www 2634: <p>
2635: <hr />
1.181 www 2636: $lt{'copm'}<br />
2637: <input type="text" size="40" name="importmap"><br />
1.68 bowersj2 2638: <nobr><input type=button
1.52 www 2639: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81 www 2640: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68 bowersj2 2641: $help{'Load_Map'}</nobr>
1.59 www 2642: </p>
1.52 www 2643: </form>
1.186 www 2644: <hr />
2645: <form action="/adm/groupsort" method="post" name="recover">
1.232 www 2646: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186 www 2647: </form>
1.142 raeburn 2648: ENDFORM
1.174 albertel 2649: unless ($env{'form.pagepath'}) {
1.168 www 2650: $r->print(<<ENDFORM);
2651: <hr />
2652: <form action="/adm/coursedocs" method="post" name="newext">
2653: $uploadtag
2654: <input type=hidden name="importdetail" value="">
2655: <nobr>
2656: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
2657: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
2658: </nobr>
2659: </form>
1.214 www 2660: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168 www 2661: <input type="hidden" name="folder" value="$folder" />
2662: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
2663: </nobr>
2664: </form>
2665: ENDFORM
2666: }
2667: $r->print('</td><td bgcolor="#DDDDDD">');
1.174 albertel 2668: unless ($env{'form.pagepath'}) {
1.142 raeburn 2669: $r->print(<<ENDFORM);
1.214 www 2670: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174 albertel 2671: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.13 www 2672: <input type=hidden name="importdetail" value="">
1.58 albertel 2673: <nobr>
1.16 www 2674: <input name="newfolder" type="button"
2675: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 2676: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58 albertel 2677: </nobr>
1.11 www 2678: </form>
1.214 www 2679: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174 albertel 2680: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.142 raeburn 2681: <input type=hidden name="importdetail" value="">
2682: <nobr>
2683: <input name="newpage" type="button"
2684: onClick="javascript:makenewpage(this.form,'$pageseq');"
2685: value="$lt{'newp'}" />$help{'Adding_Pages'}
2686: </nobr>
2687: </form>
1.214 www 2688: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142 raeburn 2689: $uploadtag
1.14 www 2690: <input type=hidden name="importdetail"
2691: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58 albertel 2692: <nobr>
1.81 www 2693: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 2694: $help{'Syllabus'}
1.58 albertel 2695: </nobr>
2696: </form>
1.214 www 2697: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142 raeburn 2698: $uploadtag
1.15 www 2699: <input type=hidden name="importdetail"
2700: value="Navigate Content=/adm/navmaps">
1.58 albertel 2701: <nobr>
1.81 www 2702: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47 www 2703: $help{'Navigate_Content'}
1.58 albertel 2704: </nobr>
1.22 www 2705: </form>
1.214 www 2706: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142 raeburn 2707: $uploadtag
1.22 www 2708: <input type=hidden name="importdetail" value="">
1.58 albertel 2709: <nobr>
1.81 www 2710: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65 bowersj2 2711: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58 albertel 2712: </nobr>
1.55 www 2713: </form>
1.214 www 2714: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142 raeburn 2715: $uploadtag
1.55 www 2716: <input type=hidden name="importdetail" value="">
1.58 albertel 2717: <nobr>
1.81 www 2718: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65 bowersj2 2719: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62 www 2720: </nobr>
2721: </form>
1.219 www 2722: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
2723: $uploadtag
2724: <input type=hidden name="importdetail" value="">
2725: <nobr>
2726: <input name="newdropbox" type="button" value="$lt{'drbx'}"
2727: onClick="javascript:makedropbox();" />
2728: </nobr>
2729: </form>
1.214 www 2730: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 2731: $uploadtag
1.62 www 2732: <input type=hidden name="importdetail" value="">
2733: <nobr>
1.81 www 2734: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62 www 2735: onClick="javascript:makeexamupload();" />
1.66 bowersj2 2736: $help{'Score_Upload_Form'}
1.58 albertel 2737: </nobr>
1.22 www 2738: </form>
1.214 www 2739: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142 raeburn 2740: $uploadtag
1.22 www 2741: <input type=hidden name="importdetail" value="">
1.58 albertel 2742: <nobr>
1.81 www 2743: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22 www 2744: onClick="javascript:makebulboard();" />
1.65 bowersj2 2745: $help{'Bulletin Board'}
1.58 albertel 2746: </nobr>
2747: </form>
1.214 www 2748: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142 raeburn 2749: $uploadtag
1.14 www 2750: <input type=hidden name="importdetail"
2751: value="$plainname=/adm/$udom/$uname/aboutme">
1.58 albertel 2752: <nobr>
1.81 www 2753: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 2754: $help{'My Personal Info'}
1.101 www 2755: </nobr>
2756: </form>
1.214 www 2757: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142 raeburn 2758: $uploadtag
1.101 www 2759: <input type=hidden name="importdetail" value="">
2760: <nobr>
2761: <input name="newaboutsomeone" type="button" value="$lt{'abou'}"
2762: onClick="javascript:makeabout();" />
1.110 raeburn 2763: </nobr>
1.182 albertel 2764: </form>
1.142 raeburn 2765: ENDFORM
2766: }
1.174 albertel 2767: if ($env{'form.pagepath'}) {
1.142 raeburn 2768: $r->print(<<ENDBLOCK);
2769: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
2770: $uploadtag
2771: <input type=hidden name="importdetail" value="">
2772: <nobr>
2773: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
2774: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
2775: </nobr>
2776: </form>
1.214 www 2777: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142 raeburn 2778: $uploadtag
2779: <input type=hidden name="importdetail" value="">
2780: <nobr>
2781: <input name="newexamupload" type="button" value="$lt{'scuf'}"
2782: onClick="javascript:makeexamupload();" />
2783: $help{'Score_Upload_Form'}
2784: </nobr>
1.182 albertel 2785: </form>
1.142 raeburn 2786: ENDBLOCK
2787: }
2788: $r->print('</td></tr>'."\n".
2789: '</table>');
1.24 www 2790: $r->print('</td></tr>');
1.7 www 2791: }
2792: # ----------------------------------------------------- Supplemental documents
2793: if (!$forcestandard) {
1.116 albertel 2794: $r->print('<tr><td bgcolor="#BBBBBB">');
2795: # '<h2>'.&mt('Supplemental Course Documents').
2796: # ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174 albertel 2797: my $folder=$env{'form.folder'};
1.117 albertel 2798: unless ($folder=~/^supplemental/) {
1.116 albertel 2799: $folder='supplemental';
1.117 albertel 2800: }
2801: if ($folder =~ /^supplemental$/ &&
1.174 albertel 2802: $env{'form.folderpath'} =~ /^default\&/) {
2803: $env{'form.folderpath'}='supplemental&'.
1.230 albertel 2804: &escape(&mt('Supplemental '.$type.' Documents'));
1.116 albertel 2805: }
1.7 www 2806: &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8 www 2807: if ($allowed) {
1.17 www 2808: my $folderseq=
2809: '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
2810: '.sequence';
2811:
1.8 www 2812: $r->print(<<ENDSUPFORM);
1.43 www 2813: <table cellspacing=4 cellpadding=4><tr>
1.81 www 2814: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
2815: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17 www 2816: </tr>
2817: <tr><td bgcolor="#DDDDDD">
1.10 www 2818: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59 www 2819: <input type="file" name="uploaddoc" size="40">
1.196 raeburn 2820: <br />
2821: <br />
2822: <nobr>
2823: <label>$lt{'parse'}?
2824: <input type="checkbox" name="parserflag" />
2825: </label>
2826: </nobr>
2827: <br /><br />
2828: $lt{'comment'}:<br />
1.4 www 2829: <textarea cols=50 rows=4 name='comment'>
2830: </textarea>
1.115 albertel 2831: <br />
1.174 albertel 2832: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10 www 2833: <input type="hidden" name="cmd" value="upload_supplemental">
1.58 albertel 2834: <nobr>
1.81 www 2835: <input type="submit" value="$lt{'upld'}">
1.58 albertel 2836: $help{'Uploading_From_Harddrive'}
2837: </nobr>
2838: </form>
1.17 www 2839: </td>
2840: <td bgcolor="#DDDDDD">
1.18 www 2841: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174 albertel 2842: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2843: <input type=hidden name="importdetail" value="">
1.58 albertel 2844: <nobr>
1.17 www 2845: <input name="newfolder" type="button"
2846: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81 www 2847: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58 albertel 2848: </nobr>
1.17 www 2849: </form>
1.214 www 2850: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174 albertel 2851: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2852: <input type=hidden name="importdetail" value="">
1.58 albertel 2853: <nobr>
1.18 www 2854: <input name="newext" type="button"
2855: onClick="javascript:makenewext('supnewext');"
1.81 www 2856: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58 albertel 2857: </nobr>
1.17 www 2858: </form>
1.214 www 2859: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174 albertel 2860: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2861: <input type=hidden name="importdetail"
2862: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58 albertel 2863: <nobr>
1.81 www 2864: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65 bowersj2 2865: $help{'Syllabus'}
1.58 albertel 2866: </nobr>
2867: </form>
1.214 www 2868: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174 albertel 2869: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17 www 2870: <input type=hidden name="importdetail"
2871: value="$plainname=/adm/$udom/$uname/aboutme">
1.58 albertel 2872: <nobr>
1.81 www 2873: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65 bowersj2 2874: $help{'My Personal Info'}
1.58 albertel 2875: </nobr>
2876: </form>
1.17 www 2877: </td></tr>
1.24 www 2878: </table></td></tr>
1.8 www 2879: ENDSUPFORM
2880: }
1.7 www 2881: }
1.18 www 2882: if ($allowed) {
1.182 albertel 2883: $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 2884: }
1.24 www 2885: $r->print('</table>');
1.19 www 2886: } else {
1.188 raeburn 2887: unless ($upload_result eq 'phasetwo') {
1.19 www 2888: # -------------------------------------------------------- This is showdoc mode
1.188 raeburn 2889: $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141 albertel 2890: &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81 www 2891: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188 raeburn 2892: &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
2893: }
1.19 www 2894: }
1.26 www 2895: }
1.224 albertel 2896: $r->print(&Apache::loncommon::end_page());
1.26 www 2897: return OK;
1.1 www 2898: }
2899:
1.224 albertel 2900:
2901: sub editing_js {
2902: my ($udom,$uname) = @_;
2903: my $now = time();
2904:
2905: return <<ENDNEWSCRIPT;
2906: function makenewfolder(targetform,folderseq) {
2907: var foldername=prompt('Name of New Folder','New Folder');
2908: if (foldername) {
1.236 albertel 2909: targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224 albertel 2910: targetform.submit();
2911: }
2912: }
2913:
2914: function makenewpage(targetform,folderseq) {
2915: var pagename=prompt('Name of New Page','New Page');
2916: if (pagename) {
1.236 albertel 2917: targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224 albertel 2918: targetform.submit();
2919: }
2920: }
2921:
2922: function makenewext(targetname) {
2923: this.document.forms.extimport.useform.value=targetname;
2924: window.open('/adm/rat/extpickframe.html');
2925: }
2926:
2927: function makeexamupload() {
2928: var title=prompt('Listed Title for the Uploaded Score');
2929: if (title) {
2930: this.document.forms.newexamupload.importdetail.value=
1.236 albertel 2931: escape(title)+'=/res/lib/templates/examupload.problem';
1.224 albertel 2932: this.document.forms.newexamupload.submit();
2933: }
2934: }
2935:
2936: function makesmppage() {
2937: var title=prompt('Listed Title for the Page');
2938: if (title) {
2939: this.document.forms.newsmppg.importdetail.value=
1.236 albertel 2940: escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224 albertel 2941: this.document.forms.newsmppg.submit();
2942: }
2943: }
2944:
2945: function makesmpproblem() {
2946: var title=prompt('Listed Title for the Problem');
2947: if (title) {
2948: this.document.forms.newsmpproblem.importdetail.value=
1.236 albertel 2949: escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224 albertel 2950: this.document.forms.newsmpproblem.submit();
2951: }
2952: }
2953:
2954: function makedropbox() {
2955: var title=prompt('Listed Title for the Drop Box');
2956: if (title) {
2957: this.document.forms.newdropbox.importdetail.value=
1.236 albertel 2958: escape(title)+'=/res/lib/templates/DropBox.problem';
1.224 albertel 2959: this.document.forms.newdropbox.submit();
2960: }
2961: }
2962:
2963: function makebulboard() {
2964: var title=prompt('Listed Title for the Bulletin Board');
2965: if (title) {
2966: this.document.forms.newbul.importdetail.value=
1.236 albertel 2967: escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224 albertel 2968: this.document.forms.newbul.submit();
2969: }
2970: }
2971:
2972: function makeabout() {
1.236 albertel 2973: var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224 albertel 2974: if (user) {
2975: var comp=new Array();
1.236 albertel 2976: comp=user.split(':');
1.224 albertel 2977: if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
2978: if ((comp[0]) && (comp[1])) {
2979: this.document.forms.newaboutsomeone.importdetail.value=
1.236 albertel 2980: 'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224 albertel 2981: this.document.forms.newaboutsomeone.submit();
2982: } else {
1.236 albertel 2983: alert("Not a valid user:domain");
1.224 albertel 2984: }
2985: } else {
1.236 albertel 2986: alert("Please enter both user and domain in the format user:domain");
1.224 albertel 2987: }
2988: }
2989: }
2990:
2991: function makeims() {
2992: var caller = document.forms.ims.folder.value;
2993: var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
2994: newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
2995: newWindow.location.href = newlocation;
2996: }
2997:
2998:
2999: function finishpick() {
3000: var title=this.document.forms.extimport.title.value;
3001: var url=this.document.forms.extimport.url.value;
3002: var form=this.document.forms.extimport.useform.value;
3003: eval
3004: ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
3005: '";this.document.forms.'+form+'.submit();');
3006: }
3007:
3008: function changename(folderpath,index,oldtitle,container,pagesymb) {
3009: var title=prompt('New Title',oldtitle);
3010: if (title) {
3011: this.document.forms.renameform.title.value=title;
3012: this.document.forms.renameform.cmd.value='rename_'+index;
3013: if (container == 'sequence') {
3014: this.document.forms.renameform.folderpath.value=folderpath;
3015: }
3016: if (container == 'page') {
3017: this.document.forms.renameform.pagepath.value=folderpath;
3018: this.document.forms.renameform.pagesymb.value=pagesymb;
3019: }
3020: this.document.forms.renameform.submit();
3021: }
3022: }
3023:
3024: function removeres(folderpath,index,oldtitle,container,pagesymb) {
3025: if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
3026: this.document.forms.renameform.cmd.value='del_'+index;
3027: if (container == 'sequence') {
3028: this.document.forms.renameform.folderpath.value=folderpath;
3029: }
3030: if (container == 'page') {
3031: this.document.forms.renameform.pagepath.value=folderpath;
3032: this.document.forms.renameform.pagesymb.value=pagesymb;
3033: }
3034: this.document.forms.renameform.submit();
3035: }
3036: }
3037:
3038: function cutres(folderpath,index,oldtitle,container,pagesymb) {
3039: if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
3040: this.document.forms.renameform.cmd.value='cut_'+index;
3041: this.document.forms.renameform.markcopy.value=index;
3042: if (container == 'sequence') {
3043: this.document.forms.renameform.folderpath.value=folderpath;
3044: }
3045: if (container == 'page') {
3046: this.document.forms.renameform.pagepath.value=folderpath;
3047: this.document.forms.renameform.pagesymb.value=pagesymb;
3048: }
3049: this.document.forms.renameform.submit();
3050: }
3051: }
3052:
3053: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
3054: this.document.forms.renameform.markcopy.value=index;
3055: if (container == 'sequence') {
3056: this.document.forms.renameform.folderpath.value=folderpath;
3057: }
3058: if (container == 'page') {
3059: this.document.forms.renameform.pagepath.value=folderpath;
3060: this.document.forms.renameform.pagesymb.value=pagesymb;
3061: }
3062: this.document.forms.renameform.submit();
3063: }
3064:
3065: ENDNEWSCRIPT
3066: }
1.1 www 3067: 1;
3068: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>