--- loncom/interface/lonparmset.pm 2008/11/11 20:12:17 1.414 +++ loncom/interface/lonparmset.pm 2009/03/30 15:57:26 1.439 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.414 2008/11/11 20:12:17 droeschl Exp $ +# $Id: lonparmset.pm,v 1.439 2009/03/30 15:57:26 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,36 +44,11 @@ This module sets coursewide and assessme =head1 INTERNAL SUBROUTINES -=over 4 - -=cut - -################################################################### -################################################################### - -package Apache::lonparmset; - -use strict; -use Apache::lonnet; -use Apache::Constants qw(:common :http REDIRECT); -use Apache::lonhtmlcommon(); -use Apache::loncommon; -use GDBM_File; -use Apache::lonhomework; -use Apache::lonxml; -use Apache::lonlocal; -use Apache::lonnavmaps; -use Apache::longroup; -use Apache::lonrss; -use LONCAPA qw(:DEFAULT :match); - - -################################################## -################################################## +=over =pod -=item parmval +=item parmval() Figure out a cascading parameter. @@ -98,9 +73,282 @@ Returns: A list, the first item is the 2 - Map or Folder level for specific student 1 - resource level for specific student +=item parmval_by_symb() + +=item reset_caches() + +=item cacheparmhash() + +=item parmhash() + +=item symbcache() + +=item preset_defaults() + +=item date_sanity_info() + +=item storeparm() + +Store a parameter by symb + + Takes + - symb + - name of parameter + - level + - new value + - new type + - username + - userdomain + +=item log_parmset() + +=item storeparm_by_symb_inner() + +=item valout() + +Format a value for output. + +Inputs: $value, $type, $editable + +Returns: $value, formatted for output. If $type indicates it is a date, +localtime($value) is returned. +$editable will return an icon to click on + +=item plink() + +Produces a link anchor. + +Inputs: $type,$dis,$value,$marker,$return,$call + +Returns: scalar with html code for a link which will envoke the +javascript function 'pjump'. + +=item page_js() + +=item startpage() + +=item print_row() + +=item print_td() + +=item print_usergroups() + +=item parm_control_group() + +=item extractResourceInformation() : + +Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes. + +Input: See list below: + +=item * B : An array that will contain all of the ids in the course. + +=item * B : hash, id->type, where "type" contains the extension of the file, thus, I. + +=item * B : hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id + +=item * B : hash, name of parameter->display value (what is the display value?) + +=item * B : hash, part identification->text representation of part, where the text representation is "[Part $part]" + +=item * B : hash, full key to part->display value (what's display value?) + +=item * B : hash, ??? + +=item * B : ??? + +=item * B : hash, ??? + +=item * B : ?? + +=item * B : hash, id->full sym? + + + +=item isdateparm() + +=item parmmenu() + +=item partmenu() + +=item usermenu() + +=item displaymenu() + +=item mapmenu() + +=item levelmenu() + +=item sectionmenu() + +=item keysplit() + +=item keysinorder() + +=item keysinorder_bytype() + +=item keysindisplayorder() + +=item standardkeyorder() + +=item assessparms() : + +Show assessment data and parameters. This is a large routine that should +be simplified and shortened... someday. + +Inputs: $r + +Returns: nothing + +Variables used (guessed by Jeremy): + +=item * B: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type. + +=item * B: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts? + +=item * B<@catmarker> contains list of all possible parameters including part #s + +=item * B<$fullkeyp> contains the full part/id # for the extraction of proper parameters + +=item * B<$tempkeyp> contains part 0 only (no ids - ie, subparts) + When storing information, store as part 0 + When requesting information, request from full part + +=item crsenv() + +Show and set course data and parameters. This is a large routine that should +be simplified and shortened... someday. + +Inputs: $r + +Returns: nothing + +=item can_modify_catsettings() + +=item assign_course_categories() + +=item tablestart() + +=item tableend() + +=item extractuser() + +=item parse_listdata_key() + +=item listdata() + +=item date_interval_selector() + +=item get_date_interval_from_form() + +=item default_selector() + +=item string_selector() + +=item dateshift() + +=item newoverview() + +=item secgroup_lister() + +=item overview() + +=item clean_parameters() + +=item date_shift_one() + +=item date_shift_two() + +=item parse_key() + +=item check_cloners() : + +Checks if new users included in list of allowed cloners +are valid users. Replaces supplied list with +cleaned list containing only users with valid usernames +and domains. + +Inputs: $clonelist, $oldcloner +where $clonelist is ref to array of requested cloners, +and $oldcloner is ref to array of currently allowed +cloners. + +Returns: string - comma separated list of requested +cloners (username:domain) who do not exist in system. + +=item change_clone() : + +Modifies the list of courses a user can clone (stored +in the user's environment.db file), called when a +change is made to the list of users allowed to clone +a course. + +Inputs: $action,$cloner +where $action is add or drop, and $cloner is identity of +user for whom cloning ability is to be changed in course. + + +=item check_cloners() + +=item change_clone() + +=item header() + +Output html header for page + +=item print_main_menu() + +=item output_row() + +Set portfolio metadata + +=item order_meta_fields() + +=item addmetafield() + +=item setrestrictmeta() + +=item get_added_meta_fieldnames() + +=item get_deleted_meta_fieldnames() + +=item defaultsetter() + +=item components() + +=item load_parameter_names() + +=item parm_change_log() + +=item handler() : + +Main handler. Calls &assessparms and &crsenv subroutines. + + +=back + =cut -################################################## +################################################################### +################################################################### + +package Apache::lonparmset; + +use strict; +use Apache::lonnet; +use Apache::Constants qw(:common :http REDIRECT); +use Apache::lonhtmlcommon(); +use Apache::loncommon; +use GDBM_File; +use Apache::lonhomework; +use Apache::lonxml; +use Apache::lonlocal; +use Apache::lonnavmaps; +use Apache::longroup; +use Apache::lonrss; +use LONCAPA qw(:DEFAULT :match); + + sub parmval { my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec, @@ -302,6 +550,8 @@ sub reset_caches { } } + + sub preset_defaults { my $type=shift; if (&rulescache($type.'_action') eq 'default') { @@ -316,7 +566,8 @@ sub preset_defaults { } } -################################################## + + sub date_sanity_info { my $checkdate=shift; @@ -371,17 +622,6 @@ sub storeparm { &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup); } -# -# Store a parameter by symb -# -# Takes -# - symb -# - name of parameter -# - level -# - new value -# - new type -# - username -# - userdomain my %recstack; sub storeparm_by_symb { my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_; @@ -536,25 +776,7 @@ sub storeparm_by_symb_inner { return ''; } -################################################## -################################################## - -=pod - -=item valout - -Format a value for output. - -Inputs: $value, $type, $editable - -Returns: $value, formatted for output. If $type indicates it is a date, -localtime($value) is returned. -$editable will return an icon to click on - -=cut -################################################## -################################################## sub valout { my ($value,$type,$editable)=@_; my $result = ''; @@ -611,24 +833,7 @@ sub valout { return $result; } -################################################## -################################################## - -=pod -=item plink - -Produces a link anchor. - -Inputs: $type,$dis,$value,$marker,$return,$call - -Returns: scalar with html code for a link which will envoke the -javascript function 'pjump'. - -=cut - -################################################## -################################################## sub plink { my ($type,$dis,$value,$marker,$return,$call)=@_; my $winvalue=$value; @@ -643,12 +848,13 @@ sub plink { my ($hour,$min,$sec,$val)=&preset_defaults($parmname); unless (defined($winvalue)) { $winvalue=$val; } my $valout = &valout($value,$type,1); + my $unencmarker = $marker; foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call, \$hour, \$min, \$sec) { $$item = &HTML::Entities::encode($$item,'"<>&'); $$item =~ s/\'/\\\'/g; } - return ''); - } else { + } else { $parm=~s|\[.*\]\s||g; } my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers'); if ($automatic) { $parm.='
'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'
'; } - $r->print(''); + $r->print(''); my $thismarker=$which; $thismarker=~s/^parameter\_//; @@ -851,14 +1057,14 @@ sub print_row { } } # end of $parmlev if/else - $r->print(''); + $r->print(''); if ($parmlev eq 'full') { my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}. '.'.$$name{$which},$$symbp{$rid}); my $sessionvaltype=$typeoutpar[$result]; if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; } - $r->print(''); } @@ -868,14 +1074,22 @@ sub print_row { sub print_td { my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_; - $r->print(''."\n"); } @@ -895,11 +1109,11 @@ sub print_usergroups { my $grp_parm; if (($coursereply) && ($cgroup ne $resultgroup)) { if ($result > 3) { - $bgcolor = '"#AAFFAA"'; + $bgcolor = '#AAFFAA'; $grp_parm = &valout($coursereply,$resulttype); } $grp_parm = &valout($coursereply,$resulttype); - $output = ''; } else { - $output .= ''; + $output .= ''; } return ($coursereply,$output,$grp_parm,$resultgroup); } @@ -936,39 +1150,7 @@ sub parm_control_group { return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype); } -=pod - -=item B: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes. - -Input: See list below: - -=over 4 - -=item B: An array that will contain all of the ids in the course. - -=item B: hash, id->type, where "type" contains the extension of the file, thus, I. - -=item B: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id -=item B: hash, name of parameter->display value (what is the display value?) - -=item B: hash, part identification->text representation of part, where the text representation is "[Part $part]" - -=item B: hash, full key to part->display value (what's display value?) - -=item B: hash, ??? - -=item B: ??? - -=item B: hash, ??? - -=item B: ?? - -=item B: hash, id->full sym? - -=back - -=cut sub extractResourceInformation { my $ids = shift; @@ -1008,9 +1190,15 @@ sub extractResourceInformation { # my $name=&Apache::lonnet::metadata($srcf,$key.'.name'); if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) { - my $display= &Apache::lonnet::metadata($srcf,$key.'.display'); - my $parmdis = $display; - $parmdis =~ s/\s*\[Part.*$//g; + my ($display,$parmdis); + $display = &standard_parameter_names($name); + if ($display eq '') { + $display= &Apache::lonnet::metadata($srcf,$key.'.display'); + $parmdis = $display; + $parmdis =~ s/\s*\[Part.*$//g; + } else { + $parmdis = $display; + } $$allparms{$name}=$parmdis; if (ref($defkeytype)) { $$defkeytype{$name}= @@ -1062,8 +1250,6 @@ sub extractResourceInformation { } -################################################## -################################################## sub isdateparm { my $type=shift; @@ -1136,17 +1322,17 @@ sub parmmenu { ENDSCRIPT $r->print(); - $r->print("\n
'. + return '
'. ''. $valout.'
'; @@ -730,10 +936,10 @@ sub startpage { $start_page $breadcrumbs
- - - - + + + + ENDHEAD } @@ -765,16 +971,16 @@ sub print_row { my $parm=$$display{$which}; if ($parmlev eq 'full') { - $r->print('
' + $r->print('' .$$part{$which}.''.$parm.''.$parm.''.$effective_parm.''.$effective_parm.''. + $r->print(''. &valout($sessionval,$sessionvaltype).' '. ''); - if ($which<11 || $which > 12) { - $r->print(&plink($$typeoutpar[$which], - $$display{$value},$$outpar[$which], - $mprefix."$which",'parmform.pres','psub')); + $r->print(''); + my $nolink = 0; + if ($which == 11 || $which == 12) { + $nolink = 1; + } elsif ($mprefix =~ /availablestudent\&$/) { + if ($which > 3) { + $nolink = 1; + } + } + if ($nolink) { + $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); } else { - $r->print(&valout($$outpar[$which],$$typeoutpar[$which])); + $r->print(&plink($$typeoutpar[$which], + $$display{$value},$$outpar[$which], + $mprefix."$which",'parmform.pres','psub')); } $r->print(''; + $output = ''; if ($resultgroup && $resultlevel) { $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm; } else { @@ -907,7 +1121,7 @@ sub print_usergroups { } $output .= '  
"); + $r->print("\n".'
'); my $cnt=0; foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) { - $r->print("\n'); + $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey} + : $tempkey) + .''); $cnt++; if ($cnt==3) { $r->print("\n"); @@ -1154,7 +1340,7 @@ ENDSCRIPT } } $r->print('' - .'' + .'' .'
' .'
'.&mt('Parameter Selection').'' .'' @@ -1197,7 +1383,7 @@ ENDSCRIPT sub partmenu { my ($r,$allparts,$psprt)=@_; - $r->print(''); $r->print(''); @@ -1361,7 +1547,7 @@ sub sectionmenu { my %sectionhash = &Apache::loncommon::get_sections(); return if (!%sectionhash); - $r->print(''); foreach my $s ('all',sort keys %sectionhash) { $r->print('
'); &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder); } else { my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb); @@ -1716,9 +1907,9 @@ sub assessparms { $coursespan += 3; } - $r->print('

'); - $r->print(''); - $r->print(''); + $r->print('

'.&mt('Any User').'
'); + $r->print(''); + $r->print(''); if ($uname) { if (@usersgroups > 1) { $userspan ++; @@ -1744,18 +1935,18 @@ sub assessparms { 'fr' => 'for Resource' ); $r->print(<$lt{'pie'} - - - + + + + ENDTABLETWO if ($csec) { - $r->print(""); } if ($cgroup) { - $r->print(""); } $r->print(<0) { my $firstrow=1; my $title=&Apache::lonnet::gettitle($symbp{$rid}); - $r->print(''); - $r->print(''); - $r->print(''); @@ -1880,9 +2080,9 @@ ENDTABLEHEADFOUR } # end of full #--------------------------------------------------- Entry for parm level map if ($parmlev eq 'map') { - my $defbgone = '"E0E099"'; - my $defbgtwo = '"FFFF99"'; - my $defbgthree = '"FFBB99"'; + my $defbgone = '#E0E099'; + my $defbgtwo = '#FFFF99'; + my $defbgthree = '#FFBB99'; my %maplist; @@ -1933,7 +2133,16 @@ ENDTABLEHEADFOUR if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { $part{$tempkeyp}="0"; $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); - $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + if ($allparms{$name{$tempkeyp}} ne '') { + my $identifier; + if ($parmdis =~ /(\s*\[Part.*)$/) { + $identifier = $1; + } + $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier; + } else { + $display{$tempkeyp} = $parmdis; + } unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; $display{$tempkeyp} =~ s/_\w+_/_0_/; @@ -1970,27 +2179,32 @@ ENDTABLEHEADFOUR ,''.$coursename.'' ) ."
\n" - ); + ); #---------------------------------------------------------------- print table - $r->print('

'.&mt('Any User').'$lt{'csv'}
($csuname $lt{'at'} $csudom)
$lt{'ic'}$lt{'rl'}$lt{'ic'}$lt{'pie'}$lt{'csv'}
($csuname $lt{'at'} $csudom)
$lt{'ic'}$lt{'rl'}$lt{'ic'}". + $r->print(''. &mt("in Section")." $csec". + $r->print(''. &mt("in Group")." $cgroup
'. + '>'. join(' / ',split(/\//,$uri)). '

'. "print(' ('.$thistitle.')'); } $r->print('

'.$typep{$rid}. ''.$maptitles{$mapp{$rid}}.'
'); - $r->print(''); - $r->print(''); - $r->print(''); + $r->print('

'.&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'

' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row() + ); foreach (&keysinorder(\%name,\%keyorder)) { - $r->print(''); + $r->print(&Apache::loncommon::start_data_table_row()); &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$defbgthree, $parmlev,$uname,$udom,$csec,$cgroup); } - $r->print("
'.&mt('Parameter Name').''.&mt('Default Value').''.&mt('Parameter in Effect').'
'.&mt('Parameter Name').''.&mt('Default Value').''.&mt('Parameter in Effect').'
"); + $r->print(&Apache::loncommon::end_data_table().'

' + .'' + ); } # end each map } # end of $parmlev eq map #--------------------------------- Entry for parm level general (Course level) if ($parmlev eq 'general') { - my $defbgone = '"E0E099"'; - my $defbgtwo = '"FFFF99"'; - my $defbgthree = '"FFBB99"'; + my $defbgone = '#E0E099'; + my $defbgtwo = '#FFFF99'; + my $defbgthree = '#FFBB99'; #-------------------------------------------- for each map, gather information my $mapid="0.0"; @@ -2021,7 +2235,16 @@ ENDTABLEHEADFOUR if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) { $part{$tempkeyp}="0"; $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name'); - $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display'); + if ($allparms{$name{$tempkeyp}} ne '') { + my $identifier; + if ($parmdis =~ /(\s*\[Part.*)$/) { + $identifier = $1; + } + $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier; + } else { + $display{$tempkeyp} = $parmdis; + } unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; } $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')'; $display{$tempkeyp} =~ s/_\w+_/_0_/; @@ -2034,7 +2257,8 @@ ENDTABLEHEADFOUR #---------------------------------------------------- print header information my $setdef=&mt("Set Defaults for All Resources in Course"); $r->print(<

$setdef +
+

$setdef $coursename
ENDMAPONE if ($uname) { @@ -2048,42 +2272,31 @@ ENDMAPONE if ($cgroup) {$r->print(&mt("Group")." $cgroup\n")}; $r->print("

\n"); #---------------------------------------------------------------- print table - $r->print('

'); - $r->print(''); - $r->print(''); - $r->print(''); + $r->print('

'.&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'

' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row() + ); foreach (&keysinorder(\%name,\%keyorder)) { - $r->print(''); + $r->print(&Apache::loncommon::start_data_table_row()); &print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default, \%type,\%display,$defbgone,$defbgtwo,$defbgthree, $parmlev,$uname,$udom,$csec,$cgroup); } - $r->print("
'.&mt('Parameter Name').''.&mt('Default Value').''.&mt('Parameter in Effect').'
'.&mt('Parameter Name').''.&mt('Default Value').''.&mt('Parameter in Effect').'

"); + $r->print(&Apache::loncommon::end_data_table() + .'

' + .'' + ); } # end of $parmlev eq general } $r->print(''.&Apache::loncommon::end_page()); } # end sub assessparms -################################################## -################################################## - -=pod - -=item crsenv - -Show and set course data and parameters. This is a large routine that should -be simplified and shortened... someday. - -Inputs: $r - -Returns: nothing -=cut - -################################################## -################################################## sub crsenv { my $r=shift; my $setoutput=''; @@ -2096,6 +2309,7 @@ sub crsenv { my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my (%crsinfo,$chome); + my $crstype = &Apache::loncommon::course_type(); # # Go through list of changes @@ -2106,6 +2320,23 @@ sub crsenv { if ($name eq 'newp') { $name = $env{'form.newp_name'}; } + if ($name =~ /^rolenames_([^_]+)$/) { + $name = $1.'.plaintext'; + my $standardtitle = + &Apache::lonnet::plaintext($1,$crstype,$env{'request.course.id'},1); + my %adv_roles = + &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1); + if ($value ne '') { + foreach my $role (keys(%adv_roles)) { + if ($role =~ m{^cr/$match_domain/$match_name/\Q$value\E$}) { + $setoutput.= ''. + &mt('Requested replacement title for [_1] role is already used as the name of a custom role ([_2]).',$standardtitle,$value). + '
'; + undef($value); + } + } + } + } if ($name eq 'url') { $value=~s/^\/res\///; my $bkuptime=time; @@ -2156,12 +2387,12 @@ sub crsenv { my ($name,$domain) = split(':',$user); if (!defined($user) || !defined($domain)) { $setoutput.= '
'. - &mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user). + &mt("Invalid e-mail address specified, address must be of the form username:domain what was specified was ([_1])",$user). ''; undef($value); } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') { $setoutput.= '
'. - &mt("Invalid email address specified, user [_1] is unknown.",$name). + &mt("Invalid e-mail address specified, user [_1] is unknown.",$name). ''; undef($value); } @@ -2281,7 +2512,14 @@ sub crsenv { my $SelectStyleFile=&mt('Select Style File'); my $SelectSpreadsheetFile=&mt('Select Spreadsheet File'); my $output=''; + my $output_SB = ''; # will be replaced by "$output" when all changes are done my $can_categorize; + my %lt=&Apache::lonlocal::texthash( + 'par' => 'Parameter', + 'val' => 'Value', + 'set' => 'Set?', + 'sav' => 'Save', + ); if (! exists($values{'con_lost'})) { my %descriptions= ('url' => ''.&mt('Top Level Map').'
'. @@ -2325,15 +2563,15 @@ sub crsenv { 'student_classlist_view' => ''.&mt('Allow students to view classlist.').'
' .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"all"','"section"','"disabled"').')', 'student_classlist_portfiles' => ''.&mt('Include link to accessible portfolio files').'
' - .'('.&mt('[_1] for link to each a listing of each student\'s files.','"yes"').')', + .'('.&mt("[_1] for link to each a listing of each student's files.",'"yes"').')', 'student_classlist_opt_in' => ''.&mt("Student's agreement needed for listing in student-viewable roster").'
' .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"yes"').')', - 'plc.roles.denied'=> ''.&mt('Disallow live chatroom use for Roles').'
' + 'plc.roles.denied'=> ''.&mt('Disallow chat room use for Roles').'
' .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"').')
' .'("'.&mt('role,role,...').'") ' .Apache::loncommon::help_open_topic("Course_Disable_Discussion"), 'plc.users.denied' => - ''.&mt('Disallow live chatroom use for Users').'
'. + ''.&mt('Disallow chat room use for Users').'
'. '("'.&mt('user:domain,user:domain,...').'")', 'pch.roles.denied'=> ''.&mt('Disallow Resource Discussion for Roles').'
' @@ -2408,11 +2646,11 @@ sub crsenv { 'externalsyllabus' => ''.&mt('URL of Syllabus (not using internal handler)').'', 'tthoptions' - => ''.&mt('Default set of options to pass to tth/m when converting tex').'', + => ''.&mt('Default set of options to pass to tth/m when converting TeX').'', 'texengine' => ''.&mt('Force all students in the course to use a specific math rendering engine.').'
' - .'('.&mt('[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student\'s preference','"jsMath"','"mimetex"','"tth"').')', + .'('.&mt("[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student's preference",'"jsMath"','"mimetex"','"tth"').')', 'timezone' => ''.&mt('Timezone in which the course takes place').'', @@ -2427,69 +2665,91 @@ sub crsenv { &mt('Display Categories').'', 'datelocale' => ''.&mt('Locale used for course calendar').'', + 'rolenames' + => ''.&mt('Replacement titles for standard course roles').'
'. + '('.&mt('To replace the standard title for a course role, enter the title you wish to use, otherwise leave blank.').')', ); - my @Display_Order = ('url','description','courseid','cloners'); - (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom); - if ($can_toggle_cat) { - push(@Display_Order,'hidefromcat'); - } - if ($can_categorize) { - push(@Display_Order,'categories'); - } - push (@Display_Order,('grading', - 'externalsyllabus', - 'default_xml_style','pageseparators', - 'question.email','question.email.text','comment.email', - 'comment.email.text','policy.email','policy.email.text', - 'student_classlist_view', - 'student_classlist_opt_in', - 'student_classlist_portfiles', - 'plc.roles.denied','plc.users.denied', - 'pch.roles.denied','pch.users.denied', - 'allow_limited_html_in_feedback', - 'allow_discussion_post_editing', - 'languages', - 'timezone', - 'datelocale', - 'nothideprivileged', - 'rndseed', - 'receiptalg', - 'problem_stream_switch', - 'suppress_tries', - 'suppress_embed_prompt', - 'default_paper_size', - 'print_header_format', - 'disable_receipt_display', - 'spreadsheet_default_classcalc', - 'spreadsheet_default_studentcalc', - 'spreadsheet_default_assesscalc', - 'hideemptyrows', - 'default_enrollment_start_date', - 'default_enrollment_end_date', - 'tthoptions', - 'texengine', - 'disablesigfigs', - 'disableexampointprint', - 'task_messages','task_grading')); - foreach my $parameter (sort(keys(%values))) { - unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) || - ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/) - || ($parameter eq 'type')) { - if (! $descriptions{$parameter}) { - $descriptions{$parameter}=$parameter; - push(@Display_Order,$parameter); - } - } - } - - foreach my $parameter (@Display_Order) { - my $description = $descriptions{$parameter}; - # onchange is javascript to automatically check the 'Set' button. - my $onchange = 'onFocus="javascript:window.document.forms'. - "['envform'].elements['".$parameter."_setparmval']". - '.checked=true;"'; - $output .= &Apache::loncommon::start_data_table_row(). - ''.$description.''; + + +# The following code is kept to have access to the old version of display order + +# my @Display_Order = ('url','description','courseid','cloners'); +# (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom); +# if ($can_toggle_cat) { +# push(@Display_Order,'hidefromcat'); +# } +# if ($can_categorize) { +# push(@Display_Order,'categories'); +# } +# push (@Display_Order,('grading', +# 'externalsyllabus', +# 'default_xml_style','pageseparators', +# 'question.email','question.email.text','comment.email', +# 'comment.email.text','policy.email','policy.email.text', +# 'student_classlist_view', +# 'student_classlist_opt_in', +# 'student_classlist_portfiles', +# 'plc.roles.denied','plc.users.denied', +# 'pch.roles.denied','pch.users.denied', +# 'allow_limited_html_in_feedback', +# 'allow_discussion_post_editing', +# 'languages', +# 'timezone', +# 'datelocale', +# 'rolenames', +# 'nothideprivileged', +# 'rndseed', +# 'receiptalg', +# 'problem_stream_switch', +# 'suppress_tries', +# 'suppress_embed_prompt', +# 'default_paper_size', +# 'print_header_format', +# 'disable_receipt_display', +# 'spreadsheet_default_classcalc', +# 'spreadsheet_default_studentcalc', +# 'spreadsheet_default_assesscalc', +# 'hideemptyrows', +# 'default_enrollment_start_date', +# 'default_enrollment_end_date', +# 'tthoptions', +# 'texengine', +# 'disablesigfigs', +# 'disableexampointprint', +# 'task_messages','task_grading')); +# foreach my $parameter (sort(keys(%values))) { +# unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) || +# ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/) +# || ($parameter eq 'type') || +# ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) { +# if (! $descriptions{$parameter}) { +# $descriptions{$parameter}=$parameter; +# push(@Display_Order,$parameter); +# } +# } +# } + + + + +# ---------------------------------------------------------------- +# Begin: New Version with Parameter Categories + + sub parameter_row { + # Create parameter line for course environment screen + my ($parameter, $description) = @_; + my $output = ''; + + # Column 1/3: Descritive text of current parameter + $output = &Apache::loncommon::start_data_table_row() + .''.$description.''; + + # Column 2/3: Input field (Sometimes special field(s), depending on parameter) +# ------------------------------- + # onchange is javascript to automatically check the 'Set' button. + my $onchange = 'onFocus="javascript:window.document.forms' + ."['envform'].elements['".$parameter."_setparmval']" + .'.checked=true;"'; if ($parameter =~ /^default_enrollment_(start|end)_date$/) { $output .= ''. &Apache::lonhtmlcommon::date_setter('envform', @@ -2514,7 +2774,27 @@ sub crsenv { $output .= ''. &Apache::loncommon::select_datelocale($parameter.'_value', $currdatelocale, - $onchange,$includeempty).''; + $onchange,$includeempty).''; + } elsif ($parameter eq 'rolenames') { + $output.= ''; + foreach my $role ('cc','in','ta','ep','ad','st') { + my $onchange = 'onFocus="javascript:window.document.forms'. + "['envform'].elements['". + $parameter.'_'.$role."_setparmval']". + '.checked=true;"'; + $output.= ''; + } + $output .= '
'.&Apache::lonnet::plaintext($role,$crstype,undef,1). + ''. + &Apache::lonhtmlcommon::textbox($parameter.'_'.$role.'_value', + $values{$role.'.plaintext'}, + 15,$onchange). + '
'; + foreach my $role ('cc','in','ta','ep','ad','st') { + $output .= ''; + } + $output .= '
'.&Apache::lonhtmlcommon::checkbox($parameter.'_'.$role.'_setparmval'). + '
'; } elsif ($parameter eq 'categories') { my $catdisplay; if ($values{'categories'} ne '') { @@ -2530,35 +2810,306 @@ sub crsenv { $values{'categories'}.'" />'. ''; - } else { - $output .= ''. - &Apache::lonhtmlcommon::textbox($parameter.'_value', - $values{$parameter}, - 40,$onchange).''; - } - $output .= ''. - &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval'). - ''; - $output .= &Apache::loncommon::end_data_table_row()."\n"; - } + } else { # Display default textbox in all other cases + $output .= '' + .&Apache::lonhtmlcommon::textbox($parameter.'_value', + $values{$parameter}, + 40, + $onchange) + .''; +# ------------------------------- + } + + # Column 3/3: Check Box (in most cases) + unless ($parameter eq 'rolenames') { + $output .= '' + .&Apache::lonhtmlcommon::checkbox($parameter.'_setparmval') + .''; + } + $output .= &Apache::loncommon::end_data_table_row(); + + return $output; + } + + + + + # Parameter Category Names + my %parm_cat_names = &Apache::lonlocal::texthash ( + 'cat_0' => 'Parameter Category Zero', + 'cat_1' => 'Parameter Category One', + 'cat_2' => 'Parameter Category Two', + 'cat_3' => 'Parameter Category Three', + 'cat_4' => 'Parameter Category Four', + 'cat_5' => 'Parameter Category Five', + 'cat_6' => 'Parameter Category Six', + 'cat_7' => 'Parameter Category Seven', + 'cat_can' => 'Parameter Category Can', + 'cat_custom' => 'Parameter Category Custom', + ); + + # Link Parameter Categories with Parameters + my %parm_cat_parms = ( + 'cat_0' => [ + 'url', + 'description', + 'courseid', + 'cloners' + ], + 'cat_1' => [ + 'grading', + 'externalsyllabus', + 'default_xml_style', + 'pageseparators' + ], + 'cat_2' => [ + 'question.email', + 'question.email.text', + 'comment.email', + 'comment.email.text', + 'policy.email', + 'policy.email.text', + ], + 'cat_3' => [ + 'student_classlist_view', + 'student_classlist_opt_in', + 'student_classlist_portfiles', + 'plc.roles.denied', + 'plc.users.denied', + 'pch.roles.denied', + 'pch.users.denied', + 'allow_limited_html_in_feedback', + 'allow_discussion_post_editing', + ], + 'cat_4' => [ + 'languages', + 'timezone', + 'datelocale', + 'rolenames', + 'nothideprivileged', + 'rndseed', + 'receiptalg', + 'problem_stream_switch', + 'suppress_tries', + 'suppress_embed_prompt', + 'default_paper_size', + 'print_header_format', + 'disable_receipt_display', + ], + 'cat_5' => [ + 'spreadsheet_default_classcalc', + 'spreadsheet_default_studentcalc', + 'spreadsheet_default_assesscalc', + 'hideemptyrows', + ], + 'cat_6' => [ + 'default_enrollment_start_date', + 'default_enrollment_end_date', + ], + 'cat_7' => [ + 'tthoptions', + 'texengine', + 'disablesigfigs', + 'disableexampointprint', + 'task_messages', + 'task_grading', + ], + ); + + # Add special parameters depending on special context to parameter categories hash + my @can_cats; + (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom); + if ($can_toggle_cat) { + push(@can_cats,'hidefromcat'); + } + if ($can_categorize) { + push(@can_cats,'categories'); + } + $parm_cat_parms{'cat_can'} = [@can_cats]; + + # Add custom parameters to parameter categories hash + my @custom_cats; + foreach my $parameter (sort(keys(%values))) { + unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) || + ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/) + || ($parameter eq 'type') || + ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) { + if (! $descriptions{$parameter}) { + $descriptions{$parameter}=$parameter; + push(@custom_cats,$parameter); + } + } + } + $parm_cat_parms{'cat_custom'} = [@custom_cats]; + + +# Old output structure: + +#$start_table +#$start_header_row +#$lt{'par'}$lt{'val'}$lt{'set'} +#$end_header_row +#$output +#$end_table + + +# Display Parameter List Overview +# Provide hyperlinks to detailed parameter settings +$output_SB .= '' + .'

'.&mt('Course Parameter Overview').'

' + .'
'; + + +# Display Parameter Details +my $buttons=''; + +$output_SB .= '

'.&mt('Course Parameters').'

'; + +foreach my $catkey (keys(%parm_cat_names)) { + $output_SB .= &Apache::loncommon::start_data_table(); + $output_SB .= &Apache::loncommon::start_data_table_empty_row() + .'' + .'' + .'

'.$parm_cat_names{$catkey}.'

' + .'' + .&Apache::loncommon::end_data_table_empty_row + .&Apache::loncommon::start_data_table_header_row() + .''.$lt{'par'}.''.$lt{'val'}.''.$lt{'set'}.'' + .&Apache::loncommon::end_data_table_header_row(); + + foreach my $parameter (@{$parm_cat_parms{$catkey}}) { + my $description = $descriptions{$parameter}; + $output_SB .= ¶meter_row($parameter, $description); + } + $output_SB .= &Apache::loncommon::start_data_table_empty_row() + .'' + .$buttons + .'' + .&Apache::loncommon::end_data_table_empty_row; + $output_SB .= &Apache::loncommon::end_data_table() + . '
'; +} + +$output_SB .= ''; + +# End: New Version with Parameter Categories +# ---------------------------------------------------------------- + + +# # Display Parameter table +# foreach my $parameter (@Display_Order) { +# my $description = $descriptions{$parameter}; +# # onchange is javascript to automatically check the 'Set' button. +# my $onchange = 'onFocus="javascript:window.document.forms'. +# "['envform'].elements['".$parameter."_setparmval']". +# '.checked=true;"'; +# $output .= &Apache::loncommon::start_data_table_row(). +# ''.$description.''; +# +# +# +## ------------------------------- +# if ($parameter =~ /^default_enrollment_(start|end)_date$/) { +# $output .= ''. +# &Apache::lonhtmlcommon::date_setter('envform', +# $parameter.'_value', +# $values{$parameter}, +# $onchange). +# ''; +# } elsif ($parameter eq 'timezone') { +# my $includeempty = 1; +# my $timezone = &Apache::lonlocal::gettimezone(); +# $output .= ''. +# &Apache::loncommon::select_timezone($parameter.'_value', +# $timezone, +# $onchange,$includeempty).''; +# } elsif ($parameter eq 'datelocale') { +# my $includeempty = 1; +# my $locale_obj = &Apache::lonlocal::getdatelocale(); +# my $currdatelocale; +# if (ref($locale_obj)) { +# $currdatelocale = $locale_obj->id(); +# } +# $output .= ''. +# &Apache::loncommon::select_datelocale($parameter.'_value', +# $currdatelocale, +# $onchange,$includeempty).''; +# } elsif ($parameter eq 'rolenames') { +# $output.= ''; +# foreach my $role ('cc','in','ta','ep','ad','st') { +# my $onchange = 'onFocus="javascript:window.document.forms'. +# "['envform'].elements['". +# $parameter.'_'.$role."_setparmval']". +# '.checked=true;"'; +# $output.= ''; +# } +# $output .= '
'.&Apache::lonnet::plaintext($role,$crstype,undef,1). +# ''. +# &Apache::lonhtmlcommon::textbox($parameter.'_'.$role.'_value', +# $values{$role.'.plaintext'}, +# 15,$onchange). +# '
'; +# foreach my $role ('cc','in','ta','ep','ad','st') { +# $output .= ''; +# } +# $output .= '
'.&Apache::lonhtmlcommon::checkbox($parameter.'_'.$role.'_setparmval'). +# '
'; +# } elsif ($parameter eq 'categories') { +# my $catdisplay; +# if ($values{'categories'} ne '') { +# my @curritems = split(/\&/,$values{'categories'}); +# foreach my $item (@curritems) { +# my ($name,$parent,$pos) = split(/:/,$item); +# $catdisplay .= &unescape($name).'&'; +# } +# $catdisplay =~ s/\&$//; +# } +# $output .= ''. +# ''. +# ''; +# } else { +# $output .= ''. +# &Apache::lonhtmlcommon::textbox($parameter.'_value', +# $values{$parameter}, +# 40,$onchange).''; +# } +# ------------------------------- + + +# unless ($parameter eq 'rolenames') { +# $output .= ''. +# &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval'). +# ''; +# } +# $output .= &Apache::loncommon::end_data_table_row()."\n"; +# } my $onchange = 'onFocus="javascript:window.document.forms'. '[\'envform\'].elements[\'newp_setparmval\']'. '.checked=true;"'; $output.=&Apache::loncommon::start_data_table_row(). ''.&mt('Create New Environment Variable').'
'. - ''. - ''. ''. &Apache::loncommon::end_data_table_row()."\n"; } - my %lt=&Apache::lonlocal::texthash( - 'par' => 'Parameter', - 'val' => 'Value', - 'set' => 'Set?', - 'sav' => 'Save' - ); my $Parameter=&mt('Parameter'); my $Value=&mt('Value'); @@ -2591,6 +3142,8 @@ $start_page $breadcrumbs
$setoutput +$output_SB +
$start_table $start_header_row @@ -2968,7 +3521,7 @@ sub listdata { } if ($part ne $oldpart) { $r->print(&tableend(). - "\n".&mt('Part').": $part"); + "\n".''.&mt('Part').": $part"); $oldpart=$part; } # @@ -3003,7 +3556,7 @@ sub listdata { $r->print(&default_selector($thiskey,$$resourcedata{$thiskey})); } $r->print(''); + $thistype.'" />'); $r->print(''.&Apache::loncommon::end_data_table_row()); } } @@ -3315,7 +3868,7 @@ ENDOVER my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder); $r->print(&tableend().'

