--- loncom/interface/lonmodifycourse.pm 2009/11/23 21:45:18 1.49 +++ loncom/interface/lonmodifycourse.pm 2010/03/08 22:31:27 1.50 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # handler for DC-only modifiable course settings # -# $Id: lonmodifycourse.pm,v 1.49 2009/11/23 21:45:18 raeburn Exp $ +# $Id: lonmodifycourse.pm,v 1.50 2010/03/08 22:31:27 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -49,7 +49,8 @@ sub get_dc_settable { sub autoenroll_keys { my $internals = ['coursecode','courseowner','authtype','autharg','autoadds','autodrops', - 'autostart','autoend','sectionnums','crosslistings']; + 'autostart','autoend','sectionnums','crosslistings', + 'co-owners']; my $accessdates = ['default_enrollment_start_date','default_enrollment_end_date']; return ($internals,$accessdates); } @@ -106,7 +107,7 @@ sub get_enrollment_settings { } else { $enrollvar{$type} = &Apache::lonlocal::locallocaltime($settings{$item}); } - } elsif ($type eq "sectionnums") { + } elsif (($type eq 'sectionnums') || ($type eq 'co-owners')) { $enrollvar{$type} = $settings{$item}; $enrollvar{$type} =~ s/,/, /g; } elsif ($type eq "authtype" @@ -335,7 +336,7 @@ sub print_settings_display { "$longtype{$item}\n". "$enrollvar{$item}\n"; if (grep(/^\Q$item\E$/,@modifiable_params)) { - $disp_table .= ''.&mt('Yes').''."\n"; + $disp_table .= ''.&mt('Yes').''."\n"; } else { $disp_table .= ''.&mt('No').''."\n"; } @@ -635,7 +636,8 @@ sub gather_authenitems { sub modify_course { my ($r,$cdom,$cnum,$cdesc,$domdesc,$type) = @_; my %longtype = &course_settings_descrip($type); - my @items = ('internal.courseowner','description'); + my @items = ('internal.courseowner','description','internal.co-owners', + 'internal.pendingco-owners'); unless ($type eq 'Community') { push(@items,('internal.coursecode','internal.authtype','internal.autharg', 'internal.sectionnums','internal.crosslistings')); @@ -711,7 +713,7 @@ sub modify_course { } } - if ($changed{'owner'} || $changed{'code'}) { + if ($changed{'owner'} || $changed{'code'}) { my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum, undef,undef,'.'); if (ref($crsinfo{$env{'form.pickedcourse'}}) eq 'HASH') { @@ -723,6 +725,9 @@ sub modify_course { } my $chome = &Apache::lonnet::homeserver($cnum,$cdom); my $putres = &Apache::lonnet::courseidput($cdom,\%crsinfo,$chome,'notime'); + if ($putres eq 'ok') { + &update_coowners($cdom,$cnum,$chome,\%settings,\%newattr); + } } } foreach my $param (@modifiable_params) { @@ -861,6 +866,139 @@ sub modify_course { return; } +sub update_coowners { + my ($cdom,$cnum,$chome,$settings,$newattr) = @_; + return unless ((ref($settings) eq 'HASH') && (ref($newattr) eq 'HASH')); + my %designhash = &Apache::loncommon::get_domainconf($cdom); + my (%cchash,$autocoowners); + if ($designhash{$cdom.'.autoassign.co-owners'}) { + $autocoowners = 1; + %cchash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,['cc']); + } + if ($settings->{'internal.courseowner'} ne $newattr->{'courseowner'}) { + my $oldowner_to_coowner; + if (($newattr->{'coursecode'}) && ($autocoowners)) { + my $oldowner = $settings->{'internal.courseowner'}; + if ($cchash{$oldowner.':cc'}) { + if ($settings->{'internal.co-owner'}) { + my @current = split(',',$settings->{'internal.co-owners'}); + unless (grep(/^\Q$oldowner\E$/,@current)) { + $oldowner_to_coowner = 1; + } + } else { + $oldowner_to_coowner = 1; + } + } + } + foreach my $type ('co-owners','pendingco-owners') { + if ($settings->{'internal.'.$type}) { + my @current = split(',',$settings->{'internal.'.$type}); + my $newowner = $newattr->{'courseowner'}; + my @newvalues = (); + if (($newowner ne '') && (grep(/^\Q$newowner\E$/,@current))) { + foreach my $person (@current) { + unless ($person eq $newowner) { + push(@newvalues,$person); + } + } + } else { + @newvalues = @current; + } + if ($oldowner_to_coowner) { + push(@newvalues,$settings->{'internal.courseowner'}); + @newvalues = sort(@newvalues); + } + my $newownstr = join(',',@newvalues); + if ($newownstr ne $settings->{'internal.'.$type}) { + if ($type eq 'co-owners') { + my $deleted = ''; + unless (@newvalues) { + $deleted = 1; + } + &Apache::lonnet::store_coowners($cdom,$cnum,$chome, + $deleted,@newvalues); + } else { + my $pendingcoowners; + my $cid = $cdom.'_'.$cnum; + if (@newvalues) { + $pendingcoowners = join(',',@newvalues); + my %pendinghash = ( + 'internal.pendingco-owners' => $pendingcoowners, + ); + my $putresult = &put('environment',\%pendinghash,$cdom,$cnum); + if ($putresult eq 'ok') { + if ($env{'course.'.$cid.'.num'} eq $cnum) { + &appenv({'course.'.$cid.'.internal.pendingco-owners' => $pendingcoowners}); + } + } + } else { + my $delresult = &Apache::lonnet::del('environment',['internal.pendingco-owners'],$cdom,$cnum); + if ($delresult eq 'ok') { + if ($env{'course.'.$cid.'.internal.pendingco-owners'}) { + &Apache::lonnet::delenv('course.'.$cid.'.internal.pendingco-owners'); + } + } + } + } + } elsif ($oldowner_to_coowner) { + &Apache::lonnet::store_coowners($cdom,$cnum,$chome,'', + $settings->{'internal.courseowner'}); + + } + } elsif ($oldowner_to_coowner) { + &Apache::lonnet::store_coowners($cdom,$cnum,$chome,'', + $settings->{'internal.courseowner'}); + } + } + } + if ($settings->{'internal.coursecode'} ne $newattr->{'coursecode'}) { + if ($newattr->{'coursecode'} ne '') { + my %designhash = &Apache::loncommon::get_domainconf($cdom); + if ($designhash{$cdom.'.autoassign.co-owners'}) { + my @newcoowners = (); + if ($settings->{'internal.co-owners'}) { + my @currcoown = split(',',$settings->{'internal.coowners'}); + my ($updatecoowners,$delcoowners); + foreach my $person (@currcoown) { + my ($result,$desc) = &Apache::lonnet::valid_instcode(); + if ($result eq 'valid') { + push(@newcoowners,$person); + } + } + foreach my $item (sort(keys(%cchash))) { + my ($uname,$udom,$urole) = split(':',$item); + unless (grep(/^\Q$uname\E:\Q$udom\E$/,@newcoowners)) { + push(@newcoowners,$uname.':'.$udom); + } + } + if (@newcoowners) { + my $coowners = join(',',sort(@newcoowners)); + unless ($coowners eq $settings->{'internal.co-owners'}) { + $updatecoowners = 1; + } + } else { + $delcoowners = 1; + } + if ($updatecoowners || $delcoowners) { + &Apache::lonnet::store_coowners($cdom,$cnum,$chome, + $delcoowners,@newcoowners); + } + } else { + foreach my $item (sort(keys(%cchash))) { + my ($uname,$udom,$urole) = split(':',$item); + push(@newcoowners,$uname.':'.$udom); + } + if (@newcoowners) { + &Apache::lonnet::store_coowners($cdom,$cnum,$chome,'', + @newcoowners); + } + } + } + } + } + return; +} + sub modify_quota { my ($r,$cdom,$cnum,$cdesc,$domdesc,$type) = @_; &print_header($r,$type); @@ -1168,8 +1306,8 @@ sub course_settings_descrip { if ($type eq 'Community') { %longtype = &Apache::lonlocal::texthash( 'courseowner' => "Username:domain of community owner", + 'co-owners' => "Username:domain of each co-owner", ); - } else { %longtype = &Apache::lonlocal::texthash( 'authtype' => 'Default authentication method', @@ -1182,6 +1320,7 @@ sub course_settings_descrip { 'default_enrollment_end_date' => 'Date of last student access', 'coursecode' => 'Official course code', 'courseowner' => "Username:domain of course owner", + 'co-owners' => "Username:domain of each co-owner", 'notifylist' => 'Course Coordinators to be notified of enrollment changes', 'sectionnums' => 'Course section number:LON-CAPA section', 'crosslistings' => 'Crosslisted class:LON-CAPA section',