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