--- loncom/interface/loncreatecourse.pm 2010/03/15 17:27:40 1.135 +++ loncom/interface/loncreatecourse.pm 2013/07/15 14:32:45 1.148 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.135 2010/03/15 17:27:40 raeburn Exp $ +# $Id: loncreatecourse.pm,v 1.148 2013/07/15 14:32:45 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -61,8 +61,6 @@ described at http://www.lon-capa.org. =item creation_display_filter() -=item course_types() - =item context_names() =item instcode_srchstr() @@ -95,6 +93,7 @@ sub print_course_creation_page { $crstype = 'Course'; } my $defdom=$env{'request.role.domain'}; + my %domdefaults = &Apache::lonnet::get_domain_defaults($defdom); my %host_servers = &Apache::lonnet::get_servers($defdom,'library'); my $course_home = '<select name="course_home" size="1">'."\n"; foreach my $server (sort(keys(%host_servers))) { @@ -161,6 +160,8 @@ function validate(formname) { 'csli' => "a comma separated list of institutional section numbers, each separated by a colon from the (optional) corresponding section ID to be used in LON-CAPA e.g., 001:1,002:2", 'crcs' => "Crosslisted courses", 'cscs' => "a comma separated list of course sections crosslisted with the current course, with each entry including the institutional course section name followed by a colon and then the (optional) sectionID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:zol2", + 'ccre' => "Course credits", + 'cred' => "the number of institutional credits students will earn by completing this course", 'crco' => "Course Content", 'cncr' => "Completely new course", 'cecr' => "Clone an existing course", @@ -301,7 +302,7 @@ END .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'ctit'}) - .'<input type="text" size="50" name="title" />' + .'<input type="text" size="80" name="title" />' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'chsr'}) @@ -315,7 +316,9 @@ END if ($crstype eq 'Course') { $r->print(&Apache::lonhtmlcommon::row_headline() .'<h3>'.$lt{'iinf'}.'</h3>' - .$lt{'stat'} + .$lt{'stat'}.' ' + .&mt('Default credits can also be specified, if different from the domain defaults (official courses: [_1]; unofficial courses: [_2]).', + $domdefaults{'officialcredits'},$domdefaults{'unofficialcredits'}) .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_title($lt{'ccod'}) @@ -333,8 +336,14 @@ END .'<br />('.$lt{'cscs'}.')' .&Apache::lonhtmlcommon::row_closure() ); + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + $r->print(&Apache::lonhtmlcommon::row_title($lt{'ccre'}) + .'<input type="text" size="3" name="defaultcredits" />' + .'<br />('.$lt{'cred'}.')' + .&Apache::lonhtmlcommon::row_closure() + ); + } } - # Table: New Course / Clone Course $r->print(&Apache::lonhtmlcommon::row_headline() .'<h3>'.$lt{'crco'}.'</h3>' @@ -361,15 +370,21 @@ END .'<label>' .'<input type="radio" name="firstres" value="blank" />'.$lt{'blnk'} .'</label>' - .' ' - .'<label>' + .' '); + if ($crstype eq 'Community') { + $r->print('<label>' + .'<input type="radio" name="firstres" value="nav" checked="checked" />'.$lt{'navi'} + .'</label>'); + } else { + $r->print('<label>' .'<input type="radio" name="firstres" value="syl" checked="checked" />'.$lt{'sllb'} .'</label>' .' ' .'<label>' .'<input type="radio" name="firstres" value="nav" />'.$lt{'navi'} - .'</label>' - .'<br />('.$lt{'stco'}.')' + .'</label>'); + } + $r->print('<br />('.$lt{'stco'}.')' .&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box() @@ -401,7 +416,7 @@ END .' <input type="text" size="5" name="dateshift" value="365" />' .&Apache::lonhtmlcommon::row_closure() .&Apache::lonhtmlcommon::row_headline() - .$lt{'asov'} + .'<span class="LC_info">'.$lt{'asov'}.'</span>' .&Apache::lonhtmlcommon::row_closure(1) .&Apache::lonhtmlcommon::end_pick_box() .'</td>' @@ -533,7 +548,7 @@ END <p> <input type="hidden" name="prevphase" value="courseone" /> <input type="hidden" name="phase" value="coursetwo" /> -<input type="button" onClick="verify_message(this.form)" value="'.$lt{'opco'}.'" />' +<input type="button" onclick="verify_message(this.form)" value="'.$lt{'opco'}.'" />' ); } elsif ($crstype eq 'Community') { $r->print(' @@ -556,6 +571,8 @@ sub create_course { my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'}); my $crstype = 'Community'; my ($enrollstart,$enrollend,$startaccess,$endaccess); + my %domdefaults = + &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); if ($env{'form.phase'} eq 'coursetwo') { $crstype='Course'; @@ -631,6 +648,11 @@ sub create_course { firstres => $env{'form.firstres'} }; + if (($crstype eq 'Course') && + ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'})) { + $args->{'defaultcredits'} = $env{'form.defaultcredits'}; + } + # # Verify data # @@ -685,7 +707,7 @@ sub create_course { '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">'.&mt('Manage Access Keys').'</a></p>'); } # Flush the course logs so reverse user roles immediately updated - &Apache::lonnet::flushcourselogs(); + $r->register_cleanup(\&Apache::lonnet::flushcourselogs); $r->print('<p>'.&mt('Roles will be active at next login').'.</p>'); } $r->print('<p><a href="/adm/createcourse?phase='.lc($crstype).'one">'. @@ -694,7 +716,7 @@ sub create_course { } sub print_intro_page { - my $r = shift; + my ($r,$show_all_choices) = @_; my $start_page = &Apache::loncommon::start_page('Create a New Course or Community'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses'); @@ -702,51 +724,78 @@ sub print_intro_page { &Apache::loncommon::end_page(); my $helplink=&Apache::loncommon::help_open_topic('Create_Course_Community',&mt('Help on Creating Courses and Communities')); - my @choices = ({ internal_name => 'courseone', - name => &mt('Create a single course'), - short_description => - &mt('Create a new course by completing an online form.'), - }, - { internal_name => 'groupone', - name => &mt('Create a single community'), - short_description => - &mt('Create a new collaborative community by completing an online form.'), - }, - { internal_name => 'batchone', - name => &mt('Create courses/communities by uploading an attributes file'), - short_description => - &mt('Upload an attributes file containing specifications for one or more courses or communities in XML format.'), - help => 'Batch_Creation', - }, - { internal_name => 'requestdisplay', - name => &mt('Approve or reject requests'), - short_description => - &mt('Display course and community creation requests submitted by authorized users, held pending approval by a Domain Coordinator.'), - }, - { internal_name => 'creationlog', - name => &mt('View creation log'), - short_description => - &mt('Display information about when, how and by whom courses and communities were created in this domain.'), - }, + # Create menu + my @menu; + @menu = + ({ categorytitle => 'Course/Community Creation', + items => [ + { + linktext => 'Create a single course', + url => '/adm/createcourse?phase=courseone', + permission => 1, + #help => '', + icon => 'crsnew.png', + linktitle => 'Create a new course by completing an online form.' + }, + { + linktext => 'Create a single community', + url => '/adm/createcourse?phase=groupone', + permission => $show_all_choices, + #help => '', + icon => 'crsnew.png', + linktitle => 'Create a new collaborative community by completing an online form.' + }, + { + linktext => 'Create courses/communities by uploading an attributes file', + url => '/adm/createcourse?phase=batchone', + permission => 1, + help => 'Batch_Creation', + icon => 'uplcrs.png', + linktitle => 'Upload an attributes file containing specifications for one or more courses or communities in XML format.' + }, + ] + }, + { categorytitle => 'Course/Community Requests', + items => [ + { + linktext => 'Approve or reject requests', + url => '/adm/createcourse?phase=requestdisplay', + permission => $show_all_choices, + #help => '', + icon => 'rcrs.png', + linktitle => 'Display course and community creation requests submitted by authorized users, held pending approval by a Domain Coordinator.' + }, + { + linktext => 'View pending official course requests', + url => '/adm/createcourse?phase=pendingdisplay', + permission => $show_all_choices, + #help => '', + icon => 'edit-find.png', + alttext => '', + linktitle => 'Display official course requests submitted by authorized users, held pending validation of instructor status.' + }, + ] + }, + { categorytitle => 'Administration', + items => [ + { + linktext => 'View creation log', + url => '/adm/createcourse?phase=creationlog', + permission => $show_all_choices, + #help => '', + icon => 'document-properties.png', + linktitle => 'Display information about when, how and by whom courses and communities were created in this domain.' + }, + ] + }, + ); + + $r->print( + $start_page + .$crumbs + .&Apache::lonhtmlcommon::generate_menu(@menu) + .$end_page ); - my $options; - foreach my $choice (@choices) { - $options .=' <h3><a href="/adm/createcourse?phase='. - $choice->{'internal_name'}.'" >'. - $choice->{'name'}.'</a>'; - if (exists($choice->{'help'})) { - $options .= &Apache::loncommon::help_open_topic($choice->{'help'}); - } - $options .= "</h3>\n".' '.(' 'x8).$choice->{'short_description'}. - "\n"; - } - - $r->print(<<ENDDOCUMENT); -$start_page -$crumbs -$options -$end_page -ENDDOCUMENT } sub upload_batchfile { @@ -763,7 +812,7 @@ sub upload_batchfile { '<input type="file" name="coursecreatorxml" />'. '<input type="hidden" name="phase" value="batchtwo" /><br /><br />'. '<input type="submit" name="batchsubmit" '. - 'value="Create Courses/Communities" /></form>'); + 'value="'.&mt('Create Courses/Communities').'" /></form>'); $r->print($end_page); return; } @@ -814,15 +863,16 @@ sub courserequestbrowser_javascript { <script type="text/javascript"> // <![CDATA[ var steditbrowser; -function opencoursereqdisplay(cdom,cnum) { +function opencoursereqdisplay(cdom,cnum,queue) { var url = '/adm/requestcourse?action=display'; - url += '&showdom='+cdom+'&cnum='+cnum; + url += '&showdom='+cdom+'&cnum='+cnum+'&queue='+queue; var title = 'Course_Request_Browser'; var options = 'scrollbars=1,resizable=1,menubar=0'; options += ',width=700,height=600'; var stdeditbrowser = open(url,title,options,'1'); stdeditbrowser.focus(); } + // ]]> </script> ENDREQBRW @@ -850,8 +900,6 @@ sub print_creation_logs { foreach my $item ('show','page','type','context') { $curr{$item} = $env{'form.'.$item}; } - my $createdafter = &Apache::lonhtmlcommon::get_date_from_form('created_after_date'); - my $createdbefore = &Apache::lonhtmlcommon::get_date_from_form('created_before_date'); $curr{'created_after_date'} = &Apache::lonhtmlcommon::get_date_from_form('created_after_date'); $curr{'created_before_date'} = &Apache::lonhtmlcommon::get_date_from_form('created_before_date'); foreach my $key (keys(%defaults)) { @@ -902,7 +950,7 @@ sub print_creation_logs { if ($numtitles) { if (($curr{'type'} eq 'official') || ($curr{'type'} eq 'unofficial')) { $instcodefilter = &instcode_srchstr($dom,$numtitles); - &Apache::courseclassifier::instcode_search_str($dom,$numtitles); + &Apache::courseclassifier::instcode_search_str($dom,$numtitles,\@codetitles); if ($curr{'type'} eq 'official') { $regexpok = 1; } else { @@ -925,6 +973,12 @@ sub print_creation_logs { undef,undef,undef,$curr{'created_before_date'}, $curr{'created_after_date'},$creationcontext); foreach my $cid (sort { $courses{$b}{'created'}<=>$courses{$a}{'created'} } (keys(%courses))) { + if ($curr{'show'} ne &mt('all')) { + if ($count >= $curr{'page'} * $curr{'show'}) { + $more_records = 1; + last; + } + } $count ++; next if ($count < $minshown); if (!$showntablehdr) { @@ -1060,14 +1114,14 @@ sub creation_display_filter { &Apache::lonhtmlcommon::date_setter($formname,'created_before_date', $curr->{'created_before_date'},undef, undef,undef,undef,undef,undef,undef,$nolink); - $output .= '<td valign="top"><b>'.&mt('Window during which course was created:').'</b><br />'. + $output .= '<td valign="top"><b>'.&mt('Window during which course/community was created:').'</b><br />'. '<table><tr><td>'.&mt('After:'). '</td><td>'.$startform.'</td></tr>'. '<tr><td>'.&mt('Before:').'</td>'. '<td>'.$endform.'</td></tr></table>'. '</td>'. '<td> </td>'; - my ($types,$typenames) = &course_types(); + my ($types,$typenames) = &Apache::loncommon::course_types(); if (ref($types) eq 'ARRAY') { if (@{$types} > 1) { $output .= '<td valign="top"><b>'. @@ -1119,16 +1173,6 @@ sub creation_display_filter { return $output; } -sub course_types { - my @types = qw(official unofficial community); - my %typename = ( - official => 'Official course', - unofficial => 'Unofficial course', - community => 'Community', - ); - return (\@types,\%typename); -} - sub context_names { my @contexts = qw(auto web dc_create requestcourses); my %contextnames = @@ -1195,6 +1239,13 @@ sub handler { return OK; } + my $show_all_choices = 0; + my $primary_rev = &Apache::lonnet::get_server_loncaparev($env{'request.role.domain'}); + if (($primary_rev ne 'refused') && ($primary_rev ne 'error') && + ($primary_rev ne 'unknown_cmd') && ($primary_rev ne 'no_such_host')) { + $show_all_choices = 1; + } + if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; @@ -1207,7 +1258,8 @@ sub handler { text=>"Creation Options", faq=>79,bug=>'Dom Coord Interface',}); if (($env{'form.phase'} eq 'coursetwo') || - ($env{'form.phase'} eq 'grouptwo')) { + (($env{'form.phase'} eq 'grouptwo') && + ($show_all_choices))) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.prevphase'}", text=>&mt('[_1] Creation Settings',), @@ -1218,7 +1270,8 @@ sub handler { faq=>9,bug=>'Dom Coord Interface',}); &create_course($r); } elsif (($env{'form.phase'} eq 'courseone') || - ($env{'form.phase'} eq 'groupone')) { + (($env{'form.phase'} eq 'groupone') && + ($show_all_choices))) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.phase'}", text=>&mt('[_1] Creation Settings',), @@ -1240,7 +1293,7 @@ sub handler { text=>"Creation Outcome", faq=>9,bug=>'Dom Coord Interface',}); &process_batchfile($r); - } elsif ($env{'form.phase'} eq 'requestdisplay') { + } elsif (($env{'form.phase'} eq 'requestdisplay') && ($show_all_choices)) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=$env{'form.phase'}", text=>&mt('[_1] Display Request Queue',), @@ -1252,21 +1305,53 @@ sub handler { &Apache::loncoursequeueadmin::display_queued_requests( 'domain',$env{'request.role.domain'}).'</div>'. &Apache::loncommon::end_page()); - } elsif ($env{'form.phase'} eq 'requestchange') { + } elsif (($env{'form.phase'} eq 'requestchange') && ($show_all_choices)) { + if ($env{'form.queue'} eq 'pending') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=pendingdisplay", + text=>&mt('Display Pending Queue',), + faq=>9,bug=>'Dom Coord Interface',}); + } else { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=requestdisplay", + text=>&mt('[_1] Display Request Queue',), + faq=>9,bug=>'Dom Coord Interface',}); + } &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/createcourse?phase=requestdisplay", - text=>&mt('[_1] Display Request Queue',), - faq=>9,bug=>'Dom Coord Interface',}, - {href=>"/adm/createcourse?phase=requestchange", - text=>&mt('[_1] Requests Updated',), - faq=>9,bug=>'Dom Coord Interface',},); + ({href=>"/adm/createcourse?phase=requestchange", + text=>&mt('[_1] Requests Updated',), + faq=>9,bug=>'Dom Coord Interface',},); my $start_page=&Apache::loncommon::start_page('Update Requests Result'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Requests Updated','Course_Request',undef,'Course_Request'); $r->print($start_page.$crumbs."\n".'<div>'. &Apache::loncoursequeueadmin::update_request_queue( 'domain',$env{'request.role.domain'}).'</div>'. &Apache::loncommon::end_page()); - } elsif ($env{'form.phase'} eq 'creationlog') { + } elsif (($env{'form.phase'} eq 'pendingdisplay') && ($show_all_choices)) { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=$env{'form.phase'}", + text=>&mt('Display Pending Queue',), + faq=>9,bug=>'Dom Coord Interface',}); + my $js = &courserequestbrowser_javascript(); + my $start_page=&Apache::loncommon::start_page('Display Pending Queue',$js); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Display Pending Queue','Course_Request',undef,'Course_Request'); + $r->print($start_page.$crumbs."\n".'<div>'. + &Apache::loncoursequeueadmin::display_queued_requests( + 'pending',$env{'request.role.domain'}).'</div>'. + &Apache::loncommon::end_page()); + } elsif (($env{'form.phase'} eq 'requestvalidation') && ($show_all_choices)) { + my $js = &courserequestbrowser_javascript(); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/createcourse?phase=pendingdisplay", + text=>&mt('Display Pending Queue'),}, + {href=>"/adm/createcourse?phase=requestvalidation", + text=>&mt('Validation Attempted'),},); + my $start_page=&Apache::loncommon::start_page('Requests Validation Result',$js); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Validation Attempted','Course_Request',undef,'Course_Request'); + $r->print($start_page.$crumbs."\n".'<div>'. + &Apache::loncoursequeueadmin::process_official_reqs('domain',$env{'request.role.domain'}).'</div>'. + &Apache::loncommon::end_page()); + } elsif (($env{'form.phase'} eq 'creationlog') && ($show_all_choices)) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createcourse?phase=creationlog", text=>&mt('[_1] Display Creation History',),}); @@ -1281,7 +1366,7 @@ sub handler { &print_creation_logs($r); $r->print('</div>'.&Apache::loncommon::end_page()); } else { - &print_intro_page($r); + &print_intro_page($r,$show_all_choices); } } else { $env{'user.error.msg'}=