'. - ($foundkeys?'':&mt('There are no parameters.')).'

'. + ($foundkeys?'':&mt('There are no parameters.')).'

'. &Apache::loncommon::end_page()); } @@ -3346,7 +3899,7 @@ ENDOVER $r->print('

'. &mt('These parameters refer to resources that do not exist.'). '

'. - ''.'
'. + ''.'
'. '
'); $r->print(&Apache::loncommon::start_data_table(). ''. @@ -3399,7 +3952,7 @@ ENDOVER } } $r->print(&Apache::loncommon::end_data_table().'

'. - ''. + ''. '

'. &Apache::loncommon::end_page()); } @@ -3492,41 +4045,7 @@ sub parse_key { return %data; } -################################################## -################################################## -=pod - -=item check_cloners - -Checks if new users included in list of allowed cloners -are valid users. Replaces supplied list with -cleaned list containing only users with valid usernames -and domains. - -Inputs: $clonelist, $oldcloner -where $clonelist is ref to array of requested cloners, -and $oldcloner is ref to array of currently allowed -cloners. - -Returns: string - comma separated list of requested -cloners (username:domain) who do not exist in system. - -=item change_clone - -Modifies the list of courses a user can clone (stored -in the user's environment.db file), called when a -change is made to the list of users allowed to clone -a course. - -Inputs: $action,$cloner -where $action is add or drop, and $cloner is identity of -user for whom cloning ability is to be changed in course. - -=cut - -################################################## -################################################## sub extract_cloners { my ($clonelist,$allowclone) = @_; @@ -3643,24 +4162,13 @@ sub change_clone { } -################################################## -################################################## - -=pod - -=item * header -Output html header for page - -=cut - -################################################## -################################################## sub header { return &Apache::loncommon::start_page('Parameter Manager'); } -################################################## -################################################## + + + sub print_main_menu { my ($r,$parm_permission)=@_; # @@ -3676,90 +4184,87 @@ ENDMAINFORMHEAD my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}); + my @menu = - ( { categorytitle=>'Settings for Your Course', + ( { categorytitle=>'Settings for this Course', items => [ - { linktext => 'Set Course Environment', + { linktext => 'Course Environment', url => '/adm/parmset?action=crsenv', permission => $parm_permission, - help => 'Course_Environment', + linktitle =>'Edit environment settings for this course.' , + icon => 'preferences-desktop-remote-desktop.png' , + #help => 'Course_Environment', }, - { linktext => 'Set Portfolio Metadata', + { linktext => 'Portfolio Metadata', url => '/adm/parmset?action=setrestrictmeta', permission => $parm_permission, + linktitle => 'Restrict metadata for this course.' , + icon =>'contact-new.png' , }, { linktext => 'Manage Course Slots', url => '/adm/slotrequest?command=showslots', permission => $vgr, + linktitle =>'Manage slots for this course.' , + icon => 'format-justify-fill.png' , }, { linktext => 'Reset Student Access Times', url => '/adm/helper/resettimes.helper', permission => $mgr, + linktitle =>'Reset access times for folders/maps, resources or the course.' , + icon => 'start-here.png' , }, { linktext => 'Set Parameter Setting Default Actions', url => '/adm/parmset?action=setdefaults', permission => $parm_permission, + linktitle =>'Set default actions for parameters.' , + icon => 'folder-new.png' , }]}, - { categorytitle => 'New and Existing Parameter Settings for Your Resources', + { categorytitle => 'New and Existing Parameter Settings for Resources', items => [ - { linktext => 'Set/Modify Resource Parameters - Helper Mode', + { linktext => 'Edit Resource Parameters - Helper Mode', url => '/adm/helper/parameter.helper', permission => $parm_permission, - help => 'Parameter_Helper', + linktitle =>'Set/Modify resource parameters in helper mode.' , + icon => 'dialog-information.png' , + #help => 'Parameter_Helper', }, - { linktext => 'Set/Modify Resource Parameters - Overview Mode', + { linktext => 'Edit Resource Parameters - Overview Mode', url => '/adm/parmset?action=newoverview', permission => $parm_permission, - help => 'Parameter_Overview', + linktitle =>'Set/Modify resource parameters in overview mode.' , + icon => 'edit-find.png' , + #help => 'Parameter_Overview', }, - { linktext => 'Set/Modify Resource Parameters - Table Mode', + { linktext => 'Edit Resource Parameters - Table Mode', url => '/adm/parmset?action=settable', permission => $parm_permission, - help => 'Table_Mode', + linktitle =>'Set/Modify resource parameters in table mode.' , + icon => 'edit-copy.png' , + #help => 'Table_Mode', }]}, - { categorytitle => 'Existing Parameter Settings for Your Resources', + { categorytitle => 'Existing Parameter Settings for Resources', items => [ { linktext => 'Modify Resource Parameters - Overview Mode', url => '/adm/parmset?action=setoverview', permission => $parm_permission, - help => 'Parameter_Overview', + linktitle =>'Set/Modify existing resource parameters in overview mode.' , + icon => 'preferences-desktop-wallpaper.png' , + #help => 'Parameter_Overview', }, - { linktext => 'Parameter Change Log and Course Blog Posting/User Notification', + { linktext => 'Change Log', url => '/adm/parmset?action=parameterchangelog', permission => $parm_permission, + linktitle =>'View parameter and course blog posting/user notification change log.' , + icon => 'emblem-system.png' , }]} ); -#---- Remove when done ---- -# my $menu_html = ''; -# foreach my $menu_item (@menu) { -# if ($menu_item->{'categorytitle'}) { -# $menu_html .= '

