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

View of /trunk/webwork2/lib/WeBWorK/ContentGenerator/Instructor/Index.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1581 - (download) (as text) (annotate)
Sun Oct 12 17:44:32 2003 UTC (9 years, 7 months ago) by gage
File size: 18510 byte(s)
Added button to link to scoring of sets.

Removed some debugging warning messages.

--Mike

    1 ################################################################################
    2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
    3 # $Id$
    4 ################################################################################
    5 
    6 package WeBWorK::ContentGenerator::Instructor::Index;
    7 use base qw(WeBWorK::ContentGenerator::Instructor);
    8 
    9 =head1 NAME
   10 
   11 WeBWorK::ContentGenerator::Instructor::Index - Menu interface to the Instructor pages
   12 
   13 =cut
   14 
   15 use strict;
   16 use warnings;
   17 use Apache::Constants qw(:common REDIRECT DONE);
   18 use CGI qw();
   19 sub pre_header_initialize {
   20   my ($self, $setName, $problemNumber) = @_;
   21   my $r                    = $self->{r};
   22   my $ce                   = $self->{ce};
   23   my $db                   = $self->{db};
   24   my $authz                = $self->{authz};
   25   my $userName             = $r->param('user');
   26   my $effectiveUserName    = $r->param('effectiveUser');
   27   my $key                  = $r->param('key');
   28   my $user                 = $db->getUser($userName);
   29   my $effectiveUser        = $db->getUser($effectiveUserName);
   30   my $permissionLevel      = $db->getPermissionLevel($userName)->permission();
   31   unless ($authz->hasPermissions($userName, "modify_student_data")) {
   32     $self->{submitError} = "You are not authorized to modify student data";
   33     return;
   34   }
   35   my @submit_actions = qw(student-dates act-as-student edit-set-dates reset-password assign-passwords
   36                           set-stats drop-students edit-students-sets edit-sets student-stats edit-class-data
   37                           add-students send-email score-sets);
   38   foreach my $act (@submit_actions) {
   39     $self->{current_action } .=  "The action <$act> "". $r->param($act) . "" was requested"
   40     if defined($r->param($act));
   41   }
   42   $self->{selected_sets}   = "Set(s) chosen: "      . join(" ", $r->param("setList"));
   43   $self->{selected_users}  = "Student(s) chosen: "  .join(" ", $r->param("classList")) ;
   44 #   Redirect actions
   45     defined($r->param('student-dates')) && do {
   46     #FIXME  will only do one student and one set at a time
   47     # it would be good to be able to do many sets for many student
   48     # this would require a separate module
   49       my $root            = $ce->{webworkURLs}->{root};
   50     my $courseName      = $ce->{courseName};
   51     my @userList        = $r->param("classList");
   52     # can only become the first user listed.
   53     my $student     = shift @userList;
   54     my @setList        = $r->param("setList");
   55     # can only become the first user listed.
   56     my $setName         = shift @setList;
   57     my $uri="$root/$courseName/instructor/sets/$setName/?editForUser=$student&".$self->url_authen_args;
   58     $r->header_out(Location => $uri);
   59     $self->{noContent} =  1;  # forces redirect
   60     return;
   61     };
   62   defined($r->param('act-as-student')) && do {
   63     # fix url and redirect
   64     my @userList        = $r->param("classList");
   65     # can only become the first user listed.
   66     my $effectiveUser   = shift @userList;
   67     my @setList         = $r->param("setList");
   68     my $setName         =  shift @setList;
   69     my $root            = $ce->{webworkURLs}->{root};
   70     my $courseName      = $ce->{courseName};
   71 
   72     my $uri="$root/$courseName/$setName/?effectiveUser=$effectiveUser&".$self->url_authen_args;
   73     #FIXME  does the display mode need to be defined?
   74     #FIXME  url_authen_args also includes an effective user, so the new one must come first.
   75     # even that might not work with every browser since there are two effective User assignments.
   76     $r->header_out(Location => $uri);
   77     $self->{noContent} =  1;  # forces redirect
   78     return;
   79   };
   80   defined($r->param('edit-set-dates')) && do {
   81   #FIXME  this should be replaced by redirecting to a module where you can edit
   82   # dates for several sets at once
   83       my $root            = $ce->{webworkURLs}->{root};
   84     my $courseName      = $ce->{courseName};
   85     my @setList        = $r->param("setList");
   86     # can only become the first user listed.
   87     my $setName         = shift @setList;
   88     my $uri="$root/$courseName/instructor/sets/$setName/?".$self->url_authen_args;
   89     $r->header_out(Location => $uri);
   90     $self->{noContent} =  1;  # forces redirect
   91     return;
   92     };
   93     defined($r->param('reset-password')) && do {
   94     # FIXME this should allow me to assign studentID to a number of students
   95     # requires a new module
   96     my @userList        = $r->param("classList");
   97     # can only become the first user listed.
   98     my $effectiveUser   = shift @userList;
   99     my @setList         = $r->param("setList");
  100     my $setName         =  shift @setList;
  101     my $root            = $ce->{webworkURLs}->{root};
  102     my $courseName      = $ce->{courseName};
  103 
  104     my $uri="$root/$courseName/options/?effectiveUser=$effectiveUser&".$self->url_authen_args;
  105     #FIXME  does the display mode need to be defined?
  106     #FIXME  url_authen_args also includes an effective user, so the new one must come first.
  107     # even that might not work with every browser since there are two effective User assignments.
  108     $r->header_out(Location => $uri);
  109     $self->{noContent} =  1;  # forces redirect
  110     return;
  111     };
  112     defined($r->param('assign-passwords')) && do {
  113       my @userList        = $r->param("classList");
  114     # can only become the first user listed.
  115     my $effectiveUser   = shift @userList;
  116     my @setList         = $r->param("setList");
  117     my $setName         =  shift @setList;
  118     my $root            = $ce->{webworkURLs}->{root};
  119     my $courseName      = $ce->{courseName};
  120 
  121     my $uri="$root/$courseName/options/?effectiveUser=$effectiveUser&".$self->url_authen_args;
  122     #FIXME  does the display mode need to be defined?
  123     #FIXME  url_authen_args also includes an effective user, so the new one must come first.
  124     # even that might not work with every browser since there are two effective User assignments.
  125     $r->header_out(Location => $uri);
  126     $self->{noContent} =  1;  # forces redirect
  127     return;
  128     };
  129     defined($r->param('set-stats')) && do {
  130       my $root            = $ce->{webworkURLs}->{root};
  131     my $courseName      = $ce->{courseName};
  132     my @setList        = $r->param("setList");
  133     # can only become the first user listed.
  134     my $setName         = shift @setList;
  135     my $uri="$root/$courseName/instructor/stats/set/$setName?".$self->url_authen_args;
  136     $r->header_out(Location => $uri);
  137     $self->{noContent} =  1;  # forces redirect
  138     return;
  139     };
  140     defined($r->param('drop-students')) && do {
  141     #FIXME  this operation should be made faster
  142       my $root            = $ce->{webworkURLs}->{root};
  143     my $courseName      = $ce->{courseName};
  144     my @setList        = $r->param("setList");
  145     # can only become the first user listed.
  146     my $setName         = shift @setList;
  147     my $uri="$root/$courseName/instructor/users/?".$self->url_authen_args;
  148     $r->header_out(Location => $uri);
  149     $self->{noContent} =  1;  # forces redirect
  150     return;
  151     };
  152     defined($r->param('edit-students-sets')) && do {
  153         my $root            = $ce->{webworkURLs}->{root};
  154     my $courseName      = $ce->{courseName};
  155     my @userList        = $r->param("classList");
  156     # can only become the first user listed.
  157     my $student     = shift @userList;
  158     my @setList        = $r->param("setList");
  159     # can only become the first user listed.
  160     my $setName         = shift @setList;
  161     my $uri="$root/$courseName/instructor/sets/$setName/?editForUser=$student&".$self->url_authen_args;
  162     $r->header_out(Location => $uri);
  163     $self->{noContent} =  1;  # forces redirect
  164     return;
  165     };
  166     defined($r->param('edit-sets')) && do {
  167       my $root            = $ce->{webworkURLs}->{root};
  168     my $courseName      = $ce->{courseName};
  169     my @setList        = $r->param("setList");
  170     # can only become the first user listed.
  171     my $setName         = shift @setList;
  172     my $uri="$root/$courseName/instructor/sets/$setName/?".$self->url_authen_args;
  173     $r->header_out(Location => $uri);
  174     $self->{noContent} =  1;  # forces redirect
  175     return;
  176     };
  177     defined($r->param('student-stats')) && do {
  178       my $root            = $ce->{webworkURLs}->{root};
  179     my $courseName      = $ce->{courseName};
  180     my @userList        = $r->param("classList");
  181     # can only become the first user listed.
  182     my $studentName     = shift @userList;
  183     my $uri="$root/$courseName/instructor/stats/student/$studentName?".$self->url_authen_args;
  184     $r->header_out(Location => $uri);
  185     $self->{noContent} =  1;  # forces redirect
  186     return;
  187     };
  188     defined($r->param('edit-class-data')) && do {
  189       my $root            = $ce->{webworkURLs}->{root};
  190     my $courseName      = $ce->{courseName};
  191     my @setList        = $r->param("setList");
  192     # can only become the first user listed.
  193     my $setName         = shift @setList;
  194     my $uri="$root/$courseName/instructor/users/?".$self->url_authen_args;
  195     $r->header_out(Location => $uri);
  196     $self->{noContent} =  1;  # forces redirect
  197     return;
  198     };
  199     defined($r->param('add-students')) && do {
  200     my $root            = $ce->{webworkURLs}->{root};
  201     my $courseName      = $ce->{courseName};
  202 
  203     my $uri="$root/$courseName/instructor/add_users/?".$self->url_authen_args;
  204     $r->header_out(Location => $uri);
  205     $self->{noContent} =  1;  # forces redirect
  206     return;
  207   };
  208   defined($r->param('send-email')) && do {
  209     my $root            = $ce->{webworkURLs}->{root};
  210     my $courseName      = $ce->{courseName};
  211 
  212     my $uri="$root/$courseName/instructor/send_mail/?".$self->url_authen_args;
  213     $r->header_out(Location => $uri);
  214     $self->{noContent} =  1;  # forces redirect
  215     return;
  216   };
  217   defined($r->param('score-sets')) && do {
  218     my $root            = $ce->{webworkURLs}->{root};
  219     my $courseName      = $ce->{courseName};
  220 
  221     my $uri="$root/$courseName/instructor/scoring/?scoreSelected=Score%20Selected&".$self->url_authen_args;
  222     my @selectedSets    = $r->param('setList');
  223     $uri .= "&selectedSet=$_" foreach (@selectedSets);
  224     $r->header_out(Location => $uri);
  225     $self->{noContent} =  1;  # forces redirect
  226     return;
  227   };
  228 
  229 }
  230 # override contentGenerator header routine for now
  231 # FIXME
  232 sub header {
  233   my $self = shift;
  234   return REDIRECT if $self->{noContent};
  235   my $r = $self->{r};
  236   $r->content_type('text/html');
  237   $r->send_http_header();
  238   return OK;
  239 }
  240 sub initialize {
  241   my ($self) = @_;
  242   my $r = $self->{r};
  243   my $db = $self->{db};
  244   my $ce = $self->{ce};
  245   my $authz = $self->{authz};
  246   my $user = $r->param('user');
  247 
  248   unless ($authz->hasPermissions($user, "modify_student_data")) {
  249     $self->{submitError} = "You are not authorized to modify student data";
  250     return;
  251   }
  252 
  253 #############################################################################################
  254 # gather database data
  255 #############################################################################################
  256   # FIXME  this might be better done in body? We don't always need all of this data. or do we?
  257 # Obtaining the list of users
  258   my @userNames =  $db->listUsers;
  259   my @user_records = $db->getUsers(@userNames);
  260 
  261   # store data
  262   $self->{ra_users}              =   \@userNames;
  263   $self->{ra_user_records}       =   \@user_records;
  264 
  265 # Obtaining list of sets:
  266   my @setNames =  $db->listGlobalSets();
  267   my @set_records = ();
  268   @set_records = $db->getMergedSets(map {[$user,$_]} @setNames);
  269 #   foreach my $name (@setNames) {
  270 #       my $set_record;
  271 #     $set_record = $db->getMergedSet($user,$name,) ;
  272 #
  273 #       #warn "Adding set $name", ref($set_record);
  274 #       push @set_records, $set_record;
  275 #   }
  276 
  277 
  278   # store data
  279   $self->{ra_sets}              =   \@setNames;
  280   $self->{ra_set_records}       =   \@set_records;
  281 
  282 }
  283 sub path {
  284   my $self          = shift;
  285   my $args          = $_[-1];
  286 
  287   my $ce = $self->{ce};
  288   my $root = $ce->{webworkURLs}->{root};
  289   my $courseName = $ce->{courseName};
  290   return $self->pathMacro($args,
  291     "Home"          => "$root",
  292     $courseName     => "$root/$courseName",
  293     'instructor'    => '',
  294   );
  295 }
  296 
  297 sub title {
  298   my $self = shift;
  299   return "Instructor tools for ".$self->{ce}->{courseName};
  300 }
  301 
  302 sub body {
  303   my $self = shift;
  304   my $r = $self->{r};
  305   my $ce = $self->{ce};
  306   my $db = $self->{db};
  307   my $authz = $self->{authz};
  308   my $courseName = $ce->{courseName};
  309   my $authen_args = $self->url_authen_args();
  310   my $user = $r->param('user');
  311   my $prof_url = $ce->{webworkURLs}->{oldProf};
  312   my $full_url = "$prof_url?course=$courseName&$authen_args";
  313   my $userEditorURL = "users/?" . $self->url_args;
  314   my $problemSetEditorURL = "sets/?" . $self->url_args;
  315   my $statsURL       = "stats/?" . $self->url_args;
  316   my $emailURL       = "send_mail/?" . $self->url_args;
  317   ################### debug code
  318 #     my $permissonLevel =  $self->{db}->getPermissionLevel($user)->permission();
  319 #
  320 #     my $courseEnvironmentLevels = $self->{ce}->{permissionLevels};
  321 #     return CGI::em(" user $permissonLevel permlevels ".join("<>",%$courseEnvironmentLevels));
  322     ################### debug code
  323   return CGI::em('You are not authorized to access the Instructor tools.') unless $authz->hasPermissions($user, 'access_instructor_tools');
  324   my $actionURL= $r->uri;
  325   return join("",
  326     #defined($self->{current_action}) ? CGI::h4($self->{current_action}) :'' ,
  327     #defined($self->{selected_users}) ? CGI::p($self->{selected_users}) : '',
  328     #defined($self->{selected_sets}) ? CGI::p($self->{selected_sets}) : '',
  329     CGI::a({href=>$full_url},"Link to WeBWorK 1.9 Instructor tools"),
  330     CGI::start_form(-method=>"POST", -action=>$actionURL),"\n",
  331     $self->hidden_authen_fields,"\n",
  332     CGI::start_table({-border=>2,-cellpadding=>5}),
  333     CGI::Tr({ -align=>'center'},
  334       CGI::td({colspan=>2},[
  335           CGI::input({type=>'submit',value=>'Add students...',name=>'add-students'}),
  336           CGI::input({type=>'submit',value=>'Send email...',name=>'send-email'}),
  337         ]
  338       ),
  339 
  340 
  341     ),
  342     CGI::Tr({ -align=>'center'},
  343       CGI::td({colspan=>1},[
  344 
  345           CGI::input({type=>'submit',value=>'Reset password',name=>'reset-password'}),
  346           CGI::input({type=>'submit',value=>'Assign passwords...',name=>'assign-passwords'}),
  347           CGI::input({type=>'submit',value=>'View set statistics...',name=>'set-stats'}),
  348           CGI::input({type=>'submit',value=>'Edit set(s) dates...',name=>'edit-set-dates'})
  349         ]
  350       )
  351 
  352     ),
  353     CGI::Tr({ -align=>'center'},
  354       CGI::td({colspan=>1},[
  355           CGI::input({type=>'submit',value=>'View student statistics...',name=>'student-stats'}),
  356           CGI::input({type=>'submit',value=>'Edit class data for students...',name=>'edit-class-data'}),
  357           CGI::input({type=>'submit',value=>'Edit set(s) data...',name=>'edit-sets'}),
  358           CGI::input({type=>'submit',value=>'Score selected set(s)...',name=>'score-sets'}),
  359         ]
  360       ),
  361     ),
  362 
  363 
  364     CGI::Tr({ -align=>'center'},
  365       CGI::td({colspan=>2},[
  366           $self->popup_user_form,
  367           $self->popup_set_form,
  368         ]
  369       )
  370 
  371     ),
  372     CGI::Tr({ -align=>'center'},
  373       CGI::td({colspan=>1},[
  374 
  375           CGI::input({type=>'submit',value=>'Edit student(s)/set(s) dates',name=>'student-dates'}),
  376           CGI::input({type=>'submit',value=>'Act as student in set...',name=>'act-as-student'}),
  377         ]
  378       ),
  379       CGI::td({colspan=>2},
  380         CGI::input({type=>'submit',value=>'Edit student(s) data for selected set(s)...',name=>'edit-students-sets'}),
  381 
  382 
  383       )
  384 
  385     ),
  386 
  387     CGI::Tr({ -align=>'center'},
  388       CGI::td({colspan=>2},[
  389           CGI::input({type=>'submit',value=>'Drop student(s)',name=>'drop-students'}),
  390           '&nbsp;'
  391           ]
  392       ),
  393 
  394 
  395     ),
  396 
  397     CGI::end_table(),
  398     CGI::end_form(),
  399 #     CGI::hr(),
  400 #     CGI::p( defined($self->{studentEntryReport}) ? $self->{studentEntryReport}:''
  401 #     ),
  402 #
  403 #     $self->addStudentForm,
  404   );
  405 }
  406 sub addStudentForm {
  407   my $self = shift;
  408   my $r = $self->{r};
  409 
  410   # Add a student form
  411   join( "",
  412     CGI::p("Add new students"),
  413     CGI::start_form({method=>"post", action=>$r->uri()}),
  414     $self->hidden_authen_fields(),
  415     CGI::start_table({border=>'1', cellpadding=>'2'}),
  416     CGI::Tr({},
  417       CGI::th({},
  418         ['Last Name', 'First Name', 'Student ID', 'Login Name', 'Email Address', 'Section','Recitation', 'Comment']
  419       )
  420     ),
  421     CGI::Tr({},
  422       CGI::td({},
  423         [ CGI::input({name=>'last_name'}),
  424           CGI::input({name=>'first_name'}),
  425           CGI::input({name=>'student_id',size=>'16'}),
  426           CGI::input({name=>'new_user_id',size=>'10'}),
  427           CGI::input({name=>'email_address'}),
  428           CGI::input({name=>'section',size=>'10'}),
  429           CGI::input({name=>'recitation',size=>'10'}),
  430           CGI::input({name=>'comment'}),
  431 
  432 
  433         ]
  434       )
  435     ),
  436     CGI::end_table(),
  437     CGI::submit({name=>"addStudent", value=>"Add Student"}),
  438     CGI::end_form(),
  439   );
  440 
  441 
  442 
  443 
  444 
  445 
  446 }
  447 sub popup_user_form {
  448   my $self  = shift;
  449   my $r     = $self->{r};
  450   my $authz = $self->{authz};
  451   my $user = $r->param('user');
  452   my $db = $self->{db};
  453   my $ce = $self->{ce};
  454   my $root = $ce->{webworkURLs}->{root};
  455   my $courseName = $ce->{courseName};
  456 
  457  #     return CGI::em("You are not authorized to access the Instructor tools.") unless $authz->hasPermissions($user, "access_instructor_tools");
  458 
  459   # This code will require changing if the permission and user tables ever have different keys.
  460     my @users                 = ();
  461   my $ra_user_records       = $self->{ra_user_records};
  462   my %classlistLabels       = ();#  %$hr_classlistLabels;
  463   my @user_records   = sort { ( lc($a->section) cmp lc($b->section) ) ||
  464                        ( lc($a->last_name) cmp lc($b->last_name ))  } @{$ra_user_records};
  465   foreach my $ur (@{user_records}) {
  466     $classlistLabels{$ur->user_id} = $ur->last_name. ', '. $ur->first_name.'   -   '.$ur->section.' '.$ur->user_id;
  467     push(@users, $ur->user_id);
  468   }
  469   return      CGI::popup_menu(-name=>'classList',
  470                  -values=>\@users,
  471                  -labels=>\%classlistLabels,
  472                  -size  => 10,
  473                  -multiple => 1,
  474                  -default=>$user
  475           ),
  476 
  477 
  478 }
  479 sub popup_set_form {
  480   my $self  = shift;
  481   my $r     = $self->{r};
  482   my $authz = $self->{authz};
  483   my $user = $r->param('user');
  484   my $db = $self->{db};
  485   my $ce = $self->{ce};
  486   my $root = $ce->{webworkURLs}->{root};
  487   my $courseName = $ce->{courseName};
  488 
  489  #     return CGI::em("You are not authorized to access the Instructor tools.") unless $authz->hasPermissions($user, "access_instructor_tools");
  490 
  491   # This code will require changing if the permission and user tables ever have different keys.
  492     my @setNames              = ();
  493   my $ra_set_records        = $self->{ra_set_records};
  494   my %setLabels             = ();#  %$hr_classlistLabels;
  495   my @set_records           =  sort {$a->set_id cmp $b->set_id } @{$ra_set_records};
  496   foreach my $sr (@set_records) {
  497     $setLabels{$sr->set_id} = $sr->set_id;
  498     push(@setNames, $sr->set_id);  # reorder sets
  499   }
  500   return      CGI::popup_menu(-name=>'setList',
  501                  -values=>\@setNames,
  502                  -labels=>\%setLabels,
  503                  -size  => 10,
  504                  -multiple => 1,
  505                  #-default=>$user
  506           ),
  507 
  508 
  509 }
  510 1;
  511 
  512 __END__
  513 
  514 =head1 AUTHOR
  515 
  516 Written by Dennis Lambe Jr., malsyned (at) math.rochester.edu
  517 
  518 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9