--- loncom/interface/courseprefs.pm 2009/11/24 21:50:14 1.8.2.1 +++ loncom/interface/courseprefs.pm 2010/01/08 00:04:04 1.19 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.8.2.1 2009/11/24 21:50:14 raeburn Exp $ +# $Id: courseprefs.pm,v 1.19 2010/01/08 00:04:04 faziophi Exp $ # # Copyright Michigan State University Board of Trustees # @@ -57,11 +57,22 @@ sub handler { $r->send_http_header; } else { if ($navmap) { - $env{'user.error.msg'}= - "/adm/courseprefs:opa:0:0:Cannot modify course settings"; + if ($crstype eq 'Community') { + $env{'user.error.msg'}= + "/adm/courseprefs:opa:0:0:Cannot modify community settings"; + } else { + $env{'user.error.msg'}= + "/adm/courseprefs:opa:0:0:Cannot modify course settings"; + } } else { - $env{'user.error.msg'}= - "/adm/courseprefs::0:1:Course environment gone, reinitialize the course"; + if ($crstype eq 'Community') { + $env{'user.error.msg'}= + "/adm/courseprefs::0:1:Course environment gone, reinitialize the community"; + } else { + $env{'user.error.msg'}= + "/adm/courseprefs::0:1:Course environment gone, reinitialize the course"; + + } } return HTTP_NOT_ACCEPTABLE; } @@ -73,10 +84,63 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset", text=>"Parameter Manager"}); } + my ($brtext,$brtitle,$crsinfotext,$crsinfodesc,$crscateg,$crshide); + my %lt; + if ($crstype eq 'Community') { + %lt = ( + conf => 'Community Configuration', + edit => 'Edit Community Configuration', + gens => 'General community settings', + idnu => 'Community ID or number', + desc => 'Community Description', + catg => 'Categorize community', + excc => 'Exclude from community catalog', + clon => 'Users allowed to clone community', + rept => 'Replacement titles for standard community roles', + time => 'Timezone where the community is located', + date => 'Locale used for community calendar', + coco => 'Community Content', + copo => 'Community Policy', + priv => 'Domain Coordinators in community', + defd => 'Default dates for member access', + stuv => 'Member-viewable membership list options', + stul => 'Member agreement needed to be listed', + clas => 'Membership and Facilitator Listing', + priv => 'Privileged users (Domain Coordinators) in facilitator listing', + defc => 'Default Community Spreadsheet', + defs => 'Default User Spreadsheet', + seme => 'Send message to member when clicking Done on Tasks' + ); + } else { + %lt = ( + conf => 'Course Configuration', + edit => 'Edit Course Configuration', + gens => 'General Settings', + idnu => 'ID/Number', + desc => 'Title', + catg => 'Categorize course', + excc => 'Exclude from course catalog', + clon => 'Users allowed to clone course', + rept => 'Replacement titles for standard course roles', + time => 'Timezone', + date => 'Calendar Locale', + coco => 'Course Content', + copo => 'Course Policy', + priv => 'Domain Coordinators in course', + defd => 'Default dates for student access', + stuv => 'Student-viewable classlist options', + stul => 'Student agreement needed to be listed', + clas => 'Classlists and Staff Listing', + priv => 'Privileged users (Domain Coordinators) in staff listing', + defc => 'Default Course Spreadsheet', + defs => 'Default Student Spreadsheet', + seme => 'Send message to student when clicking Done on Tasks', + ); + } &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/courseprefs', - text=>"Course Configuration"}); + text=>$lt{'conf'}}); my $breadcrumbs = - &Apache::lonhtmlcommon::breadcrumbs('Edit Course Configuration'); + &Apache::lonhtmlcommon::breadcrumbs($lt{'edit'}); my $phase = 'pickactions'; if ( exists($env{'form.phase'}) ) { @@ -84,7 +148,7 @@ sub handler { } if ($phase eq 'categorizecourse') { - &assign_course_categories($r); + &assign_course_categories($r,$crstype); return OK; } @@ -95,38 +159,34 @@ sub handler { my %prefs = ( 'courseinfo' => - { text => 'General course settings', + { text => $lt{'gens'}, help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value'}], ordered => ['description','courseid','categories', - 'hidefromcat','cloners','externalsyllabus', - 'url','rolenames'], + 'hidefromcat','externalsyllabus', + 'cloners','url','rolenames'], itemtext => { - description => 'Course Description', - courseid => 'Course ID or number', - categories => 'Categorize course', - hidefromcat => 'Exclude from course catalog', - cloners => 'Users allowed to clone course', - externalsyllabus => 'URL of Syllabus', + description => $lt{'desc'}, + courseid => $lt{'idnu'}, + categories => $lt{'catg'}, + hidefromcat => $lt{'excc'}, + cloners => $lt{'clon'}, + externalsyllabus => 'External Syllabus URL', url => 'Top Level Map', - rolenames => 'Replacement titles for standard course roles', + rolenames => $lt{'rept'}, }, }, 'localization' => - { text => 'Language/TimeZone/Locale', + { text => 'Language & Time Localization', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value',}], ordered => ['languages','timezone','datelocale'], itemtext => { - languages => 'Languages used', - timezone => 'Timezone in which the course takes place', - datelocale => 'Locale used for course calendar', + languages => 'Language(s)', + timezone => $lt{'time'}, + datelocale => $lt{'date'}, }, }, 'feedback' => - { text => 'Feedback messages', + { text => 'Feedback Messages', help => 'Course_Environment', header => [{col1 => 'Questions about:', col2 => 'Recipients'}, @@ -135,37 +195,35 @@ sub handler { ordered => ['question.email','comment.email','policy.email'], itemtext => { 'question.email' => 'Resource Content', - 'comment.email' => 'Course Content', - 'policy.email' => 'Course Policy', + 'comment.email' => $lt{'coco'}, + 'policy.email' => $lt{'copo'}, }, }, 'discussion' => { text => 'Discussion and Chat', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value',}], ordered => ['plc.roles.denied','plc.users.denied', 'pch.roles.denied','pch.users.denied', 'allow_limited_html_in_feedback', 'allow_discussion_post_editing'], itemtext => { - 'plc.roles.denied' => 'No Resource Discussion', - 'plc.users.denied' => 'No Resource Discussion', - 'pch.roles.denied' => 'No Chat room use', - 'pch.users.denied' => 'No Chat room use', - allow_limited_html_in_feedback => 'Allow limited HTML in discussion posts', - allow_discussion_post_editing => 'Users can edit/delete own discussion posts', + 'plc.roles.denied' => 'Disable resource discussion', + 'plc.users.denied' => 'Disable resource discussion', + 'pch.roles.denied' => 'Disable chat room', + 'pch.users.denied' => 'Disable chat room', + allow_limited_html_in_feedback => 'HTML in discussion', + allow_discussion_post_editing => 'Allow users to edit/delete own discussion posts', }, }, 'classlists' => - { text => 'Classlists and Staff Listing', + { text => $lt{'clas'}, help => 'Course_Environment', header => [{col1 => 'Type', - col2 => 'Default dates for student access'}, + col2 => $lt{'defd'}}, {col1 => 'Setting', - col2 => 'Privileged users (Domain Coordinators) in staff listing'}, + col2 => $lt{'priv'}}, {col1 => 'Setting', - col2 => 'Student-viewable classlist options'}], + col2 => $lt{'stuv'}}], ordered => ['default_enrollment_start_date', 'default_enrollment_end_date', 'nothideprivileged','student_classlist_view', @@ -173,70 +231,63 @@ sub handler { itemtext => { default_enrollment_start_date => 'Start date', default_enrollment_end_date => 'End date', - nothideprivileged => 'Domain Coodinators in course', - student_classlist_view => 'Student-viewable classlist', - student_opt_in => 'Student agreement needed to be listed', + nothideprivileged => $lt{'priv'}, + student_classlist_view => $lt{'stuv'}, + student_opt_in => $lt{'stul'}, student_classlist_portfiles => 'Include link to accessible portfolio files', }, }, 'appearance' => - { text => 'Display of resources ', + { text => 'Display of Resources ', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value'}], ordered => ['default_xml_style','pageseparators', 'disable_receipt_display','texengine', 'tthoptions'], itemtext => { - default_xml_style => 'Default XML Style File', - pageseparators => 'Visibly Separate Items on Pages', - disable_receipt_display => 'Disable display of problem receipts', - texengine => 'Force use of a specific math rendering engine', + default_xml_style => 'Default XML style file', + pageseparators => 'Separate items on composite pages', + disable_receipt_display => 'Disable problem receipts display', + texengine => 'Force specific math rendering engine', tthoptions => 'Default set of options to pass to tth/m when converting TeX', }, }, 'grading' => { text => 'Grading', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value',}], ordered => ['grading','rndseed', 'receiptalg','disablesigfigs'], itemtext => { - grading => 'Grading', - rndseed => 'Randomization algorithm used', - receiptalg => 'Receipt algorithm used', - disablesigfigs => 'Disable checking of Significant Figures', + grading => 'Grading Type', + rndseed => 'Randomization algorithm', + receiptalg => 'Receipt algorithm', + disablesigfigs => 'Disable significant figure checks', }, }, 'printouts' => - { text => 'Printout generation', + { text => 'Printouts', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value',}], ordered => ['problem_stream_switch','suppress_tries', 'default_paper_size','print_header_format', - 'disableexampointprint'], + 'disableexampointprint','canuse_pdfforms'], itemtext => { problem_stream_switch => 'Allow problems to be split over pages', suppress_tries => 'Suppress number of tries in printing', default_paper_size => 'Default paper type', print_header_format => 'Print header format', disableexampointprint => 'Disable automatically printing point values on exams', + canuse_pdfforms => 'Users can print problems as PDF forms and upload later for grading', }, }, 'spreadsheet' => { text => 'Spreadsheets', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value'}], ordered => ['spreadsheet_default_classcalc', 'spreadsheet_default_studentcalc', 'spreadsheet_default_assesscalc','hideemptyrows'], itemtext => { - spreadsheet_default_classcalc => 'Default Course Spreadsheet', - spreadsheet_default_studentcalc => 'Default Student Spreadsheet', + spreadsheet_default_classcalc => $lt{'defc'}, + spreadsheet_default_studentcalc => $lt{'defs'}, spreadsheet_default_assesscalc => 'Default Assessment Spreadsheet', hideemptyrows => 'Hide Empty Rows in Spreadsheets', }, @@ -244,12 +295,10 @@ sub handler { 'bridgetasks' => { text => 'Bridge tasks', help => 'Course_Environment', - header => [{col1 => 'Setting', - col2 => 'Value'}], ordered => ['task_messages','task_grading', 'suppress_embed_prompt'], itemtext => { - task_messages => 'Send message to student when clicking Done on Tasks', + task_messages => $lt{'seme'}, task_grading => 'Bridge Task grading by instructors and TAs in sections' , suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio', }, @@ -268,10 +317,10 @@ sub handler { \@prefs_order,\%prefs,\%values, $cnum,undef,\@allitems); } elsif ($phase eq 'display') { - my $jscript = &get_jscript($cdom,$phase); + my $jscript = &get_jscript($cdom,$phase,$crstype); my @allitems = &get_allitems(%prefs); &Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context, - \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems); + \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype); } else { &Apache::lonconfigsettings::display_choices($r,$phase,$context, \@prefs_order,\%prefs); @@ -296,38 +345,33 @@ sub get_allitems { } sub print_config_box { - my ($r,$cdom,$phase,$action,$item,$settings,$allitems) = @_; + my ($r,$cdom,$phase,$action,$item,$settings,$allitems,$crstype) = @_; my $ordered = $item->{'ordered'}; my $itemtext = $item->{'itemtext'}; my $rowtotal = 0; my $output = - ' - - '."\n". - ''; + '

