--- loncom/interface/loncreatecourse.pm 2007/08/23 21:54:40 1.104 +++ loncom/interface/loncreatecourse.pm 2009/07/27 22:35:12 1.123 @@ -1,7 +1,7 @@ # The LearningOnline Network # Create a course # -# $Id: loncreatecourse.pm,v 1.104 2007/08/23 21:54:40 albertel Exp $ +# $Id: loncreatecourse.pm,v 1.123 2009/07/27 22:35:12 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,6 +27,38 @@ # ### +=head1 NAME + +Apache::loncreatecourse.pm + +=head1 SYNOPSIS + +Allows domain coordinators to create new +courses and assign course coordinators. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=item handler() + +=item print_course_creation_page() + +=item create_course() + +=item print_intro_page() + +=item upload_batchfile() + +=item process_batchfile() + +=back + +=cut + package Apache::loncreatecourse; use strict; @@ -35,7 +67,7 @@ use Apache::lonnet; use Apache::loncommon; use Apache::londocs; use Apache::lonlocal; -use Apache::londropadd; +use Apache::lonuserutils; use Apache::lonclonecourse; use LONCAPA::batchcreatecourse; use LONCAPA; @@ -44,7 +76,7 @@ use LONCAPA; sub print_course_creation_page { my $r=shift; - my $crstype = 'Group'; + my $crstype = 'Community'; if ($env{'form.phase'} eq 'courseone') { $crstype = 'Course'; } @@ -70,13 +102,13 @@ sub print_course_creation_page { if ($crstype eq 'Course') { my $starttime = time; my $endtime = time+(6*30*24*60*60); # 6 months from now, approx - $enroll_table = &Apache::londropadd::date_setting_table($starttime, - $endtime,'create_enrolldates'); - $access_table = &Apache::londropadd::date_setting_table($starttime, - $endtime,'create_defaultdates'); + $enroll_table = &Apache::lonuserutils::date_setting_table($starttime, + $endtime,'create_enrolldates'); + $access_table = &Apache::lonuserutils::date_setting_table($starttime, + $endtime,'create_defaultdates'); ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($defdom); - $javascript_validations=&Apache::londropadd::javascript_validations( + $javascript_validations=&Apache::lonuserutils::javascript_validations( 'createcourse',$krbdefdom); my %param = ( formname => 'document.ccrs', kerb_def_dom => $krbdefdom, @@ -86,14 +118,16 @@ sub print_course_creation_page { $intform = &Apache::loncommon::authform_internal(%param); $locform = &Apache::loncommon::authform_local(%param); } else { + my $title_alert = &mt('A Community title is required'); + my $coord_alert = &mt('The username of the Coordinator is required'); $javascript_validations = qq| function validate(formname) { if (formname.title == '') { - alert("A group title is required"); + alert("$title_alert"); return; } if (formname.ccuname == '') { - alert("The username of the group coordinator is required"); + alert("$coord_alert"); } formname.submit(); } @@ -124,10 +158,14 @@ function validate(formname) { 'stco' => "standard courses only", 'blnk' => "Blank", 'sllb' => "Syllabus", - 'navi' => "Navigate", + 'navi' => "Navigate Contents", 'cid' => "Course ID", 'dmn' => "Domain", + 'dsh' => "Date Shift", 'asov' => "Additional settings, if specified below, will override cloned settings", + 'ncd' => "Do not clone date parameters", + 'prd' => 'Clone date parameters as-is', + 'shd' => 'Shift date parameters by number of days', 'assp' => "Assessment Parameters", 'oaas' => "Open all assessments", 'mssg' => "Messaging", @@ -135,7 +173,7 @@ function validate(formname) { 'scfc' => "Set content feedback to Course Coordinator", 'cmmn' => "Communication", 'dsrd' => "Disable student resource discussion", - 'dsuc' => "Disable student use of chatrooms", + 'dsuc' => "Disable student use of chat rooms", 'acco' => "Access Control", 'snak' => "Students need access key to enter course", 'kaut' => @@ -149,8 +187,9 @@ function validate(formname) { 'no' => "No", 'audr' => "Automated drops", 'dacu' => "Duration of automated classlist updates", + 'dads' => 'Default Access Dates for Students', 'dacc' => "Default start and end dates for student access", - 'psam' => "Please select the authentication mechanism", + 'psam' => "Please select the Authentication mechanism", 'pcda' => "Please choose the default authentication method to be used by new users added to this LON-CAPA domain by the automated enrollment process", 'nech' => "Notification of enrollment changes", 'nccl' => "Notification to course coordinator via LON-CAPA message when enrollment changes occur during the automated update?", @@ -158,29 +197,29 @@ function validate(formname) { 'irsp' => "Include retrieval of student photographs?", 'rshm' => 'Resource Space Home', 'cgrs' => "Course Group Settings", - 'cgrq' => "Set a quota for the total disk space available for storage of course group portfolio files.", + 'cgrq' => 'Set a quota for the total disk space available for storage of course group portfolio files', 'opco' => "Open Course", - 'ginf' => "Group Information", - 'gtit' => "Group Title", - 'ghsr' => "Group Home Server", - 'gidn' => "Group ID/Number", - 'grco' => "Group Content", - 'cngr' => "Completely new group", - 'cegr' => "Clone an existing group", - 'sagr' => "Do NOT generate as standard group", - 'stgo' => "standard groups only", - 'sgpf' => "Set group policy feedback to Group Coordinator", - 'scfg' => "Set content feedback to Group Coordinator", + 'ginf' => "Community Information", + 'gtit' => "Community Title", + 'ghsr' => "Community Home Server", + 'gidn' => "Community ID/Number", + 'grco' => "Community Content", + 'cngr' => "Completely new community", + 'cegr' => "Clone an existing community", + 'sagr' => "Do NOT generate as standard community", + 'stgo' => "standard communities only", + 'sgpf' => "Set community policy feedback to Coordinator", + 'scfg' => "Set content feedback to Coordinator", 'dmrd' => "Disable member resource discussion", - 'dmuc' => "Disable member use of chatrooms", - 'mnak' => "Members need access key to enter group", + 'dmuc' => "Disable member use of chat rooms", + 'mnak' => "Members need access key to enter community", 'kaug' => - 'Key authority (id@domain) if other than group', - 'gc' => "Group Coordinator", - 'gid' => "Group ID", - 'crgr' => "Create Group", - 'grts' => "Group Teams Settings", - 'grtq' => "Set a quota for the total disk space available for storage of group team portfolio files.", + 'Key authority (id@domain) if other than community', + 'gc' => "Coordinator", + 'gid' => "Community ID", + 'crgr' => "Create Community", + 'grts' => "Community Group Settings", + 'grtq' => "Set a quota for the total disk space available for storage of community group portfolio files.", ); my $js = < 'Create a New Course', - groupone => 'Create a New Group', + groupone => 'Create a New Community', ); my $start_page = &Apache::loncommon::start_page($titles{$env{'form.phase'}},$js); @@ -220,210 +259,253 @@ END 'Create_Course',undef, 'Create_Courses'); $r->print($start_page.$crumbs); + if ($crstype eq 'Course') { + $r->print('
' + .&Apache::lonhtmlcommon::start_pick_box() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cinf'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'ctit'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'chsr'}) + .$course_home + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'cidn'}.' ('.$lt{'opt'}.')') + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'iinf'}.'

