'.$user_quota_text);
+ if ($user_tools_text ne '') {
+ $r->print($user_tools_text);
+ }
+ if ($env{'form.action'} eq 'singlestudent') {
+ $r->print(&date_sections_select($context,$newuser,$formname));
+ }
+ } elsif ($user_tools_text ne '') {
+ $r->print('
'.$user_tools_text);
+ if ($env{'form.action'} eq 'singlestudent') {
+ $r->print(&date_sections_select($context,$newuser,$formname));
+ }
+ } else {
+ if ($env{'form.action'} eq 'singlestudent') {
+ $r->print('
'.
+ &date_sections_select($context,$newuser,$formname));
+ }
}
- $r->print('');
- my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
- # Build up table of user roles to allow revocation of a role.
- my ($tmp) = keys(%rolesdump);
- unless ($tmp =~ /^(con_lost|error)/i) {
- my $now=time;
- my %lt=&Apache::lonlocal::texthash(
- 'rer' => "Existing Roles",
- 'rev' => "Revoke",
+ $r->print('
');
+ if ($env{'form.action'} ne 'singlestudent') {
+ &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses);
+ }
+ } ## End of new user/old user logic
+
+ if ($env{'form.action'} eq 'singlestudent') {
+ $r->print('
'."\n");
+ } else {
+ $r->print('
'.&mt('Add Roles').' ');
+ my $addrolesdisplay = 0;
+ if ($context eq 'domain' || $context eq 'author') {
+ $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain);
+ }
+ if ($context eq 'domain') {
+ my $add_domainroles = &new_domain_roles($r);
+ if (!$addrolesdisplay) {
+ $addrolesdisplay = $add_domainroles;
+ }
+ $r->print(&course_level_dc($env{'request.role.domain'},'Course'));
+ $r->print('
'."\n");
+ } elsif ($context eq 'author') {
+ if ($addrolesdisplay) {
+ $r->print('
print(' onclick="auth_check()" \>'."\n");
+ } else {
+ $r->print('onclick="this.form.submit()" \>'."\n");
+ }
+ } else {
+ $r->print('
'.
+ &mt('Back to previous page').' ');
+ }
+ } else {
+ $r->print(&course_level_table(%inccourses));
+ $r->print('
'."\n");
+ }
+ }
+ $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
+ $r->print('
');
+ $r->print('
');
+ $r->print("".&Apache::loncommon::end_page());
+ return;
+}
+
+sub singleuser_breadcrumb {
+ my %breadcrumb_text;
+ if ($env{'form.action'} eq 'singlestudent') {
+ $breadcrumb_text{'search'} = 'Enroll a student';
+ $breadcrumb_text{'userpicked'} = 'Select a user',
+ $breadcrumb_text{'modify'} = 'Set section/dates',
+ } else {
+ $breadcrumb_text{'search'} = 'Create/modify a user';
+ $breadcrumb_text{'userpicked'} = 'Select a user',
+ $breadcrumb_text{'modify'} = 'Set user role',
+ }
+ return %breadcrumb_text;
+}
+
+sub date_sections_select {
+ my ($context,$newuser,$formname,$permission) = @_;
+ my $cid = $env{'request.course.id'};
+ my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid);
+ my $date_table = '
'.&mt('Starting and Ending Dates').' '."\n".
+ &Apache::lonuserutils::date_setting_table(undef,undef,$context,
+ undef,$formname,$permission);
+ my $rowtitle = 'Section';
+ my $secbox = '
'.&mt('Section').' '."\n".
+ &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle,
+ $permission);
+ my $output = $date_table.$secbox;
+ return $output;
+}
+
+sub validation_javascript {
+ my ($context,$ccdomain,$pjump_def,$groupslist,$newuser,$formname,
+ $loaditem) = @_;
+ my $dc_setcourse_code = '';
+ my $nondc_setsection_code = '';
+ if ($context eq 'domain') {
+ my $dcdom = $env{'request.role.domain'};
+ $loaditem->{'onload'} = "document.cu.coursedesc.value='';";
+ $dc_setcourse_code =
+ &Apache::lonuserutils::dc_setcourse_js('cu','singleuser',$context);
+ } else {
+ my $checkauth;
+ if (($newuser) || (&Apache::lonnet::allowed('mau',$ccdomain))) {
+ $checkauth = 1;
+ }
+ if ($context eq 'course') {
+ $nondc_setsection_code =
+ &Apache::lonuserutils::setsections_javascript($formname,$groupslist,
+ undef,$checkauth);
+ }
+ if ($checkauth) {
+ $nondc_setsection_code .=
+ &Apache::lonuserutils::verify_authen($formname,$context);
+ }
+ }
+ my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
+ $nondc_setsection_code,$groupslist);
+ my ($jsback,$elements) = &crumb_utilities();
+ $js .= "\n".
+ ''."\n";
+ return $js;
+}
+
+sub display_existing_roles {
+ my ($r,$ccuname,$ccdomain,$inccourses) = @_;
+ my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
+ # Build up table of user roles to allow revocation and re-enabling of roles.
+ my ($tmp) = keys(%rolesdump);
+ if ($tmp !~ /^(con_lost|error)/i) {
+ my $now=time;
+ my %lt=&Apache::lonlocal::texthash(
+ 'rer' => "Existing Roles",
+ 'rev' => "Revoke",
'del' => "Delete",
- 'ren' => "Re-Enable",
+ 'ren' => "Re-Enable",
'rol' => "Role",
'ext' => "Extent",
'sta' => "Start",
- 'end' => "End"
- );
- my (%roletext,%sortrole,%roleclass,%rolepriv);
- foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
- my $b1=join('_',(split('_',$b))[1,0]);
- return $a1 cmp $b1;
- } keys(%rolesdump)) {
- next if ($area =~ /^rolesdef/);
- my $envkey=$area;
- my $role = $rolesdump{$area};
- my $thisrole=$area;
- $area =~ s/\_\w\w$//;
- my ($role_code,$role_end_time,$role_start_time) =
- split(/_/,$role);
+ 'end' => "End",
+ );
+ my (%roletext,%sortrole,%roleclass,%rolepriv);
+ foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]);
+ my $b1=join('_',(split('_',$b))[1,0]);
+ return $a1 cmp $b1;
+ } keys(%rolesdump)) {
+ next if ($area =~ /^rolesdef/);
+ my $envkey=$area;
+ my $role = $rolesdump{$area};
+ my $thisrole=$area;
+ $area =~ s/\_\w\w$//;
+ my ($role_code,$role_end_time,$role_start_time) =
+ split(/_/,$role);
# Is this a custom role? Get role owner and title.
- my ($croleudom,$croleuname,$croletitle)=
- ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
- my $allowed=0;
- my $delallowed=0;
- my $sortkey=$role_code;
- my $class='Unknown';
- if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
- $class='Course';
- my ($coursedom,$coursedir) = ($1,$2);
- $sortkey.="\0$coursedom";
- # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
- my %coursedata=
- &Apache::lonnet::coursedescription($1.'_'.$2);
- my $carea;
- if (defined($coursedata{'description'})) {
- $carea=$coursedata{'description'}.
- '
'.&mt('Domain').': '.$coursedom.(' 'x8).
- &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
- $sortkey.="\0".$coursedata{'description'};
- $class=$coursedata{'type'};
- } else {
- $carea=&mt('Unavailable course').': '.$area;
- $sortkey.="\0".&mt('Unavailable course').': '.$area;
- }
- $sortkey.="\0$coursedir";
- $inccourses{$1.'_'.$2}=1;
- if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
- (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
- $allowed=1;
- }
- if ((&Apache::lonnet::allowed('dro',$1)) ||
- (&Apache::lonnet::allowed('dro',$ccdomain))) {
- $delallowed=1;
- }
+ my ($croleudom,$croleuname,$croletitle)=
+ ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$});
+ my $allowed=0;
+ my $delallowed=0;
+ my $sortkey=$role_code;
+ my $class='Unknown';
+ if ($area =~ m{^/($match_domain)/($match_courseid)} ) {
+ $class='Course';
+ my ($coursedom,$coursedir) = ($1,$2);
+ $sortkey.="\0$coursedom";
+ # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
+ my %coursedata=
+ &Apache::lonnet::coursedescription($1.'_'.$2);
+ my $carea;
+ if (defined($coursedata{'description'})) {
+ $carea=$coursedata{'description'}.
+ '
'.&mt('Domain').': '.$coursedom.(' 'x8).
+ &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
+ $sortkey.="\0".$coursedata{'description'};
+ $class=$coursedata{'type'};
+ } else {
+ $carea=&mt('Unavailable course').': '.$area;
+ $sortkey.="\0".&mt('Unavailable course').': '.$area;
+ }
+ $sortkey.="\0$coursedir";
+ $inccourses->{$1.'_'.$2}=1;
+ if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
+ (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
+ $allowed=1;
+ }
+ if ((&Apache::lonnet::allowed('dro',$1)) ||
+ (&Apache::lonnet::allowed('dro',$ccdomain))) {
+ $delallowed=1;
+ }
# - custom role. Needs more info, too
- if ($croletitle) {
- if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
- $allowed=1;
- $thisrole.='.'.$role_code;
- }
- }
- # Compute the background color based on $area
- if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
- $carea.='
Section: '.$3;
- $sortkey.="\0$3";
- }
- $area=$carea;
- } else {
- $sortkey.="\0".$area;
- # Determine if current user is able to revoke privileges
- if ($area=~m{^/($match_domain)/}) {
- if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
+ if ($croletitle) {
+ if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
+ $allowed=1;
+ $thisrole.='.'.$role_code;
+ }
+ }
+ # Compute the background color based on $area
+ if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) {
+ $carea.='
Section: '.$3;
+ $sortkey.="\0$3";
+ if (!$allowed) {
+ if ($env{'request.course.sec'} eq $3) {
+ if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) {
+ $allowed = 1;
+ }
+ }
+ }
+ }
+ $area=$carea;
+ } else {
+ $sortkey.="\0".$area;
+ # Determine if current user is able to revoke privileges
+ if ($area=~m{^/($match_domain)/}) {
+ if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
(&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
- $allowed=1;
- }
- if (((&Apache::lonnet::allowed('dro',$1)) ||
- (&Apache::lonnet::allowed('dro',$ccdomain))) &&
- ($role_code ne 'dc')) {
- $delallowed=1;
- }
- } else {
- if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
- $allowed=1;
- }
- }
- if ($role_code eq 'ca' || $role_code eq 'au') {
- $class='Construction Space';
- } elsif ($role_code eq 'su') {
- $class='System';
- } else {
- $class='Domain';
- }
- }
- if (($role_code eq 'ca') || ($role_code eq 'aa')) {
- $area=~m{/($match_domain)/($match_username)};
- if (&Apache::lonuserutils::authorpriv($2,$1)) {
- $allowed=1;
- } else {
- $allowed=0;
- }
- }
- my $row = '';
- $row.= '
';
- my $active=1;
- $active=0 if (($role_end_time) && ($now>$role_end_time));
- if (($active) && ($allowed)) {
- $row.= ' ';
- } else {
- if ($active) {
- $row.=' ';
- } else {
- $row.=&mt('expired or revoked');
- }
- }
- $row.=' ';
- if ($allowed && !$active) {
- $row.= ' ';
- } else {
- $row.=' ';
- }
- $row.=' ';
- if ($delallowed) {
- $row.= ' ';
- } else {
+ $allowed=1;
+ }
+ if (((&Apache::lonnet::allowed('dro',$1)) ||
+ (&Apache::lonnet::allowed('dro',$ccdomain))) &&
+ ($role_code ne 'dc')) {
+ $delallowed=1;
+ }
+ } else {
+ if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
+ $allowed=1;
+ }
+ }
+ if ($role_code eq 'ca' || $role_code eq 'au') {
+ $class='Construction Space';
+ } elsif ($role_code eq 'su') {
+ $class='System';
+ } else {
+ $class='Domain';
+ }
+ }
+ if (($role_code eq 'ca') || ($role_code eq 'aa')) {
+ $area=~m{/($match_domain)/($match_username)};
+ if (&Apache::lonuserutils::authorpriv($2,$1)) {
+ $allowed=1;
+ } else {
+ $allowed=0;
+ }
+ }
+ my $row = '';
+ $row.= ' ';
+ my $active=1;
+ $active=0 if (($role_end_time) && ($now>$role_end_time));
+ if (($active) && ($allowed)) {
+ $row.= ' ';
+ } else {
+ if ($active) {
$row.=' ';
- }
- my $plaintext='';
- if (!$croletitle) {
- $plaintext=&Apache::lonnet::plaintext($role_code,$class)
- } else {
- $plaintext=
- "Customrole '$croletitle' defined by $croleuname\@$croleudom";
- }
- $row.= ' '.$plaintext.
- ' '.$area.
- ' '.($role_start_time?localtime($role_start_time)
- : ' ' ).
- ' '.($role_end_time ?localtime($role_end_time)
- : ' ' )
- ." ";
- $sortrole{$sortkey}=$envkey;
- $roletext{$envkey}=$row;
- $roleclass{$envkey}=$class;
- $rolepriv{$envkey}=$allowed;
- #$r->print($row);
- } # end of foreach (table building loop)
- my $rolesdisplay = 0;
- my %output = ();
- foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
- $output{$type} = '';
- foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
- if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
- $output{$type}.=
- &Apache::loncommon::start_data_table_row().
- $roletext{$sortrole{$which}}.
- &Apache::loncommon::end_data_table_row();
- }
- }
- unless($output{$type} eq '') {
- $output{$type} = '
'.
- "".&mt($type)." ".
- $output{$type};
- $rolesdisplay = 1;
- }
- }
- if ($rolesdisplay == 1) {
- $r->print('
+ } else {
+ $row.=&mt('expired or revoked');
+ }
+ }
+ $row.='
';
+ if ($allowed && !$active) {
+ $row.= ' ';
+ } else {
+ $row.=' ';
+ }
+ $row.=' ';
+ if ($delallowed) {
+ $row.= ' ';
+ } else {
+ $row.=' ';
+ }
+ my $plaintext='';
+ if (!$croletitle) {
+ $plaintext=&Apache::lonnet::plaintext($role_code,$class)
+ } else {
+ $plaintext=
+ "Customrole '$croletitle' defined by $croleuname\@$croleudom";
+ }
+ $row.= ' '.$plaintext.
+ ' '.$area.
+ ' '.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time)
+ : ' ' ).
+ ' '.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time)
+ : ' ' )
+ ." ";
+ $sortrole{$sortkey}=$envkey;
+ $roletext{$envkey}=$row;
+ $roleclass{$envkey}=$class;
+ $rolepriv{$envkey}=$allowed;
+ #$r->print($row);
+ } # end of foreach (table building loop)
+ my $rolesdisplay = 0;
+ my %output = ();
+ foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
+ $output{$type} = '';
+ foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
+ if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) {
+ $output{$type}.=
+ &Apache::loncommon::start_data_table_row().
+ $roletext{$sortrole{$which}}.
+ &Apache::loncommon::end_data_table_row();
+ }
+ }
+ unless($output{$type} eq '') {
+ $output{$type} = '
'.
+ "".&mt($type)." ".
+ $output{$type};
+ $rolesdisplay = 1;
+ }
+ }
+ if ($rolesdisplay == 1) {
+ my $contextrole='';
+ if ($env{'request.course.id'}) {
+ $contextrole = 'Existing Roles in this Course';
+ } elsif ($env{'request.role'} =~ /^au\./) {
+ $contextrole = 'Existing Co-Author Roles in your Construction Space';
+ } else {
+ $contextrole = 'Existing Roles in this Domain';
+ }
+ $r->print('
'.$lt{'rer'}.' '.
+'
'.&mt($contextrole).'
'.
&Apache::loncommon::start_data_table("LC_createuser").
&Apache::loncommon::start_data_table_header_row().
'
'.$lt{'rev'}.' '.$lt{'ren'}.' '.$lt{'del'}.
' '.$lt{'rol'}.' '.$lt{'ext'}.
' '.$lt{'sta'}.' '.$lt{'end'}.' '.
&Apache::loncommon::end_data_table_header_row());
- foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
- if ($output{$type}) {
- $r->print($output{$type}."\n");
- }
- }
- $r->print(&Apache::loncommon::end_data_table());
- }
- } # End of unless
- } ## End of new user/old user logic
+ foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') {
+ if ($output{$type}) {
+ $r->print($output{$type}."\n");
+ }
+ }
+ $r->print(&Apache::loncommon::end_data_table());
+ }
+ } # End of check for keys in rolesdump
+ return;
+}
+
+sub new_coauthor_roles {
+ my ($r,$ccuname,$ccdomain) = @_;
my $addrolesdisplay = 0;
- $r->print('
'.&mt('Add Roles').' ');
-#
-# Co-Author
-#
+ #
+ # Co-Author
+ #
if (&Apache::lonuserutils::authorpriv($env{'user.name'},
$env{'request.role.domain'}) &&
($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {
# No sense in assigning co-author role to yourself
$addrolesdisplay = 1;
- my $cuname=$env{'user.name'};
+ my $cuname=$env{'user.name'};
my $cudom=$env{'request.role.domain'};
- my %lt=&Apache::lonlocal::texthash(
- 'cs' => "Construction Space",
- 'act' => "Activate",
+ my %lt=&Apache::lonlocal::texthash(
+ 'cs' => "Construction Space",
+ 'act' => "Activate",
'rol' => "Role",
'ext' => "Extent",
'sta' => "Start",
@@ -1072,17 +1513,17 @@ ENDNOPORTPRIV
'caa' => "Assistant Co-Author",
'ssd' => "Set Start Date",
'sed' => "Set End Date"
- );
- $r->print('
'.$lt{'cs'}.' '."\n".
- &Apache::loncommon::start_data_table()."\n".
- &Apache::loncommon::start_data_table_header_row()."\n".
- '
'.$lt{'act'}.' '.$lt{'rol'}.' '.
- '
'.$lt{'ext'}.' '.$lt{'sta'}.' '.
- '
'.$lt{'end'}.' '."\n".
- &Apache::loncommon::end_data_table_header_row()."\n".
- &Apache::loncommon::start_data_table_row()."\n".
- '
-
+ );
+ $r->print(''.$lt{'cs'}.' '."\n".
+ &Apache::loncommon::start_data_table()."\n".
+ &Apache::loncommon::start_data_table_header_row()."\n".
+ ' '.$lt{'act'}.' '.$lt{'rol'}.' '.
+ '
'.$lt{'ext'}.' '.$lt{'sta'}.' '.
+ '
'.$lt{'end'}.' '."\n".
+ &Apache::loncommon::end_data_table_header_row()."\n".
+ &Apache::loncommon::start_data_table_row().'
+
+
'.$lt{'cau'}.'
'.$cudom.'_'.$cuname.'
@@ -1092,9 +1533,9 @@ ENDNOPORTPRIV
'.$lt{'sed'}.' '."\n".
- &Apache::loncommon::end_data_table_row()."\n".
- &Apache::loncommon::start_data_table_row()."\n".
-'
+ &Apache::loncommon::end_data_table_row()."\n".
+ &Apache::loncommon::start_data_table_row()."\n".
+'
'.$lt{'caa'}.'
'.$cudom.'_'.$cuname.'
@@ -1103,24 +1544,30 @@ ENDNOPORTPRIV
'.$lt{'sed'}.' '."\n".
- &Apache::loncommon::end_data_table_row()."\n".
- &Apache::loncommon::end_data_table());
+ &Apache::loncommon::end_data_table_row()."\n".
+ &Apache::loncommon::end_data_table());
} elsif ($env{'request.role'} =~ /^au\./) {
if (!(&Apache::lonuserutils::authorpriv($env{'user.name'},
$env{'request.role.domain'}))) {
$r->print('
'.
&mt('You do not have privileges to assign co-author roles.').
' ');
- } elsif (($env{'user.name'} eq $ccuname) &&
+ } elsif (($env{'user.name'} eq $ccuname) &&
($env{'user.domain'} eq $ccdomain)) {
- $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted'));
+ $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted'));
}
}
-#
-# Domain level
-#
+ return $addrolesdisplay;;
+}
+
+sub new_domain_roles {
+ my ($r) = @_;
+ my $addrolesdisplay = 0;
+ #
+ # Domain level
+ #
my $num_domain_level = 0;
- my $domaintext =
+ my $domaintext =
'
'.&mt('Domain Level').' '.
&Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
@@ -1128,18 +1575,20 @@ ENDNOPORTPRIV
&mt('Extent').''.
'
'.&mt('Start').' '.&mt('End').' '.
&Apache::loncommon::end_data_table_header_row();
+ my @allroles = &Apache::lonuserutils::roles_by_context('domain');
foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {
- foreach my $role ('dc','li','dg','au','sc') {
+ foreach my $role (@allroles) {
+ next if ($role eq 'ad');
if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
my $plrole=&Apache::lonnet::plaintext($role);
- my %lt=&Apache::lonlocal::texthash(
+ my %lt=&Apache::lonlocal::texthash(
'ssd' => "Set Start Date",
'sed' => "Set End Date"
- );
+ );
$num_domain_level ++;
- $domaintext .=
+ $domaintext .=
&Apache::loncommon::start_data_table_row().
-'
+'
'.$plrole.'
'.$thisdomain.'
@@ -1150,59 +1599,20 @@ ENDNOPORTPRIV
"javascript:pjump('."'date_end','End Date $plrole',document.cu.end_$thisdomain\_$role.value,'end_$thisdomain\_$role','cu.pres','dateset'".')">'.$lt{'sed'}.''.
&Apache::loncommon::end_data_table_row();
}
- }
+ }
}
$domaintext.= &Apache::loncommon::end_data_table();
if ($num_domain_level > 0) {
$r->print($domaintext);
$addrolesdisplay = 1;
}
-#
-# Course level
-#
-
- if ($env{'request.role'} =~ m{^dc\./($match_domain)/$}) {
- $r->print(&course_level_dc($1,'Course'));
- $r->print('
'."\n");
- } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/$}) {
- if ($addrolesdisplay) {
- $r->print('
print(' onClick="verify_message(this.form)" \>'."\n");
- } else {
- $r->print('onClick="this.form.submit()" \>'."\n");
- }
- } else {
- $r->print('
'.
- &mt('Back to previous page').' ');
- }
- } else {
- $r->print(&course_level_table(%inccourses));
- $r->print('
'."\n");
- }
- $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
- $r->print('
');
- $r->print('
');
- $r->print("".&Apache::loncommon::end_page());
+ return $addrolesdisplay;
}
sub user_authentication {
- my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_;
+ my ($ccuname,$ccdomain,$formname) = @_;
my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
- my ($loginscript,$outcome);
- if ($currentauth=~/^(krb)(4|5):(.*)/) {
- my $long_auth = $1.$2;
- my $curr_kerb_ver = $2;
- my $krbdefdom=$3;
- my $curr_authtype = $abv_auth->{$long_auth};
- my %param = ( formname => 'document.cu',
- kerb_def_dom => $krbdefdom,
- domain => $ccdomain,
- curr_authtype => $curr_authtype,
- curr_kerb_ver => $curr_kerb_ver,
- );
- $loginscript = &Apache::loncommon::authform_header(%param);
- }
+ my $outcome;
# Check for a bad authentication type
if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) {
# bad authentication scheme
@@ -1214,11 +1624,14 @@ sub user_authentication {
'ld' => "Login Data"
);
if (&Apache::lonnet::allowed('mau',$ccdomain)) {
- &initialize_authen_forms($ccdomain);
+ &initialize_authen_forms($ccdomain,$formname);
+
my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
$outcome = <
+//
$lt{'err'}:
$lt{'uuas'} ($currentauth). $lt{'sldb'}.
@@ -1235,7 +1648,7 @@ $lt{'uuas'} ($currentauth). $lt{'adcs'}.
ENDBADAUTH
}
} else { # Authentication type is valid
- &initialize_authen_forms($ccdomain,$currentauth,'modifyuser');
+ &initialize_authen_forms($ccdomain,$formname,$currentauth,'modifyuser');
my ($authformcurrent,$can_modify,@authform_others) =
&modify_login_block($ccdomain,$currentauth);
if (&Apache::lonnet::allowed('mau',$ccdomain)) {
@@ -1247,7 +1660,9 @@ ENDBADAUTH
);
$outcome =
''."\n".
''.$lt{'ld'}.' '.
&Apache::loncommon::start_data_table().
@@ -1279,6 +1694,7 @@ ENDBADAUTH
$outcome .= <$lt{'ccld'}
$lt{'yodo'} $lt{'ifch'}: $ccdomain
+
ENDNOPRIV
}
}
@@ -1353,16 +1769,26 @@ sub modify_login_block {
}
sub personal_data_display {
- my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_;
- my ($output,$showforceid,%userenv,%domconfig);
+ my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_;
+ my ($output,$showforceid,%userenv,%canmodify,%canmodify_status);
+ my @userinfo = ('firstname','middlename','lastname','generation',
+ 'permanentemail','id');
+ my $rowcount = 0;
+ my $editable = 0;
+ %canmodify_status =
+ &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
+ ['inststatus'],$rolesarray);
if (!$newuser) {
# Get the users information
%userenv = &Apache::lonnet::get('environment',
['firstname','middlename','lastname','generation',
- 'permanentemail','id'],$ccdomain,$ccuname);
- %domconfig =
- &Apache::lonnet::get_dom('configuration',['usermodification'],
- $ccdomain);
+ 'permanentemail','id','inststatus'],$ccdomain,$ccuname);
+ %canmodify =
+ &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
+ \@userinfo,$rolesarray);
+ } elsif ($context eq 'selfcreate') {
+ %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo,
+ $inst_results,$rolesarray);
}
my %lt=&Apache::lonlocal::texthash(
'pd' => "Personal Data",
@@ -1371,11 +1797,10 @@ sub personal_data_display {
'lastname' => "Last Name",
'generation' => "Generation",
'permanentemail' => "Permanent e-mail address",
- 'id' => "ID/Student Number",
- 'lg' => "Login Data"
+ 'id' => "Student/Employee ID",
+ 'lg' => "Login Data",
+ 'inststatus' => "Affiliation",
);
- my @userinfo = ('firstname','middlename','lastname','generation',
- 'permanentemail','id');
my %textboxsize = (
firstname => '15',
middlename => '15',
@@ -1389,59 +1814,163 @@ sub personal_data_display {
&Apache::lonhtmlcommon::start_pick_box();
foreach my $item (@userinfo) {
my $rowtitle = $lt{$item};
+ my $hiderow = 0;
if ($item eq 'generation') {
$rowtitle = $genhelp.$rowtitle;
}
- $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
+ my $row = &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n";
if ($newuser) {
if (ref($inst_results) eq 'HASH') {
if ($inst_results->{$item} ne '') {
- $output .= ' '.$inst_results->{$item};
+ $row .= ' '.$inst_results->{$item};
} else {
- $output .= ' ';
+ if ($context eq 'selfcreate') {
+ if ($canmodify{$item}) {
+ $row .= ' ';
+ $editable ++;
+ } else {
+ $hiderow = 1;
+ }
+ } else {
+ $row .= ' ';
+ }
}
} else {
- $output .= ' ';
- }
- } else {
- my $canmodify = 0;
- if (&Apache::lonnet::allowed('mau',$ccdomain)) {
- $canmodify = 1;
- } else {
- if (ref($domconfig{'usermodification'}) eq 'HASH') {
- if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') {
- foreach my $key (keys(%{$domconfig{'usermodification'}{$context}})) {
- if (ref($domconfig{'usermodification'}{$context}{$key}) eq 'HASH') {
- if ($domconfig{'usermodification'}{$context}{$key}{$item}) {
- $canmodify = 1;
- last;
- }
- }
+ if ($context eq 'selfcreate') {
+ if (($item eq 'permanentemail') && ($newuser eq 'email')) {
+ $row .= $ccuname;
+ } else {
+ if ($canmodify{$item}) {
+ $row .= ' ';
+ $editable ++;
+ } else {
+ $hiderow = 1;
}
}
- } elsif ($context eq 'course') {
- $canmodify = 1;
+ } else {
+ $row .= ' ';
}
}
- if ($canmodify) {
- $output .= ' ';
+ } else {
+ if ($canmodify{$item}) {
+ $row .= ' ';
} else {
- $output .= $userenv{$item};
+ $row .= $userenv{$item};
}
if ($item eq 'id') {
- $showforceid = $canmodify;
- }
+ $showforceid = $canmodify{$item};
+ }
+ }
+ $row .= &Apache::lonhtmlcommon::row_closure(1);
+ if (!$hiderow) {
+ $output .= $row;
+ $rowcount ++;
+ }
+ }
+ if (($canmodify_status{'inststatus'}) || ($context ne 'selfcreate')) {
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($ccdomain);
+ if (ref($types) eq 'ARRAY') {
+ if (@{$types} > 0) {
+ my ($hiderow,$shown);
+ if ($canmodify_status{'inststatus'}) {
+ $shown = &pick_inst_statuses($userenv{'inststatus'},$usertypes,$types);
+ } else {
+ $shown .= $userenv{'inststatus'};
+ if ($userenv{'inststatus'} eq '') {
+ $hiderow = 1;
+ }
+ }
+ if (!$hiderow) {
+ my $row = &Apache::lonhtmlcommon::row_title(&mt('Affliations'),undef,'LC_oddrow_value')."\n".
+ $shown.&Apache::lonhtmlcommon::row_closure(1);
+ if ($context eq 'selfcreate') {
+ $rowcount ++;
+ }
+ $output .= $row;
+ }
+ }
}
- $output .= &Apache::lonhtmlcommon::row_closure(1);
}
$output .= &Apache::lonhtmlcommon::end_pick_box();
if (wantarray) {
- return ($output,$showforceid);
+ if ($context eq 'selfcreate') {
+ return($output,$rowcount,$editable);
+ } else {
+ return ($output,$showforceid);
+ }
} else {
return $output;
}
}
+sub pick_inst_statuses {
+ my ($curr,$usertypes,$types) = @_;
+ my ($output,$rem,@currtypes);
+ if ($curr ne '') {
+ @currtypes = map { &unescape($_); } split(/:/,$curr);
+ }
+ my $numinrow = 2;
+ if (ref($types) eq 'ARRAY') {
+ $output = '';
+ }
+ return $output;
+}
+
+sub selfcreate_canmodify {
+ my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_;
+ if (ref($inst_results) eq 'HASH') {
+ my @inststatuses = &get_inststatuses($inst_results);
+ if (@inststatuses == 0) {
+ @inststatuses = ('default');
+ }
+ $rolesarray = \@inststatuses;
+ }
+ my %canmodify =
+ &Apache::lonuserutils::can_modify_userinfo($context,$dom,$userinfo,
+ $rolesarray);
+ return %canmodify;
+}
+
+sub get_inststatuses {
+ my ($insthashref) = @_;
+ my @inststatuses = ();
+ if (ref($insthashref) eq 'HASH') {
+ if (ref($insthashref->{'inststatus'}) eq 'ARRAY') {
+ @inststatuses = @{$insthashref->{'inststatus'}};
+ }
+ }
+ return @inststatuses;
+}
+
# ================================================================= Phase Three
sub update_user_data {
my ($r,$context) = @_;
@@ -1452,39 +1981,53 @@ sub update_user_data {
my $end = ' ';
my $rtnlink = ' '.
- &mt('Return to previous page').''.&Apache::loncommon::end_page();
+ &mt('Return to previous page').''.
+ &Apache::loncommon::end_page();
+ my $now = time;
my $title;
if (exists($env{'form.makeuser'})) {
$title='Set Privileges for New User';
} else {
$title='Modify User Privileges';
}
-
+ my $newuser = 0;
my ($jsback,$elements) = &crumb_utilities();
my $jscript = ''."\n";
-
- $r->print(&Apache::loncommon::start_page($title,$jscript));
+ '// '."\n".
+ ''."\n";
+ my %breadcrumb_text = &singleuser_breadcrumb();
+ my $args;
+ if ($env{'form.popup'}) {
+ $args->{'no_nav_bar'} = 1;
+ } else {
+ $args = undef;
+ }
+ $r->print(&Apache::loncommon::start_page($title,$jscript,$args));
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"javascript:backPage(document.userupdate)",
- text=>"Create/modify user",
+ text=>$breadcrumb_text{'search'},
faq=>282,bug=>'Instructor Interface',});
if ($env{'form.prevphase'} eq 'userpicked') {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"javascript:backPage(document.userupdate,'get_user_info','select')",
- text=>"Select a user",
+ text=>$breadcrumb_text{'userpicked'},
faq=>282,bug=>'Instructor Interface',});
}
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')",
- text=>"Set user role",
+ text=>$breadcrumb_text{'modify'},
faq=>282,bug=>'Instructor Interface',},
{href=>"/adm/createuser",
text=>"Result",
faq=>282,bug=>'Instructor Interface',});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
-
- my %disallowed;
+ my $helpitem = 'Course_Change_Privileges';
+ if ($env{'form.action'} eq 'singlestudent') {
+ $helpitem = 'Course_Add_Student';
+ }
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
+ $helpitem));
$r->print(&update_result_form($uhome));
# Check Inputs
if (! $env{'form.ccuname'} ) {
@@ -1493,8 +2036,8 @@ sub update_user_data {
}
if ( $env{'form.ccuname'} ne
&LONCAPA::clean_username($env{'form.ccuname'}) ) {
- $r->print($error.&mt('Invalid login name').'. '.
- &mt('Only letters, numbers, periods, dashes, @, and underscores are valid').'.'.
+ $r->print($error.&mt('Invalid login name.').' '.
+ &mt('Only letters, numbers, periods, dashes, @, and underscores are valid.').
$end.$rtnlink);
return;
}
@@ -1504,11 +2047,14 @@ sub update_user_data {
}
if ( $env{'form.ccdomain'} ne
&LONCAPA::clean_domain($env{'form.ccdomain'}) ) {
- $r->print($error.&mt ('Invalid domain name').'. '.
- &mt('Only letters, numbers, periods, dashes, and underscores are valid').'.'.
+ $r->print($error.&mt('Invalid domain name.').' '.
+ &mt('Only letters, numbers, periods, dashes, and underscores are valid.').
$end.$rtnlink);
return;
}
+ if ($uhome eq 'no_host') {
+ $newuser = 1;
+ }
if (! exists($env{'form.makeuser'})) {
# Modifying an existing user, so check the validity of the name
if ($uhome eq 'no_host') {
@@ -1546,10 +2092,13 @@ sub update_user_data {
return;
}
-
$r->print(''.&mt('User [_1] in domain [_2]',
$env{'form.ccuname'}, $env{'form.ccdomain'}).' ');
my (%alerts,%rulematch,%inst_results,%curr_rules);
+ my @usertools = ('aboutme','blog','portfolio');
+ my @requestcourses = ('official','unofficial','community');
+ my ($othertitle,$usertypes,$types) =
+ &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
if ($env{'form.makeuser'}) {
$r->print(''.&mt('Creating new account.').' ');
# Check for the authentication mode and password
@@ -1573,7 +2122,7 @@ sub update_user_data {
my %checkhash;
my %checks = ('id' => 1);
%{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = (
- 'newuser' => 1,
+ 'newuser' => $newuser,
'id' => $env{'form.cid'},
);
if ($env{'form.cid'} ne '') {
@@ -1607,10 +2156,58 @@ sub update_user_data {
$env{'form.cgeneration'},undef,$desiredhost,
$env{'form.cpermanentemail'});
$r->print(&mt('Generating user').': '.$result);
- my $home = &Apache::lonnet::homeserver($env{'form.ccuname'},
+ $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'},
$env{'form.ccdomain'});
- $r->print(' '.&mt('Home server').': '.$home.' '.
- &Apache::lonnet::hostname($home));
+ my (%changeHash,%newcustom,%changed);
+ if ($uhome ne 'no_host') {
+ if ($env{'form.customquota'} == 1) {
+ if ($env{'form.portfolioquota'} eq '') {
+ $newcustom{'quota'} = 0;
+ } else {
+ $newcustom{'quota'} = $env{'form.portfolioquota'};
+ $newcustom{'quota'} =~ s/[^\d\.]//g;
+ }
+ $changed{'quota'} = "a_admin($newcustom{'quota'},\%changeHash);
+ }
+ foreach my $item (@usertools) {
+ if ($env{'form.custom'.$item} == 1) {
+ $newcustom{$item} = $env{'form.tools_'.$item};
+ $changed{$item} = &tool_admin($item,$newcustom{$item},
+ \%changeHash,'tools');
+ }
+ }
+ foreach my $item (@requestcourses) {
+ $newcustom{$item} = $env{'form.crsreq_'.$item};
+ if ($env{'form.crsreq_'.$item} eq 'autolimit') {
+ $newcustom{$item} .= '=';
+ unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) {
+ $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'};
+ }
+ }
+ $changed{$item} = &tool_admin($item,$newcustom{$item},
+ \%changeHash,'requestcourses');
+ }
+ if (exists($env{'form.inststatus'})) {
+ my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
+ if (@inststatuses > 0) {
+ $changeHash{'inststatus'} = join(',',@inststatuses);
+ $changed{'inststatus'} = $changeHash{'inststatus'};
+ }
+ }
+ if (keys(%changed)) {
+ $changeHash{'firstname'} = $env{'form.cfirstname'};
+ $changeHash{'middlename'} = $env{'form.cmiddlename'};
+ $changeHash{'lastname'} = $env{'form.clastname'};
+ $changeHash{'generation'} = $env{'form.cgeneration'};
+ $changeHash{'id'} = $env{'form.cid'};
+ $changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
+ my $chgresult =
+ &Apache::lonnet::put('environment',\%changeHash,
+ $env{'form.ccdomain'},$env{'form.ccuname'});
+ }
+ }
+ $r->print(' '.&mt('Home server').': '.$uhome.' '.
+ &Apache::lonnet::hostname($uhome));
} elsif (($env{'form.login'} ne 'nochange') &&
($env{'form.login'} ne '' )) {
# Modify user privileges
@@ -1632,11 +2229,19 @@ sub update_user_data {
}
}
##
+ my (@userroles,%userupdate,$cnum,$cdom,$namechanged);
+ if ($context eq 'course') {
+ ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
+ }
if (! $env{'form.makeuser'} ) {
# Check for need to change
my %userenv = &Apache::lonnet::get
('environment',['firstname','middlename','lastname','generation',
- 'id','permanentemail','portfolioquota','inststatus'],
+ 'id','permanentemail','portfolioquota','inststatus','tools.aboutme',
+ 'tools.blog','tools.portfolio','requestcourses.official',
+ 'requestcourses.unofficial','requestcourses.community',
+ 'reqcrsotherdom.official','reqcrsotherdom.unofficial',
+ 'reqcrsotherdom.community'],
$env{'form.ccdomain'},$env{'form.ccuname'});
my ($tmp) = keys(%userenv);
if ($tmp =~ /^(con_lost|error)/i) {
@@ -1647,26 +2252,15 @@ sub update_user_data {
my %domconfig =
&Apache::lonnet::get_dom('configuration',['usermodification'],
$env{'form.ccdomain'});
- my @roletypes = ('active','future');
- my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@roletypes,undef,$env{'request.role.domain'});
- my @userroles;
- my ($cnum,$cdom,$auname,$audom);
- if ($context eq 'course') {
- $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- if ($cnum eq '' || $cdom eq '') {
- my $cid = $env{'request.course.id'};
- my %coursehash =
- &Apache::lonnet::coursedescription($cid,{'one_time' => 1});
- $cdom = $coursehash{'domain'};
- $cnum = $coursehash{'num'};
- }
- } elsif ($context eq 'author') {
+ my @statuses = ('active','future');
+ my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'});
+ my ($auname,$audom);
+ if ($context eq 'author') {
$auname = $env{'user.name'};
$audom = $env{'user.domain'};
}
foreach my $item (keys(%roles)) {
- my ($rolenum,$roledom,$role) = split(/:/,$item);
+ my ($rolenum,$roledom,$role) = split(/:/,$item,-1);
if ($context eq 'course') {
if ($cnum ne '' && $cdom ne '') {
if ($rolenum eq $cnum && $roledom eq $cdom) {
@@ -1683,27 +2277,33 @@ sub update_user_data {
}
}
}
- # Check for course or co-author roles being activated or re-enabled
- if ($context eq 'author' || $context eq 'course') {
- foreach my $key (keys(%env)) {
- if ($context eq 'author') {
- if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) {
- if (!grep(/^\Q$1\E$/,@userroles)) {
- push(@userroles,$1);
- }
- } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) {
- if (!grep(/^\Q$1\E$/,@userroles)) {
- push(@userroles,$1);
- }
- }
- } elsif ($context eq 'course') {
- if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) {
- if (!grep(/^\Q$1\E$/,@userroles)) {
- push(@userroles,$1);
- }
- } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) {
- if (!grep(/^\Q$1\E$/,@userroles)) {
- push(@userroles,$1);
+ if ($env{'form.action'} eq 'singlestudent') {
+ if (!grep(/^st$/,@userroles)) {
+ push(@userroles,'st');
+ }
+ } else {
+ # Check for course or co-author roles being activated or re-enabled
+ if ($context eq 'author' || $context eq 'course') {
+ foreach my $key (keys(%env)) {
+ if ($context eq 'author') {
+ if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) {
+ if (!grep(/^\Q$1\E$/,@userroles)) {
+ push(@userroles,$1);
+ }
+ } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) {
+ if (!grep(/^\Q$1\E$/,@userroles)) {
+ push(@userroles,$1);
+ }
+ }
+ } elsif ($context eq 'course') {
+ if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) {
+ if (!grep(/^\Q$1\E$/,@userroles)) {
+ push(@userroles,$1);
+ }
+ } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) {
+ if (!grep(/^\Q$1\E$/,@userroles)) {
+ push(@userroles,$1);
+ }
}
}
}
@@ -1718,33 +2318,12 @@ sub update_user_data {
push(@longroles,&Apache::lonnet::plaintext($role));
}
}
- foreach my $item ('firstname','middlename','lastname','generation','permanentemail','id') {
- my $canmodify = 0;
- if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
- $canmodify = 1;
- } else {
- if ($context eq 'course' || $context eq 'author') {
- if (ref($domconfig{'usermodification'}) eq 'HASH') {
- if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') {
- foreach my $role (@userroles) {
- if (ref($domconfig{'usermodification'}{$context}{$role}) eq 'HASH') {
- if ($domconfig{'usermodification'}{$context}{$role}{$item}) {
- $canmodify = 1;
- last;
- }
- }
- }
- }
- }
- } elsif ($context eq 'course') {
- if (grep(/^st$/,@userroles)) {
- $canmodify = 1;
- }
- }
- }
+ my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
+ my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles);
+ foreach my $item (@userinfo) {
# Strip leading and trailing whitespace
$env{'form.c'.$item} =~ s/(\s+$|^\s+)//g;
- if (!$canmodify) {
+ if (!$canmodify{$item}) {
if (defined($env{'form.c'.$item})) {
if ($env{'form.c'.$item} ne $userenv{$item}) {
push(@mod_disallowed,$item);
@@ -1753,10 +2332,9 @@ sub update_user_data {
$env{'form.c'.$item} = $userenv{$item};
}
}
- # Check to see if we can change the ID/student number
+ # Check to see if we can change the Student/Employee ID
my $forceid = $env{'form.forceid'};
my $recurseid = $env{'form.recurseid'};
- my $newuser = 0;
my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules);
my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'},
$env{'form.ccuname'});
@@ -1765,7 +2343,10 @@ sub update_user_data {
(!$forceid)) {
if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) {
$env{'form.cid'} = $userenv{'id'};
- $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').' '.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').' '."\n";
+ $no_forceid_alert = &mt('New student/employee ID does not match existing ID for this user.')
+ .' '
+ .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.")
+ .' '."\n";
}
}
if ($env{'form.cid'} ne $userenv{'id'}) {
@@ -1783,12 +2364,64 @@ sub update_user_data {
}
}
}
- my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota,
- $inststatus,$oldisdefault,$newisdefault,$olddefquotatext,
- $newdefquotatext);
+ my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus,
+ $inststatus,$newinststatus,$oldisdefault,$newisdefault,$olddefquotatext,
+ $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext,
+ $oldinststatuses,$newinststatuses);
my ($defquota,$settingstatus) =
&Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus);
- my %changeHash;
+ my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom);
+ if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
+ $showquota = 1;
+ }
+ if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
+ $showtools = 1;
+ }
+ if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
+ $showrequestcourses = 1;
+ } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
+ $showreqotherdom = 1;
+ }
+ if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
+ $showinststatus = 1;
+ }
+ my (%changeHash,%changed);
+ $oldinststatus = $userenv{'inststatus'};
+ if ($oldinststatus eq '') {
+ $oldinststatuses = $othertitle;
+ } else {
+ if (ref($usertypes) eq 'HASH') {
+ $oldinststatuses = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'})));
+ } else {
+ $oldinststatuses = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'})));
+ }
+ }
+ $changeHash{'inststatus'} = $userenv{'inststatus'};
+ my %canmodify_inststatus = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},['inststatus'],\@userroles);
+ if ($canmodify_inststatus{'inststatus'}) {
+ if (exists($env{'form.inststatus'})) {
+ my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus');
+ if (@inststatuses > 0) {
+ $newinststatus = join(':',map { &escape($_); } @inststatuses);
+ $changeHash{'inststatus'} = $newinststatus;
+ if ($newinststatus ne $oldinststatus) {
+ $changed{'inststatus'} = $newinststatus;
+ }
+ if (ref($usertypes) eq 'HASH') {
+ $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses));
+ } else {
+ $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses));
+ }
+ } else {
+ $newinststatus = '';
+ $changeHash{'inststatus'} = $newinststatus;
+ $newinststatuses = $othertitle;
+ if ($newinststatus ne $oldinststatus) {
+ $changed{'inststatus'} = $changeHash{'inststatus'};
+ }
+ }
+ }
+ }
$changeHash{'portfolioquota'} = $userenv{'portfolioquota'};
if ($userenv{'portfolioquota'} ne '') {
$oldportfolioquota = $userenv{'portfolioquota'};
@@ -1800,12 +2433,12 @@ sub update_user_data {
$newportfolioquota =~ s/[^\d\.]//g;
}
if ($newportfolioquota != $oldportfolioquota) {
- $quotachanged = "a_admin($newportfolioquota,\%changeHash);
+ $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash);
}
} else {
- $quotachanged = "a_admin('',\%changeHash);
+ $changed{'quota'} = "a_admin('',\%changeHash);
$newportfolioquota = $defquota;
- $newisdefault = 1;
+ $newisdefault = 1;
}
} else {
$oldisdefault = 1;
@@ -1817,7 +2450,7 @@ sub update_user_data {
$newportfolioquota = $env{'form.portfolioquota'};
$newportfolioquota =~ s/[^\d\.]//g;
}
- $quotachanged = "a_admin($newportfolioquota,\%changeHash);
+ $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash);
} else {
$newportfolioquota = $defquota;
$newisdefault = 1;
@@ -1829,6 +2462,15 @@ sub update_user_data {
if ($newisdefault) {
$newdefquotatext = &get_defaultquota_text($settingstatus);
}
+ &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv,
+ \%changeHash,\%changed,\%newaccess,\%newaccesstext);
+ if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
+ &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext,
+ \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
+ } else {
+ &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext,
+ \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext);
+ }
if ($env{'form.cfirstname'} ne $userenv{'firstname'} ||
$env{'form.cmiddlename'} ne $userenv{'middlename'} ||
$env{'form.clastname'} ne $userenv{'lastname'} ||
@@ -1837,18 +2479,52 @@ sub update_user_data {
$env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) {
$namechanged = 1;
}
- if ($namechanged || $quotachanged) {
+ if (($namechanged) || (keys(%changed) > 0)) {
$changeHash{'firstname'} = $env{'form.cfirstname'};
$changeHash{'middlename'} = $env{'form.cmiddlename'};
$changeHash{'lastname'} = $env{'form.clastname'};
$changeHash{'generation'} = $env{'form.cgeneration'};
$changeHash{'id'} = $env{'form.cid'};
$changeHash{'permanentemail'} = $env{'form.cpermanentemail'};
- my ($quotachgresult,$namechgresult);
- if ($quotachanged) {
- $quotachgresult =
+ my ($chgresult,$namechgresult);
+ if (keys(%changed) > 0) {
+ $chgresult =
&Apache::lonnet::put('environment',\%changeHash,
$env{'form.ccdomain'},$env{'form.ccuname'});
+ if ($chgresult eq 'ok') {
+ if (($env{'user.name'} eq $env{'form.ccuname'}) &&
+ ($env{'user.domain'} eq $env{'form.ccdomain'})) {
+ my %newenvhash;
+ foreach my $key (keys(%changed)) {
+ if (($key eq 'official') || ($key eq 'unofficial')
+ || ($key eq 'community')) {
+ $newenvhash{'environment.requestcourses.'.$key} =
+ $changeHash{'requestcourses.'.$key};
+ if ($changeHash{'requestcourses.'.$key} ne '') {
+ $newenvhash{'environment.canrequest.'.$key} =
+ $changeHash{'requestcourses.'.$key};
+ } else {
+ $newenvhash{'environment.canrequest.'.$key} =
+ &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
+ $key,'reload','requestcourses');
+ }
+ } elsif ($key ne 'quota') {
+ $newenvhash{'environment.tools.'.$key} =
+ $changeHash{'tools.'.$key};
+ if ($changeHash{'tools.'.$key} ne '') {
+ $newenvhash{'environment.availabletools.'.$key} =
+ $changeHash{'tools.'.$key};
+ } else {
+ $newenvhash{'environment.availabletools.'.$key} =
+ &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, $key,'reload','tools');
+ }
+ }
+ }
+ if (keys(%newenvhash)) {
+ &Apache::lonnet::appenv(\%newenvhash);
+ }
+ }
+ }
}
if ($namechanged) {
# Make the change
@@ -1858,21 +2534,35 @@ sub update_user_data {
$changeHash{'firstname'},$changeHash{'middlename'},
$changeHash{'lastname'},$changeHash{'generation'},
$changeHash{'id'},undef,$changeHash{'permanentemail'});
+ %userupdate = (
+ lastname => $env{'form.clastname'},
+ middlename => $env{'form.cmiddlename'},
+ firstname => $env{'form.cfirstname'},
+ generation => $env{'form.cgeneration'},
+ id => $env{'form.cid'},
+ );
}
if (($namechanged && $namechgresult eq 'ok') ||
- ($quotachanged && $quotachgresult eq 'ok')) {
+ ((keys(%changed) > 0) && $chgresult eq 'ok')) {
# Tell the user we changed the name
my %lt=&Apache::lonlocal::texthash(
- 'uic' => "User Information Changed",
- 'frst' => "first",
- 'mddl' => "middle",
- 'lst' => "last",
- 'gen' => "generation",
- 'id' => "ID/Student number",
- 'mail' => "permanent e-mail",
- 'disk' => "disk space allocated to portfolio files",
- 'prvs' => "Previous",
- 'chto' => "Changed To"
+ 'uic' => 'User Information Changed',
+ 'frst' => 'First Name',
+ 'mddl' => 'Middle Name',
+ 'lst' => 'Last Name',
+ 'gen' => 'Generation',
+ 'id' => 'Student/Employee ID',
+ 'mail' => 'Permanent e-mail address',
+ 'disk' => 'Disk space allocated to portfolio files',
+ 'blog' => 'Blog Availability',
+ 'aboutme' => 'Personal Information Page Availability',
+ 'portfolio' => 'Portfolio Availability',
+ 'official' => 'Can Request Official Courses',
+ 'unofficial' => 'Can Request Unofficial Courses',
+ 'community' => 'Can Request Communities',
+ 'inststatus' => "Affiliation",
+ 'prvs' => 'Previous Value:',
+ 'chto' => 'Changed To:'
);
$r->print(''.$lt{'uic'}.' '.
&Apache::loncommon::start_data_table().
@@ -1885,8 +2575,32 @@ sub update_user_data {
$lt{'gen'}
$lt{'id'}
$lt{'mail'}
- $lt{'disk'}
END
+ if ($showinststatus) {
+ $r->print("
+ $lt{'inststatus'} \n");
+ }
+ if ($showrequestcourses) {
+ foreach my $item (@requestcourses) {
+ $r->print("
+ $lt{$item} \n");
+ }
+ } elsif ($showreqotherdom) {
+ foreach my $item (@requestcourses) {
+ $r->print("
+ $lt{$item} \n");
+ }
+ }
+ if ($showquota) {
+ $r->print("
+ $lt{'disk'} \n");
+ }
+ if ($showtools) {
+ foreach my $item (@usertools) {
+ $r->print("
+ $lt{$item} \n");
+ }
+ }
$r->print(&Apache::loncommon::end_data_table_header_row().
&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
@@ -1897,20 +2611,68 @@ END
$userenv{'generation'}
$userenv{'id'}
$userenv{'permanentemail'}
- $oldportfolioquota Mb $olddefquotatext
END
+ if ($showinststatus) {
+ $r->print("
+ $oldinststatuses \n");
+ }
+ if ($showrequestcourses) {
+ foreach my $item (@requestcourses) {
+ $r->print("
+ $oldaccess{$item} $oldaccesstext{$item} \n");
+ }
+ } elsif ($showreqotherdom) {
+ foreach my $item (@requestcourses) {
+ $r->print("
+ $oldaccess{$item} $oldaccesstext{$item} \n");
+ }
+ }
+ if ($showquota) {
+ $r->print("
+ $oldportfolioquota Mb $olddefquotatext \n");
+ }
+ if ($showtools) {
+ foreach my $item (@usertools) {
+ $r->print("
+ $oldaccess{$item} $oldaccesstext{$item} \n");
+ }
+ }
$r->print(&Apache::loncommon::end_data_table_row().
&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
- $lt{'chto'}
+ $lt{'chto'}
$env{'form.cfirstname'}
$env{'form.cmiddlename'}
$env{'form.clastname'}
$env{'form.cgeneration'}
$env{'form.cid'}
$env{'form.cpermanentemail'}
- $newportfolioquota Mb $newdefquotatext
END
+ if ($showinststatus) {
+ $r->print("
+ $newinststatuses \n");
+ }
+ if ($showrequestcourses) {
+ foreach my $item (@requestcourses) {
+ $r->print("
+ $newaccess{$item} $newaccesstext{$item} \n");
+ }
+ } elsif ($showreqotherdom) {
+ foreach my $item (@requestcourses) {
+ $r->print("
+ $newaccess{$item} $newaccesstext{$item} \n");
+ }
+ }
+ if ($showquota) {
+ $r->print("
+ $newportfolioquota Mb $newdefquotatext \n");
+ }
+ if ($showtools) {
+ foreach my $item (@usertools) {
+ $r->print("
+ $newaccess{$item} $newaccesstext{$item} \n");
+ }
+ }
$r->print(&Apache::loncommon::end_data_table_row().
&Apache::loncommon::end_data_table().' ');
if ($env{'form.cid'} ne $userenv{'id'}) {
@@ -1918,13 +2680,6 @@ END
($env{'form.ccuname'} => $env{'form.cid'}));
if (($recurseid) &&
(&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) {
- my %userupdate = (
- lastname => $env{'form.clasaname'},
- middlename => $env{'form.cmiddlename'},
- firstname => $env{'form.cfirstname'},
- generation => $env{'fora.cgeneration'},
- id => $env{'form.cid'},
- );
my $idresult =
&Apache::lonuserutils::propagate_id_change(
$env{'form.ccuname'},$env{'form.ccdomain'},
@@ -1938,7 +2693,7 @@ END
foreach my $key (keys(%changeHash)) {
$newenvhash{'environment.'.$key} = $changeHash{$key};
}
- &Apache::lonnet::appenv(%newenvhash);
+ &Apache::lonnet::appenv(\%newenvhash);
}
} else { # error occurred
$r->print(''.&mt('Unable to successfully change environment for').' '.
@@ -1946,12 +2701,20 @@ END
$env{'form.ccdomain'}.' ');
}
} else { # End of if ($env ... ) logic
- # They did not want to change the users name or quota but we can
- # still tell them what the name and quota are
+ # They did not want to change the users name, quota, tool availability,
+ # or ability to request creation of courses,
+ # but we can still tell them what the name and quota and availabilities are
my %lt=&Apache::lonlocal::texthash(
- 'id' => "ID/Student number",
- 'mail' => "Permanent e-mail",
- 'disk' => "Disk space allocated to user's portfolio files",
+ 'id' => "Student/Employee ID",
+ 'mail' => "Permanent e-mail address",
+ 'disk' => "Disk space allocated to user's portfolio files",
+ 'blog' => "Blog Availability",
+ 'aboutme' => "Personal Information Page Availability",
+ 'portfolio' => "Portfolio Availability",
+ 'official' => "Can Request Official Courses",
+ 'unofficial' => "Can Request Unofficial Courses",
+ 'community' => "Can Request Communities",
+ 'inststatus' => "Affiliation",
);
$r->print(<<"END");
$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'}
@@ -1960,8 +2723,31 @@ END
$r->print(' ['.$lt{'mail'}.': '.
$userenv{'permanentemail'}.']');
}
- $r->print(' ['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.
- $olddefquotatext.'] ');
+ if ($showinststatus) {
+ $r->print(' ['.$lt{'inststatus'}.': '.$oldinststatuses.']');
+ }
+ if ($showrequestcourses) {
+ foreach my $item (@requestcourses) {
+ $r->print(' ['.$lt{$item}.': '.$newaccess{$item}.' '.
+ $newaccesstext{$item}.']'."\n");
+ }
+ } elsif ($showreqotherdom) {
+ foreach my $item (@requestcourses) {
+ $r->print(' ['.$lt{$item}.': '.$newaccess{$item}.' '.
+ $newaccesstext{$item}.']'."\n");
+ }
+ }
+ if ($showtools) {
+ foreach my $item (@usertools) {
+ $r->print(' ['.$lt{$item}.': '.$newaccess{$item}.' '.
+ $newaccesstext{$item}.']'."\n");
+ }
+ }
+ if ($showquota) {
+ $r->print(' ['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '.
+ $olddefquotatext.']');
+ }
+ $r->print('');
}
if (@mod_disallowed) {
my ($rolestr,$contextname);
@@ -1986,15 +2772,228 @@ END
} else {
$r->print(&mt("You do not have the authority to change these fields given the user's current set of active/future [_1] roles:",$contextname));
}
- $r->print(''.$rolestr.' '.
- &mt('Contact your helpdesk for more information.',"javascript:helpMenu('display')").' ');
+ my $helplink = 'javascript:helpMenu('."'display'".')';
+ $r->print(''.$rolestr.' '
+ .&mt('Please contact your [_1]helpdesk[_2] for more information.'
+ ,'',' ')
+ .' ');
+ }
+ $r->print(''
+ .$no_forceid_alert
+ .&Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules)
+ .' ');
+ }
+ if ($env{'form.action'} eq 'singlestudent') {
+ &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context);
+ $r->print(''.
+ &mt('Enroll Another Student').'
');
+ } else {
+ my @rolechanges = &update_roles($r,$context);
+ if ($namechanged) {
+ if ($context eq 'course') {
+ if (@userroles > 0) {
+ if ((@rolechanges == 0) ||
+ (!(grep(/^st$/,@rolechanges)))) {
+ if (grep(/^st$/,@userroles)) {
+ my $classlistupdated =
+ &Apache::lonuserutils::update_classlist($cdom,
+ $cnum,$env{'form.ccdomain'},
+ $env{'form.ccuname'},\%userupdate);
+ }
+ }
+ }
+ }
+ }
+ my $userinfo = &Apache::loncommon::plainname($env{'form.ccuname'},
+ $env{'form.ccdomain'});
+ if ($env{'form.popup'}) {
+ $r->print(''.&mt('Close window').'
');
+ } else {
+ $r->print(''
+ .&mt('Modify this user: [_1]',''.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.') ').' '
+ .(' 'x5).''
+ .&mt('Create/Modify Another User').'
');
}
- $r->print($no_forceid_alert.
- &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules));
}
- ##
+ $r->print(&Apache::loncommon::end_page());
+}
+
+sub tool_changes {
+ my ($context,$usertools,$oldaccess,$oldaccesstext,$userenv,$changeHash,
+ $changed,$newaccess,$newaccesstext) = @_;
+ if (!((ref($usertools) eq 'ARRAY') && (ref($oldaccess) eq 'HASH') &&
+ (ref($oldaccesstext) eq 'HASH') && (ref($userenv) eq 'HASH') &&
+ (ref($changeHash) eq 'HASH') && (ref($changed) eq 'HASH') &&
+ (ref($newaccess) eq 'HASH') && (ref($newaccesstext) eq 'HASH'))) {
+ return;
+ }
+ if ($context eq 'reqcrsotherdom') {
+ my @options = ('approval','validate','autolimit');
+ my $optregex = join('|',@options);
+ my %reqdisplay = &courserequest_display();
+ my $cdom = $env{'request.role.domain'};
+ foreach my $tool (@{$usertools}) {
+ $oldaccesstext->{$tool} = &mt('No');
+ $newaccesstext->{$tool} = $oldaccesstext->{$tool};
+ $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
+ my $newop;
+ if ($env{'form.'.$context.'_'.$tool}) {
+ $newop = $env{'form.'.$context.'_'.$tool};
+ if ($newop eq 'autolimit') {
+ my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};
+ $limit =~ s/\D+//g;
+ $newop .= '='.$limit;
+ }
+ }
+ if ($userenv->{$context.'.'.$tool} eq '') {
+ if ($newop) {
+ $changed->{$tool}=&tool_admin($tool,$cdom.':'.$newop,
+ $changeHash,$context);
+ if ($changed->{$tool}) {
+ $newaccesstext->{$tool} = &mt('Yes');
+ } else {
+ $newaccesstext->{$tool} = $oldaccesstext->{$tool};
+ }
+ }
+ } else {
+ my @curr = split(',',$userenv->{$context.'.'.$tool});
+ my @new;
+ my $changedoms;
+ foreach my $req (@curr) {
+ if ($req =~ /^\Q$cdom\E\:($optregex\=?\d*)$/) {
+ $oldaccesstext->{$tool} = &mt('Yes');
+ my $oldop = $1;
+ if ($oldop ne $newop) {
+ $changedoms = 1;
+ foreach my $item (@curr) {
+ my ($reqdom,$option) = split(':',$item);
+ unless ($reqdom eq $cdom) {
+ push(@new,$item);
+ }
+ }
+ if ($newop) {
+ push(@new,$cdom.':'.$newop);
+ }
+ @new = sort(@new);
+ }
+ last;
+ }
+ }
+ if ((!$changedoms) && ($newop)) {
+ $changedoms = 1;
+ @new = sort(@curr,$cdom.':'.$newop);
+ }
+ if ($changedoms) {
+ my $newdomstr;
+ if (@new) {
+ $newdomstr = join(',',@new);
+ }
+ $changed->{$tool}=&tool_admin($tool,$newdomstr,$changeHash,
+ $context);
+ if ($changed->{$tool}) {
+ if ($env{'form.'.$context.'_'.$tool}) {
+ if ($env{'form.'.$context.'_'.$tool} eq 'autolimit') {
+ my $limit = $env{'form.'.$context.'_'.$tool.'_limit'};
+ $limit =~ s/\D+//g;
+ if ($limit) {
+ $newaccesstext->{$tool} = &mt('Yes, up to limit of [quant,_1,request] per user.',$limit);
+ } else {
+ $newaccesstext->{$tool} = &mt('Yes, processed automatically');
+ }
+ } else {
+ $newaccesstext->{$tool} = $reqdisplay{$env{'form.'.$context.'_'.$tool}};
+ }
+ } else {
+ $newaccesstext->{$tool} = &mt('No');
+ }
+ }
+ }
+ }
+ }
+ return;
+ }
+ foreach my $tool (@{$usertools}) {
+ my $newval;
+ if ($context eq 'requestcourses') {
+ $newval = $env{'form.crsreq_'.$tool};
+ if ($newval eq 'autolimit') {
+ $newval .= '='.$env{'form.crsreq_'.$tool.'_limit'};
+ }
+ } else {
+ $newval = $env{'form.'.$context.'_'.$tool};
+ }
+ if ($userenv->{$context.'.'.$tool} ne '') {
+ $oldaccess->{$tool} = &mt('custom');
+ if ($userenv->{$context.'.'.$tool}) {
+ $oldaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $oldaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool};
+ if ($env{'form.custom'.$tool} == 1) {
+ if ($newval ne $userenv->{$context.'.'.$tool}) {
+ $changed->{$tool} = &tool_admin($tool,$newval,$changeHash,
+ $context);
+ if ($changed->{$tool}) {
+ $newaccess->{$tool} = &mt('custom');
+ if ($newval) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ } else {
+ $newaccess->{$tool} = $oldaccess->{$tool};
+ if ($userenv->{$context.'.'.$tool}) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
+ } else {
+ $newaccess->{$tool} = $oldaccess->{$tool};
+ $newaccesstext->{$tool} = $oldaccesstext->{$tool};
+ }
+ } else {
+ $changed->{$tool} = &tool_admin($tool,'',$changeHash,$context);
+ if ($changed->{$tool}) {
+ $newaccess->{$tool} = &mt('default');
+ } else {
+ $newaccess->{$tool} = $oldaccess->{$tool};
+ if ($userenv->{$context.'.'.$tool}) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
+ }
+ } else {
+ $oldaccess->{$tool} = &mt('default');
+ if ($env{'form.custom'.$tool} == 1) {
+ $changed->{$tool} = &tool_admin($tool,$newval,$changeHash,
+ $context);
+ if ($changed->{$tool}) {
+ $newaccess->{$tool} = &mt('custom');
+ if ($newval) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ } else {
+ $newaccess->{$tool} = $oldaccess->{$tool};
+ }
+ } else {
+ $newaccess->{$tool} = $oldaccess->{$tool};
+ }
+ }
+ }
+ return;
+}
+
+sub update_roles {
+ my ($r,$context) = @_;
my $now=time;
- my $rolechanges = 0;
+ my @rolechanges;
+ my %disallowed;
$r->print(''.&mt('Modifying Roles').' ');
foreach my $key (keys (%env)) {
next if (! $env{$key});
@@ -2007,7 +3006,7 @@ END
my $result =
&Apache::lonnet::revokerole($env{'form.ccdomain'},
$env{'form.ccuname'},
- $scope,$role);
+ $scope,$role,'','',$context);
$r->print(&mt('Revoking [_1] in [_2]: [_3]',
$role,$scope,''.$result.' ').' ');
if ($role eq 'st') {
@@ -2017,16 +3016,21 @@ END
$now);
$r->print($result);
}
+ if (!grep(/^\Q$role\E$/,@rolechanges)) {
+ push(@rolechanges,$role);
+ }
}
if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) {
# Revoke custom role
$r->print(&mt('Revoking custom role:').
' '.$4.' by '.$3.':'.$2.' in '.$1.': '.
&Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
- $env{'form.ccuname'},$1,$2,$3,$4).
+ $env{'form.ccuname'},$1,$2,$3,$4,'','',$context).
' ');
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
}
- $rolechanges ++;
} elsif ($key=~/^form\.del/) {
if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) {
# Delete standard role
@@ -2034,7 +3038,8 @@ END
my $result =
&Apache::lonnet::assignrole($env{'form.ccdomain'},
$env{'form.ccuname'},
- $scope,$role,$now,0,1);
+ $scope,$role,$now,0,1,'',
+ $context);
$r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope,
''.$result.' ').' ');
if ($role eq 'st') {
@@ -2044,17 +3049,22 @@ END
$now);
$r->print($result);
}
+ if (!grep(/^\Q$role\E$/,@rolechanges)) {
+ push(@rolechanges,$role);
+ }
}
if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
# Delete custom role
- $r->print(&mt('Deleting custom role [_1] by [_2]:[_3] in [_4]',
- $rolename,$rnam,$rdom,$url).': '.
+ $r->print(&mt('Deleting custom role [_1] by [_2] in [_3]',
+ $rolename,$rnam.':'.$rdom,$url).': '.
&Apache::lonnet::assigncustomrole($env{'form.ccdomain'},
$env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now,
- 0,1).' ');
+ 0,1,$context).' ');
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
}
- $rolechanges ++;
} elsif ($key=~/^form\.ren/) {
my $udom = $env{'form.ccdomain'};
my $uname = $env{'form.ccuname'};
@@ -2067,8 +3077,12 @@ END
if ($role eq 'st') {
if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) {
my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3);
- if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) {
- $output = "Error: $result\n";
+ if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) {
+ if ($result eq 'refused' && $logmsg) {
+ $output = $logmsg;
+ } else {
+ $output = "Error: $result\n";
+ }
} else {
$output = &mt('Assigning').' '.$role.' in '.$url.
&mt('starting').' '.localtime($now).
@@ -2078,22 +3092,28 @@ END
}
} else {
my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
- $env{'form.ccuname'},$url,$role,0,$now);
- $output = &mt('Re-enabling [_1] in [_2]: [_3] ',
- $role,$url,$result).' ';
+ $env{'form.ccuname'},$url,$role,0,$now,'','',
+ $context);
+ $output = &mt('Re-enabling [_1] in [_2]: [_3]',
+ $role,$url,''.$result.' ').' ';
}
$r->print($output);
+ if (!grep(/^\Q$role\E$/,@rolechanges)) {
+ push(@rolechanges,$role);
+ }
}
# Re-enable custom role
if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) {
my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4);
my $result = &Apache::lonnet::assigncustomrole(
$env{'form.ccdomain'}, $env{'form.ccuname'},
- $url,$rdom,$rnam,$rolename,0,$now);
- $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : [_5] ',
- $rolename,$rnam,$rdom,$url,$result).' ');
+ $url,$rdom,$rnam,$rolename,0,$now,undef,$context);
+ $r->print(&mt('Re-enabling custom role [_1] by [_2] in [_3]: [_4]',
+ $rolename,$rnam.':'.$rdom,$url,''.$result.' ').' ');
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
}
- $rolechanges ++;
} elsif ($key=~/^form\.act/) {
my $udom = $env{'form.ccdomain'};
my $uname = $env{'form.ccuname'};
@@ -2114,7 +3134,7 @@ END
my %sections = ();
my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);
if ($num_sections == 0) {
- $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));
+ $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end,$context));
} else {
my %curr_groups =
&Apache::longroup::coursegroups($one,$two);
@@ -2125,9 +3145,12 @@ END
next;
}
my $securl = $url.'/'.$sec;
- $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
+ $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end,$context));
}
}
+ if (!grep(/^cr$/,@rolechanges)) {
+ push(@rolechanges,'cr');
+ }
} elsif ($key=~/^form\.act\_($match_domain)\_($match_name)\_([^\_]+)$/) {
# Activate roles for sections with 3 id numbers
# set start, end times, and the url for the class
@@ -2144,7 +3167,7 @@ END
my %sections = ();
my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);
if ($num_sections == 0) {
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context));
} else {
my %curr_groups =
&Apache::longroup::coursegroups($one,$two);
@@ -2158,15 +3181,18 @@ END
next;
}
my $securl = $url.'/'.$sec;
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec,$context));
} else {
$emptysec = 1;
}
}
if ($emptysec) {
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context));
}
- }
+ }
+ if (!grep(/^\Q$three\E$/,@rolechanges)) {
+ push(@rolechanges,$three);
+ }
} elsif ($key=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
# Activate roles for sections with two id numbers
# set start, end times, and the url for the class
@@ -2176,46 +3202,99 @@ END
my $end = ( $env{'form.end_'.$1.'_'.$2} ?
$env{'form.end_'.$1.'_'.$2} :
0 );
- my $url='/'.$1.'/';
+ my $one = $1;
+ my $two = $2;
+ my $url='/'.$one.'/';
# split multiple sections
my %sections = ();
- my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);
+ my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two},\%sections,$two);
if ($num_sections == 0) {
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context));
} else {
my $emptysec = 0;
foreach my $sec (sort {$a cmp $b} keys %sections) {
if ($sec ne '') {
my $securl = $url.'/'.$sec;
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec,$context));
} else {
$emptysec = 1;
}
}
if ($emptysec) {
- $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
+ $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context));
}
}
+ if (!grep(/^\Q$two\E$/,@rolechanges)) {
+ push(@rolechanges,$two);
+ }
} else {
$r->print(''.&mt('ERROR').': '.&mt('Unknown command').' '.$key.'
');
}
foreach my $key (sort(keys(%disallowed))) {
+ $r->print('');
if (($key eq 'none') || ($key eq 'all')) {
- $r->print('
'.&mt('[_1] may not be used as the name for a section, as it is a reserved word.',$key));
+ $r->print(&mt('[_1] may not be used as the name for a section, as it is a reserved word.',''.$key.' '));
} else {
- $r->print('
'.&mt('[_1] may not be used as the name for a section, as it is the name of a course group.',$key));
+ $r->print(&mt('[_1] may not be used as the name for a section, as it is the name of a course group.',''.$key.' '));
}
- $r->print(' '.&mt('Please go back and choose a different section name.').'
');
+ $r->print(''
+ .&mt('Please [_1]go back[_2] and choose a different section name.'
+ ,' ".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."
");
+ }
+ } else {
+ $r->print(&mt('unable to enroll').": ".$enroll_result);
+ }
+ return;
}
sub get_defaultquota_text {
@@ -2255,7 +3334,7 @@ sub update_result_form {
}
$outcome .= ' '."\n".
' '."\n".
- ' '."\n".
+ ' '."\n".
'';
return $outcome;
}
@@ -2265,12 +3344,39 @@ sub quota_admin {
my $quotachanged;
if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) {
# Current user has quota modification privileges
- $quotachanged = 1;
- $changeHash->{'portfolioquota'} = $setquota;
+ if (ref($changeHash) eq 'HASH') {
+ $quotachanged = 1;
+ $changeHash->{'portfolioquota'} = $setquota;
+ }
}
return $quotachanged;
}
+sub tool_admin {
+ my ($tool,$settool,$changeHash,$context) = @_;
+ my $canchange = 0;
+ if ($context eq 'requestcourses') {
+ if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) {
+ $canchange = 1;
+ }
+ } elsif ($context eq 'reqcrsotherdom') {
+ if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
+ $canchange = 1;
+ }
+ } elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
+ # Current user has quota modification privileges
+ $canchange = 1;
+ }
+ my $toolchanged;
+ if ($canchange) {
+ if (ref($changeHash) eq 'HASH') {
+ $toolchanged = 1;
+ $changeHash->{$context.'.'.$tool} = $settool;
+ }
+ }
+ return $toolchanged;
+}
+
sub build_roles {
my ($sectionstr,$sections,$role) = @_;
my $num_sections = 0;
@@ -2376,13 +3482,16 @@ sub custom_role_editor {
my ($jsback,$elements) = &crumb_utilities();
my $button_code = "\n";
my $head_script = "\n";
- $head_script .= ''."\n";
+ $head_script .= "\n".$jsback."\n"
+ .'// ]]>'."\n"
+ .''."\n";
$r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script));
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"javascript:backPage(document.form1,'pickrole','')",
@@ -2391,7 +3500,8 @@ sub custom_role_editor {
{href=>"javascript:backPage(document.form1,'','')",
text=>"Edit custom role",
faq=>282,bug=>'Instructor Interface',});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
+ 'Course_Editing_Custom_Roles'));
$r->print($body_top);
my %lt=&Apache::lonlocal::texthash(
@@ -2399,10 +3509,15 @@ sub custom_role_editor {
'crl' => "Course Level",
'dml' => "Domain Level",
'ssl' => "System Level");
- $r->print('Select a Template ');
- $r->print('');
+
+ $r->print(''
+ .''
+ .'
'
+ );
+
$r->print(<
@@ -2417,14 +3532,14 @@ ENDCCF
my $privtext = &Apache::lonnet::plaintext($priv);
$r->print(&Apache::loncommon::start_data_table_row().
''.$privtext.' '.
- ($courselevel{$priv}?' ':' ').
+ ($courselevel{$priv}?' ':' ').
' '.
- ($domainlevel{$priv}?' ':' ').
+ ($domainlevel{$priv}?' ':' ').
' '.
- ($systemlevel{$priv}?' ':' ').
+ ($systemlevel{$priv}?' ':' ').
' '.
&Apache::loncommon::end_data_table_row());
}
@@ -2433,7 +3548,7 @@ ENDCCF
' '."\n".' '."\n".
' '."\n".
- ' '.
+ ' '.
&Apache::loncommon::end_page());
}
# --------------------------------------------------------
@@ -2462,34 +3577,35 @@ sub make_script_template {
my ($priv_item, $dummy) = split(/\&/,$priv);
$role_c{$priv_item} = 1;
}
+ my %role_d;
+ @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});
+ foreach my $priv(@temp) {
+ my ($priv_item, $dummy) = split(/\&/,$priv);
+ $role_d{$priv_item} = 1;
+ }
+ my %role_s;
+ @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});
+ foreach my $priv(@temp) {
+ my ($priv_item, $dummy) = split(/\&/,$priv);
+ $role_s{$priv_item} = 1;
+ }
foreach my $priv_item (keys(%full_c)) {
my ($priv, $dummy) = split(/\&/,$priv_item);
- if (exists($role_c{$priv})) {
+ if ((exists($role_c{$priv})) || (exists($role_d{$priv})) ||
+ (exists($role_s{$priv}))) {
$return_script .= "document.form1.$priv"."_c.checked = true;\n";
} else {
$return_script .= "document.form1.$priv"."_c.checked = false;\n";
}
}
- my %role_d;
- @temp = split(/:/,$Apache::lonnet::pr{$role.':d'});
- foreach my $priv(@temp) {
- my ($priv_item, $dummy) = split(/\&/,$priv);
- $role_d{$priv_item} = 1;
- }
foreach my $priv_item (keys(%full_d)) {
my ($priv, $dummy) = split(/\&/,$priv_item);
- if (exists($role_d{$priv})) {
+ if ((exists($role_d{$priv})) || (exists($role_s{$priv}))) {
$return_script .= "document.form1.$priv"."_d.checked = true;\n";
} else {
$return_script .= "document.form1.$priv"."_d.checked = false;\n";
}
}
- my %role_s;
- @temp = split(/:/,$Apache::lonnet::pr{$role.':s'});
- foreach my $priv(@temp) {
- my ($priv_item, $dummy) = split(/\&/,$priv);
- $role_s{$priv_item} = 1;
- }
foreach my $priv_item (keys(%full_s)) {
my ($priv, $dummy) = split(/\&/,$priv_item);
if (exists($role_s{$priv})) {
@@ -2505,12 +3621,12 @@ sub make_script_template {
sub make_button_code {
my ($role) = @_;
my $label = &Apache::lonnet::plaintext($role);
- my $button_code = ' ';
+ my $button_code = ' ';
return ($button_code);
}
# ---------------------------------------------------------- Call to definerole
sub set_custom_role {
- my ($r) = @_;
+ my ($r,$context) = @_;
my $rolename=$env{'form.rolename'};
$rolename=~s/[^A-Za-z0-9]//gs;
if (!$rolename) {
@@ -2518,7 +3634,11 @@ sub set_custom_role {
return;
}
my ($jsback,$elements) = &crumb_utilities();
- my $jscript = '';
+ my $jscript = ''."\n";
$r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript);
&Apache::lonhtmlcommon::add_breadcrumb
@@ -2531,7 +3651,8 @@ sub set_custom_role {
{href=>"javascript:backPage(document.customresult,'set_custom_roles','')",
text=>"Result",
faq=>282,bug=>'Instructor Interface',});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management',
+ 'Course_Editing_Custom_Roles'));
my ($rdummy,$roledef)=
&Apache::lonnet::get('roles',["rolesdef_$rolename"]);
@@ -2584,7 +3705,7 @@ sub set_custom_role {
$url,
$env{'user.domain'},
$env{'user.name'},
- $rolename));
+ $rolename,undef,undef,undef,$context));
}
$r->print(''.&mt('Create or edit another custom role').'
');
@@ -2608,13 +3729,17 @@ sub handler {
$context = 'domain';
}
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['action','state','callingform','roletype','showrole','bulkaction']);
+ ['action','state','callingform','roletype','showrole','bulkaction','popup','phase',
+ 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']);
&Apache::lonhtmlcommon::clear_breadcrumbs();
if ($env{'form.action'} ne 'dateselect') {
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/createuser",
- text=>"User Management"});
+ text=>"User Management",
+ help=>'Course_Create_Class_List,Course_Change_Privileges,Course_View_Class_List,Course_Editing_Custom_Roles,Course_Add_Student,Course_Drop_Student,Course_Automated_Enrollment,Course_Self_Enrollment,Course_Manage_Group'});
}
+ #SD Following files not added to help, because the corresponding .tex-files seem to
+ #be missing: Course_Approve_Selfenroll,Course_User_Logs,
my ($permission,$allowed) =
&Apache::lonuserutils::get_permission($context);
if (!$allowed) {
@@ -2639,38 +3764,25 @@ sub handler {
({href=>'/adm/createuser?action=upload&state=',
text=>"Upload Users List"});
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List',
- 'User_Management_Upload'));
+ 'Course_Create_Class_List'));
$r->print(''.&Apache::loncommon::end_page());
- } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
- $r->print(&header());
- &Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/createuser?action=expire',
- text=>"Expire User Roles"});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles',
- 'User_Management_Drops'));
- if (! exists($env{'form.state'})) {
- &Apache::lonuserutils::print_expire_menu($r,$context);
- } elsif ($env{'form.state'} eq 'done') {
- &Apache::lonuserutils::expire_user_list($r,$context);
- } else {
- &Apache::lonuserutils::print_expire_menu($r,$context);
- }
- $r->print(&Apache::loncommon::end_page());
- } elsif ($env{'form.action'} eq 'singleuser' && $permission->{'cusr'}) {
+ } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'}
+ eq 'singlestudent')) && ($permission->{'cusr'})) {
my $phase = $env{'form.phase'};
my @search = ('srchterm','srchby','srchin','srchtype','srchdomain');
&Apache::loncreateuser::restore_prev_selections();
@@ -2678,29 +3790,30 @@ sub handler {
foreach my $item (@search) {
$srch->{$item} = $env{'form.'.$item};
}
-
if (($phase eq 'get_user_info') || ($phase eq 'userpicked') ||
($phase eq 'createnewuser')) {
if ($env{'form.phase'} eq 'createnewuser') {
my $response;
if ($env{'form.srchterm'} !~ /^$match_username$/) {
my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
+ $env{'form.phase'} = '';
&print_username_entry_form($r,$context,$response,$srch);
} else {
my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'});
my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'});
&print_user_modification_page($r,$ccuname,$ccdomain,
- $srch,$response,$context);
+ $srch,$response,$context,
+ $permission);
}
} elsif ($env{'form.phase'} eq 'get_user_info') {
my ($currstate,$response,$forcenewuser,$results) =
- &user_search_result($srch);
+ &user_search_result($context,$srch);
if ($env{'form.currstate'} eq 'modify') {
$currstate = $env{'form.currstate'};
}
if ($currstate eq 'select') {
&print_user_selection_page($r,$response,$srch,$results,
- 'createuser',\@search,$context);
+ \@search,$context);
} elsif ($currstate eq 'modify') {
my ($ccuname,$ccdomain);
if (($srch->{'srchby'} eq 'uname') &&
@@ -2717,10 +3830,12 @@ sub handler {
$response = '';
}
&print_user_modification_page($r,$ccuname,$ccdomain,
- $srch,$response,$context);
+ $srch,$response,$context,
+ $permission);
} elsif ($currstate eq 'query') {
&print_user_query_page($r,'createuser');
} else {
+ $env{'form.phase'} = '';
&print_username_entry_form($r,$context,$response,$srch,
$forcenewuser);
}
@@ -2728,7 +3843,7 @@ sub handler {
my $ccuname = &LONCAPA::clean_username($env{'form.seluname'});
my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'});
&print_user_modification_page($r,$ccuname,$ccdomain,$srch,'',
- $context);
+ $context,$permission);
}
} elsif ($env{'form.phase'} eq 'update_user_data') {
&update_user_data($r,$context);
@@ -2737,7 +3852,7 @@ sub handler {
}
} elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) {
if ($env{'form.phase'} eq 'set_custom_roles') {
- &set_custom_role($r);
+ &set_custom_role($r,$context);
} else {
&custom_role_editor($r);
}
@@ -2745,15 +3860,22 @@ sub handler {
($permission->{'view'} || $permission->{'cusr'})) {
if ($env{'form.phase'} eq 'bulkchange') {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'backPage(document.studentform)',
- text=>"List Users"});
+ ({href=>'/adm/createuser?action=listusers',
+ text=>"List Users"},
+ {href=>"/adm/createuser",
+ text=>"Result"});
my $setting = $env{'form.roletype'};
my $choice = $env{'form.bulkaction'};
$r->print(&header());
- $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
- 'User_Management_List'));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users",
+ 'Course_View_Class_List'));
if ($permission->{'cusr'}) {
&Apache::lonuserutils::update_user_list($r,$context,$setting,$choice);
+ $r->print(&Apache::loncommon::end_page());
+ } else {
+ $r->print(&mt('You are not authorized to make bulk changes to user roles'));
+ $r->print(''.&mt('Display User Lists').' ');
+ $r->print(&Apache::loncommon::end_page());
}
} else {
&Apache::lonhtmlcommon::add_breadcrumb
@@ -2778,36 +3900,97 @@ sub handler {
$r->print(&header(&add_script(&verify_user_display())));
}
$r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users",
- 'User_Management_List'));
+ 'Course_View_Class_List'));
&Apache::lonuserutils::print_userlist($r,undef,$permission,$context,
$formname,$totcodes,$codetitles,$idlist,$idlist_titles);
$r->print(&Apache::loncommon::end_page());
}
- } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) {
+ } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) {
$r->print(&header());
&Apache::lonhtmlcommon::add_breadcrumb
({href=>'/adm/createuser?action=drop',
- text=>"Expire Users"});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles',
- 'User_Management_Drops'));
- if (! exists($env{'form.state'})) {
- &Apache::lonuserutils::print_expire_menu($r,$context);
+ text=>"Drop Students"});
+ if (!exists($env{'form.state'})) {
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
+ 'Course_Drop_Student'));
+
+ &Apache::lonuserutils::print_drop_menu($r,$context,$permission);
} elsif ($env{'form.state'} eq 'done') {
- &Apache::lonuserutiles::expire_user_list($r,$context);
- } else {
- &print_expire_menu($r,$context);
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=drop',
+ text=>"Result"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
+ 'Course_Drop_Student'));
+ &Apache::lonuserutils::update_user_list($r,$context,undef,
+ $env{'form.action'});
}
$r->print(&Apache::loncommon::end_page());
} elsif ($env{'form.action'} eq 'dateselect') {
if ($permission->{'cusr'}) {
$r->print(&header(undef,undef,{'no_nav_bar' => 1}).
- &Apache::lonuserutils::date_section_selector($context).
+ &Apache::lonuserutils::date_section_selector($context,
+ $permission).
&Apache::loncommon::end_page());
} else {
$r->print(&header().
''.&mt('You do not have permission to modify dates or sections for users').' '.
&Apache::loncommon::end_page());
}
+ } elsif ($env{'form.action'} eq 'selfenroll') {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=selfenroll',
+ text=>"Configure Self-enrollment"});
+ if (!exists($env{'form.state'})) {
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Configure Self-enrollment',
+ 'Course_Self_Enrollment'));
+ $r->print('
'.&mt('Self-enrollment with a student role').' '."\n");
+ &print_selfenroll_menu($r,$context,$permission);
+ } elsif ($env{'form.state'} eq 'done') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=selfenroll',
+ text=>"Result"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enrollment result',
+ 'Course_Self_Enrollment'));
+ $r->print(''.&mt('Self-enrollment with a student role').' '."\n");
+ &update_selfenroll_config($r,$context,$permission);
+ }
+ $r->print(&Apache::loncommon::end_page());
+ } elsif ($env{'form.action'} eq 'selfenrollqueue') {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=selfenrollqueue',
+ text=>"Enrollment requests"});
+ my $cid = $env{'request.course.id'};
+ my $cdom = $env{'course.'.$cid.'.domain'};
+ my $cnum = $env{'course.'.$cid.'.num'};
+ my $coursedesc = $env{'course.'.$cid.'.description'};
+ if (!exists($env{'form.state'})) {
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests',
+ 'Course_SelfEnrollment_Approval'));
+ $r->print(''.&mt('Pending enrollment requests').' '."\n");
+ $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context,
+ $cdom,$cnum));
+ } elsif ($env{'form.state'} eq 'done') {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=selfenrollqueue',
+ text=>"Result"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result',
+ 'Course_Self_Enrollment'));
+ $r->print(''.&mt('Enrollment request processing').' '."\n");
+ $r->print(&Apache::loncoursequeueadmin::update_request_queue($context,
+ $cdom,$cnum,$coursedesc));
+ }
+ $r->print(&Apache::loncommon::end_page());
+ } elsif ($env{'form.action'} eq 'changelogs') {
+ $r->print(&header());
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'/adm/createuser?action=changelogs',
+ text=>"User Management Logs"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Changes',
+ 'Course_User_Logs'));
+ &print_userchangelogs_display($r,$context,$permission);
+ $r->print(&Apache::loncommon::end_page());
} else {
$r->print(&header());
$r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management'));
@@ -2830,7 +4013,11 @@ sub header {
sub add_script {
my ($js) = @_;
- return '';
+ return ''."\n";
}
sub verify_user_display {
@@ -2853,85 +4040,167 @@ END
sub print_main_menu {
my ($permission,$context) = @_;
my %links = (
- domain => {
- upload => 'Upload a File of Users',
- singleuser => 'Add/Manage a Single User',
- listusers => 'Manage Multiple Users',
- },
- author => {
- upload => 'Upload a File of Co-authors',
- singleuser => 'Add/Manage a Single Co-author',
- listusers => 'Display Co-authors and Manage Multiple Users',
- },
- course => {
- upload => 'Upload a File of Course Users',
- singleuser => 'Add/Manage a Single Course User',
- listusers => 'Display Class Lists and Manage Multiple Users',
- },
- );
- my @menu =
- (
- { text => $links{$context}{'upload'},
- help => 'User_Management_Upload',
- action => 'upload',
- permission => $permission->{'cusr'},
+ domain => {
+ upload => 'Upload a File of Users',
+ singleuser => 'Add/Modify a User',
+ listusers => 'Manage Users',
+ },
+ author => {
+ upload => 'Upload a File of Co-authors',
+ singleuser => 'Add/Modify a Co-author',
+ listusers => 'Manage Co-authors',
+ },
+ course => {
+ upload => 'Upload a File of Course Users',
+ singleuser => 'Add/Modify a Course User',
+ listusers => 'Manage Course Users',
+ },
+ );
+ my @menu = ( {categorytitle => 'Single Users',
+ items =>
+ [
+ {
+ linktext => $links{$context}{'singleuser'},
+ icon => 'edit-redo.png',
+ #help => 'Course_Change_Privileges',
+ url => '/adm/createuser?action=singleuser',
+ permission => $permission->{'cusr'},
+ linktitle => 'Add a user with a certain role to this course.',
},
- { text => $links{$context}{'singleuser'},
- help => 'User_Management_Single_User',
- action => 'singleuser',
- permission => $permission->{'cusr'},
+ ]},
+
+ {categorytitle => 'Multiple Users',
+ items =>
+ [
+ {
+ linktext => $links{$context}{'upload'},
+ icon => 'sctr.png',
+ #help => 'Course_Create_Class_List',
+ url => '/adm/createuser?action=upload',
+ permission => $permission->{'cusr'},
+ linktitle => 'Upload a CSV or a text file containing users.',
+ },
+ {
+ linktext => $links{$context}{'listusers'},
+ icon => 'edit-find.png',
+ #help => 'Course_View_Class_List',
+ url => '/adm/createuser?action=listusers',
+ permission => ($permission->{'view'} || $permission->{'cusr'}),
+ linktitle => 'Show and manage users of this course.',
+ },
+
+ ]},
+
+ {categorytitle => 'Administration',
+ items => [ ]},
+ );
+
+ if ($context eq 'domain'){
+
+ push(@{ $menu[2]->{items} }, #Category: Administration
+ {
+ linktext => 'Custom Roles',
+ icon => 'emblem-photos.png',
+ #help => 'Course_Editing_Custom_Roles',
+ url => '/adm/createuser?action=custom',
+ permission => $permission->{'custom'},
+ linktitle => 'Configure a custom role.',
},
- { text => $links{$context}{'listusers'},
- help => 'User_Management_List',
- action => 'listusers',
- permission => ($permission->{'view'} || $permission->{'cusr'}),
- },
);
- if ($context eq 'domain' || $context eq 'course') {
- my $customlink = { text => 'Edit Custom Roles',
- help => 'Custom_Role_Edit',
- action => 'custom',
- permission => $permission->{'custom'},
- };
- push(@menu,$customlink);
- }
- if ($context eq 'course') {
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my @courselinks =
- (
- { text => 'Automated Enrollment Manager',
+
+ }elsif ($context eq 'course'){
+ my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity();
+
+ push(@{ $menu[0]->{items} }, #Category: Single Users
+ {
+ linktext => 'Add/Modify a Student',
+ #help => 'Course_Add_Student',
+ icon => 'list-add.png',
+ url => '/adm/createuser?action=singlestudent',
+ permission => $permission->{'cusr'},
+ linktitle => 'Add a user with the role student to this course.',
+ },
+ );
+
+ push(@{ $menu[1]->{items} }, #Category: Multiple Users
+ {
+ linktext => 'Drop Students',
+ icon => 'edit-undo.png',
+ #help => 'Course_Drop_Student',
+ url => '/adm/createuser?action=drop',
+ permission => $permission->{'cusr'},
+ linktitle =>'Remove a student from this course.',
+ },
+ );
+ push(@{ $menu[2]->{items} }, #Category: Administration
+ {
+ linktext => 'Custom Roles',
+ icon => 'emblem-photos.png',
+ #help => 'Course_Editing_Custom_Roles',
+ url => '/adm/createuser?action=custom',
+ permission => $permission->{'custom'},
+ linktitle => 'Configure a custom role.',
+ },
+ {
+ linktext => 'Course Groups',
+ icon => 'conf.png',
+ #help => 'Course_Manage_Group',
+ url => '/adm/coursegroups?refpage=cusr',
+ permission => $permission->{'grp_manage'},
+ linktitle => 'Manage course groups.',
+ },
+ {
+ linktext => 'Change Logs',
+ icon => 'document-properties.png',
+ #help => 'Course_User_Logs',
+ url => '/adm/createuser?action=changelogs',
+ permission => $permission->{'cusr'},
+ linktitle => 'View change log.',
+ },
+ );
+ if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) {
+ push(@{ $menu[2]->{items} },
+ {
+ linktext => 'Enrollment Requests',
+ icon => 'selfenrl-queue.png',
+ #help => 'Course_Approve_Selfenroll',
+ url => '/adm/createuser?action=selfenrollqueue',
+ permission => $permission->{'cusr'},
+ linktitle =>'Approve or reject enrollment requests.',
+ },
+ );
+ }
+
+ if (!exists($permission->{'cusr_section'})){
+
+ push(@{ $menu[2]->{items} },
+ {
+ linktext => 'Automated Enrollment',
+ icon => 'roles.png',
+ #help => 'Course_Automated_Enrollment',
permission => (&Apache::lonnet::auto_run($cnum,$cdom)
- && $permission->{'cusr'}),
+ && $permission->{'cusr'}),
url => '/adm/populate',
- },
- { text => 'Manage Course Groups',
- help => 'Course_Manage_Group',
- permission => $permission->{'grp_manage'},
- url => '/adm/coursegroups?refpage=cusr',
- },
+ linktitle => 'Automated enrollment manager.',
+ },
+ {
+ linktext => 'User Self-Enrollment',
+ icon => 'cstr.png',
+ #help => 'Course_Self_Enrollment',
+ url => '/adm/createuser?action=selfenroll',
+ permission => $permission->{'cusr'},
+ linktitle => 'Configure user self enrollment.',
+ },
);
- push(@menu,@courselinks);
- }
- my $menu_html = '';
- foreach my $menu_item (@menu) {
- next if (! $menu_item->{'permission'});
- $menu_html.='';
- $menu_html.='';
- if (exists($menu_item->{'url'})) {
- $menu_html.=qq{};
- } else {
- $menu_html.=
- qq{ };
- }
- $menu_html.= &mt($menu_item->{'text'}).' ';
- if (exists($menu_item->{'help'})) {
- $menu_html.=
- &Apache::loncommon::help_open_topic($menu_item->{'help'});
+
}
- $menu_html.='
';
- }
- return $menu_html;
+ };
+return Apache::lonhtmlcommon::generate_menu(@menu);
+# { text => 'View Log-in History',
+# help => 'Course_User_Logins',
+# action => 'logins',
+# permission => $permission->{'cusr'},
+# });
}
sub restore_prev_selections {
@@ -2945,9 +4214,978 @@ sub restore_prev_selections {
\%saveable_parameters);
}
+sub print_selfenroll_menu {
+ my ($r,$context,$permission) = @_;
+ my $formname = 'enrollstudent';
+ my $nolink = 1;
+ my ($row,$lt) = &get_selfenroll_titles();
+ my $groupslist = &Apache::lonuserutils::get_groupslist();
+ my $setsec_js =
+ &Apache::lonuserutils::setsections_javascript($formname,$groupslist);
+ my %alerts = &Apache::lonlocal::texthash(
+ acto => 'Activation of self-enrollment was selected for the following domain(s)',
+ butn => 'but no user types have been checked.',
+ wilf => "Please uncheck 'activate' or check at least one type.",
+ );
+ my $selfenroll_js = <<"ENDSCRIPT";
+function update_types(caller,num) {
+ var delidx = getIndexByName('selfenroll_delete');
+ var actidx = getIndexByName('selfenroll_activate');
+ if (caller == 'selfenroll_all') {
+ var selall;
+ for (var i=0; i 0) {
+ var msg = "$alerts{'acto'}\\n";
+ var loopend = needaction.length -1;
+ if (loopend > 0) {
+ for (var m=0; m'."\n".
+ '// '."\n".
+ ''."\n".
+ ''.$lt->{'selfenroll'}.' '."\n";
+ my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
+ if (ref($visactions) eq 'HASH') {
+ if ($visible) {
+ $output .= ''.$visactions->{'vis'}.'
';
+ } else {
+ $output .= ''.$visactions->{'miss'}.'
'
+ .$visactions->{'yous'}.
+ ''.$visactions->{'gen'}.' '.$visactions->{'coca'};
+ if (ref($vismsgs) eq 'ARRAY') {
+ $output .= ' '.$visactions->{'make'}.'
';
+ foreach my $item (@{$vismsgs}) {
+ $output .= ''.$visactions->{$item}.' ';
+ }
+ $output .= ' ';
+ }
+ $output .= '';
+ }
+ }
+ $output .= '';
+ $r->print($output);
+ return;
+}
+
+sub visible_in_cat {
+ my ($cdom,$cnum) = @_;
+ my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
+ my ($cathash,%settable,@vismsgs,$cansetvis);
+ my %visactions = &Apache::lonlocal::texthash(
+ vis => 'Your course currently appears in the Course Catalog for this domain.',
+ gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.',
+ miss => 'Your course does not currently appear in the Course Catalog for this domain.',
+ yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.',
+ coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.',
+ make => 'Make any changes to self-enrollment settings below, click "Save", then take action to include the course in the Catalog:',
+ take => 'Take the following action to ensure the course appears in the Catalog:',
+ dc_unhide => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.',
+ dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".',
+ dc_instcode => 'Ask a domain coordinator to assign an institutional code (if this is an official course).',
+ dc_catalog => 'Ask a domain coordinator to enable or create at least one course category in the domain.',
+ dc_categories => 'Ask a domain coordinator to create a hierarchy of categories and sub categories for courses in the domain.',
+ dc_chgcat => 'Ask a domain coordinator to change the category assigned to the course, as the one currently assigned is no longer used in the domain',
+ dc_addcat => 'Ask a domain coordinator to assign a category to the course.',
+ );
+ $visactions{'unhide'} = &mt('Use [_1]Set course environment[_2] to change the "Exclude from course catalog" setting.','"',' "');
+ $visactions{'chgcat'} = &mt('Use [_1]Set course environment[_2] to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','"',' "');
+ $visactions{'addcat'} = &mt('Use [_1]Set course environment[_2] to assign a category to the course.','"',' "');
+ if (ref($domconf{'coursecategories'}) eq 'HASH') {
+ if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
+ $settable{'togglecats'} = 1;
+ }
+ if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
+ $settable{'categorize'} = 1;
+ }
+ $cathash = $domconf{'coursecategories'}{'cats'};
+ }
+ if ($settable{'togglecats'} && $settable{'categorize'}) {
+ $cansetvis = &mt('You are able to both assign a course category and choose to exclude this course from the catalog.');
+ } elsif ($settable{'togglecats'}) {
+ $cansetvis = &mt('You are able to choose to exclude this course from the catalog, but only a Domain Coordinator may assign a course category.');
+ } elsif ($settable{'categorize'}) {
+ $cansetvis = &mt('You may assign a course category, but only a Domain Coordinator may choose to exclude this course from the catalog.');
+ } else {
+ $cansetvis = &mt('Only a Domain Coordinator may assign a course category or choose to exclude this course from the catalog.');
+ }
+
+ my %currsettings =
+ &Apache::lonnet::get('environment',['hidefromcat','categories','internal.coursecode'],
+ $cdom,$cnum);
+ my $visible = 0;
+ if ($currsettings{'internal.coursecode'} ne '') {
+ if (ref($domconf{'coursecategories'}) eq 'HASH') {
+ $cathash = $domconf{'coursecategories'}{'cats'};
+ if (ref($cathash) eq 'HASH') {
+ if ($cathash->{'instcode::0'} eq '') {
+ push(@vismsgs,'dc_addinst');
+ } else {
+ $visible = 1;
+ }
+ } else {
+ $visible = 1;
+ }
+ } else {
+ $visible = 1;
+ }
+ } else {
+ if (ref($cathash) eq 'HASH') {
+ if ($cathash->{'instcode::0'} ne '') {
+ push(@vismsgs,'dc_instcode');
+ }
+ } else {
+ push(@vismsgs,'dc_instcode');
+ }
+ }
+ if ($currsettings{'categories'} ne '') {
+ my $cathash;
+ if (ref($domconf{'coursecategories'}) eq 'HASH') {
+ $cathash = $domconf{'coursecategories'}{'cats'};
+ if (ref($cathash) eq 'HASH') {
+ if (keys(%{$cathash}) == 0) {
+ push(@vismsgs,'dc_catalog');
+ } elsif ((keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} ne '')) {
+ push(@vismsgs,'dc_categories');
+ } else {
+ my @currcategories = split('&',$currsettings{'categories'});
+ my $matched = 0;
+ foreach my $cat (@currcategories) {
+ if ($cathash->{$cat} ne '') {
+ $visible = 1;
+ $matched = 1;
+ last;
+ }
+ }
+ if (!$matched) {
+ if ($settable{'categorize'}) {
+ push(@vismsgs,'chgcat');
+ } else {
+ push(@vismsgs,'dc_chgcat');
+ }
+ }
+ }
+ }
+ }
+ } else {
+ if (ref($cathash) eq 'HASH') {
+ if ((keys(%{$cathash}) > 1) ||
+ (keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} eq '')) {
+ if ($settable{'categorize'}) {
+ push(@vismsgs,'addcat');
+ } else {
+ push(@vismsgs,'dc_addcat');
+ }
+ }
+ }
+ }
+ if ($currsettings{'hidefromcat'} eq 'yes') {
+ $visible = 0;
+ if ($settable{'togglecats'}) {
+ unshift(@vismsgs,'unhide');
+ } else {
+ unshift(@vismsgs,'dc_unhide')
+ }
+ }
+ return ($visible,$cansetvis,\@vismsgs,\%visactions);
+}
+
+sub new_selfenroll_dom_row {
+ my ($newdom,$num) = @_;
+ my $domdesc = &Apache::lonnet::domain($newdom);
+ my $output;
+ if ($domdesc ne '') {
+ $output .= &Apache::loncommon::start_data_table_row()
+ .''.&mt('Domain:').' '.$domdesc
+ .' ('.$newdom.') '
+ .' '
+ .&mt('Activate').' ';
+ my @currinsttypes;
+ $output .= ''.&mt('User types:').' '
+ .&selfenroll_inst_types($num,$newdom,\@currinsttypes).' '
+ .&Apache::loncommon::end_data_table_row();
+ }
+ return $output;
+}
+
+sub selfenroll_inst_types {
+ my ($num,$currdom,$currinsttypes) = @_;
+ my $output;
+ my $numinrow = 4;
+ my $count = 0;
+ my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($currdom);
+ my $othervalue = 'any';
+ if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
+ if (keys(%{$usertypes}) > 0) {
+ $othervalue = 'other';
+ }
+ $output .= '';
+ }
+ return $output;
+}
+
+sub selfenroll_date_forms {
+ my ($startform,$endform) = @_;
+ my $output .= &Apache::lonhtmlcommon::start_pick_box()."\n".
+ &Apache::lonhtmlcommon::row_title(&mt('Start date'),
+ 'LC_oddrow_value')."\n".
+ $startform."\n".
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::row_title(&mt('End date'),
+ 'LC_oddrow_value')."\n".
+ $endform."\n".
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::end_pick_box();
+ return $output;
+}
+
+sub print_userchangelogs_display {
+ my ($r,$context,$permission) = @_;
+ my $formname = 'roleslog';
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum);
+ if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); }
+
+ $r->print('';
+
+ # Only display table, if content is available (has been collected above)
+ if (!$content) {
+ $r->print(''
+ .&mt('There are no records to display.')
+ .'
'
+ );
+ $r->print($form_footer);
+ return;
+ }
+
+ # Content to display, so create navigation and display table
+
+ # Create Navigation:
+ # Navigation Script
+ my $nav_script = <<"ENDSCRIPT";
+
+ENDSCRIPT
+ # Navigation Buttons
+ my $nav_links;
+ $nav_links = '';
+ if (($curr{'page'} > 1) || ($more_records)) {
+ if ($curr{'page'} > 1) {
+ $nav_links .= ' ';
+ }
+ if ($more_records) {
+ $nav_links .= ' ';
+ }
+ }
+ $nav_links .= '
';
+
+ # Table Header
+ my $tableheader =
+ &Apache::loncommon::start_data_table_header_row()
+ .' '
+ .''.&mt('When').' '
+ .''.&mt('Who made the change').' '
+ .''.&mt('Changed User').' '
+ .''.&mt('Role').' '
+ .''.&mt('Section').' '
+ .''.&mt('Context').' '
+ .''.&mt('Start').' '
+ .''.&mt('End').' '
+ .&Apache::loncommon::end_data_table_header_row();
+
+ # Print Content
+ $r->print(
+ $nav_script
+ .$nav_links
+ .&Apache::loncommon::start_data_table()
+ .$tableheader
+ .$content
+ .&Apache::loncommon::end_data_table()
+ .$nav_links
+ .$form_footer
+ );
+ return;
+}
+
+sub role_display_filter {
+ my ($formname,$cdom,$cnum,$curr,$version) = @_;
+ my $context = 'course';
+ my $nolink = 1;
+ my $output = ''.
+ ''.&mt('Changes/page:').' '.
+ &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
+ (&mt('all'),5,10,20,50,100,1000,10000)).
+ ' ';
+ my $startform =
+ &Apache::lonhtmlcommon::date_setter($formname,'rolelog_start_date',
+ $curr->{'rolelog_start_date'},undef,
+ undef,undef,undef,undef,undef,undef,$nolink);
+ my $endform =
+ &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date',
+ $curr->{'rolelog_end_date'},undef,
+ undef,undef,undef,undef,undef,undef,$nolink);
+ my %lt = &rolechg_contexts();
+ $output .= ''.&mt('Window during which changes occurred:').' '.
+ ''.&mt('After:').
+ ' '.$startform.' '.
+ ''.&mt('Before:').' '.
+ ''.$endform.'
'.
+ ' '.
+ ' '.
+ ''.&mt('Role:').' '.
+ '{'role'} eq 'any') {
+ $output .= ' selected="selected"';
+ }
+ $output .= '>'.&mt('Any').' '."\n";
+ my @roles = &Apache::lonuserutils::course_roles($context,undef,1);
+ foreach my $role (@roles) {
+ my $plrole;
+ if ($role eq 'cr') {
+ $plrole = &mt('Custom Role');
+ } else {
+ $plrole=&Apache::lonnet::plaintext($role);
+ }
+ my $selstr = '';
+ if ($role eq $curr->{'role'}) {
+ $selstr = ' selected="selected"';
+ }
+ $output .= ' '.$plrole.' ';
+ }
+ $output .= ' '.
+ ' '.
+ ''.
+ &mt('Context:').' ';
+ foreach my $chgtype ('any','auto','updatenow','createcourse','course','domain','selfenroll') {
+ my $selstr = '';
+ if ($curr->{'chgcontext'} eq $chgtype) {
+ $selstr = ' selected="selected"';
+ }
+ if (($chgtype eq 'auto') || ($chgtype eq 'updatenow')) {
+ next if (!&Apache::lonnet::auto_run($cnum,$cdom));
+ }
+ $output .= ''.$lt{$chgtype}.' '."\n";
+ }
+ $output .= ' '
+ .'
';
+
+ # Update Display button
+ $output .= ''
+ .' '
+ .'
';
+
+ # Server version info
+ $output .= ''
+ .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
+ ,'2.6.99.0');
+ if ($version) {
+ $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
+ }
+ $output .= '
';
+ return $output;
+}
+
+sub rolechg_contexts {
+ my %lt = &Apache::lonlocal::texthash (
+ any => 'Any',
+ auto => 'Automated enrollment',
+ updatenow => 'Roster Update',
+ createcourse => 'Course Creation',
+ course => 'User Management in course',
+ domain => 'User Management in domain',
+ selfenroll => 'Self-enrolled',
+ requestcourses => 'Course Request',
+ );
+ return %lt;
+}
+
#-------------------------------------------------- functions for &phase_two
sub user_search_result {
- my ($srch) = @_;
+ my ($context,$srch) = @_;
my %allhomes;
my %inst_matches;
my %srch_results;
@@ -2977,7 +5215,13 @@ sub user_search_result {
if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') ||
($srch->{'srchin'} eq 'alc')) {
if ($srch->{'srchby'} eq 'uname') {
- if ($srch->{'srchterm'} !~ /^$match_username$/) {
+ my $unamecheck = $srch->{'srchterm'};
+ if ($srch->{'srchtype'} eq 'contains') {
+ if ($unamecheck !~ /^\w/) {
+ $unamecheck = 'a'.$unamecheck;
+ }
+ }
+ if ($unamecheck !~ /^$match_username$/) {
$response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @');
}
}
@@ -3016,14 +5260,23 @@ sub user_search_result {
my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'});
if ($uhome eq 'no_host') {
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
} else {
$currstate = 'modify';
+ my $uname = $srch->{'srchterm'};
+ my $udom = $srch->{'srchdomain'};
+ $srch_results{$uname.':'.$udom} =
+ { &Apache::lonnet::get('environment',
+ ['firstname',
+ 'lastname',
+ 'permanentemail'],
+ $udom,$uname)
+ };
}
} else {
%srch_results = &Apache::lonnet::usersearch($srch);
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
}
} else {
my $courseusers = &get_courseusers();
@@ -3032,7 +5285,7 @@ sub user_search_result {
$currstate = 'modify';
} else {
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
}
} else {
foreach my $user (keys(%$courseusers)) {
@@ -3059,7 +5312,7 @@ sub user_search_result {
}
}
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
}
}
}
@@ -3069,7 +5322,7 @@ sub user_search_result {
($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch);
if ($dirsrchres eq 'ok') {
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
} else {
my $showdom = &display_domain_info($srch->{'srchdomain'});
$response = ''.
@@ -3083,7 +5336,7 @@ sub user_search_result {
if ($srch->{'srchin'} eq 'dom') {
%srch_results = &Apache::lonnet::usersearch($srch);
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
} elsif ($srch->{'srchin'} eq 'crs') {
my $courseusers = &get_courseusers();
foreach my $user (keys(%$courseusers)) {
@@ -3135,14 +5388,14 @@ sub user_search_result {
}
}
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
} elsif ($srch->{'srchin'} eq 'alc') {
$currstate = 'query';
} elsif ($srch->{'srchin'} eq 'instd') {
($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch);
if ($dirsrchres eq 'ok') {
($currstate,$response,$forcenewuser) =
- &build_search_response($srch,%srch_results);
+ &build_search_response($context,$srch,%srch_results);
} else {
my $showdom = &display_domain_info($srch->{'srchdomain'}); $response = ''.
&mt('Institutional directory search is not available in domain: [_1]',$showdom).
@@ -3186,11 +5439,15 @@ sub directorysrch_check {
my ($insttypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($srch->{'srchdomain'});
my @longtypes;
foreach my $item (@usertypes) {
- push (@longtypes,$insttypes->{$item});
+ if (defined($insttypes->{$item})) {
+ push (@longtypes,$insttypes->{$item});
+ } elsif ($item eq 'default') {
+ push (@longtypes,&mt('other'));
+ }
}
my $insttype_str = join(', ',@longtypes);
return &mt('Institutional directory search in domain: [_1] is not available to your user type: ',$showdom).$insttype_str;
- }
+ }
} else {
$can_search = 1;
}
@@ -3248,7 +5505,7 @@ sub get_courseusers {
}
sub build_search_response {
- my ($srch,%srch_results) = @_;
+ my ($context,$srch,%srch_results) = @_;
my ($currstate,$response,$forcenewuser);
my %names = (
'uname' => 'username',
@@ -3306,9 +5563,49 @@ sub build_search_response {
$response .= ' '.&mt('You may want to broaden your search to the selected LON-CAPA domain.');
}
}
- if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $env{'request.role.domain'})) {
- my $showdom = &display_domain_info($env{'request.role.domain'});
- $response .= ' '.&mt("To add a new user (you can only create new users in your current role's domain - [_1] ):",$env{'request.role.domain'}).''.&mt("Set 'Domain/institution to search' to: [_1] ",$showdom).' '.&mt("Set 'Search criteria' to: 'username is ...... in selected LON-CAPA domain'").' '.&mt('Provide the proposed username').' '.&mt('Search').' ';
+ my $createdom = $env{'request.role.domain'};
+ if ($context eq 'requestcrs') {
+ if ($env{'form.coursedom'} ne '') {
+ $createdom = $env{'form.coursedom'};
+ }
+ }
+ if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $createdom)) {
+ my $cancreate =
+ &Apache::lonuserutils::can_create_user($createdom,$context);
+ my $targetdom = ''.$createdom.' ';
+ if ($cancreate) {
+ my $showdom = &display_domain_info($createdom);
+ $response .= ' '
+ .''.&mt('To add a new user:').' '
+ .' ';
+ if ($context eq 'requestcrs') {
+ $response .= &mt("(You can only define new users in the new course's domain - [_1])",$targetdom);
+ } else {
+ $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom);
+ }
+ $response .=''
+ .&mt("Set 'Domain/institution to search' to: [_1]",''.$showdom.' ')
+ .' '
+ .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'',' ')
+ .' '
+ .&mt('Provide the proposed username')
+ .' '
+ .&mt("Click 'Search'")
+ .' ';
+ } else {
+ my $helplink = ' href="javascript:helpMenu('."'display'".')"';
+ $response .= ' ';
+ if ($context eq 'requestcrs') {
+ $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom);
+ } else {
+ $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom);
+ }
+ $response .= ' '
+ .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.'
+ ,' '
+ ,' ')
+ .' ';
+ }
}
}
}
@@ -3408,84 +5705,26 @@ sub course_level_table {
&Apache::loncommon::get_sections($domain,$cnum);
}
}
- foreach my $role ('st','ta','ep','in','cc') {
+ my @roles = &Apache::lonuserutils::roles_by_context('course');
+ foreach my $role (@roles) {
+ my $plrole=&Apache::lonnet::plaintext($role);
if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) {
- my $plrole=&Apache::lonnet::plaintext($role);
- $table .= &Apache::loncommon::start_data_table_row().
-'
-'.$plrole.'
-'.$area.' Domain: '.$domain.' '."\n";
- if ($role ne 'cc') {
- if (%sections_count) {
- my $currsec =
- &Apache::lonuserutils::course_sections(\%sections_count,
- $protectedcourse.'_'.$role);
- $table .=
- ' ';
- } else {
- $table .= ' ';
- }
- } else {
- $table .= '  ';
+ $table .= &course_level_row($protectedcourse,$role,$area,$domain,
+ $plrole,\%sections_count,\%lt);
+ } elsif ($env{'request.course.sec'} ne '') {
+ if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'.
+ $env{'request.course.sec'})) {
+ $table .= &course_level_row($protectedcourse,$role,$area,$domain,
+ $plrole,\%sections_count,\%lt);
}
- $table .= <
-$lt{'ssd'}
-
-$lt{'sed'}
-ENDTIMEENTRY
- $table.= &Apache::loncommon::end_data_table_row();
}
}
- foreach my $cust (sort keys %customroles) {
- if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
- my $plrole=$cust;
- my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}.
- '_'.$env{'user.name'}.'_'.$plrole;
- $table .= &Apache::loncommon::start_data_table_row().
-'
-'.$plrole.'
-'.$area.' '."\n";
- if (%sections_count) {
- my $currsec =
- &Apache::lonuserutils::course_sections(\%sections_count,
- $customrole);
- $table.=
- ' ';
- } else {
- $table .= ' ';
- }
- $table .= <
-$lt{'ssd'}
-
-$lt{'sed'}
-ENDENTRY
- $table .= &Apache::loncommon::end_data_table_row();
- }
+ if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
+ foreach my $cust (sort keys %customroles) {
+ my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust;
+ $table .= &course_level_row($protectedcourse,$role,$area,$domain,
+ $cust,\%sections_count,\%lt);
+ }
}
}
return '' if ($table eq ''); # return nothing if there is nothing
@@ -3505,9 +5744,57 @@ $table.
return $result;
}
+sub course_level_row {
+ my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_;
+ my $row = &Apache::loncommon::start_data_table_row().
+ ' '."\n".
+ ' '.$plrole.' '."\n".
+ ' '.$area.' Domain: '.$domain.' '."\n";
+ if ($role eq 'cc') {
+ $row .= ' ';
+ } elsif ($env{'request.course.sec'} ne '') {
+ $row .= ' '.
+ $env{'request.course.sec'}.' ';
+ } else {
+ if (ref($sections_count) eq 'HASH') {
+ my $currsec =
+ &Apache::lonuserutils::course_sections($sections_count,
+ $protectedcourse.'_'.$role);
+ $row .= ' '."\n";
+ } else {
+ $row .= ' '."\n";
+ }
+ }
+ $row .= <
+$lt->{'ssd'}
+
+$lt->{'sed'}
+ENDTIMEENTRY
+ $row .= &Apache::loncommon::end_data_table_row();
+ return $row;
+}
+
sub course_level_dc {
my ($dcdom) = @_;
my %customroles=&Apache::lonuserutils::my_custom_roles();
+ my @roles = &Apache::lonuserutils::roles_by_context('course');
my $hiddenitems = ' '.
' '.
' ';
@@ -3530,9 +5817,9 @@ sub course_level_dc {
''.$courseform.' '.$lt{'rol'}.' '.$lt{'grs'}.' '.$lt{'sta'}.' '.$lt{'end'}.' '.
&Apache::loncommon::end_data_table_header_row();
my $otheritems = &Apache::loncommon::start_data_table_row()."\n".
- ' '."\n".
+ ' '."\n".
''."\n";
- foreach my $role ('st','ta','ep','in','cc') {
+ foreach my $role (@roles) {
my $plrole=&Apache::lonnet::plaintext($role);
$otheritems .= ' '.$plrole;
}
@@ -3550,6 +5837,7 @@ sub course_level_dc {
' '.
' '.$lt{'new'}.' '.
' '.
+ ' '.
' '.
' ';
$otheritems .= < 0) {
+ @types = sort(@types);
+ my $typestr = join(',',@types);
+ my $typedom = $env{'form.selfenroll_dom_'.$num};
+ $latesttypes[$newnum] = $typedom.':'.$typestr;
+ $currdoms{$typedom} = 1;
+ $newnum ++;
+ }
+ }
+ for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) { if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) {
+ my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j);
+ if (@types > 0) {
+ @types = sort(@types);
+ my $typestr = join(',',@types);
+ my $typedom = $env{'form.selfenroll_dom_'.$j};
+ $latesttypes[$newnum] = $typedom.':'.$typestr;
+ $currdoms{$typedom} = 1;
+ $newnum ++;
+ }
+ }
+ }
+ if ($env{'form.selfenroll_newdom'} ne '') {
+ my $typedom = $env{'form.selfenroll_newdom'};
+ if ((!defined($currdoms{$typedom})) &&
+ (&Apache::lonnet::domain($typedom) ne '')) {
+ my $typestr;
+ my ($othertitle,$usertypes,$types) =
+ &Apache::loncommon::sorted_inst_types($typedom);
+ my $othervalue = 'any';
+ if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) {
+ if (@{$types} > 0) {
+ my @esc_types = map { &escape($_); } @{$types};
+ $othervalue = 'other';
+ $typestr = join(',',(@esc_types,$othervalue));
+ }
+ $typestr = $othervalue;
+ } else {
+ $typestr = $othervalue;
+ }
+ $latesttypes[$newnum] = $typedom.':'.$typestr;
+ $newnum ++ ;
+ }
+ }
+ my $selfenroll_types = join(';',@latesttypes);
+ if ($selfenroll_types ne $curr_types) {
+ $changes{'internal.selfenroll_types'} = $selfenroll_types;
+ }
+ }
+ } elsif ($item eq 'limit') {
+ my $newlimit = $env{'form.selfenroll_limit'};
+ my $newcap = $env{'form.selfenroll_cap'};
+ $newcap =~s/\s+//g;
+ my $currlimit = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_limit'};
+ $currlimit = 'none' if ($currlimit eq '');
+ my $currcap = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_cap'};
+ if ($newlimit ne $currlimit) {
+ if ($newlimit ne 'none') {
+ if ($newcap =~ /^\d+$/) {
+ if ($newcap ne $currcap) {
+ $changes{'internal.selfenroll_cap'} = $newcap;
+ }
+ $changes{'internal.selfenroll_limit'} = $newlimit;
+ } else {
+ $warning{$item} = &mt('Maximum enrollment setting unchanged.').' '.&mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.');
+ }
+ } elsif ($currcap ne '') {
+ $changes{'internal.selfenroll_cap'} = '';
+ $changes{'internal.selfenroll_limit'} = $newlimit;
+ }
+ } elsif ($currlimit ne 'none') {
+ if ($newcap =~ /^\d+$/) {
+ if ($newcap ne $currcap) {
+ $changes{'internal.selfenroll_cap'} = $newcap;
+ }
+ } else {
+ $warning{$item} = &mt('Maximum enrollment setting unchanged.').' '.&mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.');
+ }
+ }
+ } elsif ($item eq 'approval') {
+ my (@currnotified,@newnotified);
+ my $currapproval = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'};
+ my $currnotifylist = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_notifylist'};
+ if ($currnotifylist ne '') {
+ @currnotified = split(/,/,$currnotifylist);
+ @currnotified = sort(@currnotified);
+ }
+ my $newapproval = $env{'form.selfenroll_approval'};
+ @newnotified = &Apache::loncommon::get_env_multiple('form.selfenroll_notify');
+ @newnotified = sort(@newnotified);
+ if ($newapproval ne $currapproval) {
+ $changes{'internal.selfenroll_approval'} = $newapproval;
+ if (!$newapproval) {
+ if ($currnotifylist ne '') {
+ $changes{'internal.selfenroll_notifylist'} = '';
+ }
+ } else {
+ my @differences =
+ &Apache::loncommon::compare_arrays(\@currnotified,\@newnotified);
+ if (@differences > 0) {
+ if (@newnotified > 0) {
+ $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
+ } else {
+ $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
+ }
+ }
+ }
+ } else {
+ my @differences = &Apache::loncommon::compare_arrays(\@currnotified,\@newnotified);
+ if (@differences > 0) {
+ if (@newnotified > 0) {
+ $changes{'internal.selfenroll_notifylist'} = join(',',@newnotified);
+ } else {
+ $changes{'internal.selfenroll_notifylist'} = '';
+ }
+ }
+ }
+ } else {
+ my $curr_val =
+ $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item};
+ my $newval = $env{'form.selfenroll_'.$item};
+ if ($item eq 'section') {
+ $newval = $env{'form.sections'};
+ if (defined($curr_groups{$newval})) {
+ $newval = $curr_val;
+ $warning{$item} = &mt('Section for self-enrolled users unchanged as the proposed section is a group').' '.&mt('Group names and section names must be distinct');
+ } elsif ($newval eq 'all') {
+ $newval = $curr_val;
+ $warning{$item} = &mt('Section for self-enrolled users unchanged, as "all" is a reserved section name.');
+ }
+ if ($newval eq '') {
+ $newval = 'none';
+ }
+ }
+ if ($newval ne $curr_val) {
+ $changes{'internal.selfenroll_'.$item} = $newval;
+ }
+ }
+ }
+ if (keys(%warning) > 0) {
+ foreach my $item (@{$row}) {
+ if (exists($warning{$item})) {
+ $r->print($warning{$item}.' ');
+ }
+ }
+ }
+ if (keys(%changes) > 0) {
+ my $putresult = &Apache::lonnet::put('environment',\%changes,$cdom,$cnum);
+ if ($putresult eq 'ok') {
+ if ((exists($changes{'internal.selfenroll_types'})) ||
+ (exists($changes{'internal.selfenroll_start_date'})) ||
+ (exists($changes{'internal.selfenroll_end_date'}))) {
+ my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',
+ $cnum,undef,undef,'Course');
+ my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ foreach my $item ('selfenroll_types','selfenroll_start_date','selfenroll_end_date') {
+ if (exists($changes{'internal.'.$item})) {
+ $crsinfo{$env{'request.course.id'}}{$item} =
+ $changes{'internal.'.$item};
+ }
+ }
+ my $crsputresult =
+ &Apache::lonnet::courseidput($cdom,\%crsinfo,
+ $chome,'notime');
+ }
+ }
+ $r->print(&mt('The following changes were made to self-enrollment settings:').'');
+ foreach my $item (@{$row}) {
+ my $title = $item;
+ if (ref($lt) eq 'HASH') {
+ $title = $lt->{$item};
+ }
+ if ($item eq 'enroll_dates') {
+ foreach my $type ('start','end') {
+ if (exists($changes{'internal.selfenroll_'.$type.'_date'})) {
+ my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_date'});
+ $r->print(''.&mt('[_1]: "[_2]" set to "[_3]".',
+ $title,$type,$newdate).' ');
+ }
+ }
+ } elsif ($item eq 'access_dates') {
+ foreach my $type ('start','end') {
+ if (exists($changes{'internal.selfenroll_'.$type.'_access'})) {
+ my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_access'});
+ $r->print(''.&mt('[_1]: "[_2]" set to "[_3]".',
+ $title,$type,$newdate).' ');
+ }
+ }
+ } elsif ($item eq 'limit') {
+ if ((exists($changes{'internal.selfenroll_limit'})) ||
+ (exists($changes{'internal.selfenroll_cap'}))) {
+ my ($newval,$newcap);
+ if ($changes{'internal.selfenroll_cap'} ne '') {
+ $newcap = $changes{'internal.selfenroll_cap'}
+ } else {
+ $newcap = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_cap'};
+ }
+ if ($changes{'internal.selfenroll_limit'} eq 'none') {
+ $newval = &mt('No limit');
+ } elsif ($changes{'internal.selfenroll_limit'} eq
+ 'allstudents') {
+ $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap);
+ } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') {
+ $newval = &mt('New self-enrollment no longer allowed when total number of self-enrolled students reaches [_1].',$newcap);
+ } else {
+ my $currlimit = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_limit'};
+ if ($currlimit eq 'allstudents') {
+ $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap);
+ } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') {
+ $newval = &mt('New self-enrollment no longer allowed when total number of self-enrolled students reaches [_1].',$newcap);
+ }
+ }
+ $r->print(''.&mt('"[_1]" set to "[_2]".',$title,$newval).' '."\n");
+ }
+ } elsif ($item eq 'approval') {
+ if ((exists($changes{'internal.selfenroll_approval'})) ||
+ (exists($changes{'internal.selfenroll_notifylist'}))) {
+ my ($newval,$newnotify);
+ if (exists($changes{'internal.selfenroll_notifylist'})) {
+ $newnotify = $changes{'internal.selfenroll_notifylist'};
+ } else {
+ $newnotify = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_notifylist'};
+ }
+ if ($changes{'internal.selfenroll_approval'}) {
+ $newval = &mt('Yes');
+ } elsif ($changes{'internal.selfenroll_approval'} eq '0') {
+ $newval = &mt('No');
+ } else {
+ my $currapproval =
+ $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'};
+ if ($currapproval) {
+ $newval = &mt('Yes');
+ } else {
+ $newval = &mt('No');
+ }
+ }
+ $r->print(''.&mt('"[_1]" set to "[_2]".',$title,$newval));
+ if ($newnotify) {
+ $r->print(' '.&mt('The following will be notified when an enrollment request needs approval, or has been approved: [_1].',$newnotify));
+ } else {
+ $r->print(' '.&mt('No notifications sent when an enrollment request needs approval, or has been approved.'));
+ }
+ $r->print(' '."\n");
+ }
+ } else {
+ if (exists($changes{'internal.selfenroll_'.$item})) {
+ my $newval = $changes{'internal.selfenroll_'.$item};
+ if ($item eq 'types') {
+ if ($newval eq '') {
+ $newval = &mt('None');
+ } elsif ($newval eq '*') {
+ $newval = &mt('Any user in any domain');
+ }
+ } elsif ($item eq 'registered') {
+ if ($newval eq '1') {
+ $newval = &mt('Yes');
+ } elsif ($newval eq '0') {
+ $newval = &mt('No');
+ }
+ }
+ $r->print(''.&mt('"[_1]" set to "[_2]".',$title,$newval).' '."\n");
+ }
+ }
+ }
+ $r->print(' ');
+ my %newenvhash;
+ foreach my $key (keys(%changes)) {
+ $newenvhash{'course.'.$env{'request.course.id'}.'.'.$key} = $changes{$key};
+ }
+ &Apache::lonnet::appenv(\%newenvhash);
+ } else {
+ $r->print(&mt('An error occurred when saving changes to self-enrollment settings in this course.').' '.&mt('The error was: [_1].',$putresult));
+ }
+ } else {
+ $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
+ }
+ } else {
+ $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.'));
+ }
+ my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum);
+ if (ref($visactions) eq 'HASH') {
+ if (!$visible) {
+ $r->print(' '.$visactions->{'miss'}.' '.$visactions->{'yous'}.
+ ' ');
+ if (ref($vismsgs) eq 'ARRAY') {
+ $r->print(' '.$visactions->{'take'}.'');
+ foreach my $item (@{$vismsgs}) {
+ $r->print(''.$visactions->{$item}.' ');
+ }
+ $r->print(' ');
+ }
+ $r->print($cansetvis);
+ }
+ }
+ return;
+}
+
+sub get_selfenroll_titles {
+ my @row = ('types','registered','enroll_dates','access_dates','section',
+ 'approval','limit');
+ my %lt = &Apache::lonlocal::texthash (
+ types => 'Users allowed to self-enroll in this course',
+ registered => 'Restrict self-enrollment to students officially registered for the course',
+ enroll_dates => 'Dates self-enrollment available',
+ access_dates => 'Course access dates assigned to self-enrolling users',
+ section => 'Section assigned to self-enrolling users',
+ approval => 'Self-enrollment requests need approval?',
+ limit => 'Enrollment limit',
+ );
+ return (\@row,\%lt);
+}
+
#---------------------------------------------- end functions for &phase_two
#--------------------------------- functions for &phase_two and &phase_three