[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 6806 - (download) (as text) (annotate)
Thu Apr 28 20:20:41 2011 UTC (2 years ago) by aubreyja
File size: 33186 byte(s)
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