'.&mt($item->{text}).'

+
 '. + &Apache::loncommon::help_open_topic($item->{'help'}).''; if (($action eq 'feedback') || ($action eq 'classlists')) { $output .= ' -
- - - - - - - '; - } else { - $output .= ''; - } + my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row'; + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); + $output .= ''."\n";; $output .= '
'. - &mt($item->{text}).' '. - &Apache::loncommon::help_open_topic($item->{'help'}).'
- - +
'; + if (exists $item->{'header'}->[0]->{'col1'} || + exists $item->{'header'}->[0]->{'col2'}) { + $output .= ' + - '; + '; + } $rowtotal ++; if ($action eq 'feedback') { $output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal); } elsif ($action eq 'classlists') { - $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal); + $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype); } $output .= '
'.&mt($item->{'header'}->[0]->{'col1'}).' '.&mt($item->{'header'}->[0]->{'col2'}).'
-
'; @@ -335,32 +379,34 @@ sub print_config_box { '; if ($action eq 'classlists') { - $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal). + $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype). '
'.&mt($item->{'header'}->[1]->{'col1'}).''.&mt($item->{'header'}->[1]->{'col2'}).'
-
- - - - - '; +
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
'; + if (exists $item->{'header'}->[0]->{'col1'} || + exists $item->{'header'}->[0]->{'col2'}) { + $output .= ' + + + + '; + } } } else { $output .= ' - - - -
'.&mt($item->{'header'}->[0]->{'col1'}).''.&mt($item->{'header'}->[0]->{'col2'}).'
- - +
'; + if (exists $item->{'header'}->[0]->{'col1'} || + exists $item->{'header'}->[0]->{'col2'}) { + $output .= ' + - '; + '; + } } $rowtotal ++; if ($action eq 'courseinfo') { - $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal); + $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'localization') { $output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal); } elsif ($action eq 'feedback') { @@ -368,30 +414,28 @@ sub print_config_box { } elsif ($action eq 'discussion') { $output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal); } elsif ($action eq 'classlists') { - $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal); + $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'appearance') { - $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal); + $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'grading') { - $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal); + $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'printouts') { - $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal); + $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'spreadsheet') { - $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal); + $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'bridgetasks') { - $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal); + $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype); } elsif ($action eq 'other') { - $output .= &print_other($cdom,$settings,$allitems,\$rowtotal); + $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype); } $output .= '
'.&mt($item->{'header'}->[0]->{'col1'}).' '.&mt($item->{'header'}->[0]->{'col2'}).'
-

