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