' + .$lt{'stat'} + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'ccod'}) + .'' + .'
('.$lt{'toin'}.')' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'snid'}) + .'' + .'
('.$lt{'csli'}.')' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'crcs'}) + .'' + .'
('.$lt{'cscs'}.')' + .&Apache::lonhtmlcommon::row_closure() + ); + + # Table: New Course / Clone Course + $r->print(&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'crco'}.'

' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.$lt{'cncr'}.'' + .' '.&mt('or').' ' + .''.$lt{'cecr'}.'' + .&Apache::loncommon::end_data_table_header_row() + .&Apache::loncommon::start_data_table_row() + + # New Course: + .'' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'map'}) + .'' + .''.$lt{'smap'}.'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title('') + .'' + .'
('.$lt{'ocik'}.')' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'fres'}) + .'' + .' ' + .'' + .' ' + .'' + .'
('.$lt{'stco'}.')' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + + .' ' + + # Clone Course: + .'' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'cid'}) + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::row_title($lt{'dmn'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'dsh'}) + .'
' + .'
' + .'' + .' ' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_headline() + .$lt{'asov'} + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box() + .'' + .&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table() + .&Apache::lonhtmlcommon::row_closure() + ); + + $r->print(&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'dads'}.'

' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'dacc'}) + .$access_table + .&Apache::lonhtmlcommon::row_closure() + ); + + $r->print(&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'assp'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'oaas'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'mssg'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'scpf'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'scfc'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cmmn'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dsrd'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dsuc'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'acco'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'snak'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'kaut'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'rshm'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'rshm'}) + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'aens'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'aadd'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'audr'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dacu'}) + .$enroll_table + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'psam'}) + .$lt{'pcda'}.'
' + .$krbform.'
' + .$intform.'
' + .$locform + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'nech'}) + .$lt{'nccl'}.'
' + .'' + .'' + .'
' + .$lt{'ndcl'}.'
' + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'irsp'}) + .' ' + .' ' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cgrs'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'cgrq'}) + .'Mb' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_headline() + .'

'.$lt{'cc'}.'

' + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'user'}) + .'' + .&Apache::loncommon::studentbrowser_javascript() + .&Apache::loncommon::selectstudent_link('ccrs','ccuname','ccdomain') + .&Apache::lonhtmlcommon::row_closure() + + .&Apache::lonhtmlcommon::row_title($lt{'dmn'},"","LC_odd_row_value") + .$domform + .&Apache::lonhtmlcommon::row_closure(1) + + .&Apache::lonhtmlcommon::end_pick_box() + ); $r->print(< -

$lt{'cinf'}

-

- -

- -

- -

-

$lt{'iinf'}

-

-$lt{'stat'} -

- -
-($lt{'toin'}) -

- -
-($lt{'csli'}) -

- -
-($lt{'cscs'}) -

-

$lt{'crco'}

- - - -
$lt{'cncr'}$lt{'cecr'}
-

- -$lt{'smap'} -

- -
-($lt{'ocik'}): - -

-$lt{'fres'}
($lt{'stco'}): - -  - -  - -

-
- -
- -

-$lt{'asov'}. -
-

$lt{'assp'}

-

- -

-

$lt{'mssg'}

-

- -
- -

-

$lt{'cmmn'}

-

- -
- -

-

$lt{'acco'}

-

- -
- -

-

$lt{'rshm'}

-

- -

-

-

$lt{'aens'}

-$lt{'aesc'} -

-

-$lt{'aadd'} - - -

-$lt{'audr'} - - -

-$lt{'dacu'} -$enroll_table -

-$lt{'dacc'} -$access_table -

-$lt{'psam'}.
-$lt{'pcda'}. -

-$krbform -
-$intform -
-$locform -

-$lt{'nech'}
-$lt{'nccl'}
- - -
-$lt{'ndcl'}
- - -

-$lt{'irsp'} - - -

-

-

$lt{'cgrs'}

-$lt{'cgrq'} -Mb -

-
-

$lt{'cc'}

-

- -

- -

+

@@ -431,7 +513,8 @@ $lt{'cgrq'}

