Parent Directory
|
Revision Log
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 |