Parent Directory
|
Revision Log
return highest grade if several instances of a quiz have been taken
1 package WebworkSOAP; 2 3 use strict; 4 5 use WeBWorK::Utils qw(pretty_print_rh); 6 use WeBWorK::Utils::CourseManagement qw(addCourse renameCourse deleteCourse listCourses archiveCourse listArchivedCourses unarchiveCourse); 7 use WeBWorK::DB; 8 use WeBWorK::DB::Utils qw(initializeUserProblem); 9 use WeBWorK::CourseEnvironment; 10 use WeBWorK::ContentGenerator::Instructor; 11 12 use WebworkSOAP::Classes::GlobalSet; 13 use WebworkSOAP::Classes::UserSet; 14 use WebworkSOAP::Classes::GlobalProblem; 15 use WebworkSOAP::Classes::UserProblem; 16 use WebworkSOAP::Classes::User; 17 use WebworkSOAP::Classes::Key; 18 use WebworkSOAP::Classes::Password; 19 use WebworkSOAP::Classes::Permission; 20 21 #init 22 23 use constant { 24 SOAPERROR_MAJOR => 1, 25 SOAPERROR_MINOR => 2, 26 SOAPERROR_CLASS_NOT_FOUND => 3, 27 SOAPERROR_USER_NOT_FOUND => 4, 28 SOAPERROR_SET_NOT_FOUND => 5, 29 SOAPERROR_PROBLEM_NOT_FOUND => 6, 30 SOAPERROR_KEY_NOT_FOUND => 7, 31 SOAPERROR_AUTHEN_FAILED => 8 32 }; 33 34 our %SeedCE; 35 %WebworkSOAP::SeedCE = %WeBWorK::SeedCE; 36 37 $WebworkSOAP::SeedCE{soap_authen_key} = "123456789123456789"; 38 #$WebworkSOAP::SeedCE{webwork_dir} = $ENV{WEBWORK_ROOT}|| warn "\$ENV{WEBWORK_ROOT} is undefined -- check your httpd configuration. Error caught "; 39 40 41 sub new { 42 my($self,$authenKey,$courseName) = @_; 43 $self = {}; 44 #Construct Course 45 my $ce = eval { new WeBWorK::CourseEnvironment({%SeedCE, courseName => $courseName }) }; 46 $@ and soap_fault_major("Course Environment cannot be constructed.<br>$@"); 47 #Authentication Check 48 if($ce->{soap_authen_key} != $authenKey) { 49 soap_fault_authen(); 50 } 51 #Construct DB handle 52 my $db = eval { new WeBWorK::DB($ce->{dbLayout}); }; 53 $@ and soap_fault_major("Failed to initialize database handle.<br>$@"); 54 $self->{db} = $db; 55 $self->{ce} = $ce; 56 bless $self; 57 return $self; 58 } 59 60 sub array_to_soap_string { 61 my @array = @_; 62 @array = map { SOAP::Data->type( 'string', $_ ) } @array; 63 return \@array; 64 } 65 66 sub soap_fault_authen { 67 die SOAP::Fault->faultcode(SOAPERROR_AUTHEN_FAILED) 68 ->faultstring("SOAP Webservice Authentication Failed!"); 69 } 70 71 sub soap_fault { 72 my ($errorCode,$errorMsg) = @_; 73 die SOAP::Fault->faultcode($errorCode) 74 ->faultstring($errorMsg); 75 } 76 77 sub soap_fault_major { 78 my ($errorMsg) = @_; 79 soap_fault(SOAPERROR_MAJOR,$errorMsg); 80 } 81 #################################################################################### 82 #SOAP CALLABLE FUNCTIONS 83 #################################################################################### 84 85 =pod 86 =begin WSDL 87 _RETURN $string Hello World! 88 =cut 89 sub hello { 90 return "Hello world!"; 91 } 92 93 ################################################# 94 #Course 95 ################################################# 96 97 =pod 98 =begin WSDL 99 _IN authenKey $string 100 _RETURN @string 101 =end WSDL 102 =cut 103 sub list_courses { 104 my ($self,$authenKey) = @_; 105 my $ce = eval { new WeBWorK::CourseEnvironment({%WeBWorK::SeedCE })}; 106 $@ and soap_fault_major("Internal Course Environment cannot be constructed."); 107 if($authenKey != $WebworkSOAP::SeedCE{soap_authen_key}) { 108 soap_fault_authen; 109 } 110 $@ and soap_fault_major("Course Environment cannot be constructed."); 111 my @test = listCourses($ce); 112 return array_to_soap_string( @test ); 113 } 114 115 =pod 116 =begin WSDL 117 _IN authenKey $string 118 _IN courseName $string 119 _IN userID $string 120 _RETURN $string 121 =end WSDL 122 =cut 123 sub login_user { 124 my ($self,$authenKey,$courseName,$userID) = @_; 125 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 126 my $newKey; 127 my $timestamp = time; 128 my @chars = @{ $soapEnv->{ce}->{sessionKeyChars} }; 129 my $length = $soapEnv->{ce}->{sessionKeyLength}; 130 srand; 131 $newKey = join ("", @chars[map rand(@chars), 1 .. $length]); 132 my $Key = $soapEnv->{db}->newKey(user_id=>$userID, key=>$newKey, timestamp=>$timestamp); 133 eval { $soapEnv->{db}->deleteKey($userID) }; 134 eval { $soapEnv->{db}->addKey($Key) }; 135 $@ and soap_fault(SOAPERROR_USER_NOT_FOUND,"User not found."); 136 return SOAP::Data->type( 'string', $newKey ); 137 } 138 139 =pod 140 =begin WSDL 141 _IN authenKey $string 142 _IN courseName $string 143 _IN userID $string 144 _IN setID $string 145 _RETURN $string 146 =end WSDL 147 =cut 148 sub assign_set_to_user { 149 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 150 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 151 my $GlobalSet = eval {$soapEnv->{db}->getGlobalSet($setID)}; 152 $@ and soap_fault(SOAPERROR_SET_NOT_FOUND,"Set not found."); 153 my $setID = $GlobalSet->set_id; 154 my $db = $soapEnv->{db}; 155 my $UserSet = $db->newUserSet; 156 $UserSet->user_id($userID); 157 $UserSet->set_id($setID); 158 my @results; 159 my $set_assigned = 0; 160 eval { $db->addUserSet($UserSet) }; 161 if ($@) { 162 if ($@ =~ m/user set exists/) { 163 push @results, "set $setID is already assigned to user $userID."; 164 $set_assigned = 1; 165 } else { 166 die $@; 167 } 168 } 169 170 my @GlobalProblems = grep { defined $_ } $db->getAllGlobalProblems($setID); 171 foreach my $GlobalProblem (@GlobalProblems) { 172 my $seed = int( rand( 2423) ) + 36; 173 my $UserProblem = $db->newUserProblem; 174 $UserProblem->user_id($userID); 175 $UserProblem->set_id($GlobalProblem->set_id); 176 $UserProblem->problem_id($GlobalProblem->problem_id); 177 initializeUserProblem($UserProblem, $seed); 178 eval { $db->addUserProblem($UserProblem) }; 179 } 180 return array_to_soap_string( @results ); #FIXME WSDL says $string, not @string? 181 } 182 183 =pod 184 =begin WSDL 185 _IN authenKey $string 186 _IN courseName $string 187 _IN userIDs @string 188 _IN setID $string 189 _RETURN @string 190 =end WSDL 191 =cut 192 sub grade_users_sets { 193 my ($self,$authenKey,$courseName,$userIDs,$setID) = @_; 194 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 195 my @grades; 196 #open (LOG, ">>/opt/webwork/tmp_log") or die "Can't open log file"; 197 #print LOG "\n\nhi there\n\n"; 198 199 my $db = $soapEnv->{db}; 200 foreach my $userID (@{$userIDs}) { 201 # my @problemData = $soapEnv->{db}->getAllMergedUserProblems($userID,$setID); 202 # 203 # my $grade = 0; 204 # for(my $i=0;$i<@problemData;$i++) { 205 # #print LOG "$userID problem Data",join(" ", %{$problemData[$i]}),"\n\n"; 206 # $grade += ($problemData[$i]->status)*($problemData[$i]->value); 207 # #print LOG "grade is $grade\n"; 208 # } 209 #print LOG "grade_users_sets: get user $userID set $setID\n"; 210 my $grade = get_wwassignment_grade_for_one_user($db, $userID,$setID ); 211 #print LOG " grade is $grade \n\n"; 212 push(@grades,$grade); 213 } 214 #close(LOG); 215 return array_to_soap_string( @grades ); 216 } 217 218 =pod 219 =begin WSDL 220 _IN authenKey $string 221 _IN courseName $string 222 _IN setID $string 223 _RETURN $WebworkSOAP::Classes::GlobalSet 224 =end WSDL 225 =cut 226 sub get_set_data { 227 my ($self,$authenKey,$courseName,$setID) = @_; 228 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 229 my $setData = $soapEnv->{db}->getGlobalSet($setID); 230 if(not defined $setData) { 231 return -1; 232 } 233 my $set = new WebworkSOAP::Classes::GlobalSet($setData); 234 return $set; 235 } 236 237 #################################################################### 238 ##FUNCTIONS DIRECTLY MAPPED TO FUNCTIONS IN DB.pm 239 #################################################################### 240 ############################################### 241 ##Password 242 ############################################### 243 244 =pod 245 =begin WSDL 246 _IN authenKey $string 247 _IN courseName $string 248 _IN record $WebworkSOAP::Classes::Password 249 _RETURN $string 250 =end WSDL 251 =cut 252 sub add_password { 253 my ($self,$authenKey,$courseName,$record) = @_; 254 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 255 my $newPassword = $soapEnv->{db}->newPassword; 256 %$newPassword = %$record; 257 return SOAP::Data->type( 'string', $soapEnv->{db}->addPassword($newPassword) ); 258 } 259 260 =pod 261 =begin WSDL 262 _IN authenKey $string 263 _IN courseName $string 264 _IN record $WebworkSOAP::Classes::Password 265 _RETURN $string 266 =end WSDL 267 =cut 268 sub put_password { 269 my ($self,$authenKey,$courseName,$record) = @_; 270 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 271 return SOAP::Data->type( 'string', $soapEnv->{db}->putPassword($record) ); 272 } 273 274 =pod 275 =begin WSDL 276 _IN authenKey $string 277 _IN courseName $string 278 _RETURN @string 279 =end WSDL 280 =cut 281 sub list_password { 282 my ($self,$authenKey,$courseName) = @_; 283 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 284 my @tempArray = $soapEnv->{db}->listPasswords; 285 return array_to_soap_string( @tempArray ); 286 } 287 288 =pod 289 =begin WSDL 290 _IN authenKey $string 291 _IN courseName $string 292 _IN userIDs @string 293 _RETURN @WebworkSOAP::Classes::Password Array of user objects 294 =end WSDL 295 =cut 296 sub get_passwords { 297 my ($self,$authenKey,$courseName,$userIDs) = @_; 298 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 299 my @passwordData = $soapEnv->{db}->getPasswords(@$userIDs); 300 my @passwords; 301 for(my $i=0;$i<@passwordData;$i++) { 302 push(@passwords,new WebworkSOAP::Classes::Password(@passwordData[$i])); 303 } 304 return \@passwords; 305 } 306 307 =pod 308 =begin WSDL 309 _IN authenKey $string 310 _IN courseName $string 311 _IN userID $string 312 _RETURN $WebworkSOAP::Classes::Password of names objects. 313 =end WSDL 314 =cut 315 sub get_password { 316 my ($self,$authenKey,$courseName,$userID) = @_; 317 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 318 my $passwordData = $soapEnv->{db}->getPassword($userID); 319 if(not defined $passwordData) { 320 return -1; 321 } 322 my $password = new WebworkSOAP::Classes::Password($passwordData); 323 return ($password); 324 } 325 326 ################################################## 327 ##Permission 328 ################################################## 329 330 =pod 331 =begin WSDL 332 _IN authenKey $string 333 _IN courseName $string 334 _IN record $WebworkSOAP::Classes::Permission 335 _RETURN $string 336 =end WSDL 337 =cut 338 sub add_permission { 339 my ($self,$authenKey,$courseName,$record) = @_; 340 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 341 my $newPermissionLevel = $soapEnv->{db}->newPermissionLevel; 342 %$newPermissionLevel = %$record; 343 return SOAP::Data->type( 'string', $soapEnv->{db}->addPermissionLevel($newPermissionLevel) ); 344 } 345 346 =pod 347 =begin WSDL 348 _IN authenKey $string 349 _IN courseName $string 350 _IN record $WebworkSOAP::Classes::Permission 351 _RETURN $string 352 =end WSDL 353 =cut 354 sub put_permission { 355 my ($self,$authenKey,$courseName,$record) = @_; 356 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 357 return SOAP::Data->type( 'string', $soapEnv->{db}->putPermissionLevel($record) ); 358 } 359 360 =pod 361 =begin WSDL 362 _IN authenKey $string 363 _IN courseName $string 364 _RETURN @string 365 =end WSDL 366 =cut 367 sub list_permissions { 368 my ($self,$authenKey,$courseName) = @_; 369 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 370 my @tempArray = $soapEnv->{db}->listPermissionLevels; 371 return array_to_soap_string( @tempArray ); 372 } 373 374 =pod 375 =begin WSDL 376 _IN authenKey $string 377 _IN courseName $string 378 _IN userIDs @string 379 _RETURN @WebworkSOAP::Classes::Permission Array of user objects 380 =end WSDL 381 =cut 382 sub get_permissions { 383 my ($self,$authenKey,$courseName,$userIDs) = @_; 384 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 385 my @permissionData = $soapEnv->{db}->getPermissionLevels(@$userIDs); 386 my @permissions; 387 for(my $i=0;$i<@permissionData;$i++) { 388 push(@permissions,new WebworkSOAP::Classes::Permission(@permissionData[$i])); 389 } 390 return \@permissions; 391 } 392 393 =pod 394 =begin WSDL 395 _IN authenKey $string 396 _IN courseName $string 397 _IN userID $string 398 _RETURN $WebworkSOAP::Classes::Permission of names objects. 399 =end WSDL 400 =cut 401 sub get_permission { 402 my ($self,$authenKey,$courseName,$userID) = @_; 403 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 404 my $permissionData = $soapEnv->{db}->getPermissionLevel($userID); 405 if(not defined $permissionData) { 406 return -1; 407 } 408 my $permission = new WebworkSOAP::Classes::Permission($permissionData); 409 return ($permission); 410 } 411 412 ################################################## 413 ##Key 414 ################################################## 415 416 =pod 417 =begin WSDL 418 _IN authenKey $string 419 _IN courseName $string 420 _IN record $WebworkSOAP::Classes::Key 421 _RETURN $string 422 =end WSDL 423 =cut 424 sub add_key { 425 my ($self,$authenKey,$courseName,$record) = @_; 426 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 427 my $newKey = $soapEnv->{db}->newKey; 428 %$newKey = %$record; 429 return SOAP::Data->type( 'string', $soapEnv->{db}->addKey($newKey) ); 430 } 431 432 =pod 433 =begin WSDL 434 _IN authenKey $string 435 _IN courseName $string 436 _IN record $WebworkSOAP::Classes::Key 437 _RETURN $string 438 =end WSDL 439 =cut 440 sub put_key { 441 my ($self,$authenKey,$courseName,$record) = @_; 442 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 443 return SOAP::Data->type( 'string', $soapEnv->{db}->putKey($record) ); 444 } 445 446 =pod 447 =begin WSDL 448 _IN authenKey $string 449 _IN courseName $string 450 _RETURN @string 451 =end WSDL 452 =cut 453 sub list_keys { 454 my ($self,$authenKey,$courseName) = @_; 455 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 456 my @tempArray = $soapEnv->{db}->listKeys; 457 return array_to_soap_string( @tempArray ); 458 } 459 460 =pod 461 =begin WSDL 462 _IN authenKey $string 463 _IN courseName $string 464 _IN userIDs @string 465 _RETURN @WebworkSOAP::Classes::Key Array of user objects 466 =end WSDL 467 =cut 468 sub get_keys { 469 my ($self,$authenKey,$courseName,$userIDs) = @_; 470 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 471 my @keyData = $soapEnv->{db}->getKeys(@$userIDs); 472 my @keys; 473 for(my $i=0;$i<@keyData;$i++) { 474 push(@keys,new WebworkSOAP::Classes::Key(@keyData[$i])); 475 } 476 return \@keys; 477 } 478 479 =pod 480 =begin WSDL 481 _IN authenKey $string 482 _IN courseName $string 483 _IN userID $string 484 _RETURN $WebworkSOAP::Classes::Key of names objects. 485 =end WSDL 486 =cut 487 sub get_key { 488 my ($self,$authenKey,$courseName,$userID) = @_; 489 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 490 my $keyData = $soapEnv->{db}->getKey($userID); 491 if(not defined $keyData) { 492 return -1; 493 } 494 my $key = new WebworkSOAP::Classes::Key($keyData); 495 return ($key); 496 } 497 498 ################################################## 499 ##User 500 ################################################## 501 502 =pod 503 =begin WSDL 504 _IN authenKey $string 505 _IN courseName $string 506 _IN record $WebworkSOAP::Classes::User 507 _RETURN $string 508 =end WSDL 509 =cut 510 sub add_user { 511 my ($self,$authenKey,$courseName,$record) = @_; 512 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 513 my $newUser = $soapEnv->{db}->newUser; 514 %$newUser = %$record; 515 return SOAP::Data->type( 'string', $soapEnv->{db}->addUser($newUser) ); 516 } 517 518 =pod 519 =begin WSDL 520 _IN authenKey $string 521 _IN courseName $string 522 _IN record $WebworkSOAP::Classes::User 523 _RETURN $string 524 =end WSDL 525 =cut 526 sub put_user { 527 my ($self,$authenKey,$courseName,$record) = @_; 528 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 529 return SOAP::Data->type( 'string', $soapEnv->{db}->putUser($record) ); 530 } 531 532 =pod 533 =begin WSDL 534 _IN authenKey $string 535 _IN courseName $string 536 _RETURN @string of names objects. 537 =end WSDL 538 =cut 539 sub list_users { 540 my ($self,$authenKey,$courseName) = @_; 541 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 542 my @tempArray = $soapEnv->{db}->listUsers; 543 return array_to_soap_string( @tempArray ); 544 } 545 546 =pod 547 =begin WSDL 548 _IN authenKey $string 549 _IN courseName $string 550 _IN userID $string 551 _RETURN $WebworkSOAP::Classes::User of names objects. 552 =end WSDL 553 =cut 554 sub get_user { 555 my ($self,$authenKey,$courseName,$userID) = @_; 556 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 557 my $userData = $soapEnv->{db}->getUser($userID); 558 if(not defined $userData) { 559 return -1; 560 } 561 my $user = new WebworkSOAP::Classes::User($userData); 562 return ($user); 563 } 564 565 =pod 566 =begin WSDL 567 _IN authenKey $string 568 _IN courseName $string 569 _IN userIDs @string 570 _RETURN @WebworkSOAP::Classes::User Array of user objects 571 =end WSDL 572 =cut 573 sub get_users { 574 my ($self,$authenKey,$courseName,$userIDs) = @_; 575 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 576 my @userData = $soapEnv->{db}->getUsers(@$userIDs); 577 my @users; 578 for(my $i=0;$i<@userData;$i++) { 579 push(@users,new WebworkSOAP::Classes::User(@userData[$i])); 580 } 581 return \@users; 582 } 583 584 =pod 585 =begin WSDL 586 _IN authenKey $string 587 _IN courseName $string 588 _IN userID $string 589 _RETURN $string 590 =end WSDL 591 =cut 592 sub delete_user { 593 my ($self,$authenKey,$courseName,$userID) = @_; 594 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 595 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteUser($userID) ); 596 } 597 598 ################################################## 599 ##Global Sets 600 ################################################## 601 602 =pod 603 =begin WSDL 604 _IN authenKey $string 605 _IN courseName $string 606 _IN record $WebworkSOAP::Classes::GlobalSet 607 _RETURN $string 608 =end WSDL 609 =cut 610 sub add_global_set { 611 my ($self,$authenKey,$courseName,$record) = @_; 612 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 613 my $newGlobalSet = $soapEnv->{db}->newGlobalSet; 614 %$newGlobalSet = %$record; 615 return SOAP::Data->type( 'string', $soapEnv->{db}->addGlobalSet($newGlobalSet) ); 616 } 617 618 =pod 619 =begin WSDL 620 _IN authenKey $string 621 _IN courseName $string 622 _IN record $WebworkSOAP::Classes::GlobalSet 623 _RETURN $string 624 =end WSDL 625 =cut 626 sub put_global_set { 627 my ($self,$authenKey,$courseName,$record) = @_; 628 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 629 return SOAP::Data->type( 'string', $soapEnv->{db}->putGlobalSet($record) ); 630 } 631 632 =pod 633 =begin WSDL 634 _IN authenKey $string 635 _IN courseName $string 636 _RETURN @string of names objects. 637 =end WSDL 638 =cut 639 sub list_global_sets { 640 my ($self,$authenKey,$courseName) = @_; 641 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 642 my @tempArray = $soapEnv->{db}->listGlobalSets; 643 return array_to_soap_string( @tempArray ); 644 } 645 646 =pod 647 =begin WSDL 648 _IN authenKey $string 649 _IN courseName $string 650 _RETURN @WebworkSOAP::Classes::GlobalSet Array of user objects 651 =end WSDL 652 =cut 653 sub get_all_global_sets { 654 my ($self,$authenKey,$courseName) = @_; 655 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 656 my @tempArray = $soapEnv->{db}->listGlobalSets; 657 my @setData = $soapEnv->{db}->getGlobalSets(@tempArray); 658 my @sets; 659 for(my $i=0;$i<@setData;$i++) { 660 push(@sets,new WebworkSOAP::Classes::GlobalSet(@setData[$i])); 661 } 662 return \@sets; 663 } 664 665 =pod 666 =begin WSDL 667 _IN authenKey $string 668 _IN courseName $string 669 _IN setIDs @string 670 _RETURN @WebworkSOAP::Classes::GlobalSet Array of user objects 671 =end WSDL 672 =cut 673 sub get_global_sets { 674 my ($self,$authenKey,$courseName,$setIDs) = @_; 675 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 676 my @setData = $soapEnv->{db}->getGlobalSets(@$setIDs); 677 my @sets; 678 for(my $i=0;$i<@setData;$i++) { 679 push(@sets,new WebworkSOAP::Classes::GlobalSet(@setData[$i])); 680 } 681 return \@sets; 682 } 683 684 =pod 685 =begin WSDL 686 _IN authenKey $string 687 _IN courseName $string 688 _IN setID $string 689 _RETURN $WebworkSOAP::Classes::GlobalSet 690 =end WSDL 691 =cut 692 sub get_global_set { 693 my ($self,$authenKey,$courseName,$setID) = @_; 694 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 695 my $setData = $soapEnv->{db}->getGlobalSet($setID); 696 if(not defined $setData) { 697 return -1; 698 } 699 my $set = new WebworkSOAP::Classes::GlobalSet($setData); 700 return ($set); 701 } 702 703 =pod 704 =begin WSDL 705 _IN authenKey $string 706 _IN courseName $string 707 _IN setID $string 708 _RETURN $string 709 =end WSDL 710 =cut 711 sub delete_global_set { 712 my ($self,$authenKey,$courseName,$setID) = @_; 713 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 714 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteGlobalSet($setID) ); 715 } 716 717 ################################################## 718 ##Global Problems 719 ################################################## 720 721 =pod 722 =begin WSDL 723 _IN authenKey $string 724 _IN courseName $string 725 _IN record $WebworkSOAP::Classes::GlobalProblem 726 _RETURN $string 727 =end WSDL 728 =cut 729 sub add_global_problem { 730 my ($self,$authenKey,$courseName,$record) = @_; 731 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 732 my $newGlobalProblem = $soapEnv->{db}->newGlobalProblem; 733 %$newGlobalProblem = %$record; 734 return SOAP::Data->type( 'string', $soapEnv->{db}->addGlobalProblem($newGlobalProblem) ); 735 } 736 737 =pod 738 =begin WSDL 739 _IN authenKey $string 740 _IN courseName $string 741 _IN record $WebworkSOAP::Classes::GlobalProblem 742 _RETURN $string 743 =end WSDL 744 =cut 745 sub put_global_problem { 746 my ($self,$authenKey,$courseName,$record) = @_; 747 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 748 return SOAP::Data->type( 'string', $soapEnv->{db}->putGlobalProblem($record) ); 749 } 750 751 =pod 752 =begin WSDL 753 _IN authenKey $string 754 _IN courseName $string 755 _IN setID $string 756 _RETURN @string of names objects. 757 =end WSDL 758 =cut 759 sub list_global_problems { 760 my ($self,$authenKey,$courseName,$setID) = @_; 761 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 762 my @tempArray = $soapEnv->{db}->listGlobalProblems($setID); 763 return array_to_soap_string( @tempArray ); 764 } 765 766 =pod 767 =begin WSDL 768 _IN authenKey $string 769 _IN courseName $string 770 _IN setID $string 771 _RETURN @WebworkSOAP::Classes::GlobalProblem Array of user objects 772 =end WSDL 773 =cut 774 sub get_all_global_problems { 775 my ($self,$authenKey,$courseName,$setID) = @_; 776 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 777 my @problemData = $soapEnv->{db}->getAllGlobalProblems($setID); 778 my @problems; 779 for(my $i=0;$i<@problemData;$i++) { 780 push(@problems,new WebworkSOAP::Classes::GlobalProblem(@problemData[$i])); 781 } 782 return \@problems; 783 } 784 785 =pod 786 =begin 787 _IN authenKey $string 788 _IN courseName $string 789 _IN problemIDs @string An array reference: [userID setID problemID] 790 _RETURN @WebworkSOAP::Classes::GlobalProblem Array of user objects 791 =end WSDL 792 =cut 793 sub get_global_problems { 794 my ($self,$authenKey,$courseName,$problemIDs) = @_; 795 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 796 my @problemData = $soapEnv->{db}->getGlobalProblems(@$problemIDs); 797 my @problems; 798 for(my $i=0;$i<@problemData;$i++) { 799 push(@problems,new WebworkSOAP::Classes::GlobalProblem(@problemData[$i])); #FIXME $problemData[$i]? 800 } 801 return \@problems; 802 } 803 804 =pod 805 =begin WSDL 806 _IN authenKey $string 807 _IN courseName $string 808 _IN setID $string 809 _IN problemID $string 810 _RETURN $WebworkSOAP::Classes::GlobalProblem of names objects. 811 =end WSDL 812 =cut 813 sub get_global_problem { 814 my ($self,$authenKey,$courseName,$setID,$problemID) = @_; 815 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 816 my $problemData = $soapEnv->{db}->getGlobalProblem($setID,$problemID); 817 if(not defined $problemData) { 818 return -1; 819 } 820 my $problem = new WebworkSOAP::Classes::GlobalProblem($problemData); 821 return ($problem); 822 } 823 824 =pod 825 =begin WSDL 826 _IN authenKey $string 827 _IN courseName $string 828 _IN setID $string 829 _IN problemID $string 830 _RETURN $string 831 =end WSDL 832 =cut 833 sub delete_global_problem { 834 my ($self,$authenKey,$courseName,$setID,$problemID) = @_; 835 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 836 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteGlobalProblem($setID,$problemID) ); 837 } 838 839 ################################################## 840 ##USER PROBLEM 841 ################################################## 842 843 =pod 844 =begin WSDL 845 _IN authenKey $string 846 _IN courseName $string 847 _IN record $WebworkSOAP::Classes::UserProblem 848 _RETURN $string 849 =end WSDL 850 =cut 851 sub add_user_problem { 852 my ($self,$authenKey,$courseName,$record) = @_; 853 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 854 my $newUserProblem = $soapEnv->{db}->newUserProblem; 855 %$newUserProblem = %$record; 856 return SOAP::Data->type( 'string', $soapEnv->{db}->addUserProblem($newUserProblem) ); 857 } 858 859 =pod 860 =begin WSDL 861 _IN authenKey $string 862 _IN courseName $string 863 _IN record $WebworkSOAP::Classes::UserProblem 864 _RETURN $string 865 =end WSDL 866 =cut 867 sub put_user_problem { 868 my ($self,$authenKey,$courseName,$record) = @_; 869 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 870 return SOAP::Data->type( 'string', $soapEnv->{db}->putUserProblem($record) ); 871 } 872 873 =pod 874 =begin WSDL 875 _IN authenKey $string 876 _IN courseName $string 877 _IN userID $string 878 _IN setID $string 879 _RETURN @string of names objects. 880 =end WSDL 881 =cut 882 sub list_user_problems { 883 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 884 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 885 my @tempArray = $soapEnv->{db}->listUserProblems($userID,$setID); 886 return array_to_soap_string( @tempArray ); 887 } 888 889 =pod 890 =begin WSDL 891 _IN authenKey $string 892 _IN courseName $string 893 _IN userID $string 894 _IN setID $string 895 _RETURN @WebworkSOAP::Classes::UserProblem of names objects. 896 =end WSDL 897 =cut 898 sub get_all_user_problems { 899 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 900 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 901 my @problemData = $soapEnv->{db}->getAllUserProblems($userID,$setID); 902 my @problems; 903 for(my $i=0;$i<@problemData;$i++) { 904 push(@problems,new WebworkSOAP::Classes::UserProblem(@problemData[$i])); 905 } 906 return \@problems; 907 } 908 909 =pod 910 =begin WSDL 911 _IN authenKey $string 912 _IN courseName $string 913 _IN userProblemIDs @string A 3 element array: { user_ID, setID, problemID } 914 _RETURN @WebworkSOAP::Classes::UserProblem of names objects. 915 =end WSDL 916 =cut 917 sub get_user_problems { 918 my ($self,$authenKey,$courseName,$userProblemIDs) = @_; 919 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 920 my @problemData = $soapEnv->{db}->getUserProblems(@$userProblemIDs); 921 my @problems; 922 for(my $i=0;$i<@problemData;$i++) { 923 push(@problems,new WebworkSOAP::Classes::UserProblem(@problemData[$i])); 924 } 925 return \@problems; 926 } 927 928 =pod 929 =begin WSDL 930 _IN authenKey $string 931 _IN courseName $string 932 _IN userID $string 933 _IN setID $string 934 _IN problemID $string 935 _RETURN $WebworkSOAP::Classes::UserProblem of names objects. 936 =end WSDL 937 =cut 938 sub get_user_problem { 939 my ($self,$authenKey,$courseName,$userID,$setID,$problemID) = @_; 940 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 941 my $problemData = $soapEnv->{db}->getUserProblem($userID,$setID,$problemID); 942 if(not defined $problemData) { 943 return -1; 944 } 945 my $problem = new WebworkSOAP::Classes::UserProblem($problemData); 946 return ($problem); 947 } 948 949 =pod 950 =begin WSDL 951 _IN authenKey $string 952 _IN courseName $string 953 _IN userID $string 954 _IN setID $string 955 _IN problemID $string 956 _RETURN $string 957 =end WSDL 958 =cut 959 sub delete_user_problem { 960 my ($self,$authenKey,$courseName,$userID,$setID,$problemID) = @_; 961 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 962 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteUserProblem($userID,$setID,$problemID) ); 963 } 964 965 ################################################## 966 ##USER SET 967 ################################################## 968 969 =pod 970 =begin WSDL 971 _IN authenKey $string 972 _IN courseName $string 973 _IN record $WebworkSOAP::Classes::UserSet 974 _RETURN $string 975 =end WSDL 976 =cut 977 sub add_user_set { 978 my ($self,$authenKey,$courseName,$record) = @_; 979 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 980 my $newUserSet = $soapEnv->{db}->newUserSet; 981 %$newUserSet = %$record; 982 return SOAP::Data->type( 'string', $soapEnv->{db}->addUserSet($newUserSet) ); 983 } 984 985 =pod 986 =begin WSDL 987 _IN authenKey $string 988 _IN courseName $string 989 _IN record $WebworkSOAP::Classes::UserSet 990 _RETURN $string 991 =end WSDL 992 =cut 993 sub put_user_set { 994 my ($self,$authenKey,$courseName,$record) = @_; 995 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 996 return SOAP::Data->type( 'string', $soapEnv->{db}->addUserSet($record) ); 997 } 998 999 =pod 1000 =begin WSDL 1001 _IN authenKey $string 1002 _IN courseName $string 1003 _IN userID $string 1004 _RETURN @string of names objects. 1005 =end WSDL 1006 =cut 1007 sub list_user_sets { 1008 my ($self,$authenKey,$courseName,$userID) = @_; 1009 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1010 my @tempArray = $soapEnv->{db}->listUserSets($userID); 1011 return array_to_soap_string( @tempArray ); 1012 } 1013 1014 =pod 1015 =begin WSDL 1016 _IN authenKey $string 1017 _IN courseName $string 1018 _RETURN @WebworkSOAP::Classes::UserSet of names objects. 1019 =end WSDL 1020 =cut 1021 sub get_all_user_sets { 1022 my ($self,$authenKey,$courseName) = @_; 1023 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1024 my @setData = $soapEnv->{db}->getAllUserSets(); 1025 my @sets; 1026 for(my $i=0;$i<@setData;$i++) { 1027 push(@sets,new WebworkSOAP::Classes::UserSet(@setData[$i])); 1028 } 1029 return \@sets; 1030 } 1031 1032 =pod 1033 =begin WSDL 1034 _IN authenKey $string 1035 _IN courseName $string 1036 _IN userSetIDs $string 1037 _RETURN @WebworkSOAP::Classes::UserSet of names objects. 1038 =end WSDL 1039 =cut 1040 sub get_user_sets { 1041 my ($self,$authenKey,$courseName,$userSetIDs) = @_; 1042 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1043 my @setData = $soapEnv->{db}->getUserSets(@$userSetIDs); 1044 my @sets; 1045 for(my $i=0;$i<@setData;$i++) { 1046 push(@sets,new WebworkSOAP::Classes::UserSet(@setData[$i])); 1047 } 1048 return \@sets; 1049 } 1050 1051 =pod 1052 =begin WSDL 1053 _IN authenKey $string 1054 _IN courseName $string 1055 _IN userID $string 1056 _IN setID $string 1057 _RETURN $WebworkSOAP::Classes::UserSet of names objects. 1058 =end WSDL 1059 =cut 1060 sub get_user_set { 1061 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 1062 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1063 my $setData = $soapEnv->{db}->getUserSet($userID,$setID); 1064 if(not defined $setData) { 1065 return -1; 1066 } 1067 my $set = new WebworkSOAP::Classes::UserSet($setData); 1068 return $set; 1069 } 1070 1071 =pod 1072 =begin WSDL 1073 _IN authenKey $string 1074 _IN courseName $string 1075 _IN userID $string 1076 _IN setID $string 1077 _RETURN $string 1078 =end WSDL 1079 =cut 1080 sub delete_user_set { 1081 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 1082 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1083 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteUserSet($userID,$setID) ); 1084 } 1085 1086 1087 ########################################### 1088 # grading utilties -- to be moved to Utils::Grades 1089 ############################################ 1090 1091 ############################################ 1092 # get_wwassignment_grade_for_one ($db $userID $setID); 1093 #input $userID, $setID (or a UserSet record)? 1094 #output set grade for a homework problem or maximum grade for a gateway problem with several set versions 1095 ############################################ 1096 sub get_wwassignment_grade_for_one_user{ 1097 my($db, $userID, $setID) = @_; 1098 my $user_set = $db->getMergedSet($userID,$setID); 1099 print LOG "user $userID set $setID user_set ".ref($user_set)."\n"; 1100 return " " unless ref($user_set); # return a blank grade if there is no user_set 1101 warn " user $userID $setID ".ref($user_set)."\n"; 1102 my $setIsVersioned = ( defined($user_set->assignment_type) && $user_set->assignment_type =~ /gateway/)?1:0; 1103 my @setVersions=(); 1104 if ( $setIsVersioned ) { 1105 my @vList = $db->listSetVersions($userID,$setID); 1106 # we have to have the merged set versions to 1107 # know what each of their assignment types 1108 # are (because proctoring can change) 1109 @setVersions = $db->getMergedSetVersions( map {[$userID, $setID, $_]} @vList ); 1110 1111 # add the set versions to our list of sets 1112 # foreach ( @setVersions ) { 1113 # $setsByID{$_->set_id . ",v" . $_->version_id} = $_; 1114 # } 1115 # # flag the existence of set versions for this set 1116 # $setVersionsByID{$setName} = [ @vList ]; 1117 # # and save the set names for display 1118 # push( @allSetIDs, $setName ); 1119 # push( @allSetIDs, map { "$setName,v$_" } @vList ); 1120 1121 } else { 1122 # push( @allSetIDs, $setName ); 1123 # $setVersionsByID{$setName} = "None"; 1124 } 1125 my $grade; 1126 if ($setIsVersioned) { 1127 if (@setVersions) { 1128 $grade =0; 1129 foreach my $setVersion (@setVersions) { # get highest grade among versions 1130 #print LOG "getting set $userID $setID version:".ref($setVersion)."\n"; 1131 my $current_grade = get_set_grade_for_UserSet($db, $setVersion); 1132 $grade = $current_grade if $current_grade > $grade; 1133 1134 } 1135 1136 } else { 1137 $grade = " "; 1138 } 1139 } else { # not versioned 1140 $grade = get_set_grade_for_UserSet($db, $user_set); 1141 } 1142 $grade; # return grade 1143 } 1144 1145 ############################################ 1146 # get_set_grade_for_UserSet ($db, $user_set); 1147 #input $userID, $setID (UserSet record); 1148 #output set grade for a homework problem or a single set version of a gateway quiz 1149 ############################################ 1150 1151 sub get_set_grade_for_UserSet{ 1152 my $db = shift; 1153 my $user_set = shift; 1154 warn "get_set_grade_for_UserSet(db, user_set); an argument is missing db: $db user_set $user_set" 1155 unless ref($db) =~ /DB/ and ref($user_set) =~/Set/; 1156 my $setIsVersioned = ( defined( $user_set->assignment_type() ) 1157 && $user_set->assignment_type() =~ /gateway/ )? 1:0; 1158 my @problemData=(); 1159 print LOG "get_set_grade_for_UserSet: getting set ".$user_set->set_id." "." for ".$user_set->user_id."\n"; 1160 if ($setIsVersioned) { 1161 @problemData = $db->getAllMergedProblemVersions( $user_set->user_id, $user_set->set_id, $user_set->version_id ) if $user_set->can('version_id'); 1162 } else { 1163 @problemData = $db->getAllMergedUserProblems($user_set->user_id, $user_set->set_id); 1164 } 1165 1166 my $grade = 0; 1167 for(my $i=0;$i<@problemData;$i++) { 1168 #print LOG "$userID problem Data",join(" ", %{$problemData[$i]}),"\n\n"; 1169 $grade += ($problemData[$i]->status)*($problemData[$i]->value); 1170 #print LOG "grade is $grade\n"; 1171 } 1172 return $grade; 1173 } 1174 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |