Annotation of loncom/interface/lonparmset.pm, revision 1.196
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to set parameters for assessments
3: #
1.196 ! www 4: # $Id: lonparmset.pm,v 1.195 2005/05/30 17:58:51 albertel Exp $
1.40 albertel 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
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.
14: #
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: #
1.59 matthew 28: ###################################################################
29: ###################################################################
30:
31: =pod
32:
33: =head1 NAME
34:
35: lonparmset - Handler to set parameters for assessments and course
36:
37: =head1 SYNOPSIS
38:
39: lonparmset provides an interface to setting course parameters.
40:
41: =head1 DESCRIPTION
42:
43: This module sets coursewide and assessment parameters.
44:
45: =head1 INTERNAL SUBROUTINES
46:
47: =over 4
48:
49: =cut
50:
51: ###################################################################
52: ###################################################################
1.1 www 53:
54: package Apache::lonparmset;
55:
56: use strict;
57: use Apache::lonnet;
58: use Apache::Constants qw(:common :http REDIRECT);
1.88 matthew 59: use Apache::lonhtmlcommon();
1.36 albertel 60: use Apache::loncommon;
1.1 www 61: use GDBM_File;
1.57 albertel 62: use Apache::lonhomework;
63: use Apache::lonxml;
1.130 www 64: use Apache::lonlocal;
1.1 www 65:
1.2 www 66: my %courseopt;
67: my %useropt;
68: my %parmhash;
69:
1.3 www 70: my @ids;
71: my %symbp;
1.10 www 72: my %mapp;
1.3 www 73: my %typep;
1.16 www 74: my %keyp;
1.196 ! www 75: my %uris;
1.82 www 76: my %maptitles;
77:
1.59 matthew 78: ##################################################
79: ##################################################
80:
81: =pod
82:
83: =item parmval
84:
85: Figure out a cascading parameter.
86:
1.71 albertel 87: Inputs: $what - a parameter spec (incluse part info and name I.E. 0.weight)
1.162 albertel 88: $id - a bighash Id number
1.71 albertel 89: $def - the resource's default value 'stupid emacs
90:
91: Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 11 possible levels
92:
1.182 albertel 93: 11 - General Course
94: 10 - Map or Folder level in course
95: 9- resource default
96: 8- map default
1.71 albertel 97: 7 - resource level in course
98: 6 - General for section
1.82 www 99: 5 - Map or Folder level for section
1.71 albertel 100: 4 - resource level in section
101: 3 - General for specific student
1.82 www 102: 2 - Map or Folder level for specific student
1.71 albertel 103: 1 - resource level for specific student
1.2 www 104:
1.59 matthew 105: =cut
106:
107: ##################################################
108: ##################################################
1.2 www 109: sub parmval {
1.187 www 110: my ($what,$id,$def,$uname,$udom,$csec)=@_;
1.8 www 111: my $result='';
1.44 albertel 112: my @outpar=();
1.2 www 113: # ----------------------------------------------------- Cascading lookup scheme
1.10 www 114:
1.43 albertel 115: my $symbparm=$symbp{$id}.'.'.$what;
116: my $mapparm=$mapp{$id}.'___(all).'.$what;
1.10 www 117:
1.190 albertel 118: my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
119: my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
120: my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
121:
122: my $courselevel=$env{'request.course.id'}.'.'.$what;
123: my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
124: my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.2 www 125:
1.11 www 126:
127:
1.182 albertel 128: # --------------------------------------------------------- first, check course
1.11 www 129:
1.71 albertel 130: if (defined($courseopt{$courselevel})) {
1.182 albertel 131: $outpar[11]=$courseopt{$courselevel};
132: $result=11;
1.43 albertel 133: }
1.11 www 134:
1.71 albertel 135: if (defined($courseopt{$courselevelm})) {
1.182 albertel 136: $outpar[10]=$courseopt{$courselevelm};
137: $result=10;
1.43 albertel 138: }
1.11 www 139:
1.182 albertel 140: # ------------------------------------------------------- second, check default
141:
142: if (defined($def)) { $outpar[9]=$def; $result=9; }
143:
144: # ------------------------------------------------------ third, check map parms
145:
146: my $thisparm=$parmhash{$symbparm};
147: if (defined($thisparm)) { $outpar[8]=$thisparm; $result=8; }
148:
1.71 albertel 149: if (defined($courseopt{$courselevelr})) {
1.43 albertel 150: $outpar[7]=$courseopt{$courselevelr};
151: $result=7;
152: }
1.11 www 153:
1.182 albertel 154: # ------------------------------------------------------ fourth, back to course
1.71 albertel 155: if (defined($csec)) {
156: if (defined($courseopt{$seclevel})) {
1.43 albertel 157: $outpar[6]=$courseopt{$seclevel};
158: $result=6;
159: }
1.71 albertel 160: if (defined($courseopt{$seclevelm})) {
1.43 albertel 161: $outpar[5]=$courseopt{$seclevelm};
162: $result=5;
163: }
164:
1.71 albertel 165: if (defined($courseopt{$seclevelr})) {
1.43 albertel 166: $outpar[4]=$courseopt{$seclevelr};
167: $result=4;
168: }
169: }
1.11 www 170:
1.182 albertel 171: # ---------------------------------------------------------- fifth, check user
1.11 www 172:
1.71 albertel 173: if (defined($uname)) {
174: if (defined($useropt{$courselevel})) {
1.43 albertel 175: $outpar[3]=$useropt{$courselevel};
176: $result=3;
177: }
1.10 www 178:
1.71 albertel 179: if (defined($useropt{$courselevelm})) {
1.43 albertel 180: $outpar[2]=$useropt{$courselevelm};
181: $result=2;
182: }
1.2 www 183:
1.71 albertel 184: if (defined($useropt{$courselevelr})) {
1.43 albertel 185: $outpar[1]=$useropt{$courselevelr};
186: $result=1;
187: }
188: }
1.44 albertel 189: return ($result,@outpar);
1.2 www 190: }
191:
1.186 www 192:
193: ##################################################
194: ##################################################
195: #
196: # Store a parameter
197: #
198: # Takes
199: # - resource id
200: # - name of parameter
201: # - level
202: # - new value
203: # - new type
1.187 www 204: # - username
205: # - userdomain
206:
1.186 www 207: sub storeparm {
1.187 www 208: my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
1.186 www 209: $spnam=~s/\_([^\_]+)$/\.$1/;
210: # ---------------------------------------------------------- Construct prefixes
211:
212: my $symbparm=$symbp{$sresid}.'.'.$spnam;
213: my $mapparm=$mapp{$sresid}.'___(all).'.$spnam;
214:
1.190 albertel 215: my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
216: my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
217: my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
1.186 www 218:
1.190 albertel 219: my $courselevel=$env{'request.course.id'}.'.'.$spnam;
220: my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
221: my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
1.186 www 222:
223: my $storeunder='';
224: if (($snum==11) || ($snum==3)) { $storeunder=$courselevel; }
225: if (($snum==10) || ($snum==2)) { $storeunder=$courselevelm; }
226: if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
227: if ($snum==6) { $storeunder=$seclevel; }
228: if ($snum==5) { $storeunder=$seclevelm; }
229: if ($snum==4) { $storeunder=$seclevelr; }
230:
231: my $delete;
232: if ($nval eq '') { $delete=1;}
233: my %storecontent = ($storeunder => $nval,
234: $storeunder.'.type' => $ntype);
235: my $reply='';
236: if ($snum>3) {
237: # ---------------------------------------------------------------- Store Course
238: #
239: # Expire sheets
240: &Apache::lonnet::expirespread('','','studentcalc');
241: if (($snum==7) || ($snum==4)) {
242: &Apache::lonnet::expirespread('','','assesscalc',$symbp{$sresid});
243: } elsif (($snum==8) || ($snum==5)) {
244: &Apache::lonnet::expirespread('','','assesscalc',$mapp{$sresid});
245: } else {
246: &Apache::lonnet::expirespread('','','assesscalc');
247: }
248: # Store parameter
249: if ($delete) {
250: $reply=&Apache::lonnet::del
251: ('resourcedata',[keys(%storecontent)],
1.190 albertel 252: $env{'course.'.$env{'request.course.id'}.'.domain'},
253: $env{'course.'.$env{'request.course.id'}.'.num'});
1.186 www 254: } else {
255: $reply=&Apache::lonnet::cput
256: ('resourcedata',\%storecontent,
1.190 albertel 257: $env{'course.'.$env{'request.course.id'}.'.domain'},
258: $env{'course.'.$env{'request.course.id'}.'.num'});
1.186 www 259: }
260: } else {
261: # ------------------------------------------------------------------ Store User
262: #
263: # Expire sheets
264: &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
265: if ($snum==1) {
266: &Apache::lonnet::expirespread
267: ($uname,$udom,'assesscalc',$symbp{$sresid});
268: } elsif ($snum==2) {
269: &Apache::lonnet::expirespread
270: ($uname,$udom,'assesscalc',$mapp{$sresid});
271: } else {
272: &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
273: }
274: # Store parameter
275: if ($delete) {
276: $reply=&Apache::lonnet::del
277: ('resourcedata',[keys(%storecontent)],$udom,$uname);
278: } else {
279: $reply=&Apache::lonnet::cput
280: ('resourcedata',\%storecontent,$udom,$uname);
281: }
1.191 albertel 282: &Apache::lonnet::devalidateuserresdata($uname,$udom);
1.186 www 283: }
284:
285: if ($reply=~/^error\:(.*)/) {
286: return "<font color=red>Write Error: $1</font>";
287: }
288: return '';
289: }
290:
1.59 matthew 291: ##################################################
292: ##################################################
293:
294: =pod
295:
296: =item valout
297:
298: Format a value for output.
299:
300: Inputs: $value, $type
301:
302: Returns: $value, formatted for output. If $type indicates it is a date,
303: localtime($value) is returned.
1.9 www 304:
1.59 matthew 305: =cut
306:
307: ##################################################
308: ##################################################
1.9 www 309: sub valout {
310: my ($value,$type)=@_;
1.59 matthew 311: my $result = '';
312: # Values of zero are valid.
313: if (! $value && $value ne '0') {
1.71 albertel 314: $result = ' ';
1.59 matthew 315: } else {
1.66 www 316: if ($type eq 'date_interval') {
317: my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
318: $year=$year-70;
319: $mday--;
320: if ($year) {
321: $result.=$year.' yrs ';
322: }
323: if ($mon) {
324: $result.=$mon.' mths ';
325: }
326: if ($mday) {
327: $result.=$mday.' days ';
328: }
329: if ($hour) {
330: $result.=$hour.' hrs ';
331: }
332: if ($min) {
333: $result.=$min.' mins ';
334: }
335: if ($sec) {
336: $result.=$sec.' secs ';
337: }
338: $result=~s/\s+$//;
339: } elsif ($type=~/^date/) {
1.59 matthew 340: $result = localtime($value);
341: } else {
342: $result = $value;
343: }
344: }
345: return $result;
1.9 www 346: }
347:
1.59 matthew 348: ##################################################
349: ##################################################
350:
351: =pod
1.5 www 352:
1.59 matthew 353: =item plink
354:
355: Produces a link anchor.
356:
357: Inputs: $type,$dis,$value,$marker,$return,$call
358:
359: Returns: scalar with html code for a link which will envoke the
360: javascript function 'pjump'.
361:
362: =cut
363:
364: ##################################################
365: ##################################################
1.5 www 366: sub plink {
367: my ($type,$dis,$value,$marker,$return,$call)=@_;
1.23 www 368: my $winvalue=$value;
369: unless ($winvalue) {
370: if ($type=~/^date/) {
1.190 albertel 371: $winvalue=$env{'form.recent_'.$type};
1.23 www 372: } else {
1.190 albertel 373: $winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
1.23 www 374: }
375: }
376: return
1.43 albertel 377: '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
378: .$marker."','".$return."','".$call."'".');">'.
379: &valout($value,$type).'</a><a name="'.$marker.'"></a>';
1.5 www 380: }
381:
1.44 albertel 382:
383: sub startpage {
1.137 albertel 384: my ($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader)=@_;
1.99 albertel 385:
1.120 www 386: my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',
1.98 www 387: 'onUnload="pclose()"');
1.194 albertel 388: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table');
1.81 www 389: my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
390: &Apache::loncommon::selectstudent_link('parmform','uname','udom');
391: my $selscript=&Apache::loncommon::studentbrowser_javascript();
1.88 matthew 392: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.133 www 393: my %lt=&Apache::lonlocal::texthash(
394: 'cep' => "Course Environment Parameters",
395: 'scep' => "Set Course Environment Parameters",
396: 'smcap' => "Set/Modify Course Assessment Parameter",
397: 'mcap' => "Modify Course Assessment Parameters",
398: 'caphm' => "Course Assessment Parameter - Helper Mode",
399: 'capom' => "Course Assessment Parameters - Overview Mode",
400: 'captm' => "Course Assessments Parameters - Table Mode",
401: 'sg' => "Section/Group",
402: 'fu' => "For User",
403: 'oi' => "or ID",
404: 'ad' => "at Domain"
405: );
1.148 www 406: my $overallhelp=
1.166 albertel 407: &Apache::loncommon::help_open_menu('','Setting Parameters','Course_Setting_Parameters','',10,'Instructor Interface');
1.146 www 408: my $assessparmhelp=&Apache::loncommon::help_open_topic("Cascading_Parameters","Assessment Parameters");
1.183 albertel 409: my $html=&Apache::lonxml::xmlbegin();
1.44 albertel 410: $r->print(<<ENDHEAD);
1.183 albertel 411: $html
1.44 albertel 412: <head>
413: <title>LON-CAPA Course Parameters</title>
414: <script>
415:
416: function pclose() {
417: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
418: "height=350,width=350,scrollbars=no,menubar=no");
419: parmwin.close();
420: }
421:
1.88 matthew 422: $pjump_def
1.44 albertel 423:
424: function psub() {
425: pclose();
426: if (document.parmform.pres_marker.value!='') {
427: document.parmform.action+='#'+document.parmform.pres_marker.value;
428: var typedef=new Array();
429: typedef=document.parmform.pres_type.value.split('_');
430: if (document.parmform.pres_type.value!='') {
431: if (typedef[0]=='date') {
432: eval('document.parmform.recent_'+
433: document.parmform.pres_type.value+
434: '.value=document.parmform.pres_value.value;');
435: } else {
436: eval('document.parmform.recent_'+typedef[0]+
437: '.value=document.parmform.pres_value.value;');
438: }
439: }
440: document.parmform.submit();
441: } else {
442: document.parmform.pres_value.value='';
443: document.parmform.pres_marker.value='';
444: }
445: }
446:
1.57 albertel 447: function openWindow(url, wdwName, w, h, toolbar,scrollbar) {
448: var options = "width=" + w + ",height=" + h + ",";
449: options += "resizable=yes,scrollbars="+scrollbar+",status=no,";
450: options += "menubar=no,toolbar="+toolbar+",location=no,directories=no";
451: var newWin = window.open(url, wdwName, options);
452: newWin.focus();
453: }
1.44 albertel 454: </script>
1.81 www 455: $selscript
1.44 albertel 456: </head>
1.64 www 457: $bodytag
1.193 albertel 458: $breadcrumbs
1.166 albertel 459: $overallhelp
1.137 albertel 460: ENDHEAD
1.91 bowersj2 461:
1.137 albertel 462: unless ($trimheader) {$r->print(<<ENDHEAD2);
1.44 albertel 463: <form method="post" action="/adm/parmset" name="envform">
1.133 www 464: <h4>$lt{'cep'}</h4>
465: <input type="submit" name="crsenv" value="$lt{'scep'}" />
1.120 www 466: </form>
467: <hr />
1.146 www 468: $assessparmhelp
1.120 www 469: <form method="post" action="/adm/helper/parameter.helper" name="helpform">
1.133 www 470: <h4>$lt{'caphm'}</h4>
471: <input type="submit" value="$lt{'smcap'}" />
1.120 www 472: </form>
473: <hr />
474: <form method="post" action="/adm/parmset" name="overview">
1.133 www 475: <h4>$lt{'capom'}</h4>
476: <input type="submit" name="overview" value="$lt{'mcap'}" />
1.44 albertel 477: </form>
1.101 www 478: <hr />
1.137 albertel 479: ENDHEAD2
1.189 www 480: }
481: my %sectionhash=();
482: my $sections='';
483: if (&Apache::loncommon::get_sections(
1.190 albertel 484: $env{'course.'.$env{'request.course.id'}.'.domain'},
485: $env{'course.'.$env{'request.course.id'}.'.num'},
1.189 www 486: \%sectionhash)) {
487: $sections=$lt{'sg'}.': <select name="csec">';
488: foreach ('',sort keys %sectionhash) {
489: $sections.='<option value="'.$_.'"'.
490: ($_ eq $csec?'selected="selected"':'').'>'.$_.'</option>';
491: }
492: $sections.='</select>';
493: }
494: $r->print(<<ENDHEAD3);
1.193 albertel 495: <form method="post" action="/adm/parmset?action=settable" name="parmform">
1.133 www 496: <h4>$lt{'captm'}</h4>
1.137 albertel 497: ENDHEAD3
1.99 albertel 498:
499: if (!$have_assesments) {
1.133 www 500: $r->print('<font color="red">'.&mt('There are no assesment parameters in this course to set.').'</font><br />');
1.99 albertel 501: } else {
502: $r->print(<<ENDHEAD);
1.44 albertel 503: <b>
1.189 www 504: $sections
1.188 www 505: <br />
1.133 www 506: $lt{'fu'}
1.188 www 507: <input type="text" value="$uname" size="12" name="uname" />
1.133 www 508: $lt{'oi'}
1.188 www 509: <input type="text" value="$id" size="12" name="id" />
1.133 www 510: $lt{'ad'}
1.81 www 511: $chooseopt
1.44 albertel 512: </b>
513: <input type="hidden" value='' name="pres_value">
514: <input type="hidden" value='' name="pres_type">
515: <input type="hidden" value='' name="pres_marker">
516: ENDHEAD
1.99 albertel 517: }
1.44 albertel 518: }
519:
520: sub print_row {
1.66 www 521: my ($r,$which,$part,$name,$rid,$default,$defaulttype,$display,$defbgone,
1.187 www 522: $defbgtwo,$parmlev,$uname,$udom,$csec)=@_;
1.66 www 523: # get the values for the parameter in cascading order
524: # empty levels will remain empty
1.44 albertel 525: my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
1.187 www 526: $rid,$$default{$which},$uname,$udom,$csec);
1.66 www 527: # get the type for the parameters
528: # problem: these may not be set for all levels
529: my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
530: $$name{$which}.'.type',
1.187 www 531: $rid,$$defaulttype{$which},$uname,$udom,$csec);
1.66 www 532: # cascade down manually
1.182 albertel 533: my $cascadetype=$$defaulttype{$which};
534: for (my $i=11;$i>0;$i--) {
1.66 www 535: if ($typeoutpar[$i]) {
536: $cascadetype=$typeoutpar[$i];
537: } else {
538: $typeoutpar[$i]=$cascadetype;
539: }
540: }
1.57 albertel 541: my $parm=$$display{$which};
542:
543: if ($parmlev eq 'full' || $parmlev eq 'brief') {
544: $r->print('<td bgcolor='.$defbgtwo.' align="center">'
545: .$$part{$which}.'</td>');
546: } else {
547: $parm=~s|\[.*\]\s||g;
548: }
549:
1.159 albertel 550: $r->print('<td bgcolor='.$defbgone.'>'.$parm.'</td>');
1.57 albertel 551:
1.44 albertel 552: my $thismarker=$which;
553: $thismarker=~s/^parameter\_//;
554: my $mprefix=$rid.'&'.$thismarker.'&';
555:
1.57 albertel 556: if ($parmlev eq 'general') {
557:
558: if ($uname) {
1.66 www 559: &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 560: } elsif ($csec) {
1.66 www 561: &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 562: } else {
1.182 albertel 563: &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 564: }
565: } elsif ($parmlev eq 'map') {
566:
567: if ($uname) {
1.66 www 568: &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 569: } elsif ($csec) {
1.66 www 570: &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 571: } else {
1.182 albertel 572: &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 573: }
574: } else {
575:
1.182 albertel 576: &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 577:
578: if ($parmlev eq 'brief') {
579:
1.66 www 580: &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 581:
582: if ($csec) {
1.66 www 583: &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 584: }
585: if ($uname) {
1.66 www 586: &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 587: }
588: } else {
589:
1.182 albertel 590: &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
591: &print_td($r,9,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
592: &print_td($r,8,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.66 www 593: &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 594:
595: if ($csec) {
1.66 www 596: &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
597: &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
598: &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 599: }
600: if ($uname) {
1.66 www 601: &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
602: &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
603: &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
1.57 albertel 604: }
605: } # end of $brief if/else
606: } # end of $parmlev if/else
607:
1.136 albertel 608: $r->print('<td bgcolor=#CCCCFF align="center">'.
609: &valout($outpar[$result],$typeoutpar[$result]).'</td>');
610:
1.57 albertel 611: if ($parmlev eq 'full' || $parmlev eq 'brief') {
1.136 albertel 612: my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
1.57 albertel 613: '.'.$$name{$which},$symbp{$rid});
1.136 albertel 614:
1.70 albertel 615: # this doesn't seem to work, and I don't think is correct
616: # my $sessionvaltype=&Apache::lonnet::EXT('resource.'.$$part{$which}.
617: # '.'.$$name{$which}.'.type',$symbp{$rid});
618: # this seems to work
1.136 albertel 619: my $sessionvaltype=$typeoutpar[$result];
620: if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
621: $r->print('<td bgcolor=#999999 align="center"><font color=#FFFFFF>'.
1.66 www 622: &valout($sessionval,$sessionvaltype).' '.
1.57 albertel 623: '</font></td>');
1.136 albertel 624: }
1.44 albertel 625: $r->print('</tr>');
1.57 albertel 626: $r->print("\n");
1.44 albertel 627: }
1.59 matthew 628:
1.44 albertel 629: sub print_td {
1.66 www 630: my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
1.57 albertel 631: $r->print('<td bgcolor='.(($result==$which)?'"#AAFFAA"':$defbg).
1.114 www 632: ' align="center">');
1.182 albertel 633: if ($which<8 || $which > 9) {
1.114 www 634: $r->print(&plink($$typeoutpar[$which],
635: $$display{$value},$$outpar[$which],
636: $mprefix."$which",'parmform.pres','psub'));
637: } else {
638: $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
639: }
640: $r->print('</td>'."\n");
1.57 albertel 641: }
642:
1.63 bowersj2 643: =pod
644:
645: =item B<extractResourceInformation>: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
646:
647: Input: See list below:
648:
649: =over 4
650:
651: =item B<ids>: An array that will contain all of the ids in the course.
652:
653: =item B<typep>: hash, id->type, where "type" contains the extension of the file, thus, I<problem exam quiz assess survey form>.
654:
1.171 www 655: =item B<keyp>: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
1.63 bowersj2 656:
657: =item B<allparms>: hash, name of parameter->display value (what is the display value?)
658:
659: =item B<allparts>: hash, part identification->text representation of part, where the text representation is "[Part $part]"
660:
661: =item B<allkeys>: hash, full key to part->display value (what's display value?)
662:
663: =item B<allmaps>: hash, ???
664:
665: =item B<fcat>: ???
666:
667: =item B<defp>: hash, ???
668:
669: =item B<mapp>: ??
670:
671: =item B<symbp>: hash, id->full sym?
672:
673: =back
674:
675: =cut
676:
677: sub extractResourceInformation {
678: my $ids = shift;
679: my $typep = shift;
680: my $keyp = shift;
681: my $allparms = shift;
682: my $allparts = shift;
683: my $allkeys = shift;
684: my $allmaps = shift;
685: my $fcat = shift;
686: my $defp = shift;
687: my $mapp = shift;
688: my $symbp = shift;
1.82 www 689: my $maptitles=shift;
1.196 ! www 690: my $uris=shift;
! 691:
1.63 bowersj2 692:
1.196 ! www 693: my $navmap = Apache::lonnavmaps::navmap->new();
! 694: my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
! 695: foreach my $resource (@allres) {
! 696: my $id=$resource->id();
! 697: my ($mapid,$resid)=split(/\./,$id);
! 698: if ($mapid eq '0') { next; }
! 699: $$ids[$#$ids+1]=$id;
! 700: my $srcf=$resource->src();
! 701: $srcf=~/\.(\w+)$/;
! 702: $$typep{$id}=$1;
! 703: $$keyp{$id}='';
! 704: $$uris{$id}=$srcf;
! 705: foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
! 706: if ($_=~/^parameter\_(.*)/) {
! 707: my $key=$_;
! 708: my $allkey=$1;
! 709: $allkey=~s/\_/\./g;
! 710: if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq
! 711: 'parm') {
! 712: next; #hide hidden things
1.63 bowersj2 713: }
1.196 ! www 714: my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
! 715: my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
! 716: my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
! 717: my $parmdis = $display;
! 718: $parmdis =~ s|(\[Part.*)$||g;
! 719: my $partkey = $part;
! 720: $partkey =~ tr|_|.|;
! 721: $$allparms{$name} = $parmdis;
! 722: $$allparts{$part} = "[Part $part]";
! 723: $$allkeys{$allkey}=$display;
! 724: if ($allkey eq $fcat) {
! 725: $$defp{$id}= &Apache::lonnet::metadata($srcf,$key);
! 726: }
! 727: if ($$keyp{$id}) {
! 728: $$keyp{$id}.=','.$key;
1.175 albertel 729: } else {
1.196 ! www 730: $$keyp{$id}=$key;
1.175 albertel 731: }
1.63 bowersj2 732: }
733: }
1.196 ! www 734: $$mapp{$id}=
! 735: &Apache::lonnet::declutter($resource->enclosing_map_src());
! 736: $$mapp{$mapid}=$$mapp{$id};
! 737: $$allmaps{$mapid}=$$mapp{$id};
! 738: if ($mapid eq '1') {
! 739: $$maptitles{$mapid}='Main Course Documents';
! 740: } else {
! 741: $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
! 742: }
! 743: $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
! 744: $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
! 745: $$symbp{$mapid}=$$mapp{$id}.'___(all)';
1.63 bowersj2 746: }
747: }
748:
1.59 matthew 749: ##################################################
750: ##################################################
751:
752: =pod
753:
754: =item assessparms
755:
756: Show assessment data and parameters. This is a large routine that should
757: be simplified and shortened... someday.
758:
759: Inputs: $r
760:
761: Returns: nothing
762:
1.63 bowersj2 763: Variables used (guessed by Jeremy):
764:
765: =over 4
766:
767: =item B<pscat>: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type.
768:
769: =item B<psprt>: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
770:
771: =item B<allmaps>:
772:
773: =back
774:
1.59 matthew 775: =cut
776:
777: ##################################################
778: ##################################################
1.30 www 779: sub assessparms {
1.1 www 780:
1.43 albertel 781: my $r=shift;
1.2 www 782: # -------------------------------------------------------- Variable declaration
1.129 www 783: my %allkeys=();
784: my %allmaps=();
785: my %alllevs=();
1.57 albertel 786:
1.187 www 787: my $uname;
788: my $udom;
789: my $uhome;
790: my $csec;
791:
1.190 albertel 792: my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
1.187 www 793:
1.57 albertel 794: $alllevs{'Resource Level'}='full';
795: $alllevs{'Map Level'}='map';
796: $alllevs{'Course Level'}='general';
797:
798: my %allparms;
799: my %allparts;
800:
1.43 albertel 801: my %defp;
802: %courseopt=();
803: %useropt=();
804:
805: @ids=();
806: %symbp=();
807: %typep=();
808:
809: my $message='';
810:
1.190 albertel 811: $csec=$env{'form.csec'};
1.188 www 812:
1.190 albertel 813: if ($udom=$env{'form.udom'}) {
814: } elsif ($udom=$env{'request.role.domain'}) {
815: } elsif ($udom=$env{'user.domain'}) {
1.172 albertel 816: } else {
817: $udom=$r->dir_config('lonDefDomain');
818: }
1.43 albertel 819:
1.134 albertel 820: my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
1.190 albertel 821: my $pschp=$env{'form.pschp'};
1.134 albertel 822: my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
1.76 www 823: if (!@psprt) { $psprt[0]='0'; }
1.190 albertel 824: my $showoptions=$env{'form.showoptions'};
1.57 albertel 825:
1.43 albertel 826: my $pssymb='';
1.57 albertel 827: my $parmlev='';
1.137 albertel 828: my $trimheader='';
1.190 albertel 829: my $prevvisit=$env{'form.prevvisit'};
1.57 albertel 830:
1.190 albertel 831: unless ($env{'form.parmlev'}) {
1.57 albertel 832: $parmlev = 'map';
833: } else {
1.190 albertel 834: $parmlev = $env{'form.parmlev'};
1.57 albertel 835: }
1.26 www 836:
1.29 www 837: # ----------------------------------------------- Was this started from grades?
838:
1.190 albertel 839: if (($env{'form.command'} eq 'set') && ($env{'form.url'})
840: && (!$env{'form.dis'})) {
841: my $url=$env{'form.url'};
1.194 albertel 842: $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
1.43 albertel 843: $pssymb=&Apache::lonnet::symbread($url);
1.92 albertel 844: if (!@pscat) { @pscat=('all'); }
1.43 albertel 845: $pschp='';
1.57 albertel 846: $parmlev = 'full';
1.137 albertel 847: $trimheader='yes';
1.190 albertel 848: } elsif ($env{'form.symb'}) {
849: $pssymb=$env{'form.symb'};
1.92 albertel 850: if (!@pscat) { @pscat=('all'); }
1.43 albertel 851: $pschp='';
1.57 albertel 852: $parmlev = 'full';
1.137 albertel 853: $trimheader='yes';
1.43 albertel 854: } else {
1.190 albertel 855: $env{'form.url'}='';
1.43 albertel 856: }
857:
1.190 albertel 858: my $id=$env{'form.id'};
1.43 albertel 859: if (($id) && ($udom)) {
860: $uname=(&Apache::lonnet::idget($udom,$id))[1];
861: if ($uname) {
862: $id='';
863: } else {
864: $message=
1.133 www 865: "<font color=red>".&mt("Unknown ID")." '$id' ".
866: &mt('at domain')." '$udom'</font>";
1.43 albertel 867: }
868: } else {
1.190 albertel 869: $uname=$env{'form.uname'};
1.43 albertel 870: }
871: unless ($udom) { $uname=''; }
872: $uhome='';
873: if ($uname) {
874: $uhome=&Apache::lonnet::homeserver($uname,$udom);
875: if ($uhome eq 'no_host') {
876: $message=
1.133 www 877: "<font color=red>".&mt("Unknown user")." '$uname' ".
878: &mt("at domain")." '$udom'</font>";
1.43 albertel 879: $uname='';
1.12 www 880: } else {
1.103 albertel 881: $csec=&Apache::lonnet::getsection($udom,$uname,
1.190 albertel 882: $env{'request.course.id'});
1.43 albertel 883: if ($csec eq '-1') {
884: $message="<font color=red>".
1.133 www 885: &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
886: &mt("not in this course")."</font>";
1.43 albertel 887: $uname='';
1.190 albertel 888: $csec=$env{'form.csec'};
1.43 albertel 889: } else {
890: my %name=&Apache::lonnet::userenvironment($udom,$uname,
891: ('firstname','middlename','lastname','generation','id'));
1.133 www 892: $message="\n<p>\n".&mt("Full Name").": ".
1.43 albertel 893: $name{'firstname'}.' '.$name{'middlename'}.' '
894: .$name{'lastname'}.' '.$name{'generation'}.
1.133 www 895: "<br>\n".&mt('ID').": ".$name{'id'}.'<p>';
1.43 albertel 896: }
1.12 www 897: }
1.43 albertel 898: }
1.2 www 899:
1.43 albertel 900: unless ($csec) { $csec=''; }
1.12 www 901:
1.190 albertel 902: my $fcat=$env{'form.fcat'};
1.43 albertel 903: unless ($fcat) { $fcat=''; }
1.2 www 904:
905: # ------------------------------------------------------------------- Tie hashs
1.196 ! www 906:
1.44 albertel 907: if (!(tie(%parmhash,'GDBM_File',
1.190 albertel 908: $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640))) {
909: $r->print("Unable to access parameter data. (File $env{'request.course.fn'}_parms.db not tieable)");
1.44 albertel 910: return ;
911: }
1.63 bowersj2 912:
1.14 www 913: # --------------------------------------------------------- Get all assessments
1.196 ! www 914: &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allkeys, \%allmaps, $fcat, \%defp, \%mapp, \%symbp,\%maptitles,\%uris);
1.63 bowersj2 915:
1.57 albertel 916: $mapp{'0.0'} = '';
917: $symbp{'0.0'} = '';
1.99 albertel 918:
1.14 www 919: # ---------------------------------------------------------- Anything to store?
1.190 albertel 920: if ($env{'form.pres_marker'}) {
921: $message.=&storeparm(split(/\&/,$env{'form.pres_marker'}),
922: $env{'form.pres_value'},
923: $env{'form.pres_type'},
1.187 www 924: $uname,$udom,$csec);
1.68 www 925: # ---------------------------------------------------------------- Done storing
1.130 www 926: $message.='<h3>'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').'</h3>';
1.68 www 927: }
1.67 www 928: # --------------------------------------------- Devalidate cache for this child
1.109 albertel 929: &Apache::lonnet::devalidatecourseresdata(
1.190 albertel 930: $env{'course.'.$env{'request.course.id'}.'.num'},
931: $env{'course.'.$env{'request.course.id'}.'.domain'});
1.191 albertel 932: #&Apache::lonnet::clear_EXT_cache_status();
1.2 www 933: # -------------------------------------------------------------- Get coursedata
1.45 matthew 934: %courseopt = &Apache::lonnet::dump
935: ('resourcedata',
1.190 albertel 936: $env{'course.'.$env{'request.course.id'}.'.domain'},
937: $env{'course.'.$env{'request.course.id'}.'.num'});
1.44 albertel 938: # --------------------------------------------------- Get userdata (if present)
939: if ($uname) {
1.45 matthew 940: %useropt=&Apache::lonnet::dump('resourcedata',$udom,$uname);
1.44 albertel 941: }
1.14 www 942:
1.2 www 943: # ------------------------------------------------------------------- Sort this
1.17 www 944:
1.44 albertel 945: @ids=sort {
946: if ($fcat eq '') {
947: $a<=>$b;
948: } else {
1.187 www 949: my ($result,@outpar)=&parmval($fcat,$a,$defp{$a},$uname,$udom,$csec);
1.44 albertel 950: my $aparm=$outpar[$result];
1.187 www 951: ($result,@outpar)=&parmval($fcat,$b,$defp{$b},$uname,$udom,$csec);
1.44 albertel 952: my $bparm=$outpar[$result];
953: 1*$aparm<=>1*$bparm;
954: }
955: } @ids;
1.57 albertel 956: #----------------------------------------------- if all selected, fill in array
957: if ($pscat[0] eq "all" || !@pscat) {@pscat = (keys %allparms);}
958: if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
1.2 www 959: # ------------------------------------------------------------------ Start page
1.63 bowersj2 960:
1.99 albertel 961: my $have_assesments=1;
962: if (scalar(keys(%allkeys)) eq 0) { $have_assesments=0; }
963:
1.193 albertel 964: $trimheader = 'yes';
1.137 albertel 965: &startpage($r,$id,$udom,$csec,$uname,$have_assesments,$trimheader);
1.99 albertel 966:
1.112 albertel 967: if (!$have_assesments) {
968: untie(%parmhash);
969: return '';
970: }
1.190 albertel 971: # if ($env{'form.url'}) {
972: # $r->print('<input type="hidden" value="'.$env{'form.url'}.
1.44 albertel 973: # '" name="url"><input type="hidden" name="command" value="set">');
974: # }
1.57 albertel 975: $r->print('<input type="hidden" value="true" name="prevvisit">');
976:
1.44 albertel 977: foreach ('tolerance','date_default','date_start','date_end',
978: 'date_interval','int','float','string') {
979: $r->print('<input type="hidden" value="'.
1.190 albertel 980: $env{'form.recent_'.$_}.'" name="recent_'.$_.'">');
1.44 albertel 981: }
982:
1.57 albertel 983: $r->print('<h2>'.$message.'</h2><table>');
984:
1.130 www 985: my $submitmessage = &mt('Update Section or Specific User');
1.44 albertel 986: if (!$pssymb) {
1.160 www 987: $r->print('<tr><td>'.&mt('Select Parameter Level').
988: &Apache::loncommon::help_open_topic('Course_Parameter_Levels').
989: '</td><td colspan="2">');
1.57 albertel 990: $r->print('<select name="parmlev">');
991: foreach (reverse sort keys %alllevs) {
992: $r->print('<option value="'.$alllevs{$_}.'"');
993: if ($parmlev eq $alllevs{$_}) {
994: $r->print(' selected');
995: }
996: $r->print('>'.$_.'</option>');
997: }
998: $r->print("</select></td>\n");
999:
1.101 www 1000: $r->print('</tr>');
1.128 albertel 1001: if ($parmlev ne 'general') {
1.130 www 1002: $r->print('<tr><td>'.&mt('Select Enclosing Map or Folder').'</td>');
1.128 albertel 1003: $r->print('<td colspan="2"><select name="pschp">');
1.130 www 1004: $r->print('<option value="all">'.&mt('All Maps or Folders').'</option>');
1.128 albertel 1005: foreach (sort {$allmaps{$a} cmp $allmaps{$b}} keys %allmaps) {
1006: $r->print('<option value="'.$_.'"');
1007: if (($pschp eq $_)) { $r->print(' selected'); }
1008: $r->print('>'.$maptitles{$_}.($allmaps{$_}!~/^uploaded/?' ['.$allmaps{$_}.']':'').'</option>');
1009: }
1010: $r->print("</select></td></tr>\n");
1011: }
1.44 albertel 1012: } else {
1.125 www 1013: my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
1.130 www 1014: $r->print("<tr><td>".&mt('Specific Resource')."</td><td>$resource</td>");
1.57 albertel 1015: $r->print('<td><input type="submit" name="dis" value="'.$submitmessage.'"></td>');
1016: $r->print('</tr>');
1017: $r->print('<input type="hidden" value="'.$pssymb.'" name="symb">');
1018: }
1019:
1.185 albertel 1020: $r->print('<tr><td colspan="3"><hr /><label><input type="checkbox"');
1.57 albertel 1021: if ($showoptions eq 'show') {$r->print(" checked ");}
1.185 albertel 1022: $r->print(' name="showoptions" value="show" />'.&mt('Show More Options').'</label><hr /></td></tr>');
1.57 albertel 1023: # $r->print("<tr><td>Show: $showoptions</td></tr>");
1024: # $r->print("<tr><td>pscat: @pscat</td></tr>");
1025: # $r->print("<tr><td>psprt: @psprt</td></tr>");
1026: # $r->print("<tr><td>fcat: $fcat</td></tr>");
1027:
1028: if ($showoptions eq 'show') {
1029: my $tempkey;
1030:
1.130 www 1031: $r->print('<tr><td colspan="3" align="center">'.&mt('Select Parameters to View').'</td></tr>');
1.57 albertel 1032:
1.176 albertel 1033: $r->print('<tr><td colspan="2"><table><tr>');
1.57 albertel 1034: my $cnt=0;
1035: foreach $tempkey (sort { $allparms{$a} cmp $allparms{$b} }
1036: keys %allparms ) {
1037: ++$cnt;
1.176 albertel 1038: $r->print('</tr><tr>') if ($cnt%2);
1.57 albertel 1039: $r->print('<td><input type="checkbox" name="pscat" ');
1040: $r->print('value="'.$tempkey.'"');
1041: if ($pscat[0] eq "all" || grep $_ eq $tempkey, @pscat) {
1042: $r->print(' checked');
1043: }
1.176 albertel 1044: $r->print('>'.$allparms{$tempkey}.'</td>');
1045: }
1046: $r->print('
1047: </tr><tr><td>
1048: <script type="text/javascript">
1049: function checkall(value, checkName) {
1050: for (i=0; i<document.forms.parmform.elements.length; i++) {
1051: ele = document.forms.parmform.elements[i];
1052: if (ele.name == checkName) {
1053: document.forms.parmform.elements[i].checked=value;
1054: }
1.57 albertel 1055: }
1.176 albertel 1056: }
1057: </script>
1058: <input type="button" onclick="checkall(true, \'pscat\')" value="Select All" />
1059: </td><td>
1060: <input type="button" onclick="checkall(false, \'pscat\')" value="Unselect All" />
1061: </td>
1062: ');
1.57 albertel 1063: $r->print('</tr></table>');
1064:
1065: # $r->print('<tr><td>Select Parts</td><td>');
1066: $r->print('<td><select multiple name="psprt" size="5">');
1067: $r->print('<option value="all"');
1068: $r->print(' selected') unless (@psprt);
1.130 www 1069: $r->print('>'.&mt('All Parts').'</option>');
1.76 www 1070: my %temphash=();
1071: foreach (@psprt) { $temphash{$_}=1; }
1.57 albertel 1072: foreach $tempkey (sort keys %allparts) {
1073: unless ($tempkey =~ /\./) {
1074: $r->print('<option value="'.$tempkey.'"');
1.76 www 1075: if ($psprt[0] eq "all" || $temphash{$tempkey}) {
1.57 albertel 1076: $r->print(' selected');
1077: }
1078: $r->print('>'.$allparts{$tempkey}.'</option>');
1079: }
1080: }
1081: $r->print('</select></td></tr><tr><td colspan="3"><hr /></td></tr>');
1082:
1.130 www 1083: $r->print('<tr><td>'.&mt('Sort list by').'</td><td>');
1.57 albertel 1084: $r->print('<select name="fcat">');
1.130 www 1085: $r->print('<option value="">'.&mt('Enclosing Map or Folder').'</option>');
1.57 albertel 1086: foreach (sort keys %allkeys) {
1087: $r->print('<option value="'.$_.'"');
1088: if ($fcat eq $_) { $r->print(' selected'); }
1089: $r->print('>'.$allkeys{$_}.'</option>');
1090: }
1091: $r->print('</select></td>');
1092:
1093: $r->print('</tr><tr><td colspan="3"><hr /></td></tr>');
1094:
1095: } else { # hide options - include any necessary extras here
1096:
1097: $r->print('<input type="hidden" name="fcat" value="'.$fcat.'">'."\n");
1098:
1099: unless (@pscat) {
1100: foreach (keys %allparms ) {
1101: $r->print('<input type="hidden" name="pscat" value="'.$_.'">'."\n");
1102: }
1103: } else {
1104: foreach (@pscat) {
1105: $r->print('<input type="hidden" name="pscat" value="'.$_.'">'."\n");
1106: }
1107: }
1108:
1109: unless (@psprt) {
1110: foreach (keys %allparts ) {
1111: $r->print('<input type="hidden" name="psprt" value="'.$_.'">'."\n");
1112: }
1113: } else {
1114: foreach (@psprt) {
1115: $r->print('<input type="hidden" name="psprt" value="'.$_.'">'."\n");
1116: }
1117: }
1118:
1.44 albertel 1119: }
1.101 www 1120: $r->print('</table><br />');
1121: if (($prevvisit) || ($pschp) || ($pssymb)) {
1.130 www 1122: $submitmessage = &mt("Update Course Assessment Parameter Display");
1.101 www 1123: } else {
1.130 www 1124: $submitmessage = &mt("Set/Modify Course Assessment Parameters");
1.101 www 1125: }
1126: $r->print('<input type="submit" name="dis" value="'.$submitmessage.'">');
1.57 albertel 1127:
1.76 www 1128: # my @temp_psprt;
1129: # foreach my $t (@psprt) {
1130: # push(@temp_psprt, grep {eval (/^$t\./ || ($_ == $t))} (keys %allparts));
1131: # }
1.57 albertel 1132:
1.76 www 1133: # @psprt = @temp_psprt;
1.57 albertel 1134:
1135: my @temp_pscat;
1136: map {
1137: my $cat = $_;
1138: push(@temp_pscat, map { $_.'.'.$cat } @psprt);
1139: } @pscat;
1140:
1141: @pscat = @temp_pscat;
1142:
1143: if (($prevvisit) || ($pschp) || ($pssymb)) {
1.10 www 1144: # ----------------------------------------------------------------- Start Table
1.57 albertel 1145: my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
1.190 albertel 1146: my $csuname=$env{'user.name'};
1147: my $csudom=$env{'user.domain'};
1.57 albertel 1148:
1149: if ($parmlev eq 'full' || $parmlev eq 'brief') {
1150: my $coursespan=$csec?8:5;
1151: $r->print('<p><table border=2>');
1152: $r->print('<tr><td colspan=5></td>');
1.130 www 1153: $r->print('<th colspan='.($coursespan).'>'.&mt('Any User').'</th>');
1.57 albertel 1154: if ($uname) {
1155: $r->print("<th colspan=3 rowspan=2>");
1.130 www 1156: $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom</th>");
1.57 albertel 1157: }
1.133 www 1158: my %lt=&Apache::lonlocal::texthash(
1159: 'pie' => "Parameter in Effect",
1160: 'csv' => "Current Session Value",
1161: 'at' => 'at',
1162: 'rl' => "Resource Level",
1163: 'ic' => 'in Course',
1164: 'aut' => "Assessment URL and Title",
1.143 albertel 1165: 'type' => 'Type',
1.133 www 1166: 'emof' => "Enclosing Map or Folder",
1.143 albertel 1167: 'part' => 'Part',
1.133 www 1168: 'pn' => 'Parameter Name',
1169: 'def' => 'default',
1170: 'femof' => 'from Enclosing Map or Folder',
1171: 'gen' => 'general',
1172: 'foremf' => 'for Enclosing Map or Folder',
1173: 'fr' => 'for Resource'
1174: );
1.57 albertel 1175: $r->print(<<ENDTABLETWO);
1.133 www 1176: <th rowspan=3>$lt{'pie'}</th>
1177: <th rowspan=3>$lt{'csv'}<br>($csuname $lt{'at'} $csudom)</th>
1.182 albertel 1178: </tr><tr><td colspan=5></td><th colspan=2>$lt{'ic'}</th><th colspan=2>$lt{'rl'}</th>
1179: <th colspan=1>$lt{'ic'}</th>
1180:
1.10 www 1181: ENDTABLETWO
1.57 albertel 1182: if ($csec) {
1.133 www 1183: $r->print("<th colspan=3>".
1184: &mt("in Section/Group")." $csec</th>");
1.57 albertel 1185: }
1186: $r->print(<<ENDTABLEHEADFOUR);
1.133 www 1187: </tr><tr><th>$lt{'aut'}</th><th>$lt{'type'}</th>
1188: <th>$lt{'emof'}</th><th>$lt{'part'}</th><th>$lt{'pn'}</th>
1.192 albertel 1189: <th>$lt{'gen'}</th><th>$lt{'foremf'}</th>
1190: <th>$lt{'def'}</th><th>$lt{'femof'}</th><th>$lt{'fr'}</th>
1.10 www 1191: ENDTABLEHEADFOUR
1.57 albertel 1192:
1193: if ($csec) {
1.130 www 1194: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1195: }
1196:
1197: if ($uname) {
1.130 www 1198: $r->print('<th>'.&mt('general').'</th><th>'.&mt('for Enclosing Map or Folder').'</th><th>'.&mt('for Resource').'</th>');
1.57 albertel 1199: }
1200:
1201: $r->print('</tr>');
1202:
1203: my $defbgone='';
1204: my $defbgtwo='';
1205:
1206: foreach (@ids) {
1207:
1208: my $rid=$_;
1209: my ($inmapid)=($rid=~/\.(\d+)$/);
1210:
1.152 albertel 1211: if ((!$pssymb &&
1212: (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
1213: ||
1214: ($pssymb && $pssymb eq $symbp{$rid})) {
1.4 www 1215: # ------------------------------------------------------ Entry for one resource
1.184 albertel 1216: if ($defbgone eq '"#E0E099"') {
1217: $defbgone='"#E0E0DD"';
1.57 albertel 1218: } else {
1.184 albertel 1219: $defbgone='"#E0E099"';
1.57 albertel 1220: }
1.184 albertel 1221: if ($defbgtwo eq '"#FFFF99"') {
1222: $defbgtwo='"#FFFFDD"';
1.57 albertel 1223: } else {
1.184 albertel 1224: $defbgtwo='"#FFFF99"';
1.57 albertel 1225: }
1226: my $thistitle='';
1227: my %name= ();
1228: undef %name;
1229: my %part= ();
1230: my %display=();
1231: my %type= ();
1232: my %default=();
1.196 ! www 1233: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1234:
1235: foreach (split(/\,/,$keyp{$rid})) {
1236: my $tempkeyp = $_;
1237: if (grep $_ eq $tempkeyp, @catmarker) {
1238: $part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
1239: $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
1240: $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
1241: unless ($display{$_}) { $display{$_}=''; }
1242: $display{$_}.=' ('.$name{$_}.')';
1243: $default{$_}=&Apache::lonnet::metadata($uri,$_);
1244: $type{$_}=&Apache::lonnet::metadata($uri,$_.'.type');
1245: $thistitle=&Apache::lonnet::metadata($uri,$_.'.title');
1246: }
1247: }
1248: my $totalparms=scalar keys %name;
1249: if ($totalparms>0) {
1250: my $firstrow=1;
1.180 albertel 1251: my $title=&Apache::lonnet::gettitle($uri);
1.57 albertel 1252: $r->print('<tr><td bgcolor='.$defbgone.
1253: ' rowspan='.$totalparms.
1254: '><tt><font size=-1>'.
1255: join(' / ',split(/\//,$uri)).
1256: '</font></tt><p><b>'.
1.154 albertel 1257: "<a href=\"javascript:openWindow('".
1258: &Apache::lonnet::clutter($uri).
1.57 albertel 1259: "', 'metadatafile', '450', '500', 'no', 'yes')\";".
1.127 albertel 1260: " TARGET=_self>$title");
1.57 albertel 1261:
1262: if ($thistitle) {
1263: $r->print(' ('.$thistitle.')');
1264: }
1265: $r->print('</a></b></td>');
1266: $r->print('<td bgcolor='.$defbgtwo.
1267: ' rowspan='.$totalparms.'>'.$typep{$rid}.
1268: '</td>');
1269:
1270: $r->print('<td bgcolor='.$defbgone.
1271: ' rowspan='.$totalparms.
1272: '><tt><font size=-1>');
1273:
1274: $r->print(' / res / ');
1275: $r->print(join(' / ', split(/\//,$mapp{$rid})));
1276:
1277: $r->print('</font></tt></td>');
1278:
1279: foreach (sort keys %name) {
1280: unless ($firstrow) {
1281: $r->print('<tr>');
1282: } else {
1283: undef $firstrow;
1284: }
1285:
1286: &print_row($r,$_,\%part,\%name,$rid,\%default,
1287: \%type,\%display,$defbgone,$defbgtwo,
1.187 www 1288: $parmlev,$uname,$udom,$csec);
1.57 albertel 1289: }
1290: }
1291: }
1292: } # end foreach ids
1.43 albertel 1293: # -------------------------------------------------- End entry for one resource
1.57 albertel 1294: $r->print('</table>');
1295: } # end of brief/full
1296: #--------------------------------------------------- Entry for parm level map
1297: if ($parmlev eq 'map') {
1298: my $defbgone = '"E0E099"';
1299: my $defbgtwo = '"FFFF99"';
1300:
1301: my %maplist;
1302:
1303: if ($pschp eq 'all') {
1304: %maplist = %allmaps;
1305: } else {
1306: %maplist = ($pschp => $mapp{$pschp});
1307: }
1308:
1309: #-------------------------------------------- for each map, gather information
1310: my $mapid;
1.60 albertel 1311: foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
1312: my $maptitle = $maplist{$mapid};
1.57 albertel 1313:
1314: #----------------------- loop through ids and get all parameter types for map
1315: #----------------------------------------- and associated information
1316: my %name = ();
1317: my %part = ();
1318: my %display = ();
1319: my %type = ();
1320: my %default = ();
1321: my $map = 0;
1322:
1323: # $r->print("Catmarker: @catmarker<br />\n");
1324:
1325: foreach (@ids) {
1326: ($map)=(/([\d]*?)\./);
1327: my $rid = $_;
1328:
1329: # $r->print("$mapid:$map: $rid <br /> \n");
1330:
1331: if ($map eq $mapid) {
1.196 ! www 1332: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1333: # $r->print("Keys: $keyp{$rid} <br />\n");
1334:
1335: #--------------------------------------------------------------------
1336: # @catmarker contains list of all possible parameters including part #s
1337: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1338: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1339: # When storing information, store as part 0
1340: # When requesting information, request from full part
1341: #-------------------------------------------------------------------
1342: foreach (split(/\,/,$keyp{$rid})) {
1343: my $tempkeyp = $_;
1344: my $fullkeyp = $tempkeyp;
1.73 albertel 1345: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1346:
1347: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1348: $part{$tempkeyp}="0";
1349: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1350: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1351: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1352: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1353: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1354: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1355: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1356: }
1357: } # end loop through keys
1358: }
1359: } # end loop through ids
1360:
1361: #---------------------------------------------------- print header information
1.133 www 1362: my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
1.82 www 1363: my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
1.57 albertel 1364: $r->print(<<ENDMAPONE);
1365: <center><h4>
1.135 albertel 1366: Set Defaults for All Resources in $foldermap<br />
1367: <font color="red"><i>$showtitle</i></font><br />
1.57 albertel 1368: Specifically for
1369: ENDMAPONE
1370: if ($uname) {
1371: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1372: ('firstname','middlename','lastname','generation', 'id'));
1373: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1374: .$name{'lastname'}.' '.$name{'generation'};
1.135 albertel 1375: $r->print(&mt("User")." <font color=\"red\"><i>$uname \($person\) </i></font> ".
1.130 www 1376: &mt('in')." \n");
1.57 albertel 1377: } else {
1.135 albertel 1378: $r->print("<font color=\"red\"><i>".&mt('all').'</i></font> '.&mt('users in')." \n");
1.57 albertel 1379: }
1380:
1.135 albertel 1381: if ($csec) {$r->print(&mt("Section")." <font color=\"red\"><i>$csec</i></font> ".
1.130 www 1382: &mt('of')." \n")};
1.57 albertel 1383:
1.135 albertel 1384: $r->print("<font color=\"red\"><i>$coursename</i></font><br />");
1385: $r->print("</h4>\n");
1.57 albertel 1386: #---------------------------------------------------------------- print table
1387: $r->print('<p><table border="2">');
1.130 www 1388: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1389: $r->print('<th>'.&mt('Default Value').'</th>');
1390: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1391:
1392: foreach (sort keys %name) {
1.168 matthew 1393: $r->print('<tr>');
1.57 albertel 1394: &print_row($r,$_,\%part,\%name,$mapid,\%default,
1395: \%type,\%display,$defbgone,$defbgtwo,
1.187 www 1396: $parmlev,$uname,$udom,$csec);
1.57 albertel 1397: # $r->print("<tr><td>resource.$part{$_}.$name{$_},$symbp{$mapid}</td></tr>\n");
1398: }
1399: $r->print("</table></center>");
1400: } # end each map
1401: } # end of $parmlev eq map
1402: #--------------------------------- Entry for parm level general (Course level)
1403: if ($parmlev eq 'general') {
1404: my $defbgone = '"E0E099"';
1405: my $defbgtwo = '"FFFF99"';
1406:
1407: #-------------------------------------------- for each map, gather information
1408: my $mapid="0.0";
1409: #----------------------- loop through ids and get all parameter types for map
1410: #----------------------------------------- and associated information
1411: my %name = ();
1412: my %part = ();
1413: my %display = ();
1414: my %type = ();
1415: my %default = ();
1416:
1417: foreach (@ids) {
1418: my $rid = $_;
1419:
1.196 ! www 1420: my $uri=&Apache::lonnet::declutter($uris{$rid});
1.57 albertel 1421:
1422: #--------------------------------------------------------------------
1423: # @catmarker contains list of all possible parameters including part #s
1424: # $fullkeyp contains the full part/id # for the extraction of proper parameters
1425: # $tempkeyp contains part 0 only (no ids - ie, subparts)
1426: # When storing information, store as part 0
1427: # When requesting information, request from full part
1428: #-------------------------------------------------------------------
1429: foreach (split(/\,/,$keyp{$rid})) {
1430: my $tempkeyp = $_;
1431: my $fullkeyp = $tempkeyp;
1.73 albertel 1432: $tempkeyp =~ s/_\w+_/_0_/;
1.57 albertel 1433: if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
1434: $part{$tempkeyp}="0";
1435: $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
1436: $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
1437: unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
1438: $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
1.73 albertel 1439: $display{$tempkeyp} =~ s/_\w+_/_0_/;
1.57 albertel 1440: $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
1441: $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
1442: }
1443: } # end loop through keys
1444: } # end loop through ids
1445:
1446: #---------------------------------------------------- print header information
1.133 www 1447: my $setdef=&mt("Set Defaults for All Resources in Course");
1.57 albertel 1448: $r->print(<<ENDMAPONE);
1.133 www 1449: <center><h4>$setdef
1.135 albertel 1450: <font color="red"><i>$coursename</i></font><br />
1.57 albertel 1451: ENDMAPONE
1452: if ($uname) {
1453: my %name=&Apache::lonnet::userenvironment($udom,$uname,
1454: ('firstname','middlename','lastname','generation', 'id'));
1455: my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
1456: .$name{'lastname'}.' '.$name{'generation'};
1.135 albertel 1457: $r->print(" ".&mt("User")."<font color=\"red\"> <i>$uname \($person\) </i></font> \n");
1.57 albertel 1458: } else {
1.135 albertel 1459: $r->print("<i><font color=\"red\"> ".&mt("ALL")."</i> ".&mt("USERS")."</font> \n");
1.57 albertel 1460: }
1461:
1.135 albertel 1462: if ($csec) {$r->print(&mt("Section")."<font color=\"red\"> <i>$csec</i></font>\n")};
1463: $r->print("</h4>\n");
1.57 albertel 1464: #---------------------------------------------------------------- print table
1465: $r->print('<p><table border="2">');
1.130 www 1466: $r->print('<tr><th>'.&mt('Parameter Name').'</th>');
1467: $r->print('<th>'.&mt('Default Value').'</th>');
1468: $r->print('<th>'.&mt('Parameter in Effect').'</th></tr>');
1.57 albertel 1469:
1470: foreach (sort keys %name) {
1.168 matthew 1471: $r->print('<tr>');
1.57 albertel 1472: &print_row($r,$_,\%part,\%name,$mapid,\%default,
1.187 www 1473: \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
1.57 albertel 1474: # $r->print("<tr><td>resource.$part{$_}.$name{$_},$symbp{$mapid}</td></tr>\n");
1475: }
1476: $r->print("</table></center>");
1477: } # end of $parmlev eq general
1.43 albertel 1478: }
1.44 albertel 1479: $r->print('</form></body></html>');
1480: untie(%parmhash);
1.57 albertel 1481: } # end sub assessparms
1.30 www 1482:
1.59 matthew 1483:
1484: ##################################################
1485: ##################################################
1486:
1487: =pod
1488:
1489: =item crsenv
1490:
1.105 matthew 1491: Show and set course data and parameters. This is a large routine that should
1.59 matthew 1492: be simplified and shortened... someday.
1493:
1494: Inputs: $r
1495:
1496: Returns: nothing
1497:
1498: =cut
1499:
1500: ##################################################
1501: ##################################################
1.30 www 1502: sub crsenv {
1503: my $r=shift;
1504: my $setoutput='';
1.64 www 1505: my $bodytag=&Apache::loncommon::bodytag(
1506: 'Set Course Environment Parameters');
1.194 albertel 1507: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,
1508: 'Edit Course Environment');
1.190 albertel 1509: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1510: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.105 matthew 1511:
1512: #
1513: # Go through list of changes
1.190 albertel 1514: foreach (keys %env) {
1.105 matthew 1515: next if ($_!~/^form\.(.+)\_setparmval$/);
1516: my $name = $1;
1.190 albertel 1517: my $value = $env{'form.'.$name.'_value'};
1.105 matthew 1518: if ($name eq 'newp') {
1.190 albertel 1519: $name = $env{'form.newp_name'};
1.105 matthew 1520: }
1521: if ($name eq 'url') {
1522: $value=~s/^\/res\///;
1523: my $bkuptime=time;
1524: my @tmp = &Apache::lonnet::get
1525: ('environment',['url'],$dom,$crs);
1.130 www 1526: $setoutput.=&mt('Backing up previous URL').': '.
1.105 matthew 1527: &Apache::lonnet::put
1528: ('environment',
1529: {'top level map backup '.$bkuptime => $tmp[1] },
1530: $dom,$crs).
1531: '<br>';
1532: }
1533: #
1534: # Deal with modified default spreadsheets
1535: if ($name =~ /^spreadsheet_default_(classcalc|
1536: studentcalc|
1537: assesscalc)$/x) {
1538: my $sheettype = $1;
1539: if ($sheettype eq 'classcalc') {
1540: # no need to do anything since viewing the sheet will
1541: # cause it to be updated.
1542: } elsif ($sheettype eq 'studentcalc') {
1543: # expire all the student spreadsheets
1544: &Apache::lonnet::expirespread('','','studentcalc');
1545: } else {
1546: # expire all the assessment spreadsheets
1547: # this includes non-default spreadsheets, but better to
1548: # be safe than sorry.
1549: &Apache::lonnet::expirespread('','','assesscalc');
1550: # expire all the student spreadsheets
1551: &Apache::lonnet::expirespread('','','studentcalc');
1.30 www 1552: }
1.105 matthew 1553: }
1554: #
1.107 matthew 1555: # Deal with the enrollment dates
1556: if ($name =~ /^default_enrollment_(start|end)_date$/) {
1557: $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
1558: }
1.178 raeburn 1559: # Get existing cloners
1560: my @oldcloner = ();
1561: if ($name eq 'cloners') {
1562: my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
1563: if ($clonenames{'cloners'} =~ /,/) {
1564: @oldcloner = split/,/,$clonenames{'cloners'};
1565: } else {
1566: $oldcloner[0] = $clonenames{'cloners'};
1567: }
1568: }
1.107 matthew 1569: #
1.105 matthew 1570: # Let the user know we made the changes
1.153 albertel 1571: if ($name && defined($value)) {
1.178 raeburn 1572: if ($name eq 'cloners') {
1573: $value =~ s/^,//;
1574: $value =~ s/,$//;
1575: }
1.105 matthew 1576: my $put_result = &Apache::lonnet::put('environment',
1577: {$name=>$value},$dom,$crs);
1578: if ($put_result eq 'ok') {
1.130 www 1579: $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';
1.178 raeburn 1580: if ($name eq 'cloners') {
1581: &change_clone($value,\@oldcloner);
1582: }
1.179 raeburn 1583: # Flush the course logs so course description is immediately updated
1584: if ($name eq 'description' && defined($value)) {
1585: &Apache::lonnet::flushcourselogs();
1586: }
1.105 matthew 1587: } else {
1.130 www 1588: $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
1589: ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
1.30 www 1590: }
1591: }
1.38 harris41 1592: }
1.108 www 1593: # ------------------------- Re-init course environment entries for this session
1594:
1.190 albertel 1595: &Apache::lonnet::coursedescription($env{'request.course.id'});
1.105 matthew 1596:
1.30 www 1597: # -------------------------------------------------------- Get parameters again
1.45 matthew 1598:
1599: my %values=&Apache::lonnet::dump('environment',$dom,$crs);
1.140 sakharuk 1600: my $SelectStyleFile=&mt('Select Style File');
1.141 sakharuk 1601: my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
1.30 www 1602: my $output='';
1.45 matthew 1603: if (! exists($values{'con_lost'})) {
1.30 www 1604: my %descriptions=
1.140 sakharuk 1605: ('url' => '<b>'.&mt('Top Level Map').'</b> '.
1.46 matthew 1606: '<a href="javascript:openbrowser'.
1.47 matthew 1607: "('envform','url','sequence')\">".
1.140 sakharuk 1608: &mt('Select Map').'</a><br /><font color=red> '.
1609: &mt('Modification may make assessment data inaccessible').
1610: '</font>',
1611: 'description' => '<b>'.&mt('Course Description').'</b>',
1.158 sakharuk 1612: 'courseid' => '<b>'.&mt('Course ID or number').
1.140 sakharuk 1613: '</b><br />'.
1614: '('.&mt('internal').', '.&mt('optional').')',
1.177 raeburn 1615: 'cloners' => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain)</tt><br />'.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),
1.150 www 1616: 'grading' => '<b>'.&mt('Grading').'</b><br />'.
1617: '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
1.140 sakharuk 1618: 'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
1.52 www 1619: '<a href="javascript:openbrowser'.
1620: "('envform','default_xml_style'".
1.140 sakharuk 1621: ",'sty')\">$SelectStyleFile</a><br>",
1.141 sakharuk 1622: 'question.email' => '<b>'.&mt('Feedback Addresses for Resource Content Question').
1623: '</b><br />(<tt>user:domain,'.
1.74 www 1624: 'user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1625: 'comment.email' => '<b>'.&mt('Feedback Addresses for Course Content Comments').'</b><br />'.
1.74 www 1626: '(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1627: 'policy.email' => '<b>'.&mt('Feedback Addresses for Course Policy').'</b>'.
1.75 albertel 1628: '<br />(<tt>user:domain,user:domain(section;section;...;*;...),...</tt>)',
1.141 sakharuk 1629: 'hideemptyrows' => '<b>'.&mt('Hide Empty Rows in Spreadsheets').'</b><br />'.
1.158 sakharuk 1630: '('.&mt('"[_1]" for default hiding','<tt>yes</tt>').')',
1.141 sakharuk 1631: 'pageseparators' => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
1.158 sakharuk 1632: '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
1.141 sakharuk 1633: &mt('changes will not show until next login').')',
1.169 matthew 1634: 'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b>'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),
1.118 matthew 1635:
1.141 sakharuk 1636: 'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
1637: '</b><br />"<tt>st</tt>": '.
1.158 sakharuk 1638: &mt('student').', "<tt>ta</tt>": '.
1.118 matthew 1639: 'TA, "<tt>in</tt>": '.
1.158 sakharuk 1640: &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
1.118 matthew 1641: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1642: 'plc.users.denied' =>
1.141 sakharuk 1643: '<b>'.&mt('Disallow live chatroom use for Users').'</b><br />'.
1.118 matthew 1644: '(<tt>user:domain,user:domain,...</tt>)',
1645:
1.141 sakharuk 1646: 'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
1647: '</b><br />"<tt>st</tt>": '.
1.61 albertel 1648: 'student, "<tt>ta</tt>": '.
1649: 'TA, "<tt>in</tt>": '.
1.75 albertel 1650: 'instructor;<br /><tt>role,role,...</tt>) '.
1.61 albertel 1651: Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
1.53 www 1652: 'pch.users.denied' =>
1.141 sakharuk 1653: '<b>'.&mt('Disallow Resource Discussion for Users').'</b><br />'.
1.53 www 1654: '(<tt>user:domain,user:domain,...</tt>)',
1.49 matthew 1655: 'spreadsheet_default_classcalc'
1.141 sakharuk 1656: => '<b>'.&mt('Default Course Spreadsheet').'</b> '.
1.50 matthew 1657: '<a href="javascript:openbrowser'.
1658: "('envform','spreadsheet_default_classcalc'".
1.141 sakharuk 1659: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 1660: 'spreadsheet_default_studentcalc'
1.141 sakharuk 1661: => '<b>'.&mt('Default Student Spreadsheet').'</b> '.
1.50 matthew 1662: '<a href="javascript:openbrowser'.
1663: "('envform','spreadsheet_default_calc'".
1.141 sakharuk 1664: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.49 matthew 1665: 'spreadsheet_default_assesscalc'
1.141 sakharuk 1666: => '<b>'.&mt('Default Assessment Spreadsheet').'</b> '.
1.50 matthew 1667: '<a href="javascript:openbrowser'.
1668: "('envform','spreadsheet_default_assesscalc'".
1.141 sakharuk 1669: ",'spreadsheet')\">$SelectSpreadsheetFile</a><br />",
1.75 albertel 1670: 'allow_limited_html_in_feedback'
1.141 sakharuk 1671: => '<b>'.&mt('Allow limited HTML in discussion posts').'</b><br />'.
1.158 sakharuk 1672: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.170 raeburn 1673: 'allow_discussion_post_editing'
1674: => '<b>'.&mt('Allow users to edit/delete their own discussion posts').'</b><br />'.
1675: '('.&mt('Set value to "[_1]" to allow',"<tt>yes</tt>").')',
1.89 albertel 1676: 'rndseed'
1.140 sakharuk 1677: => '<b>'.&mt('Randomization algorithm used').'</b> <br />'.
1678: '<font color="red">'.&mt('Modifying this will make problems').' '.
1679: &mt('have different numbers and answers').'</font>',
1.151 albertel 1680: 'receiptalg'
1681: => '<b>'.&mt('Receipt algorithm used').'</b> <br />'.
1682: &mt('This controls how receipt numbers are generated.'),
1.164 sakharuk 1683: 'suppress_tries'
1684: => '<b>'.&mt('Suppress number of tries in printing').'</b>('.
1685: &mt('yes if supress').')',
1.113 sakharuk 1686: 'problem_stream_switch'
1.141 sakharuk 1687: => '<b>'.&mt('Allow problems to be split over pages').'</b><br />'.
1.158 sakharuk 1688: ' ('.&mt('"[_1]" if allowed, anything else if not','<tt>yes</tt>').')',
1.161 sakharuk 1689: 'default_paper_size'
1690: => '<b>'.&mt('Default paper type').'</b><br />'.
1691: ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.
1692: ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.
1693: ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
1.111 sakharuk 1694: 'anonymous_quiz'
1.150 www 1695: => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.
1.141 sakharuk 1696: ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',
1697: 'default_enrollment_start_date' => '<b>'.&mt('Default beginning date when enrolling students').'</b>',
1698: 'default_enrollment_end_date' => '<b>'.&mt('Default ending date when enrolling students').'</b>',
1.150 www 1699: 'nothideprivileged' => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
1700: '<br />(<tt>user:domain,user:domain,...</tt>)',
1.140 sakharuk 1701: 'languages' => '<b>'.&mt('Languages used').'</b>',
1.115 www 1702: 'disable_receipt_display'
1.141 sakharuk 1703: => '<b>'.&mt('Disable display of problem receipts').'</b><br />'.
1.158 sakharuk 1704: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.163 albertel 1705: 'disablesigfigs'
1706: => '<b>'.&mt('Disable checking of Significant Figures').'</b><br />'.
1707: ' ('.&mt('"[_1]" to disable, anything else if not','<tt>yes</tt>').')',
1.149 albertel 1708: 'tthoptions'
1709: => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'
1.107 matthew 1710: );
1.177 raeburn 1711: my @Display_Order = ('url','description','courseid','cloners','grading',
1.107 matthew 1712: 'default_xml_style','pageseparators',
1713: 'question.email','comment.email','policy.email',
1.169 matthew 1714: 'student_classlist_view',
1.118 matthew 1715: 'plc.roles.denied','plc.users.denied',
1.107 matthew 1716: 'pch.roles.denied','pch.users.denied',
1717: 'allow_limited_html_in_feedback',
1.170 raeburn 1718: 'allow_discussion_post_editing',
1.108 www 1719: 'languages',
1.150 www 1720: 'nothideprivileged',
1.107 matthew 1721: 'rndseed',
1.151 albertel 1722: 'receiptalg',
1.107 matthew 1723: 'problem_stream_switch',
1.164 sakharuk 1724: 'suppress_tries',
1.161 sakharuk 1725: 'default_paper_size',
1.115 www 1726: 'disable_receipt_display',
1.107 matthew 1727: 'spreadsheet_default_classcalc',
1728: 'spreadsheet_default_studentcalc',
1729: 'spreadsheet_default_assesscalc',
1730: 'hideemptyrows',
1731: 'default_enrollment_start_date',
1732: 'default_enrollment_end_date',
1.163 albertel 1733: 'tthoptions',
1734: 'disablesigfigs'
1.107 matthew 1735: );
1736: foreach my $parameter (sort(keys(%values))) {
1.142 raeburn 1737: unless ($parameter =~ m/^internal\./) {
1738: if (! $descriptions{$parameter}) {
1739: $descriptions{$parameter}=$parameter;
1740: push(@Display_Order,$parameter);
1741: }
1742: }
1.43 albertel 1743: }
1.107 matthew 1744: foreach my $parameter (@Display_Order) {
1745: my $description = $descriptions{$parameter};
1.51 matthew 1746: # onchange is javascript to automatically check the 'Set' button.
1.69 www 1747: my $onchange = 'onFocus="javascript:window.document.forms'.
1.107 matthew 1748: "['envform'].elements['".$parameter."_setparmval']".
1.51 matthew 1749: '.checked=true;"';
1.107 matthew 1750: $output .= '<tr><td>'.$description.'</td>';
1751: if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
1752: $output .= '<td>'.
1753: &Apache::lonhtmlcommon::date_setter('envform',
1754: $parameter.'_value',
1755: $values{$parameter},
1756: $onchange).
1757: '</td>';
1758: } else {
1759: $output .= '<td>'.
1760: &Apache::lonhtmlcommon::textbox($parameter.'_value',
1761: $values{$parameter},
1762: 40,$onchange).'</td>';
1763: }
1764: $output .= '<td>'.
1765: &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
1766: '</td>';
1767: $output .= "</tr>\n";
1.51 matthew 1768: }
1.69 www 1769: my $onchange = 'onFocus="javascript:window.document.forms'.
1.51 matthew 1770: '[\'envform\'].elements[\'newp_setparmval\']'.
1771: '.checked=true;"';
1.130 www 1772: $output.='<tr><td><i>'.&mt('Create New Environment Variable').'</i><br />'.
1.51 matthew 1773: '<input type="text" size=40 name="newp_name" '.
1774: $onchange.' /></td><td>'.
1775: '<input type="text" size=40 name="newp_value" '.
1776: $onchange.' /></td><td>'.
1777: '<input type="checkbox" name="newp_setparmval" /></td></tr>';
1.43 albertel 1778: }
1.157 sakharuk 1779: my %lt=&Apache::lonlocal::texthash(
1780: 'par' => 'Parameter',
1781: 'val' => 'Value',
1782: 'set' => 'Set',
1783: 'sce' => 'Set Course Environment'
1784: );
1785:
1.140 sakharuk 1786: my $Parameter=&mt('Parameter');
1787: my $Value=&mt('Value');
1.141 sakharuk 1788: my $Set=&mt('Set');
1.167 albertel 1789: my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset');
1.183 albertel 1790: my $html=&Apache::lonxml::xmlbegin();
1.190 albertel 1791: $r->print(<<ENDenv);
1.183 albertel 1792: $html
1793: <head>
1.46 matthew 1794: <script type="text/javascript" language="Javascript" >
1.155 albertel 1795: $browse_js
1.46 matthew 1796: </script>
1.30 www 1797: <title>LON-CAPA Course Environment</title>
1798: </head>
1.64 www 1799: $bodytag
1.193 albertel 1800: $breadcrumbs
1801: <form method="post" action="/adm/parmset?action=crsenv" name="envform">
1.30 www 1802: $setoutput
1803: <p>
1804: <table border=2>
1.157 sakharuk 1805: <tr><th>$lt{'par'}</th><th>$lt{'val'}</th><th>$lt{'set'}?</th></tr>
1.30 www 1806: $output
1807: </table>
1.157 sakharuk 1808: <input type="submit" name="crsenv" value="$lt{'sce'}">
1.30 www 1809: </form>
1810: </body>
1811: </html>
1.190 albertel 1812: ENDenv
1.30 www 1813: }
1.120 www 1814: ##################################################
1.30 www 1815:
1.124 www 1816: my $tableopen;
1817:
1818: sub tablestart {
1819: if ($tableopen) {
1820: return '';
1821: } else {
1822: $tableopen=1;
1.130 www 1823: return '<table border="2"><tr><th>'.&mt('Parameter').'</th><th>'.
1824: &mt('Delete').'</th><th>'.&mt('Set to ...').'</th></tr>';
1.124 www 1825: }
1826: }
1827:
1828: sub tableend {
1829: if ($tableopen) {
1830: $tableopen=0;
1831: return '</table>';
1832: } else {
1833: return'';
1834: }
1835: }
1836:
1.120 www 1837: sub overview {
1838: my $r=shift;
1839: my $bodytag=&Apache::loncommon::bodytag(
1840: 'Set/Modify Course Assessment Parameters');
1.190 albertel 1841: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1842: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.194 albertel 1843: my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview');
1.183 albertel 1844: my $html=&Apache::lonxml::xmlbegin();
1.120 www 1845: $r->print(<<ENDOVER);
1.183 albertel 1846: $html
1.120 www 1847: <head>
1848: <title>LON-CAPA Course Environment</title>
1849: </head>
1850: $bodytag
1.193 albertel 1851: $breadcrumbs
1852: <form method="post" action="/adm/parmset?action=setoverview" name="overviewform">
1.120 www 1853: <input type="hidden" name="overview" value="1" />
1854: ENDOVER
1.124 www 1855: # Setting
1856: my %olddata=&Apache::lonnet::dump('resourcedata',$dom,$crs);
1857: my %newdata=();
1858: undef %newdata;
1859: my @deldata=();
1860: undef @deldata;
1.190 albertel 1861: foreach (keys %env) {
1.124 www 1862: if ($_=~/^form\.([a-z]+)\_(.+)$/) {
1863: my $cmd=$1;
1864: my $thiskey=$2;
1865: if ($cmd eq 'set') {
1.190 albertel 1866: my $data=$env{$_};
1.124 www 1867: if ($olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; }
1868: } elsif ($cmd eq 'del') {
1869: push (@deldata,$thiskey);
1870: } elsif ($cmd eq 'datepointer') {
1.190 albertel 1871: my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
1.153 albertel 1872: if (defined($data) and $olddata{$thiskey} ne $data) { $newdata{$thiskey}=$data; }
1.124 www 1873: }
1874: }
1875: }
1876: # Store
1.144 www 1877: my $delentries=$#deldata+1;
1878: my @newdatakeys=keys %newdata;
1879: my $putentries=$#newdatakeys+1;
1880: if ($delentries) {
1881: if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
1882: $r->print('<h2>'.&mt('Deleted [_1] parameter(s)</h2>',$delentries));
1883: } else {
1884: $r->print('<h2><font color="red">'.
1885: &mt('Error deleting parameters').'</font></h2>');
1886: }
1887: }
1888: if ($putentries) {
1889: if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
1890: $r->print('<h2>'.&mt('Stored [_1] parameter(s)</h2>',$putentries));
1891: } else {
1892: $r->print('<h2><font color="red">'.
1893: &mt('Error storing parameters').'</font></h2>');
1894: }
1895: }
1.122 www 1896: # Read and display
1897: my %resourcedata=&Apache::lonnet::dump('resourcedata',$dom,$crs);
1898: my $oldsection='';
1899: my $oldrealm='';
1900: my $oldpart='';
1.123 www 1901: my $pointer=0;
1.124 www 1902: $tableopen=0;
1.145 www 1903: my $foundkeys=0;
1.122 www 1904: foreach my $thiskey (sort keys %resourcedata) {
1.123 www 1905: if ($resourcedata{$thiskey.'.type'}) {
1906: my ($course,$middle,$part,$name)=
1907: ($thiskey=~/^(\w+)\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
1.130 www 1908: my $section=&mt('All Students');
1.122 www 1909: if ($middle=~/^\[(.*)\]\./) {
1.130 www 1910: $section=&mt('Group/Section').': '.$1;
1.122 www 1911: $middle=~s/^\[(.*)\]\.//;
1912: }
1.123 www 1913: $middle=~s/\.$//;
1.130 www 1914: my $realm='<font color="red">'.&mt('All Resources').'</font>';
1.122 www 1915: if ($middle=~/^(.+)\_\_\_\(all\)$/) {
1.174 albertel 1916: $realm='<font color="green">'.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' <br /><font color="#aaaaaa" size="-2">('.$1.')</font></font>';
1.122 www 1917: } elsif ($middle) {
1.174 albertel 1918: my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
1919: $realm='<font color="orange">'.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' <br /><font color="#aaaaaa" size="-2">('.$url.' in '.$map.' id: '.$id.')</font></font>';
1.122 www 1920: }
1921: if ($section ne $oldsection) {
1.124 www 1922: $r->print(&tableend()."\n<hr /><h1>$section</h1>");
1.122 www 1923: $oldsection=$section;
1924: $oldrealm='';
1925: }
1926: if ($realm ne $oldrealm) {
1.124 www 1927: $r->print(&tableend()."\n<h2>$realm</h2>");
1.122 www 1928: $oldrealm=$realm;
1929: $oldpart='';
1930: }
1931: if ($part ne $oldpart) {
1.124 www 1932: $r->print(&tableend().
1.130 www 1933: "\n<h3><font color='blue'>".&mt('Part').": $part</font></h3>");
1.122 www 1934: $oldpart=$part;
1935: }
1.123 www 1936: #
1937: # Ready to print
1938: #
1.124 www 1939: $r->print(&tablestart().'<tr><td><b>'.$name.
1940: ':</b></td><td><input type="checkbox" name="del_'.
1941: $thiskey.'" /></td><td>');
1.145 www 1942: $foundkeys++;
1.123 www 1943: if ($resourcedata{$thiskey.'.type'}=~/^date/) {
1944: my $jskey='key_'.$pointer;
1945: $pointer++;
1946: $r->print(
1947: &Apache::lonhtmlcommon::date_setter('overviewform',
1948: $jskey,
1949: $resourcedata{$thiskey}).
1950: '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'
1951: );
1952: } else {
1953: $r->print(
1954: '<input type="text" name="set_'.$thiskey.'" value="'.
1955: $resourcedata{$thiskey}.'">');
1956: }
1.124 www 1957: $r->print('</td></tr>');
1.122 www 1958: }
1.121 www 1959: }
1.124 www 1960:
1.145 www 1961: $r->print(&tableend().'<p>'.
1962: ($foundkeys?'<input type="submit" value="'.&mt('Modify Parameters').'" />':&mt('There are no course or section parameters.')).'</p></form></body></html>');
1.120 www 1963: }
1.121 www 1964:
1.59 matthew 1965: ##################################################
1966: ##################################################
1.178 raeburn 1967:
1968: =pod
1969:
1970: =item change clone
1971:
1972: Modifies the list of courses a user can clone (stored
1973: in the user's environemnt.db file), called when a
1974: change is made to the list of users allowed to clone
1975: a course.
1976:
1977: Inputs: $action,$cloner
1978: where $action is add or drop, and $cloner is identity of
1979: user for whom cloning ability is to be changed in course.
1980:
1981: Returns:
1982:
1983: =cut
1984:
1985: ##################################################
1986: ##################################################
1987:
1988:
1989: sub change_clone {
1990: my ($clonelist,$oldcloner) = @_;
1991: my ($uname,$udom);
1.190 albertel 1992: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
1993: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.178 raeburn 1994: my $clone_crs = $cnum.':'.$cdom;
1995:
1996: if ($cnum && $cdom) {
1997: my @allowclone = ();
1998: if ($clonelist =~ /,/) {
1999: @allowclone = split/,/,$clonelist;
2000: } else {
2001: $allowclone[0] = $clonelist;
2002: }
2003: foreach my $currclone (@allowclone) {
2004: if (!grep/^$currclone$/,@$oldcloner) {
2005: ($uname,$udom) = split/:/,$currclone;
2006: if ($uname && $udom) {
2007: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
2008: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
2009: if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
2010: if ($currclonecrs{'cloneable'} eq '') {
2011: $currclonecrs{'cloneable'} = $clone_crs;
2012: } else {
2013: $currclonecrs{'cloneable'} .= ','.$clone_crs;
2014: }
2015: &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
2016: }
2017: }
2018: }
2019: }
2020: }
2021: foreach my $oldclone (@$oldcloner) {
2022: if (!grep/^$oldclone$/,@allowclone) {
2023: ($uname,$udom) = split/:/,$oldclone;
2024: if ($uname && $udom) {
2025: unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
2026: my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
2027: my %newclonecrs = ();
2028: if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
2029: if ($currclonecrs{'cloneable'} =~ /,/) {
2030: my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
2031: foreach (@currclonecrs) {
2032: unless ($_ eq $clone_crs) {
2033: $newclonecrs{'cloneable'} .= $_.',';
2034: }
2035: }
2036: $newclonecrs{'cloneable'} =~ s/,$//;
2037: } else {
2038: $newclonecrs{'cloneable'} = '';
2039: }
2040: &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
2041: }
2042: }
2043: }
2044: }
2045: }
2046: }
2047: }
2048:
1.193 albertel 2049:
2050: ##################################################
2051: ##################################################
2052:
2053: =pod
2054:
2055: =item * header
2056:
2057: Output html header for page
2058:
2059: =cut
2060:
2061: ##################################################
2062: ##################################################
2063: sub header {
2064: my $html=&Apache::lonxml::xmlbegin();
2065: my $bodytag=&Apache::loncommon::bodytag('Parameter Manager');
2066: my $title = &mt('LON-CAPA Parameter Manager');
2067: return(<<ENDHEAD);
2068: $html
2069: <head>
2070: <title>$title</title>
2071: </head>
2072: $bodytag
2073: ENDHEAD
2074: }
2075: ##################################################
2076: ##################################################
2077: sub print_main_menu {
2078: my ($r,$parm_permission)=@_;
2079: #
2080: $r->print(<<ENDMAINFORMHEAD);
2081: <form method="post" enctype="multipart/form-data"
2082: action="/adm/parmset" name="studentform">
2083: ENDMAINFORMHEAD
2084: #
1.195 albertel 2085: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
2086: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.193 albertel 2087: my @menu =
2088: (
2089: { text => 'Set Course Environment Parameters',
2090: help => 'Course_Setting_Parameters',
2091: action => 'crsenv',
2092: permission => $parm_permission,
2093: },
2094: { text => 'Set/Modify Course Assessment Parameters - Helper Mode',
2095: url => '/adm/helper/parameter.helper',
2096: permission => $parm_permission,
2097: },
2098: { text => 'Modify Course Assessment Parameters - Overview Mode',
2099: action => 'setoverview',
2100: permission => $parm_permission,
2101: },
2102: { text => 'Set/Modify Course Assessment Parameters - Table Mode',
2103: action => 'settable',
2104: permission => $parm_permission,
2105: },
2106: # { text => 'Set Parameter Default Preferences',
2107: # help => 'Course_View_Class_List',
2108: # action => 'setdefaults',
2109: # permission => $parm_permission,
2110: # },
2111: );
2112: my $menu_html = '';
2113: foreach my $menu_item (@menu) {
2114: next if (! $menu_item->{'permission'});
2115: $menu_html.='<p>';
2116: $menu_html.='<font size="+1">';
2117: if (exists($menu_item->{'url'})) {
2118: $menu_html.=qq{<a href="$menu_item->{'url'}">};
2119: } else {
2120: $menu_html.=
2121: qq{<a href="/adm/parmset?action=$menu_item->{'action'}">};
2122: }
2123: $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
2124: if (exists($menu_item->{'help'})) {
2125: $menu_html.=
2126: &Apache::loncommon::help_open_topic($menu_item->{'help'});
2127: }
2128: $menu_html.='</p>'.$/;
2129: }
2130: $r->print($menu_html);
2131: return;
2132: }
2133:
2134:
2135:
2136:
1.178 raeburn 2137: ##################################################
2138: ##################################################
1.30 www 2139:
1.59 matthew 2140: =pod
2141:
1.83 bowersj2 2142: =item * handler
1.59 matthew 2143:
2144: Main handler. Calls &assessparms and &crsenv subroutines.
2145:
2146: =cut
2147: ##################################################
2148: ##################################################
1.85 bowersj2 2149: use Data::Dumper;
1.30 www 2150: sub handler {
1.43 albertel 2151: my $r=shift;
1.30 www 2152:
1.43 albertel 2153: if ($r->header_only) {
1.126 www 2154: &Apache::loncommon::content_type($r,'text/html');
1.43 albertel 2155: $r->send_http_header;
2156: return OK;
2157: }
1.193 albertel 2158: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.194 albertel 2159: ['action','state']);
1.131 www 2160:
2161: # ----------------------------------------------------------- Clear out garbage
2162:
1.132 albertel 2163: %courseopt=();
2164: %useropt=();
2165: %parmhash=();
1.131 www 2166:
1.132 albertel 2167: @ids=();
2168: %symbp=();
2169: %mapp=();
2170: %typep=();
2171: %keyp=();
1.131 www 2172:
1.132 albertel 2173: %maptitles=();
1.83 bowersj2 2174:
1.193 albertel 2175: &Apache::lonhtmlcommon::clear_breadcrumbs();
1.194 albertel 2176: &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
2177: text=>"Parameter Manager",
2178: faq=>9,
2179: bug=>'Instructor Interface'});
1.30 www 2180: # ----------------------------------------------------- Needs to be in a course
1.194 albertel 2181: my $parm_permission =
2182: (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
1.190 albertel 2183: &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
1.193 albertel 2184: $env{'request.course.sec'}));
1.194 albertel 2185: if ($env{'request.course.id'} && $parm_permission) {
1.193 albertel 2186:
2187: # Start Page
1.126 www 2188: &Apache::loncommon::content_type($r,'text/html');
1.106 www 2189: $r->send_http_header;
1.30 www 2190:
1.193 albertel 2191: #
2192: # Main switch on form.action and form.state, as appropriate
2193: #
2194: # Check first if coming from someone else headed directly for
2195: # the table mode
2196: if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
2197: && (!$env{'form.dis'})) || ($env{'form.symb'})) {
2198: &assessparms($r);
2199:
2200: } elsif (! exists($env{'form.action'})) {
2201: $r->print(&header());
1.194 albertel 2202: $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
2203: 'Parameter Manager'));
1.193 albertel 2204: &print_main_menu($r,$parm_permission);
2205: } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) {
1.194 albertel 2206: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv',
2207: text=>"Course Environment"});
2208: $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef,
2209: 'Edit Course Environment'));
1.193 albertel 2210: &crsenv($r);
2211: } elsif ($env{'form.action'} eq 'setoverview' && $parm_permission) {
1.194 albertel 2212: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
2213: text=>"Overview Mode"});
1.121 www 2214: &overview($r);
1.193 albertel 2215: } elsif ($env{'form.action'} eq 'settable' && $parm_permission) {
1.194 albertel 2216: &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
2217: text=>"Table Mode"});
1.121 www 2218: &assessparms($r);
1.193 albertel 2219: }
2220:
1.43 albertel 2221: } else {
1.1 www 2222: # ----------------------------- Not in a course, or not allowed to modify parms
1.190 albertel 2223: $env{'user.error.msg'}=
1.43 albertel 2224: "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
2225: return HTTP_NOT_ACCEPTABLE;
2226: }
2227: return OK;
1.1 www 2228: }
2229:
2230: 1;
2231: __END__
2232:
1.59 matthew 2233: =pod
1.38 harris41 2234:
2235: =back
2236:
2237: =cut
1.1 www 2238:
2239:
2240:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>