![]() ![]() | ![]() |
- fixes so that usenrames with _ work again
1: # The LearningOnline Network with CAPA 2: # Create a user 3: # 4: # $Id: loncreateuser.pm,v 1.98 2005/01/11 22:12:22 albertel Exp $ 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: # 28: ### 29: 30: package Apache::loncreateuser; 31: 32: =pod 33: 34: =head1 NAME 35: 36: Apache::loncreateuser - handler to create users and custom roles 37: 38: =head1 SYNOPSIS 39: 40: Apache::loncreateuser provides an Apache handler for creating users, 41: editing their login parameters, roles, and removing roles, and 42: also creating and assigning custom roles. 43: 44: =head1 OVERVIEW 45: 46: =head2 Custom Roles 47: 48: In LON-CAPA, roles are actually collections of privileges. "Teaching 49: Assistant", "Course Coordinator", and other such roles are really just 50: collection of privileges that are useful in many circumstances. 51: 52: Creating custom roles can be done by the Domain Coordinator through 53: the Create User functionality. That screen will show all privileges 54: that can be assigned to users. For a complete list of privileges, 55: please see C</home/httpd/lonTabs/rolesplain.tab>. 56: 57: Custom role definitions are stored in the C<roles.db> file of the role 58: author. 59: 60: =cut 61: 62: use strict; 63: use Apache::Constants qw(:common :http); 64: use Apache::lonnet; 65: use Apache::loncommon; 66: use Apache::lonlocal; 67: 68: my $loginscript; # piece of javascript used in two separate instances 69: my $generalrule; 70: my $authformnop; 71: my $authformkrb; 72: my $authformint; 73: my $authformfsys; 74: my $authformloc; 75: 76: sub initialize_authen_forms { 77: my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/); 78: $krbdefdom= uc($krbdefdom); 79: my %param = ( formname => 'document.cu', 80: kerb_def_dom => $krbdefdom 81: ); 82: # no longer static due to configurable kerberos defaults 83: # $loginscript = &Apache::loncommon::authform_header(%param); 84: $generalrule = &Apache::loncommon::authform_authorwarning(%param); 85: $authformnop = &Apache::loncommon::authform_nochange(%param); 86: # no longer static due to configurable kerberos defaults 87: # $authformkrb = &Apache::loncommon::authform_kerberos(%param); 88: $authformint = &Apache::loncommon::authform_internal(%param); 89: $authformfsys = &Apache::loncommon::authform_filesystem(%param); 90: $authformloc = &Apache::loncommon::authform_local(%param); 91: } 92: 93: 94: # ======================================================= Existing Custom Roles 95: 96: sub my_custom_roles { 97: my %returnhash=(); 98: my %rolehash=&Apache::lonnet::dump('roles'); 99: foreach (keys %rolehash) { 100: if ($_=~/^rolesdef\_(\w+)$/) { 101: $returnhash{$1}=$1; 102: } 103: } 104: return %returnhash; 105: } 106: 107: # ==================================================== Figure out author access 108: 109: sub authorpriv { 110: my ($auname,$audom)=@_; 111: if (($auname ne $ENV{'user.name'}) || 112: (($audom ne $ENV{'user.domain'}) && 113: ($audom ne $ENV{'request.role.domain'}))) { return ''; } 114: unless (&Apache::lonnet::allowed('cca',$audom)) { return ''; } 115: return 1; 116: } 117: 118: # =================================================================== Phase one 119: 120: sub print_username_entry_form { 121: my $r=shift; 122: my $defdom=$ENV{'request.role.domain'}; 123: my @domains = &Apache::loncommon::get_domains(); 124: my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain'); 125: my $bodytag =&Apache::loncommon::bodytag('Create Users, Change User Privileges').&Apache::loncommon::help_open_menu('',undef,undef,'',282,'Instructor Interface'); 126: my $selscript=&Apache::loncommon::studentbrowser_javascript(); 127: my $sellink=&Apache::loncommon::selectstudent_link 128: ('crtuser','ccuname','ccdomain'); 129: my %existingroles=&my_custom_roles(); 130: my $choice=&Apache::loncommon::select_form('make new role','rolename', 131: ('make new role' => 'Generate new role ...',%existingroles)); 132: my %lt=&Apache::lonlocal::texthash( 133: 'siur' => "Set Individual User Roles", 134: 'usr' => "Username", 135: 'dom' => "Domain", 136: 'usrr' => "User Roles", 137: 'ecrp' => "Edit Custom Role Privileges", 138: 'nr' => "Name of Role", 139: 'cre' => "Custom Role Editor" 140: ); 141: my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); 142: my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles'); 143: $r->print(<<"ENDDOCUMENT"); 144: <html> 145: <head> 146: <title>The LearningOnline Network with CAPA</title> 147: $selscript 148: </head> 149: $bodytag 150: <form action="/adm/createuser" method="post" name="crtuser"> 151: <input type="hidden" name="phase" value="get_user_info"> 152: <h2>$lt{siur}$helpsiur</h2> 153: <table> 154: <tr><td>$lt{usr}:</td><td><input type="text" size="15" name="ccuname"> 155: </td><td rowspan="2">$sellink</td></tr><tr><td> 156: $lt{'dom'}:</td><td>$domform</td></tr> 157: </table> 158: <input name="userrole" type="submit" value="$lt{usrr}" /> 159: </form> 160: <form action="/adm/createuser" method="post" name="docustom"> 161: <input type="hidden" name="phase" value="selected_custom_edit"> 162: <h2>$lt{'ecrp'}$helpecpr</h2> 163: $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br /> 164: <input name="customeditor" type="submit" value="$lt{'cre'}" /> 165: </body> 166: </html> 167: ENDDOCUMENT 168: } 169: 170: # =================================================================== Phase two 171: sub print_user_modification_page { 172: my $r=shift; 173: my $ccuname=$ENV{'form.ccuname'}; 174: my $ccdomain=$ENV{'form.ccdomain'}; 175: 176: $ccuname=~s/\W//g; 177: $ccdomain=~s/\W//g; 178: 179: unless (($ccuname) && ($ccdomain)) { 180: &print_username_entry_form($r); 181: return; 182: } 183: 184: my $defdom=$ENV{'request.role.domain'}; 185: 186: my ($krbdef,$krbdefdom) = 187: &Apache::loncommon::get_kerberos_defaults($defdom); 188: 189: my %param = ( formname => 'document.cu', 190: kerb_def_dom => $krbdefdom, 191: kerb_def_auth => $krbdef 192: ); 193: $loginscript = &Apache::loncommon::authform_header(%param); 194: $authformkrb = &Apache::loncommon::authform_kerberos(%param); 195: 196: $ccuname=~s/\W//g; 197: $ccdomain=~s/\W//g; 198: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); 199: my $dc_setcourse_code = ''; 200: my $loaditem; 201: if ($ENV{'request.role'} =~ m-^dc\./(\w+)/$-) { 202: my $dcdom = $1; 203: $loaditem = qq|OnLoad="document.cu.coursedesc.value=''"|; 204: $dc_setcourse_code = <<"ENDSCRIPT"; 205: function setCourse() { 206: var course = document.cu.dccourse.value; 207: if (course != "") { 208: if (document.cu.dcdomain.value != document.cu.origdom.value) { 209: alert("You must select a course in the current domain"); 210: return; 211: } 212: var userrole = document.cu.role.options[document.cu.role.selectedIndex].value 213: var section=""; 214: var numsections = 0; 215: for (var i=0; i<document.cu.currsec.length; i++) { 216: if (document.cu.currsec.options[i].selected == true ) { 217: if (document.cu.currsec.options[i].value != "" && document.cu.currsec.options[i].value != null) { 218: if (numsections == 0) { 219: section = document.cu.currsec.options[i].value 220: numsections = 1; 221: } 222: else { 223: section = section + "," + document.cu.currsec.options[i].value 224: numsections ++; 225: } 226: } 227: } 228: } 229: if (document.cu.newsec.value != "" && document.cu.newsec.value != null) { 230: if (numsections == 0) { 231: section = document.cu.newsec.value 232: } 233: else { 234: section = section + "," + document.cu.newsec.value 235: } 236: var numsplit = document.cu.newsec.value.split(/,/g); 237: numsections = numsections + numsplit.length; 238: } 239: if ((userrole == 'st') && (numsections > 1)) { 240: alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.") 241: return; 242: } 243: if ((userrole == 'cc') && (numsections > 0)) { 244: alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections."); 245: section = ""; 246: } 247: var numcourse = getIndex(document.cu.dccourse); 248: if (numcourse == "-1") { 249: alert("There was a problem with your course selection"); 250: return 251: } 252: else { 253: var coursename = "_$dcdom"+"_"+course+"_"+userrole 254: document.cu.elements[numcourse].name = "act"+coursename 255: document.cu.elements[numcourse+4].name = "sec"+coursename 256: document.cu.elements[numcourse+4].value = section 257: document.cu.elements[numcourse+5].name = "start"+coursename 258: document.cu.elements[numcourse+6].name = "end"+coursename 259: } 260: } 261: document.cu.submit(); 262: } 263: 264: function getIndex(caller) { 265: for (var i=0;i<document.cu.elements.length;i++) { 266: if (document.cu.elements[i] == caller) { 267: return i; 268: } 269: } 270: return -1; 271: } 272: ENDSCRIPT 273: } 274: my $dochead =<<"ENDDOCHEAD"; 275: <html> 276: <head> 277: <title>The LearningOnline Network with CAPA</title> 278: <script type="text/javascript" language="Javascript"> 279: 280: function pclose() { 281: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms", 282: "height=350,width=350,scrollbars=no,menubar=no"); 283: parmwin.close(); 284: } 285: 286: $pjump_def 287: $dc_setcourse_code 288: 289: function dateset() { 290: eval("document.cu."+document.cu.pres_marker.value+ 291: ".value=document.cu.pres_value.value"); 292: pclose(); 293: } 294: 295: function setSections() { 296: var re1 = /^currsec_/; 297: for (var i=0;i<document.cu.elements.length;i++) { 298: var str = document.cu.elements[i].name; 299: var checkcurr = str.match(re1); 300: if (checkcurr != null) { 301: var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/; 302: if (document.cu.elements[i-1].checked == true) { 303: var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/; 304: match = re2.exec(str); 305: var role = match[1]; 306: if (role == 'cc') { 307: alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections."); 308: } 309: else { 310: var sections = ''; 311: var numsec = 0; 312: var sections; 313: for (var j=0; j<document.cu.elements[i].length; j++) { 314: if (document.cu.elements[i].options[j].selected == true ) { 315: if (document.cu.elements[i].options[j].value != "") { 316: if (numsec == 0) { 317: if (document.cu.elements[i].options[j].value != "") { 318: sections = document.cu.elements[i].options[j].value; 319: numsec ++; 320: } 321: } 322: else { 323: sections = sections + "," + document.cu.elements[i].options[j].value 324: numsec ++; 325: } 326: } 327: } 328: } 329: if (numsec > 0) { 330: if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) { 331: sections = sections + "," + document.cu.elements[i+1].value; 332: } 333: } 334: else { 335: sections = document.cu.elements[i+1].value; 336: } 337: var newsecs = document.cu.elements[i+1].value; 338: if (newsecs != null && newsecs != "") { 339: var numsplit = newsecs.split(/,/g); 340: numsec = numsec + numsplit.length; 341: } 342: if ((role == 'st') && (numsec > 1)) { 343: alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.") 344: return; 345: } 346: else { 347: document.cu.elements[i+2].value = sections; 348: } 349: } 350: } 351: } 352: } 353: document.cu.submit(); 354: } 355: </script> 356: </head> 357: ENDDOCHEAD 358: $r->print(&Apache::loncommon::bodytag( 359: 'Create Users, Change User Privileges',undef,$loaditem)); 360: my $forminfo =<<"ENDFORMINFO"; 361: <form action="/adm/createuser" method="post" name="cu"> 362: <input type="hidden" name="phase" value="update_user_data"> 363: <input type="hidden" name="ccuname" value="$ccuname"> 364: <input type="hidden" name="ccdomain" value="$ccdomain"> 365: <input type="hidden" name="pres_value" value="" > 366: <input type="hidden" name="pres_type" value="" > 367: <input type="hidden" name="pres_marker" value="" > 368: ENDFORMINFO 369: my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain); 370: my %incdomains; 371: my %inccourses; 372: foreach (values(%Apache::lonnet::hostdom)) { 373: $incdomains{$_}=1; 374: } 375: foreach (keys(%ENV)) { 376: if ($_=~/^user\.priv\.cm\.\/(\w+)\/(\w+)/) { 377: $inccourses{$1.'_'.$2}=1; 378: } 379: } 380: if ($uhome eq 'no_host') { 381: my $home_server_list= 382: '<option value="default" selected>default</option>'."\n". 383: &Apache::loncommon::home_server_option_list($ccdomain); 384: 385: my %lt=&Apache::lonlocal::texthash( 386: 'cnu' => "Create New User", 387: 'nu' => "New User", 388: 'id' => "in domain", 389: 'pd' => "Personal Data", 390: 'fn' => "First Name", 391: 'mn' => "Middle Name", 392: 'ln' => "Last Name", 393: 'gen' => "Generation", 394: 'idsn' => "ID/Student Number", 395: 'hs' => "Home Server", 396: 'lg' => "Login Data" 397: ); 398: my $genhelp=&Apache::loncommon::help_open_topic('Generation'); 399: &initialize_authen_forms(); 400: $r->print(<<ENDNEWUSER); 401: $dochead 402: <h1>$lt{'cnu'}</h1> 403: $forminfo 404: <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2> 405: <script type="text/javascript" language="Javascript"> 406: $loginscript 407: </script> 408: <input type='hidden' name='makeuser' value='1' /> 409: <h3>$lt{'pd'}</h3> 410: <p> 411: <table> 412: <tr><td>$lt{'fn'} </td> 413: <td><input type='text' name='cfirst' size='15' /></td></tr> 414: <tr><td>$lt{'mn'} </td> 415: <td><input type='text' name='cmiddle' size='15' /></td></tr> 416: <tr><td>$lt{'ln'} </td> 417: <td><input type='text' name='clast' size='15' /></td></tr> 418: <tr><td>$lt{'gen'}$genhelp</td> 419: <td><input type='text' name='cgen' size='5' /></td></tr> 420: </table> 421: $lt{'idsn'} <input type='text' name='cstid' size='15' /></p> 422: $lt{'hs'}: <select name="hserver" size="1"> $home_server_list </select> 423: <hr /> 424: <h3>$lt{'lg'}</h3> 425: <p>$generalrule </p> 426: <p>$authformkrb </p> 427: <p>$authformint </p> 428: <p>$authformfsys</p> 429: <p>$authformloc </p> 430: ENDNEWUSER 431: } else { # user already exists 432: my %lt=&Apache::lonlocal::texthash( 433: 'cup' => "Change User Privileges", 434: 'usr' => "User", 435: 'id' => "in domain", 436: 'fn' => "first name", 437: 'mn' => "middle name", 438: 'ln' => "last name", 439: 'gen' => "generation" 440: ); 441: $r->print(<<ENDCHANGEUSER); 442: $dochead 443: <h1>$lt{'cup'}</h1> 444: $forminfo 445: <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2> 446: ENDCHANGEUSER 447: # Get the users information 448: my %userenv = &Apache::lonnet::get('environment', 449: ['firstname','middlename','lastname','generation'], 450: $ccdomain,$ccuname); 451: my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname); 452: $r->print(<<END); 453: <hr /> 454: <table border="2"> 455: <tr> 456: <th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th> 457: </tr> 458: <tr> 459: END 460: foreach ('firstname','middlename','lastname','generation') { 461: if (&Apache::lonnet::allowed('mau',$ccdomain)) { 462: $r->print(<<"END"); 463: <td><input type="text" name="c$_" value="$userenv{$_}" size="15" /></td> 464: END 465: } else { 466: $r->print('<td>'.$userenv{$_}.'</td>'); 467: } 468: } 469: $r->print(<<END); 470: </tr> 471: </table> 472: END 473: # Build up table of user roles to allow revocation of a role. 474: my ($tmp) = keys(%rolesdump); 475: unless ($tmp =~ /^(con_lost|error)/i) { 476: my $now=time; 477: my %lt=&Apache::lonlocal::texthash( 478: 'rer' => "Revoke Existing Roles", 479: 'rev' => "Revoke", 480: 'del' => "Delete", 481: 'ren' => "Re-Enable", 482: 'rol' => "Role", 483: 'ext' => "Extent", 484: 'sta' => "Start", 485: 'end' => "End" 486: ); 487: my (%roletext,%sortrole,%roleclass,%rolepriv); 488: foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]); 489: my $b1=join('_',(split('_',$b))[1,0]); 490: return $a1 cmp $b1; 491: } keys(%rolesdump)) { 492: next if ($area =~ /^rolesdef/); 493: my $envkey=$area; 494: my $role = $rolesdump{$area}; 495: my $thisrole=$area; 496: $area =~ s/\_\w\w$//; 497: my ($role_code,$role_end_time,$role_start_time) = 498: split(/_/,$role); 499: # Is this a custom role? Get role owner and title. 500: my ($croleudom,$croleuname,$croletitle)= 501: ($role_code=~/^cr\/(\w+)\/(\w+)\/(\w+)$/); 502: my $bgcol='ffffff'; 503: my $allowed=0; 504: my $delallowed=0; 505: my $sortkey=$role_code; 506: my $class='Unknown'; 507: if ($area =~ /^\/(\w+)\/(\d\w+)/ ) { 508: $class='Course'; 509: my ($coursedom,$coursedir) = ($1,$2); 510: $sortkey.="\0$1"; 511: # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). 512: my %coursedata= 513: &Apache::lonnet::coursedescription($1.'_'.$2); 514: my $carea; 515: if (defined($coursedata{'description'})) { 516: $carea=$coursedata{'description'}. 517: '<br />'.&mt('Domain').': '.$coursedom.(' 'x8). 518: &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom); 519: $sortkey.="\0".$coursedata{'description'}; 520: } else { 521: $carea=&mt('Unavailable course').': '.$area; 522: $sortkey.="\0".&mt('Unavailable course').': '.$area; 523: } 524: $inccourses{$1.'_'.$2}=1; 525: if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) || 526: (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { 527: $allowed=1; 528: } 529: if ((&Apache::lonnet::allowed('dro',$1)) || 530: (&Apache::lonnet::allowed('dro',$ccdomain))) { 531: $delallowed=1; 532: } 533: # - custom role. Needs more info, too 534: if ($croletitle) { 535: if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) { 536: $allowed=1; 537: $thisrole.='.'.$role_code; 538: } 539: } 540: # Compute the background color based on $area 541: $bgcol=$1.'_'.$2; 542: $bgcol=~s/[^7-9a-e]//g; 543: $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6); 544: if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) { 545: $carea.='<br>Section/Group: '.$3; 546: $sortkey.="\0$3"; 547: } 548: $area=$carea; 549: } else { 550: $sortkey.="\0".$area; 551: # Determine if current user is able to revoke privileges 552: if ($area=~ /^\/(\w+)\//) { 553: if ((&Apache::lonnet::allowed('c'.$role_code,$1)) || 554: (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { 555: $allowed=1; 556: } 557: if (((&Apache::lonnet::allowed('dro',$1)) || 558: (&Apache::lonnet::allowed('dro',$ccdomain))) && 559: ($role_code ne 'dc')) { 560: $delallowed=1; 561: } 562: } else { 563: if (&Apache::lonnet::allowed('c'.$role_code,'/')) { 564: $allowed=1; 565: } 566: } 567: if ($role_code eq 'ca' || $role_code eq 'au') { 568: $class='Construction Space'; 569: } elsif ($role_code eq 'su') { 570: $class='System'; 571: } else { 572: $class='Domain'; 573: } 574: } 575: if ($role_code eq 'ca') { 576: $area=~/\/(\w+)\/(\w+)/; 577: if (&authorpriv($2,$1)) { 578: $allowed=1; 579: } else { 580: $allowed=0; 581: } 582: } 583: $bgcol='77FF77'; 584: my $row = ''; 585: $row.='<tr bgcolor="#'.$bgcol.'"><td>'; 586: my $active=1; 587: $active=0 if (($role_end_time) && ($now>$role_end_time)); 588: if (($active) && ($allowed)) { 589: $row.= '<input type="checkbox" name="rev:'.$thisrole.'">'; 590: } else { 591: if ($active) { 592: $row.=' '; 593: } else { 594: $row.=&mt('expired or revoked'); 595: } 596: } 597: $row.='</td><td>'; 598: if ($allowed && !$active) { 599: $row.= '<input type="checkbox" name="ren:'.$thisrole.'">'; 600: } else { 601: $row.=' '; 602: } 603: $row.='</td><td>'; 604: if ($delallowed) { 605: $row.= '<input type="checkbox" name="del:'.$thisrole.'">'; 606: } else { 607: $row.=' '; 608: } 609: my $plaintext=''; 610: unless ($croletitle) { 611: $plaintext=&Apache::lonnet::plaintext($role_code); 612: } else { 613: $plaintext= 614: "Customrole '$croletitle' defined by $croleuname\@$croleudom"; 615: } 616: $row.= '</td><td>'.$plaintext. 617: '</td><td>'.$area. 618: '</td><td>'.($role_start_time?localtime($role_start_time) 619: : ' ' ). 620: '</td><td>'.($role_end_time ?localtime($role_end_time) 621: : ' ' ) 622: ."</td></tr>\n"; 623: $sortrole{$sortkey}=$envkey; 624: $roletext{$envkey}=$row; 625: $roleclass{$envkey}=$class; 626: $rolepriv{$envkey}=$allowed; 627: #$r->print($row); 628: } # end of foreach (table building loop) 629: my $rolesdisplay = 0; 630: my %output = (); 631: foreach my $type ('Construction Space','Course','Domain','System','Unknown') { 632: $output{$type} = ''; 633: foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) { 634: if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { 635: $output{$type}.=$roletext{$sortrole{$which}}; 636: } 637: } 638: unless($output{$type} eq '') { 639: $output{$type} = "<tr bgcolor='#BBffBB'>". 640: "<td align='center' colspan='7'>".&mt($type)."</td>". 641: $output{$type}; 642: $rolesdisplay = 1; 643: } 644: } 645: if ($rolesdisplay == 1) { 646: $r->print(<<END); 647: <hr /> 648: <h3>$lt{'rer'}</h3> 649: <table> 650: <tr><th>$lt{'rev'}</th><th>$lt{'ren'}</th><th>$lt{'del'}</th><th>$lt{'rol'}</th><th>$lt{'e 651: xt'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th> 652: END 653: foreach my $type ('Construction Space','Course','Domain','System','Unknown') { 654: if ($output{$type}) { 655: $r->print($output{$type}."\n"); 656: } 657: } 658: $r->print('</table>'); 659: } 660: } # End of unless 661: my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain); 662: if ($currentauth=~/^krb(4|5):/) { 663: $currentauth=~/^krb(4|5):(.*)/; 664: my $krbdefdom=$1; 665: my %param = ( formname => 'document.cu', 666: kerb_def_dom => $krbdefdom 667: ); 668: $loginscript = &Apache::loncommon::authform_header(%param); 669: } 670: # Check for a bad authentication type 671: unless ($currentauth=~/^krb(4|5):/ or 672: $currentauth=~/^unix:/ or 673: $currentauth=~/^internal:/ or 674: $currentauth=~/^localauth:/ 675: ) { # bad authentication scheme 676: if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) { 677: &initialize_authen_forms(); 678: my %lt=&Apache::lonlocal::texthash( 679: 'err' => "ERROR", 680: 'uuas' => "This user has an unrecognized authentication scheme", 681: 'sldb' => "Please specify login data below", 682: 'ld' => "Login Data" 683: ); 684: $r->print(<<ENDBADAUTH); 685: <hr /> 686: <script type="text/javascript" language="Javascript"> 687: $loginscript 688: </script> 689: <font color='#ff0000'>$lt{'err'}:</font> 690: $lt{'uuas'} ($currentauth). $lt{'sldb'}. 691: <h3>$lt{'ld'}</h3> 692: <p>$generalrule</p> 693: <p>$authformkrb</p> 694: <p>$authformint</p> 695: <p>$authformfsys</p> 696: <p>$authformloc</p> 697: ENDBADAUTH 698: } else { 699: # This user is not allowed to modify the users 700: # authentication scheme, so just notify them of the problem 701: my %lt=&Apache::lonlocal::texthash( 702: 'err' => "ERROR", 703: 'uuas' => "This user has an unrecognized authentication scheme", 704: 'adcs' => "Please alert a domain coordinator of this situation" 705: ); 706: $r->print(<<ENDBADAUTH); 707: <hr /> 708: <script type="text/javascript" language="Javascript"> 709: $loginscript 710: </script> 711: <font color="#ff0000"> $lt{'err'}: </font> 712: $lt{'uuas'} ($currentauth). $lt{'adcs'}. 713: <hr /> 714: ENDBADAUTH 715: } 716: } else { # Authentication type is valid 717: my $authformcurrent=''; 718: my $authform_other=''; 719: &initialize_authen_forms(); 720: if ($currentauth=~/^krb(4|5):/) { 721: $authformcurrent=$authformkrb; 722: $authform_other="<p>$authformint</p>\n". 723: "<p>$authformfsys</p><p>$authformloc</p>"; 724: } 725: elsif ($currentauth=~/^internal:/) { 726: $authformcurrent=$authformint; 727: $authform_other="<p>$authformkrb</p>". 728: "<p>$authformfsys</p><p>$authformloc</p>"; 729: } 730: elsif ($currentauth=~/^unix:/) { 731: $authformcurrent=$authformfsys; 732: $authform_other="<p>$authformkrb</p>". 733: "<p>$authformint</p><p>$authformloc;</p>"; 734: } 735: elsif ($currentauth=~/^localauth:/) { 736: $authformcurrent=$authformloc; 737: $authform_other="<p>$authformkrb</p>". 738: "<p>$authformint</p><p>$authformfsys</p>"; 739: } 740: $authformcurrent.=' <i>(will override current values)</i><br />'; 741: if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) { 742: # Current user has login modification privileges 743: my %lt=&Apache::lonlocal::texthash( 744: 'ccld' => "Change Current Login Data", 745: 'enld' => "Enter New Login Data" 746: ); 747: $r->print(<<ENDOTHERAUTHS); 748: <hr /> 749: <script type="text/javascript" language="Javascript"> 750: $loginscript 751: </script> 752: <h3>$lt{'ccld'}</h3> 753: <p>$generalrule</p> 754: <p>$authformnop</p> 755: <p>$authformcurrent</p> 756: <h3>$lt{'enld'}</h3> 757: $authform_other 758: ENDOTHERAUTHS 759: } 760: } ## End of "check for bad authentication type" logic 761: } ## End of new user/old user logic 762: $r->print('<hr /><h3>'.&mt('Add Roles').'</h3>'); 763: # 764: # Co-Author 765: # 766: if (&authorpriv($ENV{'user.name'},$ENV{'request.role.domain'}) && 767: ($ENV{'user.name'} ne $ccuname || $ENV{'user.domain'} ne $ccdomain)) { 768: # No sense in assigning co-author role to yourself 769: my $cuname=$ENV{'user.name'}; 770: my $cudom=$ENV{'request.role.domain'}; 771: my %lt=&Apache::lonlocal::texthash( 772: 'cs' => "Construction Space", 773: 'act' => "Activate", 774: 'rol' => "Role", 775: 'ext' => "Extent", 776: 'sta' => "Start", 777: 'end' => "End", 778: 'cau' => "Co-Author", 779: 'ssd' => "Set Start Date", 780: 'sed' => "Set End Date" 781: ); 782: $r->print(<<ENDCOAUTH); 783: <h4>$lt{'cs'}</h4> 784: <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th> 785: <th>$lt{'sta'}</th><th>$lt{'end'}</th></tr> 786: <tr> 787: <td><input type=checkbox name="act_$cudom\_$cuname\_ca" /></td> 788: <td>$lt{'cau'}</td> 789: <td>$cudom\_$cuname</td> 790: <td><input type=hidden name="start_$cudom\_$cuname\_ca" value='' /> 791: <a href= 792: "javascript:pjump('date_start','Start Date Co-Author',document.cu.start_$cudom\_$cuname\_ca.value,'start_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'ssd'}</a></td> 793: <td><input type=hidden name="end_$cudom\_$cuname\_ca" value='' /> 794: <a href= 795: "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td> 796: </tr> 797: </table> 798: ENDCOAUTH 799: } 800: # 801: # Domain level 802: # 803: my $num_domain_level = 0; 804: my $domaintext = 805: '<h4>'.&mt('Domain Level').'</h4>'. 806: '<table border=2><tr><th>'.&mt('Activate').'</th><th>'.&mt('Role').'</th><th>'.&mt('Extent').'</th>'. 807: '<th>'.&mt('Start').'</th><th>'.&mt('End').'</th></tr>'; 808: foreach ( sort( keys(%incdomains))) { 809: my $thisdomain=$_; 810: foreach ('dc','li','dg','au','sc') { 811: if (&Apache::lonnet::allowed('c'.$_,$thisdomain)) { 812: my $plrole=&Apache::lonnet::plaintext($_); 813: my %lt=&Apache::lonlocal::texthash( 814: 'ssd' => "Set Start Date", 815: 'sed' => "Set End Date" 816: ); 817: $num_domain_level ++; 818: $domaintext .= <<"ENDDROW"; 819: <tr> 820: <td><input type=checkbox name="act_$thisdomain\_$_"></td> 821: <td>$plrole</td> 822: <td>$thisdomain</td> 823: <td><input type=hidden name="start_$thisdomain\_$_" value=''> 824: <a href= 825: "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$thisdomain\_$_.value,'start_$thisdomain\_$_','cu.pres','dateset')">$lt{'ssd'}</a></td> 826: <td><input type=hidden name="end_$thisdomain\_$_" value=''> 827: <a href= 828: "javascript:pjump('date_end','End Date $plrole',document.cu.end_$thisdomain\_$_.value,'end_$thisdomain\_$_','cu.pres','dateset')">$lt{'sed'}</a></td> 829: </tr> 830: ENDDROW 831: } 832: } 833: } 834: $domaintext.='</table>'; 835: if ($num_domain_level > 0) { 836: $r->print($domaintext); 837: } 838: # 839: # Course level 840: # 841: my $num_sections; 842: 843: if ($ENV{'request.role'} =~ m-^dc\./(\w+)/$-) { 844: $r->print(&course_level_dc($1)); 845: $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n"); 846: } else { 847: $r->print(&course_level_table(%inccourses)); 848: $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()">'."\n"); 849: } 850: $r->print("</form></body></html>"); 851: } 852: 853: # ================================================================= Phase Three 854: sub update_user_data { 855: my $r=shift; 856: my $uhome=&Apache::lonnet::homeserver($ENV{'form.ccuname'}, 857: $ENV{'form.ccdomain'}); 858: # Error messages 859: my $error = '<font color="#ff0000">'.&mt('Error').':</font>'; 860: my $end = '</body></html>'; 861: # Print header 862: $r->print(<<ENDTHREEHEAD); 863: <html> 864: <head> 865: <title>The LearningOnline Network with CAPA</title> 866: </head> 867: ENDTHREEHEAD 868: my $title; 869: if (exists($ENV{'form.makeuser'})) { 870: $title='Set Privileges for New User'; 871: } else { 872: $title='Modify User Privileges'; 873: } 874: $r->print(&Apache::loncommon::bodytag($title)); 875: # Check Inputs 876: if (! $ENV{'form.ccuname'} ) { 877: $r->print($error.&mt('No login name specified').'.'.$end); 878: return; 879: } 880: if ( $ENV{'form.ccuname'} =~/\W/) { 881: $r->print($error.&mt('Invalid login name').'. '. 882: &mt('Only letters, numbers, and underscores are valid').'.'. 883: $end); 884: return; 885: } 886: if (! $ENV{'form.ccdomain'} ) { 887: $r->print($error.&mt('No domain specified').'.'.$end); 888: return; 889: } 890: if ( $ENV{'form.ccdomain'} =~/\W/) { 891: $r->print($error.&mt ('Invalid domain name').'. '. 892: &mt('Only letters, numbers, and underscores are valid').'.'. 893: $end); 894: return; 895: } 896: if (! exists($ENV{'form.makeuser'})) { 897: # Modifying an existing user, so check the validity of the name 898: if ($uhome eq 'no_host') { 899: $r->print($error.&mt('Unable to determine home server for '). 900: $ENV{'form.ccuname'}.&mt(' in domain '). 901: $ENV{'form.ccdomain'}.'.'); 902: return; 903: } 904: } 905: # Determine authentication method and password for the user being modified 906: my $amode=''; 907: my $genpwd=''; 908: if ($ENV{'form.login'} eq 'krb') { 909: $amode='krb'; 910: $amode.=$ENV{'form.krbver'}; 911: $genpwd=$ENV{'form.krbarg'}; 912: } elsif ($ENV{'form.login'} eq 'int') { 913: $amode='internal'; 914: $genpwd=$ENV{'form.intarg'}; 915: } elsif ($ENV{'form.login'} eq 'fsys') { 916: $amode='unix'; 917: $genpwd=$ENV{'form.fsysarg'}; 918: } elsif ($ENV{'form.login'} eq 'loc') { 919: $amode='localauth'; 920: $genpwd=$ENV{'form.locarg'}; 921: $genpwd=" " if (!$genpwd); 922: } elsif (($ENV{'form.login'} eq 'nochange') || 923: ($ENV{'form.login'} eq '' )) { 924: # There is no need to tell the user we did not change what they 925: # did not ask us to change. 926: # If they are creating a new user but have not specified login 927: # information this will be caught below. 928: } else { 929: $r->print($error.&mt('Invalid login mode or password').$end); 930: return; 931: } 932: if ($ENV{'form.makeuser'}) { 933: # Create a new user 934: my %lt=&Apache::lonlocal::texthash( 935: 'cru' => "Creating user", 936: 'id' => "in domain" 937: ); 938: $r->print(<<ENDNEWUSERHEAD); 939: <h3>$lt{'cru'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h3> 940: ENDNEWUSERHEAD 941: # Check for the authentication mode and password 942: if (! $amode || ! $genpwd) { 943: $r->print($error.&mt('Invalid login mode or password').$end); 944: return; 945: } 946: # Determine desired host 947: my $desiredhost = $ENV{'form.hserver'}; 948: if (lc($desiredhost) eq 'default') { 949: $desiredhost = undef; 950: } else { 951: my %home_servers = &Apache::loncommon::get_library_servers 952: ($ENV{'form.ccdomain'}); 953: if (! exists($home_servers{$desiredhost})) { 954: $r->print($error.&mt('Invalid home server specified')); 955: return; 956: } 957: } 958: # Call modifyuser 959: my $result = &Apache::lonnet::modifyuser 960: ($ENV{'form.ccdomain'},$ENV{'form.ccuname'},$ENV{'form.cstid'}, 961: $amode,$genpwd,$ENV{'form.cfirst'}, 962: $ENV{'form.cmiddle'},$ENV{'form.clast'},$ENV{'form.cgen'}, 963: undef,$desiredhost 964: ); 965: $r->print(&mt('Generating user').': '.$result); 966: my $home = &Apache::lonnet::homeserver($ENV{'form.ccuname'}, 967: $ENV{'form.ccdomain'}); 968: $r->print('<br />'.&mt('Home server').': '.$home.' '. 969: $Apache::lonnet::libserv{$home}); 970: } elsif (($ENV{'form.login'} ne 'nochange') && 971: ($ENV{'form.login'} ne '' )) { 972: # Modify user privileges 973: my %lt=&Apache::lonlocal::texthash( 974: 'usr' => "User", 975: 'id' => "in domain" 976: ); 977: $r->print(<<ENDMODIFYUSERHEAD); 978: <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2> 979: ENDMODIFYUSERHEAD 980: if (! $amode || ! $genpwd) { 981: $r->print($error.'Invalid login mode or password'.$end); 982: return; 983: } 984: # Only allow authentification modification if the person has authority 985: if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'})) { 986: $r->print('Modifying authentication: '. 987: &Apache::lonnet::modifyuserauth( 988: $ENV{'form.ccdomain'},$ENV{'form.ccuname'}, 989: $amode,$genpwd)); 990: $r->print('<br>'.&mt('Home server').': '.&Apache::lonnet::homeserver 991: ($ENV{'form.ccuname'},$ENV{'form.ccdomain'})); 992: } else { 993: # Okay, this is a non-fatal error. 994: $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'); 995: } 996: } 997: ## 998: if (! $ENV{'form.makeuser'} ) { 999: # Check for need to change 1000: my %userenv = &Apache::lonnet::get 1001: ('environment',['firstname','middlename','lastname','generation'], 1002: $ENV{'form.ccdomain'},$ENV{'form.ccuname'}); 1003: my ($tmp) = keys(%userenv); 1004: if ($tmp =~ /^(con_lost|error)/i) { 1005: %userenv = (); 1006: } 1007: # Check to see if we need to change user information 1008: foreach ('firstname','middlename','lastname','generation') { 1009: # Strip leading and trailing whitespace 1010: $ENV{'form.c'.$_} =~ s/(\s+$|^\s+)//g; 1011: } 1012: if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'}) && 1013: ($ENV{'form.cfirstname'} ne $userenv{'firstname'} || 1014: $ENV{'form.cmiddlename'} ne $userenv{'middlename'} || 1015: $ENV{'form.clastname'} ne $userenv{'lastname'} || 1016: $ENV{'form.cgeneration'} ne $userenv{'generation'} )) { 1017: # Make the change 1018: my %changeHash; 1019: $changeHash{'firstname'} = $ENV{'form.cfirstname'}; 1020: $changeHash{'middlename'} = $ENV{'form.cmiddlename'}; 1021: $changeHash{'lastname'} = $ENV{'form.clastname'}; 1022: $changeHash{'generation'} = $ENV{'form.cgeneration'}; 1023: my $putresult = &Apache::lonnet::put 1024: ('environment',\%changeHash, 1025: $ENV{'form.ccdomain'},$ENV{'form.ccuname'}); 1026: if ($putresult eq 'ok') { 1027: # Tell the user we changed the name 1028: my %lt=&Apache::lonlocal::texthash( 1029: 'uic' => "User Information Changed", 1030: 'frst' => "first", 1031: 'mddl' => "middle", 1032: 'lst' => "last", 1033: 'gen' => "generation", 1034: 'prvs' => "Previous", 1035: 'chto' => "Changed To" 1036: ); 1037: $r->print(<<"END"); 1038: <table border="2"> 1039: <caption>$lt{'uic'}</caption> 1040: <tr><th> </th> 1041: <th>$lt{'frst'}</th> 1042: <th>$lt{'mddl'}</th> 1043: <th>$lt{'lst'}</th> 1044: <th>$lt{'gen'}</th></tr> 1045: <tr><td>$lt{'prvs'}</td> 1046: <td>$userenv{'firstname'} </td> 1047: <td>$userenv{'middlename'} </td> 1048: <td>$userenv{'lastname'} </td> 1049: <td>$userenv{'generation'} </td></tr> 1050: <tr><td>$lt{'chto'}</td> 1051: <td>$ENV{'form.cfirstname'} </td> 1052: <td>$ENV{'form.cmiddlename'} </td> 1053: <td>$ENV{'form.clastname'} </td> 1054: <td>$ENV{'form.cgeneration'} </td></tr> 1055: </table> 1056: END 1057: } else { # error occurred 1058: $r->print("<h2>".&mt('Unable to successfully change environment for')." ". 1059: $ENV{'form.ccuname'}." ".&mt('in domain')." ". 1060: $ENV{'form.ccdomain'}."</h2>"); 1061: } 1062: } else { # End of if ($ENV ... ) logic 1063: # They did not want to change the users name but we can 1064: # still tell them what the name is 1065: my %lt=&Apache::lonlocal::texthash( 1066: 'usr' => "User", 1067: 'id' => "in domain", 1068: 'gen' => "Generation" 1069: ); 1070: $r->print(<<"END"); 1071: <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2> 1072: <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} </h4> 1073: <h4>$lt{'gen'}: $userenv{'generation'}</h4> 1074: END 1075: } 1076: } 1077: ## 1078: my $now=time; 1079: $r->print('<h3>'.&mt('Modifying Roles').'</h3>'); 1080: foreach (keys (%ENV)) { 1081: next if (! $ENV{$_}); 1082: # Revoke roles 1083: if ($_=~/^form\.rev/) { 1084: if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) { 1085: # Revoke standard role 1086: $r->print(&mt('Revoking').' '.$2.' in '.$1.': <b>'. 1087: &Apache::lonnet::revokerole($ENV{'form.ccdomain'}, 1088: $ENV{'form.ccuname'},$1,$2).'</b><br>'); 1089: if ($2 eq 'st') { 1090: $1=~/^\/(\w+)\/(\w+)/; 1091: my $cid=$1.'_'.$2; 1092: $r->print(&mt('Drop from classlist').': <b>'. 1093: &Apache::lonnet::critical('put:'. 1094: $ENV{'course.'.$cid.'.domain'}.':'. 1095: $ENV{'course.'.$cid.'.num'}.':classlist:'. 1096: &Apache::lonnet::escape($ENV{'form.ccuname'}.':'. 1097: $ENV{'form.ccdomain'}).'='. 1098: &Apache::lonnet::escape($now.':'), 1099: $ENV{'course.'.$cid.'.home'}).'</b><br>'); 1100: } 1101: } 1102: if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) { 1103: # Revoke custom role 1104: $r->print(&mt('Revoking custom role'). 1105: ' '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'. 1106: &Apache::lonnet::revokecustomrole($ENV{'form.ccdomain'}, 1107: $ENV{'form.ccuname'},$1,$2,$3,$4). 1108: '</b><br>'); 1109: } 1110: } elsif ($_=~/^form\.del/) { 1111: if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) { 1112: $r->print(&mt('Deleting').' '.$2.' in '.$1.': '. 1113: &Apache::lonnet::assignrole($ENV{'form.ccdomain'}, 1114: $ENV{'form.ccuname'},$1,$2,$now,0,1).'<br>'); 1115: if ($2 eq 'st') { 1116: $1=~/^\/(\w+)\/(\w+)/; 1117: my $cid=$1.'_'.$2; 1118: $r->print(&mt('Drop from classlist').': <b>'. 1119: &Apache::lonnet::critical('put:'. 1120: $ENV{'course.'.$cid.'.domain'}.':'. 1121: $ENV{'course.'.$cid.'.num'}.':classlist:'. 1122: &Apache::lonnet::escape($ENV{'form.ccuname'}.':'. 1123: $ENV{'form.ccdomain'}).'='. 1124: &Apache::lonnet::escape($now.':'), 1125: $ENV{'course.'.$cid.'.home'}).'</b><br>'); 1126: } 1127: } 1128: } elsif ($_=~/^form\.ren/) { 1129: if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) { 1130: my $url = $1; 1131: my $role = $2; 1132: my $logmsg; 1133: my $output; 1134: if ($role eq 'st') { 1135: if ($url =~ m-^/(\w+)/(\w+)/?(\w*)$-) { 1136: my $result = &commit_studentrole(\$logmsg,$url,$role,$now,0,$1,$2,$3); 1137: if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { 1138: $output = "Error: $result\n"; 1139: } else { 1140: $output = &mt('Assigning').' '.$role.' in '.$url. 1141: &mt('starting').' '.localtime($now). 1142: ': <br />'.$logmsg.'<br />'. 1143: &mt('Add to classlist').': <b>ok</b><br />'; 1144: } 1145: } 1146: } else { 1147: my $result=&Apache::lonnet::assignrole($ENV{'form.ccdomain'}, 1148: $ENV{'form.ccuname'},$url,$role,0,$now); 1149: $output = &mt('Re-Enabling [_1] in [_2]: [_3]', 1150: $role,$url,$result).'<br />'; 1151: } 1152: $r->print($output); 1153: } 1154: } elsif ($_=~/^form\.act/) { 1155: if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) { 1156: # Activate a custom role 1157: my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5); 1158: my $url='/'.$one.'/'.$two; 1159: my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five; 1160: 1161: my $start = ( $ENV{'form.start_'.$full} ? 1162: $ENV{'form.start_'.$full} : 1163: $now ); 1164: my $end = ( $ENV{'form.end_'.$full} ? 1165: $ENV{'form.end_'.$full} : 1166: 0 ); 1167: 1168: # split multiple sections 1169: my %sections = (); 1170: my $num_sections = &build_roles($ENV{'form.sec_'.$full},\%sections,$5); 1171: if ($num_sections == 0) { 1172: $r->print(&commit_customrole($url,$three,$four,$five,$start,$end)); 1173: } else { 1174: foreach (sort {$a cmp $b} keys %sections) { 1175: my $securl = $url.'/'.$_; 1176: $r->print(&commit_customrole($securl,$three,$four,$five,$start,$end)); 1177: } 1178: } 1179: } elsif ($_=~/^form\.act\_([^\_]+)\_(\w+)\_([^\_]+)$/) { 1180: # Activate roles for sections with 3 id numbers 1181: # set start, end times, and the url for the class 1182: my ($one,$two,$three)=($1,$2,$3); 1183: my $start = ( $ENV{'form.start_'.$one.'_'.$two.'_'.$three} ? 1184: $ENV{'form.start_'.$one.'_'.$two.'_'.$three} : 1185: $now ); 1186: my $end = ( $ENV{'form.end_'.$one.'_'.$two.'_'.$three} ? 1187: $ENV{'form.end_'.$one.'_'.$two.'_'.$three} : 1188: 0 ); 1189: my $url='/'.$one.'/'.$two; 1190: my $type = 'three'; 1191: # split multiple sections 1192: my %sections = (); 1193: my $num_sections = &build_roles($ENV{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three); 1194: if ($num_sections == 0) { 1195: $r->print(&commit_standardrole($url,$three,$start,$end,$one,$two,'')); 1196: } else { 1197: my $emptysec = 0; 1198: foreach my $sec (sort {$a cmp $b} keys %sections) { 1199: $sec =~ s/\W//g; 1200: if ($sec ne '') { 1201: my $securl = $url.'/'.$sec; 1202: $r->print(&commit_standardrole($securl,$three,$start,$end,$one,$two,$sec)); 1203: } else { 1204: $emptysec = 1; 1205: } 1206: } 1207: if ($emptysec) { 1208: $r->print(&commit_standardrole($url,$three,$start,$end,$one,$two,'')); 1209: } 1210: } 1211: } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) { 1212: # Activate roles for sections with two id numbers 1213: # set start, end times, and the url for the class 1214: my $start = ( $ENV{'form.start_'.$1.'_'.$2} ? 1215: $ENV{'form.start_'.$1.'_'.$2} : 1216: $now ); 1217: my $end = ( $ENV{'form.end_'.$1.'_'.$2} ? 1218: $ENV{'form.end_'.$1.'_'.$2} : 1219: 0 ); 1220: my $url='/'.$1.'/'; 1221: # split multiple sections 1222: my %sections = (); 1223: my $num_sections = &build_roles($ENV{'form.sec_'.$1.'_'.$2},\%sections,$2); 1224: if ($num_sections == 0) { 1225: $r->print(&commit_standardrole($url,$2,$start,$end,$1,undef,'')); 1226: } else { 1227: my $emptysec = 0; 1228: foreach my $sec (sort {$a cmp $b} keys %sections) { 1229: if ($sec ne '') { 1230: my $securl = $url.'/'.$sec; 1231: $r->print(&commit_standardrole($securl,$2,$start,$end,$1,undef,$sec)); 1232: } else { 1233: $emptysec = 1; 1234: } 1235: } 1236: if ($emptysec) { 1237: $r->print(&commit_standardrole($url,$2,$start,$end,$1,undef,'')); 1238: } 1239: } 1240: } else { 1241: $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br>'); 1242: } 1243: } 1244: } # End of foreach (keys(%ENV)) 1245: # Flush the course logs so reverse user roles immediately updated 1246: &Apache::lonnet::flushcourselogs(); 1247: $r->print('</body></html>'); 1248: } 1249: 1250: sub commit_customrole { 1251: my ($url,$three,$four,$five,$start,$end) = @_; 1252: my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url. 1253: ($start?', '.&mt('starting').' '.localtime($start):''). 1254: ($end?', ending '.localtime($end):'').': <b>'. 1255: &Apache::lonnet::assigncustomrole( 1256: $ENV{'form.ccdomain'},$ENV{'form.ccuname'},$url,$three,$four,$five,$end,$start). 1257: '</b><br>'; 1258: return $output; 1259: } 1260: 1261: sub commit_standardrole { 1262: my ($url,$three,$start,$end,$one,$two,$sec) = @_; 1263: my $output; 1264: my $logmsg; 1265: if ($three eq 'st') { 1266: my $result = &commit_studentrole(\$logmsg,$url,$three,$start,$end,$one,$two,$sec); 1267: if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { 1268: $output = "Error: $result\n"; 1269: } else { 1270: $output = &mt('Assigning').' '.$three.' in '.$url. 1271: ($start?', '.&mt('starting').' '.localtime($start):''). 1272: ($end?', '.&mt('ending').' '.localtime($end):''). 1273: ': <b>'.$result.'</b><br />'. 1274: &mt('Add to classlist').': <b>ok</b><br />'; 1275: } 1276: } else { 1277: $output = &mt('Assigning').' '.$three.' in '.$url. 1278: ($start?', '.&mt('starting').' '.localtime($start):''). 1279: ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'. 1280: &Apache::lonnet::assignrole( 1281: $ENV{'form.ccdomain'},$ENV{'form.ccuname'}, 1282: $url,$three,$end,$start). 1283: '</b><br>'; 1284: } 1285: return $output; 1286: } 1287: 1288: sub commit_studentrole { 1289: my ($logmsg,$url,$three,$start,$end,$one,$two,$sec) = @_; 1290: my $udom = $ENV{'form.ccdomain'}; 1291: my $uname = $ENV{'form.ccuname'}; 1292: my $linefeed = '<br />'."\n"; 1293: my $result; 1294: if (defined($one) && defined($two)) { 1295: my $cid=$one.'_'.$two; 1296: my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid); 1297: my $secchange = 0; 1298: my $expire_role_result; 1299: my $modify_section_result; 1300: unless ($oldsec eq '-1') { 1301: unless ($sec eq $oldsec) { 1302: $secchange = 1; 1303: my $uurl='/'.$cid; 1304: $uurl=~s/\_/\//g; 1305: if ($oldsec) { 1306: $uurl.='/'.$oldsec; 1307: } 1308: $expire_role_result = &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',time); 1309: $result = $expire_role_result; 1310: } 1311: } 1312: if (($expire_role_result eq 'ok') || ($secchange == 0)) { 1313: $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid); 1314: if ($modify_section_result =~ /^ok/) { 1315: if ($secchange == 1) { 1316: $$logmsg .= "Section for $uname switched from old section: $oldsec to new section: $sec".$linefeed; 1317: } elsif ($oldsec eq '-1') { 1318: $$logmsg .= "New student role for $uname in section $sec in course $cid".$linefeed; 1319: } else { 1320: $$logmsg .= "Student $uname assigned to unchanged section $sec in course $cid".$linefeed; 1321: } 1322: } else { 1323: $$logmsg .= "Error when attempting section change for $uname from old section $oldsec to new section: $sec in course $cid -error: $modify_section_result".$linefeed; 1324: } 1325: $result = $modify_section_result; 1326: } elsif ($secchange == 1) { 1327: $$logmsg .= "Error when attempting to expire role for $uname in old section $oldsec in course $cid -error: $expire_role_result".$linefeed; 1328: } 1329: } else { 1330: $$logmsg .= "Incomplete course id defined. Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed"; 1331: $result = "Error: incomplete course id\n"; 1332: } 1333: return $result; 1334: } 1335: 1336: sub build_roles { 1337: my ($sectionstr,$sections,$role) = @_; 1338: my $num_sections = 0; 1339: if ($sectionstr=~ /,/) { 1340: my @secnums = split/,/,$sectionstr; 1341: if ($role eq 'st') { 1342: $secnums[0] =~ s/\W//g; 1343: $$sections{$secnums[0]} = 1; 1344: $num_sections = 1; 1345: } else { 1346: foreach my $sec (@secnums) { 1347: $sec =~ ~s/\W//g; 1348: unless ($sec eq "") { 1349: if (exists($$sections{$sec})) { 1350: $$sections{$sec} ++; 1351: } else { 1352: $$sections{$sec} = 1; 1353: $num_sections ++; 1354: } 1355: } 1356: } 1357: } 1358: } else { 1359: $sectionstr=~s/\W//g; 1360: unless ($sectionstr eq '') { 1361: $$sections{$sectionstr} = 1; 1362: $num_sections ++; 1363: } 1364: } 1365: 1366: return $num_sections; 1367: } 1368: 1369: # ========================================================== Custom Role Editor 1370: 1371: sub custom_role_editor { 1372: my $r=shift; 1373: my $rolename=$ENV{'form.rolename'}; 1374: 1375: if ($rolename eq 'make new role') { 1376: $rolename=$ENV{'form.newrolename'}; 1377: } 1378: 1379: $rolename=~s/[^A-Za-z0-9]//gs; 1380: 1381: unless ($rolename) { 1382: &print_username_entry_form($r); 1383: return; 1384: } 1385: 1386: $r->print(&Apache::loncommon::bodytag( 1387: 'Create Users, Change User Privileges').'<h2>'); 1388: my $syspriv=''; 1389: my $dompriv=''; 1390: my $coursepriv=''; 1391: my ($rdummy,$roledef)= 1392: &Apache::lonnet::get('roles',["rolesdef_$rolename"]); 1393: # ------------------------------------------------------- Does this role exist? 1394: if (($rdummy ne 'con_lost') && ($roledef ne '')) { 1395: $r->print(&mt('Existing Role').' "'); 1396: # ------------------------------------------------- Get current role privileges 1397: ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef); 1398: } else { 1399: $r->print(&mt('New Role').' "'); 1400: $roledef=''; 1401: } 1402: $r->print($rolename.'"</h2>'); 1403: # ------------------------------------------------------- What can be assigned? 1404: my %full=(); 1405: my %courselevel=(); 1406: my %courselevelcurrent=(); 1407: foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) { 1408: my ($priv,$restrict)=split(/\&/,$_); 1409: unless ($restrict) { $restrict='F'; } 1410: $courselevel{$priv}=$restrict; 1411: if ($coursepriv=~/\:$priv/) { 1412: $courselevelcurrent{$priv}=1; 1413: } 1414: $full{$priv}=1; 1415: } 1416: my %domainlevel=(); 1417: my %domainlevelcurrent=(); 1418: foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) { 1419: my ($priv,$restrict)=split(/\&/,$_); 1420: unless ($restrict) { $restrict='F'; } 1421: $domainlevel{$priv}=$restrict; 1422: if ($dompriv=~/\:$priv/) { 1423: $domainlevelcurrent{$priv}=1; 1424: } 1425: $full{$priv}=1; 1426: } 1427: my %systemlevel=(); 1428: my %systemlevelcurrent=(); 1429: foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) { 1430: my ($priv,$restrict)=split(/\&/,$_); 1431: unless ($restrict) { $restrict='F'; } 1432: $systemlevel{$priv}=$restrict; 1433: if ($syspriv=~/\:$priv/) { 1434: $systemlevelcurrent{$priv}=1; 1435: } 1436: $full{$priv}=1; 1437: } 1438: my %lt=&Apache::lonlocal::texthash( 1439: 'prv' => "Privilege", 1440: 'crl' => "Course Level", 1441: 'dml' => "Domain Level", 1442: 'ssl' => "System Level" 1443: ); 1444: $r->print(<<ENDCCF); 1445: <form method="post"> 1446: <input type="hidden" name="phase" value="set_custom_roles" /> 1447: <input type="hidden" name="rolename" value="$rolename" /> 1448: <table border="2"> 1449: <tr><th>$lt{'prv'}</th><th>$lt{'crl'}</th><th>$lt{'dml'}</th> 1450: <th>$lt{'ssl'}</th></tr> 1451: ENDCCF 1452: foreach (sort keys %full) { 1453: $r->print('<tr><td>'.&Apache::lonnet::plaintext($_).'</td><td>'. 1454: ($courselevel{$_}?'<input type="checkbox" name="'.$_.':c" '. 1455: ($courselevelcurrent{$_}?'checked="1"':'').' />':' '). 1456: '</td><td>'. 1457: ($domainlevel{$_}?'<input type="checkbox" name="'.$_.':d" '. 1458: ($domainlevelcurrent{$_}?'checked="1"':'').' />':' '). 1459: '</td><td>'. 1460: ($systemlevel{$_}?'<input type="checkbox" name="'.$_.':s" '. 1461: ($systemlevelcurrent{$_}?'checked="1"':'').' />':' '). 1462: '</td></tr>'); 1463: } 1464: $r->print( 1465: '<table><input type="submit" value="'.&mt('Define Role').'" /></form></body></html>'); 1466: } 1467: 1468: # ---------------------------------------------------------- Call to definerole 1469: sub set_custom_role { 1470: my $r=shift; 1471: 1472: my $rolename=$ENV{'form.rolename'}; 1473: 1474: $rolename=~s/[^A-Za-z0-9]//gs; 1475: 1476: unless ($rolename) { 1477: &print_username_entry_form($r); 1478: return; 1479: } 1480: 1481: $r->print(&Apache::loncommon::bodytag( 1482: 'Create Users, Change User Privileges').'<h2>'); 1483: my ($rdummy,$roledef)= 1484: &Apache::lonnet::get('roles',["rolesdef_$rolename"]); 1485: # ------------------------------------------------------- Does this role exist? 1486: if (($rdummy ne 'con_lost') && ($roledef ne '')) { 1487: $r->print(&mt('Existing Role').' "'); 1488: } else { 1489: $r->print(&mt('New Role').' "'); 1490: $roledef=''; 1491: } 1492: $r->print($rolename.'"</h2>'); 1493: # ------------------------------------------------------- What can be assigned? 1494: my $sysrole=''; 1495: my $domrole=''; 1496: my $courole=''; 1497: 1498: foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) { 1499: my ($priv,$restrict)=split(/\&/,$_); 1500: unless ($restrict) { $restrict=''; } 1501: if ($ENV{'form.'.$priv.':c'}) { 1502: $courole.=':'.$_; 1503: } 1504: } 1505: 1506: foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) { 1507: my ($priv,$restrict)=split(/\&/,$_); 1508: unless ($restrict) { $restrict=''; } 1509: if ($ENV{'form.'.$priv.':d'}) { 1510: $domrole.=':'.$_; 1511: } 1512: } 1513: 1514: foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) { 1515: my ($priv,$restrict)=split(/\&/,$_); 1516: unless ($restrict) { $restrict=''; } 1517: if ($ENV{'form.'.$priv.':s'}) { 1518: $sysrole.=':'.$_; 1519: } 1520: } 1521: $r->print('<br />Defining Role: '. 1522: &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole)); 1523: if ($ENV{'request.course.id'}) { 1524: my $url='/'.$ENV{'request.course.id'}; 1525: $url=~s/\_/\//g; 1526: $r->print('<br />'.&mt('Assigning Role to Self').': '. 1527: &Apache::lonnet::assigncustomrole($ENV{'user.domain'}, 1528: $ENV{'user.name'}, 1529: $url, 1530: $ENV{'user.domain'}, 1531: $ENV{'user.name'}, 1532: $rolename)); 1533: } 1534: $r->print('</body></html>'); 1535: } 1536: 1537: # ================================================================ Main Handler 1538: sub handler { 1539: my $r = shift; 1540: 1541: if ($r->header_only) { 1542: &Apache::loncommon::content_type($r,'text/html'); 1543: $r->send_http_header; 1544: return OK; 1545: } 1546: 1547: if ((&Apache::lonnet::allowed('cta',$ENV{'request.course.id'})) || 1548: (&Apache::lonnet::allowed('cin',$ENV{'request.course.id'})) || 1549: (&Apache::lonnet::allowed('ccr',$ENV{'request.course.id'})) || 1550: (&Apache::lonnet::allowed('cep',$ENV{'request.course.id'})) || 1551: (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) || 1552: (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) { 1553: &Apache::loncommon::content_type($r,'text/html'); 1554: $r->send_http_header; 1555: unless ($ENV{'form.phase'}) { 1556: &print_username_entry_form($r); 1557: } 1558: if ($ENV{'form.phase'} eq 'get_user_info') { 1559: &print_user_modification_page($r); 1560: } elsif ($ENV{'form.phase'} eq 'update_user_data') { 1561: &update_user_data($r); 1562: } elsif ($ENV{'form.phase'} eq 'selected_custom_edit') { 1563: &custom_role_editor($r); 1564: } elsif ($ENV{'form.phase'} eq 'set_custom_roles') { 1565: &set_custom_role($r); 1566: } 1567: } else { 1568: $ENV{'user.error.msg'}= 1569: "/adm/createuser:mau:0:0:Cannot modify user data"; 1570: return HTTP_NOT_ACCEPTABLE; 1571: } 1572: return OK; 1573: } 1574: 1575: #-------------------------------------------------- functions for &phase_two 1576: sub course_level_table { 1577: my (%inccourses) = @_; 1578: my $table = ''; 1579: # Custom Roles? 1580: 1581: my %customroles=&my_custom_roles(); 1582: my %lt=&Apache::lonlocal::texthash( 1583: 'exs' => "Existing sections", 1584: 'new' => "Define new section", 1585: 'ssd' => "Set Start Date", 1586: 'sed' => "Set End Date", 1587: 'crl' => "Course Level", 1588: 'act' => "Activate", 1589: 'rol' => "Role", 1590: 'ext' => "Extent", 1591: 'grs' => "Group/Section", 1592: 'sta' => "Start", 1593: 'end' => "End" 1594: ); 1595: 1596: foreach (sort( keys(%inccourses))) { 1597: my $thiscourse=$_; 1598: my $protectedcourse=$_; 1599: $thiscourse=~s:_:/:g; 1600: my %coursedata=&Apache::lonnet::coursedescription($thiscourse); 1601: my $area=$coursedata{'description'}; 1602: if (!defined($area)) { $area=&mt('Unavailable course').': '.$_; } 1603: my $bgcol=$thiscourse; 1604: $bgcol=~s/[^7-9a-e]//g; 1605: $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6); 1606: my ($domain,$cnum)=split(/\//,$thiscourse); 1607: my %sections_count = (); 1608: my $num_sections = 0; 1609: if (defined($ENV{'request.course.id'})) { 1610: if ($ENV{'request.course.id'} eq $domain.'_'.$cnum) { 1611: $num_sections = &Apache::loncommon::get_sections($domain,$cnum,\%sections_count); 1612: } 1613: } 1614: foreach ('st','ta','ep','ad','in','cc') { 1615: if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) { 1616: my $plrole=&Apache::lonnet::plaintext($_); 1617: $table .= <<ENDEXTENT; 1618: <tr bgcolor="#$bgcol"> 1619: <td><input type="checkbox" name="act_$protectedcourse\_$_"></td> 1620: <td>$plrole</td> 1621: <td>$area<br />Domain: $domain</td> 1622: ENDEXTENT 1623: if ($_ ne 'cc') { 1624: if ($num_sections > 0) { 1625: my $currsec = &course_sections($num_sections,\%sections_count,$protectedcourse.'_'.$_); 1626: $table .= 1627: '<td><table border="0" cellspacing="0" cellpadding="0">'. 1628: '<tr><td valign="top">'.$lt{'exs'}.'<br />'. 1629: $currsec.'</td>'. 1630: '<td> </td>'. 1631: '<td valign="top"> '.$lt{'new'}.'<br />'. 1632: '<input type="text" name="newsec_'.$protectedcourse.'_'.$_.'" value="" /></td>'. 1633: '<input type="hidden" '. 1634: 'name="sec_'.$protectedcourse.'_'.$_.'"></td>'. 1635: '</tr></table></td>'; 1636: } else { 1637: $table .= '<td><input type="text" size="10" '. 1638: 'name="sec_'.$protectedcourse.'_'.$_.'"></td>'; 1639: } 1640: } else { 1641: $table .= '<td> </td>'; 1642: } 1643: $table .= <<ENDTIMEENTRY; 1644: <td><input type=hidden name="start_$protectedcourse\_$_" value=''> 1645: <a href= 1646: "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$_.value,'start_$protectedcourse\_$_','cu.pres','dateset')">$lt{'ssd'}</a></td> 1647: <td><input type=hidden name="end_$protectedcourse\_$_" value=''> 1648: <a href= 1649: "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$_.value,'end_$protectedcourse\_$_','cu.pres','dateset')">$lt{'sed'}</a></td> 1650: ENDTIMEENTRY 1651: $table.= "</tr>\n"; 1652: } 1653: } 1654: foreach (sort keys %customroles) { 1655: if (&Apache::lonnet::allowed('ccr',$thiscourse)) { 1656: my $plrole=$_; 1657: my $customrole=$protectedcourse.'_cr_cr_'.$ENV{'user.domain'}. 1658: '_'.$ENV{'user.name'}.'_'.$plrole; 1659: $table .= <<END; 1660: <tr bgcolor="#$bgcol"> 1661: <td><input type="checkbox" name="act_$customrole"></td> 1662: <td>$plrole</td> 1663: <td>$area</td> 1664: END 1665: if ($num_sections > 0) { 1666: my $currsec = &course_sections($num_sections,\%sections_count,$customrole); 1667: $table.= 1668: '<td><table border="0" cellspacing="0" cellpadding="0">'. 1669: '<tr><td valign="top">'.$lt{'exs'}.'<br />'. 1670: $currsec.'</td>'. 1671: '<td> </td>'. 1672: '<td valign="top"> '.$lt{'new'}.'<br />'. 1673: '<input type="text" name="newsec_'.$customrole.'" value="" /></td>'. 1674: '<input type="hidden" '. 1675: 'name="sec_'.$customrole.'"></td>'. 1676: '</tr></table></td>'; 1677: } else { 1678: $table .= '<td><input type="text" size="10" '. 1679: 'name="sec_'.$customrole.'"></td>'; 1680: } 1681: $table .= <<ENDENTRY; 1682: <td><input type=hidden name="start_$customrole" value=''> 1683: <a href= 1684: "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$customrole.value,'start_$customrole','cu.pres','dateset')">$lt{'ssd'}</a></td> 1685: <td><input type=hidden name="end_$customrole" value=''> 1686: <a href= 1687: "javascript:pjump('date_end','End Date $plrole',document.cu.end_$customrole.value,'end_$customrole','cu.pres','dateset')">$lt{'sed'}</a></td></tr> 1688: ENDENTRY 1689: } 1690: } 1691: } 1692: return '' if ($table eq ''); # return nothing if there is nothing 1693: # in the table 1694: my $result = <<ENDTABLE; 1695: <h4>$lt{'crl'}</h4> 1696: <table border=2><tr><th>$lt{'act'}</th><th>$lt{'rol'}</th><th>$lt{'ext'}</th> 1697: <th>$lt{'grs'}</th><th>$lt{'sta'}</th><th>$lt{'end'}</th></tr> 1698: $table 1699: </table> 1700: ENDTABLE 1701: return $result; 1702: } 1703: 1704: sub course_sections { 1705: my ($num_sections,$sections_count,$role) = @_; 1706: my $output = ''; 1707: my @sections = (sort {$a <=> $b} keys %{$sections_count}); 1708: if ($num_sections == 1) { 1709: $output = '<select name="currsec_'.$role.'" >'."\n". 1710: ' <option value="">Select</option>'."\n". 1711: ' <option value="">No section</option>'."\n". 1712: ' <option value="'.$sections[0].'" >'.$sections[0].'</option>'."\n"; 1713: } else { 1714: $output = '<select name="currsec_'.$role.'" '; 1715: my $multiple = 4; 1716: if ($num_sections <4) { $multiple = $num_sections; } 1717: $output .= '"multiple" size="'.$multiple.'">'."\n"; 1718: foreach (@sections) { 1719: $output .= '<option value="'.$_.'">'.$_."</option>\n"; 1720: } 1721: } 1722: $output .= '</select>'; 1723: return $output; 1724: } 1725: 1726: sub course_level_dc { 1727: my ($dcdom) = @_; 1728: my %customroles=&my_custom_roles(); 1729: my $hiddenitems = '<input type="hidden" name="dcdomain" value="'.$dcdom.'" />'. 1730: '<input type="hidden" name="origdom" value="'.$dcdom.'" />'. 1731: '<input type="hidden" name="dccourse" value="" />'; 1732: my $courseform='<b>'.&Apache::loncommon::selectcourse_link 1733: ('cu','dccourse','dcdomain','coursedesc').'</b>'; 1734: 1735: my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,$dcdom); 1736: my %lt=&Apache::lonlocal::texthash( 1737: 'crl' => "Course Level", 1738: 'crt' => "Course Title", 1739: 'rol' => "Role", 1740: 'grs' => "Group/Section", 1741: 'exs' => "Existing sections", 1742: 'new' => "Define new section", 1743: 'sta' => "Start", 1744: 'end' => "End", 1745: 'ssd' => "Set Start Date", 1746: 'sed' => "Set End Date" 1747: ); 1748: my $header = '<h4>'.$lt{'crl'}.'</h4>'. 1749: '<table border="2"><tr><th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th><th>'.$lt{'grs'}.'</th><th>'.$lt{'sta'}.'</th><th>'.$lt{'end'}.'</th></tr>'; 1750: my $otheritems = '<tr><td><input type="text" name="coursedesc" value="" onFocus="this.blur();opencrsbrowser('."'".'cu'."'".','."'".'dccourse'."'".','."'".'dcdomain'."'".','."'".'coursedesc'."',''".')" /></td>'. 1751: '<td><select name="role">'."\n"; 1752: foreach ('st','ta','ep','ad','in','cc') { 1753: my $plrole=&Apache::lonnet::plaintext($_); 1754: $otheritems .= ' <option value="'.$_.'">'.$plrole; 1755: } 1756: if ( keys %customroles > 0) { 1757: foreach (sort keys %customroles) { 1758: my $custrole='cr_cr_'.$ENV{'user.domain'}. 1759: '_'.$ENV{'user.name'}.'_'.$_; 1760: $otheritems .= ' <option value="'.$custrole.'">'.$_; 1761: } 1762: } 1763: $otheritems .= '</select></td><td>'. 1764: '<table border="0" cellspacing="0" cellpadding="0">'. 1765: '<tr><td valign="top"><b>'.$lt{'exs'}.'</b><br /><select name="currsec">'. 1766: ' <option value=""><--'.&mt('Pick course first').'</select></td>'. 1767: '<td> </td>'. 1768: '<td valign="top"> <b>'.$lt{'new'}.'</b><br />'. 1769: '<input type="text" name="newsec" value="" /></td>'. 1770: '</tr></table></td>'; 1771: $otheritems .= <<ENDTIMEENTRY; 1772: <td><input type=hidden name="start" value=''> 1773: <a href= 1774: "javascript:pjump('date_start','Start Date',document.cu.start.value,'start','cu.pres','dateset')">$lt{'ssd'}</a></td> 1775: <td><input type=hidden name="end" value=''> 1776: <a href= 1777: "javascript:pjump('date_end','End Date',document.cu.end.value,'end','cu.pres','dateset')">$lt{'sed'}</a></td> 1778: ENDTIMEENTRY 1779: $otheritems .= "</tr></table>\n"; 1780: return $cb_jscript.$header.$hiddenitems.$otheritems; 1781: } 1782: 1783: #---------------------------------------------- end functions for &phase_two 1784: 1785: #--------------------------------- functions for &phase_two and &phase_three 1786: 1787: #--------------------------end of functions for &phase_two and &phase_three 1788: 1789: 1; 1790: __END__ 1791: 1792: