[LON-CAPA-cvs] cvs: loncom(version_2_9_X) /interface courseprefs.pm

raeburn raeburn@source.lon-capa.org
Thu, 11 Mar 2010 04:20:15 -0000


This is a MIME encoded message

--raeburn1268281215
Content-Type: text/plain

raeburn		Thu Mar 11 04:20:15 2010 EDT

  Modified files:              (Branch: version_2_9_X)
    /loncom/interface	courseprefs.pm 
  Log:
  - Backport 1.25.
  
  
--raeburn1268281215
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20100311042015.txt"

Index: loncom/interface/courseprefs.pm
diff -u loncom/interface/courseprefs.pm:1.8.2.8 loncom/interface/courseprefs.pm:1.8.2.9
--- loncom/interface/courseprefs.pm:1.8.2.8	Mon Feb 22 15:59:28 2010
+++ loncom/interface/courseprefs.pm	Thu Mar 11 04:20:15 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set configuration settings for a course
 #
-# $Id: courseprefs.pm,v 1.8.2.8 2010/02/22 15:59:28 raeburn Exp $
+# $Id: courseprefs.pm,v 1.8.2.9 2010/03/11 04:20:15 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -273,6 +273,7 @@
                 idnu => 'Community ID or number',
                 desc => 'Community Description',
                 ownr => 'Community Owner',
+                cown => 'Community Co-owners',
                 catg => 'Categorize community',
                 excc => 'Exclude from community catalog',
                 clon => 'Users allowed to clone community',
@@ -299,6 +300,7 @@
                 idnu => 'Course ID or number',
                 desc => 'Course Description',
                 ownr => 'Course Owner',
+                cown => 'Course Co-owners',
                 catg => 'Categorize course',
                 excc => 'Exclude from course catalog',
                 clon => 'Users allowed to clone course',
@@ -344,19 +346,20 @@
                      help => 'Course_Environment',
                      header => [{col1 => 'Setting',
                                  col2 => 'Value'}],
-                     ordered => ['owner','description','courseid','categories',
-                                 'hidefromcat','cloners','externalsyllabus',
-                                 'url','rolenames'],
+                     ordered => ['owner','co-owners','description','courseid',
+                                 'categories','hidefromcat','externalsyllabus',
+                                 'cloners','url','rolenames'],
                      itemtext => {
-                                   owner            => $lt{'ownr'},
-                                   description      => $lt{'desc'},
-                                   courseid         => $lt{'idnu'},
-                                   categories       => $lt{'catg'},
-                                   hidefromcat      => $lt{'excc'},
-                                   cloners          => $lt{'clon'}, 
-                                   externalsyllabus => 'URL of Syllabus',
-                                   url              => 'Top Level Map',
-                                   rolenames        => $lt{'rept'},
+                                   'owner'            => $lt{'ownr'},
+                                   'co-owners'        => $lt{'cown'},
+                                   'description'      => $lt{'desc'},
+                                   'courseid'         => $lt{'idnu'},
+                                   'categories'       => $lt{'catg'},
+                                   'hidefromcat'      => $lt{'excc'},
+                                   'cloners'          => $lt{'clon'}, 
+                                   'externalsyllabus' => 'URL of Syllabus',
+                                   'url'              => 'Top Level Map',
+                                   'rolenames'        => $lt{'rept'},
                                  },
                     },
         'localization' =>
@@ -777,6 +780,80 @@
                                     }
                                 }
                             }
+                        } elsif ($entry eq 'co-owners') {
+                            my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+                            my $coowners = $values->{'internal.co-owners'};
+                            my @currcoown;
+                            if ($coowners) {
+                                @currcoown = split(',',$coowners);
+                            }
+                            if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+                                my $autocoowner;
+                                if (($crstype eq 'Course') &&
+                                    ($values->{'internal.coursecode'})) {
+                                    my %domconf =
+                                        &Apache::lonnet::get_dom('configuration',['autoenroll'],$cdom);
+                                    if (ref($domconf{'autoenroll'}) eq 'HASH') {
+                                        $autocoowner = $domconf{'autoenroll'}{'co-owners'};
+                                    }
+                                }
+                                unless ($autocoowner) {
+                                    my @keepcoowners = &Apache::loncommon::get_env_multiple('form.coowners');
+                                    my @pendingcoowners = &Apache::loncommon::get_env_multiple('form.pendingcoowners');
+                                    my @invitecoowners =  &Apache::loncommon::get_env_multiple('form.invitecoowners');
+                                    if (@invitecoowners) {
+                                        push(@pendingcoowners,@invitecoowners);
+                                    }
+                                    $newvalues{'pendingco-owners'} = join(',',sort(@pendingcoowners));
+                                    $newvalues{'co-owners'} = join(',',sort(@keepcoowners));
+                                    if ($newvalues{'co-owners'} ne $values->{'internal.co-owners'}) {
+                                        $changes->{$entry}{'co-owners'} = $newvalues{'co-owners'};
+                                        push(@{$changes->{$entry}{'changed'}},'co-owners');
+                                    }
+                                    if ($newvalues{'pendingco-owners'} ne $values->{'internal.pendingco-owners'}) {
+                                        $changes->{$entry}{'pendingco-owners'} = $newvalues{'pendingco-owners'};
+                                        push(@{$changes->{$entry}{'changed'}},'pendingco-owners');
+                                    }
+                                }
+                            } else {
+                                my (@newpending,@newcoown);
+                                my $uname = $env{'user.name'};
+                                my $udom = $env{'user.domain'};
+                                my $pendingcoowners = $values->{'internal.pendingco-owners'};
+                                my @pendingcoown = split(',',$pendingcoowners);
+                                if ($env{'form.pending_coowoner'}) {
+                                    foreach my $item (@pendingcoown) {
+                                        unless ($item eq $uname.':'.$udom) {
+                                            push(@newpending,$item);
+                                        }
+                                    }
+                                    @newcoown = @currcoown;
+                                    if ($env{'form.pending_coowoner'} eq 'accept') {
+                                        unless (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {
+                                            push(@newcoown,$uname.':'.$udom);
+                                        }
+                                    }
+                                } elsif ($env{'form.remove_coowoner'}) {
+                                    foreach my $item (@currcoown) {
+                                        unless ($item eq $uname.':'.$udom) {
+                                            push(@newcoown,$item);
+                                        }
+                                    }
+                                    if ($pendingcoowners ne '') {
+                                        @newpending = @pendingcoown;
+                                    }
+                                }
+                                $newvalues{'pendingco-owners'} = join(',',sort(@newpending));
+                                $newvalues{'co-owners'} = join(',',sort(@newcoown));
+                                if ($newvalues{'co-owners'} ne $values->{'internal.co-owners'}) {
+                                    $changes->{$entry}{'co-owners'} = $newvalues{'co-owners'};
+                                    push(@{$changes->{$entry}{'changed'}},'co-owners');
+                                }
+                                if ($newvalues{'pendingco-owners'} ne $values->{'internal.pendingco-owners'}) {
+                                    $changes->{$entry}{'pendingco-owners'} = $newvalues{'pendingco-owners'};
+                                    push(@{$changes->{$entry}{'changed'}},'pendingco-owners');
+                                }
+                            }
                         } elsif ($entry =~ /^default_enrollment_(start|end)_date$/) {
                             $newvalues{$entry}=&Apache::lonhtmlcommon::get_date_from_form($entry);
                         } elsif ($entry eq 'rolenames') {
@@ -993,8 +1070,10 @@
                         } else {
                             $newvalues{$entry} = $env{'form.'.$entry};
                         }
-                        if ($newvalues{$entry} ne $values->{$entry}) {
-                            $changes->{$entry} = $newvalues{$entry};
+                        unless ($entry eq 'co-owners') {
+                            if ($newvalues{$entry} ne $values->{$entry}) {
+                                $changes->{$entry} = $newvalues{$entry};
+                            }
                         }
                     }
                 }
@@ -1117,7 +1196,10 @@
                                     next if (!exists($changes->{$item}{$key}));
                                     my ($displayname,$text);
                                     $text = $prefs->{$item}->{'itemtext'}{$key};
-                                    my $displayval = $changes->{$item}{$key};
+                                    my $displayval;
+                                    unless ($key eq 'co-owners') {
+                                        $displayval = $changes->{$item}{$key};
+                                    }
                                     if ($item eq 'feedback') {
                                         if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {
                                             $text = $prefs->{$item}->{'itemtext'}{$1.$2};
@@ -1177,15 +1259,56 @@
                                         $displayval = &Apache::lonlocal::locallocaltime($displayval);
                                     } elsif ($key eq 'categories') {
                                         $displayval = $env{'form.categories_display'};
-                                    }  
-                                    if ($changes->{$item}{$key} eq '') {
+                                    }
+                                    if ($key eq 'co-owners') {
+                                        if (ref($changes->{$item}{$key}) eq 'HASH') {
+                                            if (ref($changes->{$item}{$key}{'changed'}) eq 'ARRAY') {
+                                                foreach my $type ('co-owners','pendingco-owners') {
+                                                    next unless (grep(/^\Q$type\E$/,@{$changes->{$item}{$key}{'changed'}}));
+                                                    if ($type eq 'pendingco-owners') {
+                                                        if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+                                                            $displayname = &mt('Invited as co-owners, pending acceptance');
+                                                        }
+                                                    }
+                                                    if ($changes->{$item}{$key}{$type} eq '') {
+                                                        push(@delkeys,'internal.'.$type);
+                                                        if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+                                                            $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
+                                                            '<i>'.$displayname.'</i>')).'</li>';
+                                                        }
+                                                    } elsif (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+                                                        $displayval = join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } split(',',$changes->{$item}{$key}{$type}));
+                                                        $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
+                                                                   '<i>'.$displayname.'</i>',
+                                                                   "'<b>$displayval</b>'")).'</li>';
+                                                    }
+                                                }
+                                            }
+                                            unless (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+                                                if ($env{'form.pending_coowoner'} eq 'accept') {
+                                                        $displayval = &mt('on');
+                                                } elsif ($env{'form.pending_coowoner'} eq 'decline') {
+                                                        $displayval = '';
+                                                        $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).'</li>';
+                                                } elsif ($env{'form.remove_coowoner'}) {
+                                                    $displayval = &mt('off');
+                                                }
+                                                if ($displayval) {
+                                                    $displayname = &mt('Your co-ownership status');
+                                                    $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
+                                                   '<i>'.$displayname.'</i>',
+                                                   "'<b>$displayval</b>'")).'</li>';
+                                                }
+                                            }
+                                        }
+                                    } elsif ($changes->{$item}{$key} eq '') {
                                         push(@delkeys,$key);
-                                        $output .= '<li>'.&mt('Deleted setting for [_1]',
-                                                   '<i>'.$displayname.'</i>').'</li>';
+                                        $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
+                                                   '<i>'.$displayname.'</i>')).'</li>';
                                     } else {
-                                        $output .= '<li>'.&mt('[_1] set to [_2]',
+                                        $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
                                                    '<i>'.$displayname.'</i>',
-                                                   "'<b>$displayval</b>'");
+                                                   "'<b>$displayval</b>'"));
                                         if ($key eq 'url') {
                                             my $bkuptime=time;
                                             $output .= ('&nbsp;'x2).&mt('(Previous URL backed up)').': '.
@@ -1193,7 +1316,18 @@
                                         }
                                         $output .= '</li>';
                                     }
-                                    $storehash{$key} = $changes->{$item}{$key};
+                                    if ($key eq 'co-owners') {
+                                        if (ref($changes->{$item}{$key}) eq 'HASH') {
+                                            if (ref($changes->{$item}{$key}{'changed'}) eq 'ARRAY') {
+                                                foreach my $type ('co-owners','pendingco-owners') {
+                                                    next unless (grep(/^\Q$type\E$/,@{$changes->{$item}{$key}{'changed'}}));
+                                                    $storehash{'internal.'.$type} = $changes->{$item}{$key}{$type};
+                                                }
+                                            }
+                                        }
+                                    } else {
+                                        $storehash{$key} = $changes->{$item}{$key};
+                                    }
                                 }
                                 if ($key eq 'cloners') {
                                     # Get existing cloners
@@ -1206,7 +1340,8 @@
                                     }
                                 }
                                 if (($key eq 'description') || ($key eq 'cloners') ||
-                                    ($key eq 'hidefromcat') || ($key eq 'categories')) {
+                                    ($key eq 'hidefromcat') || ($key eq 'categories') ||
+                                    ($key eq 'co-owners')) {
                                     push(@need_env_update,$key);
                                 }
                             }
@@ -1280,6 +1415,16 @@
                     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}});
                     $crsinfo{$env{'request.course.id'}}{$key} = $storehash->{$key};
                     $count ++;
+                } elsif ($key eq 'co-owners') {
+                    if ($storehash->{'internal.co-owners'} ne '') {
+                        &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.internal.co-owners' => $storehash->{'internal.co-owners'}});
+                    }
+                    if ($storehash->{'internal.pendingco-owners'} ne '') {
+                        &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.internal.pendingco-owners' => $storehash->{'internal.pendingco-owners'}});
+                    }
+                    my @coowners = split(',',$storehash->{'internal.'.$key});
+                    $crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners;
+                    $count ++;
                 }
             }
             if ($count) {
@@ -1494,9 +1639,9 @@
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;
     }
-    my ($cathash,$categoriesform);
+    my ($cathash,$categoriesform,$autocoowner);
     my %domconf = 
-        &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
+        &Apache::lonnet::get_dom('configuration',['coursecategories','autoenroll'],$cdom);
     if (ref($domconf{'coursecategories'}) eq 'HASH') {
         $cathash = $domconf{'coursecategories'}{'cats'};
         if (ref($cathash) eq 'HASH') {
@@ -1505,6 +1650,9 @@
                                                 $settings->{'categories'},$crstype)."\n";
         }
     }
+    if (ref($domconf{'autoenroll'}) eq 'HASH') {
+        $autocoowner = $domconf{'autoenroll'}{'co-owners'};
+    }
     if (!defined($categoriesform)) {
         $categoriesform = &mt('No categories defined in this domain.');
     }
@@ -1536,6 +1684,9 @@
         'owner'        => {
                    text => '<b>'.&mt($itemtext->{'owner'}).'</b>',
                           },
+        'co-owners'    => {
+                   text => '<b>'.&mt($itemtext->{'co-owners'}).'</b>',
+                          },
         'courseid'     => { 
                    text => '<b>'.&mt($itemtext->{'courseid'}).'</b><br />'.'('.
                            &mt('internal, optional').')',
@@ -1707,6 +1858,26 @@
             }
             my $domdesc = &Apache::lonnet::domain($cdom,'description');
             $datatable .= $owner;
+        } elsif ($item eq 'co-owners') {
+            my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+            my $coowners = $env{'course.'.$env{'request.course.id'}.'.internal.co-owners'};
+            my @currcoown;
+            if ($coowners) {
+                @currcoown = split(',',$coowners);
+            }
+            if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+                if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {
+                    $datatable .= &show_autocoowners(@currcoown);
+                } else {
+                    $datatable .= &coowner_invitations($cnum,$cdom,@currcoown);
+                }
+            } else {
+                if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {
+                    $datatable .= &show_autocoowners(@currcoown);
+                } else {
+                    $datatable .= &manage_coownership($cnum,$cdom,@currcoown);
+                }
+            }
         } else {
             $datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size});
         }
@@ -1864,6 +2035,128 @@
     return;
 }
 
