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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3377 - (download) (as text) (annotate)
Thu Jul 14 13:15:27 2005 UTC (7 years, 10 months ago) by glarose
File size: 7593 byte(s)
Preliminary commit of changes to add Gateway module.
This adds to WeBWorK
 - the ability to create versioned, timed problem sets ("gateway tests")
   for which all problems are displayed on a single page ("versioned"
   means that students can get multiple versions of the problem set),
 - the ability to create sets that draw problems from groups of
   problems, and
 - the ability to create sets that require a proctor login to start
   and grade.
Sets can be defined as gateway tests or proctored gateway tests from
the ProblemSetDetail page.

Not quite bug-free yet.  Known bugs include handling of problem values
on the Student Progress page (I think this may be a problem with
changing from sql database format where all entries were 'text' to
sql_single in ver 2.1, where they are integer), and a division by zero
error on the grades page (which may be the same problem).

Tests with a number of attempts per version greater than one haven't
been carefully tested, nor has scoring of gateway tests.

    1 ################################################################################
    2 # WeBWorK Online Homework Delivery System
    3 # Copyright © 2000-2003 The WeBWorK Project, http://openwebwork.sf.net/
    4 # $CVSHeader: webwork2/lib/WeBWorK/ContentGenerator/Instructor/AddUsers.pm,v 1.17 2005/01/29 01:29:41 jj Exp $
    5 #
    6 # This program is free software; you can redistribute it and/or modify it under
    7 # the terms of either: (a) the GNU General Public License as published by the
    8 # Free Software Foundation; either version 2, or (at your option) any later
    9 # version, or (b) the "Artistic License" which comes with this package.
   10 #
   11 # This program is distributed in the hope that it will be useful, but WITHOUT
   12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   13 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
   14 # Artistic License for more details.
   15 ################################################################################
   16 
   17 package WeBWorK::ContentGenerator::Instructor::AddUsers;
   18 use base qw(WeBWorK::ContentGenerator::Instructor);
   19 
   20 =head1 NAME
   21 
   22 WeBWorK::ContentGenerator::Instructor::AddUsers - Menu interface for adding users
   23 
   24 
   25 =cut
   26 
   27 use strict;
   28 use warnings;
   29 use CGI qw();
   30 use WeBWorK::Utils qw/cryptPassword/;
   31 
   32 sub initialize {
   33   my ($self) = @_;
   34   my $r = $self->r;
   35   my $db = $r->db;
   36   my $ce = $r->ce;
   37   my $authz = $r->authz;
   38 
   39   my $user = $r->param('user');
   40 
   41   # Check permissions
   42   return unless ($authz->hasPermissions($user, "access_instructor_tools"));
   43   return unless ($authz->hasPermissions($user, "modify_student_data"));
   44 
   45   if (defined($r->param('addStudents'))) {
   46     my @userIDs;
   47     my $numberOfStudents    = $r->param('number_of_students');
   48     warn "Internal error -- the number of students to be added has not been included" unless defined $numberOfStudents;
   49     foreach my $i (1..$numberOfStudents) {
   50         my $new_user_id  = trim_spaces($r->param("new_user_id_$i"));
   51         my $new_password = cryptPassword($r->param("student_id_$i"));
   52         next unless defined($new_user_id) and $new_user_id;
   53       push @userIDs, $new_user_id;
   54 
   55       my $newUser            = $db->newUser;
   56       my $newPermissionLevel = $db->newPermissionLevel;
   57       my $newPassword        = $db->newPassword;
   58       $newUser->user_id($new_user_id);
   59       $newPermissionLevel->user_id($new_user_id);
   60       $newPassword->user_id($new_user_id);
   61       $newPassword->password($new_password);
   62       $newUser->last_name(trim_spaces($r->param("last_name_$i")));
   63       $newUser->first_name(trim_spaces($r->param("first_name_$i")));
   64       $newUser->student_id(trim_spaces($r->param("student_id_$i")));
   65       $newUser->email_address(trim_spaces($r->param("email_address_$i")));
   66       $newUser->section(trim_spaces($r->param("section_$i")));
   67       $newUser->recitation(trim_spaces($r->param("recitation_$i")));
   68       $newUser->comment(trim_spaces($r->param("comment_$i")));
   69       $newUser->status('C');
   70       $newPermissionLevel->permission(0);
   71       #FIXME  handle errors if user exists already
   72       eval { $db->addUser($newUser) };
   73       if ($@) {
   74         my $addError = $@;
   75         $self->{studentEntryReport} .= join("",
   76           CGI::b("Failed to enter student: "), $newUser->last_name, ", ",$newUser->first_name,
   77           CGI::b(", login/studentID: "), $newUser->user_id, "/",$newUser->student_id,
   78           CGI::b(", email: "), $newUser->email_address,
   79           CGI::b(", section: "), $newUser->section,
   80           CGI::br(), CGI::b("Error message: "), $addError,
   81           CGI::hr(),CGI::br(),
   82         );
   83       } else {
   84         $db->addPermissionLevel($newPermissionLevel);
   85         $db->addPassword($newPassword);
   86         $self->{studentEntryReport} .= join("",
   87           CGI::b("Entered student: "), $newUser->last_name, ", ",$newUser->first_name,
   88           CGI::b(", login/studentID: "), $newUser->user_id, "/",$newUser->student_id,
   89           CGI::b(", email: "), $newUser->email_address,
   90           CGI::b(", section: "), $newUser->section,CGI::hr(),CGI::br(),
   91 
   92         );
   93       }
   94     }
   95     if (defined $r->param("assignSets")) {
   96       my @setIDs = $r->param("assignSets");
   97       if (@setIDs) {
   98         $self->assignSetsToUsers(\@setIDs, \@userIDs);
   99       }
  100     }
  101   }
  102 }
  103 
  104 sub body {
  105   my ($self) = @_;
  106   my $r      = $self->r;
  107   my $ce     = $r->ce;
  108   my $db     = $r->db;
  109   my $authz  = $r->authz;
  110 
  111   my $courseName = $r->urlpath->arg("courseID");
  112   my $authen_args = $self->url_authen_args();
  113   my $user = $r->param('user');
  114 
  115   # Check permissions
  116   return CGI::div({class=>"ResultsWithError"}, "You are not authorized to access the Instructor tools.")
  117     unless $authz->hasPermissions($user, "access_instructor_tools");
  118 
  119   return CGI::div({class=>"ResultsWithError"}, "You are not authorized to modify student data.")
  120     unless $authz->hasPermissions($user, "modify_student_data");
  121 
  122 
  123   return join("",
  124 
  125     CGI::hr(),
  126     CGI::p(
  127       defined($self->{studentEntryReport})
  128         ? $self->{studentEntryReport}
  129         : ''
  130     ),
  131     CGI::p("Enter information below for students you wish to add. Each student's password will initially be set to their student ID."),
  132     $self->addStudentForm,
  133   );
  134 }
  135 
  136 sub addStudentForm {
  137   my $self                  = shift;
  138   my $r                     = $self->r;
  139   my $db                    = $r->db;
  140   my $ce                    = $r->ce;
  141   my $numberOfStudents      = $r->param("number_of_students") || 5;
  142 
  143 
  144 
  145   # Add a student form
  146 
  147   my @entryLines = ();
  148   foreach my $i (1..$numberOfStudents) {
  149     push( @entryLines,
  150       CGI::Tr({},
  151         CGI::td({},
  152           [ CGI::input({name=>"last_name_$i"}),
  153             CGI::input({name=>"first_name_$i"}),
  154             CGI::input({name=>"student_id_$i",size=>"16"}),
  155             CGI::input({name=>"new_user_id_$i",size=>"10"}),
  156             CGI::input({name=>"email_address_$i"}),
  157             CGI::input({name=>"section_$i",size=>"10"}),
  158             CGI::input({name=>"recitation_$i",size=>"10"}),
  159             CGI::input({name=>"comment_$i"}),
  160           ]
  161         )
  162       ),"\n",
  163     );
  164   }
  165 
  166   return join("",
  167     CGI::start_form({method=>"post", action=>$r->uri(),name=>"add_users"}),
  168     $self->hidden_authen_fields(),"\n",
  169     CGI::submit(-name=>"Create", -value=>"Create"),"  ","\n",
  170     CGI::input({type=>'text', name=>'number_of_students', value=>$numberOfStudents,size => 3}), " entry rows. ","\n",
  171     CGI::end_form(),"\n",
  172     CGI::hr(),
  173 
  174     CGI::start_form({method=>"post", action=>$r->uri()}),
  175     $self->hidden_authen_fields(),
  176     CGI::input({type=>'hidden', name => "number_of_students", value => $numberOfStudents}),
  177     CGI::start_table({border=>'1', cellpadding=>'2'}),
  178     CGI::Tr({},
  179       CGI::th({},
  180         ['Last Name', 'First Name', 'Student ID', 'Login Name', 'Email Address', 'Section','Recitation', 'Comment']
  181       )
  182     ),
  183     @entryLines,
  184     CGI::end_table(),
  185 
  186 
  187 
  188     CGI::p("Select sets below to assign them to the newly-created users."),
  189     CGI::popup_menu(
  190       -name     => "assignSets",
  191       -values   => [ $db->listGlobalSets ],
  192       -size     => 10,
  193       -multiple => "multiple",
  194     ),
  195     CGI::p(
  196       CGI::submit({name=>"addStudents", value=>"Add Students"}),
  197     ),
  198     CGI::end_form(),
  199 
  200     #qq{ <div style="color:red"> After entering new students you will still
  201     #need to assign sets to them.  This is done from the "set list" page. <br>
  202     #Click on the entry "xx users" in
  203     #the "assigned to" column at the far right. <br> Then click either "assign to all"
  204     #or check individual users and click "save" at the bottom.  </div>
  205     #Soon ( real soon -- honest!!! :-)  ) you will also be able to assign sets to the students as they are entered from this page. }
  206   );
  207 }
  208 
  209 
  210 ## Utility function to trim whitespace off the start and end of its input
  211 sub trim_spaces {
  212   my $in = shift;
  213   $in =~ s/^\s*(.*?)\s*$/$1/;
  214   return($in);
  215 }
  216 
  217 1;
  218 
  219 __END__
  220 
  221 =head1 AUTHOR
  222 
  223 Written by Dennis Lambe Jr., malsyned (at) math.rochester.edu
  224 
  225 =cut

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9