Annotation of modules/gci/londocs.pm, revision 1.1
1.1 ! gci 1: # The LearningOnline Network
! 2: # Documents
! 3: # Modified for GCI Concept Inventory Assemby
! 4: #
! 5: # $Id: londocs.pm,v 1.9 2009/08/18 13:17:28 www Exp $
! 6: #
! 7: # Copyright Michigan State University Board of Trustees
! 8: #
! 9: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
! 10: #
! 11: # LON-CAPA is free software; you can redistribute it and/or modify
! 12: # it under the terms of the GNU General Public License as published by
! 13: # the Free Software Foundation; either version 2 of the License, or
! 14: # (at your option) any later version.
! 15: #
! 16: # LON-CAPA is distributed in the hope that it will be useful,
! 17: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 18: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 19: # GNU General Public License for more details.
! 20: #
! 21: # You should have received a copy of the GNU General Public License
! 22: # along with LON-CAPA; if not, write to the Free Software
! 23: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 24: #
! 25: # /home/httpd/html/adm/gpl.txt
! 26: #
! 27: # http://www.lon-capa.org/
! 28: #
! 29:
! 30:
! 31:
! 32: package Apache::londocs;
! 33:
! 34: use strict;
! 35:
! 36: use Apache::Constants qw(:common :http);
! 37: use Apache::imsexport;
! 38: use Apache::lonnet;
! 39: use Apache::loncommon;
! 40: use LONCAPA::map();
! 41: use Apache::lonratedt();
! 42: use Apache::lonxml;
! 43: use Apache::lonclonecourse;
! 44: use Apache::lonnavmaps;
! 45: use Apache::lonindexer;
! 46: use HTML::Entities;
! 47: use GDBM_File;
! 48: use Apache::lonlocal;
! 49: use Cwd;
! 50: use LONCAPA qw(:DEFAULT :match);
! 51:
! 52: my $iconpath;
! 53:
! 54: my %hash;
! 55:
! 56: my $hashtied;
! 57: my %alreadyseen=();
! 58:
! 59: my %help=();
! 60:
! 61:
! 62: my $path;
! 63: my $version;
! 64: my $reqnum;
! 65: my @categories;
! 66: my @allprobs;
! 67: my %probcat;
! 68: my %prereqs;
! 69: my @defchosen;
! 70: my @chosen;
! 71:
! 72: sub setdefaults {
! 73: $path='/res/gci/gci';
! 74: $version='GCIv2-1-1';
! 75: $reqnum=15;
! 76: @allprobs=('01','02','03','04','05','06','07',
! 77: '08','10',
! 78: '09',
! 79: '11','12','13','14','15','16','17',
! 80: '18','69',
! 81: '19','20',
! 82: '21','22','23','24','25','26','27','28','29','30',
! 83: '31','32','33','34','35','36','37','38',
! 84: '39A','39B',
! 85: '40',
! 86: '41','42','43','44','45','46','47','48','49','50',
! 87: '51',
! 88: '52','57',
! 89: '53','54','55','56','58',
! 90: '60',
! 91: '61','62','63','64','65','66','67','68','70',
! 92: '71',
! 93: '2004_73');
! 94:
! 95: @categories=('M1','M2','M3','M4',
! 96: 'A','B','C','D','E','F','G','H','I','J','K');
! 97: %probcat =('01' => 'M1','02' => 'M2','03' => 'A' ,'04' => 'A' ,'05' => '' ,'06' => 'A' ,'07' => 'B' ,'08' => 'B' ,'09' => 'B' ,'10' => 'C' ,
! 98: '11' => '' ,'12' => 'C' ,'13' => 'C' ,'14' => 'C' ,'15' => 'C' ,'16' => 'C' ,'17' => 'C' ,'18' => 'D' ,'19' => 'D' ,'20' => 'D' ,
! 99: '21' => 'D' ,'22' => 'D' ,'23' => 'D' ,'24' => 'D' ,'25' => 'D' ,'26' => 'E' ,'27' => 'E' ,'28' => 'E' ,'29' => '' ,'30' => 'E' ,
! 100: '31' => '' ,'32' => 'F' ,'33' => 'F' ,'34' => 'F' ,'35' => 'F' ,'36' => 'F' ,'37' => 'M3','38' => 'G' ,
! 101: '39A'=> 'G' ,'39B'=> 'G' ,
! 102: '40' => 'G' ,
! 103: '41' => 'G' ,'42' => 'G' ,'43' => 'G' ,'44' => 'G' ,'45' => 'G' ,'46' => 'G' ,'47' => 'H' ,'48' => 'H' ,'49' => 'H' ,'50' => 'H' ,
! 104: '51' => 'H' ,'52' => 'H' ,'53' => 'H' ,'54' => 'I' ,'55' => 'I' ,'56' => 'I' ,'57' => 'I' ,'58' => 'I' ,
! 105: '60' => 'I' ,
! 106: '61' => 'I' ,'62' => 'I' ,'63' => 'J' ,'64' => 'J' ,'65' => 'J' ,'66' => 'K' ,'67' => 'K' ,'68' => 'K' ,'69' => 'K' ,'70' => 'K' ,
! 107: '71' => 'K' ,
! 108: '2004_73' => 'M4');
! 109: %prereqs=('10' => '08', '57' => '52', '69' => '18');
! 110: @defchosen=('01','02','03','07','12','18','26','32','37','38','47','54','63','66','2004_73');
! 111: }
! 112:
! 113: sub checkvalid {
! 114: my %covered=();
! 115: my %chosenproblems=();
! 116: my @errors=();
! 117: my $num=$#chosen+1;
! 118: if ($num<$reqnum) {
! 119: push(@errors,&mt('Test requires at least [_1] items, but has only [_2].',$reqnum,$num));
! 120: }
! 121: foreach my $item (@chosen) {
! 122: $chosenproblems{$item}=1;
! 123: $covered{$probcat{$item}}=1;
! 124: }
! 125: foreach my $cat (@categories) {
! 126: unless ($covered{$cat}) {
! 127: push(@errors,&mt('Category [_1] not covered.',$cat));
! 128: }
! 129: }
! 130: foreach my $item (@chosen) {
! 131: if ($prereqs{$item}) {
! 132: unless ($chosenproblems{$prereqs{$item}}) {
! 133: push(@errors,&mt('Problem [_1] requires problem [_2].',$item,$prereqs{$item}));
! 134: }
! 135: }
! 136: }
! 137: return @errors;
! 138: }
! 139:
! 140: sub fullurl {
! 141: my ($item)=@_;
! 142: unless ($item=~/\_/) { $item='_'.$item; }
! 143: return $path.'/'.$version.'/GCI'.$item.'.problem';
! 144: }
! 145:
! 146: sub listresources {
! 147: my ($r)=@_;
! 148: my @errors=&checkvalid();
! 149: if ($#errors>-1) {
! 150: $r->print('<span class="LC_error">'.&mt('Your test is not yet valid.').'</span><p>'.&mt('The following issues must be addressed before you can use the test:').'<ul>');
! 151: foreach my $message (@errors) {
! 152: $r->print('<li>'.$message.'</li>');
! 153: }
! 154: $r->print('</ul></p>');
! 155: }
! 156: my %chosen=();
! 157: foreach my $item (@chosen) {
! 158: $chosen{$item}=1;
! 159: }
! 160: $r->print('<form name="selecteditems" method="post">');
! 161: $r->print('<p>'.&mt('You may select test items from the list below and then press "Store Problem Selection" at the bottom of the screen.').'</p>');
! 162: $r->print(&Apache::loncommon::start_data_table().
! 163: &Apache::loncommon::start_data_table_header_row().
! 164: '<th>'.&mt('Select').'</th><th>'.&mt('Problem').'</th><th>'.&mt('Category').'</th><th>'.&mt('Preview').'</th>'.
! 165: &Apache::loncommon::end_data_table_header_row());
! 166: foreach my $item (@allprobs) {
! 167: $r->print(&Apache::loncommon::start_data_table_row());
! 168: $r->print('<td><font size="+3">');
! 169: $r->print('<input type="checkbox" name="item'.$item.'"');
! 170: if ($chosen{$item}) { $r->print(' checked="checked"'); }
! 171: $r->print(' /></font></td>');
! 172: $r->print('<td><font size="+3">'.$item.'</font></td><td><font size="+3">'.$probcat{$item}.'</font></td>');
! 173: my $output=&Apache::lonindexer::showpreview(&fullurl($item));
! 174: $r->print('<td> '.($output eq '' ? ' ':$output)." </td>\n");
! 175:
! 176: $r->print( &Apache::loncommon::end_data_table_row());
! 177: }
! 178: $r->print(&Apache::loncommon::end_data_table());
! 179: $r->print('<input type="hidden" name="phase" value="storemap" />');
! 180: $r->print('<input type="submit" value="'.&mt('Store Problem Selection').'" /></form>');
! 181: }
! 182:
! 183: sub evaluate {
! 184: if ($env{'form.phase'} eq 'storemap') {
! 185: @chosen=();
! 186: foreach my $item (@allprobs) {
! 187: if ($env{'form.item'.$item}) {
! 188: push(@chosen,$item);
! 189: }
! 190: }
! 191: }
! 192: }
! 193:
! 194: sub mapread {
! 195: my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
! 196: my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
! 197: return
! 198: &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/default.sequence');
! 199: }
! 200:
! 201: sub storemap {
! 202: my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
! 203: my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
! 204: my ($outtext,$errtext)=
! 205: &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/default.sequence',1);
! 206: if ($errtext) { return ($errtext,2); }
! 207: return ($errtext,0);
! 208: }
! 209:
! 210: sub chosen_to_map {
! 211: my %chosenproblems=();
! 212: foreach my $item (@chosen) {
! 213: $chosenproblems{$item}=1;
! 214: }
! 215: @LONCAPA::map::order=();
! 216: @LONCAPA::map::resources=();
! 217: for (my $idx=0;$idx<=$#allprobs;$idx++) {
! 218: my $residx=$idx+1;
! 219: if ($chosenproblems{$allprobs[$idx]}) {
! 220: push(@LONCAPA::map::order,$residx);
! 221: my $url = &LONCAPA::map::qtunescape(&fullurl($allprobs[$idx]));
! 222: my $name = &LONCAPA::map::qtunescape('Problem '.$allprobs[$idx]);
! 223: $LONCAPA::map::resources[$residx]=join(':', ($name, $url, 'false', 'normal', 'res'));
! 224: }
! 225: }
! 226: }
! 227:
! 228: sub map_to_chosen {
! 229: @chosen=();
! 230: foreach my $idx (@LONCAPA::map::order) {
! 231: push(@chosen,$allprobs[$idx-1]);
! 232: }
! 233: }
! 234:
! 235: sub store {
! 236: my ($r)=@_;
! 237: my @errors=&checkvalid();
! 238: if ($#errors>1) { return; }
! 239: &chosen_to_map();
! 240: &storemap();
! 241: unless ($#errors>-1) {
! 242: $r->print('<p>'.&mt('You have successfully assembled a valid test.').
! 243: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
! 244: '<input type="hidden" name="orgurl" value="/adm/navmaps" /><input type="hidden" name="selectrole" value="1" />'.
! 245: '<input type="hidden" name="'.$env{'request.role'}.'" value="1" /><input type="submit" value="'.
! 246: &mt('Activate Current Test').'" /></form></p>');
! 247: }
! 248: }
! 249:
! 250: sub load {
! 251: &mapread();
! 252: &map_to_chosen();
! 253: my @errors=&checkvalid();
! 254: if ($#errors>1) { @chosen=@defchosen; }
! 255: }
! 256:
! 257: # empty cleanup handler
! 258:
! 259: sub untiehash {
! 260: return OK;
! 261: }
! 262:
! 263:
! 264: sub handler {
! 265: my $r = shift;
! 266: &Apache::loncommon::content_type($r,'text/html');
! 267: $r->send_http_header;
! 268: return OK if $r->header_only;
! 269:
! 270: $r->print(&Apache::loncommon::start_page('Assemble Test'));
! 271:
! 272: my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
! 273: # graphics settings
! 274: $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
! 275:
! 276: # initialize default values
! 277:
! 278: &setdefaults();
! 279:
! 280: # Only edit stuff if the user is allowed to edit
! 281: if ($allowed) {
! 282: # do we need to store something?
! 283: if ($env{'form.phase'} eq 'storemap') {
! 284: # see if there is user input that needs to be stored
! 285: &evaluate();
! 286: &store($r);
! 287: }
! 288: # load the map
! 289: &load();
! 290: # bring up the selection screen
! 291: &listresources($r);
! 292: }
! 293: $r->print(&Apache::loncommon::end_page());
! 294: return OK;
! 295: }
! 296: 1;
! 297: __END__
! 298:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>