--- loncom/interface/loncommon.pm 2007/05/29 17:48:44 1.536 +++ loncom/interface/loncommon.pm 2007/08/15 16:25:14 1.563 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.536 2007/05/29 17:48:44 raeburn Exp $ +# $Id: loncommon.pm,v 1.563 2007/08/15 16:25:14 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -240,7 +240,7 @@ Inputs: formname, elementname formname and elementname specify the name of the html form and the name of the element the selection from the search results will be placed in. -=back + =cut sub browser_and_searcher_javascript { @@ -334,10 +334,12 @@ sub studentbrowser_javascript { return (<<'ENDSTDBRW'); + +$new_user_create + + + + + + + + + + + +
$lt{'usr'}:$srchbysel + $srchtypesel + +   $srchinsel +
$lt{'doma'}:$domform
+
+END_BLOCK + + return $output; +} + + + =pod +=back + +=head1 HTTP Helpers + +=over 4 + =item * get_unprocessed_cgi($query,$possible_names) Modify the %env hash to contain unprocessed CGI form parameters held in @@ -5650,28 +6013,50 @@ sub record_sep { $i++; } } else { - my @allfields; + my $separator=','; if ($env{'form.upfiletype'} eq 'semisv') { - @allfields=split(/;/,$record,-1); - } else { - @allfields=split(/\,/,$record,-1); + $separator=';'; } my $i=0; - my $j; - for ($j=0;$j<=$#allfields;$j++) { - my $field=$allfields[$j]; - if ($field=~/^\s*(\"|\')/) { - my $delimiter=$1; - while (($field!~/$delimiter$/) && ($j<$#allfields)) { - $j++; - $field.=','.$allfields[$j]; - } - $field=~s/^\s*$delimiter//; - $field=~s/$delimiter\s*$//; - } - $components{&takeleft($i)}=$field; - $i++; +# the character we are looking for to indicate the end of a quote or a record + my $looking_for=$separator; +# do not add the characters to the fields + my $ignore=0; +# we just encountered a separator (or the beginning of the record) + my $just_found_separator=1; +# store the field we are working on here + my $field=''; +# work our way through all characters in record + foreach my $character ($record=~/(.)/g) { + if ($character eq $looking_for) { + if ($character ne $separator) { +# Found the end of a quote, again looking for separator + $looking_for=$separator; + $ignore=1; + } else { +# Found a separator, store away what we got + $components{&takeleft($i)}=$field; + $i++; + $just_found_separator=1; + $ignore=0; + $field=''; + } + next; + } +# single or double quotation marks after a separator indicate beginning of a quote +# we are now looking for the end of the quote and need to ignore separators + if ((($character eq '"') || ($character eq "'")) && ($just_found_separator)) { + $looking_for=$character; + next; + } +# ignore would be true after we reached the end of a quote + if ($ignore) { next; } + if (($just_found_separator) && ($character=~/\s/)) { next; } + $field.=$character; + $just_found_separator=0; } +# catch the very last entry, since we never encountered the separator + $components{&takeleft($i)}=$field; } return %components; } @@ -6438,35 +6823,53 @@ sub commit_customrole { } sub commit_standardrole { - my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_; - my $output; - my $logmsg; + my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_; + my ($output,$logmsg,$linefeed); + if ($context eq 'auto') { + $linefeed = "\n"; + } else { + $linefeed = "
\n"; + } if ($three eq 'st') { - my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec); - if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { + my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end, + $one,$two,$sec,$context); + if (($result =~ /^error/) || ($result eq 'not_in_class') || + ($result eq 'unknown_course')) { $output = "Error: $result\n"; } else { - $output = &mt('Assigning').' '.$three.' in '.$url. + $output = $logmsg.$linefeed.&mt('Assigning').' '.$three.' in '.$url. ($start?', '.&mt('starting').' '.localtime($start):''). - ($end?', '.&mt('ending').' '.localtime($end):''). - ': '.$result.'
'. - &mt('Add to classlist').': ok
'; + ($end?', '.&mt('ending').' '.localtime($end):'').': '; + if ($context eq 'auto') { + $output .= $result.$linefeed.&mt('Add to classlist').': ok'; + } else { + $output .= ''.$result.''.$linefeed. + &mt('Add to classlist').': ok'; + } + $output .= $linefeed; } } else { $output = &mt('Assigning').' '.$three.' in '.$url. ($start?', '.&mt('starting').' '.localtime($start):''). - ($end?', '.&mt('ending').' '.localtime($end):'').': '. - &Apache::lonnet::assignrole( - $udom,$uname,$url,$three,$end,$start). - '
'; + ($end?', '.&mt('ending').' '.localtime($end):'').': '; + my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start); + if ($context eq 'auto') { + $output .= $result.$linefeed; + } else { + $output .= ''.$result.''.$linefeed; + } } return $output; } sub commit_studentrole { - my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_; - my $linefeed = '
'."\n"; - my $result; + my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_; + my ($result,$linefeed); + if ($context eq 'auto') { + $linefeed = "\n"; + } else { + $linefeed = '
'."\n"; + } if (defined($one) && defined($two)) { my $cid=$one.'_'.$two; my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid); @@ -6513,9 +6916,12 @@ sub commit_studentrole { ############################################################ sub construct_course { - my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname) = @_; + my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context) = @_; my $outcome; - + my $linefeed = '
'."\n"; + if ($context eq 'auto') { + $linefeed = "\n"; + } # # Open course # @@ -6535,27 +6941,65 @@ sub construct_course { # Utils::Course. This needs to at least be output as a comment # if anyone ever decides to not show this, and Utils::Course::new # will need to be suitably modified. - $outcome .= &mt('New LON-CAPA [_1] ID: [_2]
',$crstype,$$courseid); + $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; + # # Check if created correctly # ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid); my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom); - $outcome .= &mt('Created on').': '.$crsuhome.'
'; + $outcome .= &mt('Created on').': '.$crsuhome.$linefeed; # # Are we cloning? # my $cloneid=''; if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) { + my $can_clone = 0; $cloneid='/'.$args->{'clonedomain'}.'/'.$args->{'clonecourse'}; my ($clonecrsudom,$clonecrsunum)= &LONCAPA::split_courseid($cloneid); my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom); + my $clonemsg; if ($clonehome eq 'no_host') { - $outcome .= - '
'.&mt('Attempting to clone non-existing [_1]',$crstype).' '.$cloneid.''; + $clonemsg = &mt('Attempting to clone non-existing [_1]',$crstype); + if ($context eq 'auto') { + $outcome .= $clonemsg; + } else { + $outcome .= ''.$clonemsg.''; + } + $outcome .= $linefeed; } else { - $outcome .= - '
'.&mt('Cloning [_1] from [_2]',$crstype,$clonehome).''; + my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1}); + if ($env{'request.role.domain'} eq $args->{'form.clonedomain'}) { + $can_clone = 1; + } else { + my %clonehash = &Apache::lonnet::get('environment',['cloners'], + $args->{'clonedomain'},$args->{'clonecourse'}); + my @cloners = split(/,/,$clonehash{'cloners'}); + my %roleshash = + &Apache::lonnet::get_my_roles($args->{'ccuname'}, + $args->{'ccdomain'},'userroles',['active'],['cc'], + [$args->{'clonedomain'}]); + if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) { + $can_clone = 1; + } else { + $clonemsg = &mt('The new course was not cloned from an existing course because the course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'}); + if ($context eq 'auto') { + $outcome .= $clonemsg; + } else { + $outcome .= ''.$clonemsg.''; + } + $outcome .= $linefeed; + } + } + } + if ($can_clone) { + $clonemsg = &mt('Cloning [_1] from [_2]',$crstype,$clonehome); + if ($context eq 'auto') { + $outcome = $clonemsg; + } else { + $outcome .= ''.$clonemsg.''; + } + $outcome .= $linefeed; my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum); # Copy all files &Apache::lonclonecourse::copycoursefiles($cloneid,$$courseid); @@ -6676,11 +7120,24 @@ sub construct_course { 'dnhr' => 'does not have rights to access enrollment in these classes', 'adby' => 'as determined by the policies of your institution on access to official classlists' ); - $outcome .= ''.$lt{'tclb'}.' ('.$cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.' ('.$lt{'adby'}.').


\n"; + my $badclass_msg = $cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}. + ' ('.$lt{'adby'}.')'; + if ($context eq 'auto') { + $outcome .= $badclass_msg.$linefeed; + $outcome .= ''.$badclass_msg.$linefeed.'

\n"; + } + } } if ($args->{'no_end_date'}) { $args->{'endaccess'} = 0; @@ -6696,8 +7153,13 @@ sub construct_course { $cenv{'internal.autharg'} = $args->{'autharg'}; if ( ($cenv{'internal.authtype'} =~ /^krb/) && ($cenv{'internal.autoadds'} == 1)) { if (! defined($cenv{'internal.autharg'}) || $cenv{'internal.autharg'} eq '') { - $outcome .= ''. - &mt('As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student').'

'; + my $krb_msg = &mt('As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student'); + if ($context eq 'auto') { + $outcome .= $krb_msg; + } else { + $outcome .= ''.$krb_msg.''; + } + $outcome .= $linefeed; } } if (($args->{'ccdomain'}) && ($args->{'ccuname'})) { @@ -6753,8 +7215,8 @@ sub construct_course { # By default, use standard grading if (!defined($cenv{'grading'})) { $cenv{'grading'} = 'standard'; } - $outcome .= ('
'.&mt('Setting environment').': '. - &Apache::lonnet::put('environment',\%cenv,$$crsudom,$$crsunum).'
'); + $outcome .= $linefeed.&mt('Setting environment').': '. + &Apache::lonnet::put('environment',\%cenv,$$crsudom,$$crsunum).$linefeed; # # Open all assignments # @@ -6764,7 +7226,7 @@ sub construct_course { $storeunder.'.type' => 'date_start'); $outcome .= &mt('Opening all assignments').': '.&Apache::lonnet::cput - ('resourcedata',\%storecontent,$$crsudom,$$crsunum).'
'; + ('resourcedata',\%storecontent,$$crsudom,$$crsunum).$linefeed; } # # Set first page @@ -6791,7 +7253,7 @@ sub construct_course { (my $outtext,$errtext) = &LONCAPA::map::storemap($map,1); if ($errtext) { $fatal=2; } - $outcome .= ($fatal?$errtext:'write ok').'
'; + $outcome .= ($fatal?$errtext:'write ok').$linefeed; } return $outcome; }