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