--- loncom/interface/lonpickcourse.pm 2016/11/02 22:41:18 1.122
+++ loncom/interface/lonpickcourse.pm 2017/01/02 19:44:06 1.123
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Pick a course
#
-# $Id: lonpickcourse.pm,v 1.122 2016/11/02 22:41:18 raeburn Exp $
+# $Id: lonpickcourse.pm,v 1.123 2017/01/02 19:44:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,13 +37,32 @@ use Apache::lonnet;
use Apache::lonlocal;
use Apache::longroup;
use LONCAPA qw(:DEFAULT :match);
+use JSON::DWIW;
sub handler {
my $r = shift;
+ if ($env{'form.context'} eq 'adhoc') {
+ &Apache::loncommon::content_type($r,'application/json');
+ $r->send_http_header;
+ my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($env{'form.cid'});
+ if ((ref($possroles) eq 'ARRAY') && (ref($description) eq 'HASH')) {
+ my $response = [];
+ if (@{$possroles}) {
+ foreach my $role (@{$possroles}) {
+ push(@{$response},
+ { name => $role,
+ desc => $description->{$role},
+ });
+ }
+ }
+ $r->print(JSON::DWIW->to_json({roles => $response}));
+ }
+ return OK;
+ }
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
return OK if $r->header_only;
-
+
# ------------------------------------------------------------ Print the screen
# Get parameters from query string
@@ -53,7 +72,8 @@ sub handler {
'multiple','type','setroles','fixeddom','cloner',
'crscode','crsdom']);
my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement,
- $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,$crsdom);
+ $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,
+ $crsdom,$rolechooser);
# Get course type - Course, Community or Placement.
$type = $env{'form.type'};
@@ -75,6 +95,25 @@ sub handler {
$roleelement = '';
$submitopener = &processpick();
$autosubmit = 'process_pick("'.$roledom.'","'.$rolename.'")';
+ if ($rolename eq 'dh') {
+ my %lt = &Apache::lonlocal::texthash(
+ title => 'Ad hoc role selection',
+ preamble => 'Please choose an ad hoc role in the course.',
+ cancel => 'Click "OK" to enter the course, or "Cancel" to choose a different course.',
+ );
+
+ $rolechooser = <<"END";
+
+
$lt{'preamble'}
+
+
$lt{'cancel'}
+
+END
+ }
}
if ($env{'form.typeelement'} ne '') {
$typeelement = '';
@@ -149,7 +188,8 @@ sub handler {
# print javascript functions for choosing a course
if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) ||
$onlyown) {
- $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction));
+ $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction,
+ $rolename,$rolechooser));
}
$r->print(&Apache::lonhtmlcommon::scripttag($jscript));
$r->print($submitopener);
@@ -803,7 +843,7 @@ sub course_chooser {
}
sub gochoose_javascript {
- my ($type,$multiple,$autosubmit,$lastaction) = @_;
+ my ($type,$multiple,$autosubmit,$lastaction,$rolename,$rolechooser) = @_;
my %elements = (
'Course' => {
name => 'coursepick',
@@ -821,9 +861,24 @@ sub gochoose_javascript {
list => 'courselist',
},
);
- my $output = qq|
+
+ my %lt = &Apache::lonlocal::texthash (
+ none => 'You are not eligible to use an ad hoc role for the selected course',
+ ok => 'OK',
+ exit => 'Cancel',
+ );
+ &js_escape(\%lt);
+
+ my $output;
+ if ($rolechooser) {
+ $output .= qq|
+\$( "#LC_adhocrole_chooser" ).dialog({ autoOpen: false });
+|;
+ }
+ $output .= qq|
function gochoose(cname,cdom,cdesc) {
var openerForm = "$env{'form.form'}";
+ var openerRole = "$rolename";
courseCount = 0;
var courses = '';
|;
@@ -899,16 +954,210 @@ ENDNAMECODE
}
|;
}
- $output .= qq|
+ $output .= <"+data.roles[i].desc+" ")
+ .appendTo("#LC_choose_adhoc");
+ }
+ \$( "#LC_get_role_0").prop("checked", true);
+ \$( "#LC_adhocrole_chooser" ).dialog({ autoOpen: false });
+ \$( "#LC_adhocrole_chooser" ).dialog("open");
+ \$( "#LC_adhocrole_chooser" ).dialog({
+ height: 400,
+ width: 500,
+ modal: true,
+ resizable: false,
+ buttons: [
+ {
+ text: "$lt{'ok'}",
+ click: function() {
+ var rolename = \$('input[name=LC_get_role]:checked', '#LChelpdeskpicker').val();
+ process_pick(cdom,rolename);
+ \$("#LC_adhocrole_chooser").dialog( "close" );
+ $lastaction;
+ }
+ },
+ {
+ text: "$lt{'exit'}",
+ click: function() {
+ \$("#LC_adhocrole_chooser").dialog( "close" );
+ }
+ }
+ ],
+ });
+ \$( "#LC_adhocrole_chooser" ).find( "form" ).on( "submit", function( event ) {
+ event.preventDefault();
+ var rolename = \$('input[name=LC_get_role]:checked', '#LChelpdeskpicker').val()
+ process_pick(cdom,rolename);
+ \$("#LC_adhocrole_chooser").dialog( "close" );
+ $lastaction;
+ });
+ }
+ }
+ }
}
-|;
- return &Apache::lonhtmlcommon::scripttag($output);
+http.send(params);
+ } else {
+ $autosubmit
+ $lastaction
+ }
+}
+
+ENDJS
+ return $rolechooser.&Apache::lonhtmlcommon::scripttag($output);
+}
+
+sub get_my_adhocroles {
+ my (@okroles,%description);
+ if ($env{'form.cid'} =~ /^($match_domain)_($match_courseid)$/) {
+ my $cdom = $1;
+ my $cnum = $2;
+ if ($env{"user.role.dh./$cdom/"}) {
+ my $then=$env{'user.login.time'};
+ my $update=$env{'user.update.time'};
+ my $liverole = 1;
+ my ($tstart,$tend)=split(/\./,$env{'user.role.dh./'.$cdom});
+ my $limit = $update;
+ if ($env{'request.role'} eq 'dh./'.$cdom.'/') {
+ $limit = $then;
+ }
+ if ($tstart && $tstart>$limit) { $liverole = 0; }
+ if ($tend && $tend <$limit) { $liverole = 0; }
+ if ($liverole) {
+ if (&Apache::lonnet::homeserver($cnum,$cdom) ne 'no_host') {
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom);
+ if (ref($domdefaults{'adhocroles'}) eq 'HASH') {
+ my $count = 0;
+ my %domcurrent = %{$domdefaults{'adhocroles'}};
+ my (%ordered,%access_in_dom);
+ foreach my $role (sort(keys(%{$domdefaults{'adhocroles'}}))) {
+ my ($order,$desc,$access_in_dom);
+ if (ref($domcurrent{$role}) eq 'HASH') {
+ $order = $domcurrent{$role}{'order'};
+ $desc = $domcurrent{$role}{'desc'};
+ $access_in_dom{$role} = $domcurrent{$role}{'access'};
+ }
+ if ($order eq '') {
+ $order = $count;
+ }
+ $ordered{$order} = $role;
+ if ($desc ne '') {
+ $description{$role} = $desc;
+ } else {
+ $description{$role}= $role;
+ }
+ $count++;
+ }
+ my @roles_by_num = ();
+ foreach my $item (sort {$a <=> $b } (keys(%ordered))) {
+ push(@roles_by_num,$ordered{$item});
+ }
+ if (@roles_by_num) {
+ my %settings = &Apache::lonnet::dump('environment',$cdom,$cnum,'internal\.adhoc');
+ my %setincrs;
+ if ($settings{'internal.adhocaccess'}) {
+ map { $setincrs{$_} = 1; } split(/,/,$settings{'internal.adhocaccess'});
+ }
+ my @statuses;
+ if ($env{'environment.inststatus'}) {
+ @statuses = split(/,/,$env{'environment.inststatus'});
+ }
+ my $user = $env{'user.name'}.':'.$env{'user.domain'};
+ foreach my $role (@roles_by_num) {
+ my ($curraccess,@okstatus,@personnel);
+ if ($setincrs{$role}) {
+ ($curraccess,my $rest) = split(/=/,$settings{'internal.adhoc.'.$role});
+ if ($curraccess eq 'none') {
+ next;
+ } elsif ($curraccess eq 'all') {
+ push(@okroles,$role);
+ } elsif ($curraccess eq 'status') {
+ @okstatus = split(/\&/,$rest);
+ } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
+ @personnel = split(/\&/,$rest);
+ }
+ } else {
+ $curraccess = $access_in_dom{$role};
+ if ($curraccess eq 'status') {
+ if (ref($domcurrent{$role}{$curraccess}) eq 'ARRAY') {
+ @okstatus = @{$domcurrent{$role}{$curraccess}};
+ }
+ } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
+ if (ref($domcurrent{$role}{$curraccess}) eq 'ARRAY') {
+ @personnel = @{$domcurrent{$role}{$curraccess}};
+ }
+ }
+ }
+ if ($curraccess eq 'none') {
+ next;
+ } elsif ($curraccess eq 'all') {
+ push(@okroles,$role);
+ } elsif ($curraccess eq 'status') {
+ if (@okstatus) {
+ if (!@statuses) {
+ if (grep(/^default$/,@okstatus)) {
+ push(@okroles,$role);
+ }
+ } else {
+ foreach my $status (@okstatus) {
+ if (grep(/^\Q$status\E$/,@statuses)) {
+ push(@okroles,$role);
+ last;
+ }
+ }
+ }
+ }
+ } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) {
+ if (grep(/^\Q$user\E$/,@personnel)) {
+ if ($curraccess eq 'exc') {
+ push(@okroles,$role);
+ }
+ } elsif ($curraccess eq 'inc') {
+ push(@okroles,$role);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ my $response = [];
+ if (@okroles) {
+ foreach my $role (@okroles) {
+ push(@{$response},
+ { name => $role,
+ desc => $description{$role},
+ });
+ }
+ }
+ my $json = JSON::DWIW->to_json({roles => $response});
+ return $json;
}
1;
@@ -1038,9 +1287,9 @@ Side Effects: None
=item *
X
-B:
+B:
-Input: 4 - course type; single (0) or multiple courses (1); in context of DC selecting a CC role in a course: javascript code from &processpick(); final action to take after user chooses course(s): either close window, or submit form for display of next page etc.
+Input: 5 - course type; single (0) or multiple courses (1); in context of DC selecting a CC role in a course: javascript code from &processpick(); final action to take after user chooses course(s): either close window, or submit form for display of next page etc.; rolename (e.g., dh) of user's current role.
Output: 1 $output - javascript wrapped in EscriptEE/scriptE tags