Annotation of loncom/interface/domainprefs.pm, revision 1.41
1.1 raeburn 1: # The LearningOnline Network with CAPA
2: # Handler to set domain-wide configuration settings
3: #
1.41 ! raeburn 4: # $Id: domainprefs.pm,v 1.40 2008/01/04 17:47:51 raeburn Exp $
1.2 albertel 5: #
1.1 raeburn 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: # /home/httpd/html/adm/gpl.txt
24: #
25: # http://www.lon-capa.org/
26: #
27: #
28: ###############################################################
29: ##############################################################
30:
31: package Apache::domainprefs;
32:
33: use strict;
34: use Apache::Constants qw(:common :http);
35: use Apache::lonnet;
36: use Apache::loncommon();
37: use Apache::lonhtmlcommon();
38: use Apache::lonlocal;
39: use LONCAPA();
1.6 raeburn 40: use LONCAPA::Enrollment;
1.9 raeburn 41: use File::Copy;
1.1 raeburn 42:
43: sub handler {
44: my $r=shift;
45: if ($r->header_only) {
46: &Apache::loncommon::content_type($r,'text/html');
47: $r->send_http_header;
48: return OK;
49: }
50:
51: my $dom = $env{'request.role.domain'};
1.5 albertel 52: my $domdesc = &Apache::lonnet::domain($dom,'description');
1.1 raeburn 53: if (&Apache::lonnet::allowed('mau',$dom)) {
54: &Apache::loncommon::content_type($r,'text/html');
55: $r->send_http_header;
56: } else {
57: $env{'user.error.msg'}=
58: "/adm/domainprefs:mau:0:0:Cannot modify domain settings";
59: return HTTP_NOT_ACCEPTABLE;
60: }
61: &Apache::lonhtmlcommon::clear_breadcrumbs();
62: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
63: ['phase']);
1.30 raeburn 64: my $phase = 'pickactions';
1.3 raeburn 65: if ( exists($env{'form.phase'}) ) {
66: $phase = $env{'form.phase'};
67: }
68: my %domconfig =
1.6 raeburn 69: &Apache::lonnet::get_dom('configuration',['login','rolecolors',
1.27 raeburn 70: 'quotas','autoenroll','autoupdate','directorysrch',
1.33 raeburn 71: 'usercreation','usermodification','contacts'],$dom);
1.30 raeburn 72: my @prefs_order = ('rolecolors','login','quotas','autoenroll',
73: 'autoupdate','directorysrch','contacts',
1.33 raeburn 74: 'usercreation','usermodification');
1.30 raeburn 75: my %prefs = (
76: 'rolecolors' =>
77: { text => 'Default color schemes',
78: help => 'Default_Color_Schemes',
79: header => [{col1 => 'Student Settings',
80: col2 => '',},
81: {col1 => 'Coordinator Settings',
82: col2 => '',},
83: {col1 => 'Author Settings',
84: col2 => '',},
85: {col1 => 'Administrator Settings',
86: col2 => '',}],
87: },
88: 'login' =>
89: { text => 'Log-in page options',
90: help => 'Domain_Log-in_Page',
91: header => [{col1 => 'Item',
92: col2 => '',}],
93: },
94: 'quotas' =>
95: { text => 'Default quotas for user portfolios',
96: help => 'Default_User_Quota',
97: header => [{col1 => 'User type',
98: col2 => 'Default quota'}],
99: },
100: 'autoenroll' =>
101: { text => 'Auto-enrollment settings',
102: help => 'Domain_Auto_Enrollment',
103: header => [{col1 => 'Configuration setting',
104: col2 => 'Value(s)'}],
105: },
106: 'autoupdate' =>
107: { text => 'Auto-update settings',
108: help => 'Domain_Auto_Update',
109: header => [{col1 => 'Setting',
110: col2 => 'Value',},
111: {col1 => 'User Population',
112: col2 => 'Updataeable user data'}],
113: },
114: 'directorysrch' =>
115: { text => 'Institutional directory searches',
116: help => 'Domain_Directory_Search',
117: header => [{col1 => 'Setting',
118: col2 => 'Value',}],
119: },
120: 'contacts' =>
121: { text => 'Contact Information',
122: help => 'Domain_Contact_Information',
123: header => [{col1 => 'Setting',
124: col2 => 'Value',}],
125: },
126:
127: 'usercreation' =>
128: { text => 'User creation',
129: help => 'Domain_User_Creation',
1.34 raeburn 130: header => [{col1 => 'Format Rule Type',
131: col2 => 'Format Rules in force'},
132: {col1 => 'User account creation',
133: col2 => 'Usernames which may be created',},
1.30 raeburn 134: {col1 => 'Context',
135: col2 => 'Assignable Authentication Types'}],
136: },
1.33 raeburn 137: 'usermodification' =>
138: { text => 'User modification',
139: help => 'Domain_User_Modification',
140: header => [{col1 => 'Target user has role',
141: col2 => 'User information updateable in author context'},
142: {col1 => 'Target user has role',
143: col2 => 'User information updateable in course context'}],
144: },
1.3 raeburn 145: );
1.6 raeburn 146: my @roles = ('student','coordinator','author','admin');
1.30 raeburn 147: my @actions = &Apache::loncommon::get_env_multiple('form.actions');
1.3 raeburn 148: &Apache::lonhtmlcommon::add_breadcrumb
1.30 raeburn 149: ({href=>"javascript:changePage(document.$phase,'pickactions')",
150: text=>"Pick functionality"});
1.9 raeburn 151: my $confname = $dom.'-domainconfig';
1.3 raeburn 152: if ($phase eq 'process') {
1.1 raeburn 153: &Apache::lonhtmlcommon::add_breadcrumb
1.30 raeburn 154: ({href=>"javascript:changePage(document.$phase,'display')",
155: text=>"Domain Configuration"},
156: {href=>"javascript:changePage(document.$phase,'$phase')",
1.3 raeburn 157: text=>"Updated"});
158: &print_header($r,$phase);
1.30 raeburn 159: foreach my $item (@prefs_order) {
160: if (grep(/^\Q$item\E$/,@actions)) {
161: $r->print('<h3>'.&mt($prefs{$item}{'text'}).'</h3>'.
162: &process_changes($r,$dom,$confname,$item,
163: \@roles,%domconfig));
164: }
1.3 raeburn 165: }
166: $r->print('<p>');
1.30 raeburn 167: &print_footer($r,$phase,'display','Back to configuration display',
168: \@actions);
1.3 raeburn 169: $r->print('</p>');
1.30 raeburn 170: } elsif ($phase eq 'display') {
171: &Apache::lonhtmlcommon::add_breadcrumb
172: ({href=>"javascript:changePage(document.$phase,'display')",
173: text=>"Domain Configuration"});
174: &print_header($r,$phase);
175: if (@actions > 0) {
176: my $rowsum = 0;
177: my (%output,%rowtotal,@items);
178: my $halfway = @actions/2;
179: foreach my $item (@prefs_order) {
180: if (grep(/^\Q$item\E$/,@actions)) {
181: push(@items,$item);
182: ($output{$item},$rowtotal{$item}) =
183: &print_config_box($r,$dom,$confname,$phase,
184: $item,$prefs{$item},
185: $domconfig{$item});
186: $rowsum += $rowtotal{$item};
187: }
188: }
189: my $colend;
190: my $halfway = $rowsum/2;
191: my $aggregate = 0;
192: my $sumleft = 0;
193: my $sumright = 0;
194: my $crossover;
195: for (my $i=0; $i<@items; $i++) {
196: $aggregate += $rowtotal{$items[$i]};
197: if ($aggregate > $halfway) {
198: $crossover = $i;
199: last;
200: }
201: }
202: for (my $i=0; $i<$crossover; $i++) {
203: $sumleft += $rowtotal{$items[$i]};
204: }
205: for (my $i=$crossover+1; $i<@items; $i++) {
206: $sumright += $rowtotal{$items[$i]};
207: }
208: if ((@items > 1) && ($env{'form.numcols'} == 2)) {
209: my $sumdiff = $sumright - $sumleft;
210: if ($sumdiff > 0) {
211: $colend = $crossover + 1;
212: } else {
213: $colend = $crossover;
214: }
215: } else {
216: $colend = @items;
217: }
218: $r->print('<p><table class="LC_double_column"><tr><td class="LC_left_col">');
219: for (my $i=0; $i<$colend; $i++) {
220: $r->print($output{$items[$i]});
221: }
222: $r->print('</td><td></td><td class="LC_right_col">');
223: if ($colend < @items) {
224: for (my $i=$colend; $i<@items; $i++) {
225: $r->print($output{$items[$i]});
226: }
227: }
228: $r->print('</td></tr></table></p>');
229: $r->print(&print_footer($r,$phase,'process','Save',\@actions));
230: } else {
231: $r->print('<input type="hidden" name="phase" value="" />'.
232: '<input type="hidden" name="numcols" value="'.
233: $env{'form.numcols'}.'" />'."\n".
234: '<span clas="LC_error">'.&mt('No settings chosen').
235: '</span>');
236: }
237: $r->print('</form>');
238: $r->print(&Apache::loncommon::end_page());
1.1 raeburn 239: } else {
1.3 raeburn 240: if ($phase eq '') {
1.30 raeburn 241: $phase = 'pickactions';
1.1 raeburn 242: }
1.30 raeburn 243: my %helphash;
1.3 raeburn 244: &print_header($r,$phase);
1.21 raeburn 245: if (keys(%domconfig) == 0) {
246: my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
1.29 raeburn 247: my @ids=&Apache::lonnet::current_machine_ids();
248: if (!grep(/^\Q$primarylibserv\E$/,@ids)) {
1.21 raeburn 249: my %designhash = &Apache::loncommon::get_domainconf($dom);
1.41 ! raeburn 250: my @loginimages = ('img','logo','domlogo','login');
1.21 raeburn 251: my $custom_img_count = 0;
252: foreach my $img (@loginimages) {
253: if ($designhash{$dom.'.login.'.$img} ne '') {
254: $custom_img_count ++;
255: }
256: }
257: foreach my $role (@roles) {
258: if ($designhash{$dom.'.'.$role.'.img'} ne '') {
259: $custom_img_count ++;
260: }
261: }
262: if ($custom_img_count > 0) {
263: my $switch_server = &check_switchserver($dom,$confname);
1.29 raeburn 264: $r->print(
265: &mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.
266: &mt("While this remains so, you must switch to the domain's primary library server in order to update settings.").'<br /><br />'.
267: &mt("Thereafter, (with a Domain Coordinator role selected in the domain) you will be able to update settings when logged in to any server in the LON-CAPA network.").'<br />'.
268: &mt("However, you will still need to switch to the domain's primary library server to upload new images or logos.").'<br /><br />');
269: if ($switch_server) {
1.30 raeburn 270: $r->print($switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));
1.29 raeburn 271: }
1.21 raeburn 272: return OK;
273: }
274: }
275: }
1.30 raeburn 276: $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');
277: $r->print('<script type="text/javascript">'."\n".
278: &Apache::loncommon::check_uncheck_jscript()."\n".
279: '</script>'."\n".'<p><input type="button" value="check all" '.
280: 'onclick="javascript:checkAll(document.pickactions.actions)"'.
281: ' /> '.
282: '<input type="button" value="uncheck all" '.
283: 'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
1.38 raeburn 284: ' /></p><div class="LC_left_float">');
285: my ($numitems,$midpoint,$seconddiv,$count);
286: $numitems = @prefs_order;
287: $midpoint = int($numitems/2);
288: if ($numitems%2) {
289: $midpoint ++;
290: }
291: $count = 0;
1.30 raeburn 292: foreach my $item (@prefs_order) {
1.38 raeburn 293: $r->print('<h4><label><input type="checkbox" name="actions" value="'.$item.'" /> '.$prefs{$item}->{'text'}.'</label></h4>');
294: $count ++;
295: if ((!$seconddiv) && ($count >= $midpoint)) {
296: $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");
297: $seconddiv = 1;
298: }
1.30 raeburn 299: }
1.38 raeburn 300: $r->print('</div><div class="LC_clear_float_footer"></div><h3>'.
301: &mt('Display options').'</h3>'."\n".
1.30 raeburn 302: '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".
303: '<label><input type="radio" name="numcols" value="1">'.
304: &mt('one column').'</label> '.
305: '<input type="radio" name="numcols" value="2">'.
306: &mt('two columns').'</label></span></p>');
307: $r->print(&print_footer($r,$phase,'display','Go'));
308: $r->print('</form>');
309: $r->print(&Apache::loncommon::end_page());
1.3 raeburn 310: }
311: return OK;
312: }
313:
314: sub process_changes {
1.9 raeburn 315: my ($r,$dom,$confname,$action,$roles,%domconfig) = @_;
1.3 raeburn 316: my $output;
317: if ($action eq 'login') {
1.9 raeburn 318: $output = &modify_login($r,$dom,$confname,%domconfig);
1.6 raeburn 319: } elsif ($action eq 'rolecolors') {
1.9 raeburn 320: $output = &modify_rolecolors($r,$dom,$confname,$roles,
321: %domconfig);
1.3 raeburn 322: } elsif ($action eq 'quotas') {
323: $output = &modify_quotas($dom,%domconfig);
324: } elsif ($action eq 'autoenroll') {
325: $output = &modify_autoenroll($dom,%domconfig);
326: } elsif ($action eq 'autoupdate') {
327: $output = &modify_autoupdate($dom,%domconfig);
1.23 raeburn 328: } elsif ($action eq 'directorysrch') {
329: $output = &modify_directorysrch($dom,%domconfig);
1.27 raeburn 330: } elsif ($action eq 'usercreation') {
1.28 raeburn 331: $output = &modify_usercreation($dom,%domconfig);
1.33 raeburn 332: } elsif ($action eq 'usermodification') {
333: $output = &modify_usermodification($dom,%domconfig);
1.28 raeburn 334: } elsif ($action eq 'contacts') {
335: $output = &modify_contacts($dom,%domconfig);
1.3 raeburn 336: }
337: return $output;
338: }
339:
340: sub print_config_box {
1.9 raeburn 341: my ($r,$dom,$confname,$phase,$action,$item,$settings) = @_;
1.30 raeburn 342: my $rowtotal = 0;
343: my $output =
344: '<table class="LC_nested_outer">
1.3 raeburn 345: <tr>
1.30 raeburn 346: <th align="left"><span class="LC_nobreak">'.&mt($item->{text}).
347: ' </span></th></tr>';
1.22 raeburn 348: #
349: # FIXME - put the help link back in when the help files exist
350: # <th>'.&mt($item->{text}).' '.
351: # &Apache::loncommon::help_open_topic($item->{'help'}).'</th>
352: # </tr>');
1.30 raeburn 353: $rowtotal ++;
1.28 raeburn 354: if (($action eq 'autoupdate') || ($action eq 'rolecolors') ||
1.33 raeburn 355: ($action eq 'usercreation') || ($action eq 'usermodification')) {
1.6 raeburn 356: my $colspan = ($action eq 'rolecolors')?' colspan="2"':'';
1.30 raeburn 357: $output .= '
1.3 raeburn 358: <tr>
359: <td>
360: <table class="LC_nested">
361: <tr class="LC_info_row">
1.6 raeburn 362: <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[0]->{'col1'}.'</td>
1.3 raeburn 363: <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>
1.30 raeburn 364: </tr>';
365: $rowtotal ++;
1.6 raeburn 366: if ($action eq 'autoupdate') {
1.30 raeburn 367: $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal);
1.28 raeburn 368: } elsif ($action eq 'usercreation') {
1.33 raeburn 369: $output .= &print_usercreation('top',$dom,$settings,\$rowtotal);
370: } elsif ($action eq 'usermodification') {
371: $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);
1.6 raeburn 372: } else {
1.30 raeburn 373: $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
1.6 raeburn 374: }
1.30 raeburn 375: $output .= '
1.6 raeburn 376: </table>
377: </td>
378: </tr>
379: <tr>
380: <td>
381: <table class="LC_nested">
382: <tr class="LC_info_row">
383: <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[1]->{'col1'}.'</td>
384: <td class="LC_right_item">'.$item->{'header'}->[1]->{'col2'}.'</td>
1.30 raeburn 385: </tr>';
386: $rowtotal ++;
1.6 raeburn 387: if ($action eq 'autoupdate') {
1.30 raeburn 388: $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal);
1.28 raeburn 389: } elsif ($action eq 'usercreation') {
1.34 raeburn 390: $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).'
391: </table>
392: </td>
393: </tr>
394: <tr>
395: <td>
396: <table class="LC_nested">
397: <tr class="LC_info_row">
398: <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>
399: <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td> </tr>'.
400: &print_usercreation('bottom',$dom,$settings,\$rowtotal);
401: $rowtotal ++;
1.33 raeburn 402: } elsif ($action eq 'usermodification') {
403: $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal);
1.6 raeburn 404: } else {
1.30 raeburn 405: $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
1.6 raeburn 406: </table>
407: </td>
408: </tr>
409: <tr>
410: <td>
411: <table class="LC_nested">
412: <tr class="LC_info_row">
413: <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>
414: <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td>
1.3 raeburn 415: </tr>'.
1.30 raeburn 416: &print_rolecolors($phase,'author',$dom,$confname,$settings,\$rowtotal).'
1.3 raeburn 417: </table>
418: </td>
419: </tr>
420: <tr>
421: <td>
422: <table class="LC_nested">
423: <tr class="LC_info_row">
1.6 raeburn 424: <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[3]->{'col1'}.'</td>
425: <td class="LC_right_item">'.$item->{'header'}->[3]->{'col2'}.'</td>
1.3 raeburn 426: </tr>'.
1.30 raeburn 427: &print_rolecolors($phase,'admin',$dom,$confname,$settings,\$rowtotal);
428: $rowtotal += 2;
1.6 raeburn 429: }
1.3 raeburn 430: } else {
1.30 raeburn 431: $output .= '
1.3 raeburn 432: <tr>
433: <td>
434: <table class="LC_nested">
1.30 raeburn 435: <tr class="LC_info_row">';
1.24 raeburn 436: if (($action eq 'login') || ($action eq 'directorysrch')) {
1.30 raeburn 437: $output .= '
438: <td class="LC_left_item" colspan="2">'.$item->{'header'}->[0]->{'col1'}.'</td>';
1.6 raeburn 439: } else {
1.30 raeburn 440: $output .= '
441: <td class="LC_left_item">'.$item->{'header'}->[0]->{'col1'}.'</td>';
1.6 raeburn 442: }
1.30 raeburn 443: $output .= '
1.3 raeburn 444: <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>
1.30 raeburn 445: </tr>';
446: $rowtotal ++;
1.3 raeburn 447: if ($action eq 'login') {
1.30 raeburn 448: $output .= &print_login($dom,$confname,$phase,$settings,\$rowtotal);
1.3 raeburn 449: } elsif ($action eq 'quotas') {
1.30 raeburn 450: $output .= &print_quotas($dom,$settings,\$rowtotal);
1.3 raeburn 451: } elsif ($action eq 'autoenroll') {
1.30 raeburn 452: $output .= &print_autoenroll($dom,$settings,\$rowtotal);
1.23 raeburn 453: } elsif ($action eq 'directorysrch') {
1.30 raeburn 454: $output .= &print_directorysrch($dom,$settings,\$rowtotal);
1.28 raeburn 455: } elsif ($action eq 'contacts') {
1.30 raeburn 456: $output .= &print_contacts($dom,$settings,\$rowtotal);
1.27 raeburn 457: }
1.3 raeburn 458: }
1.30 raeburn 459: $output .= '
1.3 raeburn 460: </table>
461: </td>
462: </tr>
1.30 raeburn 463: </table><br />';
464: return ($output,$rowtotal);
1.1 raeburn 465: }
466:
467: sub print_header {
1.3 raeburn 468: my ($r,$phase) = @_;
1.30 raeburn 469: my $alert = &mt('You must select at least one functionality type to display.');
1.6 raeburn 470: my $js = '
1.1 raeburn 471: <script type="text/javascript">
472: function changePage(formname,newphase) {
473: formname.phase.value = newphase;
1.30 raeburn 474: numchecked = 0;
475: if (formname == document.pickactions) {
476: if (formname.actions.length > 0) {
477: for (var i = 0; i <formname.actions.length; i++) {
478: if (formname.actions[i].checked) {
479: numchecked ++;
480: }
481: }
482: } else {
483: if (formname.actions.checked) {
484: numchecked ++;
485: }
486: }
487: if (numchecked > 0) {
488: formname.submit();
489: } else {
490: alert("'.$alert.'");
491: return;
492: }
493: }
1.1 raeburn 494: formname.submit();
1.30 raeburn 495: }'."\n";
496: if ($phase eq 'pickactions') {
497: $js .=
498: &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox',numcols => 'radio',})."\n".
499: &javascript_set_colnums();
500: } elsif ($phase eq 'display') {
501: $js .= &color_pick_js()."\n";
502: }
1.31 raeburn 503: $js .= &Apache::loncommon::viewport_size_js().'
1.1 raeburn 504: </script>
1.6 raeburn 505: ';
1.30 raeburn 506: my $additem;
507: if ($phase eq 'pickactions') {
508: my %loaditems = (
1.31 raeburn 509: 'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",
1.30 raeburn 510: );
511: $additem = {'add_entries' => \%loaditems,};
512: } else {
513: my %loaditems = (
1.31 raeburn 514: 'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);",
1.30 raeburn 515: );
516: $additem = {'add_entries' => \%loaditems,};
517: }
1.2 albertel 518: $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings',
1.30 raeburn 519: $js,$additem));
1.3 raeburn 520: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Domain Settings'));
1.6 raeburn 521: $r->print('
1.8 raeburn 522: <form name="parmform" action="">
1.6 raeburn 523: <input type="hidden" name="pres_marker" />
524: <input type="hidden" name="pres_type" />
525: <input type="hidden" name="pres_value" />
526: </form>
527: ');
528: $r->print('<form method="post" name="'.$phase.'" action="/adm/domainprefs"'.
529: ' enctype="multipart/form-data">');
1.1 raeburn 530: return;
531: }
532:
533: sub print_footer {
1.30 raeburn 534: my ($r,$phase,$newphase,$button_text,$actions) = @_;
1.3 raeburn 535: $button_text = &mt($button_text);
1.30 raeburn 536: $r->print('<input type="hidden" name="phase" value="" />'.
537: '<input type="hidden" name="width" value="'.
538: $env{'form.width'}.'" />'.
539: '<input type="hidden" name="height" value="'.
540: $env{'form.height'}.'" />');
541: if (($phase eq 'display') || ($phase eq 'process')) {
542: if (ref($actions) eq 'ARRAY') {
543: foreach my $item (@{$actions}) {
544: $r->print('<input type="hidden" name="actions" value="'.$item.'" />')."\n";
545: }
546: }
547: $r->print('<input type="hidden" name="numcols" value="'.$env{'form.numcols'}.'" />');
548: }
1.3 raeburn 549: my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
550: if ($phase eq 'process') {
1.30 raeburn 551: $r->print('<p><a href='.$dest.'>'.$button_text.'</a></p>');
1.3 raeburn 552: } else {
1.30 raeburn 553: my $onclick;
554: if ($phase eq 'display') {
555: $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
556: } else {
557: $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
558: }
559: $r->print('<p><input type="button" name="store" value="'.
560: $button_text.'" onclick='.$onclick.' /></p>');
561: }
562: if ($phase eq 'process') {
563: $r->print('</form>'.&Apache::loncommon::end_page());
1.3 raeburn 564: }
1.1 raeburn 565: return;
566: }
567:
1.3 raeburn 568: sub print_login {
1.30 raeburn 569: my ($dom,$confname,$phase,$settings,$rowtotal) = @_;
1.6 raeburn 570: my %choices = &login_choices();
1.41 ! raeburn 571: my ($catalogon,$catalogoff,$adminmailon,$adminmailoff,$loginheader);
1.6 raeburn 572: $catalogon = ' checked="checked" ';
573: $adminmailoff = ' checked="checked" ';
1.41 ! raeburn 574: $loginheader = 'image';
! 575: my @images = ('img','logo','domlogo','login');
! 576: my @logintext = ('textcol','bgcol');
1.6 raeburn 577: my @bgs = ('pgbg','mainbg','sidebg');
578: my @links = ('link','alink','vlink');
1.7 albertel 579: my %designhash = &Apache::loncommon::get_domainconf($dom);
1.6 raeburn 580: my %defaultdesign = %Apache::loncommon::defaultdesign;
581: my (%is_custom,%designs);
582: my %defaults = (
583: font => $defaultdesign{'login.font'},
584: );
585: foreach my $item (@images) {
586: $defaults{$item} = $defaultdesign{'login.'.$item};
587: }
588: foreach my $item (@bgs) {
589: $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};
590: }
1.41 ! raeburn 591: foreach my $item (@logintext) {
! 592: $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};
! 593: }
1.6 raeburn 594: foreach my $item (@links) {
595: $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};
596: }
1.3 raeburn 597: if (ref($settings) eq 'HASH') {
598: if ($settings->{'coursecatalog'} eq '0') {
1.1 raeburn 599: $catalogoff = $catalogon;
600: $catalogon = ' ';
601: }
1.3 raeburn 602: if ($settings->{'adminmail'} eq '1') {
1.1 raeburn 603: $adminmailon = $adminmailoff;
604: $adminmailoff = ' ';
605: }
1.6 raeburn 606: foreach my $item (@images) {
607: if ($settings->{$item} ne '') {
608: $designs{$item} = $settings->{$item};
609: $is_custom{$item} = 1;
610: }
611: }
1.41 ! raeburn 612: foreach my $item (@logintext) {
! 613: if ($settings->{$item} ne '') {
! 614: $designs{'logintext'}{$item} = $settings->{$item};
! 615: $is_custom{$item} = 1;
! 616: }
! 617: }
! 618: if ($settings->{'loginheader'} ne '') {
! 619: $loginheader = $settings->{'loginheader'};
! 620: }
1.6 raeburn 621: if ($settings->{'font'} ne '') {
622: $designs{'font'} = $settings->{'font'};
623: $is_custom{'font'} = 1;
624: }
625: foreach my $item (@bgs) {
626: if ($settings->{$item} ne '') {
627: $designs{'bgs'}{$item} = $settings->{$item};
628: $is_custom{$item} = 1;
629: }
630: }
631: foreach my $item (@links) {
632: if ($settings->{$item} ne '') {
633: $designs{'links'}{$item} = $settings->{$item};
634: $is_custom{$item} = 1;
635: }
636: }
637: } else {
638: if ($designhash{$dom.'.login.font'} ne '') {
639: $designs{'font'} = $designhash{$dom.'.login.font'};
640: $is_custom{'font'} = 1;
641: }
1.8 raeburn 642: foreach my $item (@images) {
643: if ($designhash{$dom.'.login.'.$item} ne '') {
644: $designs{$item} = $designhash{$dom.'.login.'.$item};
645: $is_custom{$item} = 1;
646: }
647: }
1.6 raeburn 648: foreach my $item (@bgs) {
649: if ($designhash{$dom.'.login.'.$item} ne '') {
650: $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item};
651: $is_custom{$item} = 1;
652: }
653: }
654: foreach my $item (@links) {
655: if ($designhash{$dom.'.login.'.$item} ne '') {
656: $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item};
657: $is_custom{$item} = 1;
658: }
659: }
1.1 raeburn 660: }
1.6 raeburn 661: my %alt_text = &Apache::lonlocal::texthash ( img => 'Log-in banner',
662: logo => 'Institution Logo',
1.41 ! raeburn 663: domlogo => 'Domain Logo',
! 664: login => 'Login box');
1.6 raeburn 665: my $itemcount = 1;
666: my $css_class = $itemcount%2?' class="LC_odd_row"':'';
1.3 raeburn 667: my $datatable =
1.6 raeburn 668: '<tr'.$css_class.'><td colspan="2">'.$choices{'coursecatalog'}.
669: '</td><td>'.
1.8 raeburn 670: '<span class="LC_nobreak"><label><input type="radio" name="coursecatalog"'.
671: $catalogon.' value="1" />'.&mt('Yes').'</label> '.
672: '<label><input type="radio" name="coursecatalog"'.
673: $catalogoff.'value="0" />'.&mt('No').'</label></span></td>'.
1.6 raeburn 674: '</tr>';
675: $itemcount ++;
676: $css_class = $itemcount%2?' class="LC_odd_row"':'';
677: $datatable .= '<tr'.$css_class.'>'.
678: '<td colspan="2">'.$choices{'adminmail'}.'</td>'.
1.8 raeburn 679: '<td><span class="LC_nobreak">'.
680: '<label><input type="radio" name="adminmail"'.
681: $adminmailon.' value="1" />'.&mt('Yes').'</label> '.
682: '<label><input type="radio" name="adminmail"'.
683: $adminmailoff.'value="0" />'.&mt('No').'</label></span></td></tr>';
1.6 raeburn 684: $itemcount ++;
1.41 ! raeburn 685: $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext,$loginheader);
1.6 raeburn 686: $datatable .= '</tr></table></td></tr>';
687: return $datatable;
688: }
689:
690: sub login_choices {
691: my %choices =
692: &Apache::lonlocal::texthash (
693: coursecatalog => 'Display Course Catalog link?',
694: adminmail => "Display Administrator's E-mail Address?",
695: img => "Header",
696: logo => "Main Logo",
697: domlogo => "Domain Logo",
1.41 ! raeburn 698: login => "Log-in Header",
! 699: textcol => "Text color",
! 700: bgcol => "Box color",
1.6 raeburn 701: bgs => "Background colors",
702: links => "Link colors",
703: font => "Font color",
704: pgbg => "Page",
705: mainbg => "Main panel",
706: sidebg => "Side panel",
707: link => "Link",
708: alink => "Active link",
709: vlink => "Visited link",
710: );
711: return %choices;
712: }
713:
714: sub print_rolecolors {
1.30 raeburn 715: my ($phase,$role,$dom,$confname,$settings,$rowtotal) = @_;
1.6 raeburn 716: my %choices = &color_font_choices();
717: my @bgs = ('pgbg','tabbg','sidebg');
718: my @links = ('link','alink','vlink');
719: my @images = ('img');
720: my %alt_text = &Apache::lonlocal::texthash(img => "Banner for $role role");
1.7 albertel 721: my %designhash = &Apache::loncommon::get_domainconf($dom);
1.6 raeburn 722: my %defaultdesign = %Apache::loncommon::defaultdesign;
723: my (%is_custom,%designs);
724: my %defaults = (
725: img => $defaultdesign{$role.'.img'},
726: font => $defaultdesign{$role.'.font'},
727: );
728: foreach my $item (@bgs) {
729: $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
730: }
731: foreach my $item (@links) {
732: $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};
733: }
734: if (ref($settings) eq 'HASH') {
735: if (ref($settings->{$role}) eq 'HASH') {
736: if ($settings->{$role}->{'img'} ne '') {
737: $designs{'img'} = $settings->{$role}->{'img'};
738: $is_custom{'img'} = 1;
739: }
740: if ($settings->{$role}->{'font'} ne '') {
741: $designs{'font'} = $settings->{$role}->{'font'};
742: $is_custom{'font'} = 1;
743: }
744: foreach my $item (@bgs) {
745: if ($settings->{$role}->{$item} ne '') {
746: $designs{'bgs'}{$item} = $settings->{$role}->{$item};
747: $is_custom{$item} = 1;
748: }
749: }
750: foreach my $item (@links) {
751: if ($settings->{$role}->{$item} ne '') {
752: $designs{'links'}{$item} = $settings->{$role}->{$item};
753: $is_custom{$item} = 1;
754: }
755: }
756: }
757: } else {
758: if ($designhash{$dom.'.'.$role.'.img'} ne '') {
759: $designs{img} = $designhash{$dom.'.'.$role.'.img'};
760: $is_custom{'img'} = 1;
761: }
762: if ($designhash{$dom.'.'.$role.'.font'} ne '') {
763: $designs{font} = $designhash{$dom.'.'.$role.'.font'};
764: $is_custom{'font'} = 1;
765: }
766: foreach my $item (@bgs) {
767: if ($designhash{$dom.'.'.$role.'.'.$item} ne '') {
768: $designs{'bgs'}{$item} = $designhash{$dom.'.'.$role.'.'.$item};
769: $is_custom{$item} = 1;
770:
771: }
772: }
773: foreach my $item (@links) {
774: if ($designhash{$dom.'.'.$role.'.'.$item} ne '') {
775: $designs{'links'}{$item} = $designhash{$dom.'.'.$role.'.'.$item};
776: $is_custom{$item} = 1;
777: }
778: }
779: }
780: my $itemcount = 1;
1.30 raeburn 781: my $datatable = &display_color_options($dom,$confname,$phase,$role,$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal);
1.6 raeburn 782: $datatable .= '</tr></table></td></tr>';
783: return $datatable;
784: }
785:
786: sub display_color_options {
1.9 raeburn 787: my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
1.41 ! raeburn 788: $images,$bgs,$links,$alt_text,$rowtotal,$logintext,$loginheader) = @_;
1.6 raeburn 789: my $css_class = $itemcount%2?' class="LC_odd_row"':'';
790: my $datatable = '<tr'.$css_class.'>'.
791: '<td>'.$choices->{'font'}.'</td>';
792: if (!$is_custom->{'font'}) {
1.30 raeburn 793: $datatable .= '<td>'.&mt('Default in use:').' <span id="css_default_'.$role.'_font" style="color: '.$defaults->{'font'}.';">'.$defaults->{'font'}.'</span></td>';
1.6 raeburn 794: } else {
795: $datatable .= '<td> </td>';
796: }
797: my $fontlink = &color_pick($phase,$role,'font',$choices->{'font'},$designs->{'font'});
1.8 raeburn 798: $datatable .= '<td><span class="LC_nobreak">'.
1.6 raeburn 799: '<input type="text" size="10" name="'.$role.'_font"'.
1.8 raeburn 800: ' value="'.$designs->{'font'}.'" /> '.$fontlink.
1.30 raeburn 801: ' <span id="css_'.$role.'_font" style="background-color: '.
802: $designs->{'font'}.';"> </span>'.
1.8 raeburn 803: '</span></td></tr>';
1.9 raeburn 804: my $switchserver = &check_switchserver($dom,$confname);
1.6 raeburn 805: foreach my $img (@{$images}) {
1.18 albertel 806: $itemcount ++;
1.6 raeburn 807: $css_class = $itemcount%2?' class="LC_odd_row"':'';
1.8 raeburn 808: $datatable .= '<tr'.$css_class.'>'.
1.6 raeburn 809: '<td>'.$choices->{$img}.'</td>';
1.41 ! raeburn 810: my ($imgfile,$img_import,$login_hdr_pick,$logincolors);
1.6 raeburn 811: if ($designs->{$img} ne '') {
812: $imgfile = $designs->{$img};
1.18 albertel 813: $img_import = ($imgfile =~ m{^/adm/});
1.6 raeburn 814: } else {
815: $imgfile = $defaults->{$img};
816: }
1.41 ! raeburn 817: if ($img eq 'login') {
! 818: $login_hdr_pick = &login_header_options($img,$role,$defaults,$is_custom,$choices,
! 819: $loginheader);
! 820: $logincolors =
! 821: &login_text_colors($img,$role,$logintext,$phase,$choices,$designs);
! 822: }
1.6 raeburn 823: if ($imgfile) {
1.9 raeburn 824: my ($showfile,$fullsize);
825: if ($imgfile =~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) {
1.6 raeburn 826: my $urldir = $1;
827: my $filename = $2;
828: my @info = &Apache::lonnet::stat_file($designs->{$img});
829: if (@info) {
830: my $thumbfile = 'tn-'.$filename;
831: my @thumb=&Apache::lonnet::stat_file($urldir.'/'.$thumbfile);
832: if (@thumb) {
833: $showfile = $urldir.'/'.$thumbfile;
834: } else {
835: $showfile = $imgfile;
836: }
837: } else {
838: $showfile = '';
839: }
840: } elsif ($imgfile =~ m-^/(adm/[^/]+)/([^/]+)$-) {
1.16 raeburn 841: $showfile = $imgfile;
1.6 raeburn 842: my $imgdir = $1;
843: my $filename = $2;
844: if (-e "/home/httpd/html/$imgdir/tn-".$filename) {
845: $showfile = "/$imgdir/tn-".$filename;
846: } else {
847: my $input = "/home/httpd/html".$imgfile;
848: my $output = '/home/httpd/html/'.$imgdir.'/tn-'.$filename;
849: if (!-e $output) {
1.9 raeburn 850: my ($width,$height) = &thumb_dimensions();
1.16 raeburn 851: my ($fullwidth,$fullheight) = &check_dimensions($input);
852: if ($fullwidth ne '' && $fullheight ne '') {
853: if ($fullwidth > $width && $fullheight > $height) {
854: my $size = $width.'x'.$height;
855: system("convert -sample $size $input $output");
856: $showfile = '/'.$imgdir.'/tn-'.$filename;
857: }
858: }
1.6 raeburn 859: }
860: }
1.16 raeburn 861: }
1.6 raeburn 862: if ($showfile) {
1.40 raeburn 863: if ($showfile =~ m{^/(adm|res)/}) {
864: if ($showfile =~ m{^/res/}) {
865: my $local_showfile =
866: &Apache::lonnet::filelocation('',$showfile);
867: &Apache::lonnet::repcopy($local_showfile);
868: }
869: $showfile = &Apache::loncommon::lonhttpdurl($showfile);
870: }
871: if ($imgfile) {
872: if ($imgfile =~ m{^/(adm|res)/}) {
873: if ($imgfile =~ m{^/res/}) {
874: my $local_imgfile =
875: &Apache::lonnet::filelocation('',$imgfile);
876: &Apache::lonnet::repcopy($local_imgfile);
877: }
878: $fullsize = &Apache::loncommon::lonhttpdurl($imgfile);
879: } else {
880: $fullsize = $imgfile;
881: }
882: }
1.41 ! raeburn 883: $datatable .= '<td>';
! 884: if ($img eq 'login') {
! 885: $datatable .= $login_hdr_pick;
1.6 raeburn 886: }
1.41 ! raeburn 887: $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
! 888: $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
1.6 raeburn 889: } else {
890: $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
891: &mt('Upload:');
892: }
893: } else {
894: $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
895: &mt('Upload:');
896: }
1.9 raeburn 897: if ($switchserver) {
898: $datatable .= &mt('Upload to library server: [_1]',$switchserver);
899: } else {
900: $datatable .=' <input type="file" name="'.$role.'_'.$img.'" />';
901: }
902: $datatable .= '</td></tr>';
1.6 raeburn 903: }
904: $itemcount ++;
905: $css_class = $itemcount%2?' class="LC_odd_row"':'';
906: $datatable .= '<tr'.$css_class.'>'.
907: '<td>'.$choices->{'bgs'}.'</td>';
908: my $bgs_def;
909: foreach my $item (@{$bgs}) {
910: if (!$is_custom->{$item}) {
1.30 raeburn 911: $bgs_def .= '<td>'.$choices->{$item}.' <span id="css_default_'.$role.'_'.$item.'" style="background-color: '.$defaults->{'bgs'}{$item}.';"> </span><br />'.$defaults->{'bgs'}{$item}.'</td>';
1.6 raeburn 912: }
913: }
914: if ($bgs_def) {
1.8 raeburn 915: $datatable .= '<td>'.&mt('Default(s) in use:').'<br /><table border="0"><tr>'.$bgs_def.'</tr></table></td>';
1.6 raeburn 916: } else {
917: $datatable .= '<td> </td>';
918: }
919: $datatable .= '<td class="LC_right_item">'.
920: '<table border="0"><tr>';
921: foreach my $item (@{$bgs}) {
922: my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'bgs'}{$item});
923: $datatable .= '<td align="center">'.$link;
924: if ($designs->{'bgs'}{$item}) {
1.30 raeburn 925: $datatable .= ' <span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';"> </span>';
1.6 raeburn 926: }
927: $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.
1.41 ! raeburn 928: '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';
1.6 raeburn 929: }
930: $datatable .= '</tr></table></td></tr>';
931: $itemcount ++;
932: $css_class = $itemcount%2?' class="LC_odd_row"':'';
933: $datatable .= '<tr'.$css_class.'>'.
934: '<td>'.$choices->{'links'}.'</td>';
935: my $links_def;
936: foreach my $item (@{$links}) {
937: if (!$is_custom->{$item}) {
1.30 raeburn 938: $links_def .= '<td>'.$choices->{$item}.'<br /><span id="css_default_'.$role.'_'.$item.'" style="color: '.$defaults->{'links'}{$item}.';">'.$defaults->{'links'}{$item}.'</span></td>';
1.6 raeburn 939: }
940: }
941: if ($links_def) {
1.8 raeburn 942: $datatable .= '<td>'.&mt('Default(s) in use:').'<br /><table border="0"><tr>'.$links_def.'</tr></table></td>';
1.6 raeburn 943: } else {
944: $datatable .= '<td> </td>';
945: }
946: $datatable .= '<td class="LC_right_item">'.
947: '<table border="0"><tr>';
948: foreach my $item (@{$links}) {
1.30 raeburn 949: $datatable .= '<td align="center">'."\n".
950: &color_pick($phase,$role,$item,$choices->{$item},
951: $designs->{'links'}{$item});
1.6 raeburn 952: if ($designs->{'links'}{$item}) {
1.30 raeburn 953: $datatable.=' <span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'links'}{$item}.';"> </span>';
1.6 raeburn 954: }
955: $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'links'}{$item}.
956: '" /></td>';
957: }
1.30 raeburn 958: $$rowtotal += $itemcount;
1.3 raeburn 959: return $datatable;
960: }
961:
1.41 ! raeburn 962: sub login_header_options {
! 963: my ($img,$role,$defaults,$is_custom,$choices,$loginheader) = @_;
! 964: my $image_checked = ' checked="checked" ';
! 965: my $text_checked = ' ';
! 966: if ($loginheader eq 'text') {
! 967: $image_checked = ' ';
! 968: $text_checked = ' checked="checked" ';
! 969: }
! 970: my $output = '<span class="LC_nobreak"><label><input type="radio" name="'.
! 971: 'loginheader" value="image" '.$image_checked.'/>'.
! 972: &mt('use image').'</label> '.
! 973: '<label><input type="radio" name="loginheader" value="text"'.
! 974: $text_checked.'/>'.&mt('use text').'</label><br />'."\n";
! 975: if ((!$is_custom->{'textcol'}) || (!$is_custom->{'bgcol'})) {
! 976: $output .= &mt('Text default(s)').':<br />';
! 977: if (!$is_custom->{'textcol'}) {
! 978: $output .= $choices->{'textcol'}.': '.$defaults->{'logintext'}{'textcol'}.
! 979: ' ';
! 980: }
! 981: if (!$is_custom->{'bgcol'}) {
! 982: $output .= $choices->{'bgcol'}.': '.
! 983: '<span id="css_'.$role.'_font" style="background-color: '.
! 984: $defaults->{'logintext'}{'bgcol'}.';"> </span>';
! 985: }
! 986: $output .= '<br />';
! 987: }
! 988: $output .='<br />';
! 989: return $output;
! 990: }
! 991:
! 992: sub login_text_colors {
! 993: my ($img,$role,$logintext,$phase,$choices,$designs) = @_;
! 994: my $color_menu = '<table border="0"><tr>';
! 995: foreach my $item (@{$logintext}) {
! 996: my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item});
! 997: $color_menu .= '<td align="center">'.$link;
! 998: if ($designs->{'logintext'}{$item}) {
! 999: $color_menu .= ' <span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'logintext'}{$item}.';"> </span>';
! 1000: }
! 1001: $color_menu .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.
! 1002: $designs->{'logintext'}{$item}.'" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>'.
! 1003: '<td> </td>';
! 1004: }
! 1005: $color_menu .= '</tr></table><br />';
! 1006: return $color_menu;
! 1007: }
! 1008:
! 1009: sub image_changes {
! 1010: my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_;
! 1011: my $output;
! 1012: if (!$is_custom) {
! 1013: if ($img eq 'login') {
! 1014: $output .= &mt('Default image:').'<br />';
! 1015: } else {
! 1016: $output .= &mt('Default in use:').'<br />';
! 1017: }
! 1018: }
! 1019: if ($img_import) {
! 1020: $output .= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';
! 1021: }
! 1022: $output .= '<a href="'.$fullsize.'" target="_blank"><img src="'.
! 1023: $showfile.'" alt="'.$alt_text.'" border="0" /></a></td>';
! 1024: if ($is_custom) {
! 1025: $output .= '<td>'.$logincolors.'<span class="LC_nobreak"><label>'.
! 1026: '<input type="checkbox" name="'.
! 1027: $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').
! 1028: '</label> '.&mt('Replace:').'</span><br />';
! 1029: } else {
! 1030: $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<br />';
! 1031: }
! 1032: return $output;
! 1033: }
! 1034:
1.6 raeburn 1035: sub color_pick {
1036: my ($phase,$role,$item,$desc,$curcol) = @_;
1037: my $link = '<a href="javascript:pjump('."'color_custom','".$desc.
1038: "','".$curcol."','".$role.'_'.$item."','parmform.pres','psub'".
1039: ');">'.$desc.'</a>';
1040: return $link;
1041: }
1042:
1043: sub color_pick_js {
1044: my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1045: my $output = <<"ENDCOL";
1046: function pclose() {
1047: parmwin=window.open("/adm/rat/empty.html","LONCAPAparms","height=350,width=350,scrollbars=no,menubar=no");
1048: parmwin.close();
1049: }
1050:
1051: $pjump_def
1052:
1053: function psub() {
1054: pclose();
1055: if (document.parmform.pres_marker.value!='') {
1056: if (document.parmform.pres_type.value!='') {
1057: eval('document.display.'+
1058: document.parmform.pres_marker.value+
1059: '.value=document.parmform.pres_value.value;');
1060: }
1061: } else {
1062: document.parmform.pres_value.value='';
1063: document.parmform.pres_marker.value='';
1064: }
1065: }
1.41 ! raeburn 1066:
! 1067: function get_id (span_id) {
! 1068: if (document.getElementById) {
! 1069: return document.getElementById(span_id);
! 1070: }
! 1071: if (document.all) {
! 1072: return document.all[span_id];
! 1073: }
! 1074: return false;
! 1075: }
! 1076:
! 1077: function colchg_span (span_id_str,new_color_item) {
! 1078: var span_ref = get_id(span_id_str);
! 1079: if (span_ref.style) { span_ref = span_ref.style; }
! 1080: span_ref.background = new_color_item.value;
! 1081: span_ref.backgroundColor = new_color_item.value;
! 1082: span_ref.bgColor = new_color_item.value;
! 1083: }
! 1084:
1.6 raeburn 1085: ENDCOL
1086: return $output;
1087: }
1088:
1.3 raeburn 1089: sub print_quotas {
1.30 raeburn 1090: my ($dom,$settings,$rowtotal) = @_;
1.3 raeburn 1091: my $datatable;
1.23 raeburn 1092: my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
1.3 raeburn 1093: my $typecount = 0;
1094: my $css_class;
1.26 raeburn 1095: if (ref($types) eq 'ARRAY') {
1.23 raeburn 1096: foreach my $type (@{$types}) {
1.3 raeburn 1097: if (defined($usertypes->{$type})) {
1098: $typecount ++;
1099: $css_class = $typecount%2?' class="LC_odd_row"':'';
1100: $datatable .= '<tr'.$css_class.'>'.
1101: '<td>'.$usertypes->{$type}.'</td>'.
1.8 raeburn 1102: '<td class="LC_right_item"><span class="LC_nobreak">'.
1.3 raeburn 1103: '<input type="text" name="quota_'.$type.
1104: '" value="'.$settings->{$type}.
1.8 raeburn 1105: '" size="5" /> Mb</span></td></tr>';
1.3 raeburn 1106: }
1107: }
1108: }
1109: my $defaultquota = '20';
1110: if (ref($settings) eq 'HASH') {
1111: if (defined($settings->{'default'})) {
1112: $defaultquota = $settings->{'default'};
1113: }
1114: }
1115: $typecount ++;
1116: $css_class = $typecount%2?' class="LC_odd_row"':'';
1117: $datatable .= '<tr'.$css_class.'>'.
1.26 raeburn 1118: '<td>'.$othertitle.'</td>'.
1.8 raeburn 1119: '<td class="LC_right_item"><span class="LC_nobreak">'.
1.15 raeburn 1120: '<input type="text" name="defaultquota" value="'.
1.8 raeburn 1121: $defaultquota.'" size="5" /> Mb</span></td></tr>';
1.30 raeburn 1122: $$rowtotal += $typecount;
1.3 raeburn 1123: return $datatable;
1124: }
1125:
1126: sub print_autoenroll {
1.30 raeburn 1127: my ($dom,$settings,$rowtotal) = @_;
1.3 raeburn 1128: my $autorun = &Apache::lonnet::auto_run(undef,$dom),
1.17 raeburn 1129: my ($defdom,$runon,$runoff);
1.3 raeburn 1130: if (ref($settings) eq 'HASH') {
1131: if (exists($settings->{'run'})) {
1132: if ($settings->{'run'} eq '0') {
1133: $runoff = ' checked="checked" ';
1134: $runon = ' ';
1135: } else {
1136: $runon = ' checked="checked" ';
1137: $runoff = ' ';
1138: }
1139: } else {
1140: if ($autorun) {
1141: $runon = ' checked="checked" ';
1142: $runoff = ' ';
1143: } else {
1144: $runoff = ' checked="checked" ';
1145: $runon = ' ';
1146: }
1147: }
1148: if (exists($settings->{'sender_domain'})) {
1149: $defdom = $settings->{'sender_domain'};
1150: }
1.14 raeburn 1151: } else {
1152: if ($autorun) {
1153: $runon = ' checked="checked" ';
1154: $runoff = ' ';
1155: } else {
1156: $runoff = ' checked="checked" ';
1157: $runon = ' ';
1158: }
1.3 raeburn 1159: }
1160: my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);
1.39 raeburn 1161: my $notif_sender;
1162: if (ref($settings) eq 'HASH') {
1163: $notif_sender = $settings->{'sender_uname'};
1164: }
1.3 raeburn 1165: my $datatable='<tr class="LC_odd_row">'.
1166: '<td>'.&mt('Auto-enrollment active?').'</td>'.
1.8 raeburn 1167: '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
1.3 raeburn 1168: '<input type="radio" name="autoenroll_run"'.
1.8 raeburn 1169: $runon.' value="1" />'.&mt('Yes').'</label> '.
1170: '<label><input type="radio" name="autoenroll_run"'.
1.14 raeburn 1171: $runoff.' value="0" />'.&mt('No').'</label></span></td>'.
1.3 raeburn 1172: '</tr><tr>'.
1173: '<td>'.&mt('Notification messages - sender').
1.8 raeburn 1174: '</td><td class="LC_right_item"><span class="LC_nobreak">'.
1.3 raeburn 1175: &mt('username').': '.
1176: '<input type="text" name="sender_uname" value="'.
1.39 raeburn 1177: $notif_sender.'" size="10" /> '.&mt('domain').
1.8 raeburn 1178: ': '.$domform.'</span></td></tr>';
1.30 raeburn 1179: $$rowtotal += 2;
1.3 raeburn 1180: return $datatable;
1181: }
1182:
1183: sub print_autoupdate {
1.30 raeburn 1184: my ($position,$dom,$settings,$rowtotal) = @_;
1.3 raeburn 1185: my $datatable;
1186: if ($position eq 'top') {
1187: my $updateon = ' ';
1188: my $updateoff = ' checked="checked" ';
1189: my $classlistson = ' ';
1190: my $classlistsoff = ' checked="checked" ';
1191: if (ref($settings) eq 'HASH') {
1192: if ($settings->{'run'} eq '1') {
1193: $updateon = $updateoff;
1194: $updateoff = ' ';
1195: }
1196: if ($settings->{'classlists'} eq '1') {
1197: $classlistson = $classlistsoff;
1198: $classlistsoff = ' ';
1199: }
1200: }
1201: my %title = (
1202: run => 'Auto-update active?',
1203: classlists => 'Update information in classlists?',
1204: );
1205: $datatable = '<tr class="LC_odd_row">'.
1206: '<td>'.&mt($title{'run'}).'</td>'.
1.8 raeburn 1207: '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
1.3 raeburn 1208: '<input type="radio" name="autoupdate_run"'.
1.8 raeburn 1209: $updateon.' value="1" />'.&mt('Yes').'</label> '.
1210: '<label><input type="radio" name="autoupdate_run"'.
1211: $updateoff.'value="0" />'.&mt('No').'</label></span></td>'.
1.3 raeburn 1212: '</tr><tr>'.
1213: '<td>'.&mt($title{'classlists'}).'</td>'.
1.8 raeburn 1214: '<td class="LC_right_item"><span class="LC_nobreak">'.
1215: '<label><input type="radio" name="classlists"'.
1216: $classlistson.' value="1" />'.&mt('Yes').'</label> '.
1217: '<label><input type="radio" name="classlists"'.
1218: $classlistsoff.'value="0" />'.&mt('No').'</label></span></td>'.
1.3 raeburn 1219: '</tr>';
1.30 raeburn 1220: $$rowtotal += 2;
1.3 raeburn 1221: } else {
1.23 raeburn 1222: my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
1.20 raeburn 1223: my @fields = ('lastname','firstname','middlename','gen',
1224: 'permanentemail','id');
1.33 raeburn 1225: my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
1.3 raeburn 1226: my $numrows = 0;
1.26 raeburn 1227: if (ref($types) eq 'ARRAY') {
1228: if (@{$types} > 0) {
1229: $datatable =
1230: &usertype_update_row($settings,$usertypes,\%fieldtitles,
1231: \@fields,$types,\$numrows);
1.30 raeburn 1232: $$rowtotal += @{$types};
1.26 raeburn 1233: }
1.3 raeburn 1234: }
1235: $datatable .=
1236: &usertype_update_row($settings,{'default' => $othertitle},
1237: \%fieldtitles,\@fields,['default'],
1238: \$numrows);
1.30 raeburn 1239: $$rowtotal ++;
1.3 raeburn 1240: }
1241: return $datatable;
1242: }
1243:
1.23 raeburn 1244: sub print_directorysrch {
1.30 raeburn 1245: my ($dom,$settings,$rowtotal) = @_;
1.23 raeburn 1246: my $srchon = ' ';
1247: my $srchoff = ' checked="checked" ';
1.25 raeburn 1248: my ($exacton,$containson,$beginson);
1.24 raeburn 1249: my $localon = ' ';
1250: my $localoff = ' checked="checked" ';
1.23 raeburn 1251: if (ref($settings) eq 'HASH') {
1252: if ($settings->{'available'} eq '1') {
1253: $srchon = $srchoff;
1254: $srchoff = ' ';
1255: }
1.24 raeburn 1256: if ($settings->{'localonly'} eq '1') {
1257: $localon = $localoff;
1258: $localoff = ' ';
1259: }
1.25 raeburn 1260: if (ref($settings->{'searchtypes'}) eq 'ARRAY') {
1261: foreach my $type (@{$settings->{'searchtypes'}}) {
1262: if ($type eq 'exact') {
1263: $exacton = ' checked="checked" ';
1264: } elsif ($type eq 'contains') {
1265: $containson = ' checked="checked" ';
1266: } elsif ($type eq 'begins') {
1267: $beginson = ' checked="checked" ';
1268: }
1269: }
1270: } else {
1271: if ($settings->{'searchtypes'} eq 'exact') {
1272: $exacton = ' checked="checked" ';
1273: } elsif ($settings->{'searchtypes'} eq 'contains') {
1274: $containson = ' checked="checked" ';
1275: } elsif ($settings->{'searchtypes'} eq 'specify') {
1276: $exacton = ' checked="checked" ';
1277: $containson = ' checked="checked" ';
1278: }
1.23 raeburn 1279: }
1280: }
1281: my ($searchtitles,$titleorder) = &sorted_searchtitles();
1282: my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
1283:
1284: my $numinrow = 4;
1.26 raeburn 1285: my $cansrchrow = 0;
1.23 raeburn 1286: my $datatable='<tr class="LC_odd_row">'.
1.30 raeburn 1287: '<td colspan="2"><span class ="LC_nobreak">'.&mt('Directory search available?').'</span></td>'.
1.23 raeburn 1288: '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
1289: '<input type="radio" name="dirsrch_available"'.
1290: $srchon.' value="1" />'.&mt('Yes').'</label> '.
1291: '<label><input type="radio" name="dirsrch_available"'.
1292: $srchoff.' value="0" />'.&mt('No').'</label></span></td>'.
1293: '</tr><tr>'.
1.30 raeburn 1294: '<td colspan="2"><span class ="LC_nobreak">'.&mt('Other domains can search?').'</span></td>'.
1.24 raeburn 1295: '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
1296: '<input type="radio" name="dirsrch_localonly"'.
1297: $localoff.' value="0" />'.&mt('Yes').'</label> '.
1298: '<label><input type="radio" name="dirsrch_localonly"'.
1299: $localon.' value="1" />'.&mt('No').'</label></span></td>'.
1.25 raeburn 1300: '</tr>';
1.30 raeburn 1301: $$rowtotal += 2;
1.26 raeburn 1302: if (ref($usertypes) eq 'HASH') {
1303: if (keys(%{$usertypes}) > 0) {
1304: $datatable .= &users_cansearch_row($settings,$types,$usertypes,$dom,
1305: $numinrow,$othertitle);
1306: $cansrchrow = 1;
1307: }
1308: }
1309: if ($cansrchrow) {
1.30 raeburn 1310: $$rowtotal ++;
1.26 raeburn 1311: $datatable .= '<tr>';
1312: } else {
1313: $datatable .= '<tr class="LC_odd_row">';
1314: }
1.30 raeburn 1315: $datatable .= '<td><span class ="LC_nobreak">'.&mt('Supported search methods').
1316: '</span></td><td class="LC_left_item" colspan="2"><table><tr>';
1.25 raeburn 1317: foreach my $title (@{$titleorder}) {
1318: if (defined($searchtitles->{$title})) {
1319: my $check = ' ';
1.39 raeburn 1320: if (ref($settings) eq 'HASH') {
1321: if (ref($settings->{'searchby'}) eq 'ARRAY') {
1322: if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
1323: $check = ' checked="checked" ';
1324: }
1.25 raeburn 1325: }
1326: }
1327: $datatable .= '<td class="LC_left_item">'.
1328: '<span class="LC_nobreak"><label>'.
1329: '<input type="checkbox" name="searchby" '.
1330: 'value="'.$title.'"'.$check.'/>'.
1331: $searchtitles->{$title}.'</label></span></td>';
1332: }
1333: }
1.26 raeburn 1334: $datatable .= '</tr></table></td></tr>';
1.30 raeburn 1335: $$rowtotal ++;
1.26 raeburn 1336: if ($cansrchrow) {
1337: $datatable .= '<tr class="LC_odd_row">';
1338: } else {
1339: $datatable .= '<tr>';
1340: }
1.30 raeburn 1341: $datatable .= '<td><span class ="LC_nobreak">'.&mt('Search latitude').'</span></td>'.
1.26 raeburn 1342: '<td class="LC_left_item" colspan="2">'.
1.25 raeburn 1343: '<span class="LC_nobreak"><label>'.
1344: '<input type="checkbox" name="searchtypes" '.
1345: $exacton.' value="exact" />'.&mt('Exact match').
1346: '</label> '.
1347: '<label><input type="checkbox" name="searchtypes" '.
1348: $beginson.' value="begins" />'.&mt('Begins with').
1349: '</label> '.
1350: '<label><input type="checkbox" name="searchtypes" '.
1351: $containson.' value="contains" />'.&mt('Contains').
1352: '</label></span></td></tr>';
1.30 raeburn 1353: $$rowtotal ++;
1.25 raeburn 1354: return $datatable;
1355: }
1356:
1.28 raeburn 1357: sub print_contacts {
1.30 raeburn 1358: my ($dom,$settings,$rowtotal) = @_;
1.28 raeburn 1359: my $datatable;
1360: my @contacts = ('adminemail','supportemail');
1361: my (%checked,%to,%otheremails);
1362: my @mailings = ('errormail','packagesmail','helpdeskmail');
1363: foreach my $type (@mailings) {
1364: $otheremails{$type} = '';
1365: }
1366: if (ref($settings) eq 'HASH') {
1367: foreach my $item (@contacts) {
1368: if (exists($settings->{$item})) {
1369: $to{$item} = $settings->{$item};
1370: }
1371: }
1372: foreach my $type (@mailings) {
1373: if (exists($settings->{$type})) {
1374: if (ref($settings->{$type}) eq 'HASH') {
1375: foreach my $item (@contacts) {
1376: if ($settings->{$type}{$item}) {
1377: $checked{$type}{$item} = ' checked="checked" ';
1378: }
1379: }
1380: $otheremails{$type} = $settings->{$type}{'others'};
1381: }
1382: }
1383: }
1384: } else {
1385: $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
1386: $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
1387: $checked{'errormail'}{'adminemail'} = ' checked="checked" ';
1388: $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';
1389: $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
1390: }
1391: my ($titles,$short_titles) = &contact_titles();
1392: my $rownum = 0;
1393: my $css_class;
1394: foreach my $item (@contacts) {
1395: if ($rownum%2) {
1396: $css_class = '';
1397: } else {
1398: $css_class = ' class="LC_odd_row" ';
1399: }
1.30 raeburn 1400: $datatable .= '<tr'.$css_class.'>'.
1401: '<td><span class="LC_nobreak">'.$titles->{$item}.
1402: '</span></td><td class="LC_right_item">'.
1.28 raeburn 1403: '<input type="text" name="'.$item.'" value="'.
1404: $to{$item}.'" /></td></tr>';
1405: $rownum ++;
1406: }
1407: foreach my $type (@mailings) {
1408: if ($rownum%2) {
1409: $css_class = '';
1410: } else {
1411: $css_class = ' class="LC_odd_row" ';
1412: }
1413: $datatable .= '<tr'.$css_class.'>'.
1.30 raeburn 1414: '<td><span class="LC_nobreak">'.
1415: $titles->{$type}.': </span></td>'.
1.28 raeburn 1416: '<td class="LC_left_item">'.
1417: '<span class="LC_nobreak">';
1418: foreach my $item (@contacts) {
1419: $datatable .= '<label>'.
1420: '<input type="checkbox" name="'.$type.'"'.
1421: $checked{$type}{$item}.
1422: ' value="'.$item.'" />'.$short_titles->{$item}.
1423: '</label> ';
1424: }
1425: $datatable .= '</span><br />'.&mt('Others').': '.
1426: '<input type="text" name="'.$type.'_others" '.
1427: 'value="'.$otheremails{$type}.'" />'.
1428: '</td></tr>'."\n";
1429: $rownum ++;
1430: }
1.30 raeburn 1431: $$rowtotal += $rownum;
1.28 raeburn 1432: return $datatable;
1433: }
1434:
1435: sub contact_titles {
1436: my %titles = &Apache::lonlocal::texthash (
1437: 'supportemail' => 'Support E-mail address',
1438: 'adminemail' => 'Default Server Admin E-mail address',
1439: 'errormail' => 'Error reports to be e-mailed to',
1440: 'packagesmail' => 'Package update alerts to be e-mailed to',
1441: 'helpdeskmail' => 'Helpdesk requests to be e-mailed to'
1442: );
1443: my %short_titles = &Apache::lonlocal::texthash (
1444: adminemail => 'Admin E-mail address',
1445: supportemail => 'Support E-mail',
1446: );
1447: return (\%titles,\%short_titles);
1448: }
1449:
1.27 raeburn 1450: sub print_usercreation {
1.30 raeburn 1451: my ($position,$dom,$settings,$rowtotal) = @_;
1.27 raeburn 1452: my $numinrow = 4;
1.28 raeburn 1453: my $datatable;
1454: if ($position eq 'top') {
1.30 raeburn 1455: $$rowtotal ++;
1.34 raeburn 1456: my $rowcount = 0;
1.32 raeburn 1457: my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username');
1.28 raeburn 1458: if (ref($rules) eq 'HASH') {
1459: if (keys(%{$rules}) > 0) {
1.32 raeburn 1460: $datatable .= &user_formats_row('username',$settings,$rules,
1461: $ruleorder,$numinrow,$rowcount);
1.30 raeburn 1462: $$rowtotal ++;
1.32 raeburn 1463: $rowcount ++;
1464: }
1465: }
1466: my ($idrules,$idruleorder) = &Apache::lonnet::inst_userrules($dom,'id');
1467: if (ref($idrules) eq 'HASH') {
1468: if (keys(%{$idrules}) > 0) {
1469: $datatable .= &user_formats_row('id',$settings,$idrules,
1470: $idruleorder,$numinrow,$rowcount);
1471: $$rowtotal ++;
1472: $rowcount ++;
1.28 raeburn 1473: }
1474: }
1.39 raeburn 1475: if ($rowcount == 0) {
1476: $datatable .= '<tr><td colspan="2">'.&mt('No format rules have been defined for usernames or IDs in this domain.').'</td></tr>';
1477: $$rowtotal ++;
1478: $rowcount ++;
1479: }
1.34 raeburn 1480: } elsif ($position eq 'middle') {
1481: my @creators = ('author','course');
1.37 raeburn 1482: my ($rules,$ruleorder) =
1483: &Apache::lonnet::inst_userrules($dom,'username');
1.34 raeburn 1484: my %lt = &usercreation_types();
1485: my %checked;
1486: if (ref($settings) eq 'HASH') {
1487: if (ref($settings->{'cancreate'}) eq 'HASH') {
1488: foreach my $item (@creators) {
1489: $checked{$item} = $settings->{'cancreate'}{$item};
1490: }
1491: } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {
1492: foreach my $item (@creators) {
1493: if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {
1494: $checked{$item} = 'none';
1495: }
1496: }
1497: }
1498: }
1499: my $rownum = 0;
1500: foreach my $item (@creators) {
1501: $rownum ++;
1502: if ($checked{$item} eq '') {
1503: $checked{$item} = 'any';
1504: }
1505: my $css_class;
1506: if ($rownum%2) {
1507: $css_class = '';
1508: } else {
1509: $css_class = ' class="LC_odd_row" ';
1510: }
1511: $datatable .= '<tr'.$css_class.'>'.
1512: '<td><span class="LC_nobreak">'.$lt{$item}.
1513: '</span></td><td align="right">';
1.37 raeburn 1514: my @options = ('any');
1515: if (ref($rules) eq 'HASH') {
1516: if (keys(%{$rules}) > 0) {
1517: push(@options,('official','unofficial'));
1518: }
1519: }
1520: push(@options,'none');
1521: foreach my $option (@options) {
1.34 raeburn 1522: my $check = ' ';
1523: if ($checked{$item} eq $option) {
1524: $check = ' checked="checked" ';
1525: }
1526: $datatable .= '<span class="LC_nobreak"><label>'.
1527: '<input type="radio" name="can_createuser_'.
1528: $item.'" value="'.$option.'"'.$check.'/> '.
1529: $lt{$option}.'</label> </span>';
1530: }
1531: $datatable .= '</td></tr>';
1532: }
1.28 raeburn 1533: } else {
1534: my @contexts = ('author','course','domain');
1535: my @authtypes = ('int','krb4','krb5','loc');
1536: my %checked;
1537: if (ref($settings) eq 'HASH') {
1538: if (ref($settings->{'authtypes'}) eq 'HASH') {
1539: foreach my $item (@contexts) {
1540: if (ref($settings->{'authtypes'}{$item}) eq 'HASH') {
1541: foreach my $auth (@authtypes) {
1542: if ($settings->{'authtypes'}{$item}{$auth}) {
1543: $checked{$item}{$auth} = ' checked="checked" ';
1544: }
1545: }
1546: }
1547: }
1.27 raeburn 1548: }
1.35 raeburn 1549: } else {
1550: foreach my $item (@contexts) {
1.36 raeburn 1551: foreach my $auth (@authtypes) {
1.35 raeburn 1552: $checked{$item}{$auth} = ' checked="checked" ';
1553: }
1554: }
1.27 raeburn 1555: }
1.28 raeburn 1556: my %title = &context_names();
1557: my %authname = &authtype_names();
1558: my $rownum = 0;
1559: my $css_class;
1560: foreach my $item (@contexts) {
1561: if ($rownum%2) {
1562: $css_class = '';
1563: } else {
1564: $css_class = ' class="LC_odd_row" ';
1565: }
1.30 raeburn 1566: $datatable .= '<tr'.$css_class.'>'.
1.28 raeburn 1567: '<td>'.$title{$item}.
1568: '</td><td class="LC_left_item">'.
1569: '<span class="LC_nobreak">';
1570: foreach my $auth (@authtypes) {
1571: $datatable .= '<label>'.
1572: '<input type="checkbox" name="'.$item.'_auth" '.
1573: $checked{$item}{$auth}.' value="'.$auth.'" />'.
1574: $authname{$auth}.'</label> ';
1575: }
1576: $datatable .= '</span></td></tr>';
1577: $rownum ++;
1.27 raeburn 1578: }
1.30 raeburn 1579: $$rowtotal += $rownum;
1.27 raeburn 1580: }
1581: return $datatable;
1582: }
1583:
1.32 raeburn 1584: sub user_formats_row {
1585: my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
1586: my $output;
1587: my %text = (
1588: 'username' => 'new usernames',
1589: 'id' => 'IDs',
1590: );
1591: my $css_class = $rowcount%2?' class="LC_odd_row"':'';
1592: $output = '<tr '.$css_class.'>'.
1593: '<td><span class="LC_nobreak">'.
1594: &mt("Format rules to check for $text{$type}: ").
1595: '</span></td>'.
1596: '<td class="LC_left_item" colspan="2"><table>';
1.27 raeburn 1597: my $rem;
1598: if (ref($ruleorder) eq 'ARRAY') {
1599: for (my $i=0; $i<@{$ruleorder}; $i++) {
1600: if (ref($rules->{$ruleorder->[$i]}) eq 'HASH') {
1601: my $rem = $i%($numinrow);
1602: if ($rem == 0) {
1603: if ($i > 0) {
1604: $output .= '</tr>';
1605: }
1606: $output .= '<tr>';
1607: }
1608: my $check = ' ';
1.39 raeburn 1609: if (ref($settings) eq 'HASH') {
1610: if (ref($settings->{$type.'_rule'}) eq 'ARRAY') {
1611: if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) {
1612: $check = ' checked="checked" ';
1613: }
1.27 raeburn 1614: }
1615: }
1616: $output .= '<td class="LC_left_item">'.
1617: '<span class="LC_nobreak"><label>'.
1.32 raeburn 1618: '<input type="checkbox" name="'.$type.'_rule" '.
1.27 raeburn 1619: 'value="'.$ruleorder->[$i].'"'.$check.'/>'.
1620: $rules->{$ruleorder->[$i]}{'name'}.'</label></span></td>';
1621: }
1622: }
1623: $rem = @{$ruleorder}%($numinrow);
1624: }
1625: my $colsleft = $numinrow - $rem;
1626: if ($colsleft > 1 ) {
1627: $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
1628: ' </td>';
1629: } elsif ($colsleft == 1) {
1630: $output .= '<td class="LC_left_item"> </td>';
1631: }
1632: $output .= '</tr></table></td></tr>';
1633: return $output;
1634: }
1635:
1.34 raeburn 1636: sub usercreation_types {
1637: my %lt = &Apache::lonlocal::texthash (
1638: author => 'When adding a co-author',
1639: course => 'When adding a user to a course',
1640: any => 'Any',
1641: official => 'Institutional only ',
1642: unofficial => 'Non-institutional only',
1643: none => 'None',
1644: );
1645: return %lt;
1646: }
1647:
1.28 raeburn 1648: sub authtype_names {
1649: my %lt = &Apache::lonlocal::texthash(
1650: int => 'Internal',
1651: krb4 => 'Kerberos 4',
1652: krb5 => 'Kerberos 5',
1653: loc => 'Local',
1654: );
1655: return %lt;
1656: }
1657:
1658: sub context_names {
1659: my %context_title = &Apache::lonlocal::texthash(
1660: author => 'Creating users when an Author',
1661: course => 'Creating users when in a course',
1662: domain => 'Creating users when a Domain Coordinator',
1663: );
1664: return %context_title;
1665: }
1666:
1.33 raeburn 1667: sub print_usermodification {
1668: my ($position,$dom,$settings,$rowtotal) = @_;
1669: my $numinrow = 4;
1670: my ($context,$datatable,$rowcount);
1671: if ($position eq 'top') {
1672: $rowcount = 0;
1673: $context = 'author';
1674: foreach my $role ('ca','aa') {
1675: $datatable .= &modifiable_userdata_row($context,$role,$settings,
1676: $numinrow,$rowcount);
1677: $$rowtotal ++;
1678: $rowcount ++;
1679: }
1680: } else {
1681: $context = 'course';
1682: $rowcount = 0;
1683: foreach my $role ('st','ep','ta','in','cr') {
1684: $datatable .= &modifiable_userdata_row($context,$role,$settings,
1685: $numinrow,$rowcount);
1686: $$rowtotal ++;
1687: $rowcount ++;
1688: }
1689: }
1690: return $datatable;
1691: }
1692:
1693: sub modifiable_userdata_row {
1694: my ($context,$role,$settings,$numinrow,$rowcount) = @_;
1695: my $rolename;
1696: if ($role eq 'cr') {
1697: $rolename = &mt('Custom role');
1698: } else {
1699: $rolename = &Apache::lonnet::plaintext($role);
1700: }
1701: my @fields = ('lastname','firstname','middlename','generation',
1702: 'permanentemail','id');
1703: my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
1704: my $output;
1705: my $css_class = $rowcount%2?' class="LC_odd_row"':'';
1706: $output = '<tr '.$css_class.'>'.
1707: '<td><span class="LC_nobreak">'.$rolename.'</span></td>'.
1708: '<td class="LC_left_item" colspan="2"><table>';
1709: my $rem;
1710: my %checks;
1711: if (ref($settings) eq 'HASH') {
1712: if (ref($settings->{$context}) eq 'HASH') {
1713: if (ref($settings->{$context}->{$role}) eq 'HASH') {
1714: foreach my $field (@fields) {
1715: if ($settings->{$context}->{$role}->{$field}) {
1716: $checks{$field} = ' checked="checked" ';
1717: }
1718: }
1719: }
1720: }
1721: }
1722: for (my $i=0; $i<@fields; $i++) {
1723: my $rem = $i%($numinrow);
1724: if ($rem == 0) {
1725: if ($i > 0) {
1726: $output .= '</tr>';
1727: }
1728: $output .= '<tr>';
1729: }
1730: my $check = ' ';
1731: if (exists($checks{$fields[$i]})) {
1732: $check = $checks{$fields[$i]}
1733: } else {
1734: if ($role eq 'st') {
1735: if (ref($settings) ne 'HASH') {
1736: $check = ' checked="checked" ';
1737: }
1738: }
1739: }
1740: $output .= '<td class="LC_left_item">'.
1741: '<span class="LC_nobreak"><label>'.
1742: '<input type="checkbox" name="canmodify_'.$role.'" '.
1743: 'value="'.$fields[$i].'"'.$check.'/>'.$fieldtitles{$fields[$i]}.
1744: '</label></span></td>';
1745: $rem = @fields%($numinrow);
1746: }
1747: my $colsleft = $numinrow - $rem;
1748: if ($colsleft > 1 ) {
1749: $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
1750: ' </td>';
1751: } elsif ($colsleft == 1) {
1752: $output .= '<td class="LC_left_item"> </td>';
1753: }
1754: $output .= '</tr></table></td></tr>';
1755: return $output;
1756: }
1.28 raeburn 1757:
1.25 raeburn 1758: sub users_cansearch_row {
1759: my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_;
1760: my $output = '<tr class="LC_odd_row">'.
1.24 raeburn 1761: '<td>'.&mt('Users allowed to search').' ('.$dom.')'.
1762: '</td><td class="LC_left_item" colspan="2"><table>';
1.26 raeburn 1763: my $rem;
1764: if (ref($types) eq 'ARRAY') {
1765: for (my $i=0; $i<@{$types}; $i++) {
1766: if (defined($usertypes->{$types->[$i]})) {
1767: my $rem = $i%($numinrow);
1768: if ($rem == 0) {
1769: if ($i > 0) {
1770: $output .= '</tr>';
1771: }
1772: $output .= '<tr>';
1.23 raeburn 1773: }
1.26 raeburn 1774: my $check = ' ';
1775: if (ref($settings->{'cansearch'}) eq 'ARRAY') {
1776: if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) {
1777: $check = ' checked="checked" ';
1778: }
1.23 raeburn 1779: }
1.26 raeburn 1780: $output .= '<td class="LC_left_item">'.
1781: '<span class="LC_nobreak"><label>'.
1782: '<input type="checkbox" name="cansearch" '.
1783: 'value="'.$types->[$i].'"'.$check.'/>'.
1784: $usertypes->{$types->[$i]}.'</label></span></td>';
1.23 raeburn 1785: }
1786: }
1.26 raeburn 1787:
1788: $rem = @{$types}%($numinrow);
1.23 raeburn 1789: }
1790: my $colsleft = $numinrow - $rem;
1791: if ($colsleft > 1) {
1.25 raeburn 1792: $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
1.23 raeburn 1793: } else {
1.25 raeburn 1794: $output .= '<td class="LC_left_item">';
1.23 raeburn 1795: }
1796: my $defcheck = ' ';
1797: if (ref($settings->{'cansearch'}) eq 'ARRAY') {
1.26 raeburn 1798: if (grep(/^default$/,@{$settings->{'cansearch'}})) {
1799: $defcheck = ' checked="checked" ';
1800: }
1.23 raeburn 1801: }
1.25 raeburn 1802: $output .= '<span class="LC_nobreak"><label>'.
1803: '<input type="checkbox" name="cansearch" '.
1804: 'value="default"'.$defcheck.'/>'.
1805: $othertitle.'</label></span></td>'.
1806: '</tr></table></td></tr>';
1807: return $output;
1.23 raeburn 1808: }
1809:
1810: sub sorted_inst_types {
1811: my ($dom) = @_;
1812: my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
1.26 raeburn 1813: my $othertitle = &mt('All users');
1.23 raeburn 1814: my @types;
1815: if (ref($order) eq 'ARRAY') {
1816: @types = @{$order};
1817: }
1818: if (@types == 0) {
1819: if (ref($usertypes) eq 'HASH') {
1820: @types = sort(keys(%{$usertypes}));
1821: }
1822: }
1823: if (keys(%{$usertypes}) > 0) {
1824: $othertitle = &mt('Other users');
1825: }
1826: return ($othertitle,$usertypes,\@types);
1827: }
1828:
1829: sub sorted_searchtitles {
1830: my %searchtitles = &Apache::lonlocal::texthash(
1831: 'uname' => 'username',
1832: 'lastname' => 'last name',
1833: 'lastfirst' => 'last name, first name',
1834: );
1835: my @titleorder = ('uname','lastname','lastfirst');
1836: return (\%searchtitles,\@titleorder);
1837: }
1838:
1.25 raeburn 1839: sub sorted_searchtypes {
1840: my %srchtypes_desc = (
1841: exact => 'is exact match',
1842: contains => 'contains ..',
1843: begins => 'begins with ..',
1844: );
1845: my @srchtypeorder = ('exact','begins','contains');
1846: return (\%srchtypes_desc,\@srchtypeorder);
1847: }
1848:
1.3 raeburn 1849: sub usertype_update_row {
1850: my ($settings,$usertypes,$fieldtitles,$fields,$types,$rownums) = @_;
1851: my $datatable;
1852: my $numinrow = 4;
1853: foreach my $type (@{$types}) {
1854: if (defined($usertypes->{$type})) {
1855: $$rownums ++;
1856: my $css_class = $$rownums%2?' class="LC_odd_row"':'';
1857: $datatable .= '<tr'.$css_class.'><td>'.$usertypes->{$type}.
1858: '</td><td class="LC_left_item"><table>';
1859: for (my $i=0; $i<@{$fields}; $i++) {
1860: my $rem = $i%($numinrow);
1861: if ($rem == 0) {
1862: if ($i > 0) {
1863: $datatable .= '</tr>';
1864: }
1865: $datatable .= '<tr>';
1866: }
1867: my $check = ' ';
1.39 raeburn 1868: if (ref($settings) eq 'HASH') {
1869: if (ref($settings->{'fields'}) eq 'HASH') {
1870: if (ref($settings->{'fields'}{$type}) eq 'ARRAY') {
1871: if (grep(/^\Q$fields->[$i]\E$/,@{$settings->{'fields'}{$type}})) {
1872: $check = ' checked="checked" ';
1873: }
1.3 raeburn 1874: }
1875: }
1876: }
1877:
1878: if ($i == @{$fields}-1) {
1879: my $colsleft = $numinrow - $rem;
1880: if ($colsleft > 1) {
1881: $datatable .= '<td colspan="'.$colsleft.'">';
1882: } else {
1883: $datatable .= '<td>';
1884: }
1885: } else {
1886: $datatable .= '<td>';
1887: }
1.8 raeburn 1888: $datatable .= '<span class="LC_nobreak"><label>'.
1889: '<input type="checkbox" name="updateable_'.$type.
1890: '_'.$fields->[$i].'" value="1"'.$check.'/>'.
1891: $fieldtitles->{$fields->[$i]}.'</label></span></td>';
1.3 raeburn 1892: }
1893: $datatable .= '</tr></table></td></tr>';
1894: }
1895: }
1896: return $datatable;
1.1 raeburn 1897: }
1898:
1899: sub modify_login {
1.9 raeburn 1900: my ($r,$dom,$confname,%domconfig) = @_;
1.6 raeburn 1901: my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
1.1 raeburn 1902: my %title = ( coursecatalog => 'Display course catalog',
1.41 ! raeburn 1903: adminmail => 'Display administrator E-mail address',
! 1904: loginheader => 'Log-in box header');
1.3 raeburn 1905: my @offon = ('off','on');
1.6 raeburn 1906: my %loginhash;
1.9 raeburn 1907: ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
1908: \%domconfig,\%loginhash);
1.6 raeburn 1909: $loginhash{login}{coursecatalog} = $env{'form.coursecatalog'};
1910: $loginhash{login}{adminmail} = $env{'form.adminmail'};
1.41 ! raeburn 1911: $loginhash{login}{loginheader} = $env{'form.loginheader'};
1.6 raeburn 1912: if (ref($colchanges{'login'}) eq 'HASH') {
1913: $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],
1914: \%loginhash);
1915: }
1.1 raeburn 1916: my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
1917: $dom);
1918: if ($putresult eq 'ok') {
1.3 raeburn 1919: if (($domconfig{'login'}{'coursecatalog'} eq '0') &&
1.1 raeburn 1920: ($env{'form.coursecatalog'} eq '1')) {
1921: $changes{'coursecatalog'} = 1;
1.3 raeburn 1922: } elsif (($domconfig{'login'}{'coursecatalog'} eq '' ||
1923: $domconfig{'login'}{'coursecatalog'} eq '1') &&
1.1 raeburn 1924: ($env{'form.coursecatalog'} eq '0')) {
1925: $changes{'coursecatalog'} = 1;
1926: }
1.3 raeburn 1927: if (($domconfig{'login'}{'adminmail'} eq '1') &&
1.1 raeburn 1928: ($env{'form.adminmail'} eq '0')) {
1929: $changes{'adminmail'} = 1;
1930: } elsif (($domconfig{'login'}{'adminmail'} eq '' ||
1931: $domconfig{'login'}{'adminmail'} eq '0') &&
1932: ($env{'form.adminmail'} eq '1')) {
1933: $changes{'adminmail'} = 1;
1934: }
1.41 ! raeburn 1935: if (($domconfig{'login'}{'loginheader'} eq 'text') &&
! 1936: ($env{'form.loginheader'} eq 'image')) {
! 1937: $changes{'loginheader'} = 1;
! 1938: } elsif (($domconfig{'login'}{'loginheader'} eq '' ||
! 1939: $domconfig{'login'}{'loginheader'} eq 'image') &&
! 1940: ($env{'form.loginheader'} eq 'text')) {
! 1941: $changes{'loginheader'} = 1;
! 1942: }
1.6 raeburn 1943: if (keys(%changes) > 0 || $colchgtext) {
1.41 ! raeburn 1944: &Apache::loncommon::devalidate_domconfig_cache($dom);
1.1 raeburn 1945: $resulttext = &mt('Changes made:').'<ul>';
1946: foreach my $item (sort(keys(%changes))) {
1.41 ! raeburn 1947: if ($item eq 'loginheader') {
! 1948: $resulttext .= '<li>'.&mt("$title{$item} set to $env{'form.loginheader'}").'</li>';
! 1949: } else {
! 1950: $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
! 1951: }
1.1 raeburn 1952: }
1.6 raeburn 1953: $resulttext .= $colchgtext.'</ul>';
1.1 raeburn 1954: } else {
1955: $resulttext = &mt('No changes made to log-in page settings');
1956: }
1957: } else {
1.11 albertel 1958: $resulttext = '<span class="LC_error">'.
1959: &mt('An error occurred: [_1]',$putresult).'</span>';
1.1 raeburn 1960: }
1.6 raeburn 1961: if ($errors) {
1.9 raeburn 1962: $resulttext .= '<br />'.&mt('The following errors occurred: ').'<ul>'.
1.6 raeburn 1963: $errors.'</ul>';
1964: }
1965: return $resulttext;
1966: }
1967:
1968: sub color_font_choices {
1969: my %choices =
1970: &Apache::lonlocal::texthash (
1971: img => "Header",
1972: bgs => "Background colors",
1973: links => "Link colors",
1974: font => "Font color",
1975: pgbg => "Page",
1976: tabbg => "Header",
1977: sidebg => "Border",
1978: link => "Link",
1979: alink => "Active link",
1980: vlink => "Visited link",
1981: );
1982: return %choices;
1983: }
1984:
1985: sub modify_rolecolors {
1.9 raeburn 1986: my ($r,$dom,$confname,$roles,%domconfig) = @_;
1.6 raeburn 1987: my ($resulttext,%rolehash);
1988: $rolehash{'rolecolors'} = {};
1.9 raeburn 1989: my ($errors,%changes) = &modify_colors($r,$dom,$confname,$roles,
1.6 raeburn 1990: $domconfig{'rolecolors'},$rolehash{'rolecolors'});
1991: my $putresult = &Apache::lonnet::put_dom('configuration',\%rolehash,
1992: $dom);
1993: if ($putresult eq 'ok') {
1994: if (keys(%changes) > 0) {
1.41 ! raeburn 1995: &Apache::loncommon::devalidate_domconfig_cache($dom);
1.6 raeburn 1996: $resulttext = &display_colorchgs($dom,\%changes,$roles,
1997: $rolehash{'rolecolors'});
1998: } else {
1999: $resulttext = &mt('No changes made to default color schemes');
2000: }
2001: } else {
1.11 albertel 2002: $resulttext = '<span class="LC_error">'.
2003: &mt('An error occurred: [_1]',$putresult).'</span>';
1.6 raeburn 2004: }
2005: if ($errors) {
2006: $resulttext .= &mt('The following errors occurred: ').'<ul>'.
2007: $errors.'</ul>';
2008: }
2009: return $resulttext;
2010: }
2011:
2012: sub modify_colors {
1.9 raeburn 2013: my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;
1.12 raeburn 2014: my (%changes,%choices);
1.6 raeburn 2015: my @bgs = ('pgbg','mainbg','sidebg');
2016: my @links = ('link','alink','vlink');
1.41 ! raeburn 2017: my @logintext;
1.6 raeburn 2018: my @images;
2019: my $servadm = $r->dir_config('lonAdmEMail');
2020: my $errors;
2021: foreach my $role (@{$roles}) {
2022: if ($role eq 'login') {
1.12 raeburn 2023: %choices = &login_choices();
1.41 ! raeburn 2024: @logintext = ('textcol','bgcol');
1.12 raeburn 2025: } else {
2026: %choices = &color_font_choices();
2027: }
2028: if ($role eq 'login') {
1.41 ! raeburn 2029: @images = ('img','logo','domlogo','login');
1.6 raeburn 2030: } else {
2031: @images = ('img');
2032: }
2033: $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
1.41 ! raeburn 2034: foreach my $item (@bgs,@links,@logintext) {
1.6 raeburn 2035: $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
2036: }
1.9 raeburn 2037: my ($configuserok,$author_ok,$switchserver,%currroles);
2038: my $uhome = &Apache::lonnet::homeserver($confname,$dom,1);
2039: ($configuserok,%currroles) = &check_configuser($uhome,$dom,
2040: $confname,$servadm);
2041: if ($configuserok eq 'ok') {
2042: $switchserver = &check_switchserver($dom,$confname);
2043: if ($switchserver eq '') {
2044: $author_ok = &check_authorstatus($dom,$confname,%currroles);
2045: }
2046: }
2047: my ($width,$height) = &thumb_dimensions();
1.40 raeburn 2048: if (ref($domconfig->{$role}) ne 'HASH') {
2049: $domconfig->{$role} = {};
2050: }
1.8 raeburn 2051: foreach my $img (@images) {
1.18 albertel 2052: if ( ! $env{'form.'.$role.'_'.$img.'.filename'}
2053: && !defined($domconfig->{$role}{$img})
2054: && !$env{'form.'.$role.'_del_'.$img}
2055: && $env{'form.'.$role.'_import_'.$img}) {
2056: # import the old configured image from the .tab setting
2057: # if they haven't provided a new one
2058: $domconfig->{$role}{$img} =
2059: $env{'form.'.$role.'_import_'.$img};
2060: }
1.6 raeburn 2061: if ($env{'form.'.$role.'_'.$img.'.filename'} ne '') {
1.9 raeburn 2062: my $error;
1.6 raeburn 2063: if ($configuserok eq 'ok') {
1.9 raeburn 2064: if ($switchserver) {
1.12 raeburn 2065: $error = &mt("Upload of [_1] image for $role page(s) is not permitted to this server: [_2]",$choices{$img},$switchserver);
1.9 raeburn 2066: } else {
2067: if ($author_ok eq 'ok') {
2068: my ($result,$logourl) =
2069: &publishlogo($r,'upload',$role.'_'.$img,
2070: $dom,$confname,$img,$width,$height);
2071: if ($result eq 'ok') {
2072: $confhash->{$role}{$img} = $logourl;
1.12 raeburn 2073: $changes{$role}{'images'}{$img} = 1;
1.9 raeburn 2074: } else {
1.12 raeburn 2075: $error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result);
1.9 raeburn 2076: }
2077: } else {
1.12 raeburn 2078: $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$author_ok);
1.6 raeburn 2079: }
2080: }
2081: } else {
1.12 raeburn 2082: $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$choices{$img},$confname,$dom,$configuserok);
1.9 raeburn 2083: }
2084: if ($error) {
1.8 raeburn 2085: &Apache::lonnet::logthis($error);
1.11 albertel 2086: $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
1.8 raeburn 2087: }
2088: } elsif ($domconfig->{$role}{$img} ne '') {
1.9 raeburn 2089: if ($domconfig->{$role}{$img} !~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) {
2090: my $error;
2091: if ($configuserok eq 'ok') {
2092: # is confname an author?
2093: if ($switchserver eq '') {
2094: if ($author_ok eq 'ok') {
2095: my ($result,$logourl) =
2096: &publishlogo($r,'copy',$domconfig->{$role}{$img},
2097: $dom,$confname,$img,$width,$height);
2098: if ($result eq 'ok') {
2099: $confhash->{$role}{$img} = $logourl;
1.18 albertel 2100: $changes{$role}{'images'}{$img} = 1;
1.9 raeburn 2101: }
2102: }
2103: }
2104: }
1.6 raeburn 2105: }
2106: }
2107: }
2108: if (ref($domconfig) eq 'HASH') {
2109: if (ref($domconfig->{$role}) eq 'HASH') {
2110: foreach my $img (@images) {
2111: if ($domconfig->{$role}{$img} ne '') {
2112: if ($env{'form.'.$role.'_del_'.$img}) {
2113: $confhash->{$role}{$img} = '';
1.12 raeburn 2114: $changes{$role}{'images'}{$img} = 1;
1.6 raeburn 2115: } else {
1.9 raeburn 2116: if ($confhash->{$role}{$img} eq '') {
2117: $confhash->{$role}{$img} = $domconfig->{$role}{$img};
2118: }
1.6 raeburn 2119: }
2120: } else {
2121: if ($env{'form.'.$role.'_del_'.$img}) {
2122: $confhash->{$role}{$img} = '';
1.12 raeburn 2123: $changes{$role}{'images'}{$img} = 1;
1.6 raeburn 2124: }
2125: }
2126: }
2127: if ($domconfig->{$role}{'font'} ne '') {
2128: if ($confhash->{$role}{'font'} ne $domconfig->{$role}{'font'}) {
2129: $changes{$role}{'font'} = 1;
2130: }
2131: } else {
2132: if ($confhash->{$role}{'font'}) {
2133: $changes{$role}{'font'} = 1;
2134: }
2135: }
2136: foreach my $item (@bgs) {
2137: if ($domconfig->{$role}{$item} ne '') {
2138: if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
2139: $changes{$role}{'bgs'}{$item} = 1;
2140: }
2141: } else {
2142: if ($confhash->{$role}{$item}) {
2143: $changes{$role}{'bgs'}{$item} = 1;
2144: }
2145: }
2146: }
2147: foreach my $item (@links) {
2148: if ($domconfig->{$role}{$item} ne '') {
2149: if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
2150: $changes{$role}{'links'}{$item} = 1;
2151: }
2152: } else {
2153: if ($confhash->{$role}{$item}) {
2154: $changes{$role}{'links'}{$item} = 1;
2155: }
2156: }
2157: }
1.41 ! raeburn 2158: foreach my $item (@logintext) {
! 2159: if ($domconfig->{$role}{$item} ne '') {
! 2160: if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
! 2161: $changes{$role}{'logintext'}{$item} = 1;
! 2162: }
! 2163: } else {
! 2164: if ($confhash->{$role}{$item}) {
! 2165: $changes{$role}{'logintext'}{$item} = 1;
! 2166: }
! 2167: }
! 2168: }
1.6 raeburn 2169: } else {
2170: &default_change_checker($role,\@images,\@links,\@bgs,
1.41 ! raeburn 2171: \@logintext,$confhash,\%changes);
1.6 raeburn 2172: }
2173: } else {
2174: &default_change_checker($role,\@images,\@links,\@bgs,
1.41 ! raeburn 2175: \@logintext,$confhash,\%changes);
1.6 raeburn 2176: }
2177: }
2178: return ($errors,%changes);
2179: }
2180:
2181: sub default_change_checker {
1.41 ! raeburn 2182: my ($role,$images,$links,$bgs,$logintext,$confhash,$changes) = @_;
1.6 raeburn 2183: foreach my $item (@{$links}) {
2184: if ($confhash->{$role}{$item}) {
2185: $changes->{$role}{'links'}{$item} = 1;
2186: }
2187: }
2188: foreach my $item (@{$bgs}) {
2189: if ($confhash->{$role}{$item}) {
2190: $changes->{$role}{'bgs'}{$item} = 1;
2191: }
2192: }
1.41 ! raeburn 2193: foreach my $item (@{$logintext}) {
! 2194: if ($confhash->{$role}{$item}) {
! 2195: $changes->{$role}{'logintext'}{$item} = 1;
! 2196: }
! 2197: }
1.6 raeburn 2198: foreach my $img (@{$images}) {
2199: if ($env{'form.'.$role.'_del_'.$img}) {
2200: $confhash->{$role}{$img} = '';
1.12 raeburn 2201: $changes->{$role}{'images'}{$img} = 1;
1.6 raeburn 2202: }
2203: }
2204: if ($confhash->{$role}{'font'}) {
2205: $changes->{$role}{'font'} = 1;
2206: }
2207: }
2208:
2209: sub display_colorchgs {
2210: my ($dom,$changes,$roles,$confhash) = @_;
2211: my (%choices,$resulttext);
2212: if (!grep(/^login$/,@{$roles})) {
2213: $resulttext = &mt('Changes made:').'<br />';
2214: }
2215: foreach my $role (@{$roles}) {
2216: if ($role eq 'login') {
2217: %choices = &login_choices();
2218: } else {
2219: %choices = &color_font_choices();
2220: }
2221: if (ref($changes->{$role}) eq 'HASH') {
2222: if ($role ne 'login') {
2223: $resulttext .= '<h4>'.&mt($role).'</h4>';
2224: }
2225: foreach my $key (sort(keys(%{$changes->{$role}}))) {
2226: if ($role ne 'login') {
2227: $resulttext .= '<ul>';
2228: }
2229: if (ref($changes->{$role}{$key}) eq 'HASH') {
2230: if ($role ne 'login') {
2231: $resulttext .= '<li>'.&mt($choices{$key}).':<ul>';
2232: }
2233: foreach my $item (sort(keys(%{$changes->{$role}{$key}}))) {
2234: if ($confhash->{$role}{$item} eq '') {
2235: $resulttext .= '<li>'.&mt("$choices{$item} set to default").'</li>';
2236: } else {
1.12 raeburn 2237: my $newitem = $confhash->{$role}{$item};
2238: if ($key eq 'images') {
2239: $newitem = '<img src="'.$confhash->{$role}{$item}.'" alt="'.$choices{$item}.'" valign="bottom" />';
2240: }
2241: $resulttext .= '<li>'.&mt("$choices{$item} set to [_1]",$newitem).'</li>';
1.6 raeburn 2242: }
2243: }
2244: if ($role ne 'login') {
2245: $resulttext .= '</ul></li>';
2246: }
2247: } else {
2248: if ($confhash->{$role}{$key} eq '') {
2249: $resulttext .= '<li>'.&mt("$choices{$key} set to default").'</li>';
2250: } else {
2251: $resulttext .= '<li>'.&mt("$choices{$key} set to [_1]",$confhash->{$role}{$key}).'</li>';
2252: }
2253: }
2254: if ($role ne 'login') {
2255: $resulttext .= '</ul>';
2256: }
2257: }
2258: }
2259: }
1.3 raeburn 2260: return $resulttext;
1.1 raeburn 2261: }
2262:
1.9 raeburn 2263: sub thumb_dimensions {
2264: return ('200','50');
2265: }
2266:
1.16 raeburn 2267: sub check_dimensions {
2268: my ($inputfile) = @_;
2269: my ($fullwidth,$fullheight);
2270: if ($inputfile =~ m|^[/\w.\-]+$|) {
2271: if (open(PIPE,"identify $inputfile 2>&1 |")) {
2272: my $imageinfo = <PIPE>;
2273: if (!close(PIPE)) {
2274: &Apache::lonnet::logthis("Failed to close PIPE opened to retrieve image information for $inputfile");
2275: }
2276: chomp($imageinfo);
2277: my ($fullsize) =
1.21 raeburn 2278: ($imageinfo =~ /^\Q$inputfile\E\s+\w+\s+(\d+x\d+)/);
1.16 raeburn 2279: if ($fullsize) {
2280: ($fullwidth,$fullheight) = split(/x/,$fullsize);
2281: }
2282: }
2283: }
2284: return ($fullwidth,$fullheight);
2285: }
2286:
1.9 raeburn 2287: sub check_configuser {
2288: my ($uhome,$dom,$confname,$servadm) = @_;
2289: my ($configuserok,%currroles);
2290: if ($uhome eq 'no_host') {
2291: srand( time() ^ ($$ + ($$ << 15)) ); # Seed rand.
2292: my $configpass = &LONCAPA::Enrollment::create_password();
2293: $configuserok =
2294: &Apache::lonnet::modifyuser($dom,$confname,'','internal',
2295: $configpass,'','','','','',undef,$servadm);
2296: } else {
2297: $configuserok = 'ok';
2298: %currroles =
2299: &Apache::lonnet::get_my_roles($confname,$dom,'userroles');
2300: }
2301: return ($configuserok,%currroles);
2302: }
2303:
2304: sub check_authorstatus {
2305: my ($dom,$confname,%currroles) = @_;
2306: my $author_ok;
1.40 raeburn 2307: if (!$currroles{':'.$dom.':au'}) {
1.9 raeburn 2308: my $start = time;
2309: my $end = 0;
2310: $author_ok =
2311: &Apache::lonnet::assignrole($dom,$confname,'/'.$dom.'/',
2312: 'au',$end,$start);
2313: } else {
2314: $author_ok = 'ok';
2315: }
2316: return $author_ok;
2317: }
2318:
2319: sub publishlogo {
2320: my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight) = @_;
2321: my ($output,$fname,$logourl);
2322: if ($action eq 'upload') {
2323: $fname=$env{'form.'.$formname.'.filename'};
2324: chop($env{'form.'.$formname});
2325: } else {
2326: ($fname) = ($formname =~ /([^\/]+)$/);
2327: }
2328: $fname=&Apache::lonnet::clean_filename($fname);
2329: # See if there is anything left
2330: unless ($fname) { return ('error: no uploaded file'); }
2331: $fname="$subdir/$fname";
2332: my $filepath='/home/'.$confname.'/public_html';
2333: my ($fnamepath,$file,$fetchthumb);
2334: $file=$fname;
2335: if ($fname=~m|/|) {
2336: ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);
2337: }
2338: my @parts=split(/\//,$filepath.'/'.$fnamepath);
2339: my $count;
2340: for ($count=4;$count<=$#parts;$count++) {
2341: $filepath.="/$parts[$count]";
2342: if ((-e $filepath)!=1) {
2343: mkdir($filepath,02770);
2344: }
2345: }
2346: # Check for bad extension and disallow upload
2347: if ($file=~/\.(\w+)$/ &&
2348: (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
2349: $output =
2350: &mt('Invalid file extension ([_1]) - reserved for LONCAPA use.',$1);
2351: } elsif ($file=~/\.(\w+)$/ &&
2352: !defined(&Apache::loncommon::fileembstyle($1))) {
2353: $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);
2354: } elsif ($file=~/\.(\d+)\.(\w+)$/) {
2355: $output = &mt('File name not allowed a rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);
2356: } elsif (-d "$filepath/$file") {
2357: $output = &mt('File name is a directory name - rename the file and re-upload');
2358: } else {
2359: my $source = $filepath.'/'.$file;
2360: my $logfile;
2361: if (!open($logfile,">>$source".'.log')) {
2362: return (&mt('No write permission to Construction Space'));
2363: }
2364: print $logfile
2365: "\n================= Publish ".localtime()." ================\n".
2366: $env{'user.name'}.':'.$env{'user.domain'}."\n";
2367: # Save the file
2368: if (!open(FH,'>'.$source)) {
2369: &Apache::lonnet::logthis('Failed to create '.$source);
2370: return (&mt('Failed to create file'));
2371: }
2372: if ($action eq 'upload') {
2373: if (!print FH ($env{'form.'.$formname})) {
2374: &Apache::lonnet::logthis('Failed to write to '.$source);
2375: return (&mt('Failed to write file'));
2376: }
2377: } else {
2378: my $original = &Apache::lonnet::filelocation('',$formname);
2379: if(!copy($original,$source)) {
2380: &Apache::lonnet::logthis('Failed to copy '.$original.' to '.$source);
2381: return (&mt('Failed to write file'));
2382: }
2383: }
2384: close(FH);
2385: chmod(0660, $source); # Permissions to rw-rw---.
2386:
2387: my $docroot=$r->dir_config('lonDocRoot');
2388: my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;
2389: my $copyfile=$targetdir.'/'.$file;
2390:
2391: my @parts=split(/\//,$targetdir);
2392: my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]";
2393: for (my $count=5;$count<=$#parts;$count++) {
2394: $path.="/$parts[$count]";
2395: if (!-e $path) {
2396: print $logfile "\nCreating directory ".$path;
2397: mkdir($path,02770);
2398: }
2399: }
2400: my $versionresult;
2401: if (-e $copyfile) {
2402: $versionresult = &logo_versioning($targetdir,$file,$logfile);
2403: } else {
2404: $versionresult = 'ok';
2405: }
2406: if ($versionresult eq 'ok') {
2407: if (copy($source,$copyfile)) {
2408: print $logfile "\nCopied original source to ".$copyfile."\n";
2409: $output = 'ok';
2410: &write_metadata($dom,$confname,$formname,$targetdir,$file,$logfile);
2411: $logourl = '/res/'.$dom.'/'.$confname.'/'.$fname;
2412: } else {
2413: print $logfile "\nUnable to write ".$copyfile.':'.$!."\n";
2414: $output = &mt('Failed to copy file to RES space').", $!";
2415: }
2416: if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) {
2417: my $inputfile = $filepath.'/'.$file;
2418: my $outfile = $filepath.'/'.'tn-'.$file;
1.16 raeburn 2419: my ($fullwidth,$fullheight) = &check_dimensions($inputfile);
2420: if ($fullwidth ne '' && $fullheight ne '') {
2421: if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) {
2422: my $thumbsize = $thumbwidth.'x'.$thumbheight;
2423: system("convert -sample $thumbsize $inputfile $outfile");
2424: chmod(0660, $filepath.'/tn-'.$file);
2425: if (-e $outfile) {
2426: my $copyfile=$targetdir.'/tn-'.$file;
2427: if (copy($outfile,$copyfile)) {
2428: print $logfile "\nCopied source to ".$copyfile."\n";
2429: &write_metadata($dom,$confname,$formname,
2430: $targetdir,'tn-'.$file,$logfile);
2431: } else {
2432: print $logfile "\nUnable to write ".$copyfile.
2433: ':'.$!."\n";
2434: }
2435: }
1.9 raeburn 2436: }
2437: }
2438: }
2439: } else {
2440: $output = $versionresult;
2441: }
2442: }
2443: return ($output,$logourl);
2444: }
2445:
2446: sub logo_versioning {
2447: my ($targetdir,$file,$logfile) = @_;
2448: my $target = $targetdir.'/'.$file;
2449: my ($maxversion,$fn,$extn,$output);
2450: $maxversion = 0;
2451: if ($file =~ /^(.+)\.(\w+)$/) {
2452: $fn=$1;
2453: $extn=$2;
2454: }
2455: opendir(DIR,$targetdir);
2456: while (my $filename=readdir(DIR)) {
2457: if ($filename=~/\Q$fn\E\.(\d+)\.\Q$extn\E$/) {
2458: $maxversion=($1>$maxversion)?$1:$maxversion;
2459: }
2460: }
2461: $maxversion++;
2462: print $logfile "\nCreating old version ".$maxversion."\n";
2463: my $copyfile=$targetdir.'/'.$fn.'.'.$maxversion.'.'.$extn;
2464: if (copy($target,$copyfile)) {
2465: print $logfile "Copied old target to ".$copyfile."\n";
2466: $copyfile=$copyfile.'.meta';
2467: if (copy($target.'.meta',$copyfile)) {
2468: print $logfile "Copied old target metadata to ".$copyfile."\n";
2469: $output = 'ok';
2470: } else {
2471: print $logfile "Unable to write metadata ".$copyfile.':'.$!."\n";
2472: $output = &mt('Failed to copy old meta').", $!, ";
2473: }
2474: } else {
2475: print $logfile "Unable to write ".$copyfile.':'.$!."\n";
2476: $output = &mt('Failed to copy old target').", $!, ";
2477: }
2478: return $output;
2479: }
2480:
2481: sub write_metadata {
2482: my ($dom,$confname,$formname,$targetdir,$file,$logfile) = @_;
2483: my (%metadatafields,%metadatakeys,$output);
2484: $metadatafields{'title'}=$formname;
2485: $metadatafields{'creationdate'}=time;
2486: $metadatafields{'lastrevisiondate'}=time;
2487: $metadatafields{'copyright'}='public';
2488: $metadatafields{'modifyinguser'}=$env{'user.name'}.':'.
2489: $env{'user.domain'};
2490: $metadatafields{'authorspace'}=$confname.':'.$dom;
2491: $metadatafields{'domain'}=$dom;
2492: {
2493: print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
2494: my $mfh;
2495: unless (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
2496: $output = &mt('Could not write metadata');
2497: }
2498: foreach (sort keys %metadatafields) {
2499: unless ($_=~/\./) {
2500: my $unikey=$_;
2501: $unikey=~/^([A-Za-z]+)/;
2502: my $tag=$1;
2503: $tag=~tr/A-Z/a-z/;
2504: print $mfh "\n\<$tag";
2505: foreach (split(/\,/,$metadatakeys{$unikey})) {
2506: my $value=$metadatafields{$unikey.'.'.$_};
2507: $value=~s/\"/\'\'/g;
2508: print $mfh ' '.$_.'="'.$value.'"';
2509: }
2510: print $mfh '>'.
2511: &HTML::Entities::encode($metadatafields{$unikey},'<>&"')
2512: .'</'.$tag.'>';
2513: }
2514: }
2515: $output = 'ok';
2516: print $logfile "\nWrote metadata";
2517: close($mfh);
2518: }
2519: }
2520:
2521: sub check_switchserver {
2522: my ($dom,$confname) = @_;
2523: my ($allowed,$switchserver);
2524: my $home = &Apache::lonnet::homeserver($confname,$dom);
2525: if ($home eq 'no_host') {
2526: $home = &Apache::lonnet::domain($dom,'primary');
2527: }
2528: my @ids=&Apache::lonnet::current_machine_ids();
1.10 albertel 2529: foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
2530: if (!$allowed) {
2531: $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&role=dc./'.$dom.'/">'.&mt('Switch Server').'</a>';
1.9 raeburn 2532: }
2533: return $switchserver;
2534: }
2535:
1.30 raeburn 2536: sub javascript_set_colnums {
2537: return <<END;
2538: function setDisplayColumns() {
2539: if (document.pickactions.width.value > 1100) {
2540: document.pickactions.numcols[1].checked = true;
2541: } else {
2542: document.pickactions.numcols[0].checked = true;
2543: }
2544: }
2545: END
2546: }
2547:
1.1 raeburn 2548: sub modify_quotas {
1.3 raeburn 2549: my ($dom,%domconfig) = @_;
1.1 raeburn 2550: my ($resulttext,%changes);
1.26 raeburn 2551: my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
1.1 raeburn 2552: my %formhash;
2553: foreach my $key (keys(%env)) {
2554: if ($key =~ /^form\.quota_(.+)$/) {
2555: $formhash{$1} = $env{$key};
2556: }
2557: }
1.15 raeburn 2558: $formhash{'default'} = $env{'form.defaultquota'};
1.1 raeburn 2559: if (ref($domconfig{'quotas'}) eq 'HASH') {
2560: foreach my $key (keys(%{$domconfig{'quotas'}})) {
2561: if (exists($formhash{$key})) {
2562: if ($formhash{$key} ne $domconfig{'quotas'}{$key}) {
2563: $changes{$key} = 1;
2564: }
2565: } else {
2566: $formhash{$key} = $domconfig{'quotas'}{$key};
2567: }
2568: }
2569: }
2570: foreach my $key (keys(%formhash)) {
2571: if ($formhash{$key} ne '') {
1.3 raeburn 2572: if (!exists($domconfig{'quotas'}{$key})) {
1.1 raeburn 2573: $changes{$key} = 1;
2574: }
2575: }
2576: }
2577: my %quotahash = (
1.3 raeburn 2578: quotas => {%formhash},
1.1 raeburn 2579: );
2580: my $putresult = &Apache::lonnet::put_dom('configuration',\%quotahash,
2581: $dom);
2582: if ($putresult eq 'ok') {
2583: if (keys(%changes) > 0) {
2584: $resulttext = &mt('Changes made:').'<ul>';
1.26 raeburn 2585: foreach my $type (@{$types},'default') {
2586: if (defined($changes{$type})) {
2587: my $typetitle = $usertypes->{$type};
2588: if ($type eq 'default') {
2589: $typetitle = $othertitle;
2590: }
2591: $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$formhash{$type}).'</li>';
2592: }
1.1 raeburn 2593: }
2594: $resulttext .= '</ul>';
2595: } else {
2596: $resulttext = &mt('No changes made to default quotas');
2597: }
2598: } else {
1.11 albertel 2599: $resulttext = '<span class="LC_error">'.
2600: &mt('An error occurred: [_1]',$putresult).'</span>';
1.1 raeburn 2601: }
1.3 raeburn 2602: return $resulttext;
1.1 raeburn 2603: }
2604:
1.3 raeburn 2605: sub modify_autoenroll {
2606: my ($dom,%domconfig) = @_;
1.1 raeburn 2607: my ($resulttext,%changes);
2608: my %currautoenroll;
2609: if (ref($domconfig{'autoenroll'}) eq 'HASH') {
2610: foreach my $key (keys(%{$domconfig{'autoenroll'}})) {
2611: $currautoenroll{$key} = $domconfig{'autoenroll'}{$key};
2612: }
2613: }
2614: my $autorun = &Apache::lonnet::auto_run(undef,$dom),
2615: my %title = ( run => 'Auto-enrollment active',
2616: sender => 'Sender for notification messages');
2617: my @offon = ('off','on');
1.17 raeburn 2618: my $sender_uname = $env{'form.sender_uname'};
2619: my $sender_domain = $env{'form.sender_domain'};
2620: if ($sender_domain eq '') {
2621: $sender_uname = '';
2622: } elsif ($sender_uname eq '') {
2623: $sender_domain = '';
2624: }
1.1 raeburn 2625: my %autoenrollhash = (
2626: autoenroll => { run => $env{'form.autoenroll_run'},
1.17 raeburn 2627: sender_uname => $sender_uname,
2628: sender_domain => $sender_domain,
1.1 raeburn 2629:
2630: }
2631: );
1.4 raeburn 2632: my $putresult = &Apache::lonnet::put_dom('configuration',\%autoenrollhash,
2633: $dom);
1.1 raeburn 2634: if ($putresult eq 'ok') {
2635: if (exists($currautoenroll{'run'})) {
2636: if ($currautoenroll{'run'} ne $env{'form.autoenroll_run'}) {
2637: $changes{'run'} = 1;
2638: }
2639: } elsif ($autorun) {
2640: if ($env{'form.autoenroll_run'} ne '1') {
1.23 raeburn 2641: $changes{'run'} = 1;
1.1 raeburn 2642: }
2643: }
1.17 raeburn 2644: if ($currautoenroll{'sender_uname'} ne $sender_uname) {
1.1 raeburn 2645: $changes{'sender'} = 1;
2646: }
1.17 raeburn 2647: if ($currautoenroll{'sender_domain'} ne $sender_domain) {
1.1 raeburn 2648: $changes{'sender'} = 1;
2649: }
2650: if (keys(%changes) > 0) {
2651: $resulttext = &mt('Changes made:').'<ul>';
1.3 raeburn 2652: if ($changes{'run'}) {
1.1 raeburn 2653: $resulttext .= '<li>'.&mt("$title{'run'} set to $offon[$env{'form.autoenroll_run'}]").'</li>';
2654: }
2655: if ($changes{'sender'}) {
1.17 raeburn 2656: if ($sender_uname eq '' || $sender_domain eq '') {
2657: $resulttext .= '<li>'.&mt("$title{'sender'} set to default (course owner).").'</li>';
2658: } else {
2659: $resulttext .= '<li>'.&mt("$title{'sender'} set to [_1]",$sender_uname.':'.$sender_domain).'</li>';
2660: }
1.1 raeburn 2661: }
2662: $resulttext .= '</ul>';
2663: } else {
2664: $resulttext = &mt('No changes made to auto-enrollment settings');
2665: }
2666: } else {
1.11 albertel 2667: $resulttext = '<span class="LC_error">'.
2668: &mt('An error occurred: [_1]',$putresult).'</span>';
1.1 raeburn 2669: }
1.3 raeburn 2670: return $resulttext;
1.1 raeburn 2671: }
2672:
2673: sub modify_autoupdate {
1.3 raeburn 2674: my ($dom,%domconfig) = @_;
1.1 raeburn 2675: my ($resulttext,%currautoupdate,%fields,%changes);
2676: if (ref($domconfig{'autoupdate'}) eq 'HASH') {
2677: foreach my $key (keys(%{$domconfig{'autoupdate'}})) {
2678: $currautoupdate{$key} = $domconfig{'autoupdate'}{$key};
2679: }
2680: }
2681: my @offon = ('off','on');
2682: my %title = &Apache::lonlocal::texthash (
2683: run => 'Auto-update:',
2684: classlists => 'Updates to user information in classlists?'
2685: );
1.26 raeburn 2686: my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
1.1 raeburn 2687: my %fieldtitles = &Apache::lonlocal::texthash (
2688: id => 'Student/Employee ID',
1.20 raeburn 2689: permanentemail => 'E-mail address',
1.1 raeburn 2690: lastname => 'Last Name',
2691: firstname => 'First Name',
2692: middlename => 'Middle Name',
2693: gen => 'Generation',
2694: );
2695: my $othertitle = &mt('All users');
2696: if (keys(%{$usertypes}) > 0) {
1.26 raeburn 2697: $othertitle = &mt('Other users');
1.1 raeburn 2698: }
2699: foreach my $key (keys(%env)) {
2700: if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) {
2701: push(@{$fields{$1}},$2);
2702: }
2703: }
2704: my %updatehash = (
2705: autoupdate => { run => $env{'form.autoupdate_run'},
2706: classlists => $env{'form.classlists'},
2707: fields => {%fields},
2708: }
2709: );
2710: foreach my $key (keys(%currautoupdate)) {
2711: if (($key eq 'run') || ($key eq 'classlists')) {
2712: if (exists($updatehash{autoupdate}{$key})) {
2713: if ($currautoupdate{$key} ne $updatehash{autoupdate}{$key}) {
2714: $changes{$key} = 1;
2715: }
2716: }
2717: } elsif ($key eq 'fields') {
2718: if (ref($currautoupdate{$key}) eq 'HASH') {
1.26 raeburn 2719: foreach my $item (@{$types},'default') {
1.1 raeburn 2720: if (ref($currautoupdate{$key}{$item}) eq 'ARRAY') {
2721: my $change = 0;
2722: foreach my $type (@{$currautoupdate{$key}{$item}}) {
2723: if (!exists($fields{$item})) {
2724: $change = 1;
2725: } elsif (ref($fields{$item}) eq 'ARRAY') {
1.26 raeburn 2726: if (!grep(/^\Q$type\E$/,@{$fields{$item}})) {
1.1 raeburn 2727: $change = 1;
2728: }
2729: }
2730: }
2731: if ($change) {
2732: push(@{$changes{$key}},$item);
2733: }
1.26 raeburn 2734: }
1.1 raeburn 2735: }
2736: }
2737: }
2738: }
1.26 raeburn 2739: foreach my $item (@{$types},'default') {
2740: if (defined($fields{$item})) {
2741: if (ref($currautoupdate{'fields'}) eq 'HASH') {
2742: if (!exists($currautoupdate{'fields'}{$item})) {
2743: push(@{$changes{'fields'}},$item);
2744: }
2745: } else {
2746: push(@{$changes{'fields'}},$item);
1.1 raeburn 2747: }
2748: }
2749: }
2750: my $putresult = &Apache::lonnet::put_dom('configuration',\%updatehash,
2751: $dom);
2752: if ($putresult eq 'ok') {
2753: if (keys(%changes) > 0) {
2754: $resulttext = &mt('Changes made:').'<ul>';
2755: foreach my $key (sort(keys(%changes))) {
2756: if (ref($changes{$key}) eq 'ARRAY') {
2757: foreach my $item (@{$changes{$key}}) {
2758: my @newvalues;
2759: foreach my $type (@{$fields{$item}}) {
2760: push(@newvalues,$fieldtitles{$type});
2761: }
1.3 raeburn 2762: my $newvaluestr;
2763: if (@newvalues > 0) {
2764: $newvaluestr = join(', ',@newvalues);
2765: } else {
2766: $newvaluestr = &mt('none');
1.6 raeburn 2767: }
1.1 raeburn 2768: if ($item eq 'default') {
1.26 raeburn 2769: $resulttext .= '<li>'.&mt("Updates for '[_1]' set to: '[_2]'",$othertitle,$newvaluestr).'</li>';
1.1 raeburn 2770: } else {
1.26 raeburn 2771: $resulttext .= '<li>'.&mt("Updates for '[_1]' set to: '[_2]'",$usertypes->{$item},$newvaluestr).'</li>';
1.1 raeburn 2772: }
2773: }
2774: } else {
2775: my $newvalue;
2776: if ($key eq 'run') {
2777: $newvalue = $offon[$env{'form.autoupdate_run'}];
2778: } else {
2779: $newvalue = $offon[$env{'form.'.$key}];
1.3 raeburn 2780: }
1.1 raeburn 2781: $resulttext .= '<li>'.&mt("[_1] set to $newvalue",$title{$key}).'</li>';
2782: }
2783: }
2784: $resulttext .= '</ul>';
2785: } else {
1.3 raeburn 2786: $resulttext = &mt('No changes made to autoupdates');
1.1 raeburn 2787: }
2788: } else {
1.11 albertel 2789: $resulttext = '<span class="LC_error">'.
2790: &mt('An error occurred: [_1]',$putresult).'</span>';
1.1 raeburn 2791: }
1.3 raeburn 2792: return $resulttext;
1.1 raeburn 2793: }
2794:
1.23 raeburn 2795: sub modify_directorysrch {
2796: my ($dom,%domconfig) = @_;
2797: my ($resulttext,%changes);
2798: my %currdirsrch;
2799: if (ref($domconfig{'directorysrch'}) eq 'HASH') {
2800: foreach my $key (keys(%{$domconfig{'directorysrch'}})) {
2801: $currdirsrch{$key} = $domconfig{'directorysrch'}{$key};
2802: }
2803: }
2804: my %title = ( available => 'Directory search available',
1.24 raeburn 2805: localonly => 'Other domains can search',
1.23 raeburn 2806: searchby => 'Search types',
2807: searchtypes => 'Search latitude');
2808: my @offon = ('off','on');
1.24 raeburn 2809: my @otherdoms = ('Yes','No');
1.23 raeburn 2810:
1.25 raeburn 2811: my @searchtypes = &Apache::loncommon::get_env_multiple('form.searchtypes');
1.23 raeburn 2812: my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
2813: my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
2814:
1.26 raeburn 2815: my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
2816: if (keys(%{$usertypes}) == 0) {
2817: @cansearch = ('default');
2818: } else {
2819: if (ref($currdirsrch{'cansearch'}) eq 'ARRAY') {
2820: foreach my $type (@{$currdirsrch{'cansearch'}}) {
2821: if (!grep(/^\Q$type\E$/,@cansearch)) {
2822: push(@{$changes{'cansearch'}},$type);
2823: }
1.23 raeburn 2824: }
1.26 raeburn 2825: foreach my $type (@cansearch) {
2826: if (!grep(/^\Q$type\E$/,@{$currdirsrch{'cansearch'}})) {
2827: push(@{$changes{'cansearch'}},$type);
2828: }
1.23 raeburn 2829: }
1.26 raeburn 2830: } else {
2831: push(@{$changes{'cansearch'}},@cansearch);
1.23 raeburn 2832: }
2833: }
2834:
2835: if (ref($currdirsrch{'searchby'}) eq 'ARRAY') {
2836: foreach my $by (@{$currdirsrch{'searchby'}}) {
2837: if (!grep(/^\Q$by\E$/,@searchby)) {
2838: push(@{$changes{'searchby'}},$by);
2839: }
2840: }
2841: foreach my $by (@searchby) {
2842: if (!grep(/^\Q$by\E$/,@{$currdirsrch{'searchby'}})) {
2843: push(@{$changes{'searchby'}},$by);
2844: }
2845: }
2846: } else {
2847: push(@{$changes{'searchby'}},@searchby);
2848: }
1.25 raeburn 2849:
2850: if (ref($currdirsrch{'searchtypes'}) eq 'ARRAY') {
2851: foreach my $type (@{$currdirsrch{'searchtypes'}}) {
2852: if (!grep(/^\Q$type\E$/,@searchtypes)) {
2853: push(@{$changes{'searchtypes'}},$type);
2854: }
2855: }
2856: foreach my $type (@searchtypes) {
2857: if (!grep(/^\Q$type\E$/,@{$currdirsrch{'searchtypes'}})) {
2858: push(@{$changes{'searchtypes'}},$type);
2859: }
2860: }
2861: } else {
2862: if (exists($currdirsrch{'searchtypes'})) {
2863: foreach my $type (@searchtypes) {
2864: if ($type ne $currdirsrch{'searchtypes'}) {
2865: push(@{$changes{'searchtypes'}},$type);
2866: }
2867: }
2868: if (!grep(/^\Q$currdirsrch{'searchtypes'}\E/,@searchtypes)) {
2869: push(@{$changes{'searchtypes'}},$currdirsrch{'searchtypes'});
2870: }
2871: } else {
2872: push(@{$changes{'searchtypes'}},@searchtypes);
2873: }
2874: }
2875:
1.23 raeburn 2876: my %dirsrch_hash = (
2877: directorysrch => { available => $env{'form.dirsrch_available'},
2878: cansearch => \@cansearch,
1.24 raeburn 2879: localonly => $env{'form.dirsrch_localonly'},
1.23 raeburn 2880: searchby => \@searchby,
1.25 raeburn 2881: searchtypes => \@searchtypes,
1.23 raeburn 2882: }
2883: );
2884: my $putresult = &Apache::lonnet::put_dom('configuration',\%dirsrch_hash,
2885: $dom);
2886: if ($putresult eq 'ok') {
2887: if (exists($currdirsrch{'available'})) {
2888: if ($currdirsrch{'available'} ne $env{'form.dirsrch_available'}) {
2889: $changes{'available'} = 1;
2890: }
2891: } else {
2892: if ($env{'form.dirsrch_available'} eq '1') {
2893: $changes{'available'} = 1;
2894: }
2895: }
1.24 raeburn 2896: if (exists($currdirsrch{'localonly'})) {
2897: if ($currdirsrch{'localonly'} ne $env{'form.dirsrch_localonly'}) {
2898: $changes{'localonly'} = 1;
2899: }
2900: } else {
2901: if ($env{'form.dirsrch_localonly'} eq '1') {
2902: $changes{'localonly'} = 1;
2903: }
2904: }
1.23 raeburn 2905: if (keys(%changes) > 0) {
2906: $resulttext = &mt('Changes made:').'<ul>';
2907: if ($changes{'available'}) {
2908: $resulttext .= '<li>'.&mt("$title{'available'} set to: $offon[$env{'form.dirsrch_available'}]").'</li>';
2909: }
1.24 raeburn 2910: if ($changes{'localonly'}) {
2911: $resulttext .= '<li>'.&mt("$title{'localonly'} set to: $otherdoms[$env{'form.dirsrch_localonly'}]").'</li>';
2912: }
2913:
1.23 raeburn 2914: if (ref($changes{'cansearch'}) eq 'ARRAY') {
2915: my $chgtext;
1.26 raeburn 2916: if (ref($usertypes) eq 'HASH') {
2917: if (keys(%{$usertypes}) > 0) {
2918: foreach my $type (@{$types}) {
2919: if (grep(/^\Q$type\E$/,@cansearch)) {
2920: $chgtext .= $usertypes->{$type}.'; ';
2921: }
2922: }
2923: if (grep(/^default$/,@cansearch)) {
2924: $chgtext .= $othertitle;
2925: } else {
2926: $chgtext =~ s/\; $//;
2927: }
2928: $resulttext .= '<li>'.&mt("Users from domain '<span class=\"LC_cusr_emph\">[_1]</span>' permitted to search the institutional directory set to: [_2]",$dom,$chgtext).'</li>';
1.23 raeburn 2929: }
2930: }
2931: }
2932: if (ref($changes{'searchby'}) eq 'ARRAY') {
2933: my ($searchtitles,$titleorder) = &sorted_searchtitles();
2934: my $chgtext;
2935: foreach my $type (@{$titleorder}) {
2936: if (grep(/^\Q$type\E$/,@searchby)) {
2937: if (defined($searchtitles->{$type})) {
2938: $chgtext .= $searchtitles->{$type}.'; ';
2939: }
2940: }
2941: }
2942: $chgtext =~ s/\; $//;
2943: $resulttext .= '<li>'.&mt("$title{'searchby'} set to: [_1]",$chgtext).'</li>';
2944: }
1.25 raeburn 2945: if (ref($changes{'searchtypes'}) eq 'ARRAY') {
2946: my ($srchtypes_desc,$srchtypeorder) = &sorted_searchtypes();
2947: my $chgtext;
2948: foreach my $type (@{$srchtypeorder}) {
2949: if (grep(/^\Q$type\E$/,@searchtypes)) {
2950: if (defined($srchtypes_desc->{$type})) {
2951: $chgtext .= $srchtypes_desc->{$type}.'; ';
2952: }
2953: }
2954: }
2955: $chgtext =~ s/\; $//;
2956: $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).'</li>';
1.23 raeburn 2957: }
2958: $resulttext .= '</ul>';
2959: } else {
2960: $resulttext = &mt('No changes made to institution directory search settings');
2961: }
2962: } else {
2963: $resulttext = '<span class="LC_error">'.
1.27 raeburn 2964: &mt('An error occurred: [_1]',$putresult).'</span>';
2965: }
2966: return $resulttext;
2967: }
2968:
1.28 raeburn 2969: sub modify_contacts {
2970: my ($dom,%domconfig) = @_;
2971: my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);
2972: if (ref($domconfig{'contacts'}) eq 'HASH') {
2973: foreach my $key (keys(%{$domconfig{'contacts'}})) {
2974: $currsetting{$key} = $domconfig{'contacts'}{$key};
2975: }
2976: }
2977: my (%others,%to);
2978: my @contacts = ('supportemail','adminemail');
2979: my @mailings = ('errormail','packagesmail','helpdeskmail');
2980: foreach my $type (@mailings) {
2981: @{$newsetting{$type}} =
2982: &Apache::loncommon::get_env_multiple('form.'.$type);
2983: foreach my $item (@contacts) {
2984: if (grep(/^\Q$item\E$/,@{$newsetting{$type}})) {
2985: $contacts_hash{contacts}{$type}{$item} = 1;
2986: } else {
2987: $contacts_hash{contacts}{$type}{$item} = 0;
2988: }
2989: }
2990: $others{$type} = $env{'form.'.$type.'_others'};
2991: $contacts_hash{contacts}{$type}{'others'} = $others{$type};
2992: }
2993: foreach my $item (@contacts) {
2994: $to{$item} = $env{'form.'.$item};
2995: $contacts_hash{'contacts'}{$item} = $to{$item};
2996: }
2997: if (keys(%currsetting) > 0) {
2998: foreach my $item (@contacts) {
2999: if ($to{$item} ne $currsetting{$item}) {
3000: $changes{$item} = 1;
3001: }
3002: }
3003: foreach my $type (@mailings) {
3004: foreach my $item (@contacts) {
3005: if (ref($currsetting{$type}) eq 'HASH') {
3006: if ($currsetting{$type}{$item} ne $contacts_hash{contacts}{$type}{$item}) {
3007: push(@{$changes{$type}},$item);
3008: }
3009: } else {
3010: push(@{$changes{$type}},@{$newsetting{$type}});
3011: }
3012: }
3013: if ($others{$type} ne $currsetting{$type}{'others'}) {
3014: push(@{$changes{$type}},'others');
3015: }
3016: }
3017: } else {
3018: my %default;
3019: $default{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
3020: $default{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
3021: $default{'errormail'} = 'adminemail';
3022: $default{'packagesmail'} = 'adminemail';
3023: $default{'helpdeskmail'} = 'supportemail';
3024: foreach my $item (@contacts) {
3025: if ($to{$item} ne $default{$item}) {
3026: $changes{$item} = 1;
3027: }
3028: }
3029: foreach my $type (@mailings) {
3030: if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
3031:
3032: push(@{$changes{$type}},@{$newsetting{$type}});
3033: }
3034: if ($others{$type} ne '') {
3035: push(@{$changes{$type}},'others');
3036: }
3037: }
3038: }
3039: my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
3040: $dom);
3041: if ($putresult eq 'ok') {
3042: if (keys(%changes) > 0) {
3043: my ($titles,$short_titles) = &contact_titles();
3044: $resulttext = &mt('Changes made:').'<ul>';
3045: foreach my $item (@contacts) {
3046: if ($changes{$item}) {
3047: $resulttext .= '<li>'.$titles->{$item}.
3048: &mt(' set to: ').
3049: '<span class="LC_cusr_emph">'.
3050: $to{$item}.'</span></li>';
3051: }
3052: }
3053: foreach my $type (@mailings) {
3054: if (ref($changes{$type}) eq 'ARRAY') {
3055: $resulttext .= '<li>'.$titles->{$type}.': ';
3056: my @text;
3057: foreach my $item (@{$newsetting{$type}}) {
3058: push(@text,$short_titles->{$item});
3059: }
3060: if ($others{$type} ne '') {
3061: push(@text,$others{$type});
3062: }
3063: $resulttext .= '<span class="LC_cusr_emph">'.
3064: join(', ',@text).'</span></li>';
3065: }
3066: }
3067: $resulttext .= '</ul>';
3068: } else {
1.34 raeburn 3069: $resulttext = &mt('No changes made to contact information');
1.28 raeburn 3070: }
3071: } else {
3072: $resulttext = '<span class="LC_error">'.
3073: &mt('An error occurred: [_1].',$putresult).'</span>';
3074: }
3075: return $resulttext;
3076: }
3077:
3078: sub modify_usercreation {
1.27 raeburn 3079: my ($dom,%domconfig) = @_;
1.34 raeburn 3080: my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate);
1.27 raeburn 3081: if (ref($domconfig{'usercreation'}) eq 'HASH') {
3082: foreach my $key (keys(%{$domconfig{'usercreation'}})) {
3083: $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
3084: }
3085: }
3086: my %title = &Apache::lonlocal::texthash (
3087: author => 'adding co-authors/assistant authors',
3088: course => 'adding users to a course',
3089: );
3090: my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
1.32 raeburn 3091: my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');
1.34 raeburn 3092: my @contexts = ('author','course');
3093: foreach my $item(@contexts) {
3094: $cancreate{$item} = $env{'form.can_createuser_'.$item};
3095: }
3096: if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
3097: foreach my $item (@contexts) {
3098: if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
3099: push(@{$changes{'cancreate'}},$item);
3100: }
1.27 raeburn 3101: }
1.34 raeburn 3102: } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
3103: foreach my $item (@contexts) {
3104: if (grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) {
3105: if ($cancreate{$item} ne 'any') {
3106: push(@{$changes{'cancreate'}},$item);
3107: }
3108: } else {
3109: if ($cancreate{$item} ne 'none') {
3110: push(@{$changes{'cancreate'}},$item);
3111: }
1.27 raeburn 3112: }
3113: }
3114: } else {
1.34 raeburn 3115: foreach my $item ('author','course') {
3116: push(@{$changes{'cancreate'}},$item);
3117: }
1.27 raeburn 3118: }
1.34 raeburn 3119:
1.27 raeburn 3120: if (ref($curr_usercreation{'username_rule'}) eq 'ARRAY') {
3121: foreach my $type (@{$curr_usercreation{'username_rule'}}) {
3122: if (!grep(/^\Q$type\E$/,@username_rule)) {
3123: push(@{$changes{'username_rule'}},$type);
3124: }
3125: }
3126: foreach my $type (@username_rule) {
3127: if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'username_rule'}})) {
3128: push(@{$changes{'username_rule'}},$type);
3129: }
3130: }
3131: } else {
3132: push(@{$changes{'username_rule'}},@username_rule);
3133: }
3134:
1.32 raeburn 3135: if (ref($curr_usercreation{'id_rule'}) eq 'ARRAY') {
3136: foreach my $type (@{$curr_usercreation{'id_rule'}}) {
3137: if (!grep(/^\Q$type\E$/,@id_rule)) {
3138: push(@{$changes{'id_rule'}},$type);
3139: }
3140: }
3141: foreach my $type (@id_rule) {
3142: if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'id_rule'}})) {
3143: push(@{$changes{'id_rule'}},$type);
3144: }
3145: }
3146: } else {
3147: push(@{$changes{'id_rule'}},@id_rule);
3148: }
3149:
1.28 raeburn 3150: my @contexts = ('author','course','domain');
3151: my @authtypes = ('int','krb4','krb5','loc');
3152: my %authhash;
3153: foreach my $item (@contexts) {
3154: my @authallowed = &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');
3155: foreach my $auth (@authtypes) {
3156: if (grep(/^\Q$auth\E$/,@authallowed)) {
3157: $authhash{$item}{$auth} = 1;
3158: } else {
3159: $authhash{$item}{$auth} = 0;
3160: }
3161: }
3162: }
3163: if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {
3164: foreach my $item (@contexts) {
3165: if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {
3166: foreach my $auth (@authtypes) {
3167: if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {
3168: push(@{$changes{'authtypes'}},$item);
3169: last;
3170: }
3171: }
3172: }
3173: }
3174: } else {
3175: foreach my $item (@contexts) {
3176: push(@{$changes{'authtypes'}},$item);
3177: }
3178: }
3179:
1.27 raeburn 3180: my %usercreation_hash = (
1.28 raeburn 3181: usercreation => {
1.34 raeburn 3182: cancreate => \%cancreate,
1.27 raeburn 3183: username_rule => \@username_rule,
1.32 raeburn 3184: id_rule => \@id_rule,
3185: authtypes => \%authhash,
1.27 raeburn 3186: }
3187: );
3188:
3189: my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
3190: $dom);
3191: if ($putresult eq 'ok') {
3192: if (keys(%changes) > 0) {
3193: $resulttext = &mt('Changes made:').'<ul>';
3194: if (ref($changes{'cancreate'}) eq 'ARRAY') {
1.34 raeburn 3195: my %lt = &usercreation_types();
3196: foreach my $type (@{$changes{'cancreate'}}) {
3197: my $chgtext;
3198: if ($cancreate{$type} eq 'none') {
3199: $chgtext = $lt{$type}.' '.&mt('creation of new users is not permitted, except by a Domain Coordinator.');
3200: } elsif ($cancreate{$type} eq 'any') {
3201: $chgtext = $lt{$type}.' '.&mt('creation of new users is permitted for both institutional and non-institutional usernames.');
3202: } elsif ($cancreate{$type} eq 'official') {
3203: $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for institutional usernames.',$lt{$type});
3204: } elsif ($cancreate{$type} eq 'unofficial') {
3205: $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for non-institutional usernames.',$lt{$type});
3206: }
3207: $resulttext .= '<li>'.$chgtext.'</li>';
1.27 raeburn 3208: }
3209: }
3210: if (ref($changes{'username_rule'}) eq 'ARRAY') {
1.32 raeburn 3211: my ($rules,$ruleorder) =
3212: &Apache::lonnet::inst_userrules($dom,'username');
1.27 raeburn 3213: my $chgtext = '<ul>';
3214: foreach my $type (@username_rule) {
3215: if (ref($rules->{$type}) eq 'HASH') {
3216: $chgtext .= '<li>'.$rules->{$type}{'name'}.'</li>';
3217: }
3218: }
3219: $chgtext .= '</ul>';
3220: if (@username_rule > 0) {
3221: $resulttext .= '<li>'.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';
3222: } else {
1.28 raeburn 3223: $resulttext .= '<li>'.&mt('There are now no username formats restricted to verified users in the institutional directory.').'</li>';
1.27 raeburn 3224: }
3225: }
1.32 raeburn 3226: if (ref($changes{'id_rule'}) eq 'ARRAY') {
3227: my ($idrules,$idruleorder) =
3228: &Apache::lonnet::inst_userrules($dom,'id');
3229: my $chgtext = '<ul>';
3230: foreach my $type (@id_rule) {
3231: if (ref($idrules->{$type}) eq 'HASH') {
3232: $chgtext .= '<li>'.$idrules->{$type}{'name'}.'</li>';
3233: }
3234: }
3235: $chgtext .= '</ul>';
3236: if (@id_rule > 0) {
3237: $resulttext .= '<li>'.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';
3238: } else {
3239: $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';
3240: }
3241: }
1.28 raeburn 3242: my %authname = &authtype_names();
3243: my %context_title = &context_names();
3244: if (ref($changes{'authtypes'}) eq 'ARRAY') {
3245: my $chgtext = '<ul>';
3246: foreach my $type (@{$changes{'authtypes'}}) {
3247: my @allowed;
3248: $chgtext .= '<li><span class="LC_cusr_emph">'.$context_title{$type}.'</span> - '.&mt('assignable authentication types: ');
3249: foreach my $auth (@authtypes) {
3250: if ($authhash{$type}{$auth}) {
3251: push(@allowed,$authname{$auth});
3252: }
3253: }
3254: $chgtext .= join(', ',@allowed).'</li>';
3255: }
3256: $chgtext .= '</ul>';
3257: $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;
3258: $resulttext .= '</li>';
3259: }
1.27 raeburn 3260: $resulttext .= '</ul>';
3261: } else {
1.28 raeburn 3262: $resulttext = &mt('No changes made to user creation settings');
1.27 raeburn 3263: }
3264: } else {
3265: $resulttext = '<span class="LC_error">'.
1.23 raeburn 3266: &mt('An error occurred: [_1]',$putresult).'</span>';
3267: }
3268: return $resulttext;
3269: }
3270:
1.33 raeburn 3271: sub modify_usermodification {
3272: my ($dom,%domconfig) = @_;
3273: my ($resulttext,%curr_usermodification,%changes);
3274: if (ref($domconfig{'usermodification'}) eq 'HASH') {
3275: foreach my $key (keys(%{$domconfig{'usermodification'}})) {
3276: $curr_usermodification{$key} = $domconfig{'usermodification'}{$key};
3277: }
3278: }
3279: my @contexts = ('author','course');
3280: my %context_title = (
3281: author => 'In author context',
3282: course => 'In course context',
3283: );
3284: my @fields = ('lastname','firstname','middlename','generation',
3285: 'permanentemail','id');
3286: my %roles = (
3287: author => ['ca','aa'],
3288: course => ['st','ep','ta','in','cr'],
3289: );
3290: my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
3291: my %modifyhash;
3292: foreach my $context (@contexts) {
3293: foreach my $role (@{$roles{$context}}) {
3294: my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$role);
3295: foreach my $item (@fields) {
3296: if (grep(/^\Q$item\E$/,@modifiable)) {
3297: $modifyhash{$context}{$role}{$item} = 1;
3298: } else {
3299: $modifyhash{$context}{$role}{$item} = 0;
3300: }
3301: }
3302: }
3303: if (ref($curr_usermodification{$context}) eq 'HASH') {
3304: foreach my $role (@{$roles{$context}}) {
3305: if (ref($curr_usermodification{$context}{$role}) eq 'HASH') {
3306: foreach my $field (@fields) {
3307: if ($modifyhash{$context}{$role}{$field} ne
3308: $curr_usermodification{$context}{$role}{$field}) {
3309: push(@{$changes{$context}},$role);
3310: last;
3311: }
3312: }
3313: }
3314: }
3315: } else {
3316: foreach my $context (@contexts) {
3317: foreach my $role (@{$roles{$context}}) {
3318: push(@{$changes{$context}},$role);
3319: }
3320: }
3321: }
3322: }
3323: my %usermodification_hash = (
3324: usermodification => \%modifyhash,
3325: );
3326: my $putresult = &Apache::lonnet::put_dom('configuration',
3327: \%usermodification_hash,$dom);
3328: if ($putresult eq 'ok') {
3329: if (keys(%changes) > 0) {
3330: $resulttext = &mt('Changes made: ').'<ul>';
3331: foreach my $context (@contexts) {
3332: if (ref($changes{$context}) eq 'ARRAY') {
3333: $resulttext .= '<li>'.$context_title{$context}.':<ul>';
3334: if (ref($changes{$context}) eq 'ARRAY') {
3335: foreach my $role (@{$changes{$context}}) {
3336: my $rolename;
3337: if ($role eq 'cr') {
3338: $rolename = &mt('Custom');
3339: } else {
3340: $rolename = &Apache::lonnet::plaintext($role);
3341: }
3342: my @modifiable;
3343: $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');
3344: foreach my $field (@fields) {
3345: if ($modifyhash{$context}{$role}{$field}) {
3346: push(@modifiable,$fieldtitles{$field});
3347: }
3348: }
3349: if (@modifiable > 0) {
3350: $resulttext .= join(', ',@modifiable);
3351: } else {
3352: $resulttext .= &mt('none');
3353: }
3354: $resulttext .= '</li>';
3355: }
3356: $resulttext .= '</ul></li>';
3357: }
3358: }
3359: }
3360: $resulttext .= '</ul>';
3361: } else {
3362: $resulttext = &mt('No changes made to user modification settings');
3363: }
3364: } else {
3365: $resulttext = '<span class="LC_error">'.
3366: &mt('An error occurred: [_1]',$putresult).'</span>';
3367: }
3368: return $resulttext;
3369: }
3370:
1.3 raeburn 3371: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>