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

raeburn raeburn@source.lon-capa.org
Sun, 21 Feb 2010 00:47:02 -0000


This is a MIME encoded message

--raeburn1266713222
Content-Type: text/plain

raeburn		Sun Feb 21 00:47:02 2010 EDT

  Modified files:              
    /loncom/interface	courseprefs.pm 
  Log:
  - Start on documentation (POD).
  - When changes are made to named cloners, need to update values stored in
    "cloneable" key for individually named users with rights to clone.
  - &change_clone() moved from lonparmset.pm to perform the updates.
  
  
--raeburn1266713222
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20100221004702.txt"

Index: loncom/interface/courseprefs.pm
diff -u loncom/interface/courseprefs.pm:1.22 loncom/interface/courseprefs.pm:1.23
--- loncom/interface/courseprefs.pm:1.22	Wed Jan 27 13:08:01 2010
+++ loncom/interface/courseprefs.pm	Sun Feb 21 00:47:02 2010
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set configuration settings for a course
 #
-# $Id: courseprefs.pm,v 1.22 2010/01/27 13:08:01 wenzelju Exp $
+# $Id: courseprefs.pm,v 1.23 2010/02/21 00:47:02 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,6 +28,185 @@
 ###############################################################
 ##############################################################
 
+=pod
+
+=head1 NAME
+
+courseprefs- Handler to set/modify course configuration
+
+=head1 SYNOPSIS
+
+courseprefs provides an interface for setting general course configuration
+
+=head1 DESCRIPTION
+
+This module is used for configuration of a course
+
+=head1 INTERNAL SUBROUTINES
+
+=over
+
+=item get_allitems()
+
+=item print_config_box()
+
+=item process_changes()
+
+=item get_sec_str()
+
+=item check_clone()
+
+=item store_changes()
+
+=item update_env()
+
+=item display_disallowed()
+
+=item get_course()
+
+=item get_jscript()
+
+=item cloners_javascript()
+
+=item print_courseinfo()
+
+=item new_cloners_dom_row()
+
+=item can_modify_catsettings()
+
+=item assign_course_categories()
+
+=item print_localization()
+
+=item get_lang_choices()
+
+=item print_feedback()
+
+=item user_table()
+
+=item select_recipient()
+
+=item select_sections()
+
+=item print_discussion()
+
+=item role_checkboxes()
+
+=item print_classlists()
+
+=item print_appearance()
+
+=item print_grading()
+
+=item print_printouts()
+
+=item print_spreadsheet()
+
+=item print_bridgetasks()
+
+=item print_other()
+
+=item get_other_items()
+
+=item item_table_row_start()
+
+=item item_table_row_end()
+
+=item yes_no_radio()
+
+=item select_from_options()
+
+=item make_item_rows()
+
+Creates table used to display and set course configuration items.
+
+Inputs: $cdom,$items,$ordered,$settings,$rowtotal,$crstype
+where $cdom is course's domain, $items is HASH ref for current config
+item, $ordered is ARRAY ref of items to include in row in 
+display order, $settings is HASH ref of current values forrow,
+$rowtotal is SCALAR ref used to accumulate row count, $crstype is    
+course type.
+
+Returns: $datatable
+HTML mark-up of data table which accumulates individual rows.  
+
+=item nothidepriv_row()
+
+Creates row containing form elements used to display and set
+whether Domain coordinators who are currently included in  
+advanced course user .db file for a course are to be hidden (e.g.,
+in syllabus, or from course user lists).
+
+Inputs: $cdom,$item,$settings,$crstype
+where $cdom is course domain, item is nothideprivileged, $settings is
+HASH ref of the current values for nothideprivileged, $crstype is 
+course type (Course or Community). 
+
+Return: $datatable
+HTML mark-up for Privileged users (Domain Coordinators) in staff listing.
+
+=item print_hdrfmt_row()
+
+Creates row containing form elements used to display and set
+substitution items and text to be used in the header included
+on printouts.
+
+Inputs: $item,$settings
+where $item is print_header_format, and $settings is a HASH ref
+of the current values stored for print_header_format.
+
+Returns: $output
+HTML mark-up containing Javascript functions: reOrder() and getIndexByName()
+used to dynamically update position selectboxes, and HTML table elements
+for the "Print header format" row.
+
+=item position_selector()
+
+Creates a select box which can be used to reorder substitutions
+and text included in a printout header. 
+
+Inputs: $pos,$num,$maxnum
+where $pos is current position, $num is the unique identifier,
+and $maxnum is the total number of items (both substitutions
+and text in the printout header.
+
+Returns: $output
+HTML mark-up for the selectbox and a hidden form element containing 
+the current position.   
+
+=item substitution_selector()
+
+Creates a combination of select box for choosing an item 
+(student name, course ID or assignment note) to substitute, 
+and a corresponding size limit in the header used for printouts.
+
+Inputs: $num,$subst,$limit,$crstype
+where $num is the unique identifier, $subst is the current 
+substitution (n,c or a, for name, course or note respectively,
+$limit is the current size limit (integer), and $crstype is
+course type - course or community.
+
+Returns: $output
+HTML mark-up for selectbox and textbox (separate table cells).  
+
+=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.
+
+Returns: nothing
+
+=back
+
+=cut
+
+
 package Apache::courseprefs;
 
 use strict;
@@ -545,10 +724,14 @@
                                     my @cloners = split(',',$env{'form.'.$entry});
                                     my @okcloners;
                                     foreach my $cloner (@cloners) {
-                                        my ($uname,$udom) = split(':',$cloner);
-                                        if (&check_clone($udom,$disallowed,$uname) eq 'ok') {
-                                            if (!grep(/^\Q$cloner\E$/,@okcloners)) {
-                                                push(@okcloners,$cloner);
+                                        $cloner =~ s/^\s+//;
+                                        $cloner =~ s/\s+$//;
+                                        unless ($cloner eq '') {
+                                            my ($uname,$udom) = split(':',$cloner);
+                                            if (&check_clone($udom,$disallowed,$uname) eq 'ok') {
+                                                if (!grep(/^\Q$cloner\E$/,@okcloners)) {
+                                                    push(@okcloners,$cloner);
+                                                }
                                             }
                                         }
                                     }
@@ -838,7 +1021,7 @@
 sub store_changes {
     my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_;
     my ($chome,$output);
-    my (%storehash,@delkeys,@need_env_update);
+    my (%storehash,@delkeys,@need_env_update,@oldcloner);
     if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {
         %storehash = %{$values};
     } else {
@@ -993,6 +1176,16 @@
                                     }
                                     $storehash{$key} = $changes->{$item}{$key};
                                 }
+                                if ($key eq 'cloners') {
+                                    # Get existing cloners
+                                    my %clonenames = 
+                                        &Apache::lonnet::dump('environment',$cdom,$cnum,'cloners');
+                                    if ($clonenames{'cloners'} =~ /,/) {
+                                        @oldcloner = split(/\s*\,\s*/,$clonenames{'cloners'});
+                                    } else {
+                                        $oldcloner[0] = $clonenames{'cloners'};
+                                    }
+                                }
                                 if (($key eq 'description') || ($key eq 'cloners') ||
                                     ($key eq 'hidefromcat') || ($key eq 'categories')) {
                                     push(@need_env_update,$key);
@@ -1012,6 +1205,14 @@
         }
     }
     if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') {
+        if (ref($changes) eq 'HASH') {
+            if (ref($changes->{'courseinfo'}) eq 'HASH') {
+                if (exists($changes->{'courseinfo'}{'cloners'})) {
+                    &change_clone($cdom,$cnum,$changes->{'courseinfo'}{'cloners'},
+                                  \@oldcloner);
+                }
+            }
+        }
         if (@delkeys) {
             if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') {
                 $output .= '<br /><span class="LC_error">';
@@ -1400,11 +1601,18 @@
                 if (@entries > 0) {
                     foreach my $entry (@entries) {
                         my ($uname,$udom) = split(/:/,$entry);
+                        if ($udom =~ /^$match_domain$/) {
+                            unless (&Apache::lonnet::domain($udom)) {
+                                next;
+                            }
+                        } else {
+                            next;
+                        }
                         if ($uname eq '*') {
                             $datatable .= 
                                 &Apache::loncommon::start_data_table_row().
                                 '<td valign="top" align="left"><span class="LC_nobreak">'.
-                                &mt('Domain:').'<b>&nbsp;'.$udom.
+                                &mt('Any user in domain:').'<b>&nbsp;'.$udom.
                                 '</b><input type="hidden" name="cloners_dom_'.$num.
                                 '" value="'.$udom.'" /></span><br />'.
                                 '<span class="LC_nobreak"><label><input type="checkbox" '.
@@ -1412,8 +1620,10 @@
                                 &mt('Delete').'</label></span></td>'.
                                 &Apache::loncommon::end_data_table_row();
                             $num ++;
-                        } else {
-                            push(@cloners,$entry);
+                        } elsif (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+                            unless (grep(/^\Q$entry\E$/,@cloners)) {
+                                push(@cloners,$entry);
+                            }
                         }
                     }
                 }
@@ -2642,9 +2852,9 @@
         $currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'.
                    $settings->{$item}.'</tt></span></b><br />';
         my @current = split(/(%\d*[nca])/,$settings->{$item});
-        foreach my $item (@current) {
-            unless ($item eq '') {
-                push(@curr,$item);
+        foreach my $val (@current) {
+            unless ($val eq '') {
+                push(@curr,$val);
             }
         }
         $currnum = @curr;
@@ -2797,4 +3007,66 @@
     return $output;
 }
 
+sub change_clone {
+    my ($cdom,$cnum,$clonelist,$oldcloner) = @_;
+    my $clone_crs = $cnum.':'.$cdom;
+    if ($cnum && $cdom) {
+        my $clone_crs = $cnum.':'.$cdom;
+        my @allowclone;
+        if ($clonelist =~ /,/) {
+            @allowclone = split(',',$clonelist);
+        } else {
+            $allowclone[0] = $clonelist;
+        }
+        foreach my $currclone (@allowclone) {
+            if (!grep(/^$currclone$/,@$oldcloner)) {
+                if ($currclone ne '*') {
+                    my ($uname,$udom) = split(/:/,$currclone);
+                    if ($uname && $udom && $uname ne '*') {
+                        if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+                            my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
+                            if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
+                                if ($currclonecrs{'cloneable'} eq '') {
+                                    $currclonecrs{'cloneable'} = $clone_crs;
+                                } else {
+                                    $currclonecrs{'cloneable'} .= ','.$clone_crs;
+                                }
+                                &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        foreach my $oldclone (@$oldcloner) {
+            if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
+                if ($oldclone ne '*') {
+                    my ($uname,$udom) = split(/:/,$oldclone);
+                    if ($uname && $udom && $uname ne '*' ) {
+                        if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+                            my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
+                            my %newclonecrs = ();
+                            if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
+                                if ($currclonecrs{'cloneable'} =~ /,/) {
+                                    my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
+                                    foreach my $crs (@currclonecrs) {
+                                        if ($crs ne $clone_crs) {
+                                            $newclonecrs{'cloneable'} .= $crs.',';
+                                        }
+                                    }
+                                    $newclonecrs{'cloneable'} =~ s/,$//;
+                                } else {
+                                    $newclonecrs{'cloneable'} = '';
+                                }
+                                &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return;
+}
+
 1;

--raeburn1266713222--