ENDDOCUMENT - } elsif ($crstype eq 'Group') { + + } elsif ($crstype eq 'Community') { $r->print(<

$lt{'ginf'}

@@ -470,7 +553,7 @@ ENDDOCUMENT    

+
+
+ +
 
$lt{'asov'}. @@ -496,12 +582,12 @@ $lt{'asov'}.


$lt{'cmmn'}

@@ -568,7 +654,7 @@ sub create_course { my $r=shift; my $ccuname =&LONCAPA::clean_username($env{'form.ccuname'}); my $ccdomain=&LONCAPA::clean_domain($env{'form.ccdomain'}); - my $crstype = 'Group'; + my $crstype = 'Community'; my ($enrollstart,$enrollend,$startaccess,$endaccess); if ($env{'form.phase'} eq 'coursetwo') { @@ -616,6 +702,8 @@ sub create_course { crsquota => $env{'form.crsquota'}, clonecourse => $env{'form.clonecourse'}, clonedomain => $env{'form.clonedomain'}, + datemode => $env{'form.datemode'}, + dateshift => $env{'form.dateshift'}, crsid => $env{'form.crsid'}, curruser => $env{'user.name'}.':'.$env{'user.domain'}, crssections => $env{'form.crssections'}, @@ -649,23 +737,26 @@ sub create_course { # Check the veracity of the course coordinator if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') { $r->print('
'); - $r->print(&mt('No such user').' '.$ccuname.' '.&mt('at').' '.$ccdomain.'.
'); - $r->print(&mt("Please click Back on your browser and select another user, or ")); - $r->print(' - - - - -
'.&Apache::loncommon::end_page()); + $r->print('
' + .&mt('No such user [_1] at domain [_2].',''.$ccuname.'',''.$ccdomain.'') + .'
'); + $r->print(&mt('Please click Back on your browser and select another user, or [_1]Create User[_2]' + , '' + .'' + .'' + .'' + ) + .''.&Apache::loncommon::end_page() + ); return; } # Check the proposed home server for the course my %host_servers = &Apache::lonnet::get_servers($env{'request.role.domain'},'library'); if (! exists($host_servers{$env{'form.course_home'}})) { - $r->print(&mt('Invalid home server for course').': '. - $env{'form.course_home'}.&Apache::loncommon::end_page()); + $r->print(&mt('Invalid home server for course: [_1]' + ,$env{'form.course_home'}.&Apache::loncommon::end_page())); return; } my ($courseid,$crsudom,$crsunum); @@ -680,10 +771,10 @@ sub create_course { # Make the requested user a course coordinator or group coordinator # if (($ccdomain) && ($ccuname)) { - $r->print(&mt('Assigning role of [_1] Coordinator to [_2] at [_3]: ', - $crstype,$ccuname,$ccdomain). - &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid, - 'cc').'

'); + $r->print(&mt('Assigning role of '.$crstype.' Coordinator to [_1]:', + ,''.$ccuname.':'.$ccdomain.'') + .&Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid, + 'cc','','','','','createcourse').'

'); } if ($env{'form.setkeys'}) { $r->print( @@ -694,18 +785,18 @@ sub create_course { $r->print('

'.&mt('Roles will be active at next login').'.

'); } $r->print('

'. - &mt('Create Another [_1]',$crstype).'

'. + &mt("Create Another $crstype").'

'. &Apache::loncommon::end_page()); } sub print_intro_page { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Group Space'); + &Apache::loncommon::start_page('Create a New Course or Community'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Options','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); - my $helplink=&Apache::loncommon::help_open_topic('Create_Course_GroupSpace',&mt('Help on Creating Courses and Groups')); + 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'), @@ -713,14 +804,14 @@ sub print_intro_page { &mt('Create a new course by completing an online form.'), }, { internal_name => 'groupone', - name => &mt('Create a single collaborative group space '), + name => &mt('Create a single collaborative "community"'), short_description => - &mt('Create a new group space for non-course use by completing an online form .'), + &mt('Create a new collaborative community by completing an online form.'), }, { internal_name => 'batchone', - name => &mt('Create courses/groups by uploading an attributes file'), + 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 groups in XML format'), + &mt('Upload an attributes file containing specifications for one or more courses or communities in XML format.'), help => 'Batch_Creation', }, ); @@ -747,8 +838,8 @@ ENDDOCUMENT sub upload_batchfile { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Group Space'); - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Group Attributes File','Create_Course',undef,'Create_Courses'); + &Apache::loncommon::start_page('Create a New Course or Community'); + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Upload Course/Community Attributes File','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page(); $r->print($start_page.$crumbs); @@ -756,9 +847,9 @@ sub upload_batchfile { $r->print('
'. ''. - '

'. + '

'. '
'); + 'value="Create Courses/Communities" />'); $r->print($end_page); return; } @@ -766,7 +857,7 @@ sub upload_batchfile { sub process_batchfile { my $r = shift; my $start_page = - &Apache::loncommon::start_page('Create a New Course or Group Space'); + &Apache::loncommon::start_page('Create a New Course or Community'); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('Creation Outcome','Create_Course',undef,'Create_Courses'); my $end_page = &Apache::loncommon::end_page();