Parent Directory
|
Revision Log
Fixed argument of putPermissionLevel() be the right kind of thing.
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 my $newPermissionLevel = $soapEnv->{db}->newPermissionLevel; 358 %$newPermissionLevel = %$record; 359 return SOAP::Data->type( 'string', 360 $soapEnv->{db}->putPermissionLevel($newPermissionLevel) ); 361 } 362 363 =pod 364 =begin WSDL 365 _IN authenKey $string 366 _IN courseName $string 367 _RETURN @string 368 =end WSDL 369 =cut 370 sub list_permissions { 371 my ($self,$authenKey,$courseName) = @_; 372 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 373 my @tempArray = $soapEnv->{db}->listPermissionLevels; 374 return array_to_soap_string( @tempArray ); 375 } 376 377 =pod 378 =begin WSDL 379 _IN authenKey $string 380 _IN courseName $string 381 _IN userIDs @string 382 _RETURN @WebworkSOAP::Classes::Permission Array of user objects 383 =end WSDL 384 =cut 385 sub get_permissions { 386 my ($self,$authenKey,$courseName,$userIDs) = @_; 387 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 388 my @permissionData = $soapEnv->{db}->getPermissionLevels(@$userIDs); 389 my @permissions; 390 for(my $i=0;$i<@permissionData;$i++) { 391 push(@permissions,new WebworkSOAP::Classes::Permission(@permissionData[$i])); 392 } 393 return \@permissions; 394 } 395 396 =pod 397 =begin WSDL 398 _IN authenKey $string 399 _IN courseName $string 400 _IN userID $string 401 _RETURN $WebworkSOAP::Classes::Permission of names objects. 402 =end WSDL 403 =cut 404 sub get_permission { 405 my ($self,$authenKey,$courseName,$userID) = @_; 406 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 407 my $permissionData = $soapEnv->{db}->getPermissionLevel($userID); 408 if(not defined $permissionData) { 409 return -1; 410 } 411 my $permission = new WebworkSOAP::Classes::Permission($permissionData); 412 return ($permission); 413 } 414 415 ################################################## 416 ##Key 417 ################################################## 418 419 =pod 420 =begin WSDL 421 _IN authenKey $string 422 _IN courseName $string 423 _IN record $WebworkSOAP::Classes::Key 424 _RETURN $string 425 =end WSDL 426 =cut 427 sub add_key { 428 my ($self,$authenKey,$courseName,$record) = @_; 429 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 430 my $newKey = $soapEnv->{db}->newKey; 431 %$newKey = %$record; 432 return SOAP::Data->type( 'string', $soapEnv->{db}->addKey($newKey) ); 433 } 434 435 =pod 436 =begin WSDL 437 _IN authenKey $string 438 _IN courseName $string 439 _IN record $WebworkSOAP::Classes::Key 440 _RETURN $string 441 =end WSDL 442 =cut 443 sub put_key { 444 my ($self,$authenKey,$courseName,$record) = @_; 445 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 446 return SOAP::Data->type( 'string', $soapEnv->{db}->putKey($record) ); 447 } 448 449 =pod 450 =begin WSDL 451 _IN authenKey $string 452 _IN courseName $string 453 _RETURN @string 454 =end WSDL 455 =cut 456 sub list_keys { 457 my ($self,$authenKey,$courseName) = @_; 458 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 459 my @tempArray = $soapEnv->{db}->listKeys; 460 return array_to_soap_string( @tempArray ); 461 } 462 463 =pod 464 =begin WSDL 465 _IN authenKey $string 466 _IN courseName $string 467 _IN userIDs @string 468 _RETURN @WebworkSOAP::Classes::Key Array of user objects 469 =end WSDL 470 =cut 471 sub get_keys { 472 my ($self,$authenKey,$courseName,$userIDs) = @_; 473 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 474 my @keyData = $soapEnv->{db}->getKeys(@$userIDs); 475 my @keys; 476 for(my $i=0;$i<@keyData;$i++) { 477 push(@keys,new WebworkSOAP::Classes::Key(@keyData[$i])); 478 } 479 return \@keys; 480 } 481 482 =pod 483 =begin WSDL 484 _IN authenKey $string 485 _IN courseName $string 486 _IN userID $string 487 _RETURN $WebworkSOAP::Classes::Key of names objects. 488 =end WSDL 489 =cut 490 sub get_key { 491 my ($self,$authenKey,$courseName,$userID) = @_; 492 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 493 my $keyData = $soapEnv->{db}->getKey($userID); 494 if(not defined $keyData) { 495 return -1; 496 } 497 my $key = new WebworkSOAP::Classes::Key($keyData); 498 return ($key); 499 } 500 501 ################################################## 502 ##User 503 ################################################## 504 505 =pod 506 =begin WSDL 507 _IN authenKey $string 508 _IN courseName $string 509 _IN record $WebworkSOAP::Classes::User 510 _RETURN $string 511 =end WSDL 512 =cut 513 sub add_user { 514 my ($self,$authenKey,$courseName,$record) = @_; 515 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 516 my $newUser = $soapEnv->{db}->newUser; 517 %$newUser = %$record; 518 return SOAP::Data->type( 'string', $soapEnv->{db}->addUser($newUser) ); 519 } 520 521 =pod 522 =begin WSDL 523 _IN authenKey $string 524 _IN courseName $string 525 _IN record $WebworkSOAP::Classes::User 526 _RETURN $string 527 =end WSDL 528 =cut 529 sub put_user { 530 my ($self,$authenKey,$courseName,$record) = @_; 531 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 532 return SOAP::Data->type( 'string', $soapEnv->{db}->putUser($record) ); 533 } 534 535 =pod 536 =begin WSDL 537 _IN authenKey $string 538 _IN courseName $string 539 _RETURN @string of names objects. 540 =end WSDL 541 =cut 542 sub list_users { 543 my ($self,$authenKey,$courseName) = @_; 544 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 545 my @tempArray = $soapEnv->{db}->listUsers; 546 return array_to_soap_string( @tempArray ); 547 } 548 549 =pod 550 =begin WSDL 551 _IN authenKey $string 552 _IN courseName $string 553 _IN userID $string 554 _RETURN $WebworkSOAP::Classes::User of names objects. 555 =end WSDL 556 =cut 557 sub get_user { 558 my ($self,$authenKey,$courseName,$userID) = @_; 559 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 560 my $userData = $soapEnv->{db}->getUser($userID); 561 if(not defined $userData) { 562 return -1; 563 } 564 my $user = new WebworkSOAP::Classes::User($userData); 565 return ($user); 566 } 567 568 =pod 569 =begin WSDL 570 _IN authenKey $string 571 _IN courseName $string 572 _IN userIDs @string 573 _RETURN @WebworkSOAP::Classes::User Array of user objects 574 =end WSDL 575 =cut 576 sub get_users { 577 my ($self,$authenKey,$courseName,$userIDs) = @_; 578 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 579 my @userData = $soapEnv->{db}->getUsers(@$userIDs); 580 my @users; 581 for(my $i=0;$i<@userData;$i++) { 582 push(@users,new WebworkSOAP::Classes::User(@userData[$i])); 583 } 584 return \@users; 585 } 586 587 =pod 588 =begin WSDL 589 _IN authenKey $string 590 _IN courseName $string 591 _IN userID $string 592 _RETURN $string 593 =end WSDL 594 =cut 595 sub delete_user { 596 my ($self,$authenKey,$courseName,$userID) = @_; 597 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 598 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteUser($userID) ); 599 } 600 601 ################################################## 602 ##Global Sets 603 ################################################## 604 605 =pod 606 =begin WSDL 607 _IN authenKey $string 608 _IN courseName $string 609 _IN record $WebworkSOAP::Classes::GlobalSet 610 _RETURN $string 611 =end WSDL 612 =cut 613 sub add_global_set { 614 my ($self,$authenKey,$courseName,$record) = @_; 615 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 616 my $newGlobalSet = $soapEnv->{db}->newGlobalSet; 617 %$newGlobalSet = %$record; 618 return SOAP::Data->type( 'string', $soapEnv->{db}->addGlobalSet($newGlobalSet) ); 619 } 620 621 =pod 622 =begin WSDL 623 _IN authenKey $string 624 _IN courseName $string 625 _IN record $WebworkSOAP::Classes::GlobalSet 626 _RETURN $string 627 =end WSDL 628 =cut 629 sub put_global_set { 630 my ($self,$authenKey,$courseName,$record) = @_; 631 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 632 return SOAP::Data->type( 'string', $soapEnv->{db}->putGlobalSet($record) ); 633 } 634 635 =pod 636 =begin WSDL 637 _IN authenKey $string 638 _IN courseName $string 639 _RETURN @string of names objects. 640 =end WSDL 641 =cut 642 sub list_global_sets { 643 my ($self,$authenKey,$courseName) = @_; 644 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 645 my @tempArray = $soapEnv->{db}->listGlobalSets; 646 return array_to_soap_string( @tempArray ); 647 } 648 649 =pod 650 =begin WSDL 651 _IN authenKey $string 652 _IN courseName $string 653 _RETURN @WebworkSOAP::Classes::GlobalSet Array of user objects 654 =end WSDL 655 =cut 656 sub get_all_global_sets { 657 my ($self,$authenKey,$courseName) = @_; 658 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 659 my @tempArray = $soapEnv->{db}->listGlobalSets; 660 my @setData = $soapEnv->{db}->getGlobalSets(@tempArray); 661 my @sets; 662 for(my $i=0;$i<@setData;$i++) { 663 push(@sets,new WebworkSOAP::Classes::GlobalSet(@setData[$i])); 664 } 665 return \@sets; 666 } 667 668 =pod 669 =begin WSDL 670 _IN authenKey $string 671 _IN courseName $string 672 _IN setIDs @string 673 _RETURN @WebworkSOAP::Classes::GlobalSet Array of user objects 674 =end WSDL 675 =cut 676 sub get_global_sets { 677 my ($self,$authenKey,$courseName,$setIDs) = @_; 678 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 679 my @setData = $soapEnv->{db}->getGlobalSets(@$setIDs); 680 my @sets; 681 for(my $i=0;$i<@setData;$i++) { 682 push(@sets,new WebworkSOAP::Classes::GlobalSet(@setData[$i])); 683 } 684 return \@sets; 685 } 686 687 =pod 688 =begin WSDL 689 _IN authenKey $string 690 _IN courseName $string 691 _IN setID $string 692 _RETURN $WebworkSOAP::Classes::GlobalSet 693 =end WSDL 694 =cut 695 sub get_global_set { 696 my ($self,$authenKey,$courseName,$setID) = @_; 697 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 698 my $setData = $soapEnv->{db}->getGlobalSet($setID); 699 if(not defined $setData) { 700 return -1; 701 } 702 my $set = new WebworkSOAP::Classes::GlobalSet($setData); 703 return ($set); 704 } 705 706 =pod 707 =begin WSDL 708 _IN authenKey $string 709 _IN courseName $string 710 _IN setID $string 711 _RETURN $string 712 =end WSDL 713 =cut 714 sub delete_global_set { 715 my ($self,$authenKey,$courseName,$setID) = @_; 716 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 717 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteGlobalSet($setID) ); 718 } 719 720 ################################################## 721 ##Global Problems 722 ################################################## 723 724 =pod 725 =begin WSDL 726 _IN authenKey $string 727 _IN courseName $string 728 _IN record $WebworkSOAP::Classes::GlobalProblem 729 _RETURN $string 730 =end WSDL 731 =cut 732 sub add_global_problem { 733 my ($self,$authenKey,$courseName,$record) = @_; 734 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 735 my $newGlobalProblem = $soapEnv->{db}->newGlobalProblem; 736 %$newGlobalProblem = %$record; 737 return SOAP::Data->type( 'string', $soapEnv->{db}->addGlobalProblem($newGlobalProblem) ); 738 } 739 740 =pod 741 =begin WSDL 742 _IN authenKey $string 743 _IN courseName $string 744 _IN record $WebworkSOAP::Classes::GlobalProblem 745 _RETURN $string 746 =end WSDL 747 =cut 748 sub put_global_problem { 749 my ($self,$authenKey,$courseName,$record) = @_; 750 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 751 return SOAP::Data->type( 'string', $soapEnv->{db}->putGlobalProblem($record) ); 752 } 753 754 =pod 755 =begin WSDL 756 _IN authenKey $string 757 _IN courseName $string 758 _IN setID $string 759 _RETURN @string of names objects. 760 =end WSDL 761 =cut 762 sub list_global_problems { 763 my ($self,$authenKey,$courseName,$setID) = @_; 764 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 765 my @tempArray = $soapEnv->{db}->listGlobalProblems($setID); 766 return array_to_soap_string( @tempArray ); 767 } 768 769 =pod 770 =begin WSDL 771 _IN authenKey $string 772 _IN courseName $string 773 _IN setID $string 774 _RETURN @WebworkSOAP::Classes::GlobalProblem Array of user objects 775 =end WSDL 776 =cut 777 sub get_all_global_problems { 778 my ($self,$authenKey,$courseName,$setID) = @_; 779 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 780 my @problemData = $soapEnv->{db}->getAllGlobalProblems($setID); 781 my @problems; 782 for(my $i=0;$i<@problemData;$i++) { 783 push(@problems,new WebworkSOAP::Classes::GlobalProblem(@problemData[$i])); 784 } 785 return \@problems; 786 } 787 788 =pod 789 =begin 790 _IN authenKey $string 791 _IN courseName $string 792 _IN problemIDs @string An array reference: [userID setID problemID] 793 _RETURN @WebworkSOAP::Classes::GlobalProblem Array of user objects 794 =end WSDL 795 =cut 796 sub get_global_problems { 797 my ($self,$authenKey,$courseName,$problemIDs) = @_; 798 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 799 my @problemData = $soapEnv->{db}->getGlobalProblems(@$problemIDs); 800 my @problems; 801 for(my $i=0;$i<@problemData;$i++) { 802 push(@problems,new WebworkSOAP::Classes::GlobalProblem(@problemData[$i])); #FIXME $problemData[$i]? 803 } 804 return \@problems; 805 } 806 807 =pod 808 =begin WSDL 809 _IN authenKey $string 810 _IN courseName $string 811 _IN setID $string 812 _IN problemID $string 813 _RETURN $WebworkSOAP::Classes::GlobalProblem of names objects. 814 =end WSDL 815 =cut 816 sub get_global_problem { 817 my ($self,$authenKey,$courseName,$setID,$problemID) = @_; 818 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 819 my $problemData = $soapEnv->{db}->getGlobalProblem($setID,$problemID); 820 if(not defined $problemData) { 821 return -1; 822 } 823 my $problem = new WebworkSOAP::Classes::GlobalProblem($problemData); 824 return ($problem); 825 } 826 827 =pod 828 =begin WSDL 829 _IN authenKey $string 830 _IN courseName $string 831 _IN setID $string 832 _IN problemID $string 833 _RETURN $string 834 =end WSDL 835 =cut 836 sub delete_global_problem { 837 my ($self,$authenKey,$courseName,$setID,$problemID) = @_; 838 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 839 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteGlobalProblem($setID,$problemID) ); 840 } 841 842 ################################################## 843 ##USER PROBLEM 844 ################################################## 845 846 =pod 847 =begin WSDL 848 _IN authenKey $string 849 _IN courseName $string 850 _IN record $WebworkSOAP::Classes::UserProblem 851 _RETURN $string 852 =end WSDL 853 =cut 854 sub add_user_problem { 855 my ($self,$authenKey,$courseName,$record) = @_; 856 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 857 my $newUserProblem = $soapEnv->{db}->newUserProblem; 858 %$newUserProblem = %$record; 859 return SOAP::Data->type( 'string', $soapEnv->{db}->addUserProblem($newUserProblem) ); 860 } 861 862 =pod 863 =begin WSDL 864 _IN authenKey $string 865 _IN courseName $string 866 _IN record $WebworkSOAP::Classes::UserProblem 867 _RETURN $string 868 =end WSDL 869 =cut 870 sub put_user_problem { 871 my ($self,$authenKey,$courseName,$record) = @_; 872 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 873 return SOAP::Data->type( 'string', $soapEnv->{db}->putUserProblem($record) ); 874 } 875 876 =pod 877 =begin WSDL 878 _IN authenKey $string 879 _IN courseName $string 880 _IN userID $string 881 _IN setID $string 882 _RETURN @string of names objects. 883 =end WSDL 884 =cut 885 sub list_user_problems { 886 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 887 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 888 my @tempArray = $soapEnv->{db}->listUserProblems($userID,$setID); 889 return array_to_soap_string( @tempArray ); 890 } 891 892 =pod 893 =begin WSDL 894 _IN authenKey $string 895 _IN courseName $string 896 _IN userID $string 897 _IN setID $string 898 _RETURN @WebworkSOAP::Classes::UserProblem of names objects. 899 =end WSDL 900 =cut 901 sub get_all_user_problems { 902 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 903 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 904 my @problemData = $soapEnv->{db}->getAllUserProblems($userID,$setID); 905 my @problems; 906 for(my $i=0;$i<@problemData;$i++) { 907 push(@problems,new WebworkSOAP::Classes::UserProblem(@problemData[$i])); 908 } 909 return \@problems; 910 } 911 912 =pod 913 =begin WSDL 914 _IN authenKey $string 915 _IN courseName $string 916 _IN userProblemIDs @string A 3 element array: { user_ID, setID, problemID } 917 _RETURN @WebworkSOAP::Classes::UserProblem of names objects. 918 =end WSDL 919 =cut 920 sub get_user_problems { 921 my ($self,$authenKey,$courseName,$userProblemIDs) = @_; 922 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 923 my @problemData = $soapEnv->{db}->getUserProblems(@$userProblemIDs); 924 my @problems; 925 for(my $i=0;$i<@problemData;$i++) { 926 push(@problems,new WebworkSOAP::Classes::UserProblem(@problemData[$i])); 927 } 928 return \@problems; 929 } 930 931 =pod 932 =begin WSDL 933 _IN authenKey $string 934 _IN courseName $string 935 _IN userID $string 936 _IN setID $string 937 _IN problemID $string 938 _RETURN $WebworkSOAP::Classes::UserProblem of names objects. 939 =end WSDL 940 =cut 941 sub get_user_problem { 942 my ($self,$authenKey,$courseName,$userID,$setID,$problemID) = @_; 943 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 944 my $problemData = $soapEnv->{db}->getUserProblem($userID,$setID,$problemID); 945 if(not defined $problemData) { 946 return -1; 947 } 948 my $problem = new WebworkSOAP::Classes::UserProblem($problemData); 949 return ($problem); 950 } 951 952 =pod 953 =begin WSDL 954 _IN authenKey $string 955 _IN courseName $string 956 _IN userID $string 957 _IN setID $string 958 _IN problemID $string 959 _RETURN $string 960 =end WSDL 961 =cut 962 sub delete_user_problem { 963 my ($self,$authenKey,$courseName,$userID,$setID,$problemID) = @_; 964 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 965 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteUserProblem($userID,$setID,$problemID) ); 966 } 967 968 ################################################## 969 ##USER SET 970 ################################################## 971 972 =pod 973 =begin WSDL 974 _IN authenKey $string 975 _IN courseName $string 976 _IN record $WebworkSOAP::Classes::UserSet 977 _RETURN $string 978 =end WSDL 979 =cut 980 sub add_user_set { 981 my ($self,$authenKey,$courseName,$record) = @_; 982 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 983 my $newUserSet = $soapEnv->{db}->newUserSet; 984 %$newUserSet = %$record; 985 return SOAP::Data->type( 'string', $soapEnv->{db}->addUserSet($newUserSet) ); 986 } 987 988 =pod 989 =begin WSDL 990 _IN authenKey $string 991 _IN courseName $string 992 _IN record $WebworkSOAP::Classes::UserSet 993 _RETURN $string 994 =end WSDL 995 =cut 996 sub put_user_set { 997 my ($self,$authenKey,$courseName,$record) = @_; 998 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 999 return SOAP::Data->type( 'string', $soapEnv->{db}->addUserSet($record) ); 1000 } 1001 1002 =pod 1003 =begin WSDL 1004 _IN authenKey $string 1005 _IN courseName $string 1006 _IN userID $string 1007 _RETURN @string of names objects. 1008 =end WSDL 1009 =cut 1010 sub list_user_sets { 1011 my ($self,$authenKey,$courseName,$userID) = @_; 1012 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1013 my @tempArray = $soapEnv->{db}->listUserSets($userID); 1014 return array_to_soap_string( @tempArray ); 1015 } 1016 1017 =pod 1018 =begin WSDL 1019 _IN authenKey $string 1020 _IN courseName $string 1021 _RETURN @WebworkSOAP::Classes::UserSet of names objects. 1022 =end WSDL 1023 =cut 1024 sub get_all_user_sets { 1025 my ($self,$authenKey,$courseName) = @_; 1026 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1027 my @setData = $soapEnv->{db}->getAllUserSets(); 1028 my @sets; 1029 for(my $i=0;$i<@setData;$i++) { 1030 push(@sets,new WebworkSOAP::Classes::UserSet(@setData[$i])); 1031 } 1032 return \@sets; 1033 } 1034 1035 =pod 1036 =begin WSDL 1037 _IN authenKey $string 1038 _IN courseName $string 1039 _IN userSetIDs $string 1040 _RETURN @WebworkSOAP::Classes::UserSet of names objects. 1041 =end WSDL 1042 =cut 1043 sub get_user_sets { 1044 my ($self,$authenKey,$courseName,$userSetIDs) = @_; 1045 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1046 my @setData = $soapEnv->{db}->getUserSets(@$userSetIDs); 1047 my @sets; 1048 for(my $i=0;$i<@setData;$i++) { 1049 push(@sets,new WebworkSOAP::Classes::UserSet(@setData[$i])); 1050 } 1051 return \@sets; 1052 } 1053 1054 =pod 1055 =begin WSDL 1056 _IN authenKey $string 1057 _IN courseName $string 1058 _IN userID $string 1059 _IN setID $string 1060 _RETURN $WebworkSOAP::Classes::UserSet of names objects. 1061 =end WSDL 1062 =cut 1063 sub get_user_set { 1064 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 1065 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1066 my $setData = $soapEnv->{db}->getUserSet($userID,$setID); 1067 if(not defined $setData) { 1068 return -1; 1069 } 1070 my $set = new WebworkSOAP::Classes::UserSet($setData); 1071 return $set; 1072 } 1073 1074 =pod 1075 =begin WSDL 1076 _IN authenKey $string 1077 _IN courseName $string 1078 _IN userID $string 1079 _IN setID $string 1080 _RETURN $string 1081 =end WSDL 1082 =cut 1083 sub delete_user_set { 1084 my ($self,$authenKey,$courseName,$userID,$setID) = @_; 1085 my $soapEnv = new WebworkSOAP($authenKey,$courseName); 1086 return SOAP::Data->type( 'string', $soapEnv->{db}->deleteUserSet($userID,$setID) ); 1087 } 1088 1089 1090 ########################################### 1091 # grading utilties -- to be moved to Utils::Grades 1092 ############################################ 1093 1094 ############################################ 1095 # get_wwassignment_grade_for_one ($db $userID $setID); 1096 #input $userID, $setID (or a UserSet record)? 1097 #output set grade for a homework problem or maximum grade for a gateway problem with several set versions 1098 ############################################ 1099 sub get_wwassignment_grade_for_one_user{ 1100 my($db, $userID, $setID) = @_; 1101 my $user_set = $db->getMergedSet($userID,$setID); 1102 print LOG "user $userID set $setID user_set ".ref($user_set)."\n"; 1103 return " " unless ref($user_set); # return a blank grade if there is no user_set 1104 warn " user $userID $setID ".ref($user_set)."\n"; 1105 my $setIsVersioned = ( defined($user_set->assignment_type) && $user_set->assignment_type =~ /gateway/)?1:0; 1106 my @setVersions=(); 1107 if ( $setIsVersioned ) { 1108 my @vList = $db->listSetVersions($userID,$setID); 1109 # we have to have the merged set versions to 1110 # know what each of their assignment types 1111 # are (because proctoring can change) 1112 @setVersions = $db->getMergedSetVersions( map {[$userID, $setID, $_]} @vList ); 1113 1114 # add the set versions to our list of sets 1115 # foreach ( @setVersions ) { 1116 # $setsByID{$_->set_id . ",v" . $_->version_id} = $_; 1117 # } 1118 # # flag the existence of set versions for this set 1119 # $setVersionsByID{$setName} = [ @vList ]; 1120 # # and save the set names for display 1121 # push( @allSetIDs, $setName ); 1122 # push( @allSetIDs, map { "$setName,v$_" } @vList ); 1123 1124 } else { 1125 # push( @allSetIDs, $setName ); 1126 # $setVersionsByID{$setName} = "None"; 1127 } 1128 my $grade; 1129 if ($setIsVersioned) { 1130 if (@setVersions) { 1131 $grade =0; 1132 foreach my $setVersion (@setVersions) { # get highest grade among versions 1133 #print LOG "getting set $userID $setID version:".ref($setVersion)."\n"; 1134 my $current_grade = get_set_grade_for_UserSet($db, $setVersion); 1135 $grade = $current_grade if $current_grade > $grade; 1136 1137 } 1138 1139 } else { 1140 $grade = " "; 1141 } 1142 } else { # not versioned 1143 $grade = get_set_grade_for_UserSet($db, $user_set); 1144 } 1145 $grade; # return grade 1146 } 1147 1148 ############################################ 1149 # get_set_grade_for_UserSet ($db, $user_set); 1150 #input $userID, $setID (UserSet record); 1151 #output set grade for a homework problem or a single set version of a gateway quiz 1152 ############################################ 1153 1154 sub get_set_grade_for_UserSet{ 1155 my $db = shift; 1156 my $user_set = shift; 1157 warn "get_set_grade_for_UserSet(db, user_set); an argument is missing db: $db user_set $user_set" 1158 unless ref($db) =~ /DB/ and ref($user_set) =~/Set/; 1159 my $setIsVersioned = ( defined( $user_set->assignment_type() ) 1160 && $user_set->assignment_type() =~ /gateway/ )? 1:0; 1161 my @problemData=(); 1162 print LOG "get_set_grade_for_UserSet: getting set ".$user_set->set_id." "." for ".$user_set->user_id."\n"; 1163 if ($setIsVersioned) { 1164 @problemData = $db->getAllMergedProblemVersions( $user_set->user_id, $user_set->set_id, $user_set->version_id ) if $user_set->can('version_id'); 1165 } else { 1166 @problemData = $db->getAllMergedUserProblems($user_set->user_id, $user_set->set_id); 1167 } 1168 1169 my $grade = 0; 1170 for(my $i=0;$i<@problemData;$i++) { 1171 #print LOG "$userID problem Data",join(" ", %{$problemData[$i]}),"\n\n"; 1172 $grade += ($problemData[$i]->status)*($problemData[$i]->value); 1173 #print LOG "grade is $grade\n"; 1174 } 1175 return $grade; 1176 } 1177 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |