';
foreach my $sec (@autosections) {
$autosec .= '';
@@ -2870,34 +3054,43 @@ sub write_group_data {
if ($result eq 'ok') {
if ($action eq 'create') {
- my $put_result = &create_homepage($cdom,$cnum,$groupname,
- \%groupinfo,$tools);
- $r->print('Group '.$groupname.' was created.
');
+ my $result = &add_group_folder($cdom,$cnum,$now,$groupname,$action,
+ $description,$tools,\%groupinfo,
+ $gpterm,$ucgpterm,$crstype);
+ if ($result ne 'ok') {
+ $r->print(&mt('A problem occurred when creating folders for the new [_1]. [_2].',$gpterm,$result));
+ }
+ $r->print(&mt('[_1] [_2] was created.
',$ucgpterm,$groupname));
} else {
- $r->print('Group '.$groupname.' was updated.
');
+ $r->print(&mt('[_1] [_2] was updated.
',$ucgpterm,$groupname));
}
} else {
my %actiontype = (
'create' => 'creating',
'modify' => 'modifying',
);
- &Apache::lonnet::logthis('Failed to store group '.$groupname.
- 'in course: '.$cnum.' in domain: '.$cdom);
- $r->print(&mt('An error occurred when [_1] the new group. '.
- 'Please try again.',$actiontype{$action}));
+ &Apache::lonnet::logthis("Failed to store $gpterm $groupname ".
+ 'in '.lc($crstype).': '.$cnum.
+ ' in domain: '.$cdom);
+ $r->print(&mt('An error occurred when [_1] the new [_2]. '.
+ 'Please try again.',$actiontype{$action},$gpterm));
}
return $result;
}
sub process_membership {
my ($r,$cdom,$cnum,$action,$state,$groupname,$tools,$enddate,$startdate,
- $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg)=@_;
+ $userdata,$idx,$toolprivs,$usertools,$specificity,$defprivs,$memchg,
+ $gpterm,$ucgpterm)=@_;
my %usersettings = ();
my %added= ();
my %failed = ();
my $num_ok = 0;
my $num_fail = 0;
my %group_privs = ();
+ my %curr_privs = ();
+ my %curr_start = ();
+ my %curr_end = ();
my %tooltype = ();
foreach my $tool (@{$tools}) {
@@ -2916,7 +3109,7 @@ sub process_membership {
}
} else {
if (@{$defprivs} > 0) {
- foreach my $priv (@{$defprivs}) {
+ if (grep/^\Q$priv\E$/,@{$defprivs}) {
foreach my $user (sort(keys(%{$usertools}))) {
if ($$usertools{$user}{$tool}) {
$group_privs{$user} .= $priv.':';
@@ -2936,6 +3129,7 @@ sub process_membership {
my @expire = ();
my @deletion = ();
my @reenable = ();
+ my @unchanged = ();
if ($state eq 'memresult') {
if (ref($$memchg{'activate'}) eq 'ARRAY') {
@activate = @{$$memchg{'activate'}};
@@ -2949,21 +3143,25 @@ sub process_membership {
if (ref($$memchg{'reenable'}) eq 'ARRAY') {
@reenable = @{$$memchg{'reenable'}};
}
+ my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
+ $groupname);
+ foreach my $key (sort(keys(%membership))) {
+ if ($key =~ /^\Q$groupname\E:([^:]+:[^:]+)$/) {
+ ($curr_end{$1},$curr_start{$1},$curr_privs{$1}) =
+ split(/:/,$membership{$key},3);
+ }
+ }
if (@expire + @deletion > 0) {
- my %membership = &Apache::lonnet::get_group_membership($cdom,$cnum,
- $groupname);
foreach my $user (@expire) {
- my ($currend,$currstart,@userprivs) =
- split(/:/,$membership{$groupname.':'.$user});
- $group_privs{$user} = join(':',@userprivs);
- if ($currstart > $now) {
- $currstart = $now;
+ my $savestart = $curr_start{$user};
+ if ($savestart > $now) {
+ $savestart = $now;
}
- $usersettings{$groupname.':'.$user} = $now.':'.$currstart.':'.
- $group_privs{$user};
+ $usersettings{$groupname.':'.$user} = $now.':'.$savestart.':'.
+ $curr_privs{$user};
if (&Apache::lonnet::modify_group_roles($cdom,$cnum,$groupname,
- $user,$now,$currstart,
- $group_privs{$user}) eq 'ok') {
+ $user,$now,$savestart,
+ $curr_privs{$user}) eq 'ok') {
push(@{$added{'expired'}},$user);
$num_ok ++;
} else {
@@ -2987,19 +3185,35 @@ sub process_membership {
}
foreach my $user (sort(keys(%{$usertools}))) {
+ if ((grep(/^$user$/,@expire)) || (grep(/^$user$/,@deletion))) {
+ next;
+ }
my $type;
my $start = $startdate;
my $end = $enddate;
if ($state eq 'memresult') {
+ if ($curr_privs{$user} eq $group_privs{$user}) {
+ push(@unchanged,$user);
+ next;
+ }
+ if (exists($curr_start{$user})) {
+ $start = $curr_start{$user};
+ }
+ if (exists($curr_end{$user})) {
+ $end = $curr_end{$user};
+ }
$type = 'modified';
if (@activate > 0) {
if (grep/^$user$/,@activate) {
$start = $now;
+ $end = $enddate;
$type = 'activated';
}
}
if (@reenable > 0) {
if (grep/^$user$/,@reenable) {
+ $start = $startdate;
+ $end = $enddate;
$type = 'reenabled';
}
}
@@ -3023,7 +3237,7 @@ sub process_membership {
if ($num_ok) {
foreach my $type (sort(keys(%added))) {
$r->print(&mt('The following users were successfully [_1]',$type));
- if (!($type eq 'deleted' || $type eq 'expired')) {
+ if (!($type eq 'deleted' || $type eq 'expired')) {
$r->print(&mt(' with the following privileges'));
}
$r->print(':
');
@@ -3044,6 +3258,7 @@ sub process_membership {
}
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.$privlist.'
');
}
+ $r->print('
');
}
}
if ($num_fail) {
@@ -3053,32 +3268,42 @@ sub process_membership {
$r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'
');
}
}
+ $r->print('
');
+ }
+ if (@unchanged > 0) {
+ $r->print(&mt('No change occurred for the following users:
'));
+ foreach my $user (sort(@unchanged)) {
+ $r->print($$userdata{$user}[$$idx{fullname}].' - '.$user.'
');
+ }
+ $r->print('
');
}
if ($roster_result eq 'ok') {
- $r->print('
Group membership list updated.');
+ $r->print('
'.&mt('[_1] membership list updated.',$ucgpterm));
+ $r->print(''.&mt("For full access to all of [_1]'s privileges, users will need to log out and log back in.",$groupname).'
');
} else {
- $r->print('
An error occurred while updating the group membership list -'.$roster_result.'
');
+ $r->print('
'.&mt('An error occurred while updating the [_1] membership list -',$gpterm).$roster_result.'
');
}
return;
}
sub mapping_options {
my ($r,$action,$formname,$page,$tabcol,$sectioncount,$states,$stored,
- $navbuttons,$img1,$img2,$rowColor1,$rowColor2) = @_;
+ $navbuttons,$img1,$img2,$rowColor1,$rowColor2,$gpterm,$ucgpterm,
+ $crstype) = @_;
my %lt = &Apache::lonlocal::texthash(
- 'auto' => 'Settings for automatic group enrollment',
- 'gmma' => 'Group membership mapping to specific sections/roles',
- 'endi' => 'Enable/disable automatic group enrollment for '.
- 'users in specified roles and sections',
- 'adds' => 'If automatic group enrollment is enabled, when a user is assigned a course-wide or section-specific role, he/she will automatically be added as a member of the group, with start and end access dates defined by the default dates set for the group, unless he/she is already a group member, with access dates that permit either current or future group access.',
- 'drops' => "If automatic group disenrollment is enabled, when a user's role is expired, access to the group will be terminated unless the user continues to have other course-wide or section-specific active or future roles which receive automatic membership in the group.",
- 'pirs' => 'Pick roles and sections for automatic group enrollment',
+ 'auto' => "Settings for automatic $gpterm enrollment",
+ 'gmma' => "$ucgpterm membership mapping to specific sections/roles",
+ 'endi' => "Enable/disable automatic $gpterm enrollment for ".
+ "users in specified roles and sections",
+ 'adds' => "If automatic $gpterm enrollment is enabled, when a user is assigned a ".lc($crstype)."-wide or section-specific role, he/she will automatically be added as a member of the $gpterm, with start and end access dates defined by the default dates set for the $gpterm, unless he/she is already a $gpterm member, with access dates that permit either current or future $gpterm access.",
+ 'drops' => "If automatic $gpterm disenrollment is enabled, when a user's role is expired, access to the $gpterm will be terminated unless the user continues to have other ".lc($crstype)."-wide or section-specific active or future roles which receive automatic membership in the $gpterm.",
+ 'pirs' => "Pick roles and sections for automatic $gpterm enrollment",
'curr' => 'Currently set to',
'on' => 'on',
'off' => 'off',
- 'auad' => 'Automatically enable group membership when roles are added?',
- 'auex' => 'Automatically expire group membership when roles are removed?',
- 'mapr' => 'Mapping of roles and sections affected by automatic group enrollment/disenrollment follows scheme chosen below.',
+ 'auad' => "Automatically enable $gpterm membership when roles are added?",
+ 'auex' => "Automatically expire $gpterm membership when roles are removed?",
+ 'mapr' => "Mapping of roles and sections affected by automatic $gpterm enrollment/disenrollment follows scheme chosen below.",
);
&automapping($r,$action,$tabcol,$stored,\%lt,$img1);
$r->print('
@@ -3086,7 +3311,7 @@ sub mapping_options {
|
');
&mapping_settings($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,\%lt,
- $stored,$img2);
+ $stored,$img2,$crstype);
return;
}
@@ -3115,7 +3340,7 @@ sub automapping {
|
'.$$lt{'auad'}.':
- on off');
+ ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$add}.')');
}
@@ -3127,7 +3352,7 @@ sub automapping {
|
'.$$lt{'auex'}.':
- on off');
+ ');
if ($action eq 'modify') {
$r->print(' ('.$$lt{'curr'}.' '.$$lt{$drop}.')');
}
@@ -3146,12 +3371,13 @@ sub automapping {
}
sub mapping_settings {
- my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image) = @_;
+ my ($r,$tabcol,$rowColor1,$rowColor2,$sectioncount,$lt,$stored,$image,
+ $crstype) = @_;
my @sections = keys(%{$sectioncount});
if (@sections > 0) {
@sections = sort {$a cmp $b} @sections;
- unshift(@sections,'_nosec'); # Put 'no sections' next
- unshift(@sections,'_all'); # Put 'all' at the front of the list
+ unshift(@sections,'none'); # Put 'no sections' next
+ unshift(@sections,'all'); # Put 'all' at the front of the list
}
&topic_bar($r,$tabcol,$image,$$lt{'pirs'});
$r->print('
@@ -3172,11 +3398,18 @@ sub mapping_settings {
my $rowNum = 0;
my $rowColor;
foreach my $role (@roles) {
- my $plrole=&Apache::lonnet::plaintext($role);
+ my $plrole=&Apache::lonnet::plaintext($role,$crstype);
my $sections_sel;
if (@sections > 0) {
- $sections_sel=''.§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;
@@ -3209,7 +3442,7 @@ sub mapping_settings {
}
sub standard_roles {
- my @roles = ('st','ep','ta','in','cc');
+ my @roles = ('cc','in','ta','ep','st');
return @roles;
}
@@ -3225,10 +3458,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',
@@ -3239,7 +3472,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',
@@ -3352,21 +3585,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);
+ $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;
@@ -3408,26 +3792,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'};
@@ -3436,24 +3818,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;
}
}
| |