version 1.62, 2006/08/21 17:00:52
|
version 1.64, 2006/11/20 23:49:49
|
Line 29 package Apache::loncoursegroups;
|
Line 29 package Apache::loncoursegroups;
|
|
|
use strict; |
use strict; |
use Apache::lonnet; |
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::lonnavmaps(); |
use Apache::longroup; |
use Apache::longroup(); |
use Apache::portfolio; |
use Apache::portfolio(); |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
|
use LONCAPA::map(); |
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA; |
use LONCAPA; |
|
|
Line 91 sub handler {
|
Line 92 sub handler {
|
|
|
my $action = $env{'form.action'}; |
my $action = $env{'form.action'}; |
my $state = $env{'form.state'}; |
my $state = $env{'form.state'}; |
if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify')) { |
if ((!defined($action)) || ($action eq 'view') || ($action eq 'modify') || ($action eq 'delete')) { |
if (!defined($state)) { |
if (!defined($state)) { |
$state = 'view'; |
$state = 'view'; |
} |
} |
} |
} |
if ($action eq 'create' || $action eq 'modify' || $action eq 'view') { |
if ($action eq 'create' || $action eq 'modify' || $action eq 'view' || |
|
$action eq 'delete') { |
if ($view_permission || $manage_permission) { |
if ($view_permission || $manage_permission) { |
if ($state eq 'view') { |
if ($state eq 'view') { |
&print_main_menu($r,$cdom,$cnum,\%functions,\%idx, |
&print_main_menu($r,$cdom,$cnum,\%functions,\%idx, |
Line 164 sub display_groups {
|
Line 166 sub display_groups {
|
$env{'form.refpage'}.'&state=pick_task&groupname=', |
$env{'form.refpage'}.'&state=pick_task&groupname=', |
view => '<a href="/adm/'.$cdom.'/'.$cnum.'/', |
view => '<a href="/adm/'.$cdom.'/'.$cnum.'/', |
delete => '<a href="/adm/coursegroups?action=delete&refpage='. |
delete => '<a href="/adm/coursegroups?action=delete&refpage='. |
$env{'form.refpage'}.'&groupname=', |
$env{'form.refpage'}.'&state=verify&groupname=', |
); |
); |
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
modify => 'Modify', |
modify => 'Modify', |
Line 304 END
|
Line 306 END
|
if (($manage_permission) && |
if (($manage_permission) && |
($env{'form.refpage'} ne 'enrl')) { |
($env{'form.refpage'} ne 'enrl')) { |
$link .= ' '.$actionlinks{'modify'}. |
$link .= ' '.$actionlinks{'modify'}. |
$group.'">'.$lt{'modify'}.'</a>'; |
$group.'">'.$lt{'modify'}.'</a>'. |
|
' '.$actionlinks{'delete'}. |
|
$group.'">'.$lt{'delete'}.'</a>'; |
} |
} |
} |
} |
$r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense'). |
$r->print(&Apache::loncommon::start_data_table_row('LC_data_table_dense'). |
Line 807 function changeSort(caller) {
|
Line 811 function changeSort(caller) {
|
my %branchstates = (); |
my %branchstates = (); |
@{$states{'create'}} = ('pick_name','pick_members','pick_privs','result'); |
@{$states{'create'}} = ('pick_name','pick_members','pick_privs','result'); |
@{$states{'modify'}} = ('pick_task'); |
@{$states{'modify'}} = ('pick_task'); |
|
@{$states{'delete'}} = ('verify','result'); |
@{$branchstates{'noprivs'}} = ('result'); |
@{$branchstates{'noprivs'}} = ('result'); |
@{$branchstates{'settings'}} = ('change_settings','chgresult'); |
@{$branchstates{'settings'}} = ('change_settings','chgresult'); |
@{$branchstates{'members'}} = ('change_members','change_privs','memresult'); |
@{$branchstates{'members'}} = ('change_members','change_privs','memresult'); |
Line 817 function changeSort(caller) {
|
Line 822 function changeSort(caller) {
|
push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}}); |
push (@{$states{$action}},@{$branchstates{$env{'form.branch'}}}); |
} |
} |
|
|
if (($action eq 'create') || ($action eq 'modify')) { |
if (($action eq 'create') || ($action eq 'modify') || ($action eq 'delete')) { |
my $done = 0; |
my $done = 0; |
my $i=0; |
my $i=0; |
while ($i<@{$states{$action}} && !$done) { |
while ($i<@{$states{$action}} && !$done) { |
Line 838 function changeSort(caller) {
|
Line 843 function changeSort(caller) {
|
({href=>"/adm/dropadd", |
({href=>"/adm/dropadd", |
text=>"Enrollment Manager", |
text=>"Enrollment Manager", |
faq=>9,bug=>'Instructor Interface',}); |
faq=>9,bug=>'Instructor Interface',}); |
if ($action eq 'modify') { |
if ($action eq 'modify' || $action eq 'delete') { |
&Apache::lonhtmlcommon::add_breadcrumb |
&Apache::lonhtmlcommon::add_breadcrumb |
({href=>"/adm/coursegroups?refpage=enrl&action=modify", |
({href=>"/adm/coursegroups?refpage=enrl&action=$action", |
text=>"Groups", |
text=>"Groups", |
faq=>9,bug=>'Instructor Interface',}); |
faq=>9,bug=>'Instructor Interface',}); |
} |
} |
Line 876 function changeSort(caller) {
|
Line 881 function changeSort(caller) {
|
memresult => 'Modifications Complete', |
memresult => 'Modifications Complete', |
addresult => 'Additions Complete', |
addresult => 'Additions Complete', |
); |
); |
|
%{$trail{'delete'}} = &Apache::lonlocal::texthash( |
|
verify => 'Verify deletion', |
|
result => 'Deletion Complete' |
|
); |
my %navbuttons = &Apache::lonlocal::texthash( |
my %navbuttons = &Apache::lonlocal::texthash( |
gtns => 'Go to next step', |
gtns => 'Go to next step', |
gtps => 'Go to previous step', |
gtps => 'Go to previous step', |
Line 884 function changeSort(caller) {
|
Line 893 function changeSort(caller) {
|
gtpp => 'Go to previous page', |
gtpp => 'Go to previous page', |
adme => 'Add members', |
adme => 'Add members', |
); |
); |
if ((($action eq 'create') || ($action eq 'modify')) && |
if ((($action eq 'create') || ($action eq 'modify') || ($action eq 'delete')) && |
($manage_permission)) { |
($manage_permission)) { |
for (my $i=0; $i<@{$states{$action}}; $i++) { |
for (my $i=0; $i<@{$states{$action}}; $i++) { |
if ($state eq $states{$action}[$i]) { |
if ($state eq $states{$action}[$i]) { |
Line 902 function changeSort(caller) {
|
Line 911 function changeSort(caller) {
|
$crstype); |
$crstype); |
last; |
last; |
} else { |
} else { |
if (($state eq 'result') && ($i > 0)) { |
if (($action eq 'create') || ($action eq 'modify')) { |
&Apache::lonhtmlcommon::add_breadcrumb( |
if (($state eq 'result') && ($i > 0)) { |
|
&Apache::lonhtmlcommon::add_breadcrumb( |
{href=>"javascript:backPage(document.$state,'$states{$action}[0]')", |
{href=>"javascript:backPage(document.$state,'$states{$action}[0]')", |
text=>"$trail{$action}{$states{$action}[$i]}"}); |
text=>"$trail{$action}{$states{$action}[$i]}"}); |
} else { |
} else { |
&Apache::lonhtmlcommon::add_breadcrumb( |
&Apache::lonhtmlcommon::add_breadcrumb( |
{href=>"javascript:backPage(document.$state,'$states{$action}[$i]')", |
{href=>"javascript:backPage(document.$state,'$states{$action}[$i]')", |
text=>"$trail{$action}{$states{$action}[$i]}"}); |
text=>"$trail{$action}{$states{$action}[$i]}"}); |
|
} |
} |
} |
} |
} |
} |
} |
} elsif (($action eq 'view') && ($view_permission)) { |
} elsif (($action eq 'view') && ($view_permission)) { |
&Apache::lonhtmlcommon::add_breadcrumb( |
&Apache::lonhtmlcommon::add_breadcrumb( |
Line 921 function changeSort(caller) {
|
Line 932 function changeSort(caller) {
|
&display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, |
&display_groups($r,$cdom,$cnum,$functions,$idx,$view_permission, |
$manage_permission,$action,$state,$gpterm,$ucgpterm, |
$manage_permission,$action,$state,$gpterm,$ucgpterm, |
$crstype); |
$crstype); |
|
|
} |
} |
$r->print(&footer()); |
$r->print(&footer()); |
return; |
return; |
Line 1068 sub display_control {
|
Line 1078 sub display_control {
|
$sections,$states,$navbuttons,$memchg, |
$sections,$states,$navbuttons,$memchg, |
$sectioncount,$stored,$gpterm,$ucgpterm,$crstype); |
$sectioncount,$stored,$gpterm,$ucgpterm,$crstype); |
} |
} |
|
} elsif ($action eq 'delete') { |
|
my %stored = &retrieve_settings($cdom,$cnum,$groupname); |
|
if ($state eq 'verify') { |
|
&verify_delete($r,$groupname,$state,$action,$page,$states, |
|
\%stored); |
|
} elsif ($state eq 'result') { |
|
&delete_group($r,$cdom,$cnum,$groupname); |
|
} |
|
} |
|
} |
|
|
|
sub verify_delete { |
|
my ($r,$groupname,$formname,$action,$page,$states,$stored) = @_; |
|
$r->print(&Apache::lonhtmlcommon::echo_form_input([])); |
|
$r->print(&mt("You have requested deletion of the following group: ").'<i>'. |
|
$stored->{'description'}.'</i>'. |
|
'<br /><br />'.&mt('When a group is deleted the following occurs:').'<ul>'. |
|
'<li>'.&mt('All group membership is terminated.').'</li>'. |
|
'<li>'.&mt('The group ceases to be available either for viewing or for modification of group settings and membership.').'</li>'. |
|
'<li>'.&mt('The group folder is removed from the folder containing it - normally this is the "Course Groups" folder which contains folders for all groups in the course.').'</li>'. |
|
'</ul>'.&mt('Although a deleted group is no longer accessible, the group name used for the group will be reserved, and will not be available for assignment to a new group in the same course in the future.')); |
|
my $prevtext = &mt('Go back'); |
|
my $nexttext = &mt('Delete group'); |
|
my $prev; |
|
if ($env{'form.refpage'} eq 'enrl') { |
|
$prev = 'view'; |
|
} |
|
&display_navbuttons($r,$formname,$prev,$prevtext, |
|
$$states{$action}[$page+1],$nexttext); |
|
return; |
|
} |
|
|
|
sub delete_group { |
|
my ($r,$cdom,$cnum,$groupname) = @_; |
|
my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum, |
|
$groupname); |
|
my $now = time; |
|
my $num_users = 0; |
|
my $num_fail = 0; |
|
my $num_ok = 0; |
|
my @deleted; |
|
my @undeleted; |
|
my %usersettings; |
|
foreach my $key (sort(keys(%membership))) { |
|
if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) { |
|
my $user = $1; |
|
my($end,$start,@userprivs) = split(/:/,$membership{$key}); |
|
if ($start != -1) { |
|
$num_users ++; |
|
$usersettings{$groupname.':'.$user} = $now.':-1:'; |
|
if (&Apache::lonnet::modify_group_roles($cdom,$cnum, |
|
$groupname,$user, |
|
$now,'-1','') |
|
eq 'ok') { |
|
$num_ok ++; |
|
push(@deleted,$user); |
|
} else { |
|
push(@undeleted,$user); |
|
$num_fail ++; |
|
} |
|
} |
|
} |
|
} |
|
if ($num_ok > 0) { |
|
my $roster_result = |
|
&Apache::lonnet::modify_coursegroup_membership($cdom,$cnum, |
|
\%usersettings); |
|
} |
|
if ($num_fail > 0) { |
|
$r->print(&mt('Group deletion failed because deletion of [_1] out of [_2] members failed',$num_fail,$num_users)); |
|
|
|
} else { |
|
my ($result,$message) = |
|
&Apache::lonnet::delete_coursegroup($cdom,$cnum,$groupname); |
|
if ($result eq 'ok') { |
|
my $outcome = &modify_folders($cdom,$cnum,$groupname); |
|
if ($outcome eq '') { |
|
$r->print(&mt('Group successfully deleted')); |
|
} else { |
|
$r->print(&mt("Although the group was deleted, an error ([_1]) occurred when removing the group's folder from the 'Course Groups' folder.",$outcome)); |
|
} |
|
} else { |
|
$r->print(&mt('Group deletion failed')); |
|
} |
} |
} |
|
return; |
|
} |
|
|
|
sub modify_folders { |
|
my ($cdom,$cnum,$groupname) = @_; |
|
my $outcome; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
my $groupmap = '/uploaded/'.$cdom.'/'.$cnum.'/'.'group_folder_'. |
|
$groupname.'.sequence'; |
|
my $groupmapres = $navmap->getResourceByUrl($groupmap); |
|
if ($groupmapres) { |
|
my ($map,$id,$src)=&Apache::lonnet::decode_symb($groupmapres->symb()); |
|
$map = '/'.$map; |
|
my ($errtext,$fatal) = &LONCAPA::map::mapread($map); |
|
if ($fatal) { |
|
$outcome=&mt('Error reading contents of parent folder to group'). |
|
" ($map): $errtext".'<br />'; |
|
} else { |
|
my $idx = 0; |
|
my $grpidx; |
|
foreach my $item (@LONCAPA::map::order) { |
|
my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$item]); |
|
$url=&LONCAPA::map::qtescape($url); |
|
if ($url eq $groupmap) { |
|
$grpidx = $idx; |
|
last; |
|
} else { |
|
$idx++; |
|
} |
|
} |
|
|
|
if ($grpidx ne '') { |
|
&LONCAPA::map::makezombie($LONCAPA::map::order[$grpidx]); |
|
for (my $i=$grpidx;$i<$#LONCAPA::map::order;$i++) { |
|
$LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1]; |
|
} |
|
$#LONCAPA::map::order--; |
|
my ($outtext,$errtext) = &LONCAPA::map::storemap($map,1); |
|
if ($outtext) { |
|
$outcome = &mt('Error storing updated parent folder to group'). " ($map): $errtext".'<br />'; |
|
return; |
|
} |
|
} |
|
} |
|
} |
|
undef($navmap); |
|
return $outcome; |
} |
} |
|
|
sub header { |
sub header { |
Line 1542 sub display_navbuttons {
|
Line 1683 sub display_navbuttons {
|
<input type="button" name="previous" value = "'.$prevtext.'" |
<input type="button" name="previous" value = "'.$prevtext.'" |
onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/> |
onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/> |
'); |
'); |
|
} elsif ($prevtext) { |
|
$r->print(' |
|
<input type="button" name="previous" value = "'.$prevtext.'" |
|
onclick="javascript:history.back()"/> |
|
'); |
} |
} |
if ($next) { |
if ($next) { |
$r->print(' |
$r->print(' |
Line 3447 sub map_updater {
|
Line 3593 sub map_updater {
|
$outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'<br />'; |
$outcome = &mt('Error uploading new folder.')." ($newfile): $newmapurl".'<br />'; |
return $outcome; |
return $outcome; |
} |
} |
my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap); |
my ($errtext,$fatal)=&LONCAPA::map::mapread($parentmap); |
if ($fatal) { |
if ($fatal) { |
$outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'<br />'; |
$outcome = &mt('Error reading contents of parent folder')." ($parentmap): $errtext".'<br />'; |
return $outcome; |
return $outcome; |
} else { |
} else { |
my $newidx=&Apache::lonratedt::getresidx($newmapurl); |
my $newidx=&LONCAPA::map::getresidx($newmapurl); |
$Apache::lonratedt::resources[$newidx] = $itemtitle.':'.$newmapurl. |
$LONCAPA::map::resources[$newidx] = $itemtitle.':'.$newmapurl. |
':false:normal:res'; |
':false:normal:res'; |
$Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx; |
$LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx; |
my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1); |
my ($outtext,$errtext) = &LONCAPA::map::storemap($parentmap,1); |
if ($errtext) { |
if ($outtext) { |
$outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".'<br />'; |
$outcome = &mt('Error storing updated parent folder')." ($parentmap): $errtext".'<br />'; |
return $outcome; |
return $outcome; |
} |
} |
Line 3567 sub validate_groupname {
|
Line 3713 sub validate_groupname {
|
my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_; |
my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_; |
my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum); |
my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum); |
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); |
my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); |
|
my %deleted_groups = &Apache::lonnet::get_deleted_groups($cdom,$cnum); |
|
if (my $tmp = &Apache::lonnet::error(%deleted_groups)) { |
|
undef(%deleted_groups); |
|
&Apache::lonnet::logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom); |
|
} |
my %lt = &Apache::lonlocal::texthash ( |
my %lt = &Apache::lonlocal::texthash ( |
igna => "Invalid $gpterm name", |
igna => "Invalid $gpterm name", |
tgne => "The $gpterm name entered ", |
tgne => "The $gpterm name entered ", |
Line 3594 sub validate_groupname {
|
Line 3744 sub validate_groupname {
|
return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}. |
return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}. |
'<br />'.$lt{'grna'}; |
'<br />'.$lt{'grna'}; |
} |
} |
if ($action eq 'create' |
if ($action eq 'create') { |
&& exists($curr_groups{$groupname})) { |
if (exists($curr_groups{$groupname})) { |
|
return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm). |
return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm). |
$lt{'inth'}.'.<br />'.$lt{'grna'}; |
$lt{'inth'}.'<br />'.$lt{'grna'}; |
} elsif (exists($deleted_groups{$groupname})) { |
|
return $exitmsg.$lt{'cnnb'}.&mt('a [_1] which previously existed',$gpterm). |
|
$lt{'inth'}.'.<br />'.$lt{'grna'}; |
|
} |
} elsif ($action eq 'modify') { |
} elsif ($action eq 'modify') { |
unless(exists($curr_groups{$groupname})) { |
unless(exists($curr_groups{$groupname})) { |
$earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}. |
$earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}. |