-
-
+ ';
+ if (exists $item->{'header'}->[0]->{'col1'} ||
+ exists $item->{'header'}->[0]->{'col2'}) {
+ $output .= '
+
'.&mt($item->{'header'}->[0]->{'col1'}).'
'.&mt($item->{'header'}->[0]->{'col2'}).'
- ';
+ ';
+ }
$rowtotal ++;
if ($action eq 'feedback') {
- $output .= &print_feedback('top',$cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal);
} elsif ($action eq 'classlists') {
- $output .= &print_classlists('top',$cdom,$settings,\$rowtotal);
+ $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype);
}
$output .= '
-
+
'.&mt($item->{'header'}->[1]->{'col1'}).' ';
@@ -255,52 +588,60 @@ sub print_config_box {
'.&mt($item->{'header'}->[1]->{'col2'}).'
';
if ($action eq 'classlists') {
- $output .= &print_classlists('middle',$cdom,$settings,\$rowtotal).
+ $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype).
'
-
-
- '.&mt($item->{'header'}->[2]->{'col1'}).'
- '.&mt($item->{'header'}->[2]->{'col2'}).'
- ';
+ ';
+ if (exists $item->{'header'}->[2]->{'col1'} ||
+ exists $item->{'header'}->[2]->{'col2'}) {
+ $output .= '
+
+ '.&mt($item->{'header'}->[2]->{'col1'}).'
+ '.&mt($item->{'header'}->[2]->{'col2'}).'
+ ';
+ }
}
} else {
$output .= '
-
-
+ ';
+ if (exists $item->{'header'}->[0]->{'col1'} ||
+ exists $item->{'header'}->[0]->{'col2'}) {
+ $output .= '
+
'.&mt($item->{'header'}->[0]->{'col1'}).'
'.&mt($item->{'header'}->[0]->{'col2'}).'
- ';
+ ';
+ }
}
$rowtotal ++;
if ($action eq 'courseinfo') {
- $output .= &print_courseinfo($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'localization') {
- $output .= &print_localization($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal);
} elsif ($action eq 'feedback') {
- $output .= &print_feedback('bottom',$cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_feedback('bottom',$cdom,$settings,$ordered,$itemtext,\$rowtotal);
} elsif ($action eq 'discussion') {
- $output .= &print_discussion($cdom,$settings,$ordered,\$rowtotal);
- } elsif ($action eq 'classlists') {
- $output .= &print_classlists('bottom',$cdom,$settings,\$rowtotal);
+ $output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal);
+ } elsif (($action eq 'classlists') || ($action eq 'viewableroster')) {
+ $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'appearance') {
- $output .= &print_appearance($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'grading') {
- $output .= &print_grading($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'printouts') {
- $output .= &print_printouts($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'spreadsheet') {
- $output .= &print_spreadsheet($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'bridgetasks') {
- $output .= &print_bridgetasks($cdom,$settings,$ordered,\$rowtotal);
+ $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
} elsif ($action eq 'other') {
- $output .= &print_other($cdom,$settings,$allitems,\$rowtotal);
+ $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype);
}
$output .= '
@@ -311,12 +652,961 @@ sub print_config_box {
}
sub process_changes {
- my ($r,$cdom,$action,$values) = @_;
- my %domconfig;
- if (ref($values) eq 'HASH') {
- %domconfig = %{$values};
+ my ($cdom,$action,$values,$item,$changes,$allitems,$disallowed,$crstype) = @_;
+ my %newvalues;
+ if (ref($item) eq 'HASH') {
+ if (ref($changes) eq 'HASH') {
+ my @ordered;
+ if ($action eq 'other') {
+ @ordered = &get_other_items($cdom,$values,$allitems);
+ if ($env{'form.newp_name'} ne '') {
+ my $newp = $env{'form.newp_name'};
+ if ($env{'form.newp_value'} ne '') {
+ if (ref($allitems) eq 'ARRAY') {
+ unless ((grep(/^\Q$newp\E$/,@ordered)) ||
+ (grep(/^\Q$newp\E$/,@{$allitems}))) {
+ $changes->{$newp} = $env{'form.newp_value'};
+ }
+ }
+ }
+ }
+ } elsif (ref($item->{'ordered'}) eq 'ARRAY') {
+ if ($action eq 'courseinfo') {
+ my ($can_toggle_cat,$can_categorize) =
+ &can_modify_catsettings($cdom,$crstype);
+ foreach my $entry (@{$item->{'ordered'}}) {
+ next if (($entry eq 'hidefromcat') &&
+ (!$can_toggle_cat));
+ next if (($entry eq 'categories') &&
+ (!$can_categorize));
+ next if (($entry eq 'loncaparev') ||
+ ($entry eq 'owner'));
+ push(@ordered,$entry);
+ }
+ } else {
+ @ordered = @{$item->{'ordered'}};
+ }
+ }
+ if (@ordered > 0) {
+ if ($action eq 'feedback') {
+ foreach my $entry (@ordered) {
+ my $userstr = '';
+ my $total = $env{'form.'.$entry.'_total'};
+ if ($total) {
+ my @deletes = &Apache::loncommon::get_env_multiple('form.'.$entry.'_delete');
+ for (my $i=0; $i<$total; $i++) {
+ unless (grep(/^$i$/,@deletes)) {
+ $userstr .= $env{'form.'.$entry.'_user_'.$i}.
+ &get_sec_str($entry,$i).',';
+ }
+ }
+ } else {
+ $total = 0;
+ }
+ if ($env{'form.'.$entry.'_uname_'.$total} ne '') {
+ my $uname = $env{'form.'.$entry.'_uname_'.$total};
+ my $udom = $env{'form.'.$entry.'_udom_'.$total};
+ if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
+ $userstr =~ s/,$//;
+ $disallowed->{'feedback'}{$entry} = $uname.':'.$udom;
+ } else {
+ $userstr .= $uname.':'.$udom.&get_sec_str($entry,$total);
+ }
+ } else {
+ $userstr =~ s/,$//;
+ }
+ $newvalues{$entry} = $userstr;
+ if ($newvalues{$entry} ne $values->{$entry}) {
+ $changes->{$entry} = $newvalues{$entry};
+ }
+ my $ext_entry = $entry.'.text';
+ $newvalues{$ext_entry} = $env{'form.'.$ext_entry};
+ if ($newvalues{$ext_entry} ne $values->{$ext_entry}) {
+ $changes->{$ext_entry} = $newvalues{$ext_entry};
+ }
+ }
+ } else {
+ foreach my $entry (@ordered) {
+ if ($entry eq 'cloners') {
+ if ($env{'form.cloners_all'}) {
+ $newvalues{$entry} = '*';
+ } else {
+ my @clonedoms;
+ if (exists($env{'form.cloners_activate'})) {
+ my $actnum = $env{'form.cloners_activate'};
+ if ($actnum ne '') {
+ if ($env{'form.cloners_dom_'.$actnum} ne '') {
+ my $clonedom = $env{'form.cloners_dom_'.$actnum};
+ if (&check_clone($clonedom,$disallowed) eq 'ok') {
+ $newvalues{$entry} = '*:'.$clonedom;
+ push(@clonedoms,$newvalues{$entry});
+ }
+ }
+ }
+ } else {
+ my $num = $env{'form.cloners_total'};
+ my @deletes =
+ &Apache::loncommon::get_env_multiple('form.cloners_delete');
+ for (my $i=0; $i<$num; $i++) {
+ if (!grep(/^$i$/,@deletes)) {
+ my $clonedom = $env{'form.cloners_dom_'.$i};
+ if (&check_clone($clonedom,$disallowed) eq 'ok') {
+ if (!grep(/^\*:\Q$clonedom\E$/,@clonedoms)) {
+ push (@clonedoms,'*:'.$clonedom);
+ }
+ }
+ }
+ }
+ if (@clonedoms) {
+ $newvalues{$entry}=join(',',@clonedoms);
+ }
+ }
+ if ($env{'form.cloners_newdom'} ne '') {
+ my $clonedom = $env{'form.cloners_newdom'};
+ if (&check_clone($clonedom,$disallowed) eq 'ok') {
+ my $newdom = '*:'.$env{'form.cloners_newdom'};
+ if (@clonedoms) {
+ if (!grep(/^\Q$newdom\E$/,@clonedoms)) {
+ $newvalues{$entry} .= ','.$newdom;
+ }
+ } else {
+ $newvalues{$entry} = $newdom;
+ }
+ }
+ }
+ if ($env{'form.'.$entry} ne '') {
+ my @cloners = split(',',$env{'form.'.$entry});
+ my @okcloners;
+ foreach my $cloner (@cloners) {
+ $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);
+ }
+ }
+ }
+ }
+ if (@okcloners) {
+ my $okclonestr = join(',',@okcloners);
+ if ($newvalues{$entry} ne '') {
+ $newvalues{$entry} .= ','.$okclonestr;
+ } else {
+ $newvalues{$entry} = $okclonestr;
+ }
+ }
+ }
+ }
+ if (ref($disallowed) eq 'HASH') {
+ if (ref($disallowed->{'cloners'}) eq 'HASH') {
+ foreach my $key (keys(%{$disallowed->{'cloners'}})) {
+ $disallowed->{'cloners'}{$key} =~ s/,$//;
+ }
+ }
+ }
+ } 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') {
+ my %adv_roles =
+ &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);
+ my @stds;
+ if ($crstype eq 'Community') {
+ @stds = ('co');
+ } else {
+ @stds = ('cc');
+ }
+ push(@stds,('in','ta','ep','ad','st'));
+ my (@replacements,@regulars);
+ foreach my $role (@stds) {
+ if ($values->{$role.'.plaintext'} ne '') {
+ push(@replacements,$role);
+ } else {
+ push(@regulars,$role);
+ }
+ }
+ foreach my $stdrole (@stds) {
+ my $ext_entry = $entry.'_'.$stdrole;
+ my $stdname = &Apache::lonnet::plaintext($stdrole,$crstype,
+ $env{'request.course.id'},1);
+ if ($env{'form.'.$ext_entry} eq $stdname) {
+ $newvalues{$ext_entry} = '';
+ } else {
+ $newvalues{$ext_entry} = $env{'form.'.$ext_entry};
+ }
+ if ($newvalues{$ext_entry} ne $values->{$stdrole.'.plaintext'}) {
+ my $dupname = 0;
+ if ($newvalues{$ext_entry} ne '') {
+ if (grep(/^\Q$newvalues{$ext_entry}\E$/,@replacements)) {
+ $dupname = 1;
+ push(@{$disallowed->{'rolenames'}{'replacements'}},$newvalues{$ext_entry});
+ }
+ if (!$dupname) {
+ if (grep(/^\Q$newvalues{$ext_entry}\E$/,@regulars)) {
+ $dupname = 1;
+ push(@{$disallowed->{rolenames}{'regulars'}},$newvalues{$ext_entry});
+ }
+ }
+ if (!$dupname) {
+ foreach my $role (keys(%adv_roles)) {
+ if ($role =~ m{^cr/$match_domain/$match_name/\Q$newvalues{$ext_entry}\E$}) {
+ $dupname = 1;
+ push(@{$disallowed->{rolenames}{'customrole'}},$newvalues{$ext_entry});
+ last;
+ }
+ }
+ }
+ }
+ if (!$dupname) {
+ $changes->{$ext_entry} = $newvalues{$ext_entry};
+ }
+ }
+ }
+ } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied')) {
+ my @denied = &Apache::loncommon::get_env_multiple('form.'.$entry);
+ @denied = sort(@denied);
+ my $deniedstr = '';
+ if (@denied > 0) {
+ $deniedstr = join(',',@denied);
+ }
+ $newvalues{$entry} = $deniedstr;
+ } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied')) {
+ my $total = $env{'form.'.$entry.'_total'};
+ my $userstr = '';
+ my @denied;
+ if ($total > 0) {
+ my @deletes =
+ &Apache::loncommon::get_env_multiple('form.'.$entry.'_delete');
+ for (my $i=0; $i<$total; $i++) {
+ unless (grep(/^$i$/,@deletes)) {
+ $userstr .= $env{'form.'.$entry.'_user_'.$i}.',';
+ push(@denied,$env{'form.'.$entry.'_user_'.$i});
+ }
+ }
+ } else {
+ $total = 0;
+ }
+ if ($env{'form.'.$entry.'_uname_'.$total} ne '') {
+ my $uname = $env{'form.'.$entry.'_uname_'.$total};
+ my $udom = $env{'form.'.$entry.'_udom_'.$total};
+ if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
+ $userstr =~ s/,$//;
+ $disallowed->{'discussion'}{$entry} = $uname.':'.$udom;
+ } else {
+ my $newuser .= $uname.':'.$udom;
+ if (grep(/^\Q$newuser\E$/,@denied)) {
+ $userstr =~ s/,$//;
+ } else {
+ $userstr .= $newuser;
+ }
+ }
+ } else {
+ $userstr =~ s/,$//;
+ }
+ $newvalues{$entry} = $userstr;
+ } elsif ($entry eq 'allow_discussion_post_editing') {
+ my @canedit = &Apache::loncommon::get_env_multiple('form.'.$entry);
+ @canedit = sort(@canedit);
+ foreach my $role (@canedit) {
+ my @secs = &Apache::loncommon::get_env_multiple('form.'.$entry.'_sections_'.$role);
+ if ((grep(/^\s*$/,@secs)) || (@secs == 0)) {
+ $newvalues{$entry} .= $role.',';
+ } else {
+ foreach my $sec (@secs) {
+ $newvalues{$entry} .= $role.':'.$sec.',';
+ }
+ }
+ }
+ $newvalues{$entry} =~ s/,$//;
+ } elsif ($entry eq 'discussion_post_fonts') {
+ my ($classorder,$classtitles) = &discussion_vote_classes();
+ my $fontchange = 0;
+ foreach my $class (@{$classorder}) {
+ my $ext_entry = $entry.'_'.$class;
+ my $size = $env{'form.'.$ext_entry.'_size'};
+ my $unit = $env{'form.'.$ext_entry.'_unit'};
+ my $weight = $env{'form.'.$ext_entry.'_weight'};
+ my $style = $env{'form.'.$ext_entry.'_style'};
+ my $other = $env{'form.'.$ext_entry.'_other'};
+ $size =~ s/,//g;
+ $unit =~ s/,//g;
+ $weight =~ s/,//g;
+ $style =~ s/,//g;
+ $other =~ s/[^\w;:\s\-\%.]//g;
+ $other =~ s/(^\s+|\s+$)//g;
+ $newvalues{$ext_entry} = join(',',($size.$unit,$weight,$style,$other));
+ my $current = $values->{$ext_entry};
+ if ($values->{$ext_entry} eq '') {
+ $current = ',,,';
+ }
+ if ($newvalues{$ext_entry} ne $current) {
+ $changes->{$ext_entry} = $newvalues{$ext_entry};
+ $fontchange ++;
+ }
+ }
+ if ($fontchange) {
+ $changes->{$entry} = 1;
+ }
+ } elsif ($entry eq 'nothideprivileged') {
+ my @curr_nothide;
+ my @new_nothide;
+ if ($values->{$entry} ne '') {
+ foreach my $user (split(/\s*\,\s*/,$values->{$entry})) {
+ my $nothide;
+ if ($user !~ /:/) {
+ $nothide = join(':',split(/[\@]/,$user));
+ } else {
+ $nothide = $user;
+ }
+ if ((defined($nothide)) &&
+ (!grep(/^\Q$nothide\E$/,@curr_nothide))) {
+ push(@curr_nothide,$nothide);
+ }
+ }
+ }
+ foreach my $key (keys(%env)) {
+ if ($key =~ /^form\.\Q$entry\E_($match_username:$match_domain)$/) {
+ if ($env{$key}) {
+ my $nothide = $1;
+ if (!grep(/^\Q$nothide\E$/,@new_nothide)) {
+ push(@new_nothide,$nothide);
+ }
+ }
+ }
+ }
+ @new_nothide = sort(@new_nothide);
+ my @differences =
+ &Apache::loncommon::compare_arrays(\@curr_nothide,
+ \@new_nothide);
+ if (@differences > 0) {
+ if (@new_nothide > 0) {
+ $newvalues{$entry} = join(',',@new_nothide);
+ } else {
+ $newvalues{$entry} = '';
+ }
+ } else {
+ $newvalues{$entry} = $values->{$entry};
+ }
+ } elsif ($entry eq 'print_header_format') {
+ my $maxnum = $env{'form.printfmthdr_maxnum'};
+ my @newhdr;
+ if ($maxnum > 2) {
+ for (my $i=0; $i<$maxnum-2; $i++) {
+ if ($env{'form.printfmthdr_del_'.$i}) {
+ $newhdr[$env{'form.printfmthdr_pos_'.$i}] = '';
+ } else {
+ my $hdr;
+ if ($env{'form.printfmthdr_sub_'.$i} =~ /^[nca]$/) {
+ $hdr = '%';
+ if ($env{'form.printfmthdr_limit_'.$i} =~ /^\d+$/) {
+ $hdr .= $env{'form.printfmthdr_limit_'.$i};
+ }
+ $hdr .= $env{'form.printfmthdr_sub_'.$i};
+ } elsif ($env{'form.printfmthdr_text_'.$i} ne '') {
+ $hdr = $env{'form.printfmthdr_text_'.$i};
+ }
+ $newhdr[$env{'form.printfmthdr_pos_'.$i}] = $hdr;
+ }
+ }
+ }
+ my $newsub = $maxnum-2;
+ if ($env{'form.printfmthdr_sub_'.$newsub} =~ /^[nca]$/) {
+ my $hdr = '%';
+ if ($env{'form.printfmthdr_limit_'.$newsub} =~ /^\d+$/) {
+ $hdr .= $env{'form.printfmthdr_limit_'.$newsub};
+ }
+ $hdr .= $env{'form.printfmthdr_sub_'.$newsub};
+ $newhdr[$env{'form.printfmthdr_pos_'.$newsub}] = $hdr;
+ }
+ my $newtext = $maxnum-1;
+ $newhdr[$env{'form.printfmthdr_pos_'.$newtext}] = $env{'form.printfmthdr_text_'.$newtext};
+ $newvalues{$entry} = join('',@newhdr);
+ } elsif ($entry eq 'languages') {
+ my $langstr;
+ my $total = $env{'form.'.$entry.'_total'};
+ if ($total) {
+ my @deletes = &Apache::loncommon::get_env_multiple('form.'.$entry.'_delete');
+ for (my $i=0; $i<$total; $i++) {
+ unless (grep(/^$i$/,@deletes)) {
+ $langstr .= $env{'form.'.$entry.'_'.$i}.',';
+ }
+ }
+ } else {
+ $total = 0;
+ }
+ if ($env{'form.'.$entry.'_'.$total} ne '') {
+ my $newlang = $env{'form.'.$entry.'_'.$total};
+ my %langchoices = &get_lang_choices();
+ if ($langchoices{$newlang}) {
+ $langstr .= $newlang;
+ } else {
+ $langstr =~ s/,$//;
+ $disallowed->{'localization'}{$entry} = $newlang;
+ }
+ } else {
+ $langstr =~ s/,$//;
+ }
+ $newvalues{$entry} = $langstr;
+ } else {
+ $newvalues{$entry} = $env{'form.'.$entry};
+ }
+ unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts')) {
+ if ($newvalues{$entry} ne $values->{$entry}) {
+ $changes->{$entry} = $newvalues{$entry};
+ }
+ }
+ }
+ }
+ }
+ }
}
- return &modify_crsenv($action,$cdom,%domconfig);
+ return;
+}
+
+sub get_sec_str {
+ my ($entry,$num) = @_;
+ my @secs = &Apache::loncommon::get_env_multiple('form.'.$entry.'_sections_'.$num);
+ my $secstr;
+ if (grep(/^\s*$/,@secs)) {
+ $secstr = '';
+ } elsif (@secs > 0) {
+ $secstr = join(';',@secs);
+ }
+ if ($secstr ne '') {
+ return '('.$secstr.')';
+ }
+ return;
+}
+
+sub check_clone {
+ my ($clonedom,$disallowed,$clonename) = @_;
+ return if (ref($disallowed) ne 'HASH');
+ if ($clonedom !~ /^$match_domain$/) {
+ $disallowed->{'cloners'}{'format'} .= $clonedom.',';
+ return;
+ } elsif (!&Apache::lonnet::domain($clonedom)) {
+ $disallowed->{'cloners'}{'domain'} .= $clonedom.',';
+ return;
+ }
+ if ($clonename ne '') {
+ if ($clonename !~ /^$match_username$/) {
+ $disallowed->{'cloners'}{'format'} .= $clonename.':'.$clonedom.',';
+ return;
+ } else {
+ if (&Apache::lonnet::homeserver($clonename,$clonedom) eq 'no_host') {
+ $disallowed->{'cloners'}{'newuser'} .= $clonename.':'.$clonedom.',';
+ return;
+ }
+ }
+ }
+ return 'ok';
+}
+
+sub store_changes {
+ my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_;
+ my ($chome,$output);
+ my (%storehash,@delkeys,@need_env_update,@oldcloner);
+ if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {
+ %storehash = %{$values};
+ } else {
+ if ($crstype eq 'Community') {
+ $output = &mt('No changes made to community settings.');
+ } else {
+ $output = &mt('No changes made to course settings.');
+ }
+ return $output;
+ }
+ my %yesno = (
+ hidefromcat => '1',
+ problem_stream_switch => '1',
+ suppress_tries => '1',
+ disableexampointprint => '1',
+ hideemptyrows => '1',
+ suppress_embed_prompt => '1',
+ );
+ foreach my $item (@{$prefs_order}) {
+ if (grep(/^\Q$item\E$/,@{$actions})) {
+ $output .= ''.&mt($prefs->{$item}{'text'}).' ';
+ if (ref($changes->{$item}) eq 'HASH') {
+ if (keys(%{$changes->{$item}}) > 0) {
+ $output .= &mt('Changes made:').'';
+ if ($item eq 'other') {
+ foreach my $key (sort(keys(%{$changes->{$item}}))) {
+ $storehash{$key} = $changes->{$item}{$key};
+ if ($changes->{$item}{$key} eq '') {
+ push(@delkeys,$key);
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',''.$key.' ')).' ';
+ } else {
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',''.$key.' ',
+ "'$storehash{$key}'")).' ';
+ }
+ }
+ } else {
+ if (ref($prefs->{$item}->{'ordered'}) eq 'ARRAY') {
+ my @settings = @{$prefs->{$item}->{'ordered'}};
+ if ($item eq 'feedback') {
+ push(@settings,(map { $_.'.text'; } @settings));
+ }
+ foreach my $key (@settings) {
+ if ($key eq 'rolenames') {
+ my $displayname = $prefs->{$item}->{'itemtext'}{$key};
+ my $msg;
+ my @roles;
+ if ($crstype eq 'Community') {
+ @roles = ('co');
+ } else {
+ @roles = ('cc');
+ }
+ push(@roles,('in','ta','ep','ad','st'));
+ foreach my $role (@roles) {
+ next if (!exists($changes->{$item}{$key.'_'.$role}));
+ my $stdname = &Apache::lonnet::plaintext($role,$crstype,undef,1);
+ my $newname = $changes->{$item}{$key.'_'.$role};
+ $storehash{$role.'.plaintext'} = $newname;
+ if ($newname eq '') {
+ $newname = $stdname;
+ }
+ $msg .= ''.&mt('[_1] set to [_2]',''.$stdname.' ',
+ "'".$newname." '").' ';
+ }
+ if ($msg ne '') {
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt($displayname)).' ';
+ }
+ } else {
+ next if (!exists($changes->{$item}{$key}));
+ my ($displayname,$text);
+ $text = $prefs->{$item}->{'itemtext'}{$key};
+ my $displayval;
+ unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts')) {
+ $displayval = $changes->{$item}{$key};
+ }
+ if ($item eq 'feedback') {
+ if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {
+ $text = $prefs->{$item}->{'itemtext'}{$1.$2};
+ $displayname = &mt('Custom text for '.$text.' questions');
+ } else {
+ $displayname = &mt('Recipients of '.$text.' questions');
+ }
+ } elsif ($item eq 'discussion') {
+ if ($key =~ /^p(lc|ch)\.roles\.denied/) {
+ $displayname = &mt("$text (role-based)");
+ if ($displayval ne '') {
+ my @roles = split(',',$displayval);
+ @roles = map { &Apache::lonnet::plaintext($_); } @roles;
+ $displayval = join(', ',@roles);
+ }
+ } elsif ($key =~ /^p(lc|ch)\.users\.denied/) {
+ $displayname = &mt("$text (specific user(s))");
+ } else {
+ if ($key eq 'allow_discussion_post_editing') {
+ if ($displayval ne '') {
+ my @roles = split(',',$displayval);
+ my @longroles;
+ foreach my $role (@roles) {
+ my ($trole,$sec) = split(':',$role);
+ my $rolename =
+ &Apache::lonnet::plaintext($trole);
+ if ($sec ne '') {
+ $rolename .= ':'.$sec;
+ }
+ push(@longroles,$rolename);
+ }
+ $displayval = join(', ',@longroles);
+ }
+ } elsif ($key eq 'discussion_post_fonts') {
+ my ($classorder,$classtitles)=&discussion_vote_classes();
+ my ($styleorder,$styleitems)=&discussion_vote_styles();
+ my $count = 1;
+ my $total = scalar(keys(%{$changes->{$item}}));
+ foreach my $class (@{$classorder}) {
+ $count ++;
+ next unless ($changes->{$item}{$key.'_'.$class});
+ my @vals = split(/,/,$changes->{$item}{$key.'_'.$class});
+ my $showval = '';
+ for (my $i=0; $i<@{$styleorder}; $i++) {
+ if ($vals[$i] ne '') {
+ $showval .= 'font-'.$styleorder->[$i].': '.$vals[$i].'; ';
+ }
+ }
+ if ($vals[3] ne '') {
+ $showval .= $vals[3];
+ }
+ if ($showval ne '') {
+ $displayval .= $classtitles->{$class}.':{ '.
+ $showval.'}';
+ $storehash{$key.'_'.$class} = $changes->{$item}{$key.'_'.$class};
+ } else {
+ $displayval .= $classtitles->{$class}.': '.&mt('None');
+ push(@delkeys,$key.'_'.$class);
+ }
+ unless ($count == $total) {
+ $displayval .= (' 'x2);
+ }
+ }
+ }
+ $displayname = &mt($text);
+ }
+ } elsif ($item eq 'spreadsheet') {
+ if ($key =~ /^spreadsheet_default_(studentcalc|assesscalc)$/x) {
+ my $sheettype = $1;
+ if ($sheettype eq 'studentcalc') {
+ &Apache::lonnet::expirespread('','','studentcalc');
+ } else {
+ &Apache::lonnet::expirespread('','','assesscalc');
+ &Apache::lonnet::expirespread('','','studentcalc');
+ }
+ }
+ $displayname = &mt($text);
+ } else {
+ $displayname = &mt($text);
+ }
+ if (defined($yesno{$key})) {
+ $displayval = &mt('No');
+ if ($changes->{$item}{$key} eq 'yes') {
+ $displayval = &mt('Yes');
+ }
+ } elsif (($key =~ /^default_enrollment_(start|end)_date$/) && ($displayval)) {
+ $displayval = &Apache::lonlocal::locallocaltime($displayval);
+ } elsif ($key eq 'categories') {
+ $displayval = $env{'form.categories_display'};
+ } elsif ($key eq 'canuse_pdfforms') {
+ if ($changes->{$item}{$key} eq '1') {
+ $displayval = &mt('Yes');
+ } elsif ($changes->{$item}{$key} eq '0') {
+ $displayval = &mt('No');
+ }
+ }
+ 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 .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
+ ''.$displayname.' ')).' ';
+ }
+ } elsif (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
+ $displayval = join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } split(',',$changes->{$item}{$key}{$type}));
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
+ ''.$displayname.' ',
+ "'$displayval '")).' ';
+ }
+ }
+ }
+ 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 .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).' ';
+ } elsif ($env{'form.remove_coowoner'}) {
+ $displayval = &mt('off');
+ }
+ if ($displayval) {
+ $displayname = &mt('Your co-ownership status');
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
+ ''.$displayname.' ',
+ "'$displayval '")).' ';
+ }
+ }
+ }
+ } elsif ($changes->{$item}{$key} eq '') {
+ push(@delkeys,$key);
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
+ ''.$displayname.' ')).' ';
+ } else {
+ $output .= ''.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
+ ''.$displayname.' ',
+ "'$displayval '"));
+ if ($key eq 'url') {
+ my $bkuptime=time;
+ $output .= (' 'x2).&mt('(Previous URL backed up)').': '.
+ $storehash{'top level map backup '.$bkuptime} = $values->{$key};
+ }
+ $output .= ' ';
+ }
+ 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 {
+ unless ($key eq 'discussion_post_fonts') {
+ $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') ||
+ ($key eq 'co-owners')) {
+ push(@need_env_update,$key);
+ }
+ }
+ }
+ }
+ $output .= ' ';
+ } else {
+ if ($crstype eq 'Community') {
+ $output .= &mt('No changes made to community settings.');
+ } else {
+ $output .= &mt('No changes made to course settings.');
+ }
+ }
+ }
+ }
+ }
+ 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 .= '';
+ if ($crstype eq 'Community') {
+ $output .= &mt('An error occurred when removing community settings which are no longer in use.');
+ } else {
+ $output .= &mt('An error occurred when removing course settings which are no longer in use.');
+ }
+ $output .= ' ';
+ } else {
+ foreach my $key (@delkeys) {
+ &Apache::lonnet::delenv('course.'.$cdom.'_'.$cnum.'.'.$key);
+ }
+ }
+ }
+ if (@need_env_update) {
+ $chome = &Apache::lonnet::homeserver($cnum,$cdom);
+ &update_env($cnum,$cdom,$chome,\@need_env_update,\%storehash);
+ }
+ &Apache::lonnet::coursedescription($env{'request.course.id'},
+ {'freshen_cache' => 1});
+ } else {
+ $output = '';
+ if ($crstype eq 'Community') {
+ $output .= &mt('An error occurred when saving changes to community settings, which remain unchanged.');
+ } else {
+ $output .= &mt('An error occurred when saving changes to course settings, which remain unchanged.');
+ }
+ $output .= ' ';
+ }
+ return $output;
+}
+
+sub update_env {
+ my ($cnum,$cdom,$chome,$need_env_update,$storehash) = @_;
+ my $count = 0;
+ if ((ref($need_env_update) eq 'ARRAY') && (ref($storehash) eq 'HASH')) {
+ my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,undef,undef,'.');
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ foreach my $key (@{$need_env_update}) {
+ if ($key eq 'description' && defined($storehash->{$key})) {
+ &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $storehash->{$key}});
+ $crsinfo{$env{'request.course.id'}}{'description'} = $storehash->{$key};
+ $count ++;
+ } elsif (($key eq 'cloners') || ($key eq 'hidefromcat') || ($key eq 'categories')) {
+ &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) {
+ my $putresult = &Apache::lonnet::courseidput($cdom,\%crsinfo,$chome,'notime');
+ }
+ }
+ }
+ return;
+}
+
+sub display_disallowed {
+ my ($item,$disallowed,$prefs,$crstype) = @_;
+ my $output;
+ if ((ref($disallowed) eq 'HASH') && (ref($prefs) eq 'HASH')) {
+ if (keys(%{$disallowed})) {
+ if ($item eq 'cloners') {
+ my @fails;
+ my %lt = &Apache::lonlocal::texthash (
+ format => 'Invalid format',
+ domain => 'Domain does not exist',
+ newuser => 'LON-CAPA user(s) do(es) not exist.',
+ );
+ foreach my $error ('format','domain','newuser') {
+ if (defined($disallowed->{$error})) {
+ my $msg = ''.$disallowed->{$error}.' , '.&mt('reason').' - '.
+ $lt{$error};
+ if ($error eq 'newuser') {
+ $msg .= ' '.&mt("Please [_1]add the user(s)[_2] before returning to the [_3]$crstype Configuration[_2] to add as potential cloners.",'',' ','');
+ }
+ push(@fails,$msg);
+ }
+ }
+ if (@fails) {
+ $output .= ''.&mt('Unable to add to allowed cloners: ').
+ ' '.join('; ',@fails).'. ';
+ }
+ } elsif ($item eq 'rolenames') {
+ my %lt = &Apache::lonlocal::texthash (
+ replacements => 'Name already used to replace a different standard role name',
+ regulars => 'Name already used as a standard role name',
+ customrole => 'Name already used as the name of a custom role',
+ );
+ my @fails;
+ foreach my $error ('replacements','regulars','customrole') {
+ if (ref($disallowed->{$error}) eq 'ARRAY') {
+ push(@fails,''.join(', ',@{$disallowed->{$error}}).
+ ' , '.&mt('reason').' - '.$lt{'error'});
+ }
+ }
+ if (@fails) {
+ $output .= ''.
+ &mt('Unable to include amongst replacements for role names: ').
+ ' '.join('; ',@fails).'. ';
+ }
+
+ } elsif (($item eq 'feedback') || ($item eq 'discussion') || ($item eq 'localization')) {
+ $output .= '';
+ if ($item eq 'feedback') {
+ if ($crstype eq 'Community') {
+ $output .= &mt('Unable to include as a recipient of community feedback for:');
+ } else {
+ $output .= &mt('Unable to include as a recipient of course feedback for:');
+ }
+ } elsif ($item eq 'discussion') {
+ $output .= &mt('Unable to include in user-based access control for:');
+ } elsif ($item eq 'localization') {
+ if ($crstype eq 'Community') {
+ $output .= &mt('Unable to include in community localization:');
+ } else {
+ $output .= &mt('Unable to include in course localization:');
+ }
+ }
+ $output .= ' ';
+ foreach my $key (sort(keys(%{$disallowed}))) {
+ my $itemtext = $prefs->{$item}{'itemtext'}{$key};
+ $output .= ''.$itemtext.' - ';
+ if ($item eq 'localization') {
+ $output .= &mt('reason - unsupported language: [_1]',
+ ''.$disallowed->{$key}.' ');
+ } else {
+ $output .= &mt('reason - invalid user: [_1]',
+ ''.$disallowed->{$key}.' ').' ';
+ }
+ }
+ $output .= ' ';
+ }
+ }
+ }
+ return $output;
}
sub get_course {
@@ -330,11 +1620,12 @@ sub get_course {
}
sub get_jscript {
- my ($cdom) = @_;
- my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom);
- my ($jscript,$categorize_js);
+ my ($cid,$cdom,$phase,$crstype) = @_;
+ my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);
+ my ($jscript,$categorize_js,$loncaparev_js);
my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript();
my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');
+ my $cloners_js = &cloners_javascript($phase);
if ($can_categorize) {
$categorize_js = <'."\n".
- $browse_js."\n".$categorize_js."\n".''."\n".$stubrowse_js."\n";
+ $browse_js."\n".$categorize_js."\n".$loncaparev_js."\n".
+ $cloners_js."\n".''."\n".$stubrowse_js."\n";
return $jscript;
}
+sub cloners_javascript {
+ my ($formname) = @_;
+ return <<"ENDSCRIPT";
+
+function update_cloners(caller,num) {
+ var delidx = getIndexByName('cloners_delete');
+ var actidx = getIndexByName('cloners_activate');
+ if (caller == 'cloners_all') {
+ var selall;
+ for (var i=0; i{'categories'})."\n";
+ $settings->{'categories'},$crstype)."\n";
}
}
+ if (ref($domconf{'autoenroll'}) eq 'HASH') {
+ $autocoowner = $domconf{'autoenroll'}{'co-owners'};
+ }
if (!defined($categoriesform)) {
- $categoriesform = &mt('No categories defined for this domain');
+ $categoriesform = &mt('No categories defined in this domain.');
}
- my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom);
+ my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);
+ my $replace;
+ if ($crstype eq 'Community') {
+ $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank');
+ } else {
+ $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank');
+ }
my %items = (
- 'url' => {
- text => ''.&mt('Top Level Map').' '.(' 'x2).
+ 'url' => {
+ text => ''.&mt($itemtext->{'url'}).' '.(' 'x2).
'".
&mt('Select Map').' '.
@@ -386,47 +1782,58 @@ sub print_courseinfo {
' ',
input => 'textbox',
size => '40',
+ advanced => 1
},
'description' => {
- text => ''.&mt('Course Description').' ',
+ text => ''.&mt($itemtext->{'description'}).' ',
input => 'textbox',
size => '25',
},
+ 'owner' => {
+ text => ''.&mt($itemtext->{'owner'}).' ',
+ },
+ 'co-owners' => {
+ text => ''.&mt($itemtext->{'co-owners'}).' ',
+ },
'courseid' => {
- text => ''.&mt('Course ID or number').
- ' '.
- '('.&mt('internal, optional').')',
+ text => ''.&mt($itemtext->{'courseid'}).' '.'('.
+ &mt('internal, optional').')',
input => 'textbox',
size => '25',
},
'cloners' => {
- text => ''.&mt('Users allowed to clone course').' '.
- &mt('Course Coordinators included automatically'),
+ text => ''.&mt($itemtext->{'cloners'}).' '.
+ &mt('Owner and Coordinators included automatically'),
input => 'textbox',
- size => '40',
+ size => '40'
},
'rolenames' => {
- text => ''.&mt('Replacement titles for standard course roles').' '.
- '('.&mt('To replace the standard title for a course role, enter a title, otherwise leave blank').')',
+ text => ''.&mt($itemtext->{'rolenames'}).' '.
+ '('.$replace.')',
input => 'textbox',
size => '20',
+ advanced => 1
},
'externalsyllabus' => {
- text => ''.&mt('URL of Syllabus').' ('.&mt('not using internal handler)'),
+ text => ''.&mt($itemtext->{'externalsyllabus'}).' ('.
+ &mt('not using syllabus template)'),
input => 'textbox',
size => '40',
},
'hidefromcat' => {
- text => ''.&mt('Exclude from course catalog').' '.
+ text => ''.&mt($itemtext->{'hidefromcat'}).' '.
' ('.&mt('included by default if assigned institutional code, or categorized').')',
input => 'radio',
},
'categories' => {
- text => ''.&mt('Categorize course').' '.
+ text => ''.&mt($itemtext->{'categories'}).' '.
&mt('Display Categories').' ',
input => 'textbox',
size => '25',
},
+ 'loncaparev' => {
+ text => ''.&mt($itemtext->{'loncaparev'}).' ',
+ },
);
my $datatable;
my $count = 0;
@@ -437,7 +1844,11 @@ sub print_courseinfo {
next if (!$can_categorize);
}
$count ++;
- $datatable .= &item_table_row_start($items{$item}{text},$count);
+ if (exists $items{$item}{advanced} && $items{$item}{advanced} == 1) {
+ $datatable .= &item_table_row_start($items{$item}{text},$count,"advanced");
+ } else {
+ $datatable .= &item_table_row_start($items{$item}{text},$count);
+ }
if ($items{$item}{input} eq 'radio') {
$datatable .= &yesno_radio($item,$settings);
} elsif ($item eq 'cloners') {
@@ -472,20 +1883,29 @@ sub print_courseinfo {
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().
- ''.
- &mt('Domain:').' '.$udom.
+ ' '.
+ &mt('Any user in domain:').' '.$udom.
' '.
' '.
+ 'name="cloners_delete" value="'.$num.'" onchange="javascript:update_cloners('."'cloners_delete','$num'".');" />'.
&mt('Delete').' '.
&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);
+ }
}
}
}
@@ -504,7 +1924,9 @@ sub print_courseinfo {
$includeempty).
' '.
''.&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table().' '.
+ &Apache::loncommon::end_data_table().
+ ''.
&Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_row().
''.
@@ -516,7 +1938,14 @@ sub print_courseinfo {
&Apache::loncommon::end_data_table();
} elsif ($item eq 'rolenames') {
$datatable .= &Apache::loncommon::start_data_table();
- foreach my $role ('cc','in','ta','ep','ad','st') {
+ my @roles;
+ if ($crstype eq 'Community') {
+ @roles = ('co');
+ } else {
+ @roles = ('cc');
+ }
+ push (@roles,('in','ta','ep','ad','st'));
+ foreach my $role (@roles) {
$datatable .= &Apache::loncommon::start_data_table_row().
' '.
&Apache::lonnet::plaintext($role,$crstype,undef,1).
@@ -528,7 +1957,51 @@ sub print_courseinfo {
}
$datatable .= &Apache::loncommon::end_data_table().' ';
} elsif ($item eq 'categories') {
- $datatable .= ' '.&Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item},$items{$item}{size});
+ my $launcher = 'onFocus="this.blur();javascript:catsbrowser();";';
+ $datatable .= ' '.
+ &Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item},
+ $items{$item}{size},$launcher);
+ } elsif ($item eq 'owner') {
+ my $owner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
+ if ($owner =~ /:/) {
+ my ($ownername,$ownerdom) = split(':',$owner);
+ $owner = &Apache::loncommon::plainname($ownername,$ownerdom);
+ } elsif ($owner ne '') {
+ $owner = &Apache::loncommon::plainname($owner,$cdom);
+ } else {
+ $owner = &mt('None specified');
+ }
+ $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);
+ }
+ }
+ } elsif ($item eq 'loncaparev') {
+ my $loncaparev = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
+ my $showreqd;
+ if ($loncaparev) {
+ $showreqd = &mt('[_1] or newer',$loncaparev).' '.
+ &mt('Details').' ';
+ } else {
+ $showreqd = &mt('No specific version required');
+ }
+ $datatable .= $showreqd;
} else {
$datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size});
}
@@ -547,36 +2020,46 @@ sub new_cloners_dom_row {
&mt('Any user in domain:').' '.$newdom.' '.
(' 'x2).' '.
&mt('Yes').' '.(' 'x2).
' '.
- &mt('No').' '.
+ &mt('No').' '.
&Apache::loncommon::end_data_table_row();
}
return $output;
}
sub can_modify_catsettings {
- my ($dom) = @_;
+ my ($dom,$crstype) = @_;
my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);
my ($can_toggle_cat,$can_categorize);
if (ref($domconf{'coursecategories'}) eq 'HASH') {
- if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
- $can_toggle_cat = 1;
- }
- if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
- $can_categorize = 1;
+ if ($crstype eq 'Community') {
+ if ($domconf{'coursecategories'}{'togglecatscomm'} eq 'comm') {
+ $can_toggle_cat = 1;
+ }
+ if ($domconf{'coursecategories'}{'categorizecomm'} eq 'comm') {
+ $can_categorize = 1;
+ }
+ } else {
+ if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
+ $can_toggle_cat = 1;
+ }
+ if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
+ $can_categorize = 1;
+ }
}
}
return ($can_toggle_cat,$can_categorize);
}
sub assign_course_categories {
- my ($r) = @_;
+ my ($r,$crstype) = @_;
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my $hascats = 0;
@@ -585,12 +2068,23 @@ sub assign_course_categories {
if (ref($domconf{'coursecategories'}) eq 'HASH') {
$cathash = $domconf{'coursecategories'}{'cats'};
if (ref($cathash) eq 'HASH') {
- $hascats = 1;
+ foreach my $cat (keys(%{$cathash})) {
+ next if ($cat eq 'instcode::0');
+ unless ($crstype eq 'Community') {
+ next if ($cat eq 'communities::0');
+ }
+ $hascats ++;
+ }
}
}
my $catwin_js;
if ($hascats) {
- my $alert = &mt('Use \"Save\" in the main window to save course categories');
+ my $alert;
+ if ($crstype eq 'Community') {
+ $alert = &mt("Use 'Save' in the main window to save community categories");
+ } else {
+ $alert = &mt("Use 'Save' in the main window to save course categories");
+ }
$catwin_js = <
@@ -628,44 +2122,631 @@ ENDSCRIPT
} else {
my $onload;
}
+ my ($crscat,$catcrs,$assign);
+ if ($crstype eq 'Community') {
+ $crscat = 'Community Categories';
+ $catcrs = &mt('Categorize Community');
+ $assign = &mt('Assign one or more categories to this community.')
+ } else {
+ $crscat = 'Course Categories';
+ $catcrs = &mt('Categorize Course');
+ $assign = &mt('Assign one or more categories to this course.')
+ }
my $start_page =
- &Apache::loncommon::start_page('Course Categories',$catwin_js,
+ &Apache::loncommon::start_page($crscat,$catwin_js,
{'only_body' => 1,});
my $end_page = &Apache::loncommon::end_page();
- my $categoriesform = ''.&mt('Categorize Course').' ';
+ my $categoriesform = ''.$catcrs.' ';
if ($hascats) {
my %currsettings =
&Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);
- $categoriesform .= &mt('Assign one or more categories to this course.').' '.
+ my $cattable = &Apache::loncommon::assign_categories_table($cathash,
+ $currsettings{'categories'},$crstype);
+ if ($cattable eq '') {
+ $categoriesform .= &mt('No suitable categories defined for this course type in this domain.');
+ } else {
+ $categoriesform .= $assign.' '.
' ';
+ }
} else {
- $categoriesform .= &mt('No categories defined for this domain');
+ $categoriesform .= &mt('No categories defined in this domain.');
}
$r->print($start_page.$categoriesform.$end_page);
return;
}
+sub display_loncaparev_constraints {
+ my ($r,$navmap,$loncaparev,$crstype) = @_;
+ my $cid = $env{'request.course.id'};
+ my $cdom = $env{'course.'.$cid.'.domain'};
+ my $cnum = $env{'course.'.$cid.'.num'};
+ my $output;
+ my %lt = &Apache::lonlocal::texthash (
+ 'all' => 'all',
+ 'section/group' => 'section/group',
+ 'user' => 'user',
+ );
+ my (%checkparms,%checkresponsetypes,%checkcrstypes,%anonsurvey,%randomizetry);
+ &Apache::loncommon::build_release_hashes(\%checkparms,\%checkresponsetypes,
+ \%checkcrstypes,\%anonsurvey,\%randomizetry);
+ if (defined($checkcrstypes{$crstype})) {
+ $output .= ''.&mt('Course type: [_1] requires [_2] or newer',$crstype,
+ $checkcrstypes{$crstype}).' ';
+ }
+ my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps,
+ %byresponsetype,%bysubmission);
+ @scopeorder = ('all','section/group','user');
+ my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom);
+ if (ref($resourcedata) eq 'HASH') {
+ foreach my $key (keys(%{$resourcedata})) {
+ foreach my $item (keys(%checkparms)) {
+ if ($key =~ /(\Q$item\E)$/) {
+ if (ref($checkparms{$item}) eq 'ARRAY') {
+ my $value = $resourcedata->{$key};
+ my ($middle,$scope,$which,$level,$map,$resource);
+ if (grep(/^\Q$value\E$/,@{$checkparms{$item}})) {
+ my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
+ my $stdname = &Apache::lonparmset::standard_parameter_names($item);
+ my $valname = &get_param_description($stdtype,$value);
+ my $rev = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value};
+ my $start = $cid.'.';
+ if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
+ $middle = $1;
+ $which = $2;
+ $scope = 'user';
+ } elsif ($key =~ /^\Q$start\E(\[(\w+)\]\.)/) {
+ $middle = $1;
+ $which = $2;
+ $scope = 'section/group';
+ } else {
+ $scope = 'all';
+ }
+ my $what="$stdname=$valname";
+ if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {
+ $level = 'general';
+ if ($scope eq 'all') {
+ if (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}})) {
+ push(@{$fromparam{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$fromparam{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($fromparam{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}{$which}})) {
+ push(@{$fromparam{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$fromparam{$rev}{$scope}{$which}},$what);
+ }
+ }
+ $rowspan{$rev} ++;
+ } elsif ($key =~ /^\Q$start$middle\E(.+)___\(all\).\w+\.\Q$item\E$/) {
+ $level = 'folder';
+ $map = $1;
+ if ($scope eq 'all') {
+ if (ref($bymap{$map}{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}})) {
+ push(@{$bymap{$map}{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$bymap{$map}{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($bymap{$map}{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}{$which}})) {
+ push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
+ }
+ }
+ } elsif ($key =~ /^\Q$start$middle\E(.+)\.\w+\.\Q$item\E$/) {
+ $level = 'resource';
+ $resource = $1;
+ if ($scope eq 'all') {
+ if (ref($byresource{$resource}{$rev}{$scope}) eq 'ARRAY') {
+ unless(grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}})) {
+ push(@{$byresource{$resource}{$rev}{$scope}},$what);
+ }
+ } else {
+ push(@{$byresource{$resource}{$rev}{$scope}},$what);
+ }
+ } else {
+ if (ref($byresource{$resource}{$rev}{$scope}{$which}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}{$which}})) {
+ push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
+ }
+ } else {
+ push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (keys(%fromparam)) {
+ $output .= ''.&mt('Requirements from general settings').' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Release').' '.&mt('Scope').' '.
+ ''.&mt('Extent').' '.&mt('Setting').' '.
+ &Apache::loncommon::end_data_table_header_row();
+ foreach my $rev (keys(%fromparam)) {
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$rev.' ';
+ my $newrow;
+ foreach my $scope (@scopeorder) {
+ if (ref($fromparam{$rev}{$scope}) eq 'HASH') {
+ if ($newrow) {
+ $output .= &Apache::loncommon::continue_data_table_row();
+ }
+ $output .= ''.$lt{$scope}.' ';
+ foreach my $which (sort(keys(%{$fromparam{$rev}{$scope}}))) {
+ $output .= ''.$which.' '.
+ join(' ',@{$fromparam{$rev}{$scope}{$which}}).' ';
+ }
+ $output .= &Apache::loncommon::end_data_table_row();
+ $newrow = 1;
+ } elsif (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
+ if ($newrow) {
+ $output .= &Apache::loncommon::continue_data_table_row();
+ }
+ $output .= ''.$lt{$scope}.' '.
+ join(' ',@{$fromparam{$rev}{$scope}}).' '.
+ &Apache::loncommon::end_data_table_row();
+ $newrow = 1;
+ }
+ }
+ }
+ $output .= &Apache::loncommon::end_data_table().' ';
+ }
+ }
+
+ if (defined($navmap)) {
+ my %anonsubms=&Apache::lonnet::dump('nohist_anonsurveys',$cdom,$cnum);
+ my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'};
+ my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum);
+ my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry'};
+ my $stdtype=&Apache::lonparmset::standard_parameter_types('type');
+ my $stdname=&Apache::lonparmset::standard_parameter_names('type');
+ my $valanon=&get_param_description($stdtype,'anonsurvey');
+ my $valrandtry=&get_param_description($stdtype,'randomizetry');
+
+ foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) {
+ my @parts = @{$res->parts()};
+ my $symb = $res->symb();
+ my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src());
+ foreach my $part (@parts) {
+ if (exists($anonsubms{$symb."\0".$part})) {
+ my $rev = $rev_anonsurv;
+ my $what="$stdname=$valanon";
+ if (ref($bysubmission{$symb}{$rev}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E/,@{$bysubmission{$symb}{$rev}})) {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ } else {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ $allmaps{$enclosing_map} = 1;
+ }
+ if (exists($randtrysubms{$symb."\0".$part})) {
+ my $rev = $rev_randtry;
+ my $what="$stdname=$valrandtry";
+ if (ref($bysubmission{$symb}{$rev}) eq 'ARRAY') {
+ unless (grep(/^\Q$what\E/,@{$bysubmission{$symb}{$rev}})) {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ } else {
+ push(@{$bysubmission{$symb}{$rev}},$what);
+ }
+ $allmaps{$enclosing_map} = 1;
+ }
+ }
+ my %responses = $res->responseTypes();
+ foreach my $key (keys(%responses)) {
+ if (exists($checkresponsetypes{$key})) {
+ push(@{$byresponsetype{$symb}{$checkresponsetypes{$key}}},$key);
+ $allmaps{$enclosing_map} = 1;
+ }
+ }
+ }
+ if (keys(%byresource) > 0) {
+ foreach my $symb (keys(%byresource)) {
+ my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
+ $allmaps{$map} = 1;
+ }
+ }
+ if (keys(%bymap) > 0) {
+ foreach my $map (keys(%bymap)) {
+ $allmaps{$map} = 1;
+ }
+ }
+ foreach my $map (keys(%allmaps)) {
+ my $mapres = $navmap->getResourceByUrl($map);
+ my $mapsymb = $mapres->symb();
+ $toshow{$mapsymb} = 1;
+ if (ref($mapres)) {
+ my $pcslist = $mapres->map_hierarchy();
+ if ($pcslist ne '') {
+ foreach my $pc (split(/,/,$pcslist)) {
+ my $res = $navmap->getByMapPc($pc);
+ if (ref($res)) {
+ my $symb = $res->symb();
+ unless ($symb eq '______') {
+ $toshow{$symb} = 1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ my $mapres_header = ''.
+ &mt('Requirements for specific folders or resources').
+ ' ';
+ if ((keys(%toshow) > 0) || (keys(%byresource) > 0) ||
+ (keys(%bysubmission) > 0) || (keys(%byresponsetype))) {
+ $output .= $mapres_header;
+ }
+ my $top_header = ''.&mt('LON-CAPA version dependencies').' ';
+ my $title = 'Version Constraints';
+ my $start_page =
+ &Apache::loncommon::start_page($title,undef,{'only_body' => 1,});
+ $r->print($start_page.$top_header);
+ if ($output) {
+ $r->print($output);
+ if (defined($navmap)) {
+ &show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,
+ \%byresponsetype,\@scopeorder,\%lt);
+ }
+ $r->print(' ');
+ } else {
+ $r->print(''.
+ &mt('No version requirements from resource content or settings.').
+ '
');
+ }
+ $r->print(&Apache::loncommon::end_page());
+ return;
+}
+
+sub show_contents_view {
+ my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,
+ $scopeorder,$lt) = @_;
+ if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
+ (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) {
+ my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
+ my $whitespace = ' ';
+ my $icon = ' ';
+ my $topmap = $env{'course.'.$cid.'.url'};
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Location').' '.&mt('Release').' '.
+ ''.&mt('Attribute/Setting').' '.
+ &Apache::loncommon::end_data_table_header_row().
+ &Apache::loncommon::start_data_table_row().
+ ' '.$icon.' '.&mt('Main Course Documents').' ');
+ &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);
+ $r->print(&Apache::loncommon::end_data_table_row());
+ my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
+ my $curRes;
+ my $depth = 0;
+ my %parent = ();
+ my $startcount = 5;
+ my $lastcontainer = $startcount;
+ while ($curRes = $it->next()) {
+ if ($curRes == $it->BEGIN_MAP()) {
+ $depth++;
+ $parent{$depth}= $lastcontainer;
+ }
+ if ($curRes == $it->END_MAP()) {
+ $depth--;
+ $lastcontainer = $parent{$depth};
+ }
+ my $indent;
+ for (my $i=0; $i<$depth; $i++) {
+ $indent.= $whitespace;
+ }
+ if (ref($curRes)) {
+ my $symb = $curRes->symb();
+ my $ressymb = $symb;
+ my $srcf = $curRes->src();
+ my $title = &Apache::lonnet::gettitle($srcf);
+ if (($curRes->is_sequence()) || ($curRes->is_page())) {
+ next unless($toshow->{$symb});
+ my ($parent,$ind,$url) = &Apache::lonnet::decode_symb($symb);
+ $icon = ' ';
+ if ($curRes->is_page()) {
+ $icon = ' ';
+ }
+ my $rowspan = 1;
+ if (ref($bymap->{$url}) eq 'HASH') {
+ $rowspan = scalar(keys(%{$bymap->{$url}}));
+ }
+ $r->print(&Apache::loncommon::start_data_table_row().
+ ''.$indent.$icon.' '.$title.' ');
+ &releases_by_map($r,$bymap,$url,$scopeorder,$lt);
+ $r->print(&Apache::loncommon::end_data_table_row());
+ } else {
+ my $rowspan;
+ if (ref($byresource->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$byresource->{$symb}}));
+ }
+ if (ref($bysubmission->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$bysubmission->{$symb}}));
+ }
+ if (ref($byresponsetype->{$symb}) eq 'HASH') {
+ $rowspan += scalar(keys(%{$byresponsetype->{$symb}}));
+ }
+ next if (!$rowspan);
+ $icon = ' ';
+ $r->print(&Apache::loncommon::start_data_table_row().
+ ''.$indent.$icon.' '.$title.' ');
+ my $newrow;
+ if (ref($byresource->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$byresource->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($byresource->{$symb}{$rev}) eq 'HASH') {
+ $r->print('');
+ foreach my $scope (@{$scopeorder}) {
+ if (ref($byresource->{$symb}{$rev}{$scope}) eq 'HASH') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).' ');
+ foreach my $which (sort(keys(%{$byresource->{$symb}{$rev}{$scope}}))) {
+ $r->print(''.$which.' '.
+ join(' ',@{$byresource->{$symb}{$rev}{$scope}{$which}}).
+ ' ');
+ }
+ $r->print(' ');
+ } elsif (ref($byresource->{$symb}{$rev}{$scope}) eq 'ARRAY') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).' '.
+ ' '.
+ join(' ',@{$byresource->{$symb}{$rev}{$scope}}).' ');
+ }
+ }
+ $r->print('
');
+ }
+ $r->print(' ');
+ $r->print(&Apache::loncommon::end_data_table_row());
+ $newrow = 1;
+ }
+ }
+ if (ref($bysubmission->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$bysubmission->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($bysubmission->{$symb}{$rev}) eq 'ARRAY') {
+ $r->print(&mt('Submissions to: ').' '.
+ join(', ',@{$bysubmission->{$symb}{$rev}}));
+ }
+ $r->print(' ');
+ $r->print(&Apache::loncommon::end_data_table_row());
+ $newrow = 1;
+ }
+ }
+ if (ref($byresponsetype->{$symb}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$byresponsetype->{$symb}}))) {
+ if ($newrow) {
+ $r->print(&Apache::loncommon::continue_data_table_row());
+ }
+ $r->print(''.$rev.' ');
+ if (ref($byresponsetype->{$symb}{$rev}) eq 'ARRAY') {
+ $r->print(&mt('Response Type(s): ').' '.
+ join(' ',@{$byresponsetype->{$symb}{$rev}}));
+ }
+ $r->print(' ');
+ }
+ $r->print(&Apache::loncommon::end_data_table_row());
+ }
+ }
+ }
+ }
+ $r->print(&Apache::loncommon::end_data_table());
+ }
+}
+
+sub releases_by_map {
+ my ($r,$bymap,$url,$scopeorder,$lt) = @_;
+ return unless ((ref($bymap) eq 'HASH') && (ref($scopeorder) eq 'ARRAY'));
+ if (ref($bymap->{$url}) eq 'HASH') {
+ foreach my $rev (sort(keys(%{$bymap->{$url}}))) {
+ $r->print(''.$rev.' ');
+ if (ref($bymap->{$url}{$rev}) eq 'HASH') {
+ $r->print('');
+ foreach my $scope (@{$scopeorder}) {
+ if (ref($bymap->{$url}{$rev}{$scope}) eq 'HASH') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).' ');
+ foreach my $which (sort(keys(%{$bymap->{$url}{$rev}{$scope}}))) {
+ $r->print(''.$which.' '.
+ join(' ',@{$bymap->{$url}{$rev}{$scope}{$which}}).
+ ' ');
+ }
+ $r->print(' ');
+ } elsif (ref($bymap->{$url}{$rev}{$scope}) eq 'ARRAY') {
+ $r->print(''.&mt('Setting - scope: [_1]',$lt->{$scope}).
+ ' '.
+ join(' ',@{$bymap->{$url}{$rev}{$scope}}).' ');
+ }
+ }
+ $r->print('
');
+ }
+ $r->print(' ');
+ }
+ } else {
+ $r->print(' ');
+ }
+ return;
+}
+
+sub get_param_description {
+ my ($stdtype,$value) = @_;
+ my $name = $value;
+ my $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);
+ unless (ref($paramstrings) eq 'ARRAY') {
+ return $name;
+ }
+ foreach my $possibilities (@{$paramstrings}) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($thing, $description) = @{ $possibilities };
+ if ($thing eq $value) {
+ $name = $description;
+ last;
+ }
+ }
+ return $name;
+}
+
+sub show_autocoowners {
+ my (@currcoown) = @_;
+ my $output = ''.&mt('Co-ownership is set automatically when a Course Coordinator role is assigned to official course personnel (from institutional data).').' ';
+ if (@currcoown > 0) {
+ $output .= ' '.&mt('Current co-owners are:').' '.
+ join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
+ } else {
+ $output .= ' '.&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().
+ ''.&mt('Current co-owners').' ';
+ foreach my $person (@currcoown) {
+ my ($co_uname,$co_dom) = split(':',$person);
+ $output .= ' '.&Apache::loncommon::plainname($co_uname,$co_dom).' '.(' 'x2).' ';
+ }
+ $output .= ' '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ if ($pendingcoowners) {
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.&mt('Invited as co-owners [_1](agreement pending)',' ').' ';
+ foreach my $person (@pendingcoown) {
+ my ($co_uname,$co_dom) = split(':',$person);
+ $output .= ' '.&Apache::loncommon::plainname($co_uname,$co_dom).' '.(' 'x2).' ';
+ }
+ $output .= ' '.
+ &Apache::loncommon::end_data_table_row();
+ }
+ if (@othercoords) {
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.&mt('Invite other Coordinators [_1]to become co-owners',' ').' ';
+ foreach my $person (@othercoords) {
+ my ($co_uname,$co_dom) = split(':',$person);
+ $output .= ' '.&Apache::loncommon::plainname($co_uname,$co_dom).' '.(' 'x2).' ';
+ }
+ $output .= ' '.
+ &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().'';
+ }
+ $output .= &mt('Current co-owners are:').' '.
+ join(', ', map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
+ if ($is_coowner || $is_pending) {
+ $output .= ' '.&Apache::loncommon::end_data_table_row();
+ }
+ }
+ if ($is_coowner || $is_pending) {
+ if (@currcoown) {
+ $output .= &Apache::loncommon::start_data_table_row().'';
+ }
+ $output .= '';
+ if ($is_coowner) {
+ $output .= &mt('You are currently a co-owner:').' '.&mt('Discontinue?').' ';
+ } else {
+ $output .= &mt('The course owner has invited you to become a co-owner:').' '.&mt('Accept?').' '.(' 'x2).
+ ' '.&mt('Decline?').' ';
+ }
+ $output .= ' ';
+ if (@currcoown) {
+ $output .= ' '.&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,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
languages => {
- text => &mt('Languages used').' '.&mt("(will override user's preference)"),
+ text => ''.&mt($itemtext->{'languages'}).' '.
+ &mt("(overrides individual user preference)"),
input => 'selectbox',
},
timezone => {
- text => &mt('Timezone in which the course takes place'),
+ text => ''.&mt($itemtext->{'timezone'}).' ',
input => 'selectbox',
},
datelocale => {
- text => &mt('Locale used for course calendar'),
+ text => ''.&mt($itemtext->{'datelocale'}).' ',
input => 'selectbox',
},
);
@@ -693,35 +2774,35 @@ sub print_localization {
} else {
if ($settings->{$item} eq '') {
$datatable .=
- &Apache::loncommon::select_language('language_0','',1);
+ &Apache::loncommon::select_language('languages_0','',1);
} else {
my $num = 0;
- my @languages = split(/\s*(\,|\;|\:)\s*/,$settings->{$item});
+ my @languages = split(/\s*[,;:]\s*/,$settings->{$item});
$datatable .= &Apache::loncommon::start_data_table();
if (@languages > 0) {
+ my %langchoices = &get_lang_choices();
foreach my $lang (@languages) {
my $showlang = $lang;
- my $code = &Apache::loncommon::supportedlanguagecode($lang);
- if ($code) {
- $showlang = &plainlanguagedescription($lang);
+ if (exists($langchoices{$lang})) {
+ $showlang = $langchoices{$lang};
}
$datatable .=
&Apache::loncommon::start_data_table_row().
- ''.
+ ' '.
&mt('Language:').' '.$showlang.
' '.
' '.
&mt('Delete').' '.
- &Apache::loncommon::end_data_table_row().'';
+ &Apache::loncommon::end_data_table_row();
$num ++;
}
}
$datatable .= &Apache::loncommon::start_data_table_row().
- ''.
- &mt('Additional language:').' '.
- &Apache::loncommon::select_language($item);
+ ''.
+ &mt('Additional language:'). ' '.
+ &Apache::loncommon::select_language('languages_'.$num,'',1).
' '.
' '.&Apache::loncommon::end_data_table_row().
&Apache::loncommon::end_data_table();
@@ -733,26 +2814,37 @@ sub print_localization {
return $datatable;
}
+sub get_lang_choices {
+ my %langchoices;
+ foreach my $id (&Apache::loncommon::languageids()) {
+ my $code = &Apache::loncommon::supportedlanguagecode($id);
+ if ($code) {
+ $langchoices{$code} = &Apache::loncommon::plainlanguagedescription($id);
+ }
+ }
+ return %langchoices;
+}
+
sub print_feedback {
- my ($position,$cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($position,$cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
- 'question' => {
- text => ''.&mt('Resource Content').' ',
+ 'question.email' => {
+ text => ''.&mt($itemtext->{'question.email'}).' ',
input => 'textbox',
size => '50',
},
- 'comment' => {
- text => ''.&mt('Course Content').' ',
+ 'comment.email' => {
+ text => ''.&mt($itemtext->{'comment.email'}).' ',
input => 'textbox',
size => '50',
},
- 'policy' => {
- text => ''.&mt('Course Policy').' ',
+ 'policy.email' => {
+ text => ''.&mt($itemtext->{'policy.email'}).' ',
input => 'textbox',
size => '50',
},
@@ -763,23 +2855,27 @@ sub print_feedback {
my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
my @sections = sort( { $a <=> $b } keys(%sections));
my %lt = &Apache::lonlocal::texthash (
- currone => 'Current recipient:',
- curmult => 'Current recipients:',
- add => 'Additional recipient:',
- del => 'Delete?',
- sec => 'Sections:',
+ currone => 'Current recipient:',
+ currmult => 'Current recipients:',
+ add => 'Additional recipient:',
+ del => 'Delete?',
+ sec => 'Sections:',
);
foreach my $item (@{$ordered}) {
$count ++;
- $datatable .= &item_table_row_start($items{$item}{text},$count);
+ if ($position eq 'top') {
+ $datatable .= &item_table_row_start($items{$item}{text},$count);
+ } else {
+ $datatable .= &item_table_row_start($items{$item}{text}." (Custom text)",$count, "advanced");
+ }
if ($position eq 'top') {
my $includeempty = 0;
$datatable .= &user_table($cdom,$item,\@sections,
- $settings->{$item.'.email'},\%lt);
+ $settings->{$item},\%lt);
} else {
- $datatable .= &Apache::lonhtmlcommon::textbox($item.'_text',
- $settings->{$item},$items{$item}{size});
+ $datatable .= &Apache::lonhtmlcommon::textbox($item.'.text',
+ $settings->{$item.'.text'},$items{$item}{size});
}
$datatable .= &item_table_row_end();
}
@@ -795,7 +2891,7 @@ sub user_table {
} else {
my $num = 0;
my @curr = split(/,/,$currvalue);
- $output .= &Apache::loncommon::start_data_table();
+ $output .= '';
my ($currusers);
foreach my $val (@curr) {
next if ($val eq '');
@@ -811,7 +2907,7 @@ sub user_table {
'name="'.$item.'_delete" value="'.$num.'" />'.
$lt->{'del'}.''.
' '.(' 'x2).
+ $num.'" value="'.$uname.':'.$udom.'" />'.(' 'x2).
&Apache::loncommon::aboutmewrapper(
&Apache::loncommon::plainname($uname,$udom,'firstname'),
$uname,$udom,'aboutuser');
@@ -826,24 +2922,23 @@ sub user_table {
$num ++;
}
if ($num) {
- $output .= &Apache::loncommon::start_data_table_row().
+ $output .= ''.
'';
- if ($num > 1) {
+ if ($num == 1) {
$output .= $lt->{'currone'};
} else {
$output .= $lt->{'currmult'};
}
$output .= ' '.
' '.
- &Apache::loncommon::end_data_table_row();
+ ' ';
}
- $output .= &Apache::loncommon::start_data_table_row().
+ $output .= ''.
''.
$lt->{'add'}.' '.
&select_recipient($item,$num,$cdom,$sections).
' '.
- ' '.&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
+ '
';
}
return $output;
}
@@ -903,41 +2998,50 @@ sub select_sections {
}
sub print_discussion {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
'plc.roles.denied' => {
- text => ''.&mt('No Chat room use').' '.
- &Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
+ text => ''.&mt($itemtext->{'plc.roles.denied'}).' '.
+ &Apache::loncommon::help_open_topic("Course_Disable_Discussion").' '.
+ &mt('(role-based)'),
input => 'checkbox',
},
'plc.users.denied' => {
- text => ''.&mt('No Chat room use').' ',
+ text => ''.&mt($itemtext->{'plc.users.denied'}).' '.
+ &mt('(specific user(s))'),
input => 'checkbox',
},
'pch.roles.denied' => {
- text => ''.&mt('No Resource Discussion').' '.
- &Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
+ text => ''.&mt($itemtext->{'pch.roles.denied'}).' '.
+ &Apache::loncommon::help_open_topic("Course_Disable_Discussion").' '.
+ &mt('(role-based)'),
input => 'checkbox',
},
'pch.users.denied' => {
- text => ''.&mt('No Resource Discussion').' ',
+ text => ''.&mt($itemtext->{'pch.users.denied'}).' '.
+ &mt('(specific user(s))'),
input => 'checkbox',
},
'allow_limited_html_in_feedback' => {
- text => ''.&mt('Allow limited HTML in discussion posts').' ',
+ text => ''.&mt($itemtext->{'allow_limited_html_in_feedback'}).' ',
input => 'radio',
},
'allow_discussion_post_editing' => {
- text => ''.&mt('Users can edit/delete own discussion posts').' ',
+ text => ''.&mt($itemtext->{'allow_discussion_post_editing'}).' ',
input => 'checkbox',
},
+ 'discussion_post_fonts' => {
+ text => ''.&mt($itemtext->{'discussion_post_fonts'}).' ',
+ input => 'textbox',
+ size => '20',
+ },
);
my $datatable;
my $count;
@@ -945,11 +3049,11 @@ sub print_discussion {
my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
my @sections = sort( { $a <=> $b } keys(%sections));
my %lt = &Apache::lonlocal::texthash (
- currone => 'Disallowed:',
- curmult => 'Disallowed:',
- add => 'Disallow more:',
- del => 'Delete?',
- sec => 'Sections:',
+ currone => 'Disallowed:',
+ currmult => 'Disallowed:',
+ add => 'Disallow more:',
+ del => 'Delete?',
+ sec => 'Sections:',
);
foreach my $item (@{$ordered}) {
@@ -977,6 +3081,17 @@ sub print_discussion {
&Apache::loncommon::end_data_table_row().
&role_checkboxes($cdom,$cnum,$item,$settings,1).
&Apache::loncommon::end_data_table();
+ } elsif ($item eq 'discussion_post_fonts') {
+ $datatable .= &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.&mt('Sum of likes/dislikes').' '.
+ ''.&mt('font-size').' '.
+ ''.&mt('font-weight').' '.
+ ''.&mt('font-style').' '.
+ ''.&mt('Other css').' '.
+ &Apache::loncommon::end_data_table_row().
+ &set_discussion_fonts($cdom,$cnum,$item,$settings).
+ &Apache::loncommon::end_data_table();
}
$datatable .= &item_table_row_end();
}
@@ -985,8 +3100,13 @@ sub print_discussion {
}
sub role_checkboxes {
- my ($cdom,$cnum,$item,$settings,$showsections) = @_;
- my @roles = ('st','ad','ta','ep','in','cc');
+ my ($cdom,$cnum,$item,$settings,$showsections,$crstype) = @_;
+ my @roles = ('st','ad','ta','ep','in');
+ if ($crstype eq 'Community') {
+ push(@roles,'co');
+ } else {
+ push(@roles,'cc');
+ }
my $output;
my (@current,@curr_roles,%currsec,@sections);
if ($showsections) {
@@ -1005,6 +3125,8 @@ sub role_checkboxes {
if (!grep(/^\Q$sec\E/,@{$currsec{$trole}})) {
push(@{$currsec{$trole}},$sec);
}
+ } else {
+ $currsec{$trole} = [$sec];
}
} else {
push(@curr_roles,$role);
@@ -1021,7 +3143,7 @@ sub role_checkboxes {
if (grep(/^\Q$role\E$/,@current)) {
$checked = ' checked="checked" ';
}
- my $plrole=&Apache::lonnet::plaintext($role);
+ my $plrole=&Apache::lonnet::plaintext($role,$crstype);
if ($showsections) {
$output .= &Apache::loncommon::start_data_table_row();
} else {
@@ -1033,7 +3155,7 @@ sub role_checkboxes {
$output .= '';
}
}
- $output .= ' '.
$plrole.' ';
if ($showsections) {
@@ -1065,7 +3187,7 @@ sub role_checkboxes {
$output .= ' ';
}
}
- $output .= ' '.$rolename.
' ';
if ($showsections) {
@@ -1091,8 +3213,77 @@ sub role_checkboxes {
return $output;
}
+sub set_discussion_fonts {
+ my ($cdom,$cnum,$item,$settings) = @_;
+ my ($classorder,$classtitles) = &discussion_vote_classes();
+ my ($styleorder,$styleitems) = &discussion_vote_styles();
+ my $output;
+ if (ref($classorder) eq 'ARRAY') {
+ foreach my $cat (@{$classorder}) {
+ my %curr = ();
+ ($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) =
+ split(/,/,$settings->{'discussion_post_fonts_'.$cat});
+ $output .= &Apache::loncommon::start_data_table_row().
+ ''.$classtitles->{$cat}.' ';
+ if (ref($styleorder) eq 'ARRAY') {
+ foreach my $item (@{$styleorder}) {
+ $output .= '';
+ my $selitem = $item;
+ if ($item eq 'size') {
+ my ($currsize,$currunit);
+ if ($curr{'size'} =~ /^(\d+)(px|%)$/) {
+ ($currsize,$currunit) = ($1,$2);
+ $curr{'size'} = $currunit;
+ }
+ $output .= ' '.
+ ' ';
+ $selitem = 'unit';
+ }
+ if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) {
+ $output .= '';
+ foreach my $val (@{$styleitems->{$item}}) {
+ my $sel;
+ if ($val eq $curr{$item}) {
+ $sel = ' selected="selected"';
+ }
+ $output .= ''.$val.' ';
+ }
+ }
+ }
+ }
+ $output .= ' ';
+ }
+ $output .= &Apache::loncommon::end_data_table_row();
+ }
+ return $output;
+}
+
+sub discussion_vote_classes {
+ my $classorder = ['twoplus','oneplus','zero','oneminus','twominus'];
+ my %classtitles = &Apache::lonlocal::texthash(
+ 'twoplus' => 'Two sigma above mean',
+ 'oneplus' => 'One sigma above mean',
+ 'zero' => 'Within one sigma of mean',
+ 'oneminus' => 'One sigma below mean',
+ 'twominus' => 'Two sigma below mean',
+ );
+ return ($classorder,\%classtitles);
+}
+
+sub discussion_vote_styles {
+ my $styleorder = ['size','weight','style'];
+ my $styleitems = {
+ size => ['','px','%','xx-small','x-small','small','medium','large',
+ 'x-large','xx-large','smaller','larger'],
+ weight => ['','normal','bold','bolder','lighter','100','200','300','400',
+ '500','600','700','800','900'],
+ style => ['','normal','italic','oblique'],
+ };
+ return ($styleorder,$styleitems);
+}
+
sub print_classlists {
- my ($position,$cdom,$settings,$rowtotal) = @_;
+ my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype) = @_;
my @ordered;
if ($position eq 'top') {
@ordered = ('default_enrollment_start_date',
@@ -1101,40 +3292,53 @@ sub print_classlists {
@ordered = ('nothideprivileged');
} else {
@ordered = ('student_classlist_view',
- 'student_opt_in','student_classlist_portfiles');
+ 'student_classlist_opt_in',
+ 'student_classlist_portfiles');
+ }
+ my %lt;
+
+ if ($crstype eq 'Community') {
+ %lt = &Apache::lonlocal::texthash (
+ disabled => 'No viewable membership list',
+ section => "Membership of viewer's section",
+ all => 'List of all members',
+ );
+ } else {
+ %lt = &Apache::lonlocal::texthash (
+ disabled => 'No viewable classlist',
+ section => "Classlist of viewer's section",
+ all => 'Classlist of all students',
+ );
}
+
my %items = (
'default_enrollment_start_date' => {
- text => ''.&mt('Start date').' ',
+ text => ''.&mt($itemtext->{'default_enrollment_start_date'}).' ',
input => 'dates',
},
'default_enrollment_end_date' => {
- text => ''.&mt('End date').' ',
+ text => ''.&mt($itemtext->{'default_enrollment_end_date'}).' ',
input => 'dates',
},
'nothideprivileged' => {
- text => ''.&mt('Domain Coodinators in course').' ',
+ text => ''.&mt($itemtext->{'nothideprivileged'}).' ',
input => 'checkbox',
},
'student_classlist_view' => {
- text => ''.&mt('Student-viewable classlist').' ',
+ text => ''.&mt($itemtext->{'student_classlist_view'}).' ',
input => 'selectbox',
- options => {
- disabled => &mt('No viewable classlist'),
- section => &mt("Classlist of viewer's section"),
- all => &mt('Classlist of all students'),
- },
+ options => \%lt,
order => ['disabled','all','section'],
},
- 'student_opt_in' => {
- text => ''.&mt('Student agreement needed to be listed').' ',
+ 'student_classlist_opt_in' => {
+ text => ''.&mt($itemtext->{'student_classlist_opt_in'}).' ',
input => 'radio',
},
'student_classlist_portfiles' => {
- text => ''.&mt('Include link to accessible portfolio files').' ',
+ text => ''.&mt($itemtext->{'student_classlist_portfiles'}).' ',
input => 'radio',
},
);
@@ -1142,17 +3346,23 @@ sub print_classlists {
($settings->{'student_classlist_view'} eq 'section')) {
$settings->{'student_classlist_view'} = 'disabled';
}
- return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype);
}
sub print_appearance {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
+ my $mathdef;
+ if ($crstype eq 'Community') {
+ $mathdef = &mt("None specified - use member's choice");
+ } else {
+ $mathdef = &mt("None specified - use student's choice");
+ }
my %items = (
'default_xml_style' => {
- text => ''.&mt('Default XML Style File').' '.
+ text => ''.&mt($itemtext->{'default_xml_style'}).' '.
''.&mt('Select Style File').' ',
@@ -1161,15 +3371,15 @@ sub print_appearance {
},
'pageseparators' => {
- text => ''.&mt('Visibly Separate Items on Pages').' ',
+ text => ''.&mt($itemtext->{'pageseparators'}).' ',
input => 'radio',
},
'disable_receipt_display' => {
- text => ''.&mt('Disable display of problem receipts').' ',
+ text => ''.&mt($itemtext->{'disable_receipt_display'}).' ',
input => 'radio',
},
'texengine' => {
- text => ''.&mt('Force use of a specific math rendering engine.').' ',
+ text => ''.&mt($itemtext->{'texengine'}).' ',
input => 'selectbox',
options => {
jsMath => 'jsMath',
@@ -1177,37 +3387,38 @@ sub print_appearance {
tth => &mt('TeX to HTML'),
},
order => ['jsMath','mimetex','tth'],
- nullval => &mt("None specified - use student's choice"),
+ nullval => $mathdef,
},
'tthoptions' => {
- text => ''.&mt('Default set of options to pass to tth/m when converting TeX').' ',
+ text => ''.&mt($itemtext->{'tthoptions'}).' ',
input => 'textbox',
size => 40,
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
}
sub print_grading {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
'grading' => {
- text => ''.&mt('Grading').' '.
+ text => ''.&mt($itemtext->{'grading'}).' '.
&Apache::loncommon::help_open_topic('GradingOptions'),
input => 'selectbox',
options => {
standard => &mt('Standard: shows points'),
- external => &mt('External: shows number of completed parts'),
+ external => &mt('External: shows number of completed parts and totals'),
+ externalnototals => &mt('External: shows only number of completed parts'),
spreadsheet => &mt('Spreadsheet: (with link to detailed scores)'),
},
- order => ['standard','external','spreadsheet'],
+ order => ['standard','external','externalnototals','spreadsheet'],
},
'rndseed' => {
- text => ''.&mt('Randomization algorithm used').' '.
- ''.' '.
+ text => ''.&mt($itemtext->{'rndseed'}).' '.
+ ''.' '.
&mt('Modifying this will make problems have different numbers and answers!').
' ',
input => 'selectbox',
@@ -1220,10 +3431,11 @@ sub print_grading {
'64bit5' => '64bit5',
},
order => ['32bit','64bit','64bit2','64bit3','64bit4','64bit5'],
+ advanced => 1
},
'receiptalg' => {
- text => ''.&mt('Receipt algorithm used').' '.
- &mt('This controls how receipt numbers are generated.'),
+ text => ''.&mt($itemtext->{'receiptalg'}).' '.
+ &mt('This controls how receipt numbers are generated'),
input => 'selectbox',
options => {
receipt => 'receipt',
@@ -1231,31 +3443,32 @@ sub print_grading {
receipt3 => 'receipt3',
},
order => ['receipt','receipt2','receipt3'],
+ advanced => 1
},
'disablesigfigs' => {
- text => ''.&mt('Disable checking of Significant Figures').' ',
+ text => ''.&mt($itemtext->{'disablesigfigs'}).' ',
input => 'radio',
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
}
sub print_printouts {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my %items = (
problem_stream_switch => {
- text => ''.&mt('Allow problems to be split over pages').' ',
+ text => ''.&mt($itemtext->{'problem_stream_switch'}).' ',
input => 'radio',
},
suppress_tries => {
- text => ''.&mt('Suppress number of tries in printing').' ',
+ text => ''.&mt($itemtext->{'suppress_tries'}).' ',
input => 'radio',
},
default_paper_size => {
- text => ''.&mt('Default paper type').' ',
+ text => ''.&mt($itemtext->{'default_paper_size'}).' ',
input => 'selectbox',
options => {
Letter => &mt('Letter').' [8 1/2x11 in]',
@@ -1269,74 +3482,92 @@ sub print_printouts {
A6 => &mt('A6').' [105x148 mm]',
},
order => ['Letter','Legal','Tabloid','Executive','A2','A3','A4','A5','A6'],
- nullval => 'None specified',
+ nullval => &mt('None specified'),
},
print_header_format => {
- text => ''.&mt('Print header format').' ',
+ text => ''.&mt($itemtext->{'print_header_format'}).' ',
input => 'checkbox',
},
disableexampointprint => {
- text => ''.&mt('Disable automatically printing point values on exams').' ',
+ text => ''.&mt($itemtext->{'disableexampointprint'}).' ',
input => 'radio',
},
+ canuse_pdfforms => {
+ text => ''.&mt($itemtext->{'canuse_pdfforms'}).' ',
+ input => 'selectbox',
+ options => {
+ 1 => &mt('Yes'),
+ 0 => &mt('No'),
+ },
+ order => ['1','0'],
+ nullval => &mt('None specified - use domain default'),
+ }
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
}
sub print_spreadsheet {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
my %items = (
spreadsheet_default_classcalc => {
- text => ''.&mt('Default Course Spreadsheet').' '.
+ text => ''.&mt($itemtext->{'spreadsheet_default_classcalc'}).' '.
''.$SelectSpreadsheetFile.' ',
input => 'textbox',
},
spreadsheet_default_studentcalc => {
- text => ''.&mt('Default Student Spreadsheet').' '.
+ text => ''.&mt($itemtext->{'spreadsheet_default_studentcalc'}).' '.
''.$SelectSpreadsheetFile.' ',
input => 'textbox',
},
spreadsheet_default_assesscalc => {
- text => ''.&mt('Default Assessment Spreadsheet').' '.
+ text => ''.&mt($itemtext->{'spreadsheet_default_assesscalc'}).' '.
''.$SelectSpreadsheetFile.' ',
input => 'textbox',
},
hideemptyrows => {
- text => ''.&mt('Hide Empty Rows in Spreadsheets').' ',
+ text => ''.&mt($itemtext->{'hideemptyrows'}).' ',
input => 'radio',
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
-}
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
+}
sub print_bridgetasks {
- my ($cdom,$settings,$ordered,$rowtotal) = @_;
- unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
+ my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
return;
}
+ my ($stumsg,$msgnote);
+ if ($crstype eq 'Community') {
+ $stumsg = &mt('Send message to member');
+ $msgnote = &mt('Message to member and add to user notes');
+ } else {
+ $stumsg = &mt('Send message to student');
+ $msgnote = &mt('Message to student and add to user notes');
+ }
my %items = (
task_messages => {
- text => ''.&mt('Send message to student when clicking Done on Tasks').' ',
+ text => ''.&mt($itemtext->{'task_messages'}).' ',
input => 'selectbox',
options => {
- only_student => &mt('Send message to student'),
- student_and_user_notes_screen => &mt('Message to student and add to user notes'),
+ only_student => $stumsg,
+ student_and_user_notes_screen => $msgnote,
},
order => ['only_student','student_and_user_notes_screen'],
nullval => &mt('No message or record in user notes'),
},
task_grading => {
- text => ''.&mt('Bridge Task grading by instructors and TAs in sections').' ',
+ text => ''.&mt($itemtext->{'task_grading'}).' ',
input => 'selectbox',
options => {
any => &mt('Grade BTs in any section'),
@@ -1345,50 +3576,68 @@ sub print_bridgetasks {
order => ['any','section'],
},
suppress_embed_prompt => {
- text => ''.&mt('Hi$de upload references prompt if uploading file to portfolio').' '.
- &mt('(applies when current role is student)').' ',
+ text => ''.&mt($itemtext->{'suppress_embed_prompt'}).' '.
+ ' '.&mt('(applies when current role is student)').' ',
input => 'radio',
},
);
- return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);
+ return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
}
sub print_other {
- my ($cdom,$settings,$allitems,$rowtotal) = @_;
+ my ($cdom,$settings,$allitems,$rowtotal,$crstype) = @_;
unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {
return;
}
- my @ordered;
+ my @ordered = &get_other_items($cdom,$settings,$allitems);
my %items;
+ foreach my $parameter (@ordered) {
+ $items{$parameter} = {
+ text => ''.$parameter.' ',
+ input => 'textbox',
+ size => '15',
+ },
+ }
+ push (@ordered,'newp_value');
+ $items{'newp_value'} = {
+ text => ''.&mt('Create New Environment Variable').' '.
+ ' ',
+ input => 'textbox',
+ size => '30',
+ };
+ my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype);
+}
+
+sub get_other_items {
+ my ($cdom,$settings,$allitems) = @_;
+ unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {
+ return;
+ }
+ my @ordered;
if (ref($settings) eq 'HASH') {
foreach my $parameter (sort(keys(%{$settings}))) {
next if (grep/^\Q$parameter\E$/,@{$allitems});
- next if (($parameter eq 'course.helper.not.run') &&
- (!exists($env{'user.role.dc./'.$env{'request.role.domain'}.'/'})));
+ next if (($parameter eq 'course.helper.not.run') &&
+ (!exists($env{'user.role.dc./'.$env{'request.role.domain'}.'/'})));
unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
|| ($parameter eq 'type') ||
- ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) {
+ ($parameter =~ m/^(cc|co|in|ta|ep|ad|st)\.plaintext$/)
+ || ($parameter =~ m/^discussion_post_fonts/)) {
push(@ordered,$parameter);
- $items{$parameter} = {
- text => $parameter,
- input => 'textbox',
- size => '15',
- },
}
}
}
- return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal);
+ return @ordered;
}
sub item_table_row_start {
- my ($text,$count) = @_;
+ my ($text,$count,$add_class) = @_;
my $output;
- if ($count%2) {
- $output .= '';
- } else {
- $output .= ' ';
- }
+ my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row';
+ $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
+ $output .= ' '."\n";;
$output .= ''.$text.
' ';
return $output;
@@ -1461,15 +3710,19 @@ sub select_from_options {
}
sub make_item_rows {
- my ($cdom,$items,$ordered,$settings,$rowtotal) = @_;
+ my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype) = @_;
my $datatable;
if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
my $count = 0;
foreach my $item (@{$ordered}) {
$count ++;
- $datatable .= &item_table_row_start($items->{$item}{text},$count);
+ if (exists $items->{$item}{advanced} && $items->{$item}{advanced} == 1) {
+ $datatable .= &item_table_row_start($items->{$item}{text},$count,"advanced");
+ } else {
+ $datatable .= &item_table_row_start($items->{$item}{text},$count);
+ }
if ($item eq 'nothideprivileged') {
- $datatable .= ¬hidepriv_row($cdom,$item,$settings);
+ $datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype);
} elsif ($item eq 'print_header_format') {
$datatable .= &print_hdrfmt_row($item,$settings);
} elsif ($items->{$item}{input} eq 'dates') {
@@ -1499,7 +3752,7 @@ sub make_item_rows {
}
sub nothidepriv_row {
- my ($cdom,$item,$settings) = @_;
+ my ($cdom,$item,$settings,$crstype) = @_;
my ($cnum) = &get_course();
my %nothide;
my $datatable;
@@ -1517,6 +3770,7 @@ sub nothidepriv_row {
my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
my $now = time;
my @privusers;
+ my %privileged;
foreach my $person (keys(%coursepersonnel)) {
my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/);
$user =~ s/:$//;
@@ -1525,8 +3779,22 @@ sub nothidepriv_row {
next;
}
my ($uname,$udom) = split(':',$user);
- if (&Apache::lonnet::privileged($uname,$udom)) {
- push(@privusers,$user);
+ unless (ref($privileged{$udom}) eq 'HASH') {
+ my %dompersonnel = &Apache::lonnet::get_domain_roles($udom,['dc'],undef,$now);
+ $privileged{$udom} = {};
+ if (keys(%dompersonnel)) {
+ foreach my $server (keys(%dompersonnel)) {
+ foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
+ my ($trole,$uname,$udom) = split(/:/,$user);
+ $privileged{$udom}{$uname} = $trole;
+ }
+ }
+ }
+ }
+ if (exists($privileged{$udom}{$uname})) {
+ unless (grep(/^\Q$user\E$/,@privusers)) {
+ push(@privusers,$user);
+ }
}
}
if (@privusers) {
@@ -1546,13 +3814,17 @@ sub nothidepriv_row {
' '.
''.
' '.&mt('Hidden').' '.
- ' '.&mt('Shown').' '.
+ $hideon.' value="" />'.&mt('Hidden').' '.
+ ' '.&mt('Shown').' '.
' ';
}
$datatable .= '
';
} else {
- $datatable .= &mt('No Domain Coordinators have course roles');
+ if ($crstype eq 'Community') {
+ $datatable .= &mt('No Domain Coordinators have community roles');
+ } else {
+ $datatable .= &mt('No Domain Coordinators have course roles');
+ }
}
return $datatable;
}
@@ -1567,9 +3839,9 @@ sub print_hdrfmt_row {
$currstr .= ''.&mt('Current print header:').' '.
$settings->{$item}.' ';
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;
@@ -1629,11 +3901,11 @@ function getIndexByName(item) {
ENDJS
- $output .= $currstr.&Apache::loncommon::start_data_table();
+ $output .= $currstr.'';
return $output;
}
@@ -1687,14 +3961,22 @@ sub position_selector {
}
sub substitution_selector {
- my ($num,$subst,$limit) = @_;
+ my ($num,$subst,$limit,$crstype) = @_;
+ my ($stunametxt,$crsidtxt);
+ if ($crstype eq 'Community') {
+ $stunametxt = 'member name';
+ $crsidtxt = 'community ID',
+ } else {
+ $stunametxt = 'student name';
+ $crsidtxt = 'course ID',
+ }
my %lt = &Apache::lonlocal::texthash(
- n => 'student name',
- c => 'course ID',
+ n => $stunametxt,
+ c => $crsidtxt,
a => 'assignment note',
);
my $output .= &mt('Substitution').' '.
- '';
+ '';
if ($subst eq '') {
$output .= ' ';
}
@@ -1712,10 +3994,66 @@ sub substitution_selector {
return $output;
}
-sub modify_crsenv {
- my ($action,$cdom,%domconfig) = @_;
+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;
-