'.&mt($menu_item->{'categorytitle'}).'

'; -# next; -# } -# next if (! $menu_item->{'permission'}); -# $menu_html.='

'; -# $menu_html.=''; -# if (exists($menu_item->{'url'})) { -# $menu_html.=qq{}; -# } else { -# $menu_html.= -# qq{}; -# } -# $menu_html.= &mt($menu_item->{'linktext'}).''; -# if (exists($menu_item->{'help'})) { -# $menu_html.= -# &Apache::loncommon::help_open_topic($menu_item->{'help'}); -# } -# $menu_html.='

'.$/; -# } -# -------------------------- - $r->print(&Apache::lonhtmlcommon::generate_menu(@menu)); return; } -### Set portfolio metadata + + sub output_row { my ($r, $field_name, $field_text, $added_flag) = @_; my $output; @@ -3771,7 +4276,7 @@ sub output_row { } if (!($options =~ /deleted/)) { my @options= ( ['active', 'Show to student'], - ['stuadd', 'Provide text area for students to type catalog information'], + ['stuadd', 'Provide text area for students to type metadata'], ['choices','Provide choices for students to select from']); # ['onlyone','Student may select only one choice']); if ($added_flag) { @@ -3795,25 +4300,28 @@ sub output_row { my $multiple_checked; my $single_checked; if ($options =~ m/onlyone/) { - $multiple_checked = ""; - $single_checked = " CHECKED "; + $multiple_checked = ''; + $single_checked = ' checked="checked"'; } else { - $multiple_checked = " CHECKED "; - $single_checked = ""; + $multiple_checked = ' checked="checked"'; + $single_checked = ''; } $output .= &Apache::loncommon::continue_data_table_row(); $output .= ''.(' ' x 10).''; + + '.&mt('Student may select multiple choices from list').''; $output .= &Apache::loncommon::end_data_table_row(); $output .= &Apache::loncommon::continue_data_table_row(); $output .= ''.(' ' x 10).''; + + '.&mt('Student may select only one choice from list').''; $output .= &Apache::loncommon::end_data_table_row(); } return ($output); } + + + sub order_meta_fields { my ($r)=@_; my $idx = 1; @@ -3898,6 +4406,8 @@ sub order_meta_fields { $r->print(''); return 'ok'; } + + sub continue { my $output; $output .= '
'; @@ -3905,6 +4415,8 @@ sub continue { $output .= ''; return ($output); } + + sub addmetafield { my ($r)=@_; &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', @@ -3953,6 +4465,9 @@ sub addmetafield { } $r->print('
'); } + + + sub setrestrictmeta { my ($r)=@_; my $next_meta; @@ -4038,7 +4553,9 @@ ENDenv $r->print(&Apache::loncommon::end_page()); return 'ok'; } -################################################## + + + sub get_added_meta_fieldnames { my ($cid) = @_; my %fields; @@ -4051,6 +4568,9 @@ sub get_added_meta_fieldnames { } return \%fields; } + + + sub get_deleted_meta_fieldnames { my ($cid) = @_; my %fields; @@ -4221,8 +4741,8 @@ ENDYESNO $r->print(''.&Apache::loncommon::end_data_table_row()); } $r->print(&Apache::loncommon::end_data_table(). - "\n\n". + "\n".''."\n". &Apache::loncommon::end_page()); return; } @@ -4266,6 +4786,8 @@ sub components { } my %standard_parms; + + sub load_parameter_names { open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab"); while (my $configline=<$config>) { @@ -4295,9 +4817,6 @@ sub standard_parameter_names { } } -# -# Parameter Change Log -# sub parm_change_log { @@ -4459,25 +4978,100 @@ sub parm_change_log { $r->print(&Apache::loncommon::end_page()); } +sub update_slots { + my ($slot_name,$cdom,$cnum,$symb,$uname,$udom) = @_; + my %slot=&Apache::lonnet::get_slot($slot_name); + if (!keys(%slot)) { + return 'error: slot does not exist'; + } + my $max=$slot{'maxspace'}; + if (!defined($max)) { $max=99999; } + + my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum, + "^$slot_name\0"); + my ($tmp)=%consumed; + if ($tmp=~/^error: 2 / ) { + return 'error: unable to determine current slot status'; + } + my $last=0; + foreach my $key (keys(%consumed)) { + my $num=(split('\0',$key))[1]; + if ($num > $last) { $last=$num; } + if ($consumed{$key}->{'name'} eq $uname.':'.$udom) { + return 'ok'; + } + } + + if (scalar(keys(%consumed)) >= $max) { + return 'error: no space left in slot'; + } + my $wanted=$last+1; + + my %reservation=('name' => $uname.':'.$udom, + 'timestamp' => time, + 'symb' => $symb); + + my $success=&Apache::lonnet::newput('slot_reservations', + {"$slot_name\0$wanted" => + \%reservation}, + $cdom, $cnum); + if ($success eq 'ok') { + my %storehash = ( + symb => $symb, + slot => $slot_name, + action => 'reserve', + context => 'parameter', + ); + &Apache::lonnet::instructor_log('slotreservationslog',\%storehash, + '',$uname,$udom,$cnum,$cdom); + + &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash, + '',$uname,$udom,$uname,$udom); + } + return $success; +} + +sub delete_slots { + my ($slot_name,$cdom,$cnum,$uname,$udom,$symb) = @_; + my $delresult; + my %consumed = &Apache::lonnet::dump('slot_reservations',$cdom, + $cnum, "^$slot_name\0"); + if (&Apache::lonnet::error(%consumed)) { + return 'error: unable to determine current slot status'; + } + my ($tmp)=%consumed; + if ($tmp=~/^error: 2 /) { + return 'error: unable to determine current slot status'; + } + foreach my $key (keys(%consumed)) { + if ($consumed{$key}->{'name'} eq $uname.':'.$udom) { + my $num=(split('\0',$key))[1]; + my $entry = $slot_name.'\0'.$num; + $delresult = &Apache::lonnet::del('slot_reservations',[$entry], + $cdom,$cnum); + if ($delresult eq 'ok') { + my %storehash = ( + symb => $symb, + slot => $slot_name, + action => 'release', + context => 'parameter', + ); + &Apache::lonnet::instructor_log('slotreservationslog',\%storehash, + 1,$uname,$udom,$cnum,$cdom); + &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash, + 1,$uname,$udom,$uname,$udom); + } + } + } + return $delresult; +} + sub check_for_course_info { my $navmap = Apache::lonnavmaps::navmap->new(); return 1 if ($navmap); return 0; } -################################################## -################################################## - -=pod - -=item * handler - -Main handler. Calls &assessparms and &crsenv subroutines. - -=cut - -################################################## -################################################## sub handler { my $r=shift; @@ -4567,11 +5161,4 @@ sub handler { 1; __END__ -=pod - -=back - -=cut - -