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