'; +'; return ($output,$rowtotal); } sub process_changes { - my ($cdom,$action,$values,$item,$changes,$allitems,$disallowed) = @_; + my ($cdom,$action,$values,$item,$changes,$allitems,$disallowed,$crstype) = @_; my %newvalues; if (ref($item) eq 'HASH') { if (ref($changes) eq 'HASH') { @@ -530,18 +574,23 @@ sub process_changes { } elsif ($entry =~ /^default_enrollment_(start|end)_date$/) { $newvalues{$entry}=&Apache::lonhtmlcommon::get_date_from_form($entry); } elsif ($entry eq 'rolenames') { - my $crstype = &Apache::loncommon::course_type(); my %adv_roles = &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1); - my @stds = ('cc','in','ta','ep','ad','st'); + my @stds; + if ($crstype eq 'Community') { + @stds = ('co'); + } else { + @stds = ('cc'); + } + push(@stds,('in','ta','ep','ad','st')); my (@replacements,@regulars); foreach my $role (@stds) { if ($values->{$role.'.plaintext'} ne '') { - push(@replacements,$role); + push(@replacements,$role); } else { push(@regulars,$role); } - } + } foreach my $stdrole (@stds) { my $ext_entry = $entry.'_'.$stdrole; my $stdname = &Apache::lonnet::plaintext($stdrole,$crstype, @@ -789,14 +838,18 @@ sub check_clone { } sub store_changes { - my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes) = @_; + my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_; my ($chome,$output); my (%storehash,@delkeys,@need_env_update); if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) { %storehash = %{$values}; } else { - $output = &mt('No changes made to course settings.'); - return; + if ($crstype eq 'Community') { + $output = &mt('No changes made to community settings.'); + } else { + $output = &mt('No changes made to course settings.'); + } + return $output; } my %yesno = ( hidefromcat => '1', @@ -832,9 +885,15 @@ sub store_changes { foreach my $key (@settings) { if ($key eq 'rolenames') { my $displayname = $prefs->{$item}->{'itemtext'}{$key}; - my $crstype = &Apache::loncommon::course_type(); my $msg; - foreach my $role ('cc','in','ta','ep','ad','st') { + my @roles; + if ($crstype eq 'Community') { + @roles = ('co'); + } else { + @roles = ('cc'); + } + push(@roles,('in','ta','ep','ad','st')); + foreach my $role (@roles) { next if (!exists($changes->{$item}{$key.'_'.$role})); my $stdname = &Apache::lonnet::plaintext($role,$crstype,undef,1); my $newname = $changes->{$item}{$key.'_'.$role}; @@ -904,15 +963,21 @@ sub store_changes { $displayname = &mt($text); } if (defined($yesno{$key})) { - $displayval = 'no'; + $displayval = &mt('No'); if ($changes->{$item}{$key} eq 'yes') { - $displayval = 'yes'; + $displayval = &mt('Yes'); } } elsif (($key =~ /^default_enrollment_(start|end)_date$/) && ($displayval)) { $displayval = &Apache::lonlocal::locallocaltime($displayval); } elsif ($key eq 'categories') { $displayval = $env{'form.categories_display'}; - } + } elsif ($key eq 'canuse_pdfforms') { + if ($changes->{$item}{$key} eq '1') { + $displayval = &mt('Yes'); + } elsif ($changes->{$item}{$key} eq '0') { + $displayval = &mt('No'); + } + } if ($changes->{$item}{$key} eq '') { push(@delkeys,$key); $output .= '
  • '.&mt('Deleted setting for [_1]', @@ -939,7 +1004,11 @@ sub store_changes { } $output .= ''; } else { - $output = &mt('No changes made to course settings.'); + if ($crstype eq 'Community') { + $output = &mt('No changes made to community settings.'); + } else { + $output = &mt('No changes made to course settings.'); + } } } } @@ -947,8 +1016,17 @@ sub store_changes { if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') { if (@delkeys) { if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') { - $output .= '
    '. - &mt('An error occurred when removing course settings which are no longer in use.').''; + $output .= '
    '; + if ($crstype eq 'Community') { + $output .= &mt('An error occurred when removing community settings which are no longer in use.'); + } else { + $output .= &mt('An error occurred when removing course settings which are no longer in use.'); + } + $output .= ''; + } else { + foreach my $key (@delkeys) { + &Apache::lonnet::delenv('course.'.$cdom.'_'.$cnum.'.'.$key); + } } } if (@need_env_update) { @@ -958,8 +1036,13 @@ sub store_changes { &Apache::lonnet::coursedescription($env{'request.course.id'}, {'freshen_cache' => 1}); } else { - $output = ''. - &mt('An error occurred when saving changes to course settings, which remain unchanged.').''; + $output = ''; + if ($crstype eq 'Community') { + $output .= &mt('An error occurred when saving changes to community settings, which remain unchanged.'); + } else { + $output .= &mt('An error occurred when saving changes to course settings, which remain unchanged.'); + } + $output .= ''; } return $output; } @@ -990,7 +1073,7 @@ sub update_env { } sub display_disallowed { - my ($item,$disallowed,$prefs) = @_; + my ($item,$disallowed,$prefs,$crstype) = @_; my $output; if ((ref($disallowed) eq 'HASH') && (ref($prefs) eq 'HASH')) { if (keys(%{$disallowed})) { @@ -1006,7 +1089,7 @@ sub display_disallowed { my $msg = ''.$disallowed->{$error}.', '.&mt('reason').' - '. $lt{$error}; if ($error eq 'newuser') { - $msg .= '
    '.&mt('Please [_1]add the user(s)[_2] before returning to the [_3]Course Configuration[_2] to add as potential cloners.','','',''); + $msg .= '
    '.&mt("Please [_1]add the user(s)[_2] before returning to the [_3]$crstype Configuration[_2] to add as potential cloners.",'
    ','',''); } push(@fails,$msg); } @@ -1037,11 +1120,19 @@ sub display_disallowed { } elsif (($item eq 'feedback') || ($item eq 'discussion') || ($item eq 'localization')) { $output .= ''; if ($item eq 'feedback') { - $output .= &mt('Unable to include as a recipient of course feedback for:'); + if ($crstype eq 'Community') { + $output .= &mt('Unable to include as a recipient of community feedback for:'); + } else { + $output .= &mt('Unable to include as a recipient of course feedback for:'); + } } elsif ($item eq 'discussion') { $output .= &mt('Unable to include in user-based access control for:'); } elsif ($item eq 'localization') { - $output .= &mt('Unable to include in course localization:'); + if ($crstype eq 'Community') { + $output .= &mt('Unable to include in community localization:'); + } else { + $output .= &mt('Unable to include in course localization:'); + } } $output .= '
      '; foreach my $key (sort(keys(%{$disallowed}))) { @@ -1073,8 +1164,8 @@ sub get_course { } sub get_jscript { - my ($cdom,$phase) = @_; - my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom); + my ($cdom,$phase,$crstype) = @_; + my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype); my ($jscript,$categorize_js); my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript(); my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset'); @@ -1181,12 +1272,11 @@ ENDSCRIPT sub print_courseinfo { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; + my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } my ($cathash,$categoriesform); - my $crstype = &Apache::loncommon::course_type(); my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); if (ref($domconf{'coursecategories'}) eq 'HASH') { @@ -1194,15 +1284,21 @@ sub print_courseinfo { if (ref($cathash) eq 'HASH') { $categoriesform = &Apache::loncommon::assign_categories_table($cathash, - $settings->{'categories'})."\n"; + $settings->{'categories'},$crstype)."\n"; } } if (!defined($categoriesform)) { - $categoriesform = &mt('No categories defined for this domain'); + $categoriesform = &mt('No categories defined in this domain.'); } - my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom); + my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype); + my $replace; + if ($crstype eq 'Community') { + $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank'); + } else { + $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank'); + } my %items = ( 'url' => { text => ''.&mt($itemtext->{'url'}).''.(' 'x2). @@ -1213,6 +1309,7 @@ sub print_courseinfo { '', input => 'textbox', size => '40', + advanced => 1 }, 'description' => { text => ''.&mt($itemtext->{'description'}).'', @@ -1227,15 +1324,17 @@ sub print_courseinfo { }, 'cloners' => { text => ''.&mt($itemtext->{'cloners'}).'
      '. - &mt('Course Coordinators included automatically'), + &mt('Coordinators included automatically'), input => 'textbox', size => '40', + advanced => 1 }, 'rolenames' => { text => ''.&mt($itemtext->{'rolenames'}).'
      '. - '('.&mt('To replace the standard title for a course role, enter a title, otherwise leave blank').')', + '('.$replace.')', input => 'textbox', size => '20', + advanced => 1 }, 'externalsyllabus' => { text => ''.&mt($itemtext->{'externalsyllabus'}).'
      ('. @@ -1264,7 +1363,11 @@ sub print_courseinfo { next if (!$can_categorize); } $count ++; - $datatable .= &item_table_row_start($items{$item}{text},$count); + if (exists $items{$item}{advanced} && $items{$item}{advanced} == 1) { + $datatable .= &item_table_row_start($items{$item}{text},$count,"advanced"); + } else { + $datatable .= &item_table_row_start($items{$item}{text},$count); + } if ($items{$item}{input} eq 'radio') { $datatable .= &yesno_radio($item,$settings); } elsif ($item eq 'cloners') { @@ -1345,7 +1448,14 @@ sub print_courseinfo { &Apache::loncommon::end_data_table(); } elsif ($item eq 'rolenames') { $datatable .= &Apache::loncommon::start_data_table(); - foreach my $role ('cc','in','ta','ep','ad','st') { + my @roles; + if ($crstype eq 'Community') { + @roles = ('co'); + } else { + @roles = ('cc'); + } + push (@roles,('in','ta','ep','ad','st')); + foreach my $role (@roles) { $datatable .= &Apache::loncommon::start_data_table_row(). '
  • '. &Apache::lonnet::plaintext($role,$crstype,undef,1). @@ -1394,22 +1504,31 @@ sub new_cloners_dom_row { } sub can_modify_catsettings { - my ($dom) = @_; + my ($dom,$crstype) = @_; my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom); my ($can_toggle_cat,$can_categorize); if (ref($domconf{'coursecategories'}) eq 'HASH') { - if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') { - $can_toggle_cat = 1; - } - if ($domconf{'coursecategories'}{'categorize'} eq 'crs') { - $can_categorize = 1; + if ($crstype eq 'Community') { + if ($domconf{'coursecategories'}{'togglecatscomm'} eq 'comm') { + $can_toggle_cat = 1; + } + if ($domconf{'coursecategories'}{'categorizecomm'} eq 'comm') { + $can_categorize = 1; + } + } else { + if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') { + $can_toggle_cat = 1; + } + if ($domconf{'coursecategories'}{'categorize'} eq 'crs') { + $can_categorize = 1; + } } } return ($can_toggle_cat,$can_categorize); } sub assign_course_categories { - my ($r) = @_; + my ($r,$crstype) = @_; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $hascats = 0; @@ -1418,12 +1537,23 @@ sub assign_course_categories { if (ref($domconf{'coursecategories'}) eq 'HASH') { $cathash = $domconf{'coursecategories'}{'cats'}; if (ref($cathash) eq 'HASH') { - $hascats = 1; + foreach my $cat (keys(%{$cathash})) { + next if ($cat eq 'instcode::0'); + unless ($crstype eq 'Community') { + next if ($cat eq 'communities::0'); + } + $hascats ++; + } } } my $catwin_js; if ($hascats) { - my $alert = &mt("Use 'Save' in the main window to save course categories"); + my $alert; + if ($crstype eq 'Community') { + $alert = &mt("Use 'Save' in the main window to save community categories"); + } else { + $alert = &mt("Use 'Save' in the main window to save course categories"); + } $catwin_js = < @@ -1461,23 +1591,38 @@ ENDSCRIPT } else { my $onload; } + my ($crscat,$catcrs,$assign); + if ($crstype eq 'Community') { + $crscat = 'Community Categories'; + $catcrs = &mt('Categorize Community'); + $assign = &mt('Assign one or more categories to this community.') + } else { + $crscat = 'Course Categories'; + $catcrs = &mt('Categorize Course'); + $assign = &mt('Assign one or more categories to this course.') + } my $start_page = - &Apache::loncommon::start_page('Course Categories',$catwin_js, + &Apache::loncommon::start_page($crscat,$catwin_js, {'only_body' => 1,}); my $end_page = &Apache::loncommon::end_page(); - my $categoriesform = '

    '.&mt('Categorize Course').'

    '; + my $categoriesform = '

    '.$catcrs.'

    '; if ($hascats) { my %currsettings = &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum); - $categoriesform .= &mt('Assign one or more categories to this course.').'

    '. + my $cattable = &Apache::loncommon::assign_categories_table($cathash, + $currsettings{'categories'},$crstype); + if ($cattable eq '') { + $categoriesform .= &mt('No suitable categories defined for this course type in this domain.'); + } else { + $categoriesform .= $assign.'

    '. '
    '."\n". - &Apache::loncommon::assign_categories_table($cathash, - $currsettings{'categories'})."\n". + $cattable."\n". '

    '; + } } else { - $categoriesform .= &mt('No categories defined for this domain'); + $categoriesform .= &mt('No categories defined in this domain.'); } $r->print($start_page.$categoriesform.$end_page); return; @@ -1490,16 +1635,16 @@ sub print_localization { } my %items = ( languages => { - text => &mt($itemtext->{'languages'}).'
    '. - &mt("(will override user's preference)"), + text => ''.&mt($itemtext->{'languages'}).'
    '. + &mt("(overrides individual user preference)"), input => 'selectbox', }, timezone => { - text => &mt($itemtext->{'timezone'}), + text => ''.&mt($itemtext->{'timezone'}).'', input => 'selectbox', }, datelocale => { - text => &mt($itemtext->{'datelocale'}), + text => ''.&mt($itemtext->{'datelocale'}).'', input => 'selectbox', }, ); @@ -1753,8 +1898,7 @@ sub print_discussion { } my %items = ( 'plc.roles.denied' => { - text => ''. - &mt($itemtext->{'plc.roles.denied'}).''. + text => ''.&mt($itemtext->{'plc.roles.denied'}).''. &Apache::loncommon::help_open_topic("Course_Disable_Discussion").'
    '. &mt('(role-based)'), input => 'checkbox', @@ -1767,8 +1911,7 @@ sub print_discussion { }, 'pch.roles.denied' => { - text => ''. - &mt($itemtext->{'pch.roles.denied'}).''. + text => ''.&mt($itemtext->{'pch.roles.denied'}).''. &Apache::loncommon::help_open_topic("Course_Disable_Discussion").'
    '. &mt('(role-based)'), input => 'checkbox', @@ -1835,8 +1978,13 @@ sub print_discussion { } sub role_checkboxes { - my ($cdom,$cnum,$item,$settings,$showsections) = @_; - my @roles = ('st','ad','ta','ep','in','cc'); + my ($cdom,$cnum,$item,$settings,$showsections,$crstype) = @_; + my @roles = ('st','ad','ta','ep','in'); + if ($crstype eq 'Community') { + push(@roles,'co'); + } else { + push(@roles,'cc'); + } my $output; my (@current,@curr_roles,%currsec,@sections); if ($showsections) { @@ -1873,7 +2021,7 @@ sub role_checkboxes { if (grep(/^\Q$role\E$/,@current)) { $checked = ' checked="checked" '; } - my $plrole=&Apache::lonnet::plaintext($role); + my $plrole=&Apache::lonnet::plaintext($role,$crstype); if ($showsections) { $output .= &Apache::loncommon::start_data_table_row(); } else { @@ -1944,7 +2092,7 @@ sub role_checkboxes { } sub print_classlists { - my ($position,$cdom,$settings,$itemtext,$rowtotal) = @_; + my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype) = @_; my @ordered; if ($position eq 'top') { @ordered = ('default_enrollment_start_date', @@ -1955,6 +2103,22 @@ sub print_classlists { @ordered = ('student_classlist_view', 'student_opt_in','student_classlist_portfiles'); } + my %lt; + + if ($crstype eq 'Community') { + %lt = &Apache::lonlocal::texthash ( + disabled => 'No viewable membership list', + section => "Membership of viewer's section", + all => 'List of all members', + ); + } else { + %lt = &Apache::lonlocal::texthash ( + disabled => 'No viewable classlist', + section => "Classlist of viewer's section", + all => 'Classlist of all students', + ); + } + my %items = ( 'default_enrollment_start_date' => { text => ''.&mt($itemtext->{'default_enrollment_start_date'}).'', @@ -1973,11 +2137,7 @@ sub print_classlists { 'student_classlist_view' => { text => ''.&mt($itemtext->{'student_classlist_view'}).'', input => 'selectbox', - options => { - disabled => &mt('No viewable classlist'), - section => &mt("Classlist of viewer's section"), - all => &mt('Classlist of all students'), - }, + options => \%lt, order => ['disabled','all','section'], }, 'student_opt_in' => { @@ -1994,14 +2154,20 @@ sub print_classlists { ($settings->{'student_classlist_view'} eq 'section')) { $settings->{'student_classlist_view'} = 'disabled'; } - return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal); + return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype); } sub print_appearance { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; + my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } + my $mathdef; + if ($crstype eq 'Community') { + $mathdef = &mt("None specified - use member's choice"); + } else { + $mathdef = &mt("None specified - use student's choice"); + } my %items = ( 'default_xml_style' => { text => ''.&mt($itemtext->{'default_xml_style'}).' '. @@ -2029,7 +2195,7 @@ sub print_appearance { tth => &mt('TeX to HTML'), }, order => ['jsMath','mimetex','tth'], - nullval => &mt("None specified - use student's choice"), + nullval => $mathdef, }, 'tthoptions' => { text => ''.&mt($itemtext->{'tthoptions'}).'', @@ -2037,11 +2203,11 @@ sub print_appearance { size => 40, }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); } sub print_grading { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; + my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } @@ -2052,14 +2218,15 @@ sub print_grading { input => 'selectbox', options => { standard => &mt('Standard: shows points'), - external => &mt('External: shows number of completed parts'), + external => &mt('External: shows number of completed parts and totals'), + externalnototals => &mt('External: shows only number of completed parts'), spreadsheet => &mt('Spreadsheet: (with link to detailed scores)'), }, - order => ['standard','external','spreadsheet'], + order => ['standard','external','externalnototals','spreadsheet'], }, 'rndseed' => { text => ''.&mt($itemtext->{'rndseed'}).''. - ''.'
    '. + ''.'
    '. &mt('Modifying this will make problems have different numbers and answers!'). '
    ', input => 'selectbox', @@ -2089,11 +2256,11 @@ sub print_grading { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); } sub print_printouts { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; + my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } @@ -2131,12 +2298,22 @@ sub print_printouts { text => ''.&mt($itemtext->{'disableexampointprint'}).'', input => 'radio', }, + canuse_pdfforms => { + text => ''.&mt($itemtext->{'canuse_pdfforms'}).'', + input => 'selectbox', + options => { + 1 => &mt('Yes'), + 0 => &mt('No'), + }, + order => ['1','0'], + nullval => 'None specified - use domain default', + } ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); } sub print_spreadsheet { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; + my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } @@ -2168,21 +2345,29 @@ sub print_spreadsheet { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal); -} + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); +} sub print_bridgetasks { - my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_; + my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) { return; } + my ($stumsg,$msgnote); + if ($crstype eq 'Community') { + $stumsg = &mt('Send message to member'); + $msgnote = &mt('Message to member and add to user notes'); + } else { + $stumsg = &mt('Send message to student'); + $msgnote = &mt('Message to student and add to user notes'); + } my %items = ( task_messages => { text => ''.&mt($itemtext->{'task_messages'}).'', input => 'selectbox', options => { - only_student => &mt('Send message to student'), - student_and_user_notes_screen => &mt('Message to student and add to user notes'), + only_student => $stumsg, + student_and_user_notes_screen => $msgnote, }, order => ['only_student','student_and_user_notes_screen'], nullval => &mt('No message or record in user notes'), @@ -2202,11 +2387,11 @@ sub print_bridgetasks { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); } sub print_other { - my ($cdom,$settings,$allitems,$rowtotal) = @_; + my ($cdom,$settings,$allitems,$rowtotal,$crstype) = @_; unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) { return; } @@ -2227,7 +2412,7 @@ sub print_other { input => 'textbox', size => '30', }; - my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal); + my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype); } sub get_other_items { @@ -2244,7 +2429,7 @@ sub get_other_items { unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) || ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/) || ($parameter eq 'type') || - ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) { + ($parameter =~ m/^(cc|co|in|ta|ep|ad|st)\.plaintext$/)) { push(@ordered,$parameter); } } @@ -2253,15 +2438,13 @@ sub get_other_items { } sub item_table_row_start { - my ($text,$count) = @_; + my ($text,$count,$add_class) = @_; my $output; - if ($count%2) { - $output .= '
    '.$text. - ''; + ''; return $output; } @@ -2332,7 +2515,7 @@ sub select_from_options { } sub make_item_rows { - my ($cdom,$items,$ordered,$settings,$rowtotal) = @_; + my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype) = @_; my $datatable; if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) { my $count = 0; @@ -2340,7 +2523,7 @@ sub make_item_rows { $count ++; $datatable .= &item_table_row_start($items->{$item}{text},$count); if ($item eq 'nothideprivileged') { - $datatable .= ¬hidepriv_row($cdom,$item,$settings); + $datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype); } elsif ($item eq 'print_header_format') { $datatable .= &print_hdrfmt_row($item,$settings); } elsif ($items->{$item}{input} eq 'dates') { @@ -2370,7 +2553,7 @@ sub make_item_rows { } sub nothidepriv_row { - my ($cdom,$item,$settings) = @_; + my ($cdom,$item,$settings,$crstype) = @_; my ($cnum) = &get_course(); my %nothide; my $datatable; @@ -2438,7 +2621,11 @@ sub nothidepriv_row { } $datatable .= '
    '; } else { - $datatable .= &mt('No Domain Coordinators have course roles'); + if ($crstype eq 'Community') { + $datatable .= &mt('No Domain Coordinators have community roles'); + } else { + $datatable .= &mt('No Domain Coordinators have course roles'); + } } return $datatable; } @@ -2542,7 +2729,7 @@ ENDJS &position_selector($pos,$currnum,$maxnum). ''.&mt('New').''. &substitution_selector($currnum).''. - ''; + ''; $pos ++; $currnum ++; $output .= ''. @@ -2555,7 +2742,7 @@ ENDJS ''. ''. - ''; + ''; return $output; } @@ -2575,10 +2762,18 @@ sub position_selector { } sub substitution_selector { - my ($num,$subst,$limit) = @_; + my ($num,$subst,$limit,$crstype) = @_; + my ($stunametxt,$crsidtxt); + if ($crstype eq 'Community') { + $stunametxt = 'member name'; + $crsidtxt = 'community ID', + } else { + $stunametxt = 'student name'; + $crsidtxt = 'course ID', + } my %lt = &Apache::lonlocal::texthash( - n => 'student name', - c => 'course ID', + n => $stunametxt, + c => $crsidtxt, a => 'assignment note', ); my $output .= &mt('Substitution').'
    '.