--- loncom/interface/loncreateuser.pm 2023/09/04 16:16:19 1.406.2.20.2.4
+++ loncom/interface/loncreateuser.pm 2024/02/29 21:43:33 1.406.2.20.2.5
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Create a user
#
-# $Id: loncreateuser.pm,v 1.406.2.20.2.4 2023/09/04 16:16:19 raeburn Exp $
+# $Id: loncreateuser.pm,v 1.406.2.20.2.5 2024/02/29 21:43:33 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -81,7 +81,7 @@ my $authformfsys;
my $authformloc;
sub initialize_authen_forms {
- my ($dom,$formname,$curr_authtype,$mode) = @_;
+ my ($dom,$formname,$curr_authtype,$mode,$readonly) = @_;
my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($dom);
my %param = ( formname => $formname,
kerb_def_dom => $krbdefdom,
@@ -102,6 +102,9 @@ sub initialize_authen_forms {
$param{'mode'} = $mode;
}
}
+ if ($readonly) {
+ $param{'readonly'} = 1;
+ }
$loginscript = &Apache::loncommon::authform_header(%param);
$authformkrb = &Apache::loncommon::authform_kerberos(%param);
$authformnop = &Apache::loncommon::authform_nochange(%param);
@@ -124,14 +127,82 @@ sub auth_abbrev {
# ====================================================
sub user_quotas {
- my ($ccuname,$ccdomain) = @_;
+ my ($ccuname,$ccdomain,$name) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'usrt' => "User Tools",
'cust' => "Custom quota",
'chqu' => "Change quota",
);
-
- my $quota_javascript = <<"END_SCRIPT";
+ my ($output,$longinsttype);
+ my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($ccdomain);
+ my %titles = &Apache::lonlocal::texthash (
+ portfolio => "Disk space allocated to user's portfolio files",
+ author => "Disk space allocated to user's Authoring Space",
+ );
+ my ($currquota,$quotatype,$inststatus,$defquota) =
+ &Apache::loncommon::get_user_quota($ccuname,$ccdomain,$name);
+ if ($longinsttype eq '') {
+ if ($inststatus ne '') {
+ if ($usertypes->{$inststatus} ne '') {
+ $longinsttype = $usertypes->{$inststatus};
+ }
+ }
+ }
+ my ($showquota,$custom_on,$custom_off,$defaultinfo,$colspan);
+ $custom_on = ' ';
+ $custom_off = ' checked="checked" ';
+ $colspan = ' colspan="2"';
+ if ($quotatype eq 'custom') {
+ $custom_on = $custom_off;
+ $custom_off = ' ';
+ $showquota = $currquota;
+ if ($longinsttype eq '') {
+ $defaultinfo = &mt('For this user, the default quota would be [_1]'
+ .' MB.',$defquota);
+ } else {
+ $defaultinfo = &mt("For this user, the default quota would be [_1]".
+ " MB,[_2]as determined by the user's institutional".
+ " affiliation ([_3]).",$defquota,' ',$longinsttype);
+ }
+ } else {
+ if ($longinsttype eq '') {
+ $defaultinfo = &mt('For this user, the default quota is [_1]'
+ .' MB.',$defquota);
+ } else {
+ $defaultinfo = &mt("For this user, the default quota of [_1]".
+ " MB,[_2]is determined by the user's institutional".
+ " affiliation ([_3]).",$defquota,' ',$longinsttype);
+ }
+ }
+
+ if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
+ $output .= '
'."\n".
+ ' '.$titles{$name}.' '."\n".
+ ' '."\n".
+ &Apache::loncommon::start_data_table_row()."\n".
+ ' '.
+ &mt('Current quota: [_1] MB',$currquota).' '.
+ $defaultinfo.' '."\n".
+ &Apache::loncommon::end_data_table_row()."\n".
+ &Apache::loncommon::start_data_table_row()."\n".
+ ''.$lt{'chqu'}.
+ ': '.
+ ''.
+ &mt('Default ([_1] MB)',$defquota).' '.
+ ' '.$lt{'cust'}.': '.
+ ' '.&mt('MB').' '."\n".
+ &Apache::loncommon::end_data_table_row()."\n";
+ }
+ return $output;
+}
+
+sub user_quota_js {
+ return <<"END_SCRIPT";
END_SCRIPT
- my $longinsttype;
- my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($ccdomain);
- my $output = $quota_javascript."\n".
- ''.$lt{'usrt'}.' '."\n".
- &Apache::loncommon::start_data_table();
-
- if ((&Apache::lonnet::allowed('mut',$ccdomain)) ||
- (&Apache::lonnet::allowed('udp',$ccdomain))) {
- $output .= &build_tools_display($ccuname,$ccdomain,'tools');
- }
- my %titles = &Apache::lonlocal::texthash (
- portfolio => "Disk space allocated to user's portfolio files",
- author => "Disk space allocated to user's Authoring Space (if role assigned)",
- );
- foreach my $name ('portfolio','author') {
- my ($currquota,$quotatype,$inststatus,$defquota) =
- &Apache::loncommon::get_user_quota($ccuname,$ccdomain,$name);
- if ($longinsttype eq '') {
- if ($inststatus ne '') {
- if ($usertypes->{$inststatus} ne '') {
- $longinsttype = $usertypes->{$inststatus};
+}
+
+sub set_custom_js {
+ return <<"END_SCRIPT";
+
+
+
+END_SCRIPT
+
}
sub build_tools_display {
my ($ccuname,$ccdomain,$context) = @_;
my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,
- $colspan,$isadv,%domconfig);
+ $colspan,$isadv,%domconfig,@defaulteditors,@customeditors);
my %lt = &Apache::lonlocal::texthash (
'blog' => "Personal User Blog",
'aboutme' => "Personal Information Page",
- 'webdav' => "WebDAV access to Authoring Spaces (if SSL and author/co-author)",
+ 'webdav' => "WebDAV access to Authoring Spaces (https)",
+ 'editors' => "Available Editors",
'portfolio' => "Personal User Portfolio",
'timezone' => "Can set Time Zone",
'avai' => "Available",
@@ -255,6 +291,9 @@ sub build_tools_display {
'community' => 'Can request creation of communities',
'textbook' => 'Can request creation of textbook courses',
'requestauthor' => 'Can request author space',
+ 'edit' => 'Standard editor (Edit)',
+ 'xml' => 'Text editor (EditXML)',
+ 'daxe' => 'Daxe editor (Daxe)',
);
$isadv = &Apache::lonnet::is_advanced_user($ccdomain,$ccuname);
if ($context eq 'requestcourses') {
@@ -266,39 +305,58 @@ sub build_tools_display {
%validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);
%reqtitles = &courserequest_titles();
%reqdisplay = &courserequest_display();
- $colspan = ' colspan="2"';
%domconfig =
&Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain);
} elsif ($context eq 'requestauthor') {
- %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
- 'requestauthor');
+ %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,'requestauthor');
@usertools = ('requestauthor');
@options =('norequest','approval','automatic');
%reqtitles = &requestauthor_titles();
%reqdisplay = &requestauthor_display();
- $colspan = ' colspan="2"';
%domconfig =
&Apache::lonnet::get_dom('configuration',['requestauthor'],$ccdomain);
+ } elsif ($context eq 'authordefaults') {
+ %domconfig =
+ &Apache::lonnet::get_dom('configuration',['quotas','authordefaults'],$ccdomain);
+ %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,'tools.webdav',
+ 'authoreditors');
+ @usertools = ('webdav','editors');
+ $colspan = ' colspan="2"';
} else {
%userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
'tools.aboutme','tools.portfolio','tools.blog',
- 'tools.webdav','tools.timezone');
- @usertools = ('aboutme','blog','webdav','portfolio','timezone');
+ 'tools.timezone');
+ @usertools = ('aboutme','blog','portfolio','timezone');
+ $colspan = ' colspan="2"';
}
foreach my $item (@usertools) {
my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off,
- $currdisp,$custdisp,$custradio);
+ $currdisp,$custdisp,$custradio,$onclick,$customsty,$editorsty);
$cust_off = 'checked="checked" ';
$tool_on = 'checked="checked" ';
- $curr_access =
- &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef,
- $context,\%userenv,'',
- {'is_adv' => $isadv});
+ unless (($context eq 'authordefaults') && ($item ne 'webdav')) {
+ $curr_access =
+ &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef,
+ $context,\%userenv,'',
+ {'is_adv' => $isadv});
+ }
if ($context eq 'requestauthor') {
if ($userenv{$context} ne '') {
$cust_on = ' checked="checked" ';
$cust_off = '';
- }
+ }
+ } elsif ($context eq 'authordefaults') {
+ if ($item eq 'editors') {
+ if ($userenv{'author'.$item} ne '') {
+ $cust_on = ' checked="checked" ';
+ $cust_off = '';
+ }
+ } elsif ($item eq 'webdav') {
+ if ($userenv{'tools.'.$item} ne '') {
+ $cust_on = ' checked="checked" ';
+ $cust_off = '';
+ }
+ }
} elsif ($userenv{$context.'.'.$item} ne '') {
$cust_on = ' checked="checked" ';
$cust_off = '';
@@ -306,30 +364,71 @@ sub build_tools_display {
if ($context eq 'requestcourses') {
if ($userenv{$context.'.'.$item} eq '') {
$custom_access = &mt('Currently from default setting.');
+ $customsty = ' style="display:none;"';
} else {
$custom_access = &mt('Currently from custom setting.');
+ $customsty = ' style="display:block;"';
}
} elsif ($context eq 'requestauthor') {
if ($userenv{$context} eq '') {
$custom_access = &mt('Currently from default setting.');
+ $customsty = ' style="display:none;"';
} else {
$custom_access = &mt('Currently from custom setting.');
+ $customsty = ' style="display:block;"';
+ }
+ } elsif ($item eq 'editors') {
+ if ($userenv{'author'.$item} eq '') {
+ if (ref($domconfig{'authordefaults'}{'editors'}) eq 'ARRAY') {
+ @defaulteditors = @{$domconfig{'authordefaults'}{'editors'}};
+ } else {
+ @defaulteditors = ('edit','xml');
+ }
+ $custom_access = &mt('Can use: [_1]',
+ join(', ', map { $lt{$_} } @defaulteditors));
+ $editorsty = ' style="display:none;"';
+ } else {
+ $custom_access = &mt('Currently from custom setting.');
+ foreach my $editor (split(/,/,$userenv{'author'.$item})) {
+ if ($editor =~ /^(edit|daxe|xml)$/) {
+ push(@customeditors,$editor);
+ }
+ }
+ if (@customeditors) {
+ if (@customeditors > 1) {
+ $custom_access .= '';
+ } else {
+ $custom_access .= ' ';
+ }
+ $custom_access .= &mt('Can use: [_1]',
+ join(', ', map { $lt{$_} } @customeditors)).
+ ' ';
+ } else {
+ $custom_access .= ' '.&mt('No available editors');
+ }
+ $editorsty = ' style="display:block;"';
}
} else {
- if ($userenv{$context.'.'.$item} eq '') {
+ my $current = $userenv{$context.'.'.$item};
+ if ($item eq 'webdav') {
+ $current = $userenv{'tools.webdav'};
+ }
+ if ($current eq '') {
$custom_access =
&mt('Availability determined currently from default setting.');
if (!$curr_access) {
$tool_off = 'checked="checked" ';
$tool_on = '';
}
+ $customsty = ' style="display:none;"';
} else {
$custom_access =
&mt('Availability determined currently from custom setting.');
- if ($userenv{$context.'.'.$item} == 0) {
+ if ($current == 0) {
$tool_off = 'checked="checked" ';
$tool_on = '';
}
+ $customsty = ' style="display:inline;"';
}
}
$output .= ' '."\n".
@@ -361,6 +460,11 @@ sub build_tools_display {
if (!$curroption) {
$curroption = 'norequest';
}
+ my $name = 'crsreq_'.$item;
+ if ($context eq 'requestauthor') {
+ $name = $item;
+ }
+ $onclick = ' onclick="javascript:toggleCustom(this.form,'."'customtext_$item','custom$item'".');"';
if ($curroption =~ /^autolimit=(\d*)$/) {
$currlimit = $1;
if ($currlimit eq '') {
@@ -371,7 +475,7 @@ sub build_tools_display {
} else {
$currdisp = $reqdisplay{$curroption};
}
- $custdisp = '';
- $custradio = ''.&mt('Custom setting').' '.$custdisp;
} else {
$currdisp = ($curr_access?&mt('Yes'):&mt('No'));
my $name = $context.'_'.$item;
- if ($context eq 'requestauthor') {
- $name = $context;
- }
+ $onclick = 'onclick="javascript:toggleCustom(this.form,'."'customtext_$item','custom$item'".');" ';
$custdisp = ''.
' '.&mt('On').' '.
+ ' value="1" '.$tool_on.$onclick.'/>'.&mt('On').' '.
' '.&mt('Off').' ';
- $custradio = (' 'x2).'--'.$lt{'cusa'}.': '.$custdisp.
- '';
- }
- $output .= ' '.$custom_access.(' 'x4).
- $lt{'avai'}.': '.$currdisp.' '."\n".
- &Apache::loncommon::end_data_table_row()."\n";
- unless (&Apache::lonnet::allowed('udp',$ccdomain)) {
- $output .=
+ $tool_off.$onclick.'/>'.&mt('Off').'';
+ $custradio = ''.
+ '--'.$lt{'cusa'}.': '.$custdisp.' ';
+ }
+ unless ($item eq 'editors') {
+ $output .= ' '.$custom_access.(' 'x4).
+ $lt{'avai'}.': '.$currdisp.' '."\n".
+ &Apache::loncommon::end_data_table_row()."\n";
+ unless (&Apache::lonnet::allowed('udp',$ccdomain)) {
+ $output .=
&Apache::loncommon::start_data_table_row()."\n".
- ' '.
+ ' '.
$lt{'chse'}.': '.
' '.$lt{'usde'}.' '.(' ' x3).
+ $cust_off.$onclick.'/>'.$lt{'usde'}.''.(' ' x3).
' '.$lt{'uscu'}.' '.$custradio.' '.
- &Apache::loncommon::end_data_table_row()."\n";
+ $cust_on.$onclick.'/>'.$lt{'uscu'}.'';
+ if ($colspan) {
+ $output .= '';
+ }
+ $output .= $custradio.' '.
+ &Apache::loncommon::end_data_table_row()."\n";
+ }
}
}
return $output;
@@ -526,7 +664,7 @@ sub coursereq_externaluser {
sub domainrole_req {
my ($ccuname,$ccdomain) = @_;
return ''.
- &mt('User Can Request Assignment of Domain Roles?').
+ &mt('Can Request Assignment of Domain Roles?').
' '."\n".
&Apache::loncommon::start_data_table().
&build_tools_display($ccuname,$ccdomain,
@@ -534,6 +672,18 @@ sub domainrole_req {
&Apache::loncommon::end_data_table();
}
+sub authoring_defaults {
+ my ($ccuname,$ccdomain) = @_;
+ return ''.
+ &mt('Authoring Space defaults (if role assigned)').
+ ' '."\n".
+ &Apache::loncommon::start_data_table().
+ &build_tools_display($ccuname,$ccdomain,
+ 'authordefaults').
+ &user_quotas($ccuname,$ccdomain,'author').
+ &Apache::loncommon::end_data_table();
+}
+
sub courserequest_titles {
my %titles = &Apache::lonlocal::texthash (
official => 'Official',
@@ -1244,8 +1394,9 @@ sub print_user_modification_page {
my $groupslist = &Apache::lonuserutils::get_groupslist();
- my $js = &validation_javascript($context,$ccdomain,$pjump_def,$crstype,
- $groupslist,$newuser,$formname,\%loaditem);
+ my $js = &validation_javascript($context,$ccdomain,$pjump_def,
+ $crstype,$groupslist,$newuser,
+ $formname,\%loaditem,$permission);
my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$ccdomain);
my $helpitem = 'Course_Change_Privileges';
if ($env{'form.action'} eq 'singlestudent') {
@@ -1254,6 +1405,7 @@ sub print_user_modification_page {
$helpitem = 'Author_Change_Privileges';
} elsif ($context eq 'domain') {
$helpitem = 'Domain_Change_Privileges';
+ $js .= &set_custom_js();
}
push (@{$brcrum},
{href => "javascript:backPage($form)",
@@ -1279,6 +1431,32 @@ sub print_user_modification_page {
if ($env{'form.popup'}) {
$args->{'no_nav_bar'} = 1;
}
+ if (($context eq 'domain') && ($env{'request.role.domain'} eq $ccdomain)) {
+ my @toggles;
+ if (&Apache::lonnet::allowed('cau',$ccdomain)) {
+ my ($isadv,$isauthor) =
+ &Apache::lonnet::is_advanced_user($ccdomain,$ccuname);
+ unless ($isauthor) {
+ push(@toggles,'requestauthor');
+ }
+ push(@toggles,('webdav','editors'));
+ }
+ if (&Apache::lonnet::allowed('mut',$ccdomain)) {
+ push(@toggles,('aboutme','blog','portfolio','timezone'));
+ }
+ if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
+ push(@toggles,('official','unofficial','community','textbook'));
+ }
+ if (@toggles) {
+ my $onload;
+ foreach my $item (@toggles) {
+ $onload .= "toggleCustom(document.cu,'customtext_$item','custom$item');";
+ }
+ $args->{'add_entries'} = {
+ 'onload' => $onload,
+ };
+ }
+ }
my $start_page =
&Apache::loncommon::start_page('User Management',$js,$args);
@@ -1315,18 +1493,36 @@ ENDFORMINFO
}
}
my $title = '';
+ my $need_quota_js;
if ($newuser) {
my ($portfolioform,$domroleform);
if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) ||
(&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) {
# Current user has quota or user tools modification privileges
- $portfolioform = ' '.&user_quotas($ccuname,$ccdomain);
+ $portfolioform = ''.
+ &mt('User Tools').
+ ' '."\n".
+ &Apache::loncommon::start_data_table();
+ if (&Apache::lonnet::allowed('mut',$ccdomain)) {
+ $portfolioform .= &build_tools_display($ccuname,$ccdomain,'tools');
+ }
+ if (&Apache::lonnet::allowed('mpq',$ccdomain)) {
+ $portfolioform .= &user_quotas($ccuname,$ccdomain,'portfolio');
+ $need_quota_js = 1;
+ }
+ $portfolioform .= &Apache::loncommon::end_data_table();
}
if ((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) &&
($ccdomain eq $env{'request.role.domain'})) {
- $domroleform = ' '.&domainrole_req($ccuname,$ccdomain);
+ $domroleform = &domainrole_req($ccuname,$ccdomain).
+ &authoring_defaults($ccuname,$ccdomain);
+ $need_quota_js = 1;
+ }
+ my $readonly;
+ unless ($permission->{'cusr'}) {
+ $readonly = 1;
}
- &initialize_authen_forms($ccdomain,$formname);
+ &initialize_authen_forms($ccdomain,$formname,'','',$readonly);
my %lt=&Apache::lonlocal::texthash(
'lg' => 'Login Data',
'hs' => "Home Server",
@@ -1357,7 +1553,7 @@ ENDTITLE
$r->print(''.$title.' '."\n");
$r->print('');
$r->print(&personal_data_display($ccuname,$ccdomain,$newuser,$context,
- $inst_results{$ccuname.':'.$ccdomain}));
+ $inst_results{$ccuname.':'.$ccdomain},$readonly));
# Option to disable student/employee ID conflict checking not offerred for new users.
my ($home_server_pick,$numlib) =
&Apache::loncommon::home_server_form_item($ccdomain,'hserver',
@@ -1372,7 +1568,7 @@ $lt{'hs'}: $home_server_pick
}
if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) {
$r->print('
'.
- &mt('User Can Request Creation of Courses/Communities in this Domain?').' '.
+ &mt('Can Request Creation of Courses/Communities in this Domain?').''.
&Apache::loncommon::start_data_table().
&build_tools_display($ccuname,$ccdomain,
'requestcourses').
@@ -1468,7 +1664,7 @@ ENDAUTH
$inst_results{$ccuname.':'.$ccdomain}));
if ((&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) ||
(&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) {
- $r->print(''.&mt('User Can Request Creation of Courses/Communities in this Domain?').' '.
+ $r->print(''.&mt('Can Request Creation of Courses/Communities in this Domain?').' '."\n".
&Apache::loncommon::start_data_table());
if ($env{'request.role.domain'} eq $ccdomain) {
$r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
@@ -1479,28 +1675,44 @@ ENDAUTH
$r->print(&Apache::loncommon::end_data_table());
}
$r->print('');
- my @order = ('auth','quota','tools','requestauthor');
+ my @order = ('auth','quota','tools','requestauthor','authordefaults');
my %user_text;
my ($isadv,$isauthor) =
&Apache::lonnet::is_advanced_user($ccdomain,$ccuname);
- if ((!$isauthor) &&
- ((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) ||
+ if (((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) ||
(&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) &&
- ($env{'request.role.domain'} eq $ccdomain)) {
- $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);
+ ($env{'request.role.domain'} eq $ccdomain)) {
+ if (!$isauthor) {
+ $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain);
+ }
+ $user_text{'authordefaults'} = &authoring_defaults($ccuname,$ccdomain);
+ if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) {
+ $need_quota_js = 1;
+ }
}
$user_text{'auth'} = &user_authentication($ccuname,$ccdomain,$formname,$crstype,$permission);
if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
(&Apache::lonnet::allowed('mut',$ccdomain)) ||
(&Apache::lonnet::allowed('udp',$ccdomain))) {
+ $user_text{'quota'} = ''.&mt('User Tools').' '."\n".
+ &Apache::loncommon::start_data_table();
+ if ((&Apache::lonnet::allowed('mut',$ccdomain)) ||
+ (&Apache::lonnet::allowed('udp',$ccdomain))) {
+ $user_text{'quota'} .= &build_tools_display($ccuname,$ccdomain,'tools');
+ }
# Current user has quota modification privileges
- $user_text{'quota'} = &user_quotas($ccuname,$ccdomain);
+ if ((&Apache::lonnet::allowed('mpq',$ccdomain)) ||
+ (&Apache::lonnet::allowed('udp',$ccdomain))) {
+ $user_text{'quota'} .= &user_quotas($ccuname,$ccdomain,'portfolio');
+ $need_quota_js = 1;
+ }
+ $user_text{'quota'} .= &Apache::loncommon::end_data_table();
}
if (!&Apache::lonnet::allowed('mpq',$ccdomain)) {
if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) {
my %lt=&Apache::lonlocal::texthash(
- 'dska' => "Disk quotas for user's portfolio and Authoring Space",
- 'youd' => "You do not have privileges to modify the portfolio and/or Authoring Space quotas for this user.",
+ 'dska' => "Disk quotas for user's portfolio",
+ 'youd' => "You do not have privileges to modify the portfolio quota for this user.",
'ichr' => "If a change is required, contact a domain coordinator for the domain",
);
$user_text{'quota'} = < "User Tools Availability",
- 'yodo' => "You do not have privileges to modify Portfolio, Blog, WebDAV, or Personal Information Page settings for this user.",
+ 'yodo' => "You do not have privileges to modify Portfolio, Blog, Personal Information Page, or Time Zone settings for this user.",
'ifch' => "If a change is required, contact a domain coordinator for the domain",
);
$user_text{'tools'} = <print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
$r->print(' ');
$r->print(' ');
+ if ($need_quota_js) {
+ $r->print(&user_quota_js());
+ }
return;
}
@@ -1669,14 +1884,16 @@ sub date_sections_select {
sub validation_javascript {
my ($context,$ccdomain,$pjump_def,$crstype,$groupslist,$newuser,$formname,
- $loaditem) = @_;
+ $loaditem,$permission) = @_;
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);
+ if ((ref($permission) eq 'HASH') && ($permission->{'cusr'})) {
+ 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))) {
@@ -2628,9 +2845,10 @@ sub personal_data_display {
' ';
if ($usertype ne '') {
- $output .= ' '.
- &Apache::lonhtmlcommon::row_closure(1);
+ $output .= ' ';
}
+ $output .= &Apache::lonhtmlcommon::row_closure(1);
}
}
$output .= &Apache::lonhtmlcommon::end_pick_box();
@@ -2851,9 +3069,10 @@ sub update_user_data {
my (%alerts,%rulematch,%inst_results,%curr_rules);
my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id');
- my @usertools = ('aboutme','blog','webdav','portfolio','timezone');
+ my @usertools = ('aboutme','blog','portfolio','timezone');
my @requestcourses = ('official','unofficial','community','textbook');
my @requestauthor = ('requestauthor');
+ my @authordefaults = ('webdav','editors');
my ($othertitle,$usertypes,$types) =
&Apache::loncommon::sorted_inst_types($env{'form.ccdomain'});
my %canmodify_status =
@@ -2962,6 +3181,29 @@ sub update_user_data {
$newcustom{'requestauthor'},
\%changeHash,'requestauthor');
}
+ if ($env{'form.customeditors'} == 1) {
+ my @editors;
+ my @posseditors = &Apache::loncommon::get_env_multiple('form.custom_editor');
+ if (@posseditors) {
+ foreach my $editor (@posseditors) {
+ if (grep(/^\Q$editor\E$/,@posseditors)) {
+ unless (grep(/^\Q$editor\E$/,@editors)) {
+ push(@editors,$editor);
+ }
+ }
+ }
+ }
+ if (@editors) {
+ @editors = sort(@editors);
+ $changed{'editors'} = &tool_admin('editors',join(',',@editors),
+ \%changeHash,'authordefaults');
+ }
+ }
+ if ($env{'form.customwebdav'} == 1) {
+ $newcustom{'webdav'} = $env{'form.authordefaults_webdav'};
+ $changed{'webdav'} = &tool_admin('webdav',$newcustom{'webdav'},
+ \%changeHash,'authordefaults');
+ }
}
if ($canmodify_status{'inststatus'}) {
if (exists($env{'form.inststatus'})) {
@@ -3029,11 +3271,11 @@ sub update_user_data {
'id','permanentemail','portfolioquota','authorquota','inststatus',
'tools.aboutme','tools.blog','tools.webdav',
'tools.portfolio','tools.timezone',
+ 'authoreditors','requestauthor',
'requestcourses.official','requestcourses.unofficial',
'requestcourses.community','requestcourses.textbook',
'reqcrsotherdom.official','reqcrsotherdom.unofficial',
- 'reqcrsotherdom.community','reqcrsotherdom.textbook',
- 'requestauthor'],
+ 'reqcrsotherdom.community','reqcrsotherdom.textbook'],
$env{'form.ccdomain'},$env{'form.ccuname'});
my ($tmp) = keys(%userenv);
if ($tmp =~ /^(con_lost|error)/i) {
@@ -3161,7 +3403,7 @@ sub update_user_data {
%oldsettingstatus,%newsettingstatus);
@disporder = ('inststatus');
if ($env{'request.role.domain'} eq $env{'form.ccdomain'}) {
- push(@disporder,'requestcourses','requestauthor');
+ push(@disporder,('requestcourses','requestauthor','authordefaults'));
} else {
push(@disporder,'reqcrsotherdom');
}
@@ -3189,6 +3431,7 @@ sub update_user_data {
}
if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) {
$canshow{'requestauthor'} = 1;
+ $canshow{'authordefaults'} = 1;
}
my (%changeHash,%changed);
if ($oldinststatus eq '') {
@@ -3297,8 +3540,14 @@ sub update_user_data {
if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) {
&tool_changes('requestcourses',\@requestcourses,\%oldsettings,\%oldsettingstext,
\%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
- &tool_changes('requestauthor',\@requestauthor,\%oldsettings,\%oldsettingstext,
- \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
+ my ($isadv,$isauthor) =
+ &Apache::lonnet::is_advanced_user($env{'form.ccdomain'},$env{'form.ccuname'});
+ unless ($isauthor) {
+ &tool_changes('requestauthor',\@requestauthor,\%oldsettings,\%oldsettingstext,
+ \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
+ }
+ &tool_changes('authordefaults',\@authordefaults,\%oldsettings,\%oldsettingstext,
+ \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
} else {
&tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext,
\%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext);
@@ -3322,7 +3571,10 @@ sub update_user_data {
if ($chgresult eq 'ok') {
if (($env{'user.name'} eq $env{'form.ccuname'}) &&
($env{'user.domain'} eq $env{'form.ccdomain'})) {
- my %newenvhash;
+ my (%newenvhash,$got_domdefs,%domdefaults,$got_userenv,
+ %userenv);
+ my @fromenv = keys(%changed);
+ push(@fromenv,'inststatus');
foreach my $key (keys(%changed)) {
if (($key eq 'official') || ($key eq 'unofficial')
|| ($key eq 'community') || ($key eq 'textbook')) {
@@ -3331,18 +3583,56 @@ sub update_user_data {
if ($changeHash{'requestcourses.'.$key}) {
$newenvhash{'environment.canrequest.'.$key} = 1;
} else {
+ unless ($got_domdefs) {
+ %domdefaults =
+ &Apache::lonnet::get_domain_defaults($env{'user.domain'});
+ $got_domdefs = 1;
+ }
+ unless ($got_userenv) {
+ %userenv =
+ &Apache::lonnet::userenvironment($env{'user.domain'},
+ $env{'user.name'},@fromenv);
+ $got_userenv = 1;
+ }
$newenvhash{'environment.canrequest.'.$key} =
&Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
- $key,'reload','requestcourses');
+ $key,'reload','requestcourses',\%userenv,\%domdefaults);
}
} elsif ($key eq 'requestauthor') {
$newenvhash{'environment.'.$key} = $changeHash{$key};
if ($changeHash{$key}) {
$newenvhash{'environment.canrequest.author'} = 1;
} else {
+ unless ($got_domdefs) {
+ %domdefaults =
+ &Apache::lonnet::get_domain_defaults($env{'user.domain'});
+ $got_domdefs = 1;
+ }
+ unless ($got_userenv) {
+ %userenv =
+ &Apache::lonnet::userenvironment($env{'user.domain'},
+ $env{'user.name'},@fromenv);
+ $got_userenv = 1;
+ }
$newenvhash{'environment.canrequest.author'} =
&Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
- $key,'reload','requestauthor');
+ $key,'reload','requestauthor',\%userenv,\%domdefaults);
+ }
+ } elsif ($key eq 'editors') {
+ $newenvhash{'environment.author'.$key} = $changeHash{'author'.$key};
+ if ($env{'form.customeditors'}) {
+ $newenvhash{'environment.editors'} = $changeHash{'author'.$key};
+ } else {
+ unless ($got_domdefs) {
+ %domdefaults =
+ &Apache::lonnet::get_domain_defaults($env{'user.domain'});
+ $got_domdefs = 1;
+ }
+ if ($domdefaults{'editors'} ne '') {
+ $newenvhash{'environment.editors'} = $domdefaults{'editors'};
+ } else {
+ $newenvhash{'environment.editors'} = 'edit,xml';
+ }
}
} elsif ($key ne 'quota') {
$newenvhash{'environment.tools.'.$key} =
@@ -3351,9 +3641,20 @@ sub update_user_data {
$newenvhash{'environment.availabletools.'.$key} =
$changeHash{'tools.'.$key};
} else {
+ unless ($got_domdefs) {
+ %domdefaults =
+ &Apache::lonnet::get_domain_defaults($env{'user.domain'});
+ $got_domdefs = 1;
+ }
+ unless ($got_userenv) {
+ %userenv =
+ &Apache::lonnet::userenvironment($env{'user.domain'},
+ $env{'user.name'},@fromenv);
+ $got_userenv = 1;
+ }
$newenvhash{'environment.availabletools.'.$key} =
&Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},
- $key,'reload','tools');
+ $key,'reload','tools',\%userenv,\%domdefaults);
}
}
}
@@ -3542,7 +3843,11 @@ sub display_userinfo {
'requestauthor' => 'Can Request Author Role',
'inststatus' => "Affiliation",
'prvs' => 'Previous Value:',
- 'chto' => 'Changed To:'
+ 'chto' => 'Changed To:',
+ 'editors' => "Available Editors in Authoring Space",
+ 'edit' => 'Standard editor (Edit)',
+ 'xml' => 'Text editor (EditXML)',
+ 'daxe' => 'Daxe editor (Daxe)',
);
if ($changed) {
$r->print(''.$lt{'uic'}.' '.
@@ -3567,10 +3872,13 @@ sub display_userinfo {
}
foreach my $entry (@{$order}) {
if ($canshow->{$entry}) {
- if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom') || ($entry eq 'requestauthor')) {
+ if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom') ||
+ ($entry eq 'requestauthor') || ($entry eq 'authordefaults')) {
my @items;
if ($entry eq 'requestauthor') {
@items = ($entry);
+ } elsif ($entry eq 'authordefaults') {
+ @items = ('webdav','editors');
} else {
@items = @{$requestcourses};
}
@@ -3751,6 +4059,11 @@ sub tool_changes {
}
return;
}
+ my %tooldesc = &Apache::lonlocal::texthash(
+ 'edit' => 'Standard editor (Edit)',
+ 'xml' => 'Text editor (EditXML)',
+ 'daxe' => 'Daxe editor (Daxe)',
+ );
foreach my $tool (@{$usertools}) {
my ($newval,$limit,$envkey);
$envkey = $context.'.'.$tool;
@@ -3764,6 +4077,29 @@ sub tool_changes {
} elsif ($context eq 'requestauthor') {
$newval = $env{'form.'.$context};
$envkey = $context;
+ } elsif ($context eq 'authordefaults') {
+ if ($tool eq 'editors') {
+ $envkey = 'authoreditors';
+ if ($env{'form.customeditors'} == 1) {
+ my @editors;
+ my @posseditors = &Apache::loncommon::get_env_multiple('form.custom_editor');
+ if (@posseditors) {
+ foreach my $editor (@posseditors) {
+ if (grep(/^\Q$editor\E$/,@posseditors)) {
+ unless (grep(/^\Q$editor\E$/,@editors)) {
+ push(@editors,$editor);
+ }
+ }
+ }
+ }
+ if (@editors) {
+ $newval = join(',',(sort(@editors)));
+ }
+ }
+ } elsif ($tool eq 'webdav') {
+ $envkey = 'tools.webdav';
+ $newval = $env{'form.'.$context.'_'.$tool};
+ }
} else {
$newval = $env{'form.'.$context.'_'.$tool};
}
@@ -3782,6 +4118,17 @@ sub tool_changes {
} else {
$oldaccesstext->{$tool} = &mt("availability set to 'off'");
}
+ } elsif ($context eq 'authordefaults') {
+ if ($tool eq 'editors') {
+ $oldaccesstext->{$tool} = &mt('can use: [_1]',
+ join(', ', map { $tooldesc{$_} } split(/,/,$userenv->{$envkey})));
+ } elsif ($tool eq 'webdav') {
+ if ($userenv->{$envkey}) {
+ $oldaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $oldaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
} else {
if ($userenv->{$envkey}) {
$oldaccesstext->{$tool} = &mt("availability set to 'on'");
@@ -3808,6 +4155,17 @@ sub tool_changes {
} else {
$newaccesstext->{$tool} = &mt("availability set to 'off'");
}
+ } elsif ($context eq 'authordefaults') {
+ if ($tool eq 'editors') {
+ $newaccesstext->{$tool} = &mt('can use: [_1]',
+ join(', ', map { $tooldesc{$_} } split(/,/,$changeHash->{$envkey})));
+ } elsif ($tool eq 'webdav') {
+ if ($newval) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
} else {
if ($newval) {
$newaccesstext->{$tool} = &mt("availability set to 'on'");
@@ -3818,17 +4176,28 @@ sub tool_changes {
} else {
$newaccess->{$tool} = $oldaccess->{$tool};
if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
- if ($newval =~ /^autolimit/) {
+ if ($userenv->{$envkey} =~ /^autolimit/) {
if ($limit) {
$newaccesstext->{$tool} = &mt('available with automatic approval, up to limit of [quant,_1,request] per user',$limit);
} else {
$newaccesstext->{$tool} = &mt('available with automatic approval (unlimited)');
}
- } elsif ($newval) {
- $newaccesstext->{$tool} = $reqdisplay{$newval};
+ } elsif ($userenv->{$envkey}) {
+ $newaccesstext->{$tool} = $reqdisplay{$userenv->{$envkey}};
} else {
$newaccesstext->{$tool} = &mt("availability set to 'off'");
}
+ } elsif ($context eq 'authordefaults') {
+ if ($tool eq 'editors') {
+ $newaccesstext->{$tool} = &mt('can use: [_1]',
+ join(', ', map { $tooldesc{$_} } split(/,/,$userenv->{$envkey})));
+ } elsif ($tool eq 'webdav') {
+ if ($userenv->{$envkey}) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
} else {
if ($userenv->{$context.'.'.$tool}) {
$newaccesstext->{$tool} = &mt("availability set to 'on'");
@@ -3859,6 +4228,17 @@ sub tool_changes {
} else {
$newaccesstext->{$tool} = &mt("availability set to 'off'");
}
+ } elsif ($context eq 'authordefaults') {
+ if ($tool eq 'editors') {
+ $newaccesstext->{$tool} = &mt('can use: [_1]',
+ join(', ', map { $tooldesc{$_} } split(/,/,$newval)));
+ } elsif ($tool eq 'webdav') {
+ if ($userenv->{$envkey}) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
} else {
if ($userenv->{$context.'.'.$tool}) {
$newaccesstext->{$tool} = &mt("availability set to 'on'");
@@ -3887,6 +4267,17 @@ sub tool_changes {
} else {
$newaccesstext->{$tool} = &mt("availability set to 'off'");
}
+ } elsif ($context eq 'authordefaults') {
+ if ($tool eq 'editors') {
+ $newaccesstext->{$tool} = &mt('can use: [_1]',
+ join(', ', map { $tooldesc{$_} } split(/,/,$newval)));
+ } elsif ($tool eq 'webdav') {
+ if ($newval) {
+ $newaccesstext->{$tool} = &mt("availability set to 'on'");
+ } else {
+ $newaccesstext->{$tool} = &mt("availability set to 'off'");
+ }
+ }
} else {
if ($newval) {
$newaccesstext->{$tool} = &mt("availability set to 'on'");
@@ -4381,6 +4772,10 @@ sub tool_admin {
if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) {
$canchange = 1;
}
+ } elsif ($context eq 'authordefaults') {
+ if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) {
+ $canchange = 1;
+ }
} elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) {
# Current user has quota modification privileges
$canchange = 1;
@@ -4391,6 +4786,10 @@ sub tool_admin {
$toolchanged = 1;
if ($tool eq 'requestauthor') {
$changeHash->{$context} = $settool;
+ } elsif ($tool eq 'editors') {
+ $changeHash->{'author'.$tool} = $settool;
+ } elsif ($tool eq 'webdav') {
+ $changeHash->{'tools.'.$tool} = $settool;
} else {
$changeHash->{$context.'.'.$tool} = $settool;
}
@@ -9246,7 +9645,7 @@ sub course_level_dc {
ENDTIMEENTRY
$otheritems .= &Apache::loncommon::end_data_table_row().
&Apache::loncommon::end_data_table()."\n";
- return $cb_jscript.$header.$hiddenitems.$otheritems;
+ return $cb_jscript.$hiddenitems.$header.$otheritems;
}
sub update_selfenroll_config {