--- loncom/interface/loncoursegroups.pm 2006/04/10 19:59:53 1.13
+++ loncom/interface/loncoursegroups.pm 2006/06/30 08:14:31 1.32
@@ -1,3 +1,6 @@
+# The LearningOnline Network with CAPA
+#
+# $Id: loncoursegroups.pm,v 1.32 2006/06/30 08:14:31 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -30,14 +33,18 @@ use Apache::loncommon;
use Apache::lonhtmlcommon;
use Apache::lonlocal;
use Apache::lonnavmaps;
+use Apache::longroup;
+use Apache::portfolio;
use Apache::Constants qw(:common :http);
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
sub handler {
my ($r) = @_;
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
-
+
if ($r->header_only) {
return OK;
}
@@ -63,13 +70,18 @@ sub handler {
&Apache::lonnet::allowed('mdg',$env{'request.course.id'});
&Apache::lonhtmlcommon::clear_breadcrumbs();
+ my $gpterm = &Apache::loncommon::group_term();
+ my $ucgpterm = $gpterm;
+ $ucgpterm =~ s/^(\w)/uc($1)/e;
+ my $crstype = &Apache::loncommon::course_type();
+
my %functions = (
email => 'E-mail',
discussion => 'Discussion boards',
chat => 'Chat',
files => 'File repository',
roster => 'Membership roster',
- homepage => 'Group home page',
+ homepage => $ucgpterm.' home page',
);
my %idx = ();
@@ -77,63 +89,78 @@ sub handler {
$idx{fullname} = &Apache::loncoursedata::CL_FULLNAME();
$idx{udom} = &Apache::loncoursedata::CL_SDOM();
$idx{uname} = &Apache::loncoursedata::CL_SNAME();
+ $idx{section} = &Apache::loncoursedata::CL_SECTION();
my $rowColor1 = "#dddddd";
my $rowColor2 = "#eeeeee";
my $action = $env{'form.action'};
+ my $state = $env{'form.state'};
+ if ((!defined($action)) || ($action eq 'view')) {
+ if (!defined($state)) {
+ $state = 'view';
+ }
+ }
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,$rowColor1,$rowColor2);
+ &group_administration($r,$action,$state,$cdom,$cnum,$function,
+ $tabcol,\%functions,\%idx,$view_permission,
+ $manage_permission,$rowColor1,$rowColor2,
+ $gpterm,$ucgpterm,$crstype);
} else {
- $r->print(&mt('You do not have group administration '.
- 'privileges in this course'));
+ $r->print(&mt('You do not have [_1] administration '.
+ 'privileges in this [_2]',$gpterm,lc($crstype)));
}
} else {
&print_main_menu($r,$cdom,$cnum,$function,$tabcol,\%functions,\%idx,
- $view_permission,$manage_permission,$action,
- $rowColor1,$rowColor2);
+ $view_permission,$manage_permission,$action,$state,
+ $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
}
return OK;
}
sub print_main_menu {
my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,
- $manage_permission,$action,$rowColor1,$rowColor2) = @_;
- $r->print(&header('Course Groups',undef,undef,undef,undef,$function));
+ $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,
+ $ucgpterm,$crstype) = @_;
+ my $pagename = "$crstype $ucgpterm".'s';
+ my $jscript = qq|
+function changeSort(caller) {
+ document.$state.sortby.value = caller;
+ document.$state.submit();
+}\n|;
+ $r->print(&header($pagename,$jscript,$action,$state,
+ undef,$function));
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/coursegroups",
- text=>"Course Groups",});
- $r->print(&Apache::lonhtmlcommon::breadcrumbs
- (undef,'Course Groups'));
+ text=>"$pagename"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs($pagename));
&display_groups($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,
- $view_permission,$manage_permission,$action,$rowColor1,
- $rowColor2);
+ $view_permission,$manage_permission,$action,$state,
+ $rowColor1,$rowColor2,$gpterm,$ucgpterm,$crstype);
$r->print(&footer());
return;
}
sub display_groups {
my ($r,$cdom,$cnum,$function,$tabcol,$functions,$idx,$view_permission,
- $manage_permission,$action,$rowColor1,$rowColor2) = @_;
+ $manage_permission,$action,$state,$rowColor1,$rowColor2,$gpterm,
+ $ucgpterm,$crstype) = @_;
my %curr_groups = ();
my %grp_info = ();
-
my %actionlinks = (
- modify => ' ' 'Modify',
view => 'View',
delete => 'Delete',
act => 'Action',
- gname => 'Group Name',
+ gname => "$ucgpterm Name",
desc => 'Description',
crea => 'Creator',
crtd => 'Created',
@@ -143,20 +170,23 @@ sub display_groups {
memb => 'Members',
file => 'Files',
dibd => 'Discussion Boards',
- dius => 'Disk Use',
- nogr => 'No groups exist.',
- crng => 'Create a new group',
+ dius => 'Disk Use (%)',
+ nogr => 'No '.$gpterm.'s exist.',
+ crng => 'Create a new '.$gpterm,
alth => 'Although your current role has privileges'.
- ' to view any existing groups in this course,'.
- ' you do not have privileges to create new'.
- ' groups.',
+ ' to view any existing '.$gpterm.'s in this'.
+ lc($crstype).', you do not have privileges'.
+ 'to create new '.$gpterm.'s.',
);
if ($view_permission) {
if (!defined($action)) {
$action = 'view';
}
- my %curr_groups;
- if (&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum)) {
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
+ if (%curr_groups) {
+ if ($manage_permission) {
+ $r->print('
'.$lt{'crng'}.'');
+ }
$r->print('
');
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(<<"END");
@@ -174,7 +204,7 @@ sub display_groups {
Granularity: | -'.$lt{'doyo'}.' '); + | '.&mt('Granularity:').' | +'.$lt{'doyo'}.' '); if ($action eq 'modify') { $r->print(' ('.&mt('Currently set to "[_1]"', $$stored{'granularity'}).')'); @@ -1186,6 +1314,30 @@ END $r->print(' | |||||||||||||||||
'.&mt('Disk quota: ').' | ');
+ if ($action eq 'create') {
+ $r->print(&mt('If you enable the file repository for the [_1], allocate a disk quota.',$gpterm));
+ } else {
+ $r->print(&mt('Quota allocated to file repository:'));
+ }
+ $r->print(' Mb');
+ if ($action eq 'create') {
+ $r->print(' '. + &mt('A total of [_1] Mb is shared between all [_2]s in the '. + '[_3], and [_4] Mb are currently unallocated.',$crsquota, + $gpterm,lc($crstype),$freespace)); + } else { + $r->print(' ('.&mt('The quota is currently [_1] Mb', + $$stored{'quota'}).').'); + + $r->print(' '.&mt('The quota can be increased to [_1] Mb, '. + 'by adding all unallocated space for [_2]s in the [_3].', + $maxposs,$gpterm,lc($crstype))); + } + $r->print(' + |
+
'.$lt{'desc'}.' | '.$lt{'grfn'}.' | '.$lt{'gran'}.' | +'.$lt{'quot'}.' | '.$lt{'dfac'}.' | |||
$lt{'difn'} - $granularity + $granularity | +$quota Mb | $lt{'stda'} $showstart $lt{'enda'} $showend |
@@ -1532,16 +1691,17 @@ END
sub pick_new_members {
my ($r,$action,$formname,$tabcol,$rowColor1,$rowColor2,$available,$idx,
- $stored,$img,$users,$userdata,$granularity,$origmembers) = @_;
+ $stored,$img,$users,$userdata,$granularity,$origmembers,$gpterm,
+ $ucgpterm) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'gpme' => 'Group membership',
+ 'gpme' => "$ucgpterm membership",
'addm' => 'Add members',
'setf' => 'Set functionality',
'func' => 'Functionality',
'nome' => 'No members to add at this time.',
- 'nnew' => 'There are no users to add as new members, as all users'.
- ' matching the specified type(s), role(s), and/or '.
- 'section(s) are already affiliated with this group.',
+ 'nnew' => "There are no users to add as new members, as all users".
+ " matching the specified type(s), role(s), and/or ".
+ "section(s) are already affiliated with this $gpterm.",
'yoma' => 'You may need to use the '."'".'modify existing, past or '.
'future members'."'".' page if you need to re-enable '.
'or activate access for previous or future members.',
@@ -1607,6 +1767,7 @@ sub pick_new_members {
'.&mt('Domain').' | ID | +Section | '); if (@{$available} > 0) { $r->print(''.$lt{'func'}.' | '); @@ -1635,6 +1796,8 @@ sub pick_new_members { push(@{$Sortby{$members{$user}[$$idx{udom}]}},$user); } elsif ($env{'form.sortby'} eq 'id') { push(@{$Sortby{$members{$user}[$$idx{id}]}},$user); + } elsif ($env{'form.sortby'} eq 'section') { + push(@{$Sortby{$members{$user}[$$idx{section}]}},$user); } else { push(@{$Sortby{$members{$user}[$$idx{fullname}]}},$user); } @@ -1652,10 +1815,12 @@ sub pick_new_members { my $fullname = $members{$user}[$$idx{fullname}]; my $udom = $members{$user}[$$idx{udom}]; my $uname = $members{$user}[$$idx{uname}]; + my $section = $members{$user}[$$idx{section}]; $r->print('|
'. $fullname.' | '.$uname.' | '. - $udom.' | '.$id.' | '); + $udom.''.$id.' | '. + ''.$section.' | '); if (@{$available} > 0) { $r->print('||
');
if ($granularity eq 'Yes') {
foreach my $tool (@{$current{$user}{newtools}}) {
- $r->print(' | |||||||
'); - &membership_options($r,$action,$formname,$tabcol,$sectioncount,1); + &membership_options($r,$action,$formname,$tabcol,$sectioncount,1,$gpterm, + $ucgpterm); my $nexttext = $$navbuttons{'gtns'}; my $prevtext = $$navbuttons{'gtpp'}; &display_navbuttons($r,$formname,$$states{$action}[$page-1],$prevtext, @@ -2459,7 +2629,8 @@ sub add_members_form { sub choose_privs_form { my ($r,$cdom,$cnum,$tabcol,$action,$formname,$page,$startdate,$enddate, $tools,$functions,$toolprivs,$fixedprivs,$userdata,$usertools,$idx, - $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2) = @_; + $states,$stored,$sectioncount,$navbuttons,$rowColor1,$rowColor2, + $gpterm,$ucgpterm,$crstype) = @_; my @regexps = ('userpriv_'); my $nexttext; @@ -2477,11 +2648,11 @@ sub choose_privs_form { } $r->print(' |
'); &mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt, - $stored,$img2); + $stored,$img2,$crstype); return; } @@ -3118,7 +3336,7 @@ sub automapping { |
|
| '.§ions_selection(\@sections,'sec_'.$role).
- ' | ';
+ if ($role eq 'cc') {
+ $sections_sel = ''.
+ &mt('all sections').' | ';
+ } else {
+ $sections_sel=''.
+ §ions_selection(\@sections,'sec_'.$role).
+ ' | ';
+ }
}
if ($rowNum %2 == 1) {
$rowColor = $rowColor1;
@@ -3212,7 +3438,7 @@ sub mapping_settings {
}
sub standard_roles {
- my @roles = ('st','ep','ta','in','cc');
+ my @roles = ('cc','in','ta','ep','st');
return @roles;
}
@@ -3228,10 +3454,10 @@ sub my_custom_roles {
}
sub modify_menu {
- my ($r,$groupname,$page) = @_;
+ my ($r,$groupname,$page,$gpterm) = @_;
my @menu =
(
- { text => 'Modify default group settings',
+ { text => "Modify default $gpterm settings",
help => 'Course_Modify_Group',
state => 'change_settings',
branch => 'settings',
@@ -3242,7 +3468,7 @@ sub modify_menu {
state => 'change_members',
branch => 'members',
},
- { text => 'Add member(s) to the group',
+ { text => "Add member(s) to the $gpterm",
help => 'Course_Group_Add_Members',
state => 'add_members',
branch => 'adds',
@@ -3355,21 +3581,172 @@ sub date_setting_table {
return ($start_table, $end_table);
}
+sub add_group_folder {
+ my ($cdom,$cnum,$now,$groupname,$action,$description,$tools,$groupinfo,
+ $gpterm,$ucgpterm,$crstype) = @_;
+ if ($cdom eq '' || $cnum eq '') {
+ return &mt('Error: invalid course domain or number - group folder creation failed');
+ }
+ my ($outcome,$allgrpsmap,$grpmap,$boardsmap,$grppage);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/';
+ $allgrpsmap = $crspath.'default_0.sequence';
+ my $topmap = $navmap->getResourceByUrl($allgrpsmap);
+ undef($navmap);
+ if ($action eq 'create') {
+ # check if default_0.sequence exists.
+ if (!$topmap) {
+ my $grpstitle = &mt('[_1] [_2]',$crstype,$ucgpterm);
+ my $topmap_url = '/'.$env{'course.'.$env{'request.course.id'}.'.url'};
+ $topmap_url =~ s|/+|/|g;
+ if ($topmap_url =~ m|^/uploaded|) {
+ $outcome = &map_updater($cdom,$cnum,'default_0.sequence',
+ 'toplevelgroup',$grpstitle,$topmap_url);
+ if ($outcome ne 'ok') {
+ return $outcome;
+ }
+ } else {
+ $outcome = &mt('Non-standard course - group folder not added.');
+ return $outcome;
+ }
+ }
+ my $grpfolder = &mt('[_1] Folder -',$ucgpterm,).$description;
+ $grppage='/adm/'.$cdom.'/'.$cnum.'/'.$groupname.'/grppg';
+ my $grptitle = &mt('Group homepage').' - '.$description;
+ my ($seqid,$discussions,$disctitle);
+ my $outcome = &map_updater($cdom,$cnum,'default_'.$now.'.sequence',
+ 'grpseq',$grpfolder,$allgrpsmap,$grppage,
+ $grptitle);
+ if ($outcome ne 'ok') {
+ return $outcome;
+ }
+ my $pageout = &create_homepage($cdom,$cnum,$groupname,$groupinfo,
+ $tools,$gpterm,$ucgpterm,$now);
+ # Link to folder for bulletin boards
+ $grpmap = $crspath.'default_'.$now.'.sequence';
+ if (grep/^discussion$/,@{$tools}) {
+ $seqid = $now + 1;
+ $disctitle = &mt('Discussion Boards');
+ my $outcome = &map_updater($cdom,$cnum,'default_'.$seqid.
+ '.sequence','bbseq',$disctitle,$grpmap);
+ if ($outcome ne 'ok') {
+ return $outcome;
+ }
+ $boardsmap = $crspath.'default_'.$seqid.'.sequence';
+ }
+ } else {
+ #modify group folder if status of discussions tools is changed
+ }
+ my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ # modify parameters
+ my $parm_result;
+ if ($action eq 'create') {
+ if ($allgrpsmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$allgrpsmap,$groupname);
+ }
+ if ($grpmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$grpmap,$groupname);
+ }
+ if ($grppage) {
+ $parm_result .= &parm_setter($navmap,$cdom,$grppage,$groupname);
+ }
+ if ($boardsmap) {
+ $parm_result .= &parm_setter($navmap,$cdom,$boardsmap,$groupname);
+ }
+ }
+ if ($parm_result) {
+ return $parm_result;
+ } else {
+ return 'ok';
+ }
+}
+
+sub map_updater {
+ my ($cdom,$cnum,$newfile,$itemname,$itemtitle,$parentmap,$startsrc,
+ $starttitle,$endsrc,$endtitle) = @_;
+ my $outcome;
+ $env{'form.'.$itemname} = &new_map($startsrc,$starttitle,$endsrc,
+ $endtitle);
+ my $newmapurl=&Apache::lonnet::finishuserfileupload($cnum,$cdom,$itemname,
+ $newfile);
+ if ($newmapurl !~ m|^/uploaded|) {
+ $outcome = "Error uploading new folder ($newfile): $newmapurl";
+ return $outcome;
+ }
+ my ($errtext,$fatal)=&Apache::lonratedt::mapread($parentmap);
+ if ($fatal) {
+ $outcome = "Error reading contents of parent folder ($parentmap): $errtext\n";
+ return $outcome;
+ } else {
+ my $newidx=&Apache::lonratedt::getresidx($newmapurl);
+ $Apache::lonratedt::resources[$newidx] = $itemtitle.':'.$newmapurl.
+ ':false:normal:res';
+ $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;
+ my ($outtext,$errtext) = &Apache::lonratedt::storemap($parentmap,1);
+ if ($errtext) {
+ $outcome = "Error storing updated parent folder ($parentmap): $errtext\n";
+ return $outcome;
+ }
+ }
+ return 'ok';
+}
+
+sub new_map {
+ my ($startsrc,$starttitle,$endsrc,$endtitle) = @_;
+ my $newmapstr = '
+
+';
+ return $newmapstr;
+}
+
+sub parm_setter {
+ my ($navmap,$cdom,$url,$groupname) = @_;
+ my %parmresult;
+ my %hide_settings = (
+ 'course' => {
+ 'num' => 13,
+ 'set' => 'yes',
+ },
+ 'group' => {
+ 'num' => 5,
+ 'set' => 'no',
+ 'extra' => $groupname,
+ },
+ );
+ my $res = $navmap->getResourceByUrl($url);
+ my $symb = $res->symb();
+ foreach my $level (keys(%hide_settings)) {
+ $parmresult{$level} = &Apache::lonparmset::storeparm_by_symb($symb,
+ '0_hiddenresource',
+ $hide_settings{$level}{'num'},
+ $hide_settings{$level}{'set'},
+ 'string_yesno',undef,$cdom,
+ undef,undef,
+ $hide_settings{$level}{'extra'});
+ }
+ return %parmresult;
+}
+
sub create_homepage {
- my ($cdom,$cnum,$name,$groupinfo,$tools) = @_;
+ my ($cdom,$cnum,$name,$groupinfo,$tools,$gpterm,$ucgpterm,$now) = @_;
my $functionality = join(',',@{$tools});
- my $content = &Apache::lonnet::unescape($$groupinfo{description});
+ my $content = &unescape($$groupinfo{description});
$content=~s/\s+$//s;
$content=~s/^\s+//s;
$content=~s/\$//s; $content=&Apache::lonfeedback::clear_out_html($content,1); my %pageinfo = ( - 'aaa_title' => 'Group: '.$name, + 'aaa_title' => "$ucgpterm: $name", 'abb_links' => $functionality, 'bbb_content' => $content, 'ccc_webreferences' => '', - 'uploaded.lastmodified' => time, + 'uploaded.lastmodified' => $now, ); my $putresult = &Apache::lonnet::put('grppage_'.$name,\%pageinfo,$cdom,$cnum); return $putresult; @@ -3411,26 +3788,24 @@ function toggleTools(field,caller) { } sub validate_groupname { - my ($groupname,$action,$cdom,$cnum) = @_; - my %sectioncount; - my $numsec=&Apache::loncommon::get_sections($cdom,$cnum,\%sectioncount); - my %curr_groups; - my $numgroups=&Apache::loncommon::coursegroups(\%curr_groups,$cdom,$cnum); - + my ($groupname,$action,$cdom,$cnum,$gpterm,$ucgpterm,$crstype) = @_; + my %sectioncount = &Apache::loncommon::get_sections($cdom,$cnum); + my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum); + my %lt = &Apache::lonlocal::texthash ( - igna => 'Invalid group name', - tgne => 'The group name entered ', - grna => 'Group names and section names used in a course '. - 'must be unique.', - isno => 'is not a valid name.', - gnmo => 'Group names may only contain letters, numbers '. - 'or underscores.', - cnnb => 'can not be used as it is the name of ', - inth => ' in this course.', - thgr => '- does not correspond to the name of an existing'. - ' group ', + igna => "Invalid $gpterm name", + tgne => "The $gpterm name entered ", + grna => "$ucgpterm names and section names used in a ". + "$crstype must be unique.", + isno => "is not a valid name.", + gnmo => "$ucgpterm names may only contain letters, ". + "numbers or underscores.", + cnnb => "can not be used as it is the name of ", + inth => " in this $crstype", + thgr => "- does not correspond to the name of an ". + "existing $gpterm", ); - + my $exitmsg = ''.$lt{'igna'}.' '.$lt{'tgne'}.' "'. $groupname.'" '; my $dupmsg = $lt{'grna'}; @@ -3439,24 +3814,20 @@ sub validate_groupname { $earlyout = $exitmsg.$lt{'isno'}.' '.$lt{'gnmo'}; return $earlyout; } - if ($numsec) { - if (exists($sectioncount{$groupname})) { - $earlyout = $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}. - ' '.$lt{'grna'}; - return $earlyout; - } + if (exists($sectioncount{$groupname})) { + return $exitmsg.$lt{'cnnb'}.&mt('a section').$lt{'inth'}. + ' '.$lt{'grna'}; } - if ($action eq 'create') { - if ($numgroups) { - if (exists($curr_groups{$groupname})) { - $earlyout = $exitmsg.$lt{'cnnb'}.&mt('an existing group'). - $lt{'inth'}.' '.$lt{'grna'}; - return $earlyout; - } - } + if ($action eq 'create' + && exists($curr_groups{$groupname})) { + + return $exitmsg.$lt{'cnnb'}.&mt('an existing [_1]',$gpterm). + $lt{'inth'}.' '.$lt{'grna'}; + } elsif ($action eq 'modify') { unless(exists($curr_groups{$groupname})) { - $earlyout = &mt('Group name:').' '.$groupname.$lt{'thgr'}.$lt{'inth'}; + $earlyout = &mt('[_1] name:',$ucgpterm).' '.$groupname.$lt{'thgr'}. + $lt{'inth'}; return $earlyout; } } |