+sub show_autocoowners {
+    my (@currcoown) = @_;
+    my $output = '<i>'.&mt('Co-ownership is set automatically when a Course Coordinator role is assigned to official course personnel (from institutional data).').'</i>';
+    if (@currcoown > 0) {
+        $output .= '<br />'.&mt('Current co-owners are:').'&nbsp;'.
+                   join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
+    } else {
+        $output .= '<br />'.&mt('Currently no co-owners.');
+    }
+    return $output;
+}
+
+sub coowner_invitations {
+    my ($cnum,$cdom,@currcoown) = @_;
+    my ($output,@pendingcoown,@othercoords);
+    my $pendingcoowners =
+        $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
+    if ($pendingcoowners) {
+        @pendingcoown = split(',',$pendingcoowners);
+    }
+    my $ccrole = 'cc';
+    my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]);
+    foreach my $key (sort(keys(%ccroles))) {
+        my ($ccname,$ccdom,$role) = split(':',$key);
+        next if ($key eq $env{'user.name'}.':'.$env{'user.domain'}.':'.$ccrole);
+        unless (grep(/^\Q$ccname\E:\Q$ccdom\E$/,@currcoown,@pendingcoown)) {
+            push(@othercoords,$ccname.':'.$ccdom);
+        }
+    }
+    my $coowner_rows = @currcoown + @pendingcoown + @othercoords;
+    if ($coowner_rows) {
+        $output .= &Apache::loncommon::start_data_table();
+        if (@currcoown) {
+            $output .= &Apache::loncommon::start_data_table_row().
+                          '<td><i>'.&mt('Current co-owners').'</i></td><td>';
+            foreach my $person (@currcoown) {
+                my ($co_uname,$co_dom) = split(':',$person);
+                $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="coowners" checked="checked" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';
+            }
+            $output .= '</td>'.
+                          &Apache::loncommon::end_data_table_row();
+        }
+        if ($pendingcoowners) {
+            $output .= &Apache::loncommon::start_data_table_row().
+                          '<td><i>'.&mt('Invited as co-owners [_1](agreement pending)','<br />').'</i></td><td>';
+            foreach my $person (@pendingcoown) {
+                my ($co_uname,$co_dom) = split(':',$person);
+                $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="pendingcoowners" checked="checked" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';
+            }
+            $output .= '</td>'.
+                       &Apache::loncommon::end_data_table_row();
+        }
+        if (@othercoords) {
+            $output .= &Apache::loncommon::start_data_table_row().
+                          '<td><i>'.&mt('Invite other Coordinators [_1]to become co-owners','<br />').'</i></td><td>';
+            foreach my $person (@othercoords) {
+                my ($co_uname,$co_dom) = split(':',$person);
+                $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="invitecoowners" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';
+            }
+            $output .= '</td>'.
+                          &Apache::loncommon::end_data_table_row();
+        }
+        $output .= &Apache::loncommon::end_data_table();
+    } else {
+        $output = &mt('There are no coordinators to select as co-owners');
+    }
+    return $output;
+}
+
+sub manage_coownership  {
+    my ($cnum,$cdom,@currcoown) = @_;
+    my (@pendingcoown);
+    my $pendingcoowners =
+        $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
+    if ($pendingcoowners) {
+        @pendingcoown = split(',',$pendingcoowners);
+    }
+    my ($is_coowner,$is_pending,$output);
+    my $uname = $env{'user.name'};
+    my $udom = $env{'user.domain'};
+    if (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {
+        $is_coowner = 1;
+    }
+    if (grep(/^\Q$uname\E:\Q$udom\E$/,@pendingcoown)) {
+        $is_pending = 1;
+    }
+    if (@currcoown && ($is_coowner || $is_pending)) {
+        $output = &Apache::loncommon::start_data_table();
+    }
+    if (@currcoown) {
+        if ($is_coowner || $is_pending) {
+            $output .= &Apache::loncommon::start_data_table().
+                       &Apache::loncommon::start_data_table_row().'<td>';
+        }
+        $output .= &mt('Current co-owners are:').'&nbsp;'.
+                   join(', ', map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
+        if ($is_coowner || $is_pending) {
+            $output .= '</td>'.&Apache::loncommon::end_data_table_row();
+        }
+    }
+    if ($is_coowner || $is_pending) {
+        if (@currcoown) {
+            $output .= &Apache::loncommon::start_data_table_row().'<td>';
+        }
+        $output .= '<span class="LC_nobreak">';
+        if ($is_coowner) {
+            $output .= &mt('You are currently a co-owner:').'&nbsp;<label><input type="checkbox" name="remove_coowoner" value="'.$uname.':'.$udom.'" />'.&mt('Discontinue?').'</label>';
+        } else {
+            $output .= &mt('The course owner has invited you to become a co-owner:').'&nbsp;<label><input type="radio" name="pending_coowoner" value="accept" />'.&mt('Accept?').'</label>'.('&nbsp;'x2).
+                       '<label><input type="radio" name=pending_coowoner" value="decline" />'.&mt('Decline?').'</label>';
+        }
+        $output .= '</span>';
+        if (@currcoown) {
+            $output .= '</td>'.&Apache::loncommon::end_data_table_row();
+        }
+    }
+    if (@currcoown && ($is_coowner || $is_pending)) {
+        $output .= &Apache::loncommon::end_data_table();
+    }
+    return $output;
+}
+
 sub print_localization {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {

--raeburn1268281215--