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