'.&mt('Requests for official courses queued pending validation').'
'.
'
'.&mt('Requests are validated against institutional data to confirm that the requestor is an instructor of record.').' '.
- &mt('Validation is attempted when the request is submitted.').' '.&mt('If unvalidated, the request will be held in a queue.').' '.&mt('Validation of pending requests is automatically repeated daily.').'
';
+ &mt('Validation is attempted when the request is submitted.').' '.
+ &mt('If unvalidated, the request will be held in a queue.').' '.
+ &mt('Validation of pending requests is automatically repeated daily.').'';
+ } elsif ($context eq 'requestauthor') {
+ $output .= '
'.&mt('Requests for Authoring Space queued pending approval by a Domain Coordinator').'
'.&mt('Requests for LON-CAPA accounts queued pending approval by a Domain Coordinator').'
';
} else {
- $output .= '
'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'
';
+ $output .= '
'.&mt('Course/Community requests queued pending approval by a Domain Coordinator').'
';
}
$output .= &build_queue_display($dom,$context,\%queue_by_date).
'';
@@ -327,6 +464,10 @@ sub display_queued_requests {
$output .= &mt('There are currently no enrollment requests awaiting approval.');
} elsif ($context eq 'pending') {
$output .= &mt('There are currently no requests for official courses awaiting validation.');
+ } elsif ($context eq 'requestauthor') {
+ $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
+ } elsif ($context eq 'requestusername') {
+ $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
} elsif ($context eq 'domain') {
$output .= &mt('There are currently no course or community requests awaiting approval.');
}
@@ -335,8 +476,9 @@ sub display_queued_requests {
if ($context eq 'pending') {
$output .= '
'."\n".
- '
'.&mt('Any course/community requests which are successfully validated will be created immediately.').' '.&mt('Unvalidated requests will be listed for manual approval/rejection.').'
';
- } else {
+ '
'.&mt('Any course/community requests which are successfully validated will be created immediately.').' '.
+ &mt('Unvalidated requests will be listed for manual approval/rejection.').'
';
+ } elsif (($context ne 'helpdesk') && ($context ne 'displaypending')) {
$output .= ' ';
}
$output .= '';
@@ -344,8 +486,12 @@ sub display_queued_requests {
$output .= '
';
if ($context eq 'course') {
$output .= &mt('There are currently no enrollment requests awaiting approval.');
- } elsif ($context eq 'pending') {
+ } elsif (($context eq 'pending') || ($context eq 'displaypending')) {
$output .= &mt('There are currently no requests for official courses awaiting validation.');
+ } elsif ($context eq 'requestauthor') {
+ $output .= &mt('There are currently no requests for Authoring Space awaiting approval.');
+ } elsif ($context eq 'requestusername') {
+ $output .= &mt('There are currently no requests for LON-CAPA accounts awaiting approval.');
} else {
$output .= &mt('There are currently no course or community requests awaiting approval.');
}
@@ -360,14 +506,19 @@ sub build_queue_display {
my %crstypes;
my $output = &Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row();
- unless ($context eq 'pending') {
+ unless (($context eq 'pending') || ($context eq 'displaypending') || ($context eq 'helpdesk')) {
$output .= '
';
+ }
+ if ($notifylist ne '') {
+ &send_selfserve_notification($notifylist,$chgmsg,undef,$domdesc,
+ $now,'usernamemanagers',$sender,
+ $approvedlist,$rejectedlist);
+ }
} else {
$chgmsg = "'Action was taken on the following course and community requests by [_1].',$namelink";
if (@completed) {
@@ -836,6 +1337,9 @@ sub update_request_queue {
}
my $syllabuslink =
&Apache::loncommon::syllabuswrapper($showcourse,$cnum,$cdom);
+ if ($codes{$cnum}) {
+ $syllabuslink .= ' '.&mt('Unique code: [_1]',$codes{$cnum});
+ }
$output .= '
'.&mt('The following Authoring Space requests were deleted because the requestor does not have a LON-CAPA account:').'
';
+ foreach my $uname (@invalidusers) {
+ my $userlink =
+ &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$cdom),$uname,$cdom);
+ $output .= '
'.$userlink.'
';
+ }
+ $output .= '
';
}
}
if (@limitexceeded) {
@@ -919,17 +1450,27 @@ sub update_request_queue {
}
}
if (@nopermissions) {
- $output .= '
'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'
';
- foreach my $cnum (@nopermissions) {
- my $showcourse;
- if (ref($requesthash{$cnum.'_'.$queue})) {
- $showcourse = $requesthash{$cnum.'_'.$queue}{'description'};
- } else {
- $showcourse = $cnum;
+ if ($context eq 'course') {
+ $output .= '
'.&mt('The following course/community creation requests could not be processed because the owner does not have rights to create this type of course:').'
';
}
return $output;
}
@@ -1038,13 +1624,24 @@ sub get_student_counts {
sub course_creation {
my ($dom,$cnum,$context,$details,$logmsg,$newusermsg,$addresult,$enrollcount,$output,
- $keysmsg,$domdefs,$longroles) = @_;
+ $keysmsg,$domdefs,$longroles,$coderef,$customhash) = @_;
unless ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH') &&
(ref($longroles) eq 'HASH')) {
- return 'error: Invalid request';
+ return ('error: Invalid request');
}
my ($result,$ownername,$ownerdom);
my $crstype = $details->{'crstype'};
+ my $coursedesc = $details->{'cdescr'};
+ my $accessstart = $details->{'accessstart'};
+ my $accessend = $details->{'accessend'};
+ my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
+ if (ref($domconfig{'requestcourses'}) eq 'HASH') {
+ if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
+ if ($domconfig{'requestcourses'}{'uniquecode'}{$crstype}) {
+ $details->{'uniquecode'} = 1;
+ }
+ }
+ }
if ($context eq 'domain') {
$ownername = $details->{'owner'};
$ownerdom = $details->{'domain'};
@@ -1052,6 +1649,7 @@ sub course_creation {
$ownername = $env{'user.name'};
$ownerdom = $env{'user.domain'};
}
+ my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
my $owneremail;
my %emails = &Apache::loncommon::getemails($ownername,$ownerdom);
foreach my $email ('permanentemail','critnotification','notification') {
@@ -1061,27 +1659,46 @@ sub course_creation {
my %reqdetails = &build_batchcreatehash($dom,$context,$details,$owneremail,$domdefs);
my $cid = &LONCAPA::batchcreatecourse::build_course($dom,$cnum,'requestcourses',
\%reqdetails,$longroles,$logmsg,$newusermsg,$addresult,
- $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype);
+ $enrollcount,$output,$keysmsg,$ownerdom,$ownername,$cnum,$crstype,$coderef);
+ my $postprocess;
if ($cid eq "/$dom/$cnum") {
$result = 'created';
+ my $code;
+ if (ref($coderef)) {
+ $code = $$coderef;
+ }
+ $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$result,$ownername,
+ $ownerdom,$fullname,$coursedesc,$code,
+ $accessstart,$accessend,$customhash);
} else {
$result = 'error: '.$cid;
}
- return $result;
+ return ($result,$postprocess);
}
sub build_batchcreatehash {
my ($dom,$context,$details,$owneremail,$domdefs) = @_;
my %batchhash;
- my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift enrollstart enrollend accessstart accessend sections crosslists users};
+ my @items = qw{owner domain coursehome clonecrs clonedom datemode dateshift enrollstart enrollend accessstart accessend sections users uniquecode};
if ((ref($details) eq 'HASH') && (ref($domdefs) eq 'HASH')) {
my $emailenc = &escape($owneremail);
my $owner = $details->{'owner'}.':'.$details->{'domain'};
foreach my $item (@items) {
$batchhash{$item} = $details->{$item};
}
+ if (ref($details->{'crosslists'}) eq 'HASH') {
+ foreach my $key (keys(%{$details->{'crosslists'}})) {
+ if (ref($details->{'crosslists'}->{$key}) eq 'HASH') {
+ $batchhash{'crosslists'}{$key}{'inst'} = $details->{crosslists}->{$key}->{instcode}.$details->{crosslists}->{$key}->{instsec};
+ $batchhash{'crosslists'}{$key}{'loncapa'} = $details->{crosslists}->{$key}->{loncapa};
+ }
+ }
+ }
$batchhash{'title'} = $details->{'cdescr'};
$batchhash{'coursecode'} = $details->{'instcode'};
+ if ($domdefs->{'officialcredits'} || $domdefs->{'unofficialcredits'}) {
+ $batchhash{'defaultcredits'} = $details->{'defaultcredits'};
+ }
$batchhash{'emailenc'} = $emailenc;
$batchhash{'adds'} = $details->{'autoadds'};
$batchhash{'drops'} = $details->{'autodrops'};
@@ -1090,6 +1707,12 @@ sub build_batchcreatehash {
if ($details->{'crstype'} eq 'community') {
$batchhash{'crstype'} = 'Community';
} else {
+ if ($details->{'crstype'} eq 'textbook') {
+ if ($details->{'clonecrs'} && $details->{'clonedom'}) {
+ my %clonedfrom = &Apache::lonnet::coursedescription($details->{'clonedom'}.'_'.$details->{'clonecrs'});
+ $batchhash{'textbook'} = $clonedfrom{'description'};
+ }
+ }
$batchhash{'crstype'} = 'Course';
}
my ($owner_firstname,$owner_lastname);
@@ -1128,12 +1751,13 @@ sub build_batchcreatehash {
$batchhash{'users'}{$owner}{lastname} = $owner_lastname;
$batchhash{'users'}{$owner}{emailenc} = $emailenc;
$batchhash{'users'}{$owner}{owneremail} = $owneremail;
+ $batchhash{'setcomment'} = 1;
}
return %batchhash;
}
sub can_clone_course {
- my ($uname,$udom,$clonecrs,$clonedom,$crstype) = @_;
+ my ($uname,$udom,$clonecrs,$clonedom,$crstype,$dom,$instcode) = @_;
my $canclone;
my $ccrole = 'cc';
if ($crstype eq 'community') {
@@ -1144,19 +1768,70 @@ sub can_clone_course {
if (exists($roleshash{$clonecrs.':'.$clonedom.':'.$ccrole})) {
$canclone = 1;
} else {
- my %courseenv = &Apache::lonnet::userenvironment($clonedom,$clonecrs,('cloners'));
+ my %courseenv = &Apache::lonnet::userenvironment($clonedom,$clonecrs,
+ ('cloners','internal.coursecode'));
my $cloners = $courseenv{'cloners'};
+ my $clonefromcode = $courseenv{'internal.coursecode'};
if ($cloners ne '') {
my @cloneable = split(',',$cloners);
if (grep(/^\*$/,@cloneable)) {
$canclone = 1;
- }
- if (grep(/^\*:\Q$udom\E$/,@cloneable)) {
+ } elsif (grep(/^\*:\Q$udom\E$/,@cloneable)) {
$canclone = 1;
- }
- if (grep(/^\Q$uname\E:\Q$udom\E$/,@cloneable)) {
+ } elsif (grep(/^\Q$uname\E:\Q$udom\E$/,@cloneable)) {
$canclone = 1;
}
+ unless ($canclone) {
+ if (($clonefromcode) && ($instcode) && ($clonedom eq $dom)) {
+ my (%gotdomdefaults,%gotcodedefaults);
+ foreach my $cloner (@cloneable) {
+ if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) &&
+ ($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) {
+ if ($cloner =~ /\=/) {
+ my (%codedefaults,@code_order);
+ if (ref($gotcodedefaults{$clonedom}) eq 'HASH') {
+ if (ref($gotcodedefaults{$clonedom}{'defaults'}) eq 'HASH') {
+ %codedefaults = %{$gotcodedefaults{$clonedom}{'defaults'}};
+ }
+ if (ref($gotcodedefaults{$clonedom}{'order'}) eq 'ARRAY') {
+ @code_order = @{$gotcodedefaults{$dom}{'order'}};
+ }
+ } else {
+ &Apache::lonnet::auto_instcode_defaults($clonedom,
+ \%codedefaults,
+ \@code_order);
+ $gotcodedefaults{$clonedom}{'defaults'} = \%codedefaults;
+ $gotcodedefaults{$clonedom}{'order'} = \@code_order;
+ }
+ if (@code_order > 0) {
+ if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order,
+ $cloner,$clonefromcode,$instcode)) {
+ $canclone = 1;
+ last;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($clonedom);
+ if ($domdefs{'canclone'}) {
+ unless ($domdefs{'canclone'} eq 'none') {
+ if ($domdefs{'canclone'} eq 'domain') {
+ if ($udom eq $clonedom) {
+ $canclone = 1;
+ }
+ } elsif (($clonefromcode) && ($instcode) &&
+ ($clonedom eq $dom)) {
+ if (&Apache::lonnet::default_instcode_cloning($clonedom,$domdefs{'canclone'},
+ $clonefromcode,$instcode)) {
+ $canclone = 1;
+ }
+ }
+ }
+ }
}
unless ($canclone) {
if (&Apache::lonnet::is_course_owner($clonedom,$clonecrs,$uname,$udom)) {
@@ -1168,70 +1843,82 @@ sub can_clone_course {
}
sub get_processtype {
- my ($uname,$udom,$isadv,$dom,$crstype,$inststatuses,$domconfig) = @_;
+ my ($context,$uname,$udom,$isadv,$dom,$crstype,$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 = ('autolimit','validate','approval');
- if ($dom eq $udom) {
+ my (%userenv,%settings,$val,@options,$envkey);
+ if ($context eq 'course') {
+ @options = ('autolimit','validate','approval');
+ $envkey = 'requestcourses.'.$crstype;
+ if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
+ if (ref($domconfig->{'requestcourses'}->{$crstype}) eq 'HASH') {
+ %settings = %{$domconfig->{'requestcourses'}->{$crstype}};
+ }
+ }
+ } else {
+ @options = ('automatic','approval');
+ $envkey = 'requestauthor';
+ if (ref($domconfig->{'requestauthor'}) eq 'HASH') {
+ %settings = %{$domconfig->{'requestauthor'}};
+ }
+ }
+ if (($dom eq $udom) || ($context eq 'requestauthor')) {
%userenv =
- &Apache::lonnet::userenvironment($udom,$uname,'requestcourses.'.$crstype,'inststatus');
- if ($userenv{'requestcourses.'.$crstype}) {
- $val = $userenv{'requestcourses.'.$crstype};
+ &Apache::lonnet::userenvironment($udom,$uname,$envkey,'inststatus');
+ if ($userenv{$envkey}) {
+ $val = $userenv{$envkey};
@{$inststatuses} = ('_custom_');
} else {
- my ($task,%alltasks);
- if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
- %settings = %{$domconfig->{'requestcourses'}};
- if (ref($settings{$crstype}) eq 'HASH') {
- if (($isadv) && ($settings{$crstype}{'_LC_adv'} ne '')) {
- $val = $settings{$crstype}{'_LC_adv'};
- @{$inststatuses} = ('_LC_adv_');
- } else {
- if ($userenv{'inststatus'} ne '') {
- @{$inststatuses} = split(',',$userenv{'inststatus'});
- } else {
- @{$inststatuses} = ('default');
- }
- foreach my $status (@{$inststatuses}) {
- if (exists($settings{$crstype}{$status})) {
- my $value = $settings{$crstype}{$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);
- }
+ my %alltasks;
+ 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);
}
}
- my $maxlimit = 0;
-
- foreach my $key (sort(keys(%alltasks))) {
- if ($key =~ /^autolimit=(\d*)$/) {
- if ($1 eq '') {
- $val ='autolimit=';
- last;
- } elsif ($1 > $maxlimit) {
- $maxlimit = $1;
- }
+ }
+ }
+ my $maxlimit = 0;
+ if ($context eq 'course') {
+ foreach my $key (sort(keys(%alltasks))) {
+ if ($key =~ /^autolimit=(\d*)$/) {
+ if ($1 eq '') {
+ $val ='autolimit=';
+ last;
+ } elsif ($1 > $maxlimit) {
+ $maxlimit = $1;
}
}
- if ($maxlimit) {
- $val = 'autolimit='.$maxlimit;
- } else {
- foreach my $option (@options) {
- if ($alltasks{$option}) {
- $val = $option;
- last;
- }
+ }
+ }
+ if (($context eq 'requestauthor') || (!$val)) {
+ if ($context eq 'course' && $maxlimit) {
+ $val = 'autolimit='.$maxlimit;
+ } else {
+ foreach my $option (@options) {
+ if ($alltasks{$option}) {
+ $val = $option;
+ last;
}
}
}
@@ -1274,7 +1961,7 @@ sub queued_selfenrollment {
}
if (keys(%reqs_by_date)) {
unless ($notitle) {
- $output .= ''.&mt('Enrollment requests pending Course Coordinator approval').' ';
+ $output .= ' '.&mt('Enrollment requests pending Course Coordinator approval').' ';
}
$output .= &Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
@@ -1414,8 +2101,24 @@ sub process_official_reqs {
}
$reqstatus = $disposition;
if ($disposition eq 'process') {
- my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg);
- my $result = &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,\$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);
+ my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,$code);
+ my %customitems;
+ my $fullname = &Apache::loncommon::plainname($ownername,$ownerdom);
+ my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$ownername,
+ $ownerdom,$fullname,$cdescr);
+ if (ref($inprocess) eq 'HASH') {
+ foreach my $key (keys(%{$inprocess})) {
+ if (exists($history{'details'}{$key})) {
+ $customitems{$key} = $history{'details'}{$key};
+ }
+ }
+ }
+ if ($history{'details'}{'clonecrs'}) {
+ $customitems{'_LC_clonefrom'} = $history{'details'}{'clonedom'}.'_'.$history{'details'}{'clonecrs'};
+ }
+ my ($result,$postprocess) =
+ &course_creation($dom,$cnum,'domain',$history{'details'},\$logmsg,\$newusermsg,\$addresult,
+ \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,\$code,\%customitems);
if ($result eq 'created') {
$disposition = 'created';
$reqstatus = 'created';
@@ -1428,13 +2131,33 @@ sub process_official_reqs {
my $owner = $ownername.':'.$ownerdom;
my $approvedmsg =
[{
- mt => 'Your request course, queued pending validation has now been created.',
+ mt => 'Your requested course: [_1], (queued pending validation) has now been created.',
+ args => [$cdescr],
},
{
- mt => 'Visit [_1], to log-in and access the course.',
+ mt => 'Visit [_1] to log-in and access the course.',
args => [$firsturl],
+ },
+ {
+ mt => 'If currently logged-in to LON-CAPA, log-out and log-in again to select your new course role.'
}];
my $sender = $dcname.':'.$dcdom;
+ if (ref($postprocess) eq 'HASH') {
+ if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
+ foreach my $item (@{$postprocess->{'createdmsg'}}) {
+ if (ref($item) eq 'HASH') {
+ if ($item->{'mt'} ne '') {
+ push(@{$approvedmsg},$item);
+ }
+ }
+ }
+ }
+ if (ref($postprocess->{'createdactions'}) eq 'HASH') {
+ if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') {
+ &postprocess_crsenv($dom,$cnum,$postprocess->{'createdactions'}{'environment'});
+ }
+ }
+ }
&send_selfserve_notification($owner,$approvedmsg,
$cid,$cdescr,$now,
$beneficiary,$sender,
@@ -1503,6 +2226,204 @@ sub process_official_reqs {
}
}
return $output;
+}
+
+sub postprocess_crsenv {
+ my ($dom,$cnum,$postprocessenv) = @_;
+ if (ref($postprocessenv) eq 'HASH') {
+ my $cid = $dom.'_'.$cnum;
+ my %settablecrsenv = (
+ 'internal.selfenroll_types' => 1,
+ 'internal.selfenroll_registered' => 1,
+ 'internal.selfenroll_section' => 1,
+ 'internal.selfenroll_start_access' => 1,
+ 'internal.selfenroll_end_access' => 1,
+ 'internal.selfenroll_limit' => 1,
+ 'internal.selfenroll_cap' => 1,
+ 'internal.selfenroll_approval' => 1,
+ 'internal.selfenroll_notifylist' => 1,
+ );
+ my %needcrsidput = (
+ 'internal.selfenroll_types' => 1,
+ 'internal.selfenroll_start_date' => 1,
+ 'internal. selfenroll_end_date' => 1,
+ );
+ my (@needupdate,%newcrsenv);
+ foreach my $key (keys(%{$postprocessenv})) {
+ if ($settablecrsenv{$key}) {
+ $newcrsenv{$key} = $postprocessenv->{$key};
+ if ($needcrsidput{$key}) {
+ push(@needupdate,$key);
+ }
+ }
+ if (keys(%newcrsenv)) {
+ my $putresult = &Apache::lonnet::put('environment',\%newcrsenv,$dom,$cnum);
+ if ($putresult eq 'ok') {
+ if (@needupdate) {
+ my %crsinfo =
+ &Apache::lonnet::courseiddump($dom,'.',1,'.','.',$cnum,undef,undef,'.');
+ if (ref($crsinfo{$cid}) eq 'HASH') {
+ foreach my $key (@needupdate) {
+ $crsinfo{$cid}{$key} = $newcrsenv{$key};
+ }
+ my $chome = &Apache::lonnet::homeserver($cnum,$dom);
+ &Apache::lonnet::courseidput($dom,\%crsinfo,$chome,'notime');
+ }
+ }
+ }
+ }
+ }
+ }
+ return;
+}
+
+
+sub requestcourses_validation_types {
+ my @items = ('url','fields','button','markup');
+ my %names = &Apache::lonlocal::texthash (
+ url => 'Web address of validation server/script',
+ fields => 'Form fields to send to validator',
+ button => 'Text for validation button',
+ markup => 'Validation description (HTML)',
+ );
+ my @fields = ('owner','course','coursetype','description');
+ return (\@items,\%names,\@fields);
+}
+
+sub is_active_author {
+ if ($env{'user.role.au./'.$env{'user.domain'}.'/'} =~ /^(\d*)\.(\d*)$/) {
+ if ((!$1 || $1 < time) &&
+ (!$2 || $2 > time)) {
+ return 1;
+ }
+ }
+}
+
+sub author_prompt {
+ my ($is_active_author,$offer_author);
+ if ($env{'environment.canrequest.author'}) {
+ unless (&is_active_author()) {
+ unless (&reqauthor_check() =~ /^approval:\d+$/) {
+ $offer_author = 1;
+ }
+ }
+ }
+ return $offer_author;
+}
+
+sub reqauthor_check {
+ my $queued = $env{'environment.requestauthorqueued'};
+ my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
+ $env{'user.domain'},$env{'user.name'});
+ my $reqstatus = $reqauthor{'author_status'};
+ if (($reqstatus eq '' && $queued ne '') ||
+ ($env{'environment.requestauthorqueued'} !~ /^\Q$reqstatus\E/)) {
+ if (ref($reqauthor{'author'}) eq 'HASH') {
+ $queued = $reqstatus.':'.$reqauthor{'author'}{'timestamp'};
+ } else {
+ undef($queued);
+ }
+ &Apache::lonnet::appenv({'environment.requestauthorqueued' => $queued});
+ }
+ return $queued;
+}
+
+sub process_reqauthor {
+ my ($dispositionref,$updateref) = @_;
+ if (&is_active_author()) {
+ return ''.
+ &mt('An Authoring Space has already been assigned to you.').' '.
+ &mt('Please select the Author role from your [_1]roles page[_2].','',
+ '').'';
+ }
+ unless ($env{'environment.canrequest.author'}) {
+ return ''.
+ &mt('You do not currently have rights to request an Authoring Space.').' '.
+ &mt('Please contact the [_1]helpdesk[_2] for assistance.','',
+ '').'';
+ }
+ my $queued = &reqauthor_check();
+ if ($queued =~ /^approval:(\d+)$/) {
+ my $timestamp = $1;
+ return ''.
+ &mt('A request for Authoring Space submitted on [_1] is awaiting approval',
+ &Apache::lonlocal::locallocaltime($timestamp)).
+ '';
+ } elsif ($queued =~ /^approved:(\d+)$/) {
+ my $timestamp = $1;
+ my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
+ ['active'],['au'],[$env{'user.domain'}]);
+ if (keys(%roleshash) > 0) {
+ return ''.
+ &mt('A request for Authoring Space submitted on [_1] has been approved.',
+ &Apache::lonlocal::locallocaltime($timestamp)).
+ '';
+ }
+ }
+ my ($output,@inststatuses,%domconfig);
+ %domconfig = &Apache::lonnet::get_dom('configuration',['requestauthor'],
+ $env{'user.domain'});
+ my $val = &get_processtype('requestauthor',$env{'user.name'},$env{'user.domain'},
+ $env{'user.adv'},$env{'user.domain'},undef,
+ \@inststatuses,\%domconfig);
+ my $now = time;
+ if ($val eq 'automatic') {
+ my $start = $now-1;
+ if (&Apache::lonnet::assignrole($env{'user.domain'},$env{'user.name'},'/'.$env{'user.domain'}.'/',
+ 'au',undef,$start,undef,undef,'requestauthor') eq 'ok') {
+ $output = ''.
+ &mt('Access to Authoring Space has been activated').' ';
+ &Apache::lonroles::update_session_roles();
+ &Apache::lonnet::appenv({'user.update.time' => $now});
+ if (ref($updateref)) {
+ $$updateref = $now;
+ }
+ if (ref($dispositionref)) {
+ $$dispositionref = 'created';
+ }
+ } else {
+ $output = ''.
+ &mt('An error occurred while activating your access to Authoring Space');
+ }
+ } elsif ($val eq 'approval') {
+ my $domconfiguser = &Apache::lonnet::get_domainconfiguser($env{'user.domain'});
+ if (&Apache::lonnet::put('requestauthorqueue',{ $env{'user.name'}.'_'.$val => $now },
+ $env{'user.domain'},$domconfiguser) eq 'ok') {
+ my %userrequest = (
+ author => {
+ timestamp => $now,
+ status => $val,
+ },
+ author_status => $val,
+ );
+ my $req_notifylist;
+ if (ref($domconfig{'requestauthor'}) eq 'HASH') {
+ if (ref($domconfig{'requestauthor'}{'notify'}) eq 'HASH') {
+ my $req_notifylist = $domconfig{'requestauthor'}{'notify'}{'approval'};
+ if ($req_notifylist) {
+ my $fullname = &Apache::loncommon::plainname($env{'user.name'},
+ $env{'user.domain'});
+ my $sender = $env{'user.name'}.':'.$env{'user.domain'};
+ my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description');
+ &send_selfserve_notification($req_notifylist,
+ "$fullname ($env{'user.name'}:$env{'user.domain'})",
+ undef,$domdesc,$now,'authorreq',$sender);
+ }
+ }
+ }
+ my $userresult =
+ &Apache::lonnet::put('requestauthor',\%userrequest,$env{'user.domain'},$env{'user.name'});
+ $output = ''.
+ &mt('Your request for Authoring Space has been submitted for approval.').
+ '';
+ &Apache::lonnet::appenv({'environment.requestauthorqueued' => $val.':'.$now});
+ } else {
+ $output = ''.
+ &mt('An error occurred saving your request for Authoring Space.').
+ '';
+ }
+ }
+ return $output;
}
1;
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.