Annotation of loncom/interface/loncreatecourse.pm, revision 1.40
1.1 www 1: # The LearningOnline Network
2: # Create a course
1.5 albertel 3: #
1.40 ! raeburn 4: # $Id: loncreatecourse.pm,v 1.39 2003/11/12 21:37:07 albertel Exp $
1.5 albertel 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
1.1 www 28: # (My Desk
29: #
30: # (Internal Server Error Handler
31: #
32: # (Login Screen
33: # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,
34: # 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)
35: #
36: # 3/1/1 Gerd Kortemeyer)
37: #
38: # 3/1 Gerd Kortemeyer)
39: #
1.4 www 40: # 2/14,2/16,2/17,7/6 Gerd Kortemeyer
1.1 www 41: #
42: package Apache::loncreatecourse;
43:
44: use strict;
45: use Apache::Constants qw(:common :http);
46: use Apache::lonnet;
1.12 www 47: use Apache::loncommon;
1.13 www 48: use Apache::lonratedt;
49: use Apache::londocs;
1.38 www 50: use Apache::lonlocal;
1.28 www 51:
52: # ================================================ Get course directory listing
53:
54: sub crsdirlist {
55: my ($courseid,$which)=@_;
56: unless ($which) { $which=''; }
57: my %crsdata=&Apache::lonnet::coursedescription($courseid);
58: my @listing=&Apache::lonnet::dirlist
59: ($which,$crsdata{'domain'},$crsdata{'num'},
1.39 albertel 60: &Apache::loncommon::propath($crsdata{'domain'},$crsdata{'num'}));
1.28 www 61: my @output=();
62: foreach (@listing) {
63: unless ($_=~/^\./) {
64: push (@output,(split(/\&/,$_))[0]);
65: }
66: }
67: return @output;
1.29 www 68: }
69:
70: # ============================================================= Read a userfile
71:
72: sub readfile {
73: my ($courseid,$which)=@_;
74: my %crsdata=&Apache::lonnet::coursedescription($courseid);
75: return &Apache::lonnet::getfile('/uploaded/'.$crsdata{'domain'}.'/'.
76: $crsdata{'num'}.'/'.$which);
77: }
78:
79: # ============================================================ Write a userfile
80:
81: sub writefile {
1.30 www 82: (my $courseid, my $which,$ENV{'form.output'})=@_;
1.29 www 83: my %crsdata=&Apache::lonnet::coursedescription($courseid);
84: return &Apache::lonnet::finishuserfileupload(
85: $crsdata{'num'},$crsdata{'domain'},
86: $crsdata{'home'},
87: 'output',$which);
88: }
89:
1.36 www 90: # ===================================================================== Rewrite
91:
92: sub rewritefile {
93: my ($contents,%rewritehash)=@_;
94: foreach (keys %rewritehash) {
95: my $pattern=$_;
96: $pattern=~s/(\W)/\\$1/gs;
97: my $new=$rewritehash{$_};
98: $contents=~s/$pattern/$new/gs;
99: }
100: return $contents;
101: }
102:
1.29 www 103: # ============================================================= Copy a userfile
104:
105: sub copyfile {
106: my ($origcrsid,$newcrsid,$which)=@_;
1.36 www 107: unless ($which=~/\.sequence$/) {
108: return &writefile($newcrsid,$which,
109: &readfile($origcrsid,$which));
110: } else {
111: my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
112: my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid);
113: return &writefile($newcrsid,$which,
114: &rewritefile(
115: &readfile($origcrsid,$which),
116: (
117: '/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'
118: => '/uploaded/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/'
119: )));
120: }
1.30 www 121: }
122:
123: # =============================================================== Copy a dbfile
124:
125: sub copydb {
126: my ($origcrsid,$newcrsid,$which)=@_;
127: $which=~s/\.db$//;
128: my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
129: my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid);
130: my %data=&Apache::lonnet::dump
131: ($which,$origcrsdata{'domain'},$origcrsdata{'num'});
132: return &Apache::lonnet::put
133: ($which,\%data,$newcrsdata{'domain'},$newcrsdata{'num'});
134: }
135:
1.35 www 136: # ========================================================== Copy resourcesdata
137:
138: sub copyresourcedb {
139: my ($origcrsid,$newcrsid)=@_;
140: my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
141: my %newcrsdata= &Apache::lonnet::coursedescription($newcrsid);
142: my %data=&Apache::lonnet::dump
143: ('resourcedata',$origcrsdata{'domain'},$origcrsdata{'num'});
144: $origcrsid=~s/^\///;
145: $origcrsid=~s/\//\_/;
146: $newcrsid=~s/^\///;
147: $newcrsid=~s/\//\_/;
148: my %newdata=();
149: undef %newdata;
150: my $startdate=$data{$origcrsid.'.0.opendate'};
151: my $today=time;
152: my $delta=0;
153: if ($startdate) {
154: my $oneday=60*60*24;
155: $delta=$today-$startdate;
156: $delta=int($delta/$oneday)*$oneday;
157: }
158: # ugly retro fix for broken version of types
159: foreach (keys %data) {
160: if ($_=~/\wtype$/) {
161: my $newkey=$_;
162: $newkey=~s/type$/\.type/;
163: $data{$newkey}=$data{$_};
164: delete $data{$_};
165: }
166: }
1.37 www 167: # adjust symbs
168: my $pattern='uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/';
169: $pattern=~s/(\W)/\\$1/gs;
170: my $new= 'uploaded/'. $newcrsdata{'domain'}.'/'. $newcrsdata{'num'}.'/';
171: foreach (keys %data) {
172: if ($_=~/$pattern/) {
173: my $newkey=$_;
174: $newkey=~s/$pattern/$new/;
175: $data{$newkey}=$data{$_};
176: delete $data{$_};
177: }
178: }
1.35 www 179: # adjust dates
180: foreach (keys %data) {
181: my $thiskey=$_;
182: $thiskey=~s/^$origcrsid/$newcrsid/;
183: $newdata{$thiskey}=$data{$_};
184: if ($data{$_.'.type'}=~/^date/) {
185: $newdata{$thiskey}=$newdata{$thiskey}+$delta;
186: }
187: }
188: return &Apache::lonnet::put
189: ('resourcedata',\%newdata,$newcrsdata{'domain'},$newcrsdata{'num'});
190: }
191:
1.30 www 192: # ========================================================== Copy all userfiles
193:
194: sub copyuserfiles {
195: my ($origcrsid,$newcrsid)=@_;
196: foreach (&crsdirlist($origcrsid,'userfiles')) {
197: ©file($origcrsid,$newcrsid,$_);
198: }
199: }
200: # ========================================================== Copy all userfiles
201:
202: sub copydbfiles {
203: my ($origcrsid,$newcrsid)=@_;
204: foreach (&crsdirlist($origcrsid)) {
205: if ($_=~/\.db$/) {
206: unless
1.34 www 207: ($_=~/^(nohist\_|discussiontimes|classlist|versionupdate|resourcedata)/) {
1.30 www 208: ©db($origcrsid,$newcrsid,$_);
209: }
210: }
211: }
1.31 www 212: }
213:
214: # ======================================================= Copy all course files
215:
216: sub copycoursefiles {
217: my ($origcrsid,$newcrsid)=@_;
218: ©userfiles($origcrsid,$newcrsid);
219: ©dbfiles($origcrsid,$newcrsid);
1.35 www 220: ©resourcedb($origcrsid,$newcrsid);
1.28 www 221: }
1.13 www 222:
1.2 www 223: # ===================================================== Phase one: fill-in form
224:
1.10 matthew 225: sub print_course_creation_page {
1.2 www 226: my $r=shift;
1.10 matthew 227: my $defdom=$ENV{'request.role.domain'};
228: my %host_servers = &Apache::loncommon::get_library_servers($defdom);
229: my $course_home = '<select name="course_home" size="1">'."\n";
230: foreach my $server (sort(keys(%host_servers))) {
1.14 matthew 231: $course_home .= qq{<option value="$server"};
232: if ($server eq $Apache::lonnet::perlvar{'lonHostID'}) {
233: $course_home .= " selected ";
234: }
235: $course_home .= qq{>$server $host_servers{$server}</option>};
1.10 matthew 236: }
237: $course_home .= "\n</select>\n";
1.9 matthew 238: my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
1.12 www 239: my $bodytag=&Apache::loncommon::bodytag('Create a New Course');
1.17 www 240: my $helplink=&Apache::loncommon::help_open_topic('Create_Course','Help on Creating Courses');
1.32 www 241: my $cloneform=&Apache::loncommon::select_dom_form
242: ($ENV{'request.role.domain'},'clonedomain').
243: &Apache::loncommon::selectcourse_link
244: ('ccrs','clonecourse','clonedomain');
245: my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript();
1.40 ! raeburn 246: my $date_table = &date_setting_table();
! 247: my ($krbdef,$krbdefdom) =
! 248: &Apache::loncommon::get_kerberos_defaults($defdom);
! 249: my $javascript_validations=&javascript_validations($krbdefdom);
! 250: my %param = ( formname => 'document.ccrs',
! 251: kerb_def_dom => $krbdefdom,
! 252: kerb_def_auth => $krbdef
! 253: );
! 254: my $krbform = &Apache::loncommon::authform_kerberos(%param);
! 255: my $intform = &Apache::loncommon::authform_internal(%param);
! 256: my $locform = &Apache::loncommon::authform_local(%param);
1.2 www 257: $r->print(<<ENDDOCUMENT);
258: <html>
1.6 matthew 259: <script language="JavaScript" type="text/javascript">
260: var editbrowser = null;
261: function openbrowser(formname,elementname) {
262: var url = '/res/?';
263: if (editbrowser == null) {
264: url += 'launch=1&';
265: }
266: url += 'catalogmode=interactive&';
267: url += 'mode=edit&';
268: url += 'form=' + formname + '&';
1.7 matthew 269: url += 'element=' + elementname + '&';
270: url += 'only=sequence' + '';
1.6 matthew 271: var title = 'Browser';
272: var options = 'scrollbars=1,resizable=1,menubar=0';
273: options += ',width=700,height=600';
274: editbrowser = open(url,title,options,'1');
275: editbrowser.focus();
276: }
277: </script>
1.32 www 278: $coursebrowserjs
1.2 www 279: <head>
280: <title>The LearningOnline Network with CAPA</title>
281: </head>
1.12 www 282: $bodytag
1.17 www 283: $helplink
1.6 matthew 284: <form action="/adm/createcourse" method="post" name="ccrs">
1.10 matthew 285: <h2>Course Information</h2>
286: <p>
287: <b>Course Title:</b>
1.6 matthew 288: <input type="text" size="50" name="title">
1.10 matthew 289: </p><p>
1.13 www 290: <b>Course Home Server:</b>$course_home
291: </p><p>
292: <b>Course ID/Number (optional)</b>
293: <input type="text" size="30" name="crsid">
1.40 ! raeburn 294: </p><p>
! 295: <h2>Institutional Information</h2>
! 296: <p>
! 297: The following entries will be used to identify the course according to the naming scheme adopted by your institution. Your choices will be used to map an internal LON-CAPA course ID to the corresponding course section ID(s) used by the office responsible for providing official class lists for courses at your institution. This mapping is required if you choose to employ automatic population of class lists.
! 298: </p><p>
! 299: <b>Course Code</b>
! 300: <input type="text" size="30" name="crscode" /><br/>
! 301: (to interface with institutional data, e.g., fs03glg231 for Fall 2003 Geology 231)
! 302: </p><p>
! 303: <b>Section Numbers and corresponding LON-CAPA section/group IDs</b>
! 304: <input type="text" size="30" name="crssections" /><br/>
! 305: (a comma separated list of institutional section numbers, each separated by a colon
! 306: from the (optional) corresponding section/group ID to be used in LON-CAPA e.g., 001:1,002:2)
! 307: </p><p>
! 308: <b>Crosslisted courses</b>
! 309: <input type="text" size="30" name="crsxlist" /><br/>
! 310: (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) groupID to be used in LON-CAPA, e.g., fs03ent231001:ent1,fs03bot231001:bot1,fs03zol231002:bot2)
1.13 www 311: </p>
312: <h2>Course Content</h2>
1.32 www 313: <table border="2">
314: <tr><th>Completely new course</th><th>Clone an existing course</th></tr>
315: <tr><td>
1.13 www 316: <p>
1.11 www 317: <b>Map:</b>
1.6 matthew 318: <input type="text" size="50" name="topmap">
1.24 www 319: <a href="javascript:openbrowser('ccrs','topmap')">Select Map</a>
1.10 matthew 320: </p><p>
1.32 www 321: <b>Do NOT generate as standard course</b><br />
1.11 www 322: (only check if you know what you are doing):
323: <input type="checkbox" name="nonstandard">
1.13 www 324: </p>
325: <p>
1.32 www 326: <b>First Resource</b><br />(standard courses only):
1.17 www 327: <input type="radio" name="firstres" value="blank">Blank
1.13 www 328:
1.17 www 329: <input type="radio" name="firstres" value="syl" checked>Syllabus
1.13 www 330:
331: <input type="radio" name="firstres" value="nav">Navigate
332: </p>
1.32 www 333: </td><td>
334: Course ID: <input input type="text" size="25" name="clonecourse" value="" />
335: <br />
336: Domain:
337: $cloneform<br /> <br />
338: Additional settings, if specified below, will override cloned settings.
339: </td></tr>
340: </table>
1.13 www 341: <h2>Assessment Parameters</h2>
342: <p>
1.11 www 343: <b>Open all assessments: </b>
344: <input type="checkbox" name="openall" checked>
1.13 www 345: </p>
346: <h2>Messaging</h2>
347: <p>
1.11 www 348: <b>Set course policy feedback to Course Coordinator: </b>
349: <input type="checkbox" name="setpolicy" checked>
350: </p><p>
351: <b>Set content feedback to Course Coordinator: </b>
352: <input type="checkbox" name="setcontent" checked>
353: </p>
1.16 www 354: <h2>Communication</h2>
355: <p>
356: <b>Disable student resource discussion: </b>
1.26 matthew 357: <input type="checkbox" name="disresdis" /> <br />
358: <b>Disable student use of chatrooms: </b>
359: <input type="checkbox" name="disablechat" />
1.16 www 360: </p>
1.18 www 361: <h2>Access Control</h2>
362: <p>
363: <b>Students need access key to enter course: </b>
364: <input type="checkbox" name="setkeys" />
365: </p>
1.10 matthew 366: <h2>Course Coordinator</h2>
367: <p>
1.11 www 368: <b>Username:</b> <input type="text" size="15" name="ccuname" />
369: </p><p>
370: <b>Domain:</b> $domform
1.10 matthew 371: </p><p>
1.11 www 372: <b>Immediately expire own role as Course Coordinator:</b>
373: <input type="checkbox" name="expireown" checked>
1.10 matthew 374: </p><p>
1.40 ! raeburn 375: <h2>Automated enrollment settings</h2>
! 376: The following settings control automatic enrollment of students in this class based
! 377: on information available for this specific course from your institution's official classlists.
! 378: </p>
! 379: <p>
! 380: <b>Automated adds</b>
! 381: <input type="radio" name="autoadds" value="1" checked="true" />Yes <input type="radio" name="autoadds" value="0" />No
! 382: </p><p>
! 383: <b>Automated drops</b>
! 384: <input type="radio" name="autodrops" value="1" checked="true" />Yes <input type="radio" name="autodrops" value="0" />No
! 385: </p><p>
! 386: <b>Duration of automated classlist updates</b>
! 387: $date_table
! 388: </p><p>
! 389: <b>Please select the authentication mechanism.</b><br />
! 390: Please choose the default authentication method to be used by new users added to this LON-CAPA domain by the automated enrollment process.
! 391: </p><p>
! 392: $krbform
! 393: <br />
! 394: $intform
! 395: <br />
! 396: $locform
! 397: </p><p>
! 398: <b>Notification of enrollment changes</b><br />
! 399: Notification to course coordinator via LON-CAPA message when enrollment changes occur during the automated update?<br/>
! 400: <input type="radio" name="notify" value="1" />Yes <input type="radio" name="notify"
! 401: value="0" />No
! 402: </p><p>
! 403: <b>Include retrieval of student photographs?</b> <input type="radio" name="showphotos" value="1" />Yes <input type="radio" name="showphotos" value="0" checked="true" />No
! 404: </p><p>
1.10 matthew 405: <input type="hidden" name="phase" value="two" />
1.6 matthew 406: <input type="submit" value="Open Course">
1.10 matthew 407: </p>
1.2 www 408: </form>
409: </body>
410: </html>
411: ENDDOCUMENT
412: }
413:
1.40 ! raeburn 414: sub javascript_validations {
! 415: my ($krbdefdom)=@_;
! 416: my %param = ( formname => 'ccrs',
! 417: kerb_def_dom => $krbdefdom );
! 418: my $authheader = &Apache::loncommon::authform_header(%param);
! 419: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
! 420: return (<<ENDPICK);
! 421: function verify_message (vf,foundpwd) {
! 422: var foundatype=0;
! 423: var message='';
! 424: // alert('current.radiovalue = '+current.radiovalue);
! 425: if (current.radiovalue == null || current.radiovalue == 'nochange') {
! 426: // They did not check any of the login radiobuttons.
! 427: alert('You must choose an authentication type');
! 428: return;
! 429: }
! 430: foundatype=1;
! 431: if (current.argfield == null || current.argfield == '') {
! 432: var alertmsg = '';
! 433: switch (current.value) {
! 434: case 'krb':
! 435: alertmsg = 'You need to specify the Kerberos domain';
! 436: break;
! 437: case 'loc':
! 438: case 'fsys':
! 439: alertmsg = 'You need to specify the initial password';
! 440: break;
! 441: case 'fsys':
! 442: alertmsg = '';
! 443: break;
! 444: default:
! 445: alertmsg = '';
! 446: }
! 447: if (alertmsg != '') {
! 448: alert(alertmsg);
! 449: return;
! 450: }
! 451: }
! 452: vf.submit();
! 453: }
! 454: $authheader
! 455: ENDPICK
! 456: }
! 457:
! 458: sub date_setting_table {
! 459: my $starttime = time;
! 460: my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
! 461: my $startform = &Apache::lonhtmlcommon::date_setter('ccrs','startdate',$starttime);
! 462: my $endform = &Apache::lonhtmlcommon::date_setter('ccrs','enddate',$endtime);
! 463: my $perpetual = '<nobr><input type="checkbox" name="no_end_date"/> no ending date</nobr>';
! 464: my $result = '';
! 465: $result .= "<table>\n";
! 466: $result .= '<tr><td align="right">Starting Date</td>'.
! 467: '<td>'.$startform.'</td>'.
! 468: '<td></td>'."</tr>\n";
! 469: $result .= '<tr><td align="right">Ending Date</td>'.
! 470: '<td>'.$endform.'</td>'.
! 471: '<td>'.$perpetual.'</td>'."</tr>\n";
! 472: $result .= "</table>\n";
! 473: return $result;
! 474: }
! 475:
1.2 www 476: # ====================================================== Phase two: make course
477:
1.10 matthew 478: sub create_course {
1.2 www 479: my $r=shift;
480: my $topurl='/res/'.&Apache::lonnet::declutter($ENV{'form.topmap'});
481: my $ccuname=$ENV{'form.ccuname'};
482: my $ccdomain=$ENV{'form.ccdomain'};
483: $ccuname=~s/\W//g;
484: $ccdomain=~s/\W//g;
485: my $cdescr=$ENV{'form.title'};
486: my $curl=$ENV{'form.topmap'};
1.12 www 487: my $bodytag=&Apache::loncommon::bodytag('Create a New Course');
1.2 www 488: $r->print(<<ENDENHEAD);
489: <html>
490: <head>
491: <title>The LearningOnline Network with CAPA</title>
492: </head>
1.12 www 493: $bodytag
1.2 www 494: ENDENHEAD
1.10 matthew 495: #
496: # Verify data
497: #
498: # Check the veracity of the course coordinator
1.2 www 499: if (&Apache::lonnet::homeserver($ccuname,$ccdomain) eq 'no_host') {
1.3 www 500: $r->print('No such user '.$ccuname.' at '.$ccdomain.'</body></html>');
1.2 www 501: return;
502: }
1.10 matthew 503: # Check the proposed home server for the course
504: my %host_servers = &Apache::loncommon::get_library_servers
505: ($ENV{'request.role.domain'});
506: if (! exists($host_servers{$ENV{'form.course_home'}})) {
507: $r->print('Invalid home server for course: '.
508: $ENV{'form.course_home'}.'</body></html>');
509: return;
510: }
1.2 www 511: #
512: # Open course
513: #
1.32 www 514: my %cenv=();
1.10 matthew 515: my $courseid=&Apache::lonnet::createcourse($ENV{'request.role.domain'},
516: $cdescr,$curl,
1.11 www 517: $ENV{'form.course_home'},
518: $ENV{'form.nonstandard'});
1.2 www 519:
1.27 bowersj2 520: # Note: The testing routines depend on this being output; see
521: # Utils::Course. This needs to at least be output as a comment
522: # if anyone ever decides to not show this, and Utils::Course::new
523: # will need to be suitably modified.
1.4 www 524: $r->print('New LON-CAPA Course ID: '.$courseid.'<br>');
525: #
1.12 www 526: # Check if created correctly
1.4 www 527: #
528: my ($crsudom,$crsunum)=($courseid=~/^\/(\w+)\/(\w+)$/);
529: my $crsuhome=&Apache::lonnet::homeserver($crsunum,$crsudom);
530: $r->print('Created on: '.$crsuhome.'<br>');
1.12 www 531: #
1.32 www 532: # Are we cloning?
533: #
534: my $cloneid='';
535: if (($ENV{'form.clonecourse'}) && ($ENV{'form.clonedomain'})) {
536: $cloneid='/'.$ENV{'form.clonedomain'}.'/'.$ENV{'form.clonecourse'};
537: my ($clonecrsudom,$clonecrsunum)=($cloneid=~/^\/(\w+)\/(\w+)$/);
538: my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
539: if ($clonehome eq 'no_host') {
540: $r->print(
541: '<br /><font color="red">Attempting to clone non-existing course '.$cloneid.'</font>');
542: } else {
543: $r->print(
544: '<br /><font color="green">Cloning course from '.$clonehome.'</font>');
1.37 www 545: my %oldcenv=&Apache::lonnet::dump('environment',$crsudom,$crsunum);
1.32 www 546: # Copy all files
547: ©coursefiles($cloneid,$courseid);
1.37 www 548: # Restore URL
549: $cenv{'url'}=$oldcenv{'url'};
1.32 www 550: # Restore title
1.37 www 551: $cenv{'description'}=$oldcenv{'description'};
552: # Mark as cloned
1.35 www 553: $cenv{'clonedfrom'}=$cloneid;
1.32 www 554: }
555: }
556: #
557: # Set environment (will override cloned, if existing)
1.12 www 558: #
1.4 www 559: if ($ENV{'form.crsid'}) {
1.12 www 560: $cenv{'courseid'}=$ENV{'form.crsid'};
1.40 ! raeburn 561: }
! 562: if ($ENV{'form.crscode'}) {
! 563: $cenv{'internal.coursecode'}=$ENV{'form.crscode'};
! 564: }
! 565: if ($ENV{'form.crssections'}) {
! 566: $cenv{'internal.sectionnums'}=$ENV{'form.crssections'};
! 567: }
! 568: if ($ENV{'form.crsxlist'}) {
! 569: $cenv{'internal.crosslistings'}=$ENV{'form.crsxlist'};
! 570: }
! 571: if ($ENV{'form.autoadds'}) {
! 572: $cenv{'internal.autoadds'}=$ENV{'form.autoadds'};
! 573: }
! 574: if ($ENV{'form.autodrops'}) {
! 575: $cenv{'internal.autodrops'}=$ENV{'form.autodrops'};
! 576: }
! 577: if ($ENV{'form.notify'}) {
! 578: if ($ccuname) {
! 579: $cenv{'internal.notifylist'} = $ccuname;
! 580: }
! 581: }
! 582: if ($ccuname) {
! 583: $cenv{'internal.courseowner'} = $ccuname;
! 584: }
! 585: my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
! 586: my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate');
! 587: if ($ENV{'form.no_end_date'}) {
! 588: $enddate = 0;
! 589: }
! 590: $cenv{'internal.autostart'}=$startdate;
! 591: $cenv{'internal.autoend'}=$enddate;
! 592: if ($ENV{'form.showphotos'}) {
! 593: $cenv{'internal.showphotos'}=$ENV{'form.showphotos'};
! 594: }
! 595: if ($ENV{'form.login'} eq 'krb') {
! 596: $cenv{'internal.authtype'} = 'krb';
! 597: $cenv{'internal.authtype'} .=$ENV{'form.krbver'};
! 598: $cenv{'internal.autharg'} = $ENV{'form.krbarg'};
! 599: } elsif ($ENV{'form.login'} eq 'int') {
! 600: $cenv{'internal.authtype'} ='internal';
! 601: if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {
! 602: $cenv{'internal.autharg'} = $ENV{'form.intarg'};
! 603: }
! 604: } elsif ($ENV{'form.login'} eq 'loc') {
! 605: $cenv{'internal.authtype'} = 'localauth';
! 606: if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
! 607: $cenv{'internal.autharg'} = $ENV{'form.locarg'};
! 608: }
! 609: }
! 610: if ( ($cenv{'internal.authtype'} =~ /^krb/) && ($cenv{'internal.autoadds'} == 1)) {
! 611: if (! defined($cenv{'internal.autharg'}) || $cenv{'internal.autharg'} eq '') {
! 612: $r->print('<font color="red" size="+1">'.
! 613: 'As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student'.'</font></p>');
! 614: }
1.12 www 615: }
616: if (($ccdomain) && ($ccuname)) {
617: if ($ENV{'form.setpolicy'}) {
618: $cenv{'policy.email'}=$ccuname.':'.$ccdomain;
619: }
620: if ($ENV{'form.setcontent'}) {
1.18 www 621: $cenv{'question.email'}=$ccuname.':'.$ccdomain;
622: }
623: }
624: if ($ENV{'form.setkeys'}) {
625: $cenv{'keyaccess'}='yes';
1.16 www 626: }
627: if ($ENV{'form.disresdis'}) {
628: $cenv{'pch.roles.denied'}='st';
1.26 matthew 629: }
630: if ($ENV{'form.disablechat'}) {
631: $cenv{'plc.roles.denied'}='st';
1.21 albertel 632: }
1.23 bowersj2 633:
1.32 www 634: # Record we've not yet viewed the Course Initialization Helper for this
635: # course
1.23 bowersj2 636: $cenv{'course.helper.not.run'} = 1;
1.21 albertel 637: #
638: # Use new Randomseed
639: #
1.22 albertel 640: $cenv{'rndseed'}=&Apache::lonnet::latest_rnd_algorithm_id();;
1.25 matthew 641: #
642: # By default, use standard grading
643: $cenv{'grading'} = 'standard';
1.22 albertel 644:
1.32 www 645: $r->print('<br />Setting environment: '.
1.12 www 646: &Apache::lonnet::put('environment',\%cenv,$crsudom,$crsunum).'<br>');
647: #
648: # Open all assignments
649: #
650: if ($ENV{'form.openall'}) {
651: my $storeunder=$crsudom.'_'.$crsunum.'.0.opendate';
1.33 www 652: my %storecontent = ($storeunder => time,
653: $storeunder.'.type' => 'date_start');
1.12 www 654:
655: $r->print('Opening all assignments: '.&Apache::lonnet::cput
656: ('resourcedata',\%storecontent,$crsudom,$crsunum).'<br>');
657: }
1.13 www 658: #
659: # Set first page
660: #
661: unless (($ENV{'form.nonstandard'}) || ($ENV{'form.firstres'} eq 'blank')) {
662: $r->print('Setting first resource: ');
663: my ($errtext,$fatal)=
664: &Apache::londocs::mapread($crsunum,$crsudom,'default.sequence');
665: $r->print(($fatal?$errtext:'read ok').' - ');
666: my $title; my $url;
667: if ($ENV{'form.firstres'} eq 'syl') {
668: $title='Syllabus';
669: $url='/public/'.$crsudom.'/'.$crsunum.'/syllabus';
670: } else {
671: $title='Navigate Contents';
672: $url='/adm/navmaps';
673: }
674: $Apache::lonratedt::resources[1]=$title.':'.$url.':false:start:res';
1.15 albertel 675: ($errtext,$fatal)=
1.13 www 676: &Apache::londocs::storemap($crsunum,$crsudom,'default.sequence');
677: $r->print(($fatal?$errtext:'write ok').'<br>');
678: }
1.2 www 679: #
680: # Make current user course adminstrator
681: #
1.12 www 682: my $end=undef;
683: my $addition='';
684: if ($ENV{'form.expireown'}) { $end=time+5; $addition='expired'; }
685: $r->print('Assigning '.$addition.' role of course coordinator to self: '.
1.2 www 686: &Apache::lonnet::assignrole(
1.12 www 687: $ENV{'user.domain'},$ENV{'user.name'},$courseid,'cc',$end).'<br>');
1.2 www 688: #
689: # Make additional user course administrator
690: #
1.12 www 691: if (($ccdomain) && ($ccuname)) {
1.2 www 692: $r->print('Assigning role of course coordinator to '.
693: $ccuname.' at '.$ccdomain.': '.
1.3 www 694: &Apache::lonnet::assignrole($ccdomain,$ccuname,$courseid,'cc').'<p>');
1.12 www 695: }
1.20 www 696: if ($ENV{'form.setkeys'}) {
697: $r->print(
698: '<p><a href="/adm/managekeys?cid='.$crsudom.'_'.$crsunum.'">Manage Access Keys</a></p>');
699: }
700: $r->print('<p>Roles will be active at next login.</p></body></html>');
1.2 www 701: }
702:
703: # ===================================================================== Handler
1.1 www 704: sub handler {
705: my $r = shift;
706:
707: if ($r->header_only) {
1.38 www 708: &Apache::loncommon::content_type($r,'text/html');
1.1 www 709: $r->send_http_header;
710: return OK;
711: }
712:
1.10 matthew 713: if (&Apache::lonnet::allowed('ccc',$ENV{'request.role.domain'})) {
1.38 www 714: &Apache::loncommon::content_type($r,'text/html');
1.1 www 715: $r->send_http_header;
716:
1.2 www 717: if ($ENV{'form.phase'} eq 'two') {
1.10 matthew 718: &create_course($r);
1.2 www 719: } else {
1.10 matthew 720: &print_course_creation_page($r);
1.2 www 721: }
1.1 www 722: } else {
723: $ENV{'user.error.msg'}=
724: "/adm/createcourse:ccc:0:0:Cannot create courses";
725: return HTTP_NOT_ACCEPTABLE;
726: }
727: return OK;
728: }
729:
730: 1;
731: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>