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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1015 - (download) (as text) (annotate)
Wed Jun 4 20:19:27 2003 UTC (9 years, 11 months ago) by malsyned
File size: 6530 byte(s)
The UserList module now has a single button, "Assign to all users", that
does what it says it does.  This should allow people to create new
problems and problem sets and edit them without ever needing the old
system, assuming that they are importing an existing course into
webwork2.
-Dennis

    1 ################################################################################
    2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
    3 # $Id$
    4 ################################################################################
    5 
    6 package WeBWorK;
    7 
    8 =head1 NAME
    9 
   10 WeBWorK - Dispatch requests to the appropriate ContentGenerator.
   11 
   12 =cut
   13 
   14 use strict;
   15 use warnings;
   16 use Apache::Constants qw(:common REDIRECT);
   17 use Apache::Request;
   18 use WeBWorK::Authen;
   19 use WeBWorK::Authz;
   20 use WeBWorK::ContentGenerator::Feedback;
   21 use WeBWorK::ContentGenerator::Hardcopy;
   22 use WeBWorK::ContentGenerator::Instructor::Index;
   23 use WeBWorK::ContentGenerator::Instructor::PGProblemEditor;
   24 use WeBWorK::ContentGenerator::Instructor::ProblemSetEditor;
   25 use WeBWorK::ContentGenerator::Instructor::ProblemSetList;
   26 use WeBWorK::ContentGenerator::Instructor::UserList;
   27 use WeBWorK::ContentGenerator::Instructor::ProblemList;
   28 use WeBWorK::ContentGenerator::Instructor::UserList;
   29 use WeBWorK::ContentGenerator::Login;
   30 use WeBWorK::ContentGenerator::Logout;
   31 use WeBWorK::ContentGenerator::Options;
   32 use WeBWorK::ContentGenerator::Problem;
   33 use WeBWorK::ContentGenerator::ProblemSet;
   34 use WeBWorK::ContentGenerator::ProblemSets;
   35 use WeBWorK::ContentGenerator::Test;
   36 use WeBWorK::CourseEnvironment;
   37 use WeBWorK::DB;
   38 
   39 sub dispatch($) {
   40   my ($apache) = @_;
   41   my $r = Apache::Request->new($apache);
   42     # have to deal with unpredictable GET or POST data, and sift
   43     # through it for the key. So use Apache::Request
   44 
   45   # This stuff is pretty much copied out of the O'Reilly mod_perl book.
   46   # It's for figuring out the basepath. I may change this up if I find a
   47   # better way to do it.
   48   my $path_info = $r->path_info || "";
   49   my $current_uri = $r->uri;
   50   my $args = $r->args;
   51 
   52   $current_uri =~ m/^(.*)$path_info/;
   53   my $urlRoot = $1;
   54 
   55   # If it's a valid WeBWorK URI, it ends in a /.  This is assumed
   56   # alllll over the place.
   57   unless (substr($current_uri,-1) eq '/') {
   58     $r->header_out(Location => "$current_uri/" . ($args ? "?$args" : ""));
   59     return REDIRECT;
   60     # *** any post data gets lost here -- fix that.
   61   }
   62 
   63   # Create the @components array, which contains the path specified in the URL
   64   my($junk, @components) = split "/", $path_info;
   65   my $webwork_root = $r->dir_config('webwork_root'); # From a PerlSetVar in httpd.conf
   66   my $course = shift @components;
   67 
   68   # Try to get the course environment.
   69   my $ce = eval {WeBWorK::CourseEnvironment->new($webwork_root, $urlRoot, $course);};
   70   if ($@) { # If there was an error getting the requested course
   71     # TODO: display an error page.  For now, 404 it.
   72     warn $@;
   73     return DECLINED;
   74   }
   75 
   76   # If no course was specified, redirect to the home URL
   77   unless (defined $course) {
   78     $r->header_out(Location => $ce->{webworkURLs}->{home});
   79     return REDIRECT;
   80   }
   81 
   82   # Freak out if the requested course doesn't exist.  For now, this is just a
   83   # check to see if the course directory exists.
   84   if (!-e $ce->{webworkDirs}->{courses} . "/$course") {
   85     warn "Course directory for $course not found at "
   86       . $ce->{webworkDirs}->{courses} . "/$course" ."\n";
   87     return DECLINED;
   88   }
   89 
   90   # Bring up a connection to the database (for Authen/Authz, and eventually
   91   # to be passed to content generators, when we clean this file up).
   92   my $db = WeBWorK::DB->new($ce);
   93 
   94   ### Begin dispatching ###
   95 
   96   # WeBWorK::Authen::verify erases the passwd field and sets the key field
   97   # if login is successful.
   98   if (!WeBWorK::Authen->new($r, $ce, $db)->verify) {
   99     return WeBWorK::ContentGenerator::Login->new($r, $ce, $db)->go;
  100   } else {
  101     # After we are authenticated, there are some things that need to be
  102     # sorted out, Authorization-wize, before we start dispatching to individual
  103     # content generators.
  104     my $user = $r->param("user");
  105     my $effectiveUser = $r->param("effectiveUser") || $user;
  106     my $su_authorized = WeBWorK::Authz->new($r, $ce, $db)->hasPermissions($user, "become_student", $effectiveUser);
  107     $effectiveUser = $user unless $su_authorized;
  108     $r->param("effectiveUser", $effectiveUser);
  109 
  110     my $arg = shift @components;
  111     if (!defined $arg) { # We want the list of problem sets
  112       return WeBWorK::ContentGenerator::ProblemSets->new($r, $ce, $db)->go;
  113     } elsif ($arg eq "hardcopy") {
  114       my $hardcopyArgument = shift @components;
  115       $hardcopyArgument = "" unless defined $hardcopyArgument;
  116       return WeBWorK::ContentGenerator::Hardcopy->new($r, $ce, $db)->go($hardcopyArgument);
  117     } elsif ($arg eq "instructor") {
  118       my $instructorArgument = shift @components;
  119       if (!defined $instructorArgument) {
  120         return WeBWorK::ContentGenerator::Instructor::Index->new($r, $ce, $db)->go;
  121       } elsif ($instructorArgument eq "users") {
  122         return WeBWorK::ContentGenerator::Instructor::UserList->new($r, $ce, $db)->go;
  123       } elsif ($instructorArgument eq "sets") {
  124         my $setID = shift @components;
  125         if (defined $setID) {
  126           my $setArg = shift @components;
  127           if (!defined $setArg) {
  128             return WeBWorK::ContentGenerator::Instructor::ProblemSetEditor->new($r, $ce, $db)->go($setID);
  129           } elsif ($setArg eq "problems") {
  130             return WeBWorK::ContentGenerator::Instructor::ProblemList->new($r, $ce, $db)->go($setID);
  131           } elsif ($setArg eq "users") {
  132             return WeBWorK::ContentGenerator::Instructor::UserList->new($r, $ce, $db)->go($setID);
  133           }
  134         } else {
  135           return WeBWorK::ContentGenerator::Instructor::ProblemSetList->new($r, $ce, $db)->go;
  136         }
  137       } elsif ($instructorArgument eq "pgProblemEditor") {
  138         return WeBWorK::ContentGenerator::Instructor::PGProblemEditor->new($r, $ce, $db)->go(@components);
  139       }
  140     } elsif ($arg eq "options") {
  141       return WeBWorK::ContentGenerator::Options->new($r, $ce, $db)->go;
  142     } elsif ($arg eq "feedback") {
  143       return WeBWorK::ContentGenerator::Feedback->new($r, $ce, $db)->go;
  144     } elsif ($arg eq "logout") {
  145       return WeBWorK::ContentGenerator::Logout->new($r, $ce, $db)->go;
  146     } elsif ($arg eq "test") {
  147       return WeBWorK::ContentGenerator::Test->new($r, $ce, $db)->go;
  148     } else { # We've got the name of a problem set.
  149       my $problem_set = $arg;
  150       my $ps_arg = shift @components;
  151 
  152       if (!defined $ps_arg) {
  153         # list the problems in the problem set
  154         return WeBWorK::ContentGenerator::ProblemSet->new($r, $ce, $db)->go($problem_set);
  155       } else {
  156         # We've got the name of a problem
  157         my $problem = $ps_arg;
  158         return WeBWorK::ContentGenerator::Problem->new($r, $ce, $db)->go($problem_set, $problem);
  159       }
  160     }
  161 
  162   }
  163 
  164   # If the dispatcher doesn't know any modules that want to handle
  165   # the current path, it'll claim that the path does not exist by
  166   # declining the request.
  167   return DECLINED;
  168 }
  169 
  170 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9