--- loncom/interface/loncreateuser.pm 2002/04/23 21:05:45 1.33
+++ loncom/interface/loncreateuser.pm 2022/10/18 23:28:00 1.460
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Create a user
#
-# $Id: loncreateuser.pm,v 1.33 2002/04/23 21:05:45 matthew Exp $
+# $Id: loncreateuser.pm,v 1.460 2022/10/18 23:28:00 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,811 +25,9652 @@
#
# http://www.lon-capa.org/
#
-# (Create a course
-# (My Desk
-#
-# (Internal Server Error Handler
-#
-# (Login Screen
-# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,
-# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)
-#
-# YEAR=2001
-# 3/1/1 Gerd Kortemeyer)
-#
-# 3/1 Gerd Kortemeyer)
-#
-# 2/14 Gerd Kortemeyer)
-#
-# 2/14,2/17,2/19,2/20,2/21,2/22,2/23,3/2,3/17,3/24,04/12 Gerd Kortemeyer
-# April Guy Albertelli
-# 05/10,10/16 Gerd Kortemeyer
-# 11/12,11/13,11/15 Scott Harrison
-# 02/11/02 Matthew Hall
-#
-# $Id: loncreateuser.pm,v 1.33 2002/04/23 21:05:45 matthew Exp $
###
package Apache::loncreateuser;
+=pod
+
+=head1 NAME
+
+Apache::loncreateuser.pm
+
+=head1 SYNOPSIS
+
+ Handler to create users and custom roles
+
+ Provides an Apache handler for creating users,
+ editing their login parameters, roles, and removing roles, and
+ also creating and assigning custom roles.
+
+=head1 OVERVIEW
+
+=head2 Custom Roles
+
+In LON-CAPA, roles are actually collections of privileges. "Teaching
+Assistant", "Course Coordinator", and other such roles are really just
+collection of privileges that are useful in many circumstances.
+
+Custom roles can be defined by a Domain Coordinator, Course Coordinator
+or Community Coordinator via the Manage User functionality.
+The custom role editor screen will show all privileges which can be
+assigned to users. For a complete list of privileges, please see
+C.
+
+Custom role definitions are stored in the C file of the creator
+of the role.
+
+=cut
+
use strict;
use Apache::Constants qw(:common :http);
use Apache::lonnet;
+use Apache::loncommon;
+use Apache::lonlocal;
+use Apache::longroup;
+use Apache::lonuserutils;
+use Apache::loncoursequeueadmin;
+use LONCAPA qw(:DEFAULT :match);
+use HTML::Entities;
my $loginscript; # piece of javascript used in two separate instances
-my $generalrule;
my $authformnop;
my $authformkrb;
my $authformint;
my $authformfsys;
my $authformloc;
+my $authformlti;
-BEGIN {
- $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
- my $krbdefdom=$1;
- $krbdefdom=~tr/a-z/A-Z/;
- my %param = ( formname => 'document.cu',
- kerb_def_dom => $krbdefdom
- );
+sub initialize_authen_forms {
+ my ($dom,$formname,$curr_authtype,$mode) = @_;
+ my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($dom);
+ my %param = ( formname => $formname,
+ kerb_def_dom => $krbdefdom,
+ kerb_def_auth => $krbdef,
+ domain => $dom,
+ );
+ my %abv_auth = &auth_abbrev();
+ if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix|lti):(.*)$/) {
+ my $long_auth = $1;
+ my $curr_autharg = $2;
+ my %abv_auth = &auth_abbrev();
+ $param{'curr_authtype'} = $abv_auth{$long_auth};
+ if ($long_auth =~ /^krb(4|5)$/) {
+ $param{'curr_kerb_ver'} = $1;
+ $param{'curr_autharg'} = $curr_autharg;
+ }
+ if ($mode eq 'modifyuser') {
+ $param{'mode'} = $mode;
+ }
+ }
$loginscript = &Apache::loncommon::authform_header(%param);
- $generalrule = &Apache::loncommon::authform_authorwarning(%param);
- $authformnop = &Apache::loncommon::authform_nochange(%param);
$authformkrb = &Apache::loncommon::authform_kerberos(%param);
+ $authformnop = &Apache::loncommon::authform_nochange(%param);
$authformint = &Apache::loncommon::authform_internal(%param);
$authformfsys = &Apache::loncommon::authform_filesystem(%param);
$authformloc = &Apache::loncommon::authform_local(%param);
+ $authformlti = &Apache::loncommon::authform_lti(%param);
}
-# =================================================================== Phase one
+sub auth_abbrev {
+ my %abv_auth = (
+ krb5 => 'krb',
+ krb4 => 'krb',
+ internal => 'int',
+ localauth => 'loc',
+ unix => 'fsys',
+ lti => 'lti',
+ );
+ return %abv_auth;
+}
-sub phase_one {
- my $r=shift;
- my $defdom=$ENV{'user.domain'};
- my @domains = &Apache::loncommon::get_domains();
- my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
- $r->print(<<"ENDDOCUMENT");
-
-
-The LearningOnline Network with CAPA
-
-
-Create User, Change User Privileges
-
-
-
-ENDDOCUMENT
+# ====================================================
+
+sub user_quotas {
+ my ($ccuname,$ccdomain) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ 'usrt' => "User Tools",
+ 'cust' => "Custom quota",
+ 'chqu' => "Change quota",
+ );
+
+ my $quota_javascript = <<"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();
-# =================================================================== Phase two
-sub phase_two {
- my $r=shift;
- my $ccuname=$ENV{'form.ccuname'};
- my $ccdomain=$ENV{'form.ccdomain'};
-
- $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
- my $krbdefdom=$1;
- $krbdefdom=~tr/a-z/A-Z/;
- my %param = ( formname => 'document.cu',
- kerb_def_dom => $krbdefdom
+ 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};
+ }
+ }
+ }
+ my ($showquota,$custom_on,$custom_off,$defaultinfo);
+ $custom_on = ' ';
+ $custom_off = ' checked="checked" ';
+ 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, as determined by the user's institutional".
+ " affiliation ([_2]).",$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, is determined by the user's institutional".
+ " affiliation ([_2]).",$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";
+ }
+ }
+ $output .= &Apache::loncommon::end_data_table();
+ return $output;
+}
+
+sub build_tools_display {
+ my ($ccuname,$ccdomain,$context) = @_;
+ my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay,
+ $colspan,$isadv,%domconfig);
+ 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)",
+ 'portfolio' => "Personal User Portfolio",
+ 'timezone' => "Can set Time Zone",
+ 'avai' => "Available",
+ 'cusa' => "availability",
+ 'chse' => "Change setting",
+ 'usde' => "Use default",
+ 'uscu' => "Use custom",
+ 'official' => 'Can request creation of official courses',
+ 'unofficial' => 'Can request creation of unofficial courses',
+ 'community' => 'Can request creation of communities',
+ 'textbook' => 'Can request creation of textbook courses',
+ 'placement' => 'Can request creation of placement tests',
+ 'lti' => 'Can request creation of LTI courses',
+ 'requestauthor' => 'Can request author space',
+ );
+ if ($context eq 'requestcourses') {
+ %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
+ 'requestcourses.official','requestcourses.unofficial',
+ 'requestcourses.community','requestcourses.textbook',
+ 'requestcourses.placement','requestcourses.lti');
+ @usertools = ('official','unofficial','community','textbook','placement','lti');
+ @options =('norequest','approval','autolimit','validate');
+ %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain);
+ %reqtitles = &courserequest_titles();
+ %reqdisplay = &courserequest_display();
+ $colspan = ' colspan="2"';
+ %domconfig =
+ &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain);
+ $isadv = &Apache::lonnet::is_advanced_user($ccdomain,$ccuname);
+ } elsif ($context eq '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);
+ } else {
+ %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
+ 'tools.aboutme','tools.portfolio','tools.blog',
+ 'tools.webdav','tools.timezone');
+ @usertools = ('aboutme','blog','webdav','portfolio','timezone');
+ }
+ foreach my $item (@usertools) {
+ my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off,
+ $currdisp,$custdisp,$custradio);
+ $cust_off = 'checked="checked" ';
+ $tool_on = 'checked="checked" ';
+ $curr_access =
+ &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef,
+ $context);
+ if ($context eq 'requestauthor') {
+ if ($userenv{$context} ne '') {
+ $cust_on = ' checked="checked" ';
+ $cust_off = '';
+ }
+ } elsif ($userenv{$context.'.'.$item} ne '') {
+ $cust_on = ' checked="checked" ';
+ $cust_off = '';
+ }
+ if ($context eq 'requestcourses') {
+ if ($userenv{$context.'.'.$item} eq '') {
+ $custom_access = &mt('Currently from default setting.');
+ } else {
+ $custom_access = &mt('Currently from custom setting.');
+ }
+ } elsif ($context eq 'requestauthor') {
+ if ($userenv{$context} eq '') {
+ $custom_access = &mt('Currently from default setting.');
+ } else {
+ $custom_access = &mt('Currently from custom setting.');
+ }
+ } else {
+ if ($userenv{$context.'.'.$item} eq '') {
+ $custom_access =
+ &mt('Availability determined currently from default setting.');
+ if (!$curr_access) {
+ $tool_off = 'checked="checked" ';
+ $tool_on = '';
+ }
+ } else {
+ $custom_access =
+ &mt('Availability determined currently from custom setting.');
+ if ($userenv{$context.'.'.$item} == 0) {
+ $tool_off = 'checked="checked" ';
+ $tool_on = '';
+ }
+ }
+ }
+ $output .= ' '."\n".
+ ' '.$lt{$item}.' '."\n".
+ ' '."\n".
+ &Apache::loncommon::start_data_table_row()."\n";
+
+ if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
+ my ($curroption,$currlimit);
+ my $envkey = $context.'.'.$item;
+ if ($context eq 'requestauthor') {
+ $envkey = $context;
+ }
+ if ($userenv{$envkey} ne '') {
+ $curroption = $userenv{$envkey};
+ } else {
+ my (@inststatuses);
+ if ($context eq 'requestcourses') {
+ $curroption =
+ &Apache::loncoursequeueadmin::get_processtype('course',$ccuname,$ccdomain,
+ $isadv,$ccdomain,$item,
+ \@inststatuses,\%domconfig);
+ } else {
+ $curroption =
+ &Apache::loncoursequeueadmin::get_processtype('requestauthor',$ccuname,$ccdomain,
+ $isadv,$ccdomain,undef,
+ \@inststatuses,\%domconfig);
+ }
+ }
+ if (!$curroption) {
+ $curroption = 'norequest';
+ }
+ if ($curroption =~ /^autolimit=(\d*)$/) {
+ $currlimit = $1;
+ if ($currlimit eq '') {
+ $currdisp = &mt('Yes, automatic creation');
+ } else {
+ $currdisp = &mt('Yes, up to [quant,_1,request]/user',$currlimit);
+ }
+ } 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;
+ }
+ $custdisp = ''.
+ ' '.&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 .=
+ &Apache::loncommon::start_data_table_row()."\n".
+ ' '.
+ $lt{'chse'}.': '.
+ ' '.$lt{'usde'}.' '.(' ' x3).
+ ' '.$lt{'uscu'}.' '.$custradio.' '.
+ &Apache::loncommon::end_data_table_row()."\n";
+ }
+ }
+ return $output;
+}
+
+sub coursereq_externaluser {
+ my ($ccuname,$ccdomain,$cdom) = @_;
+ my (@usertools,@options,%validations,%userenv,$output);
+ my %lt = &Apache::lonlocal::texthash (
+ 'official' => 'Can request creation of official courses',
+ 'unofficial' => 'Can request creation of unofficial courses',
+ 'community' => 'Can request creation of communities',
+ 'textbook' => 'Can request creation of textbook courses',
+ 'placement' => 'Can request creation of placement tests',
+ );
+
+ %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,
+ 'reqcrsotherdom.official','reqcrsotherdom.unofficial',
+ 'reqcrsotherdom.community','reqcrsotherdom.textbook',
+ 'reqcrsotherdom.placement');
+ @usertools = ('official','unofficial','community','textbook','placement');
+ @options = ('approval','validate','autolimit');
+ %validations = &Apache::lonnet::auto_courserequest_checks($cdom);
+ my $optregex = join('|',@options);
+ my %reqtitles = &courserequest_titles();
+ foreach my $item (@usertools) {
+ my ($curroption,$currlimit,$tooloff);
+ if ($userenv{'reqcrsotherdom.'.$item} ne '') {
+ my @curr = split(',',$userenv{'reqcrsotherdom.'.$item});
+ foreach my $req (@curr) {
+ if ($req =~ /^\Q$cdom\E\:($optregex)=?(\d*)$/) {
+ $curroption = $1;
+ $currlimit = $2;
+ last;
+ }
+ }
+ if (!$curroption) {
+ $curroption = 'norequest';
+ $tooloff = ' checked="checked"';
+ }
+ } else {
+ $curroption = 'norequest';
+ $tooloff = ' checked="checked"';
+ }
+ $output.= &Apache::loncommon::start_data_table_row()."\n".
+ ' '.$lt{$item}.': '.
+ ' '."\n".
+ &Apache::loncommon::end_data_table_row()."\n";
+ }
+ return $output;
+}
+
+sub domainrole_req {
+ my ($ccuname,$ccdomain) = @_;
+ return ''.
+ &mt('User Can Request Assignment of Domain Roles?').
+ ' '."\n".
+ &Apache::loncommon::start_data_table().
+ &build_tools_display($ccuname,$ccdomain,
+ 'requestauthor').
+ &Apache::loncommon::end_data_table();
+}
+
+sub courserequest_titles {
+ my %titles = &Apache::lonlocal::texthash (
+ official => 'Official',
+ unofficial => 'Unofficial',
+ community => 'Communities',
+ textbook => 'Textbook',
+ placement => 'Placement Tests',
+ lti => 'LTI Provider',
+ norequest => 'Not allowed',
+ approval => 'Approval by Dom. Coord.',
+ validate => 'With validation',
+ autolimit => 'Numerical limit',
+ unlimited => '(blank for unlimited)',
+ );
+ return %titles;
+}
+
+sub courserequest_display {
+ my %titles = &Apache::lonlocal::texthash (
+ approval => 'Yes, need approval',
+ validate => 'Yes, with validation',
+ norequest => 'No',
+ );
+ return %titles;
+}
+
+sub requestauthor_titles {
+ my %titles = &Apache::lonlocal::texthash (
+ norequest => 'Not allowed',
+ approval => 'Approval by Dom. Coord.',
+ automatic => 'Automatic approval',
+ );
+ return %titles;
+
+}
+
+sub requestauthor_display {
+ my %titles = &Apache::lonlocal::texthash (
+ approval => 'Yes, need approval',
+ automatic => 'Yes, automatic approval',
+ norequest => 'No',
+ );
+ return %titles;
+}
+
+sub requestchange_display {
+ my %titles = &Apache::lonlocal::texthash (
+ approval => "availability set to 'on' (approval required)",
+ automatic => "availability set to 'on' (automatic approval)",
+ norequest => "availability set to 'off'",
+ );
+ return %titles;
+}
+
+sub curr_requestauthor {
+ my ($uname,$udom,$isadv,$inststatuses,$domconfig) = @_;
+ return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));
+ if ($uname eq '' || $udom eq '') {
+ $uname = $env{'user.name'};
+ $udom = $env{'user.domain'};
+ $isadv = $env{'user.adv'};
+ }
+ my (%userenv,%settings,$val);
+ my @options = ('automatic','approval');
+ %userenv =
+ &Apache::lonnet::userenvironment($udom,$uname,'requestauthor','inststatus');
+ if ($userenv{'requestauthor'}) {
+ $val = $userenv{'requestauthor'};
+ @{$inststatuses} = ('_custom_');
+ } else {
+ my %alltasks;
+ if (ref($domconfig->{'requestauthor'}) eq 'HASH') {
+ %settings = %{$domconfig->{'requestauthor'}};
+ if (($isadv) && ($settings{'_LC_adv'} ne '')) {
+ $val = $settings{'_LC_adv'};
+ @{$inststatuses} = ('_LC_adv_');
+ } else {
+ if ($userenv{'inststatus'} ne '') {
+ @{$inststatuses} = split(',',$userenv{'inststatus'});
+ } else {
+ @{$inststatuses} = ('default');
+ }
+ foreach my $status (@{$inststatuses}) {
+ if (exists($settings{$status})) {
+ my $value = $settings{$status};
+ next unless ($value);
+ unless (exists($alltasks{$value})) {
+ if (ref($alltasks{$value}) eq 'ARRAY') {
+ unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {
+ push(@{$alltasks{$value}},$status);
+ }
+ } else {
+ @{$alltasks{$value}} = ($status);
+ }
+ }
+ }
+ }
+ foreach my $option (@options) {
+ if ($alltasks{$option}) {
+ $val = $option;
+ last;
+ }
+ }
+ }
+ }
+ }
+ return $val;
+}
+
+# =================================================================== Phase one
+
+sub print_username_entry_form {
+ my ($r,$context,$response,$srch,$forcenewuser,$crstype,$brcrum,
+ $permission) = @_;
+ my $defdom=$env{'request.role.domain'};
+ my $formtoset = 'crtuser';
+ if (exists($env{'form.startrolename'})) {
+ $formtoset = 'docustom';
+ $env{'form.rolename'} = $env{'form.startrolename'};
+ } elsif ($env{'form.origform'} eq 'crtusername') {
+ $formtoset = $env{'form.origform'};
+ }
+
+ my ($jsback,$elements) = &crumb_utilities();
+
+ my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n".
+ ''."\n";
+
+ my %existingroles=&Apache::lonuserutils::my_custom_roles($crstype);
+ if (($env{'form.action'} eq 'custom') && (keys(%existingroles) > 0)
+ && (&Apache::lonnet::allowed('mcr','/'))) {
+ $jscript .= &customrole_javascript();
+ }
+ my $helpitem = 'Course_Change_Privileges';
+ if ($env{'form.action'} eq 'custom') {
+ if ($context eq 'course') {
+ $helpitem = 'Course_Editing_Custom_Roles';
+ } elsif ($context eq 'domain') {
+ $helpitem = 'Domain_Editing_Custom_Roles';
+ }
+ } elsif ($env{'form.action'} eq 'singlestudent') {
+ $helpitem = 'Course_Add_Student';
+ } elsif ($env{'form.action'} eq 'accesslogs') {
+ $helpitem = 'Domain_User_Access_Logs';
+ } elsif ($context eq 'author') {
+ $helpitem = 'Author_Change_Privileges';
+ } elsif ($context eq 'domain') {
+ if ($permission->{'cusr'}) {
+ $helpitem = 'Domain_Change_Privileges';
+ } elsif ($permission->{'view'}) {
+ $helpitem = 'Domain_View_Privileges';
+ } else {
+ undef($helpitem);
+ }
+ }
+ my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$defdom);
+ if ($env{'form.action'} eq 'custom') {
+ push(@{$brcrum},
+ {href=>"javascript:backPage(document.crtuser)",
+ text=>"Pick custom role",
+ help => $helpitem,}
+ );
+ } else {
+ push (@{$brcrum},
+ {href => "javascript:backPage(document.crtuser)",
+ text => $breadcrumb_text{'search'},
+ help => $helpitem,
+ faq => 282,
+ bug => 'Instructor Interface',}
);
- $loginscript = &Apache::loncommon::authform_header(%param);
+ }
+ my %loaditems = (
+ 'onload' => "javascript:setFormElements(document.$formtoset)",
+ );
+ my $args = {bread_crumbs => $brcrum,
+ bread_crumbs_component => 'User Management',
+ add_entries => \%loaditems,};
+ $r->print(&Apache::loncommon::start_page('User Management',$jscript,$args));
- my $defdom=$ENV{'user.domain'};
+ my %lt=&Apache::lonlocal::texthash(
+ 'srst' => 'Search for a user and enroll as a student',
+ 'srme' => 'Search for a user and enroll as a member',
+ 'srad' => 'Search for a user and modify/add user information or roles',
+ 'srvu' => 'Search for a user and view user information and roles',
+ 'srva' => 'Search for a user and view access log information',
+ 'usr' => "Username",
+ 'dom' => "Domain",
+ 'ecrp' => "Define or Edit Custom Role",
+ 'nr' => "role name",
+ 'cre' => "Next",
+ );
- $ccuname=~s/\W//g;
- $ccdomain=~s/\W//g;
- my $dochead =<<"ENDDOCHEAD";
-
-
-The LearningOnline Network with CAPA
-
+END
+ return $js;
+}
+sub entry_form {
+ my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype,$fixeddom) = @_;
+ my ($usertype,$inexact);
+ if (ref($srch) eq 'HASH') {
+ if (($srch->{'srchin'} eq 'dom') &&
+ ($srch->{'srchby'} eq 'uname') &&
+ ($srch->{'srchtype'} eq 'exact') &&
+ ($srch->{'srchdomain'} ne '') &&
+ ($srch->{'srchterm'} ne '')) {
+ my (%curr_rules,%got_rules);
+ my ($rules,$ruleorder) =
+ &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username');
+ $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules,\%curr_rules,\%got_rules);
+ } else {
+ $inexact = 1;
+ }
+ }
+ my ($cancreate,$noinstd);
+ if ($env{'form.action'} eq 'accesslogs') {
+ $noinstd = 1;
+ } else {
+ $cancreate =
+ &Apache::lonuserutils::can_create_user($dom,$context,$usertype);
+ }
+ my ($userpicker,$cansearch) =
+ &Apache::loncommon::user_picker($dom,$srch,$forcenewuser,
+ 'document.crtuser',$cancreate,$usertype,$context,$fixeddom,$noinstd);
+ my $srchbutton = &mt('Search');
+ if ($env{'form.action'} eq 'singlestudent') {
+ $srchbutton = &mt('Search and Enroll');
+ } elsif ($env{'form.action'} eq 'accesslogs') {
+ $srchbutton = &mt('Search');
+ } elsif ($cancreate && $responsemsg ne '' && $inexact) {
+ $srchbutton = &mt('Search or Add New User');
+ }
+ my $output;
+ if ($cansearch) {
+ $output = <<"ENDBLOCK";
+
+ENDBLOCK
+ } else {
+ $output = ''.$userpicker.'
';
}
+ if (($env{'form.phase'} eq '') && ($env{'form.action'} ne 'accesslogs') &&
+ (!(($env{'form.action'} eq 'singleuser') && ($context eq 'domain') &&
+ (!&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))))) {
+ my $defdom=$env{'request.role.domain'};
+ my ($trusted,$untrusted);
+ if ($context eq 'course') {
+ ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$defdom);
+ } elsif ($context eq 'author') {
+ ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('othcoau',$defdom);
+ } elsif ($context eq 'domain') {
+ ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('domroles',$defdom);
+ }
+ my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain',undef,undef,undef,$trusted,$untrusted);
+ my %lt=&Apache::lonlocal::texthash(
+ 'enro' => 'Enroll one student',
+ 'enrm' => 'Enroll one member',
+ 'admo' => 'Add/modify a single user',
+ 'crea' => 'create new user if required',
+ 'uskn' => "username is known",
+ 'crnu' => 'Create a new user',
+ 'usr' => 'Username',
+ 'dom' => 'in domain',
+ 'enrl' => 'Enroll',
+ 'cram' => 'Create/Modify user',
+ );
+ my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain');
+ my ($title,$buttontext,$showresponse);
+ if ($env{'form.action'} eq 'singlestudent') {
+ if ($crstype eq 'Community') {
+ $title = $lt{'enrm'};
+ } else {
+ $title = $lt{'enro'};
+ }
+ $buttontext = $lt{'enrl'};
+ } else {
+ $title = $lt{'admo'};
+ $buttontext = $lt{'cram'};
+ }
+ if ($cancreate) {
+ $title .= ' ('.$lt{'crea'}.') ';
+ } else {
+ $title .= ' ('.$lt{'uskn'}.') ';
+ }
+ if ($env{'form.origform'} eq 'crtusername') {
+ $showresponse = $responsemsg;
+ }
+ $output .= <<"ENDDOCUMENT";
+
+
+ENDDOCUMENT
+ }
+ return $output;
+}
+
+sub user_modification_js {
+ my ($pjump_def,$dc_setcourse_code,$nondc_setsection_code,$groupslist)=@_;
+
+ return <
+//
+
+END
+}
+
+# =================================================================== Phase two
+sub print_user_selection_page {
+ my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype,$brcrum) = @_;
+ my @fields = ('username','domain','lastname','firstname','permanentemail');
+ my $sortby = $env{'form.sortby'};
+
+ if (!grep(/^\Q$sortby\E$/,@fields)) {
+ $sortby = 'lastname';
}
+ my ($jsback,$elements) = &crumb_utilities();
+
+ my $jscript = (<
+//
-
-
-
-ENDDOCHEAD
+ENDSCRIPT
+
+ my %lt=&Apache::lonlocal::texthash(
+ 'usrch' => "User Search to add/modify roles",
+ 'stusrch' => "User Search to enroll student",
+ 'memsrch' => "User Search to enroll member",
+ 'srcva' => "Search for a user and view access log information",
+ 'usrvu' => "User Search to view user roles",
+ 'usel' => "Select a user to add/modify roles",
+ 'suvr' => "Select a user to view roles",
+ 'stusel' => "Select a user to enroll as a student",
+ 'memsel' => "Select a user to enroll as a member",
+ 'vacsel' => "Select a user to view access log",
+ 'username' => "username",
+ 'domain' => "domain",
+ 'lastname' => "last name",
+ 'firstname' => "first name",
+ 'permanentemail' => "permanent e-mail",
+ );
+ if ($context eq 'requestcrs') {
+ $r->print('');
+ } else {
+ my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$srch->{'srchdomain'});
+ my $helpitem;
+ if ($env{'form.action'} eq 'singleuser') {
+ $helpitem = 'Course_Change_Privileges';
+ } elsif ($env{'form.action'} eq 'singlestudent') {
+ $helpitem = 'Course_Add_Student';
+ } elsif ($context eq 'author') {
+ $helpitem = 'Author_Change_Privileges';
+ } elsif ($context eq 'domain') {
+ $helpitem = 'Domain_Change_Privileges';
+ }
+ push (@{$brcrum},
+ {href => "javascript:backPage(document.usersrchform,'','')",
+ text => $breadcrumb_text{'search'},
+ faq => 282,
+ bug => 'Instructor Interface',},
+ {href => "javascript:backPage(document.usersrchform,'get_user_info','select')",
+ text => $breadcrumb_text{'userpicked'},
+ faq => 282,
+ bug => 'Instructor Interface',
+ help => $helpitem}
+ );
+ $r->print(&Apache::loncommon::start_page('User Management',$jscript,{bread_crumbs => $brcrum}));
+ if ($env{'form.action'} eq 'singleuser') {
+ my $readonly;
+ if (($context eq 'domain') && (!&Apache::lonnet::allowed('mau',$srch->{'srchdomain'}))) {
+ $readonly = 1;
+ $r->print("
$lt{'usrvu'} ");
+ } else {
+ $r->print("
$lt{'usrch'} ");
+ }
+ $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
+ if ($readonly) {
+ $r->print('
'.$lt{'suvr'}.' ');
+ } else {
+ $r->print('
'.$lt{'usel'}.' ');
+ }
+ } elsif ($env{'form.action'} eq 'singlestudent') {
+ $r->print($jscript."
");
+ if ($crstype eq 'Community') {
+ $r->print($lt{'memsrch'});
+ } else {
+ $r->print($lt{'stusrch'});
+ }
+ $r->print(" ");
+ $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype));
+ $r->print('
');
+ if ($crstype eq 'Community') {
+ $r->print($lt{'memsel'});
+ } else {
+ $r->print($lt{'stusel'});
+ }
+ $r->print(' ');
+ } elsif ($env{'form.action'} eq 'accesslogs') {
+ $r->print("
$lt{'srcva'} ");
+ $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,undef,1));
+ $r->print('
'.$lt{'vacsel'}.' ');
+ }
+ }
+ $r->print('
');
+ } else {
+ $r->print($response.'');
+ }
+}
+
+sub print_user_query_page {
+ my ($r,$caller,$brcrum) = @_;
+# FIXME - this is for a network-wide name search (similar to catalog search)
+# To use frames with similar behavior to catalog/portfolio search.
+# To be implemented.
+ return;
+}
+
+sub print_user_modification_page {
+ my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype,
+ $brcrum,$showcredits) = @_;
+ if (($ccuname eq '') || ($ccdomain eq '')) {
+ my $usermsg = &mt('No username and/or domain provided.');
+ $env{'form.phase'} = '';
+ &print_username_entry_form($r,$context,$usermsg,'','',$crstype,$brcrum,
+ $permission);
+ return;
+ }
+ my ($form,$formname);
+ if ($env{'form.action'} eq 'singlestudent') {
+ $form = 'document.enrollstudent';
+ $formname = 'enrollstudent';
+ } else {
+ $form = 'document.cu';
+ $formname = 'cu';
+ }
+ my %abv_auth = &auth_abbrev();
+ my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules);
+ my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
+ if ($uhome eq 'no_host') {
+ my $usertype;
+ my ($rules,$ruleorder) =
+ &Apache::lonnet::inst_userrules($ccdomain,'username');
+ $usertype =
+ &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules,
+ \%curr_rules,\%got_rules);
+ my $cancreate =
+ &Apache::lonuserutils::can_create_user($ccdomain,$context,
+ $usertype);
+ if (!$cancreate) {
+ my $helplink = 'javascript:helpMenu('."'display'".')';
+ my %usertypetext = (
+ official => 'institutional',
+ unofficial => 'non-institutional',
+ );
+ my $response;
+ if ($env{'form.origform'} eq 'crtusername') {
+ $response = ''.
+ &mt('No match found for the username [_1] in LON-CAPA domain: [_2]',
+ ''.$ccuname.' ',$ccdomain).
+ ' ';
+ }
+ $response .= ''
+ .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
+ .' ';
+ if ($context eq 'domain') {
+ $response .= &mt('Please contact a [_1] for assistance.',
+ &Apache::lonnet::plaintext('dc'));
+ } else {
+ $response .= &mt('Please contact the [_1]helpdesk[_2] for assistance.'
+ ,'',' ');
+ }
+ $response .= '
';
+ $env{'form.phase'} = '';
+ &print_username_entry_form($r,$context,$response,undef,undef,$crstype,$brcrum,
+ $permission);
+ return;
+ }
+ $newuser = 1;
+ my $checkhash;
+ my $checks = { 'username' => 1 };
+ $checkhash->{$ccuname.':'.$ccdomain} = { 'newuser' => $newuser };
+ &Apache::loncommon::user_rule_check($checkhash,$checks,
+ \%alerts,\%rulematch,\%inst_results,\%curr_rules,\%got_rules);
+ if (ref($alerts{'username'}) eq 'HASH') {
+ if (ref($alerts{'username'}{$ccdomain}) eq 'HASH') {
+ my $domdesc =
+ &Apache::lonnet::domain($ccdomain,'description');
+ if ($alerts{'username'}{$ccdomain}{$ccuname}) {
+ my $userchkmsg;
+ if (ref($curr_rules{$ccdomain}) eq 'HASH') {
+ $userchkmsg =
+ &Apache::loncommon::instrule_disallow_msg('username',
+ $domdesc,1).
+ &Apache::loncommon::user_rule_formats($ccdomain,
+ $domdesc,$curr_rules{$ccdomain}{'username'},
+ 'username');
+ }
+ $env{'form.phase'} = '';
+ &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype,$brcrum,
+ $permission);
+ return;
+ }
+ }
+ }
+ } else {
+ $newuser = 0;
+ }
+ if ($response) {
+ $response = ' '.$response;
+ }
+
+ my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
+ my $dc_setcourse_code = '';
+ my $nondc_setsection_code = '';
+ my %loaditem;
+
+ my $groupslist = &Apache::lonuserutils::get_groupslist();
+
+ my $js = &validation_javascript($context,$ccdomain,$pjump_def,$crstype,
+ $groupslist,$newuser,$formname,\%loaditem);
+ my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$ccdomain);
+ my $helpitem = 'Course_Change_Privileges';
+ if ($env{'form.action'} eq 'singlestudent') {
+ $helpitem = 'Course_Add_Student';
+ } elsif ($context eq 'author') {
+ $helpitem = 'Author_Change_Privileges';
+ } elsif ($context eq 'domain') {
+ $helpitem = 'Domain_Change_Privileges';
+ }
+ push (@{$brcrum},
+ {href => "javascript:backPage($form)",
+ text => $breadcrumb_text{'search'},
+ faq => 282,
+ bug => 'Instructor Interface',});
+ if ($env{'form.phase'} eq 'userpicked') {
+ push(@{$brcrum},
+ {href => "javascript:backPage($form,'get_user_info','select')",
+ text => $breadcrumb_text{'userpicked'},
+ faq => 282,
+ bug => 'Instructor Interface',});
+ }
+ push(@{$brcrum},
+ {href => "javascript:backPage($form,'$env{'form.phase'}','modify')",
+ text => $breadcrumb_text{'modify'},
+ faq => 282,
+ bug => 'Instructor Interface',
+ help => $helpitem});
+ my $args = {'add_entries' => \%loaditem,
+ 'bread_crumbs' => $brcrum,
+ 'bread_crumbs_component' => 'User Management'};
+ if ($env{'form.popup'}) {
+ $args->{'no_nav_bar'} = 1;
+ }
+ my $start_page =
+ &Apache::loncommon::start_page('User Management',$js,$args);
+
my $forminfo =<<"ENDFORMINFO";
-
-Home Server: $home_server_list
-
-Login Data
-$generalrule
-$authformkrb
-$authformint
-$authformfsys
-$authformloc
-ENDNEWUSER
+ENDTITLE
+ if ($env{'form.action'} eq 'singlestudent') {
+ if ($crstype eq 'Community') {
+ $title = &mt('Create New User [_1] in domain [_2] as a member',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ } else {
+ $title = &mt('Create New User [_1] in domain [_2] as a student',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ }
+ } else {
+ $title = &mt('Create New User [_1] in domain [_2]',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ }
+ $r->print(''.$title.' '."\n");
+ $r->print('');
+ $r->print(&personal_data_display($ccuname,$ccdomain,$newuser,$context,
+ $inst_results{$ccuname.':'.$ccdomain}));
+ # 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',
+ 'default','hide');
+ if ($numlib > 1) {
+ $r->print("
+
+$lt{'hs'}: $home_server_pick
+ ");
+ } else {
+ $r->print($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?').' '.
+ &Apache::loncommon::start_data_table().
+ &build_tools_display($ccuname,$ccdomain,
+ 'requestcourses').
+ &Apache::loncommon::end_data_table());
+ }
+ $r->print(''."\n".'
'.
+ $lt{'lg'}.' ');
+ my ($fixedauth,$varauth,$authmsg);
+ if (ref($rulematch{$ccuname.':'.$ccdomain}) eq 'HASH') {
+ my $matchedrule = $rulematch{$ccuname.':'.$ccdomain}{'username'};
+ my ($rules,$ruleorder) =
+ &Apache::lonnet::inst_userrules($ccdomain,'username');
+ if (ref($rules) eq 'HASH') {
+ if (ref($rules->{$matchedrule}) eq 'HASH') {
+ my $authtype = $rules->{$matchedrule}{'authtype'};
+ if ($authtype !~ /^(krb4|krb5|int|fsys|loc)$/) {
+ $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
+ } else {
+ my $authparm = $rules->{$matchedrule}{'authparm'};
+ $authmsg = $rules->{$matchedrule}{'authmsg'};
+ if ($authtype =~ /^krb(4|5)$/) {
+ my $ver = $1;
+ if ($authparm ne '') {
+ $fixedauth = <<"KERB";
+
+
+
+KERB
+ }
+ } else {
+ $fixedauth =
+' '."\n";
+ if ($rules->{$matchedrule}{'authparmfixed'}) {
+ $fixedauth .=
+' '."\n";
+ } else {
+ if ($authtype eq 'int') {
+ $varauth = ' '.
+&mt('[_1] Internally authenticated (with initial password [_2])','',' ')." ".&mt('Visible input').' ';
+ } elsif ($authtype eq 'loc') {
+ $varauth = ' '.
+&mt('[_1] Local Authentication with argument [_2]','',' ')."\n";
+ } else {
+ $varauth =
+' '."\n";
+ }
+ }
+ }
+ }
+ } else {
+ $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
+ }
+ }
+ if ($authmsg) {
+ $r->print(<print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc));
+ }
+ $r->print($portfolioform.$domroleform);
+ if ($env{'form.action'} eq 'singlestudent') {
+ $r->print(&date_sections_select($context,$newuser,$formname,
+ $permission,$crstype,$ccuname,
+ $ccdomain,$showcredits));
+ }
+ $r->print(' ');
} else { # user already exists
- $r->print(<Change User Privileges
-$forminfo
-User "$ccuname" in domain $ccdomain
-ENDCHANGEUSER
- # Get the users information
- my %userenv = &Apache::lonnet::get('environment',
- ['firstname','middlename','lastname','generation'],
- $ccdomain,$ccuname);
- my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
- $r->print(<
-
-
-first name middle name last name generation
-
-
-END
- foreach ('firstname','middlename','lastname','generation') {
- if (&Apache::lonnet::allowed('mau',$ccdomain)) {
- $r->print(<<"END");
-
-END
- } else {
- $r->print(''.$userenv{$_}.' ');
- }
+ $r->print($start_page.$forminfo);
+ if ($env{'form.action'} eq 'singlestudent') {
+ if ($crstype eq 'Community') {
+ $title = &mt('Enroll one member: [_1] in domain [_2]',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ } else {
+ $title = &mt('Enroll one student: [_1] in domain [_2]',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ }
+ } else {
+ if ($permission->{'cusr'}) {
+ $title = &mt('Modify existing user: [_1] in domain [_2]',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ } else {
+ $title = &mt('Existing user: [_1] in domain [_2]',
+ '"'.$ccuname.'"','"'.$ccdomain.'"');
+ }
}
- $r->print(<
-
-END
- # 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;
- $r->print('Revoke Existing Roles '.
- 'Revoke Role Extent '.
- 'Start End ');
- foreach my $area (keys(%rolesdump)) {
- if ($area!~/^rolesdef/) {
- my $role = $rolesdump{$area};
- my $thisrole=$area;
- $area=~s/\_\w\w$//;
- my ($role_code,$role_end_time,$role_start_time) =
- split(/_/,$role);
- my $bgcol='ffffff';
- my $allows=0;
- if ($area=~/^\/(\w+)\/(\d\w+)/) {
- my %coursedata=
- &Apache::lonnet::coursedescription($1.'_'.$2);
- my $carea='Course: '.$coursedata{'description'};
- $inccourses{$1.'_'.$2}=1;
- if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) {
- $allows=1;
- }
- # Compute the background color based on $area
- $bgcol=$1.'_'.$2;
- $bgcol=~s/[^8-9b-e]//g;
- $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',0,6);
- if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {
- $carea.=' Section/Group: '.$3;
- }
- $area=$carea;
- } else {
- # Determine if current user is able to revoke privileges
- if ($area=~/^\/(\w+)\//) {
+ $r->print(''.$title.' '."\n");
+ $r->print('');
+ $r->print(&personal_data_display($ccuname,$ccdomain,$newuser,$context,
+ $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?').' '."\n");
+ if (($env{'request.role.domain'} eq $ccdomain) ||
+ (&Apache::lonnet::will_trust('reqcrs',$ccdomain,$env{'request.role.domain'}))) {
+ $r->print(&Apache::loncommon::start_data_table());
+ if ($env{'request.role.domain'} eq $ccdomain) {
+ $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses'));
+ } else {
+ $r->print(&coursereq_externaluser($ccuname,$ccdomain,
+ $env{'request.role.domain'}));
+ }
+ $r->print(&Apache::loncommon::end_data_table());
+ } else {
+ $r->print(&mt('Domain configuration for this domain prohibits course creation by users from domain: "[_1]"',
+ &Apache::lonnet::domain($ccdomain,'description')));
+ }
+ }
+ $r->print('');
+ my @order = ('auth','quota','tools','requestauthor');
+ my %user_text;
+ my ($isadv,$isauthor) =
+ &Apache::lonnet::is_advanced_user($ccdomain,$ccuname);
+ if ((!$isauthor) &&
+ ((&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);
+ }
+ $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))) {
+ # Current user has quota modification privileges
+ $user_text{'quota'} = &user_quotas($ccuname,$ccdomain);
+ }
+ 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.",
+ 'ichr' => "If a change is required, contact a domain coordinator for the domain",
+ );
+ $user_text{'quota'} = <$lt{'dska'}
+$lt{'youd'} $lt{'ichr'}: $ccdomain
+ENDNOPORTPRIV
+ }
+ }
+ if (!&Apache::lonnet::allowed('mut',$ccdomain)) {
+ if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) {
+ my %lt=&Apache::lonlocal::texthash(
+ 'utav' => "User Tools Availability",
+ 'yodo' => "You do not have privileges to modify Portfolio, Blog, WebDAV, or Personal Information Page settings for this user.",
+ 'ifch' => "If a change is required, contact a domain coordinator for the domain",
+ );
+ $user_text{'tools'} = <$lt{'utav'}
+$lt{'yodo'} $lt{'ifch'}: $ccdomain
+ENDNOTOOLSPRIV
+ }
+ }
+ my $gotdiv = 0;
+ foreach my $item (@order) {
+ if ($user_text{$item} ne '') {
+ unless ($gotdiv) {
+ $r->print('');
+ $gotdiv = 1;
+ }
+ $r->print('
'.$user_text{$item});
+ }
+ }
+ if ($env{'form.action'} eq 'singlestudent') {
+ unless ($gotdiv) {
+ $r->print('
');
+ }
+ my $credits;
+ if ($showcredits) {
+ $credits = &get_user_credits($ccuname,$ccdomain,$defaultcredits);
+ if ($credits eq '') {
+ $credits = $defaultcredits;
+ }
+ }
+ $r->print(&date_sections_select($context,$newuser,$formname,
+ $permission,$crstype,$ccuname,
+ $ccdomain,$showcredits));
+ }
+ if ($gotdiv) {
+ $r->print('
');
+ }
+ my $statuses;
+ if (($context eq 'domain') && (&Apache::lonnet::allowed('udp',$ccdomain)) &&
+ (!&Apache::lonnet::allowed('mau',$ccdomain))) {
+ $statuses = ['active'];
+ } elsif (($context eq 'course') && ((&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) ||
+ ($env{'request.course.sec'} &&
+ &Apache::lonnet::allowed('vcl',$env{'request.course.id'}.'/'.$env{'request.course.sec'})))) {
+ $statuses = ['active'];
+ }
+ if ($env{'form.action'} ne 'singlestudent') {
+ &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context,
+ $roledom,$crstype,$showcredits,$statuses);
+ }
+ } ## End of new user/old user logic
+ if ($env{'form.action'} eq 'singlestudent') {
+ my $btntxt;
+ if ($crstype eq 'Community') {
+ $btntxt = &mt('Enroll Member');
+ } else {
+ $btntxt = &mt('Enroll Student');
+ }
+ $r->print('
'."\n");
+ } elsif ($permission->{'cusr'}) {
+ $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,$ccdomain);
+ if (!$addrolesdisplay) {
+ $addrolesdisplay = $add_domainroles;
+ }
+ $r->print(&course_level_dc($env{'request.role.domain'},$showcredits));
+ $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,$showcredits,$defaultcredits));
+ $r->print(''.
+ ' '."\n");
+ }
+ }
+ $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain']));
+ $r->print(' ');
+ $r->print(' ');
+ return;
+}
+
+sub singleuser_breadcrumb {
+ my ($crstype,$context,$domain) = @_;
+ my %breadcrumb_text;
+ if ($env{'form.action'} eq 'singlestudent') {
+ if ($crstype eq 'Community') {
+ $breadcrumb_text{'search'} = 'Enroll a member';
+ } else {
+ $breadcrumb_text{'search'} = 'Enroll a student';
+ }
+ $breadcrumb_text{'userpicked'} = 'Select a user';
+ $breadcrumb_text{'modify'} = 'Set section/dates';
+ } elsif ($env{'form.action'} eq 'accesslogs') {
+ $breadcrumb_text{'search'} = 'View access logs for a user';
+ $breadcrumb_text{'userpicked'} = 'Select a user';
+ $breadcrumb_text{'activity'} = 'Activity';
+ } elsif (($env{'form.action'} eq 'singleuser') && ($context eq 'domain') &&
+ (!&Apache::lonnet::allowed('mau',$domain))) {
+ $breadcrumb_text{'search'} = "View user's roles";
+ $breadcrumb_text{'userpicked'} = 'Select a user';
+ $breadcrumb_text{'modify'} = 'User roles';
+ } 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,$crstype,$ccuname,$ccdomain,
+ $showcredits) = @_;
+ my $credits;
+ if ($showcredits) {
+ my $defaultcredits = &Apache::lonuserutils::get_defaultcredits();
+ $credits = &get_user_credits($ccuname,$ccdomain,$defaultcredits);
+ if ($credits eq '') {
+ $credits = $defaultcredits;
+ }
+ }
+ 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 and Credits').' '."\n".
+ &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle,
+ $permission,$context,'',$crstype,
+ $showcredits,$credits);
+ my $output = $date_table.$secbox;
+ return $output;
+}
+
+sub validation_javascript {
+ my ($context,$ccdomain,$pjump_def,$crstype,$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,
+ $crstype);
+ }
+ 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,$context,$roledom,$crstype,
+ $showcredits,$statuses) = @_;
+ my $now=time;
+ my $showall = 1;
+ my ($showexpired,$showactive);
+ if ((ref($statuses) eq 'ARRAY') && (@{$statuses} > 0)) {
+ $showall = 0;
+ if (grep(/^expired$/,@{$statuses})) {
+ $showexpired = 1;
+ }
+ if (grep(/^active$/,@{$statuses})) {
+ $showactive = 1;
+ }
+ if ($showexpired && $showactive) {
+ $showall = 1;
+ }
+ }
+ my %lt=&Apache::lonlocal::texthash(
+ 'rer' => "Existing Roles",
+ 'rev' => "Revoke",
+ 'del' => "Delete",
+ 'ren' => "Re-Enable",
+ 'rol' => "Role",
+ 'ext' => "Extent",
+ 'crd' => "Credits",
+ 'sta' => "Start",
+ 'end' => "End",
+ );
+ my (%rolesdump,%roletext,%sortrole,%roleclass,%rolepriv);
+ if ($context eq 'course' || $context eq 'author') {
+ my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype);
+ my %roleshash =
+ &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles',
+ ['active','previous','future'],\@roles,$roledom,1);
+ foreach my $key (keys(%roleshash)) {
+ my ($start,$end) = split(':',$roleshash{$key});
+ next if ($start eq '-1' || $end eq '-1');
+ my ($rnum,$rdom,$role,$sec) = split(':',$key);
+ if ($context eq 'course') {
+ next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'})
+ && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'}));
+ } elsif ($context eq 'author') {
+ next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'}));
+ }
+ my ($newkey,$newvalue,$newrole);
+ $newkey = '/'.$rdom.'/'.$rnum;
+ if ($sec ne '') {
+ $newkey .= '/'.$sec;
+ }
+ $newvalue = $role;
+ if ($role =~ /^cr/) {
+ $newrole = 'cr';
+ } else {
+ $newrole = $role;
+ }
+ $newkey .= '_'.$newrole;
+ if ($start ne '' && $end ne '') {
+ $newvalue .= '_'.$end.'_'.$start;
+ } elsif ($end ne '') {
+ $newvalue .= '_'.$end;
+ }
+ $rolesdump{$newkey} = $newvalue;
+ }
+ } else {
+ %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);
+ return if ($tmp =~ /^(con_lost|error)/i);
+ 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);
+ my $active=1;
+ $active=0 if (($role_end_time) && ($now>$role_end_time));
+ if ($active) {
+ next unless($showall || $showactive);
+ } else {
+ next unless($showall || $showexpired);
+ }
+# 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';
+ my $credits='';
+ my $csec;
+ if ($area =~ m{^/($match_domain)/($match_courseid)}) {
+ $class='Course';
+ my ($coursedom,$coursedir) = ($1,$2);
+ my $cid = $1.'_'.$2;
+ # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
+ next if ($envkey =~ m{^/$match_domain/$match_courseid/[A-Za-z0-9]+_gr$});
+ my %coursedata=
+ &Apache::lonnet::coursedescription($cid);
+ if ($coursedir =~ /^$match_community$/) {
+ $class='Community';
+ }
+ $sortkey.="\0$coursedom";
+ my $carea;
+ if (defined($coursedata{'description'})) {
+ $carea=$coursedata{'description'}.
+ ' '.&mt('Domain').': '.$coursedom.(' 'x8).
+ &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom);
+ $sortkey.="\0".$coursedata{'description'};
+ } else {
+ if ($class eq 'Community') {
+ $carea=&mt('Unavailable community').': '.$area;
+ $sortkey.="\0".&mt('Unavailable community').': '.$area;
+ } else {
+ $carea=&mt('Unavailable course').': '.$area;
+ $sortkey.="\0".&mt('Unavailable course').': '.$area;
+ }
+ }
+ $sortkey.="\0$coursedir";
+ $inccourses->{$cid}=1;
+ if (($showcredits) && ($class eq 'Course') && ($role_code eq 'st')) {
+ my $defaultcredits = $coursedata{'internal.defaultcredits'};
+ $credits =
+ &get_user_credits($ccuname,$ccdomain,$defaultcredits,
+ $coursedom,$coursedir);
+ if ($credits eq '') {
+ $credits = $defaultcredits;
+ }
+ }
+ if ((&Apache::lonnet::allowed('c'.$role_code,$coursedom.'/'.$coursedir)) ||
+ (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
+ $allowed=1;
+ }
+ unless ($allowed) {
+ my $isowner = &Apache::lonuserutils::is_courseowner($cid,$coursedata{'internal.courseowner'});
+ if ($isowner) {
+ if (($role_code eq 'co') && ($class eq 'Community')) {
+ $allowed = 1;
+ } elsif (($role_code eq 'cc') && ($class eq 'Course')) {
+ $allowed = 1;
+ }
+ }
+ }
+ if ((&Apache::lonnet::allowed('dro',$coursedom)) ||
+ (&Apache::lonnet::allowed('dro',$ccdomain))) {
+ $delallowed=1;
+ }
+# - custom role. Needs more info, too
+ if ($croletitle) {
+ if (&Apache::lonnet::allowed('ccr',$coursedom.'/'.$coursedir)) {
+ $allowed=1;
+ $thisrole.='.'.$role_code;
+ }
+ }
+ if ($area=~m{^/($match_domain/$match_courseid/(\w+))}) {
+ $csec = $2;
+ $carea.=' '.&mt('Section: [_1]',$csec);
+ $sortkey.="\0$csec";
+ if (!$allowed) {
+ if ($env{'request.course.sec'} eq $csec) {
if (&Apache::lonnet::allowed('c'.$role_code,$1)) {
- $allows=1;
+ $allowed = 1;
}
- } else {
- if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
- $allows=1;
- }
- }
- }
- $r->print('');
- my $active=1;
- $active=0 if (($role_end_time) && ($now>$role_end_time));
- if (($active) && ($allows)) {
- $r->print(' ');
- } else {
- $r->print(' ');
- }
- $r->print(' '.
- &Apache::lonnet::plaintext($role_code).
- ' '.$area.' '.
- ($role_start_time ? localtime($role_start_time)
- : ' ' )
- .' '.
- ($role_end_time ? localtime($role_end_time)
- : ' ' )
- ." \n");
- }
- } # end of foreach (table building loop)
- $r->print('
');
- } # End of unless
- my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
- if ($currentauth=~/^krb4:/) {
- $currentauth=~/^krb4:(.*)/;
- my $krbdefdom2=$1;
- my %param = ( formname => 'document.cu',
- kerb_def_dom => $krbdefdom
- );
- $loginscript = &Apache::loncommon::authform_header(%param);
- }
- # Check for a bad authentication type
- unless ($currentauth=~/^krb4:/ or
- $currentauth=~/^unix:/ or
- $currentauth=~/^internal:/ or
- $currentauth=~/^localauth:/
- ) { # bad authentication scheme
- if (&Apache::lonnet::allowed('mau',$ENV{'user.domain'})) {
- $r->print(<
+ }
+ }
+ }
+ $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' || $role_code eq 'aa') {
+ $class='Authoring 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 = '';
+ if ($showall) {
+ $row.= '';
+ 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 {
+ $row.=' ';
+ }
+ $row.= ' ';
+ }
+ my $plaintext='';
+ if (!$croletitle) {
+ $plaintext=&Apache::lonnet::plaintext($role_code,$class);
+ if (($showcredits) && ($credits ne '')) {
+ $plaintext .= ''.
+ ''.
+ &mt('Credits: [_1]',$credits).
+ ' ';
+ }
+ } else {
+ $plaintext=
+ &mt('Custom role [_1][_2]defined by [_3]',
+ '"'.$croletitle.'"',
+ ' ',
+ $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;
+ if ($allowed) {
+ $rolepriv{$envkey}='edit';
+ } else {
+ if ($context eq 'domain') {
+ if ((&Apache::lonnet::allowed('vur',$ccdomain)) &&
+ ($envkey=~m{^/$ccdomain/})) {
+ $rolepriv{$envkey}='view';
+ }
+ } elsif ($context eq 'course') {
+ if ((&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) ||
+ ($env{'request.course.sec'} && ($env{'request.course.sec'} eq $csec) &&
+ &Apache::lonnet::allowed('vcl',$env{'request.course.id'}.'/'.$env{'request.course.sec'}))) {
+ $rolepriv{$envkey}='view';
+ }
+ }
+ }
+ } # end of foreach (table building loop)
+
+ my $rolesdisplay = 0;
+ my %output = ();
+ foreach my $type ('Authoring Space','Course','Community','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'}) {
+ if (&Apache::loncommon::course_type() eq 'Community') {
+ $contextrole = &mt('Existing Roles in this Community');
+ } else {
+ $contextrole = &mt('Existing Roles in this Course');
+ }
+ } elsif ($env{'request.role'} =~ /^au\./) {
+ $contextrole = &mt('Existing Co-Author Roles in your Authoring Space');
+ } else {
+ if ($showall) {
+ $contextrole = &mt('Existing Roles in this Domain');
+ } elsif ($showactive) {
+ $contextrole = &mt('Unexpired Roles in this Domain');
+ } elsif ($showexpired) {
+ $contextrole = &mt('Expired or Revoked Roles in this Domain');
+ }
+ }
+ $r->print(''.
+'
'.$contextrole.' '.
+&Apache::loncommon::start_data_table("LC_createuser").
+&Apache::loncommon::start_data_table_header_row());
+ if ($showall) {
+ $r->print(
+''.$lt{'rev'}.' '.$lt{'ren'}.' '.$lt{'del'}.' '
+ );
+ } elsif ($showexpired) {
+ $r->print(''.$lt{'rev'}.' ');
+ }
+ $r->print(
+''.$lt{'rol'}.' '.$lt{'ext'}.' '.
+''.$lt{'sta'}.' '.$lt{'end'}.' '.
+&Apache::loncommon::end_data_table_header_row());
+ foreach my $type ('Authoring Space','Course','Community','Domain','System','Unknown') {
+ if ($output{$type}) {
+ $r->print($output{$type}."\n");
+ }
+ }
+ $r->print(&Apache::loncommon::end_data_table().
+ ' ');
+ }
+ return;
+}
+
+sub new_coauthor_roles {
+ my ($r,$ccuname,$ccdomain) = @_;
+ my $addrolesdisplay = 0;
+ #
+ # 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 $cudom=$env{'request.role.domain'};
+ my %lt=&Apache::lonlocal::texthash(
+ 'cs' => "Authoring Space",
+ 'act' => "Activate",
+ 'rol' => "Role",
+ 'ext' => "Extent",
+ 'sta' => "Start",
+ 'end' => "End",
+ 'cau' => "Co-Author",
+ '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().'
+
+
+
+ '.$lt{'cau'}.'
+ '.$cudom.'_'.$cuname.'
+
+ '.$lt{'ssd'}.'
+
+'.$lt{'sed'}.' '."\n".
+ &Apache::loncommon::end_data_table_row()."\n".
+ &Apache::loncommon::start_data_table_row()."\n".
+'
+'.$lt{'caa'}.'
+'.$cudom.'_'.$cuname.'
+
+'.$lt{'ssd'}.'
+
+'.$lt{'sed'}.' '."\n".
+ &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) &&
+ ($env{'user.domain'} eq $ccdomain)) {
+ $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Authoring Space is not permitted'));
+ }
+ }
+ return $addrolesdisplay;;
+}
+
+sub new_domain_roles {
+ my ($r,$ccdomain) = @_;
+ my $addrolesdisplay = 0;
+ #
+ # Domain level
+ #
+ my $num_domain_level = 0;
+ my $domaintext =
+ ''.&mt('Domain Level').' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Activate').' '.&mt('Role').' '.
+ &mt('Extent').' '.
+ ''.&mt('Start').' '.&mt('End').' '.
+ &Apache::loncommon::end_data_table_header_row();
+ my @allroles = &Apache::lonuserutils::roles_by_context('domain');
+ my $uprimary = &Apache::lonnet::domain($env{'request.role.domain'},'primary');
+ my $uintdom = &Apache::lonnet::internet_dom($uprimary);
+ foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) {
+ foreach my $role (@allroles) {
+ next if ($role eq 'ad');
+ next if (($role eq 'au') && ($ccdomain ne $thisdomain));
+ if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) {
+ if ($role eq 'dc') {
+ unless ($thisdomain eq $env{'request.role.domain'}) {
+ my $domprim = &Apache::lonnet::domain($thisdomain,'primary');
+ my $intdom = &Apache::lonnet::internet_dom($domprim);
+ next unless ($uintdom eq $intdom);
+ }
+ }
+ my $plrole=&Apache::lonnet::plaintext($role);
+ my %lt=&Apache::lonlocal::texthash(
+ 'ssd' => "Set Start Date",
+ 'sed' => "Set End Date"
+ );
+ $num_domain_level ++;
+ $domaintext .=
+&Apache::loncommon::start_data_table_row().
+'
+'.$plrole.'
+'.$thisdomain.'
+
+'.$lt{'ssd'}.'
+
+'.$lt{'sed'}.' '.
+&Apache::loncommon::end_data_table_row();
+ }
+ }
+ }
+ $domaintext.= &Apache::loncommon::end_data_table();
+ if ($num_domain_level > 0) {
+ $r->print($domaintext);
+ $addrolesdisplay = 1;
+ }
+ return $addrolesdisplay;
+}
+
+sub user_authentication {
+ my ($ccuname,$ccdomain,$formname,$crstype,$permission) = @_;
+ my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
+ my $outcome;
+ my %lt=&Apache::lonlocal::texthash(
+ 'err' => "ERROR",
+ 'uuas' => "This user has an unrecognized authentication scheme",
+ 'adcs' => "Please alert a domain coordinator of this situation",
+ 'sldb' => "Please specify login data below",
+ 'ld' => "Login Data"
+ );
+ # Check for a bad authentication type
+ if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth|lti):/) {
+ # bad authentication scheme
+ if (&Apache::lonnet::allowed('mau',$ccdomain)) {
+ &initialize_authen_forms($ccdomain,$formname);
+
+ my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc);
+ $outcome = <
+//
-ERROR:
-This user has an unrecognized authentication scheme ($currentauth).
-Please specify login data below.
-Login Data
-$generalrule
-$authformkrb
-$authformint
-$authformfsys
-$authformloc
+$lt{'err'}:
+$lt{'uuas'} ($currentauth). $lt{'sldb'}.
+$lt{'ld'}
+$choices
ENDBADAUTH
- } else {
- # This user is not allowed to modify the users
- # authentication scheme, so just notify them of the problem
- $r->print(<
-
- ERROR:
-This user has an unrecognized authentication scheme ($currentauth).
-Please alert a domain coordinator of this situation.
-
+ } else {
+ # This user is not allowed to modify the user's
+ # authentication scheme, so just notify them of the problem
+ $outcome = < $lt{'err'}:
+$lt{'uuas'} ($currentauth). $lt{'adcs'}.
+
ENDBADAUTH
+ }
+ } else { # Authentication type is valid
+
+ &initialize_authen_forms($ccdomain,$formname,$currentauth,'modifyuser');
+ my ($authformcurrent,$can_modify,@authform_others) =
+ &modify_login_block($ccdomain,$currentauth);
+ if (&Apache::lonnet::allowed('mau',$ccdomain)) {
+ # Current user has login modification privileges
+ $outcome =
+ ''."\n".
+ ''.$lt{'ld'}.' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.$authformnop;
+ if (($can_modify) && (&Apache::lonnet::allowed('mau',$ccdomain))) {
+ $outcome .= ' '."\n".
+ &Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::start_data_table_row().
+ ''.$authformcurrent.' '.
+ &Apache::loncommon::end_data_table_row()."\n";
+ } else {
+ $outcome .= ' ('.$authformcurrent.')'.
+ &Apache::loncommon::end_data_table_row()."\n";
}
- } else { # Authentication type is valid
- my $authformcurrent='';
- my $authform_other='';
- if ($currentauth=~/^krb4:/) {
- $authformcurrent=$authformkrb;
- $authform_other="$authformint
\n".
- "$authformfsys
$authformloc
";
- }
- elsif ($currentauth=~/^internal:/) {
- $authformcurrent=$authformint;
- $authform_other="$authformkrb
".
- "$authformfsys
$authformloc
";
- }
- elsif ($currentauth=~/^unix:/) {
- $authformcurrent=$authformfsys;
- $authform_other="$authformkrb
".
- "$authformint
$authformloc;
";
- }
- elsif ($currentauth=~/^localauth:/) {
- $authformcurrent=$authformloc;
- $authform_other="$authformkrb
".
- "$authformint
$authformfsys
";
- }
- $authformcurrent=<
-
-* * * WARNING * * *
-* * * WARNING * * *
-
-$authformcurrent
-Changing this value will overwrite existing authentication for the user; you should notify the user of this change.
-
-ENDCURRENTAUTH
- if (&Apache::lonnet::allowed('mau',$ENV{'user.domain'})) {
- # Current user has login modification privileges
- $r->print(<
-
-Change Current Login Data
-$generalrule
-$authformnop
-$authformcurrent
-Enter New Login Data
-$authform_other
-ENDOTHERAUTHS
+ENDJS
+
+ $outcome .= ''.$lt{'ld'}.' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.&mt('Internally authenticated').' '.&mt("Change user's password?").
+ ' '.
+ &mt('No').' '.(' 'x2).
+ ' '.&mt('Yes').' '.
+ ''.
+ ' '.&mt('Password').' '.
+ ' '.&mt('Visible input').'
'.
+ &Apache::loncommon::end_data_table_row().
+ &Apache::loncommon::end_data_table();
}
- } ## End of "check for bad authentication type" logic
- } ## End of new user/old user logic
- $r->print('Add Roles ');
-#
-# Co-Author
-#
+ if (&Apache::lonnet::allowed('udp',$ccdomain)) {
+ # Current user has rights to view domain preferences for user's domain
+ my $result;
+ if ($currentauth =~ /^krb(4|5):([^:]*)$/) {
+ my ($krbver,$krbrealm) = ($1,$2);
+ if ($krbrealm eq '') {
+ $result = &mt('Currently Kerberos authenticated, Version [_1].',$krbver);
+ } else {
+ $result = &mt('Currently Kerberos authenticated with domain [_1] Version [_2].',
+ $krbrealm,$krbver);
+ }
+ } elsif ($currentauth =~ /^internal:/) {
+ $result = &mt('Currently internally authenticated.');
+ } elsif ($currentauth =~ /^localauth:/) {
+ $result = &mt('Currently using local (institutional) authentication.');
+ } elsif ($currentauth =~ /^unix:/) {
+ $result = &mt('Currently Filesystem Authenticated.');
+ } elsif ($currentauth =~ /^lti:/) {
+ $result = &mt('Currently LTI authenticated.');
+ }
+ $outcome = ''.$lt{'ld'}.' '.
+ &Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_row().
+ ''.$result.' '.
+ &Apache::loncommon::end_data_table_row()."\n".
+ &Apache::loncommon::end_data_table();
+ } elsif (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
+ my %lt=&Apache::lonlocal::texthash(
+ 'ccld' => "Change Current Login Data",
+ 'yodo' => "You do not have privileges to modify the authentication configuration for this user.",
+ 'ifch' => "If a change is required, contact a domain coordinator for the domain",
+ );
+ $outcome .= <$lt{'ccld'}
+$lt{'yodo'} $lt{'ifch'}: $ccdomain
+
+ENDNOPRIV
+ }
+ }
+ } ## End of "check for bad authentication type" logic
+ return $outcome;
+}
- if (&Apache::lonnet::allowed('cca',$ENV{'user.domain'})) {
- my $cuname=$ENV{'user.name'};
- my $cudom=$ENV{'user.domain'};
- $r->print(<Construction Space
-
-ENDCOAUTH
+sub modify_login_block {
+ my ($dom,$currentauth) = @_;
+ my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
+ my ($authnum,%can_assign) =
+ &Apache::loncommon::get_assignable_auth($dom);
+ my ($authformcurrent,@authform_others,$show_override_msg);
+ if ($currentauth=~/^krb(4|5):/) {
+ $authformcurrent=$authformkrb;
+ if ($can_assign{'int'}) {
+ push(@authform_others,$authformint);
+ }
+ if ($can_assign{'loc'}) {
+ push(@authform_others,$authformloc);
+ }
+ if ($can_assign{'lti'}) {
+ push(@authform_others,$authformlti);
+ }
+ if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
+ $show_override_msg = 1;
+ }
+ } elsif ($currentauth=~/^internal:/) {
+ $authformcurrent=$authformint;
+ if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
+ push(@authform_others,$authformkrb);
+ }
+ if ($can_assign{'loc'}) {
+ push(@authform_others,$authformloc);
+ }
+ if ($can_assign{'lti'}) {
+ push(@authform_others,$authformlti);
+ }
+ if ($can_assign{'int'}) {
+ $show_override_msg = 1;
+ }
+ } elsif ($currentauth=~/^unix:/) {
+ $authformcurrent=$authformfsys;
+ if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
+ push(@authform_others,$authformkrb);
+ }
+ if ($can_assign{'int'}) {
+ push(@authform_others,$authformint);
+ }
+ if ($can_assign{'loc'}) {
+ push(@authform_others,$authformloc);
+ }
+ if ($can_assign{'lti'}) {
+ push(@authform_others,$authformlti);
+ }
+ if ($can_assign{'fsys'}) {
+ $show_override_msg = 1;
+ }
+ } elsif ($currentauth=~/^localauth:/) {
+ $authformcurrent=$authformloc;
+ if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
+ push(@authform_others,$authformkrb);
+ }
+ if ($can_assign{'int'}) {
+ push(@authform_others,$authformint);
+ }
+ if ($can_assign{'lti'}) {
+ push(@authform_others,$authformlti);
+ }
+ if ($can_assign{'loc'}) {
+ $show_override_msg = 1;
+ }
+ } elsif ($currentauth=~/^lti:/) {
+ $authformcurrent=$authformlti;
+ if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) {
+ push(@authform_others,$authformkrb);
+ }
+ if ($can_assign{'int'}) {
+ push(@authform_others,$authformint);
+ }
+ if ($can_assign{'loc'}) {
+ push(@authform_others,$authformloc);
+ }
}
-#
-# Domain level
-#
- $r->print('Domain Level '.
- 'Activate Role Extent '.
- 'Start End ');
- foreach ( sort( keys(%incdomains))) {
- my $thisdomain=$_;
- foreach ('dc','li','dg','au') {
- if (&Apache::lonnet::allowed('c'.$_,$thisdomain)) {
- my $plrole=&Apache::lonnet::plaintext($_);
- $r->print(<
-
-$plrole
-$thisdomain
-
-Set Start Date
-
-Set End Date
-
-ENDDROW
+ if ($show_override_msg) {
+ $authformcurrent = ''.$authformcurrent.
+ ' '."\n".
+ ' '.
+ ''.&mt('Currently in use').' '.
+ ''.
+ &mt('will override current values').
+ '
';
+ }
+ return ($authformcurrent,$show_override_msg,@authform_others);
+}
+
+sub personal_data_display {
+ my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray,$now,
+ $captchaform,$emailusername,$usertype,$usernameset,$condition,$excluded,$showsubmit) = @_;
+ my ($output,%userenv,%canmodify,%canmodify_status);
+ my @userinfo = ('firstname','middlename','lastname','generation',
+ 'permanentemail','id');
+ my $rowcount = 0;
+ my $editable = 0;
+ my %textboxsize = (
+ firstname => '15',
+ middlename => '15',
+ lastname => '15',
+ generation => '5',
+ permanentemail => '25',
+ id => '15',
+ );
+
+ my %lt=&Apache::lonlocal::texthash(
+ 'pd' => "Personal Data",
+ 'firstname' => "First Name",
+ 'middlename' => "Middle Name",
+ 'lastname' => "Last Name",
+ 'generation' => "Generation",
+ 'permanentemail' => "Permanent e-mail address",
+ 'id' => "Student/Employee ID",
+ 'lg' => "Login Data",
+ 'inststatus' => "Affiliation",
+ 'email' => 'E-mail address',
+ 'valid' => 'Validation',
+ 'username' => 'Username',
+ );
+
+ %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','inststatus'],$ccdomain,$ccuname);
+ %canmodify =
+ &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain,
+ \@userinfo,$rolesarray);
+ } elsif ($context eq 'selfcreate') {
+ if ($newuser eq 'email') {
+ if (ref($emailusername) eq 'HASH') {
+ if (ref($emailusername->{$usertype}) eq 'HASH') {
+ my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
+ @userinfo = ();
+ if ((ref($infofields) eq 'ARRAY') && (ref($infotitles) eq 'HASH')) {
+ foreach my $field (@{$infofields}) {
+ if ($emailusername->{$usertype}->{$field}) {
+ push(@userinfo,$field);
+ $canmodify{$field} = 1;
+ unless ($textboxsize{$field}) {
+ $textboxsize{$field} = 25;
+ }
+ unless ($lt{$field}) {
+ $lt{$field} = $infotitles->{$field};
+ }
+ if ($emailusername->{$usertype}->{$field} eq 'required') {
+ $lt{$field} .= '* ';
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo,
+ $inst_results,$rolesarray);
+ }
+ }
+
+ my $genhelp=&Apache::loncommon::help_open_topic('Generation');
+ $output = ''.$lt{'pd'}.' '.
+ &Apache::lonhtmlcommon::start_pick_box();
+ if (($context eq 'selfcreate') && ($newuser eq 'email')) {
+ my $size = 25;
+ if ($condition) {
+ if ($condition =~ /^\@[^\@]+$/) {
+ $size = 10;
+ } else {
+ undef($condition);
}
}
+ if ($excluded) {
+ unless ($excluded =~ /^\@[^\@]+$/) {
+ undef($condition);
+ }
+ }
+ $output .= &Apache::lonhtmlcommon::row_title($lt{'email'}.'* ',undef,
+ 'LC_oddrow_value')."\n".
+ ' ';
+ if ($condition) {
+ $output .= $condition;
+ } elsif ($excluded) {
+ $output .= ''.&mt('You must use an e-mail address that does not end with [_1]',
+ $excluded).' ';
+ }
+ if ($usernameset eq 'first') {
+ $output .= '';
+ if ($condition) {
+ $output .= &mt('Your username in LON-CAPA will be the part of your e-mail address before [_1]',
+ $condition);
+ } else {
+ $output .= &mt('Your username in LON-CAPA will be the part of your e-mail address before the @');
+ }
+ $output .= ' ';
+ }
+ $rowcount ++;
+ $output .= &Apache::lonhtmlcommon::row_closure(1);
+ my $upassone = ' ';
+ my $upasstwo = ' ';
+ $output .= &Apache::lonhtmlcommon::row_title(&mt('Password').'* ',
+ 'LC_pick_box_title',
+ 'LC_oddrow_value')."\n".
+ $upassone."\n".
+ &Apache::lonhtmlcommon::row_closure(1)."\n".
+ &Apache::lonhtmlcommon::row_title(&mt('Confirm password').'* ',
+ 'LC_pick_box_title',
+ 'LC_oddrow_value')."\n".
+ $upasstwo.
+ &Apache::lonhtmlcommon::row_closure()."\n";
+ if ($usernameset eq 'free') {
+ my $onclick = "toggleUsernameDisp(this,'selfcreateusername');";
+ $output .= &Apache::lonhtmlcommon::row_title($lt{'username'},undef,'LC_oddrow_value')."\n".
+ ''.&mt('Use e-mail address: ').
+ ' '.
+ &mt('Yes').' '.(' 'x2).
+ ' '.
+ &mt('No').' '."\n".
+ ''.
+ ''.&mt('Preferred username').
+ ' '.
+ '
'."\n".&Apache::lonhtmlcommon::row_closure(1);
+ $rowcount ++;
+ }
+ }
+ foreach my $item (@userinfo) {
+ my $rowtitle = $lt{$item};
+ my $hiderow = 0;
+ if ($item eq 'generation') {
+ $rowtitle = $genhelp.$rowtitle;
+ }
+ 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 '') {
+ $row .= ' '.$inst_results->{$item};
+ } else {
+ if ($context eq 'selfcreate') {
+ if ($canmodify{$item}) {
+ $row .= ' ';
+ $editable ++;
+ } else {
+ $hiderow = 1;
+ }
+ } else {
+ $row .= ' ';
+ }
+ }
+ } else {
+ if ($context eq 'selfcreate') {
+ if ($canmodify{$item}) {
+ if ($newuser eq 'email') {
+ $row .= ' ';
+ } else {
+ $row .= ' ';
+ }
+ $editable ++;
+ } else {
+ $hiderow = 1;
+ }
+ } else {
+ $row .= ' ';
+ }
+ }
+ } else {
+ if ($canmodify{$item}) {
+ $row .= ' ';
+ if (($item eq 'id') && (!$newuser)) {
+ $row .= ' '.&Apache::lonuserutils::forceid_change($context);
+ }
+ } else {
+ $row .= $userenv{$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 {
+ if ($userenv{'inststatus'} eq '') {
+ $hiderow = 1;
+ } else {
+ my @showitems;
+ foreach my $item ( map { &unescape($_); } split(':',$userenv{'inststatus'})) {
+ if (exists($usertypes->{$item})) {
+ push(@showitems,$usertypes->{$item});
+ } else {
+ push(@showitems,$item);
+ }
+ }
+ if (@showitems) {
+ $shown = join(', ',@showitems);
+ } else {
+ $hiderow = 1;
+ }
+ }
+ }
+ if (!$hiderow) {
+ my $row = &Apache::lonhtmlcommon::row_title(&mt('Affiliations'),undef,'LC_oddrow_value')."\n".
+ $shown.&Apache::lonhtmlcommon::row_closure(1);
+ if ($context eq 'selfcreate') {
+ $rowcount ++;
+ }
+ $output .= $row;
+ }
+ }
+ }
+ }
+ if (($context eq 'selfcreate') && ($newuser eq 'email')) {
+ if ($captchaform) {
+ $output .= &Apache::lonhtmlcommon::row_title($lt{'valid'}.'*',
+ 'LC_pick_box_title')."\n".
+ $captchaform."\n".' '.
+ &Apache::lonhtmlcommon::row_closure(1);
+ $rowcount ++;
+ }
+ if ($showsubmit) {
+ my $submit_text = &mt('Create account');
+ $output .= &Apache::lonhtmlcommon::row_title()."\n".
+ ' ';
+ if ($usertype ne '') {
+ $output .= ' ';
+ }
+ $output .= &Apache::lonhtmlcommon::row_closure(1);
+ }
+ }
+ $output .= &Apache::lonhtmlcommon::end_pick_box();
+ if (wantarray) {
+ if ($context eq 'selfcreate') {
+ return($output,$rowcount,$editable);
+ } else {
+ return $output;
+ }
+ } else {
+ return $output;
}
- $r->print('
');
-#
-# Course level
-#
- $r->print(&course_level_table(%inccourses));
- $r->print(" \n");
- $r->print("");
+}
+
+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 phase_three {
- my $r=shift;
- my $uhome=&Apache::lonnet::homeserver($ENV{'form.ccuname'},
- $ENV{'form.ccdomain'});
+sub update_user_data {
+ my ($r,$context,$crstype,$brcrum,$showcredits,$permission) = @_;
+ my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
+ $env{'form.ccdomain'});
# Error messages
- my $error = 'Error: ';
- my $end = '