");
} # end each map
} # end of $parmlev eq map
#--------------------------------- Entry for parm level general (Course level)
@@ -1981,6 +2027,8 @@ sub crsenv {
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my (%crsinfo,$chome);
+
#
# Go through list of changes
foreach (keys %env) {
@@ -2000,7 +2048,7 @@ sub crsenv {
('environment',
{'top level map backup '.$bkuptime => $tmp[1] },
$dom,$crs).
- ' ';
+ ' ';
}
#
# Deal with modified default spreadsheets
@@ -2028,6 +2076,29 @@ sub crsenv {
if ($name =~ /^default_enrollment_(start|end)_date$/) {
$value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
}
+ #
+ # Deal with the emails
+ if ($name =~ /\.email$/) {
+ foreach my $specifier (split(',',$value)) {
+ my ($user,$sections_or_groups)=
+ ($specifier=~/^([^\(]+)\(([^\)]+)\)/);
+ if (!$sections_or_groups) {
+ $user = $specifier;
+ }
+ my ($name,$domain) = split(':',$user);
+ if (!defined($user) || !defined($domain)) {
+ $setoutput.= ' '.
+ &mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).
+ '';
+ undef($value);
+ } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {
+ $setoutput.= ' '.
+ &mt("Invalid email address specified, user [_1] is unknown.",$name).
+ '';
+ undef($value);
+ }
+ }
+ }
# Get existing cloners
my @oldcloner = ();
if ($name eq 'cloners') {
@@ -2041,40 +2112,94 @@ sub crsenv {
#
# Let the user know we made the changes
if ($name && defined($value)) {
- my $failed_cloners;
+ my %failed_cloners;
if ($name eq 'cloners') {
$value =~ s/\s//g;
$value =~ s/^,//;
$value =~ s/,$//;
# check requested clones are valid users.
- $failed_cloners = &check_cloners(\$value,\@oldcloner);
+ %failed_cloners = &check_cloners(\$value,\@oldcloner);
}
my $put_result = &Apache::lonnet::put('environment',
{$name=>$value},$dom,$crs);
if ($put_result eq 'ok') {
- $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' '.$value.'. ';
+ $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' ';
+ if ($name =~ /^default_enrollment_(start|end)_date$/) {
+ $setoutput .= &Apache::lonlocal::locallocaltime($value);
+ } else {
+ $setoutput .= $value;
+ }
+ $setoutput .= '. ';
if ($name eq 'cloners') {
&change_clone($value,\@oldcloner);
}
- # Flush the course logs so course description is immediately updated
+ # Update environment and nohist_courseids.db
+ if (($name eq 'description') || ($name eq 'cloners') ||
+ ($name eq 'hidefromcat')) {
+ if ($chome eq '') {
+ %crsinfo =
+ &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
+ $crs,undef,undef,'Course');
+ $chome = &Apache::lonnet::homeserver($crs,$dom);
+ }
+ }
if ($name eq 'description' && defined($value)) {
- &Apache::lonnet::flushcourselogs();
+ &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value});
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ $crsinfo{$env{'request.course.id'}}{'description'} = $value;
+ my $putresult =
+ &Apache::lonnet::courseidput($dom,\%crsinfo,
+ $chome,'notime');
+ }
+ }
+ if ($name eq 'cloners') {
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ $crsinfo{$env{'request.course.id'}}{'cloners'} = $value;
+ my $putresult =
+ &Apache::lonnet::courseidput($dom,\%crsinfo,
+ $chome,'notime');
+ }
+ }
+ if ($name eq 'hidefromcat') {
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ $crsinfo{$env{'request.course.id'}}{'hidefromcat'} = $value;
+ my $putresult =
+ &Apache::lonnet::courseidput($dom,\%crsinfo,
+ $chome,'notime');
+ }
}
} else {
$setoutput.=&mt('Unable to set').' '.$name.' '.&mt('to').
' '.$value.' '.&mt('due to').' '.$put_result.'. ';
}
- if (($name eq 'cloners') && ($failed_cloners)) {
- $setoutput.= &mt('Unable to include').' - '.$failed_cloners.', '.
- &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').
- '. '.&mt('Please ').
- ' '.
- &mt('add the user(s)').', '.
- &mt('and then return to the ').
- ''.
- &mt('Course Parameters page').' '.
- &mt('to add the new user(s) to the list of possible cloners').
- '. ';
+ if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) {
+ $setoutput.= &mt('Unable to include').': ';
+ my @fails;
+ my $num = 0;
+ if (defined($failed_cloners{'format'})) {
+ $fails[$num] .= ''.$failed_cloners{'format'}.
+ ', '.&mt('reason').' - '.
+ &mt('Invalid format');
+ $num ++;
+ }
+ if (defined($failed_cloners{'domain'})) {
+ $fails[$num] .= ''.$failed_cloners{'domain'}.
+ ', '.&mt('reason').' - '.
+ &mt('Domain does not exist');
+ $num ++;
+ }
+ if (defined($failed_cloners{'newuser'})) {
+ $fails[$num] .= ''.$failed_cloners{'newuser'}. ', '.&mt('reason').' - '.
+ &mt('LON-CAPA user(s) do(es) not exist.').
+ '. '.&mt('Please ').
+ ' '.
+ &mt('add the user(s)').', '.
+ &mt('and then return to the ').
+ ''.
+ &mt('Course Parameters page').' '.
+ &mt('to add the new user(s) to the list of possible cloners');
+ }
+ $setoutput .= join('; ',@fails).'. ';
}
}
}
@@ -2095,63 +2220,72 @@ sub crsenv {
my $output='';
if (! exists($values{'con_lost'})) {
my %descriptions=
- ('url' => ''.&mt('Top Level Map').' '.
+ ('url' => ''.&mt('Top Level Map').' '.
'".
&mt('Select Map').' '.
- &mt('Modification may make assessment data inaccessible').
+ &mt('Modification may make assessment data inaccessible!').
'',
'description' => ''.&mt('Course Description').'',
'courseid' => ''.&mt('Course ID or number').
' '.
- '('.&mt('internal').', '.&mt('optional').')',
- 'cloners' => ''.&mt('Users allowed to clone course').' (user:domain,user:domain) '.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),
+ '('.&mt('internal, optional').')',
+ 'cloners' => ''.&mt('Users allowed to clone course').' '
+ .'("'.&mt('user:domain,user:domain,*:domain').'") '
+ .&mt('Users with active Course Coordinator role in this course are permitted to clone and need not be included.').' '
+ .&mt('Use [_1] to allow course to be cloned by anyone in the specified domain.','"*:domain"').' '
+ .&mt('Use [_1] to allow unrestricted cloning in all domains.','"*"'),
'grading' => ''.&mt('Grading').' '.
- '"standard", "external", or "spreadsheet" '.&Apache::loncommon::help_open_topic('GradingOptions'),
- 'default_xml_style' => ''.&mt('Default XML Style File').' '.
+ &mt('[_1], [_2], or [_3]','"standard"','"external"','"spreadsheet"').&Apache::loncommon::help_open_topic('GradingOptions'),
+ 'task_grading' => ''.&mt('Bridge Task Grading').' '
+ .&mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections.').' '
+ .'('.&mt('[_1]: they are allowed (this is the default). [_2]: no, they can only grade their own section.','"any"','"section"').')',
+ 'default_xml_style' => ''.&mt('Default XML Style File').' '.
'$SelectStyleFile ",
- 'question.email' => ''.&mt('Feedback Addresses for Resource Content Question').
- ' (user:domain,'.
- 'user:domain(section;section;...;*;...),...)',
- 'comment.email' => ''.&mt('Feedback Addresses for Course Content Comments').' '.
- '(user:domain,user:domain(section;section;...;*;...),...)',
- 'policy.email' => ''.&mt('Feedback Addresses for Course Policy').''.
- ' (user:domain,user:domain(section;section;...;*;...),...)',
- 'hideemptyrows' => ''.&mt('Hide Empty Rows in Spreadsheets').' '.
- '('.&mt('"[_1]" for default hiding','yes').')',
- 'pageseparators' => ''.&mt('Visibly Separate Items on Pages').' '.
- '('.&mt('"[_1]" for visible separation','yes').', '.
- &mt('changes will not show until next login').')',
- 'student_classlist_view' => ''.&mt('Allow students to view classlist.').''.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),
-
- 'plc.roles.denied'=> ''.&mt('Disallow live chatroom use for Roles').
- ' "st": '.
- &mt('student').', "ta": '.
- 'TA, "in": '.
- &mt('instructor').'; '.&mt('role,role,...').') '.
- Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
+ ",'sty')\">$SelectStyleFile ",
+ 'question.email' => ''.&mt('Feedback Addresses for Resource Content Question').' '
+ .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').'")',
+ 'question.email.text' => ''.&mt('Custom Text for Resource Content Question Option in Feedback').'',
+ 'comment.email' => ''.&mt('Feedback Addresses for Course Content Comments').' '
+ .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').'")',
+ 'comment.email.text' => ''.&mt('Custom Text for Course Content Option in Feedback').'',
+ 'policy.email' => ''.&mt('Feedback Addresses for Course Policy').' '
+ .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').'")',
+ 'policy.email.text' => ''.&mt('Custom Text for Course Policy Option in Feedback').'',
+ 'hideemptyrows' => ''.&mt('Hide Empty Rows in Spreadsheets').' '
+ .'('.&mt('[_1] for default hiding','"yes"').')',
+ 'pageseparators' => ''.&mt('Visibly Separate Items on Pages').' '
+ .'('.&mt('[_1] for visible separation.','"yes"').' '
+ .&mt('Changes will not show until next login.').')',
+ 'student_classlist_view' => ''.&mt('Allow students to view classlist.').' '
+ .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"all"','"section"','"disabled"').')',
+ 'student_classlist_portfiles' => ''.&mt('Include link to accessible portfolio files').' '
+ .'('.&mt('[_1] for link to each a listing of each student\'s files.','"yes"').')',
+ 'student_classlist_opt_in' => ''.&mt("Student's agreement needed for listing in student-viewable roster").' '
+ .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"yes"').')',
+ 'plc.roles.denied'=> ''.&mt('Disallow live chatroom use for Roles').' '
+ .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"').') '
+ .'("'.&mt('role,role,...').'") '
+ .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
'plc.users.denied' =>
''.&mt('Disallow live chatroom use for Users').' '.
- '(user:domain,user:domain,...)',
+ '("'.&mt('user:domain,user:domain,...').'")',
- 'pch.roles.denied'=> ''.&mt('Disallow Resource Discussion for Roles').
- ' "st": '.
- 'student, "ta": '.
- 'TA, "in": '.
- 'instructor; role,role,...) '.
- Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
+ 'pch.roles.denied'=> ''.&mt('Disallow Resource Discussion for Roles').' '
+ .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"')
+ .'("'.&mt('role,role,...').'") '
+ .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
'pch.users.denied' =>
''.&mt('Disallow Resource Discussion for Users').' '.
- '(user:domain,user:domain,...)',
+ '("'.&mt('user:domain,user:domain,...').'")',
'spreadsheet_default_classcalc'
=> ''.&mt('Default Course Spreadsheet').' '.
'$SelectSpreadsheetFile ",
'spreadsheet_default_studentcalc'
- => ''.&mt('Default Student Spreadsheet').' '.
+ => ''.&mt('Default Student Spreadsheet').' '.
'$SelectSpreadsheetFile ",
@@ -2162,44 +2296,45 @@ sub crsenv {
",'spreadsheet')\">$SelectSpreadsheetFile ",
'allow_limited_html_in_feedback'
=> ''.&mt('Allow limited HTML in discussion posts').' '.
- '('.&mt('Set value to "[_1]" to allow',"yes").')',
+ '('.&mt('Set value to [_1] to allow.','"yes"').')',
'allow_discussion_post_editing'
- => ''.&mt('Allow users with specified roles to edit/delete their own discussion posts').' "st": '.
- &mt('student').', "ta": '.
- 'TA, "in": '.
- &mt('instructor').'; ('.&mt('role:section,role:section,..., e.g., st:001,st:002,in,cc would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').') '.
- '('.&mt('or set value to "[_1]" to allow all roles',"yes").')',
+ => ''.&mt('Allow users with specified roles to edit/delete their own discussion posts').' '
+ .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st"','"ta"','"in"').') '
+ .'('.&mt('Set value to [_1] to allow all roles.','"yes"').')'
+ .'("'.&mt('role:section,role:section,...').'") '
+ .'('.&mt('Example: "st:001,st:002,in,cc" would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')',
'rndseed'
- => ''.&mt('Randomization algorithm used').' '.
- ''.&mt('Modifying this will make problems').' '.
- &mt('have different numbers and answers').'',
+ => ''.&mt('Randomization algorithm used').' '
+ .''
+ .&mt('Modifying this will make problems have different numbers and answers!')
+ .'',
'receiptalg'
=> ''.&mt('Receipt algorithm used').' '.
&mt('This controls how receipt numbers are generated.'),
'suppress_tries'
=> ''.&mt('Suppress number of tries in printing').' '.
- ' ('.&mt('"[_1]" to suppress, anything else to not suppress','yes').')',
+ ' ('.&mt('[_1] to suppress, anything else to not suppress','"yes"').')',
'problem_stream_switch'
=> ''.&mt('Allow problems to be split over pages').' '.
- ' ('.&mt('"[_1]" if allowed, anything else if not','yes').')',
+ ' ('.&mt('[_1] if allowed, anything else if not','"yes"').')',
'default_paper_size'
=> ''.&mt('Default paper type').' '.
' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.
' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.
' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
- 'anonymous_quiz'
- => ''.&mt('Anonymous quiz/exam').' '.
- ' ('.&mt('yes').' '.&mt('to avoid print students names').' )',
+ 'print_header_format'
+ => ' '.&mt('Print header format').' '
+ .&mt('Substitutions: [_1]: student name, [_2]: course id, [_3]: assignment note. Numbers after the % limit the field size.','"%n"','"%c"','"%a"'),
'default_enrollment_start_date' => ''.&mt('Default beginning date for student access.').'',
'default_enrollment_end_date' => ''.&mt('Default ending date for student access.').'',
- 'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').''.
- ' (user:domain,user:domain,...)',
+ 'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').' '
+ .'("'.&mt('user:domain,user:domain,*:domain').'")',
'languages' => ''.&mt('Languages used').'',
'disable_receipt_display'
=> ''.&mt('Disable display of problem receipts').' '.
' ('.&mt('"[_1]" to disable, anything else if not','yes').')',
'task_messages'
- => ''.&mt('Send message to student when clicking Done on Tasks. [_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','only_student','student_and_user_notes_screen').'',
+ => ''.&mt('Send message to student when clicking Done on Tasks').' ('.&mt('[_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','"only_student"','"student_and_user_notes_screen"').')',
'disablesigfigs'
=> ''.&mt('Disable checking of Significant Figures').' '.
' ('.&mt('"[_1]" to disable, anything else if not','yes').')',
@@ -2209,24 +2344,47 @@ sub crsenv {
'externalsyllabus'
=> ''.&mt('URL of Syllabus (not using internal handler)').'',
'tthoptions'
- => ''.&mt('Default set of options to pass to tth/m when converting tex').''
- );
- my @Display_Order = ('url','description','courseid','cloners','grading',
+ => ''.&mt('Default set of options to pass to tth/m when converting tex').'',
+
+ 'texengine'
+ => ''.&mt('Force all students in the course to use a specific math rendering engine.').' '
+ .'('.&mt('[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student\'s preference','"jsMath"','"mimetex"','"tth"').')',
+ 'timezone'
+ => ''.&mt('Timezone in which the course takes place').'',
+
+ 'suppress_embed_prompt'
+ => ''.&mt('Suppress prompt to upload items referenced in a web page being uploaded to portfolio, when current role is student.').' '.
+ ' ('.&mt('[_1] to suppress, anything else to not suppress','"yes"').')',
+ 'hidefromcat'
+ => ''.&mt('Exclude from course catalog').' '.
+ ' ('.&mt('[_1] to exclude, anything else to include - included if assigned an institutional code, or manually catagorized','"yes"').')',
+ );
+ my @Display_Order = ('url','description','courseid','cloners');
+ if (&can_toggle_cat($dom)) {
+ push(@Display_Order,'hidefromcat');
+ }
+ push (@Display_Order,('grading',
'externalsyllabus',
'default_xml_style','pageseparators',
- 'question.email','comment.email','policy.email',
+ 'question.email','question.email.text','comment.email',
+ 'comment.email.text','policy.email','policy.email.text',
'student_classlist_view',
+ 'student_classlist_opt_in',
+ 'student_classlist_portfiles',
'plc.roles.denied','plc.users.denied',
'pch.roles.denied','pch.users.denied',
'allow_limited_html_in_feedback',
'allow_discussion_post_editing',
'languages',
+ 'timezone',
'nothideprivileged',
'rndseed',
'receiptalg',
'problem_stream_switch',
'suppress_tries',
+ 'suppress_embed_prompt',
'default_paper_size',
+ 'print_header_format',
'disable_receipt_display',
'spreadsheet_default_classcalc',
'spreadsheet_default_studentcalc',
@@ -2235,10 +2393,10 @@ sub crsenv {
'default_enrollment_start_date',
'default_enrollment_end_date',
'tthoptions',
+ 'texengine',
'disablesigfigs',
'disableexampointprint',
- 'task_messages'
- );
+ 'task_messages','task_grading'));
foreach my $parameter (sort(keys(%values))) {
unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
if (! $descriptions{$parameter}) {
@@ -2263,6 +2421,13 @@ sub crsenv {
$values{$parameter},
$onchange).
'';
+ } elsif ($parameter eq 'timezone') {
+ my $includeempty = 1;
+ my $timezone = &Apache::lonlocal::gettimezone();
+ $output .= '
'.
+ &Apache::loncommon::end_page());
+}
+
+sub date_shift_one {
+ my ($r) = @_;
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+
+ my $start_page=&Apache::loncommon::start_page('Shift Dates');
+ my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
+ $r->print(<print('');
+ $r->print(&Apache::loncommon::end_page());
+}
+
+sub date_shift_two {
+ my ($r) = @_;
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $start_page=&Apache::loncommon::start_page('Shift Dates');
+ my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
+ $r->print(<print(&mt('Shifting all dates such that [_1] becomes [_2]',
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)));
+ my $delta=$timeshifted-$env{'form.timebase'};
+ &dateshift($delta);
+ $r->print(&Apache::loncommon::end_page());
+}
+
+sub parse_key {
+ my ($key) = @_;
+ my %data;
+ my ($middle,$part,$name)=
+ ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
+ $data{'scope_type'} = 'all';
+ if ($middle=~/^\[(.*)\]/) {
+ $data{'scope'} = $1;
+ if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
+ $data{'scope_type'} = 'user';
+ $data{'scope'} = [$1,$2];
+ } else {
+ #FIXME check for group scope
+ $data{'scope_type'} = 'section';
+ }
+ $middle=~s/^\[(.*)\]//;
+ }
+ $middle=~s/\.+$//;
+ $middle=~s/^\.+//;
+ $data{'realm_type'}='all';
+ if ($middle=~/^(.+)\_\_\_\(all\)$/) {
+ $data{'realm'} = $1;
+ $data{'realm_type'} = 'folder';
+ $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
+ ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
+ } elsif ($middle) {
+ $data{'realm'} = $middle;
+ $data{'realm_type'} = 'symb';
+ $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
+ my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
+ $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
+ }
+
+ $data{'parameter_part'} = $part;
+ $data{'parameter_name'} = $name;
+
+ return %data;
+}
+
##################################################
##################################################
-
+
=pod
=item check_cloners
@@ -2866,48 +3321,63 @@ where $action is add or drop, and $clone
user for whom cloning ability is to be changed in course.
=cut
-
+
##################################################
##################################################
sub extract_cloners {
my ($clonelist,$allowclone) = @_;
if ($clonelist =~ /,/) {
- @{$allowclone} = split/,/,$clonelist;
+ @{$allowclone} = split(/,/,$clonelist);
} else {
$$allowclone[0] = $clonelist;
}
}
-
sub check_cloners {
my ($clonelist,$oldcloner) = @_;
- my ($clean_clonelist,$disallowed);
+ my ($clean_clonelist,%disallowed);
my @allowclone = ();
&extract_cloners($$clonelist,\@allowclone);
foreach my $currclone (@allowclone) {
- if (!grep/^$currclone$/,@$oldcloner) {
- my ($uname,$udom) = split/:/,$currclone;
- if ($uname && $udom) {
- if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
- $disallowed .= $currclone.',';
+ if (!grep(/^\Q$currclone\E$/,@$oldcloner)) {
+ if ($currclone eq '*') {
+ $clean_clonelist .= $currclone.',';
+ } else {
+ my ($uname,$udom) = split(/:/,$currclone);
+ if ($uname eq '*') {
+ if ($udom =~ /^$match_domain$/) {
+ if (!&Apache::lonnet::domain($udom)) {
+ $disallowed{'domain'} .= $currclone.',';
+ } else {
+ $clean_clonelist .= $currclone.',';
+ }
+ } else {
+ $disallowed{'format'} .= $currclone.',';
+ }
+ } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {
+ $disallowed{'format'} .= $currclone.',';
} else {
- $clean_clonelist .= $currclone.',';
+ if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
+ $disallowed{'newuser'} .= $currclone.',';
+ } else {
+ $clean_clonelist .= $currclone.',';
+ }
}
}
} else {
$clean_clonelist .= $currclone.',';
}
}
- if ($disallowed) {
- $disallowed =~ s/,$//;
+ foreach my $key (keys(%disallowed)) {
+ $disallowed{$key} =~ s/,$//;
}
if ($clean_clonelist) {
$clean_clonelist =~ s/,$//;
}
$$clonelist = $clean_clonelist;
- return $disallowed;
-}
+ return %disallowed;
+}
sub change_clone {
my ($clonelist,$oldcloner) = @_;
@@ -2920,43 +3390,47 @@ sub change_clone {
my @allowclone;
&extract_cloners($clonelist,\@allowclone);
foreach my $currclone (@allowclone) {
- if (!grep/^$currclone$/,@$oldcloner) {
- ($uname,$udom) = split/:/,$currclone;
- if ($uname && $udom) {
- unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
- my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
- if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
- if ($currclonecrs{'cloneable'} eq '') {
- $currclonecrs{'cloneable'} = $clone_crs;
- } else {
- $currclonecrs{'cloneable'} .= ','.$clone_crs;
+ if (!grep(/^$currclone$/,@$oldcloner)) {
+ if ($currclone ne '*') {
+ ($uname,$udom) = split(/:/,$currclone);
+ if ($uname && $udom && $uname ne '*') {
+ if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+ my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
+ if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
+ if ($currclonecrs{'cloneable'} eq '') {
+ $currclonecrs{'cloneable'} = $clone_crs;
+ } else {
+ $currclonecrs{'cloneable'} .= ','.$clone_crs;
+ }
+ &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
}
- &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
}
}
}
}
}
foreach my $oldclone (@$oldcloner) {
- if (!grep/^$oldclone$/,@allowclone) {
- ($uname,$udom) = split/:/,$oldclone;
- if ($uname && $udom) {
- unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
- my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
- my %newclonecrs = ();
- if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
- if ($currclonecrs{'cloneable'} =~ /,/) {
- my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
- foreach (@currclonecrs) {
- unless ($_ eq $clone_crs) {
- $newclonecrs{'cloneable'} .= $_.',';
+ if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
+ if ($oldclone ne '*') {
+ ($uname,$udom) = split(/:/,$oldclone);
+ if ($uname && $udom && $uname ne '*' ) {
+ if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
+ my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
+ my %newclonecrs = ();
+ if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
+ if ($currclonecrs{'cloneable'} =~ /,/) {
+ my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
+ foreach my $crs (@currclonecrs) {
+ if ($crs ne $clone_crs) {
+ $newclonecrs{'cloneable'} .= $crs.',';
+ }
}
+ $newclonecrs{'cloneable'} =~ s/,$//;
+ } else {
+ $newclonecrs{'cloneable'} = '';
}
- $newclonecrs{'cloneable'} =~ s/,$//;
- } else {
- $newclonecrs{'cloneable'} = '';
+ &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
}
- &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
}
}
}
@@ -2995,12 +3469,15 @@ ENDMAINFORMHEAD
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
+ my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
my @menu =
- (
- { text => 'Set Course Environment Parameters',
+ ( { divider=>'Settings for Your Course',
+ },
+ { text => 'Set Course Environment',
action => 'crsenv',
permission => $parm_permission,
+ help => 'Course_Environment',
},
{ text => 'Set Portfolio Metadata',
action => 'setrestrictmeta',
@@ -3010,29 +3487,39 @@ ENDMAINFORMHEAD
url => '/adm/slotrequest?command=showslots',
permission => $vgr,
},
- { divider => 1,
+ { text => 'Reset Student Access Times',
+ url => '/adm/helper/resettimes.helper',
+ permission => $mgr,
+ },
+
+ { text => 'Set Parameter Setting Default Actions',
+ action => 'setdefaults',
+ permission => $parm_permission,
+ },
+ { divider => 'New and Existing Parameter Settings for Your Resources',
},
{ text => 'Set/Modify Resource Parameters - Helper Mode',
url => '/adm/helper/parameter.helper',
permission => $parm_permission,
+ help => 'Parameter_Helper',
},
- { text => 'Modify Resource Parameters - Overview Mode',
- action => 'setoverview',
- permission => $parm_permission,
- },
- { text => 'Set Resource Parameters - Overview Mode',
+ { text => 'Set/Modify Resource Parameters - Overview Mode',
action => 'newoverview',
permission => $parm_permission,
+ help => 'Parameter_Overview',
},
{ text => 'Set/Modify Resource Parameters - Table Mode',
action => 'settable',
permission => $parm_permission,
- help => 'Cascading_Parameters',
+ help => 'Table_Mode',
},
- { text => 'Set Parameter Setting Default Actions',
- action => 'setdefaults',
+ { divider => 'Existing Parameter Settings for Your Resources',
+ },
+ { text => 'Modify Resource Parameters - Overview Mode',
+ action => 'setoverview',
permission => $parm_permission,
- },
+ help => 'Parameter_Overview',
+ },
{ text => 'Parameter Change Log and Course Blog Posting/User Notification',
action => 'parameterchangelog',
permission => $parm_permission,
@@ -3041,7 +3528,7 @@ ENDMAINFORMHEAD
my $menu_html = '';
foreach my $menu_item (@menu) {
if ($menu_item->{'divider'}) {
- $menu_html .= '';
+ $menu_html .= '
'.&mt($menu_item->{'divider'}).'
';
next;
}
next if (! $menu_item->{'permission'});
@@ -3065,36 +3552,200 @@ ENDMAINFORMHEAD
}
### Set portfolio metadata
sub output_row {
- my ($r, $field_name, $field_text) = @_;
+ my ($r, $field_name, $field_text, $added_flag) = @_;
my $output;
my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'};
my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'};
- unless (defined($options)) {
+ if (!defined($options)) {
$options = 'active,stuadd';
$values = '';
}
- $output.=''.$field_text.':';
- $output.=' ';
-
- my @options= ( ['active', 'Show to student'],
- ['onlyone','Student may select only one choice'],
- ['stuadd', 'Student may type choices']);
- foreach my $opt (@options) {
- my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
- $output.=(' 'x5).''.
- &mt($opt->[1]).' ';
+ if (!($options =~ /deleted/)) {
+ my @options= ( ['active', 'Show to student'],
+ ['stuadd', 'Provide text area for students to type catalog information'],
+ ['choices','Provide choices for students to select from']);
+# ['onlyone','Student may select only one choice']);
+ if ($added_flag) {
+ push @options,['deleted', 'Delete Metadata Field'];
+ }
+ $output = &Apache::loncommon::start_data_table_row();
+ $output .= '
');
my $makenewrow=0;
my %istype=();
+ my $output;
foreach my $changed (reverse(sort(@changes))) {
- my $value=$parmlog{$id}{'logentry'}->{$changed};
- my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)=
- &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
- if ($typeflag) { $istype{$parmname}=$value; }
- if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; }
- $r->print('
'.$realm.'
'.$section.'
'.
+ my $value=$parmlog{$id}{'logentry'}{$changed};
+ my $typeflag = ($changed =~/\.type$/ &&
+ !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
+ my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
+ &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
+ if ($env{'form.displayfilter'} eq 'currentfolder') {
+ if ($folder) {
+ if ($middle!~/^\Q$folder\E/) { next; }
+ }
+ }
+ if ($typeflag) {
+ $istype{$parmname}=$value;
+ if (!$env{'form.includetypes'}) { next; }
+ }
+ $count++;
+ if ($makenewrow) {
+ $output .= $row_start;
+ } else {
+ $makenewrow=1;
+ }
+ $output .='
';
my $stillactive=0;
- if ($parmlog{$id}{'deleteflag'}) {
- $r->print(&mt('Deleted'));
+ if ($parmlog{$id}{'delflag'}) {
+ $output .= &mt('Deleted');
} else {
if ($typeflag) {
- $r->print(&mt('Type: [_1]',&standard_parameter_names($value)));
+ $output .= &mt('Type: [_1]',&standard_parameter_names($value));
} else {
my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
$uname,$udom,$issection,$issection,$courseopt);
if (&isdateparm($istype{$parmname})) {
- $r->print(&Apache::lonlocal::locallocaltime($value));
+ $output .= &Apache::lonlocal::locallocaltime($value);
} else {
- $r->print($value);
+ $output .= $value;
}
if ($value ne $all[$level]) {
- $r->print(' '.&mt('Not active anymore').'');
+ $output .= ' '.&mt('Not active anymore').'';
} else {
$stillactive=1;
}
}
}
- $r->print('
');
+ $output .= '
';
if ($stillactive) {
my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
(&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
if (($uname) && ($udom)) {
- $r->print('