version 1.2, 2005/10/27 23:42:17
|
version 1.4, 2005/11/22 00:01:41
|
Line 29 use Apache::lonnet;
|
Line 29 use Apache::lonnet;
|
use Apache::loncommon; |
use Apache::loncommon; |
use Apache::lonhtmlcommon; |
use Apache::lonhtmlcommon; |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use Apache::lonnavmaps; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
|
|
sub handler { |
sub handler { |
my ($r) = @_; |
my ($r) = @_; |
|
|
&Apache::loncommon::content_type($r,'text/html'); |
&Apache::loncommon::content_type($r,'text/html'); |
$r->send_http_header; |
$r->send_http_header; |
|
|
Line 40 sub handler {
|
Line 42 sub handler {
|
return OK; |
return OK; |
} |
} |
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
|
['action','state']); |
|
|
|
$r->print(&header()); |
|
|
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/groups", |
|
text=>"Group Management", |
|
faq=>9,bug=>'Instructor Interface',}); |
|
# Needs to be in a course |
# Needs to be in a course |
if (! ($env{'request.course.fn'})) { |
if (! ($env{'request.course.fn'})) { |
# Not in a course |
# Not in a course |
$env{'user.error.msg'}= |
$env{'user.error.msg'}= |
"/adm/groups:mdg:0:0:Cannot create, modify or delete course groups"; |
"/adm/coursegroups:mdg:0:0:Cannot edit or view course groups"; |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
|
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
|
['action','refpage']); |
|
|
|
my $function = &Apache::loncommon::get_users_function(); |
|
my $tabcol = &Apache::loncommon::designparm($function.'.tabbg'); |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
|
my $view_permission = |
my $view_permission = |
&Apache::lonnet::allowed('vcg',$env{'request.course.id'}); |
&Apache::lonnet::allowed('vcg',$env{'request.course.id'}); |
my $manage_permission = |
my $manage_permission = |
&Apache::lonnet::allowed('mdg',$env{'request.course.id'}); |
&Apache::lonnet::allowed('mdg',$env{'request.course.id'}); |
|
|
if (! exists($env{'form.action'})) { |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
$r->print(&Apache::lonhtmlcommon::breadcrumbs |
|
(undef,'Course Group Manager')); |
my %functions = ( |
&print_main_menu($r,$manage_permission,$view_permission); |
email => 'E-mail', |
} elsif ($env{'form.action'} eq 'create' && $manage_permission) { |
discussion => 'Discussion boards', |
&Apache::lonhtmlcommon::add_breadcrumb |
chat => 'Chat', |
({href=>'/adm/coursegroups?action=create&state=', |
files => 'File repository', |
text=>"Create Group"}); |
roster => 'Membership roster', |
$r->print(&Apache::lonhtmlcommon::breadcrumbs |
homepage => 'Group home page', |
(undef,'Create Group','Course_Create_Group')); |
); |
if (! exists($env{'form.state'})) { |
|
&first_creation_form($r); |
my %idx = (); |
} elsif ($env{'form.state'} eq 'pick_members') { |
$idx{id} = &Apache::loncoursedata::CL_ID(); |
&second_creation_form($r); |
$idx{fullname} = &Apache::loncoursedata::CL_FULLNAME(); |
} elsif ($env{'form.state'} eq 'complete') { |
$idx{udom} = &Apache::loncoursedata::CL_SDOM(); |
&completed_creation($r); |
$idx{uname} = &Apache::loncoursedata::CL_SNAME(); |
|
|
|
my $action = $env{'form.action'}; |
|
if ($action eq 'create' || $action eq 'modify' || $action eq 'view') { |
|
if ($view_permission || $manage_permission) { |
|
&group_administration($r,$action,$cdom,$cnum,$function,$tabcol, |
|
\%functions,\%idx,$view_permission,$manage_permission); |
} else { |
} else { |
&first_creation_form($r); |
$r->print('You do not have group administration '. |
|
'privileges in this course'); |
} |
} |
|
} else { |
|
&print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx, |
|
$view_permission,$manage_permission); |
} |
} |
$r->print(&footer()); |
|
return OK; |
return OK; |
} |
} |
|
|
|
sub print_main_menu { |
|
my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, |
|
$manage_permission) |
|
= @_; |
|
$r->print(&header('Course Groups',&mt('LON-CAPA Course Groups'), |
|
undef,undef,undef,$function)); |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/coursegroups", |
|
text=>"Course Groups",}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs |
|
(undef,'Course Groups')); |
|
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, |
|
$view_permission,$manage_permission); |
|
$r->print(&footer()); |
|
return; |
|
} |
|
|
|
sub display_groups { |
|
my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission, |
|
$manage_permission) = @_; |
|
my %curr_groups = (); |
|
my %grp_info = (); |
|
my $rowColor1 = "#dddddd"; |
|
my $rowColor2 = "#eeeeee"; |
|
|
|
$r->print('<br /><br />'); |
|
if ($view_permission) { |
|
my %curr_groups; |
|
if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) { |
|
$r->print(&Apache::lonhtmlcommon::start_pick_box()); |
|
$r->print(<<"END"); |
|
<table border="0" cellpadding="4" cellspacing="1"> |
|
<tr bgcolor="$tabcol" align="center"> |
|
<td><b>Action</b></td> |
|
<td><b><a href="javascript:changeSort('groupname')">Group Name</a></b></td> |
|
<td><b><a href="javascript:changeSort('description')">Description</a></b></td> |
|
<td><b><a href="javascript:changeSort('creator')">Creator</a></b> |
|
</td> |
|
<td><b><a href="javascript:changeSort('creation')">Created</a></b> |
|
</td> |
|
<td><b><a href="javascript:changeSort('modified')">Last Modified</a></b> |
|
</td> |
|
<td><b>Functionality</b> |
|
</td> |
|
<td><b><a href="javascript:changeSort('quota')">Quota (Mb)</a></b></td> |
|
<td><b><a href="javascript:changeSort('totalmembers)">Members</a></b></td> |
|
<td><b><a href="javascript:changeSort('totalfiles')">Files</a></b></td> |
|
<td><b><a href="javascript:changeSort('boards')">Discussion boards</a></b></td> |
|
<td><b><a href="javascript:changeSort('diskuse')">Disk use</a></b></td> |
|
</tr> |
|
END |
|
my %Sortby = (); |
|
foreach my $group (sort(keys(%curr_groups))) { |
|
%{$grp_info{$group}} = |
|
&Apache::loncommon::get_group_settings( |
|
$curr_groups{$group}); |
|
my $members_result = &group_members($cdom,$cnum,$group,\%grp_info); |
|
my $files_result = &group_files($group,\%grp_info); |
|
if ($env{'form.sortby'} eq 'groupname') { |
|
push(@{$Sortby{$group}},$group); |
|
} elsif ($env{'form.sortby'} eq 'description') { |
|
push(@{$Sortby{$grp_info{$group}{'description'}}}, |
|
$group); |
|
} elsif ($env{'form.sortby'} eq 'creator') { |
|
push(@{$Sortby{$grp_info{$group}{'creator'}}},$group); |
|
} elsif ($env{'form.sortby'} eq 'creation') { |
|
push(@{$Sortby{$grp_info{$group}{'creation'}}},$group); |
|
} elsif ($env{'form.sortby'} eq 'modified') { |
|
push(@{$Sortby{$grp_info{$group}{'modified'}}},$group); |
|
} elsif ($env{'form.sortby'} eq 'quota') { |
|
push(@{$Sortby{$grp_info{$group}{'quota'}}},$group); |
|
} elsif ($env{'form.sortby'} eq 'totalmembers') { |
|
push(@{$Sortby{$grp_info{$group}{'totalmembers'}}}, |
|
$group); |
|
} elsif ($env{'form.sortby'} eq 'totalfiles') { |
|
push(@{$Sortby{$grp_info{$group}{'totalfiles'}}}, |
|
$group); |
|
} elsif ($env{'form.sortby'} eq 'boards') { |
|
push(@{$Sortby{$grp_info{$group}{'boards'}}},$group); |
|
} elsif ($env{'form.sortby'} eq 'diskuse') { |
|
push(@{$Sortby{$grp_info{$group}{'diskuse'}}},$group); |
|
} else { |
|
push(@{$Sortby{$group}},$group); |
|
} |
|
} |
|
my $rowNum = 0; |
|
my $rowColor; |
|
foreach my $key (sort(keys(%Sortby))) { |
|
foreach my $group (@{$Sortby{$key}}) { |
|
if ($rowNum %2 == 1) { |
|
$rowColor = $rowColor1; |
|
} else { |
|
$rowColor = $rowColor2; |
|
} |
|
my $description = |
|
&Apache::lonnet::unescape($grp_info{$group}{'description'}); |
|
my $creator = $grp_info{$group}{'creator'}; |
|
my $creation = $grp_info{$group}{'creation'}; |
|
my $modified = $grp_info{$group}{'modified'}; |
|
my $quota = $grp_info{$group}{'quota'}; |
|
my $totalmembers = $grp_info{$group}{'totalmembers'}; |
|
my $totalfiles = $grp_info{$group}{'totalfiles'}; |
|
my $boards = $grp_info{$group}{'boards'}; |
|
my $diskuse = $grp_info{$group}{'diskuse'}; |
|
my $functionality; |
|
foreach my $tool (sort keys(%{$functions})) { |
|
if (defined($grp_info{$group}{functions}{$tool})) { |
|
$functionality .= ' '.$tool; |
|
} |
|
} |
|
if (!$functionality) { |
|
$functionality = 'None available'; |
|
} |
|
$r->print('<tr bgcolor="'.$rowColor.'"><td align="right"> |
|
<a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/grppg?register=1"/>View</a> <a href="/adm/coursegroups?action=modify&group='.$group.'">Modify</a></td><td><small>'.$group.'</small></td><td><small>'.$description.'</small></td><td><small>'.$creator.'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($creation).'</small></td><td><small>'. &Apache::lonnavmaps::timeToHumanString($modified).'</small></td><td><small>'.$functionality.'</small></td><td><small>'.$quota.'</small></td><td><small>'.$totalmembers.'</small></td><td><small>'.$totalfiles.'</small></td><td><small>'.$boards.'</small></td><td><small>'.$diskuse.'</small></td></tr>'); |
|
$rowNum ++; |
|
} |
|
} |
|
$r->print('</table>'); |
|
$r->print(&Apache::lonhtmlcommon::end_pick_box()); |
|
} else { |
|
$r->print('No groups exist'); |
|
} |
|
} else { |
|
my @coursegroups = split(/:/,$env{'request.course.groups'}); |
|
if (@coursegroups > 0) { |
|
my %curr_groups; |
|
if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) { |
|
foreach my $group (@coursegroups) { |
|
my %group_info = &Apache::loncommon::get_group_settings( |
|
$curr_groups{$group}); |
|
my $description = &Apache::lonnet::unescape( |
|
$group_info{description}); |
|
my ($uname,$udom) = split(/:/,$group_info{creator}); |
|
$r->print('<font size="+1"><a href="/adm/'.$udom.'/'.$uname.'/'.$group.'/grppg?register=1">'.$group,'</a><font><br /><small>'.$description.'</small><br /><br />'); |
|
} |
|
} |
|
} else { |
|
$r->print('You are not currently a member of any active groups in this course'); |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub group_administration { |
|
my ($r,$action,$cdom,$cnum,$function,$tabcol,$functions,$idx, |
|
$view_permission,$manage_permission) = @_; |
|
my %sectioncount = (); |
|
my @tools = (); |
|
my @types = (); |
|
my @roles = (); |
|
my @sections = (); |
|
my %users = (); |
|
my %userdata = (); |
|
my @members = (); |
|
my %usertools = (); |
|
|
|
my $state = $env{'form.state'}; |
|
my ($groupname,$description,$startdate,$enddate); |
|
|
|
if ($action eq 'create') { |
|
if ($state eq '') { |
|
$state = 'pick_name'; |
|
} else { |
|
($startdate,$enddate) = &get_dates_from_form(); |
|
if (defined($env{'form.groupname'})) { |
|
$groupname = $env{'form.groupname'}; |
|
} |
|
if (defined($env{'form.description'})) { |
|
$description = $env{'form.description'}; |
|
} |
|
if (defined($env{'form.tool'})) { |
|
@tools=&Apache::loncommon::get_env_multiple('form.tool'); |
|
} |
|
if (defined($env{'form.member'})) { |
|
@members = &Apache::loncommon::get_env_multiple('form.member'); |
|
foreach my $user (@members) { |
|
%{$usertools{$user}} = (); |
|
} |
|
} |
|
} |
|
} |
|
|
|
my %toolprivs = (); |
|
%{$toolprivs{'email'}} = ( |
|
sgm => 'Send group mail', |
|
sgb => 'Broadcast mail', |
|
); |
|
%{$toolprivs{'discussion'}} = ( |
|
cgb => 'Create boards', |
|
pgd => 'Post', |
|
pag => 'Anon. posts', |
|
rgi => 'Get identities', |
|
vgb => 'View boards', |
|
); |
|
%{$toolprivs{'chat'}} = ( |
|
pgc => 'Chat', |
|
); |
|
%{$toolprivs{'files'}} = ( |
|
rgf => 'Retrieve', |
|
ugf => 'Upload', |
|
dgf => 'Delete', |
|
); |
|
%{$toolprivs{'roster'}} = ( |
|
vgm => 'View', |
|
); |
|
%{$toolprivs{'homepage'}} = ( |
|
vgh => 'View page', |
|
mgh => 'Modify page', |
|
); |
|
my %fixedprivs = (); |
|
%{$fixedprivs{'email'}} = ('sgm' => 1); |
|
%{$fixedprivs{'discussion'}} = ('vgb' => 1); |
|
%{$fixedprivs{'chat'}} = ('pgc' => 1); |
|
%{$fixedprivs{'files'}} = ('rgf' => 1); |
|
%{$fixedprivs{'roster'}} = ('vgm' => 1); |
|
%{$fixedprivs{'homepage'}} = ('vgh' => 1); |
|
|
|
my %elements = (); |
|
%{$elements{'create'}} = (); |
|
%{$elements{'modify'}} = (); |
|
%{$elements{'create'}{'pick_name'}} = ( |
|
startdate_month => 'selectbox', |
|
startdate_hour => 'selectbox', |
|
enddate_month => 'selectbox', |
|
enddate_hour => 'selectbox', |
|
types => 'selectbox', |
|
roles => 'selectbox', |
|
startdate_day => 'text', |
|
startdate_year => 'text', |
|
startdate_minute => 'text', |
|
startdate_second => 'text', |
|
enddate_day => 'text', |
|
enddate_year => 'text', |
|
enddate_minute => 'text', |
|
enddate_second => 'text', |
|
groupname => 'text', |
|
description => 'text', |
|
tool => 'checkbox', |
|
granularity => 'radio', |
|
no_end_date => 'checkbox', |
|
); |
|
%{$elements{'create'}{'pick_members'}} = ( |
|
member => 'checkbox', |
|
); |
|
if (($action eq 'create') && ($state eq 'pick_name')) { |
|
my $numsections = &Apache::loncommon::get_sections($cdom,$cnum, |
|
\%sectioncount); |
|
if ($numsections > 0) { |
|
$elements{'create'}{'pick_name'}{'sectionpick'} = 'selectbox'; |
|
} |
|
} |
|
|
|
if (($action eq 'create') && (($state eq 'pick_members') || |
|
($state eq 'pick_privs'))) { |
|
if (defined($env{'form.types'})) { |
|
@types=&Apache::loncommon::get_env_multiple('form.types'); |
|
} |
|
if (defined($env{'form.roles'})) { |
|
@roles=&Apache::loncommon::get_env_multiple('form.roles'); |
|
} |
|
if (defined($env{'form.sectionpick'})) { |
|
@sections=&Apache::loncommon::get_env_multiple('form.sectionpick'); |
|
if (grep/^_all$/,@sections) { |
|
@sections = sort {$a cmp $b} keys(%sectioncount); |
|
} |
|
} |
|
&build_members_list($cdom,$cnum,\@types,\@roles, |
|
\@sections,\%users,\%userdata); |
|
if ((keys(%users) > 0) && (@tools > 0)) { |
|
foreach my $tool (@tools) { |
|
if ($env{'form.granularity'} eq 'Yes') { |
|
$elements{'create'}{'pick_members'}{'user_'.$tool} = 'checkbox'; |
|
} |
|
} |
|
$elements{'create'}{'pick_members'}{'specificity'} = 'radio'; |
|
} |
|
} |
|
|
|
if (($action eq 'create') && (($state eq 'pick_privs') || (($state eq 'result') && |
|
($env{'form.specificity'} eq 'No')))) { |
|
foreach my $tool (@tools) { |
|
my @values = &Apache::loncommon::get_env_multiple('form.user_'.$tool); |
|
foreach my $user (@values) { |
|
unless(exists($usertools{$user}{$tool})) { |
|
$usertools{$user}{$tool} = 1; |
|
} |
|
} |
|
} |
|
if (($state eq 'pick_privs') && ($env{'form.specificity'} eq 'Yes')) { |
|
foreach my $member (@members) { |
|
foreach my $tool (keys(%{$usertools{$member}})) { |
|
foreach my $priv (keys(%{$toolprivs{$tool}})) { |
|
unless (exists($fixedprivs{$tool}{$priv})) { |
|
$elements{'create'}{'pick_privs'}{'userpriv_'.$priv} = |
|
'checkbox'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
my $jscript; |
|
if ($env{'form.action'} eq 'create') { |
|
$jscript = &Apache::loncommon::check_uncheck_jscript(); |
|
} |
|
$jscript .= qq| |
|
function nextPage(formname,nextstate) { |
|
formname.state.value= nextstate; |
|
formname.submit(); |
|
} |
|
function backPage(formname,prevstate) { |
|
formname.state.value = prevstate; |
|
formname.submit(); |
|
} |
|
|
|
|; |
|
|
|
$jscript .= &Apache::lonhtmlcommon::set_form_elements( |
|
\%{$elements{$action}{$state}}); |
|
|
|
|
|
my $loaditems = &onload_action($action,$state); |
|
$r->print(&header('Course Groups Manager',&mt('LON-CAPA Groups Manager'), |
|
$jscript,$action,$state,$function,$loaditems)); |
|
|
|
if ($env{'form.refpage'} eq 'enrl') { |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/dropadd", |
|
text=>"Enrollment Manager", |
|
faq=>9,bug=>'Instructor Interface',}); |
|
} else { |
|
&Apache::lonhtmlcommon::add_breadcrumb |
|
({href=>"/adm/coursegroups", |
|
text=>"Course Groups", |
|
faq=>9,bug=>'Instructor Interface',}); |
|
} |
|
|
|
my %states = (); |
|
@{$states{'create'}} = ('pick_name','pick_members','pick_privs','result'); |
|
@{$states{'modify'}} = (); |
|
|
|
my %trail = (); |
|
%{$trail{'create'}} = ( |
|
pick_name => 'Group Settings', |
|
pick_members => 'Select Members', |
|
pick_privs => 'Choose Privileges', |
|
result => 'Creation Complete', |
|
); |
|
%{$trail{'modify'}} = (); |
|
|
|
if ((($action eq 'create') || ($action eq 'modify')) && |
|
($manage_permission)) { |
|
for (my $i=0; $i<@{$states{$action}}; $i++) { |
|
if ($state eq $states{$action}[$i]) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{text=>"$trail{$action}{$state}"}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs |
|
(undef,'Course Groups Manager')); |
|
&display_control($r,$cdom,$cnum,$tabcol,$action,$state, |
|
\%sectioncount,$groupname,$description,$functions, |
|
\@tools,\%toolprivs,\%fixedprivs,$startdate,$enddate, |
|
\%users,\%userdata,$idx,\@members,\%usertools); |
|
last; |
|
} else { |
|
if ($state eq 'result' && $i > 0) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{href=>"javascript:backPage(document.$state,'$states{$action}[0]')", |
|
text=>"$trail{$action}{$states{$action}[$i]}"}); |
|
} else { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{href=>"javascript:backPage(document.$state,'$states{$action}[$i]')", |
|
text=>"$trail{$action}{$states{$action}[$i]}"}); |
|
} |
|
} |
|
} |
|
} elsif (($action eq 'view') && ($view_permission)) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
|
{text=>"View groups"}); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs |
|
(undef,'Course Groups Manager')); |
|
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx, |
|
$view_permission,$manage_permission); |
|
|
|
} |
|
$r->print(&footer()); |
|
return; |
|
} |
|
|
|
sub display_control { |
|
my ($r,$cdom,$cnum,$tabcol,$action,$state,$sectioncount,$groupname, |
|
$description,$functions,$tools,$toolprivs,$fixedprivs,$startdate, |
|
$enddate,$users,$userdata,$idx,$members,$usertools) = @_; |
|
if ($action eq 'create') { |
|
if ($state eq 'pick_name') { |
|
&first_creation_form($r,$cdom,$cnum,$tabcol,$state,$functions, |
|
$sectioncount); |
|
} elsif ($state eq 'pick_members') { |
|
&second_creation_form($r,$cdom,$cnum,$tabcol,$state,$groupname, |
|
$description,$startdate,$enddate,$tools, |
|
$functions,$users,$userdata,$idx); |
|
} elsif ($state eq 'pick_privs') { |
|
&third_creation_form($r,$cdom,$cnum,$tabcol,$state,$startdate, |
|
$enddate,$tools,$functions,$toolprivs,$fixedprivs, |
|
$userdata,$members,$usertools,$idx); |
|
} elsif ($state eq 'result') { |
|
&completed_creation($r,$cdom,$cnum,$tabcol,$state,$groupname, |
|
$description,$userdata,$startdate,$enddate,$tools, |
|
$functions,$toolprivs,$members,$usertools,$idx); |
|
} |
|
} |
|
} |
|
|
sub header { |
sub header { |
|
my ($bodytitle,$title,$jscript,$action,$state,$function,$loaditems) = @_; |
my $html=&Apache::lonxml::xmlbegin(); |
my $html=&Apache::lonxml::xmlbegin(); |
my $bodytag=&Apache::loncommon::bodytag('Course Groups Manager'); |
my $bodytag=&Apache::loncommon::bodytag($bodytitle,$function,$loaditems); |
my $title = &mt('LON-CAPA Groups Manager'); |
my $output = <<"END"; |
return(<<ENDHEAD); |
|
$html |
$html |
<head> |
<head> |
<title>$title</title> |
<title>$title</title> |
|
<script type="text/javascript"> |
|
$jscript |
|
</script> |
</head> |
</head> |
$bodytag |
$bodytag |
<form method="post" |
<form method="post" name="$state"> |
action="/adm/coursegroup" name="form"> |
|
ENDHEAD |
END |
|
if ($action eq 'create' || $action eq 'modify') { |
|
$output .= <<"END"; |
|
<input type="hidden" name="action" value="$action" /> |
|
<input type="hidden" name="state" value="" /> |
|
<input type="hidden" name="origin" value="$state" /> |
|
END |
|
} |
|
return $output; |
} |
} |
|
|
sub print_main_menu { |
sub onload_action { |
my ($r,$manage_permission,$view_permission)=@_; |
my ($action,$state) = @_; |
my @menu = |
my $loaditems; |
( |
if ((defined($env{'form.origin'})) && ($action eq 'create') && |
{ text => 'Create a new group', |
($state eq 'pick_name' || $state eq 'pick_members' || |
help => 'Course_Create_Group', |
$state eq 'pick_privs')) { |
action => 'create', |
unless ($env{'form.origin'} eq '') { |
permission => $manage_permission, |
$loaditems = |
}, |
'onload="javascript:setFormElements(document.'.$state.')"'; |
{ text => 'Modify an existing group', |
|
help => 'Course_Modify_Group', |
|
action => 'modify', |
|
permission => $manage_permission, |
|
}, |
|
{ text => 'Delete an existing group', |
|
help => 'Course_Delete_Group', |
|
action => 'delete', |
|
permission => $manage_permission, |
|
}, |
|
{ text => 'Enter an existing group', |
|
help => 'Course_Display_Group', |
|
action => 'display', |
|
permission => $view_permission, |
|
}, |
|
); |
|
my $menu_html = ''; |
|
foreach my $menu_item (@menu) { |
|
next if (! $menu_item->{'permission'}); |
|
$menu_html.='<p>'; |
|
$menu_html.='<font size="+1">'; |
|
if (exists($menu_item->{'url'})) { |
|
$menu_html.=qq{<a href="$menu_item->{'url'}">}; |
|
} else { |
|
$menu_html.= |
|
qq{<a href="/adm/coursegroups?action=$menu_item->{'action'}">}; |
|
} |
|
$menu_html.= &mt($menu_item->{'text'}).'</a></font>'; |
|
if (exists($menu_item->{'help'})) { |
|
$menu_html.= |
|
&Apache::loncommon::help_open_topic($menu_item->{'help'}); |
|
} |
} |
$menu_html.='</p>'.$/; |
|
} |
} |
$r->print($menu_html); |
return $loaditems; |
return; |
|
} |
} |
|
|
sub footer { |
sub footer { |
Line 155 sub footer {
|
Line 556 sub footer {
|
</body> |
</body> |
</html> |
</html> |
ENDFOOT |
ENDFOOT |
|
|
} |
} |
|
|
|
sub build_members_list { |
|
my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_; |
|
my %access = (); |
|
foreach my $role (@{$roles}) { |
|
%{$$users{$role}} = (); |
|
} |
|
foreach my $type (@{$types}) { |
|
$access{$type} = $type; |
|
} |
|
&Apache::loncommon::get_course_users($cdom,$cnum,\%access,$roles, |
|
$sections,$users,$userdata); |
|
return; |
|
} |
|
|
|
sub group_files { |
|
return; |
|
} |
|
|
|
sub group_members { |
|
my ($cdom,$cnum,$group,$group_info) = @_; |
|
my %memberhash = &Apache::lonnet::get_group_membership($cdom,$cnum,$group); |
|
my $now = time; |
|
my ($tmp)=keys(%memberhash); |
|
if ($tmp=~/^error:/) { |
|
$$group_info{'totalmembers'} = 'Unknown - an error occurred'; |
|
return $tmp; |
|
} |
|
my $now = time; |
|
my $totalmembers = 0; |
|
my $active = 0; |
|
my $previous = 0; |
|
my $future = 0; |
|
foreach my $member (keys %memberhash) { |
|
$totalmembers ++; |
|
my ($end,$start) = split(/:/,$memberhash{$member}); |
|
if (($end!=0) && ($end<$now)) { |
|
$previous ++; |
|
} elsif (($start!=0) && ($start>$now)) { |
|
$future ++; |
|
} else { |
|
$active ++; |
|
} |
|
} |
|
if ($totalmembers == 0) { |
|
$$group_info{$group}{'totalmembers'} = 'None'; |
|
} else { |
|
$$group_info{$group}{'totalmembers'} = $active.' - active<br />'.$previous.' -previous<br />'.$future.' -future'; |
|
} |
|
return 'ok'; |
|
} |
|
|
|
|
sub first_creation_form { |
sub first_creation_form { |
my ($r) = @_; |
my ($r,$cdom,$cnum,$tabcol,$formname,$functions,$sectioncount) = @_; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
'gmem' => 'Group membership options', |
'gmem' => 'Group membership options', |
'picr' => 'Pick the criteria to use to build a list of course users from which you will select members of the new group', |
'picr' => 'Pick the criteria to use to build a list of course users '. |
|
'from which you will select members of the new group', |
'gdat' => 'Group open and close dates', |
'gdat' => 'Group open and close dates', |
'sten' => 'Set a start date/time and end date/time for the group', |
'sten' => 'Set a start date/time and end date/time for the group', |
'acst' => 'Active/Inactive status', |
'acty' => 'Access types', |
'coro' => 'Course roles', |
'coro' => 'Course roles', |
'cose' => 'Course sections', |
'cose' => 'Course sections', |
'gfun' => 'Group functionality', |
'gfun' => 'Group functionality', |
Line 181 sub first_creation_form {
|
Line 632 sub first_creation_form {
|
|
|
my @roles = ('st','cc','in','ta','ep','cr'); |
my @roles = ('st','cc','in','ta','ep','cr'); |
|
|
my %sectioncount = (); |
my $starttime = time; |
|
my $endtime = time+(6*30*24*60*60); # 6 months from now, approx |
|
my ($start_table,$end_table) = &date_setting_table |
|
($starttime,$endtime,$formname); |
|
|
my @sections = (); |
my @sections = (); |
my $section_sel = ''; |
my $section_sel = ''; |
my $numvisible; |
my $numvisible = 4; |
my $numsections = &Apache::loncommon::get_sections($cdom,$cnum, |
|
\%sectioncount); |
|
|
|
@sections = sort {$a cmp $b} keys(%sectioncount); |
@sections = sort {$a cmp $b} keys(%{$sectioncount}); |
unshift(@sections,'all'); # Put 'all' at the front of the list |
if (@sections > 0) { |
if ($numsections < 4) { |
unshift(@sections,'_all'); # Put 'all' at the front of the list |
$numvisible = $numsections + 1; |
if (@sections < 4) { |
|
$numvisible = @sections; |
|
} |
|
foreach (@sections) { |
|
if ($_ eq '_all') { |
|
$section_sel .= ' <option value="'.$_.'" />all sections'."\n"; |
|
} else { |
|
$section_sel .= ' <option value="'.$_.'" />'.$_."\n"; |
|
} |
|
} |
} |
} |
|
|
$r->print(<<"END"); |
$r->print(<<"END"); |
<b>$lt{'gmem'}</b><br/> $lt{'picr'} |
<br /> |
<br /><br /> |
<table width="100%" cellpadding="0" cellspacing="0" border="0"> |
<table border="0"> |
<tr bgcolor="$tabcol"> |
|
<td> </td> |
|
<td valign="bottom"><nobr><img src="/res/adm/pages/bl_step1.gif" |
|
valign="bottom"> </nobr> |
|
</td> |
|
<td align="left"><nobr> |
|
<font face="arial,helvetica,sans-serif"><b>Group name, description |
|
and available functionality</b></font></nobr> |
|
</td> |
|
<td width="100%"> </td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
<table border="0" cellpadding="2" cellspacing="2"> |
|
<tr> |
|
<td><b>Group Name:</b></td> |
|
<td colspan="5"><input type="text" name="groupname" size="25" /> |
|
</td> |
|
<tr> |
|
<tr> |
|
<td><b>Description:</b></td> |
|
<td colspan="5"><input type="text" name="description" size="40" /> |
|
</td> |
|
<tr> |
|
<tr> |
|
<td><b>Functionality:</b></td> |
|
END |
|
my $numitems = keys(%{$functions}); |
|
my $halfnum = int($numitems/2); |
|
my $remnum = $numitems%2; |
|
if ($remnum) { |
|
$halfnum ++; |
|
} |
|
my @allfunctions = sort (keys (%{$functions})); |
|
for (my $i=0; $i<$halfnum; $i++) { |
|
$r->print('<td><input type="checkbox" name="tool" value="'. |
|
$allfunctions[$i].'" /> '. |
|
$$functions{$allfunctions[$i]}.'</td> |
|
<td> </td><td> </td>'); |
|
} |
|
$r->print('<td><input type="button" value="check all" '. |
|
'onclick="javascript:checkAll(document.'.$formname.'.tool)" />'. |
|
'</td></tr><tr><td> </td>'); |
|
for (my $j=$halfnum; $j<@allfunctions; $j++) { |
|
$r->print('<td><input type="checkbox" name="tool" value="'. |
|
$allfunctions[$j].'" /> '. |
|
$$functions{$allfunctions[$j]}.'</td> |
|
<td> </td><td> </td>'); |
|
} |
|
if ($remnum) { |
|
$r->print('<td> </td>'); |
|
} |
|
$r->print(<<"END"); |
|
<td> |
|
<input type="button" value="uncheck all" |
|
onclick="javascript:uncheckAll(document.$formname.tool)" /> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td><b>Granularity:</b></td> |
|
<td colspan="9">Do you want to assign different functionality to different group members? <input type="radio" name="granularity" value="Yes" />Yes <input type="radio" name="granularity" value="No" checked="checked" />No</td> |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr bgcolor="$tabcol"> |
|
<td> </td> |
|
<td valign="bottom"><nobr><img src="/res/adm/pages/bl_step2.gif" |
|
valign="bottom"> </nobr> |
|
</td> |
|
<td align="left"><nobr> |
|
<font face="arial,helvetica,sans-serif"><b>Start and end dates for group |
|
access</b></font></nobr> |
|
</td> |
|
<td width="100%"> </td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3">$start_table</td> |
|
<tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3">$end_table</td> |
|
<tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr bgcolor="$tabcol"> |
|
<td> </td> |
|
<td valign="bottom"><nobr><img src="/res/adm/pages/bl_step3.gif" |
|
valign="bottom"> </nobr> |
|
</td> |
|
<td align="left"><nobr> |
|
<font face="arial,helvetica,sans-serif"><b>Pick parameters to generate |
|
membership list</b></nobr> |
|
</font> |
|
</td> |
|
<td width="100%"> </td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
<b>$lt{'gmem'}</b><br/> $lt{'picr'} |
|
<br /><br /> |
|
<table border="0"> |
|
<tr> |
|
<td><b>$lt{'acty'}</b></td> |
|
<td> </td> |
|
<td><b>$lt{'coro'}</b></td> |
|
END |
|
if (@sections >0) { |
|
$r->print(' |
|
<td> </td> |
|
<td><b>'.$lt{'cose'}.'</b></td> |
|
<td> </td>'); |
|
} |
|
$r->print('</tr><tr>'); |
|
$r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types)); |
|
$r->print('<td> </td>'); |
|
$r->print(&Apache::lonhtmlcommon::role_select_row(\@roles)); |
|
if (@sections > 0) { |
|
$r->print(' |
|
<td> </td> |
|
<td colspan="3" align="center" valign="top"> |
|
<select name="sectionpick" multiple="true" size="'.$numvisible.'"> |
|
'.$section_sel.' |
|
</select> |
|
</td>'); |
|
} |
|
$r->print(' |
|
</tr> |
|
</table> |
|
</td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3" align="left"> |
|
<input type="button" value="Go to next step" |
|
onclick="javascript:nextPage(document.'.$formname.','."'pick_members'".')> |
|
</td> |
|
</tr> |
|
</table> |
|
'); |
|
return; |
|
} |
|
|
|
sub second_creation_form { |
|
my ($r,$cdom,$cnum,$tabcol,$formname,$groupname,$description,$startdate, |
|
$enddate,$tools,$functions,$users,$userdata,$idx) = @_; |
|
my @regexps = ('user_','userpriv_'); |
|
$r->print(&Apache::lonhtmlcommon::echo_form_input( |
|
['origin','action','state','member','specificity'],\@regexps)); |
|
my %sectioncount = (); |
|
my $numsec = &Apache::loncommon::get_sections($cdom,$cnum,\%sectioncount); |
|
my %curr_groups; |
|
my $numgroups = &Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum); |
|
my $earlyout; |
|
my $exitmsg = '<b>Invalid group name</b><br /><br />The group name entered "'. |
|
$groupname.'" '; |
|
my $dupmsg = 'Group names and section names used in a course must be unique.'; |
|
if ($groupname =~ /\W/) { |
|
$earlyout = $exitmsg.'is not a valid name.<br />Group names may only contain letters, numbers or underscores'; |
|
} |
|
if ($numsec) { |
|
if (exists($sectioncount{$groupname})) { |
|
$earlyout = $exitmsg.'can not be used as it is the name of a '. |
|
'section in this course.<br />'.$dupmsg; |
|
} |
|
} |
|
if ($numgroups) { |
|
if (exists($curr_groups{$groupname})) { |
|
$earlyout = $exitmsg.'can not be used as it is the name of an |
|
existing group in this course.<br />'.$dupmsg; |
|
} |
|
} |
|
if ($earlyout) { |
|
$r->print('<table border="0" cellpadding="2" cellspacing="2"> |
<tr> |
<tr> |
<td><b>$lt{'acst'}</b></td> |
|
<td> </td> |
<td> </td> |
<td><b>$lt{'coro'}</b></td> |
<td>'.$earlyout.'</td> |
|
</tr> |
|
<tr> |
|
<td colspan="2"> </td> |
|
</tr> |
|
<tr> |
<td> </td> |
<td> </td> |
<td><b>$lt{'cose'}</b></td> |
<td align="left"> |
|
<input type="button" name="previous" value = "Go to previous page" |
|
onclick="javascript:backPage(document.'.$formname.','."'pick_name'".')"/> |
|
</td> |
|
</tr> |
|
</table> |
|
'); |
|
return; |
|
} |
|
my $rowColor1 = "#dddddd"; |
|
my $rowColor2 = "#eeeeee"; |
|
my $showstart = &Apache::lonlocal::locallocaltime($startdate); |
|
my $showend = &Apache::lonlocal::locallocaltime($enddate); |
|
$r->print('<table border="0" cellpadding="0" cellspacing="20"> |
|
<tr> |
|
<td><font face="arial,helvetica,sans-serif"><b>New group selections</b></font> |
|
<br />When you create the new group, the following settings will apply: |
|
</td> |
|
</tr> |
|
<tr> |
|
<td>'); |
|
$r->print(&Apache::lonhtmlcommon::start_pick_box()); |
|
$r->print(' |
|
<table cellspacing="1" cellpadding="4"> |
|
<tr bgcolor="'.$tabcol.'" align="center"> |
|
<td><b>Group Name</b></td> |
|
<td><b>Description</b></td> |
|
<td><b>Group Functionality</b></td> |
|
<td><b>Default access dates</b></td> |
|
</tr> |
|
<tr bgcolor="'.$rowColor2.'"> |
|
<td valign="top"><small>'.$groupname.'</small></td> |
|
<td valign="top"><small>'.$description.'</small></td> |
|
<td> |
|
'); |
|
my @available = (); |
|
my @unavailable = (); |
|
foreach my $item (sort(keys(%{$functions}))) { |
|
if (grep/^$item$/,@{$tools}) { |
|
push(@available,$item); |
|
} else { |
|
push(@unavailable,$item); |
|
} |
|
} |
|
if (@available > 0) { |
|
$r->print('<small><b>Available:</b></small> |
|
<table cellpadding="" cellspacing="1"><tr>'); |
|
my $rowcell = int(@available/2) + @available%2; |
|
for (my $i=0; $i<@available; $i++) { |
|
if (@available > 3) { |
|
if ($i==$rowcell) { |
|
$r->print('</tr><tr>'); |
|
} |
|
} |
|
$r->print('<td><small>'.$$functions{$available[$i]}. |
|
'</small></td><td> </td>'); |
|
} |
|
if ((@available > 3) && (@available%2)) { |
|
$r->print('<td> </td><td> </td>'); |
|
} |
|
$r->print('</tr></table><br />'); |
|
} |
|
if (@unavailable > 0) { |
|
$r->print('<small><b>Unavailable:</b></small> |
|
<table cellpadding="0" cellspacing="1" border="0"><tr>'); |
|
my $rowcell = int(@unavailable/2) + @unavailable%2; |
|
for (my $j=0; $j<@unavailable; $j++) { |
|
if (@unavailable > 3) { |
|
if ($j==$rowcell) { |
|
$r->print('</tr><tr>'); |
|
} |
|
} |
|
$r->print('<td><small>'.$$functions{$unavailable[$j]}. |
|
'</small></td><td> </td>'); |
|
} |
|
if ((@unavailable > 3) && (@unavailable%2)) { |
|
$r->print('<td> </td><td> </td>'); |
|
} |
|
$r->print('</tr></table>'); |
|
} |
|
$r->print(<<"END"); |
|
</td> |
|
<td valign="top"><small><b>Start date:</b> $showstart<br /> |
|
<b>End date:</b> $showend</small> |
|
</td> |
|
</tr> |
|
</table> |
|
END |
|
$r->print(&Apache::lonhtmlcommon::end_pick_box()); |
|
my %members = (); |
|
foreach my $role (keys(%{$users})) { |
|
foreach my $user (keys(%{$$users{$role}})) { |
|
unless (defined($members{$user})) { |
|
@{$members{$user}} = @{$$userdata{$user}}; |
|
} |
|
} |
|
} |
|
$r->print('</td></tr></table><br />'); |
|
if (keys(%members) > 0) { |
|
if ($env{'form.granularity'} eq 'Yes') { |
|
$r->print(' |
|
<script type="text/javascript"> |
|
function checkAllTools(formname) { |
|
'); |
|
foreach my $tool (@available) { |
|
$r->print(' checkAll(formname.user_'.$tool.');'."\n"); |
|
} |
|
$r->print(' |
|
} |
|
function uncheckAllTools(formname) { |
|
'); |
|
foreach my $tool (@available) { |
|
$r->print(' uncheckAll(formname.user_'.$tool.');'."\n"); |
|
} |
|
$r->print(' |
|
} |
|
</script> |
|
'); |
|
} |
|
$r->print(<<"END"); |
|
<table width="100%" cellpadding="0" cellspacing="0" border="0"> |
|
<tr bgcolor="$tabcol"> |
<td> </td> |
<td> </td> |
|
<td valign="top" align="left"> |
|
<nobr><img src="/res/adm/pages/bl_step4.gif" valign="middle"> </nobr> |
|
</td> |
|
<td alin="left"> |
|
<nobr> |
|
<font face="arial,helvetica,sans-serif"> |
|
<b>Select group members</b> |
|
</font></nobr> |
|
</td> |
|
<td width="100%"> </td> |
</tr> |
</tr> |
<tr> |
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
<tr> |
<tr> |
END |
|
$r->print(&Apache::lonhtmlcommon::status_select_row(\%status_types)); |
|
$r->print('<td> </td>'); |
|
$r->print(&Apache::lonhtmlcommon::role_select_row(\@roles)); |
|
$r->print(<<"END"); |
|
<td> </td> |
<td> </td> |
<td align="center"> |
<td colspan="2"> |
<select name="sectionpick" multiple="true" size="$numvisible"> |
<table> |
$section_sel |
<tr> |
</select> |
<td> |
|
<nobr> |
|
<fieldset><legend><b>Add members</b></legend> |
|
<input type="button" value="check all" |
|
onclick="javascript:checkAll(document.$formname.member)" /> |
|
|
|
<input type="button" value="uncheck all" |
|
onclick="javascript:uncheckAll(document.$formname.member)" /> |
|
</fieldset></nobr></td> |
|
END |
|
if (@available > 0 && $env{'form.granularity'} eq 'Yes') { |
|
$r->print('<td><nobr><fieldset><legend><b> |
|
Set functionality</b></legend> |
|
<input type="button" value="check all" |
|
onclick="javascript:checkAllTools(document.'.$formname.')" /> |
|
|
|
<input type="button" value="uncheck all" |
|
onclick="javascript:uncheckAllTools(document.'.$formname.')" /> |
|
</fieldset></nobr></td>'); |
|
} |
|
$r->print('</tr></table> |
</td> |
</td> |
|
<td width="100%"> </td> |
</tr> |
</tr> |
</table> |
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
'); |
|
$r->print(&Apache::lonhtmlcommon::start_pick_box()); |
|
$r->print(<<"END"); |
|
<table border="0" cellpadding="4" cellspacing="1"> |
|
<tr bgcolor="$tabcol" align="center"> |
|
<td><b>Add?</b></td> |
|
<td><b><a href="javascript:changeSort('fullname')">Name</a></b></td> |
|
<td><b><a href="javascript:changeSort('username')">Username</a></b> |
|
</td> |
|
<td><b><a href="javascript:changeSort('domain')">Domain</a></b></td> |
|
<td><b><a href="javascript:changeSort('id')">ID</a></b></td> |
END |
END |
|
if (@available > 0) { |
|
$r->print('<td><b>Functionality</b></td>'); |
|
} |
|
$r->print('</tr>'); |
|
my %Sortby = (); |
|
foreach my $user (sort(keys(%members))) { |
|
if ($env{'form.sortby'} eq 'fullname') { |
|
push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user); |
|
} elsif ($env{'form.sortby'} eq 'username') { |
|
push(@{$Sortby{$members{$user}[$$idx{uname}]}},$user); |
|
} elsif ($env{'form.sortby'} eq 'domain') { |
|
push(@{$Sortby{$members{$user}[$$idx{udom}]}},$user); |
|
} elsif ($env{'form.sortby'} eq 'id') { |
|
push(@{$Sortby{$members{$user}[$$idx{id}]}},$user); |
|
} else { |
|
push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user); |
|
} |
|
} |
|
my $rowNum = 0; |
|
my $rowColor; |
|
foreach my $key (sort(keys(%Sortby))) { |
|
foreach my $user (@{$Sortby{$key}}) { |
|
if ($rowNum %2 == 1) { |
|
$rowColor = $rowColor1; |
|
} else { |
|
$rowColor = $rowColor2; |
|
} |
|
my $id = $members{$user}[$$idx{id}]; |
|
my $fullname = $members{$user}[$$idx{fullname}]; |
|
my $udom = $members{$user}[$$idx{udom}]; |
|
my $uname = $members{$user}[$$idx{uname}]; |
|
$r->print('<tr bgcolor="'.$rowColor.'"><td align="right"> |
|
<input type="checkbox" name="member" value="'.$user.'" /></td><td><small>'. |
|
$fullname.'</small></td><td><small>'.$uname.'</small></td><td><small>'. |
|
$udom.'</small></td><td><small>'.$id.'</small></td>'); |
|
if (@available > 0) { |
|
$r->print('<td align="center"><small>'); |
|
foreach my $tool (@available) { |
|
if ($env{'form.granularity'} eq 'Yes') { |
|
$r->print('<input type="checkbox" name="user_'. |
|
$tool.'" value="'.$user.'" />'.$tool.' '); |
|
} else { |
|
$r->print('<input type="hidden" name="user_'. |
|
$tool.'" value="'.$user.'" />'.$tool.' '); |
|
} |
|
} |
|
$r->print('</small></td>'); |
|
} |
|
$r->print('</tr>'."\n"); |
|
$rowNum ++; |
|
} |
|
} |
|
$r->print(&Apache::lonhtmlcommon::end_pick_box()); |
|
$r->print(' |
|
</td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr>'); |
|
if (@available > 0) { |
|
$r->print(' |
|
<tr bgcolor="'.$tabcol.'"> |
|
<td> </td> |
|
<td valign="middle" align="left"> |
|
<nobr><img src="/res/adm/pages/bl_step5.gif" valign="middle"> </nobr> |
|
</td> |
|
<td align="left"><nobr> |
|
<font face="arial,helvetica,sans-serif"> |
|
<b>User privileges</b> |
|
</font></nobr> |
|
</td> |
|
<td width="100%"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
<br /> |
|
For each type of functionality you have chosen to include, there is a |
|
set of standard privileges which apply to all of those for whom the functionality is enabled.<br />There are also additional privileges which can be set for some, or all, members. Please choose one of the following:<br /> |
|
<br /><input type="radio" name="specificity" value="No" checked="checked" /> All group members will receive the same privileges.<br/><input type="radio" name="specificity" value="Yes" /> Some group members will receive different privileges from others. |
|
</td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
'); |
|
} |
|
$r->print(' |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
<input type="button" name="previous" value = "Go to previous page" |
|
onclick="javascript:backPage(document.'.$formname.','."'pick_name'".')"/> |
|
|
|
<input type="button" name="next" value="Go to next page" |
|
onclick="javascript:nextPage(document.'.$formname.','."'pick_privs'".')" /> |
|
</td> |
|
</tr> |
|
'); |
|
} else { |
|
$r->print('No members to add'); |
|
} |
|
$r->print(' |
|
</table> |
|
</td> |
|
</tr> |
|
</table>'); |
return; |
return; |
} |
} |
|
|
sub second_creation_form { |
sub third_creation_form { |
my ($r) = @_; |
my ($r,$cdom,$cnum,$tabcol,$formname,$startdate,$enddate,$tools,$functions, |
|
$toolprivs,$fixedprivs,$userdata,$members,$usertools,$idx) = @_; |
|
my @regexps = ('userpriv_','allpriv_'); |
|
$r->print(&Apache::lonhtmlcommon::echo_form_input( |
|
['origin','action','state'],\@regexps)); |
|
my %possibles = (); |
|
my %showboxes = (); |
|
my $totalboxes = 0; |
|
my $rowColor1 = "#dddddd"; |
|
my $rowColor2 = "#eeeeee"; |
|
my $numtools = 1 + @{$tools}; |
|
foreach my $tool (@{$tools}) { |
|
@{$showboxes{$tool}} = (); |
|
foreach my $user (@{$members}) { |
|
if (exists($$usertools{$user}{$tool})) { |
|
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { |
|
unless (exists($$fixedprivs{$tool}{$priv})) { |
|
push(@{$possibles{$user}},$priv); |
|
unless(grep(/^$priv$/,@{$showboxes{$tool}})) { |
|
push(@{$showboxes{$tool}},$priv); |
|
$totalboxes ++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($totalboxes > 0) { |
|
$r->print(' |
|
<script type="text/javascript"> |
|
function checkAllTools(formname) { |
|
'); |
|
foreach my $tool (sort(keys(%showboxes))) { |
|
foreach my $priv (@{$showboxes{$tool}}) { |
|
$r->print(' checkAll(formname.userpriv_'.$priv.');'."\n"); |
|
} |
|
} |
|
$r->print(' |
|
} |
|
function uncheckAllTools(formname) { |
|
'); |
|
foreach my $tool (sort(keys(%showboxes))) { |
|
foreach my $priv (@{$showboxes{$tool}}) { |
|
$r->print(' uncheckAll(formname.userpriv_'.$priv.');'."\n"); |
|
} |
|
} |
|
$r->print(' |
|
} |
|
</script> |
|
'); |
|
} |
|
$r->print(<<"END"); |
|
<br /> |
|
<table width="100%" cellpadding="0" cellspacing="0" border="0"> |
|
<tr bgcolor="$tabcol"> |
|
<td> </td> |
|
<td valign="middle" align="left"> |
|
<nobr><img src="/res/adm/pages/bl_step6.gif" valign="middle"> </nobr> |
|
</td> |
|
<th align="left"><nobr> |
|
Group member privileges |
|
</nobr> |
|
</th> |
|
<td width="100%"> </td> |
|
</tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
END |
|
if ($env{'form.specificity'} eq 'Yes') { |
|
$r->print(' |
|
<table border="0" cellspacing="2" cellpadding="2" border="0"> |
|
<tr> |
|
<td valign="top"> |
|
'); |
|
$r->print(&Apache::lonhtmlcommon::start_pick_box()); |
|
$r->print(<<"END"); |
|
<tr bgcolor="$tabcol"> |
|
<th><b>Fullname</th> |
|
<th><b>Username</th> |
|
<th>Domain</th> |
|
<th colspan="$numtools">Additional Privileges</th> |
|
</tr> |
|
END |
|
} |
|
if ($env{'form.specificity'} eq 'Yes') { |
|
&member_privs_entries($r,$tabcol,$rowColor1,$rowColor2,$members,$tools, |
|
$usertools,$toolprivs,$fixedprivs,$userdata,$idx); |
|
} |
|
if ($env{'form.specificity'} eq 'Yes') { |
|
$r->print('</td>'); |
|
$r->print(&Apache::lonhtmlcommon::end_pick_box()); |
|
$r->print('<td> </td> |
|
<td> </td><td valign="top">'); |
|
my @toolboxes = sort(keys(%showboxes)); |
|
foreach my $tool (@{$tools}) { |
|
if (@{$showboxes{$tool}} > 0) { |
|
$r->print('<table class="thinborder"><tr bgcolor="'.$tabcol. |
|
'"><th>'.$tool.'</th></tr>'); |
|
foreach my $priv (@{$showboxes{$tool}}) { |
|
$r->print(qq| |
|
<tr><td> |
|
<fieldset><legend><b>$$toolprivs{$tool}{$priv}</b></legend> |
|
<input type="button" value="check all" |
|
onclick="javascript:checkAll(document.$formname.userpriv_$priv)" /> |
|
|
|
<input type="button" value="uncheck all" |
|
onclick="javascript:uncheckAll(document.$formname.userpriv_$priv)" /> |
|
</nobr></fieldset></td></tr>|); |
|
} |
|
$r->print('</table><br /><br />'); |
|
} |
|
} |
|
$r->print('</td></tr></table>'); |
|
} else { |
|
$r->print(&Apache::lonhtmlcommon::start_pick_box()); |
|
$r->print('<tr><td bgcolor="'.$tabcol.'" valign="top"><table cellspacing="0" cellpadding="1"><tr><td valign="top"><b>Function</b></td></tr><tr><td valign="top"><b>Fixed privileges</b>'. |
|
'</td></tr><tr><td valign="top"><b>Optional privileges</b></td></tr></table></td>'); |
|
foreach my $tool (@{$tools}) { |
|
$r->print('<td align="center" valign="top"><table cellspacing="0" cellpadding="1"><tr bgcolor="#cccccc">'. |
|
'<td colspan="2" align="center"><b>'.$tool.'</b></td></tr>'); |
|
my $privcount = 0; |
|
my $fixed = ''; |
|
my $dynamic = ''; |
|
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { |
|
if (exists($$fixedprivs{$tool}{$priv})) { |
|
$fixed .= '<input type="hidden" name="allpriv_'.$priv.'" value="all" />'.$$toolprivs{$tool}{$priv}.' '; |
|
} else { |
|
$privcount ++; |
|
if ($privcount == 3) { |
|
$dynamic .= '</tr><tr bgcolor="'.$rowColor1.'">'; |
|
} |
|
$dynamic .= '<td><input type="checkbox" name="allpriv_'.$priv.'" value="all" />'.$$toolprivs{$tool}{$priv}.'</td>'; |
|
} |
|
} |
|
if ($dynamic eq '') { |
|
$dynamic = '<td>None</td>'; |
|
} |
|
if ($privcount < 3) { |
|
$dynamic .= '</tr><tr bgcolor="'.$rowColor1.'"><td colspan="2"> </td>'; |
|
} elsif ($privcount%2) { |
|
$dynamic = '<td> </td>'; |
|
} |
|
$r->print('<tr bgcolor="'.$rowColor2.'"><td colspan="2" align="center"><nobr>'.$fixed.'</nobr></td></tr><tr bgcolor="'.$rowColor1.'">'.$dynamic.'</tr></table></td>'); |
|
} |
|
$r->print('</tr>'); |
|
$r->print(&Apache::lonhtmlcommon::end_pick_box()); |
|
} |
|
$r->print('</td></tr> |
|
<tr> |
|
<td colspan="4"> </td> |
|
</tr> |
|
<tr> |
|
<td> </td> |
|
<td colspan="3"> |
|
<input type="button" name="previous" value = "Go to previous page" |
|
onclick="javascript:backPage(document.'.$formname.','."'pick_members'".')"/> |
|
|
|
<input type="button" name="next" value="Create group" |
|
onclick="javascript:nextPage(document.'.$formname.','."'result'".')" /> |
|
</td> |
|
</tr> |
|
'); |
|
$r->print(' |
|
</table>'); |
|
|
|
return; |
} |
} |
|
|
sub completed_creation { |
sub completed_creation { |
my ($r) = @_; |
my ($r,$cdom,$cnum,$tabcol,$formname,$groupname,$description,$userdata, |
|
$startdate,$enddate,$tools,$functions,$toolprivs,$members,$usertools,$idx) = @_; |
|
|
|
$r->print(&Apache::lonhtmlcommon::echo_form_input( |
|
['origin','action','state'])); |
|
my @added= (); |
|
my @failed = (); |
|
my $now = time; |
|
my %group_privs = (); |
|
my %tooltype = (); |
|
foreach my $tool (@{$tools}) { |
|
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { |
|
$tooltype{$priv} = $tool; |
|
if ($env{'form.specificity'} eq 'Yes') { |
|
my @users = |
|
&Apache::loncommon::get_env_multiple('form.userpriv_'.$priv); |
|
foreach my $user (@users) { |
|
$group_privs{$user} .= $priv.':'; |
|
} |
|
} else { |
|
if (defined($env{'form.allpriv_'.$priv})) { |
|
foreach my $user (@{$members}) { |
|
if ($$usertools{$user}{$tool}) { |
|
$group_privs{$user} .= $priv.':'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
foreach my $user (keys(%group_privs)) { |
|
$group_privs{$user} =~ s/:$//; |
|
} |
|
my $esc_description = &Apache::lonnet::escape($description); |
|
my @attributes = ('description','functions','startdate','enddate','creation','modified','creator'); |
|
|
|
my %groupinfo = ( |
|
description => $esc_description, |
|
startdate => $startdate, |
|
enddate => $enddate, |
|
creation => $now, |
|
modified => $now, |
|
creator => $env{'user.name'}.':'.$env{'user.domain'}, |
|
); |
|
foreach my $func (keys(%{$functions})) { |
|
my $status; |
|
if (grep(/^$func$/,@{$tools})) { |
|
$status = 'on'; |
|
} else { |
|
$status = 'off'; |
|
} |
|
$groupinfo{'functions'} .= qq|<name id="$func">$status</name>|; |
|
} |
|
|
|
my %curr_groups = (); |
|
my %groupsettings = (); |
|
my %usersettings = (); |
|
if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum,$groupname)) { |
|
if (exists($curr_groups{$groupname})) { |
|
$r->print('Non-unique name - please choose another'); |
|
return; |
|
} |
|
} |
|
my $groupentry; |
|
foreach my $item (@attributes) { |
|
$groupsettings{$groupname} .= qq|<$item>$groupinfo{$item}</$item>|; |
|
} |
|
my $result = &Apache::lonnet::modify_coursegroup($cdom,$cnum, |
|
\%groupsettings); |
|
if ($result eq 'ok') { |
|
my $put_result = &create_homepage($cdom,$cnum,$groupname,\%groupinfo,$tools); |
|
foreach my $user (sort(@{$members})) { |
|
$usersettings{$groupname.':'.$user} = $enddate.':'.$startdate.':'.$group_privs{$user}; |
|
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname, |
|
$user,$enddate,$startdate,$group_privs{$user}) eq 'ok') { |
|
push(@added,$user); |
|
} else { |
|
push(@failed,$user); |
|
} |
|
} |
|
my $roster_result = &Apache::lonnet::modify_coursegroup_membership( |
|
$cdom,$cnum,\%usersettings); |
|
$r->print(' |
|
Group '.$groupname.' was created.<br />'); |
|
if (@added > 0) { |
|
$r->print('Users were added with following privileges:<br />'); |
|
foreach my $user (@added) { |
|
my @privs = split(/:/,$group_privs{$user}); |
|
my $privlist= ''; |
|
my $curr_tool = ''; |
|
foreach my $priv (@privs) { |
|
unless ($curr_tool eq $tooltype{$priv}) { |
|
$curr_tool = $tooltype{$priv}; |
|
$privlist .= '<b>'.$curr_tool.'</b>: '; |
|
} |
|
$privlist .= $$toolprivs{$curr_tool}{$priv}.', '; |
|
} |
|
$privlist =~ s/, $//; |
|
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.': '.$privlist.'<br />'); |
|
} |
|
} |
|
if (@failed > 0) { |
|
$r->print('Addition of the following users was unsuccessful:<br />'); |
|
foreach my $user (@failed) { |
|
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'<br />'); |
|
} |
|
} |
|
if ($roster_result eq 'ok') { |
|
$r->print('<br />Group membership list updated.'); |
|
} else { |
|
$r->print('<br />An error occurred while updating the group membership list -'.$roster_result.'<br />'); |
|
} |
|
} else { |
|
&Apache::lonnet::logthis('Failed to create group '.$groupname. |
|
'in course: '.$cnum.' in domain: '.$cdom); |
|
|
|
$r->print('An error occurred when creating the new group. '. |
|
'Please try again.'); |
|
} |
|
return; |
|
} |
|
|
|
sub member_privs_entries { |
|
my ($r,$tabcol,$rowColor1,$rowColor2,$members,$tools,$usertools,$toolprivs, |
|
$fixedprivs,$userdata,$idx) = @_; |
|
my $rowColor; |
|
my $rowNum = 0; |
|
foreach my $member (@{$members}) { |
|
my ($uname,$udom) = split(/:/,$member); |
|
if ($rowNum %2 == 1) { |
|
$rowColor = $rowColor1; |
|
} else { |
|
$rowColor = $rowColor2; |
|
} |
|
$r->print('<tr bgcolor="'.$rowColor.'"> |
|
<td>'.$$userdata{$member}[$$idx{fullname}].'</td> |
|
<td>'.$uname.'</td> |
|
<td>'.$udom.'</td> |
|
<td valign="top"><table><tr><td><b>Function</b></td></tr><tr><td><b>Fixed</b></td></tr><tr><td><b>Optional</b></td></tr></table></td>'); |
|
foreach my $tool (@{$tools}) { |
|
if (exists($$usertools{$member}{$tool})) { |
|
$r->print('<td valign="top"><table><tr bgcolor="'.$tabcol.'"><td colspan="2" align="center"><b>'.$tool.'</b></td></tr>'); |
|
my $privcount = 0; |
|
my $fixed = ''; |
|
my $dynamic = ''; |
|
foreach my $priv (sort(keys(%{$$toolprivs{$tool}}))) { |
|
if (exists($$fixedprivs{$tool}{$priv})) { |
|
$fixed .= '<input type="hidden" name="userpriv_'.$priv.'" value="'.$member.'" />'.$$toolprivs{$tool}{$priv}.' '; |
|
} else { |
|
$privcount ++; |
|
if ($privcount == 3) { |
|
$dynamic .= '</tr><tr>'; |
|
} |
|
$dynamic .= '<td><input type="checkbox" name="userpriv_'.$priv.'" value="'.$member.'" />'.$$toolprivs{$tool}{$priv}.'</td>'; |
|
} |
|
} |
|
$r->print('<tr><td colspan="2"><nobr>'.$fixed.'</nobr></td></tr><tr>'.$dynamic.'</tr></table></td>'); |
|
} else { |
|
$r->print('<td> </td>'); |
|
} |
|
} |
|
$rowNum ++; |
|
} |
|
} |
|
|
|
|
|
sub get_dates_from_form { |
|
my $startdate; |
|
my $enddate; |
|
$startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate'); |
|
$enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate'); |
|
if ( exists ($env{'form.no_end_date'}) ) { |
|
$enddate = 0; |
|
} |
|
return ($startdate,$enddate); |
|
} |
|
sub date_setting_table { |
|
my ($starttime,$endtime,$formname) = @_; |
|
my $startform = &Apache::lonhtmlcommon::date_setter($formname, |
|
'startdate',$starttime); |
|
my $endform = &Apache::lonhtmlcommon::date_setter($formname, |
|
'enddate',$endtime); |
|
my $perpetual = '<nobr><input type="checkbox" name="no_end_date" /> |
|
no ending date</nobr>'; |
|
my $start_table = ''; |
|
$start_table .= "<table>\n"; |
|
$start_table .= '<tr><td align="right">Default starting date for |
|
member access</td>'. |
|
'<td>'.$startform.'</td>'. |
|
'<td> </td>'."</tr>\n"; |
|
$start_table .= "</table>"; |
|
my $end_table = ''; |
|
$end_table .= "<table>\n"; |
|
$end_table .= '<tr><td align="right">Default ending date for |
|
member access</td>'. |
|
'<td>'.$endform.'</td>'. |
|
'<td>'.$perpetual.'</td>'."</tr>\n"; |
|
$end_table .= "</table>\n"; |
|
return ($start_table, $end_table); |
|
} |
|
|
|
sub create_homepage { |
|
my ($cdom,$cnum,$name,$groupinfo,$tools) = @_; |
|
my $functionality = join(',',@{$tools}); |
|
my $content = &Apache::lonnet::unescape($$groupinfo{description}); |
|
$content=~s/\s+$//s; |
|
$content=~s/^\s+//s; |
|
$content=~s/\<br\s*\/*\>$//s; |
|
$content=&Apache::lonfeedback::clear_out_html($content,1); |
|
|
|
my %pageinfo = ( |
|
'aaa_title' => 'Group: '.$name, |
|
'abb_links' => $functionality, |
|
'bbb_content' => $content, |
|
'ccc_webreferences' => '', |
|
'uploaded.lastmodified' => time, |
|
); |
|
my $putresult = &Apache::lonnet::put('grppage_'.$name,\%pageinfo,$cdom,$cnum); |
|
return $putresult; |
} |
} |
|
|
|
|
1; |
1; |