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