[system] / trunk / webwork2 / lib / WebworkSOAP.pm Repository:
ViewVC logotype

View of /trunk/webwork2/lib/WebworkSOAP.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6635 - (download) (as text) (annotate)
Sun Dec 12 19:04:10 2010 UTC (2 years, 5 months ago) by gage
File size: 33064 byte(s)
change calls to use Safe.pm  to use WWSafe.pm

closed security hole in ProblemSetDetail.pm

other small improvements brought in from gage_dev



    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