| … | |
… | |
| 80 | ################################################################################ |
80 | ################################################################################ |
| 81 | |
81 | |
| 82 | # Subroutines to determine if a user "can" perform an action. Each subroutine is |
82 | # Subroutines to determine if a user "can" perform an action. Each subroutine is |
| 83 | # called with the following arguments: |
83 | # called with the following arguments: |
| 84 | # |
84 | # |
| 85 | # ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem) |
85 | # ($self, $User, $EffectiveUser, $Set, $Problem) |
| 86 | |
86 | |
| 87 | sub can_showOldAnswers { |
87 | sub can_showOldAnswers { |
| 88 | #my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem) = @_; |
88 | #my ($self, $User, $EffectiveUser, $Set, $Problem) = @_; |
| 89 | |
89 | |
| 90 | return 1; |
90 | return 1; |
| 91 | } |
91 | } |
| 92 | |
92 | |
| 93 | sub can_showCorrectAnswers { |
93 | sub can_showCorrectAnswers { |
| 94 | my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem) = @_; |
94 | my ($self, $User, $EffectiveUser, $Set, $Problem) = @_; |
| 95 | my $authz = $self->r->authz; |
95 | my $authz = $self->r->authz; |
| 96 | |
96 | |
| 97 | return |
97 | return |
| 98 | after($Set->answer_date) |
98 | after($Set->answer_date) |
| 99 | || |
99 | || |
| 100 | $authz->hasPermissions($User->user_id, "show_correct_answers_before_answer_date") |
100 | $authz->hasPermissions($User->user_id, "show_correct_answers_before_answer_date") |
| 101 | ; |
101 | ; |
| 102 | } |
102 | } |
| 103 | |
103 | |
| 104 | sub can_showHints { |
104 | sub can_showHints { |
| 105 | #my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem) = @_; |
105 | #my ($self, $User, $EffectiveUser, $Set, $Problem) = @_; |
| 106 | |
106 | |
| 107 | return 1; |
107 | return 1; |
| 108 | } |
108 | } |
| 109 | |
109 | |
| 110 | sub can_showSolutions { |
110 | sub can_showSolutions { |
| 111 | my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem) = @_; |
111 | my ($self, $User, $EffectiveUser, $Set, $Problem) = @_; |
| 112 | my $authz = $self->r->authz; |
112 | my $authz = $self->r->authz; |
| 113 | |
113 | |
| 114 | return |
114 | return |
| 115 | after($Set->answer_date) |
115 | after($Set->answer_date) |
| 116 | || |
116 | || |
| 117 | $authz->hasPermissions($User->user_id, "show_solutions_before_answer_date") |
117 | $authz->hasPermissions($User->user_id, "show_solutions_before_answer_date") |
| 118 | ; |
118 | ; |
| 119 | } |
119 | } |
| 120 | |
120 | |
| 121 | sub can_recordAnswers { |
121 | sub can_recordAnswers { |
| 122 | my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem, $submitAnswers) = @_; |
122 | my ($self, $User, $EffectiveUser, $Set, $Problem, $submitAnswers) = @_; |
| 123 | my $authz = $self->r->authz; |
123 | my $authz = $self->r->authz; |
| 124 | my $thisAttempt = $submitAnswers ? 1 : 0; |
124 | my $thisAttempt = $submitAnswers ? 1 : 0; |
| 125 | if ($User->user_id ne $EffectiveUser->user_id) { |
125 | if ($User->user_id ne $EffectiveUser->user_id) { |
| 126 | return $authz->hasPermissions($User->user_id, "record_answers_when_acting_as_student"); |
126 | return $authz->hasPermissions($User->user_id, "record_answers_when_acting_as_student"); |
| 127 | } |
127 | } |
| … | |
… | |
| 141 | return $authz->hasPermissions($User->user_id, "record_answers_after_answer_date"); |
141 | return $authz->hasPermissions($User->user_id, "record_answers_after_answer_date"); |
| 142 | } |
142 | } |
| 143 | } |
143 | } |
| 144 | |
144 | |
| 145 | sub can_checkAnswers { |
145 | sub can_checkAnswers { |
| 146 | my ($self, $User, $PermissionLevel, $EffectiveUser, $Set, $Problem, $submitAnswers) = @_; |
146 | my ($self, $User, $EffectiveUser, $Set, $Problem, $submitAnswers) = @_; |
| 147 | my $authz = $self->r->authz; |
147 | my $authz = $self->r->authz; |
| 148 | my $thisAttempt = $submitAnswers ? 1 : 0; |
148 | my $thisAttempt = $submitAnswers ? 1 : 0; |
| 149 | |
149 | |
| 150 | if (before($Set->open_date)) { |
150 | if (before($Set->open_date)) { |
| 151 | return $authz->hasPermissions($User->user_id, "check_answers_before_open_date"); |
151 | return $authz->hasPermissions($User->user_id, "check_answers_before_open_date"); |
| … | |
… | |
| 385 | unless defined $user; |
385 | unless defined $user; |
| 386 | |
386 | |
| 387 | my $effectiveUser = $db->getUser($effectiveUserName); # checked |
387 | my $effectiveUser = $db->getUser($effectiveUserName); # checked |
| 388 | die "record for user $effectiveUserName (effective user) does not exist." |
388 | die "record for user $effectiveUserName (effective user) does not exist." |
| 389 | unless defined $effectiveUser; |
389 | unless defined $effectiveUser; |
| 390 | |
|
|
| 391 | my $PermissionLevel = $db->getPermissionLevel($userName); # checked |
|
|
| 392 | die "permission level record for user $userName does not exist (but the user does? odd...)" |
|
|
| 393 | unless defined $PermissionLevel; |
|
|
| 394 | my $permissionLevel = $PermissionLevel->permission; |
|
|
| 395 | |
390 | |
| 396 | # obtain the merged set for $effectiveUser |
391 | # obtain the merged set for $effectiveUser |
| 397 | my $set = $db->getMergedSet($effectiveUserName, $setName); # checked |
392 | my $set = $db->getMergedSet($effectiveUserName, $setName); # checked |
| 398 | |
393 | |
| 399 | # Database fix (in case of undefined published values) |
394 | # Database fix (in case of undefined published values) |
| … | |
… | |
| 499 | |
494 | |
| 500 | $self->{userName} = $userName; |
495 | $self->{userName} = $userName; |
| 501 | $self->{effectiveUserName} = $effectiveUserName; |
496 | $self->{effectiveUserName} = $effectiveUserName; |
| 502 | $self->{user} = $user; |
497 | $self->{user} = $user; |
| 503 | $self->{effectiveUser} = $effectiveUser; |
498 | $self->{effectiveUser} = $effectiveUser; |
| 504 | $self->{permissionLevel} = $permissionLevel; |
|
|
| 505 | $self->{set} = $set; |
499 | $self->{set} = $set; |
| 506 | $self->{problem} = $problem; |
500 | $self->{problem} = $problem; |
| 507 | $self->{editMode} = $editMode; |
501 | $self->{editMode} = $editMode; |
| 508 | |
502 | |
| 509 | ##### form processing ##### |
503 | ##### form processing ##### |
| … | |
… | |
| 560 | checkAnswers => 0, |
554 | checkAnswers => 0, |
| 561 | getSubmitButton => 0, |
555 | getSubmitButton => 0, |
| 562 | ); |
556 | ); |
| 563 | |
557 | |
| 564 | # does the user have permission to use certain options? |
558 | # does the user have permission to use certain options? |
| 565 | my @args = ($user, $PermissionLevel, $effectiveUser, $set, $problem); |
559 | my @args = ($user, $effectiveUser, $set, $problem); |
| 566 | my %can = ( |
560 | my %can = ( |
| 567 | showOldAnswers => $self->can_showOldAnswers(@args), |
561 | showOldAnswers => $self->can_showOldAnswers(@args), |
| 568 | showCorrectAnswers => $self->can_showCorrectAnswers(@args), |
562 | showCorrectAnswers => $self->can_showCorrectAnswers(@args), |
| 569 | showHints => $self->can_showHints(@args), |
563 | showHints => $self->can_showHints(@args), |
| 570 | showSolutions => $self->can_showSolutions(@args), |
564 | showSolutions => $self->can_showSolutions(@args), |
| 571 | recordAnswers => $self->can_recordAnswers(@args, 0), |
565 | recordAnswers => $self->can_recordAnswers(@args, 0), |
| 572 | checkAnswers => $self->can_checkAnswers(@args, $submitAnswers), |
566 | checkAnswers => $self->can_checkAnswers(@args, $submitAnswers), |
| 573 | getSubmitButton => $self->can_recordAnswers(@args, $submitAnswers), |
567 | getSubmitButton => $self->can_recordAnswers(@args, $submitAnswers), |
| 574 | ); |
568 | ); |
| 575 | |
|
|
| 576 | # # does the user have permission to use certain options? |
|
|
| 577 | # my %can = ( |
|
|
| 578 | # showOldAnswers => 1, |
|
|
| 579 | # showCorrectAnswers => canShowCorrectAnswers($permissionLevel, $set->answer_date), |
|
|
| 580 | # showHints => 1, |
|
|
| 581 | # showSolutions => canShowSolutions($permissionLevel, $set->answer_date), |
|
|
| 582 | # recordAnswers => canRecordAnswers($permissionLevel, $set->open_date, $set->due_date, |
|
|
| 583 | # $problem->max_attempts, $problem->num_correct + $problem->num_incorrect + 1), |
|
|
| 584 | # # attempts=num_correct+num_incorrect+1, as this happens before updating $problem |
|
|
| 585 | # checkAnswers => canCheckAnswers($permissionLevel, $set->due_date), |
|
|
| 586 | # ); |
|
|
| 587 | # |
|
|
| 588 | # # more complicated logic for showing check answer button: |
|
|
| 589 | # # checkAnswers button shows up after due date -- once a student can't record anymore |
|
|
| 590 | # # checkAnswers button always shows up when an instructor or TA is acting |
|
|
| 591 | # # as someone else (the $user and $effectiveUserName aren't the same). |
|
|
| 592 | # $can{checkAnswers} = ( |
|
|
| 593 | # # $can{recordAnswers} will be false if the due date has passed OR the |
|
|
| 594 | # # student has used up all of her attempts |
|
|
| 595 | # ($can{checkAnswers} and not $can{recordAnswers}) |
|
|
| 596 | # or |
|
|
| 597 | # ( |
|
|
| 598 | # # FIXME: this is not the right way to check for this. |
|
|
| 599 | # # also, canCheckAnswers() will show this button if the permission |
|
|
| 600 | # # level is positive, which is always true when an instructor is |
|
|
| 601 | # # acting as a student |
|
|
| 602 | # defined($userName) |
|
|
| 603 | # and |
|
|
| 604 | # defined($effectiveUserName) |
|
|
| 605 | # and |
|
|
| 606 | # ($userName ne $effectiveUserName) |
|
|
| 607 | # ) |
|
|
| 608 | # ); |
|
|
| 609 | # |
|
|
| 610 | # # more complicated logic for showing "submit answer" button: |
|
|
| 611 | # # We hide the submit answer button if someone is acting as a student |
|
|
| 612 | # # This prevents errors where you accidently submit the answer for a student |
|
|
| 613 | # # Not sure whether this a feature or a bug |
|
|
| 614 | # $can{recordAnswers} = ( |
|
|
| 615 | # $can{recordAnswers} |
|
|
| 616 | # and not |
|
|
| 617 | # ( |
|
|
| 618 | # # FIXME: this is not the right way to check for this. |
|
|
| 619 | # defined($userName) |
|
|
| 620 | # and |
|
|
| 621 | # defined($effectiveUserName) |
|
|
| 622 | # and |
|
|
| 623 | # ($userName ne $effectiveUserName) |
|
|
| 624 | # ) |
|
|
| 625 | # ); |
|
|
| 626 | |
569 | |
| 627 | # final values for options |
570 | # final values for options |
| 628 | my %will; |
571 | my %will; |
| 629 | foreach (keys %must) { |
572 | foreach (keys %must) { |
| 630 | $will{$_} = $can{$_} && ($want{$_} || $must{$_}); |
573 | $will{$_} = $can{$_} && ($want{$_} || $must{$_}); |
| … | |
… | |
| 829 | } |
772 | } |
| 830 | # unpack some useful variables |
773 | # unpack some useful variables |
| 831 | my $set = $self->{set}; |
774 | my $set = $self->{set}; |
| 832 | my $problem = $self->{problem}; |
775 | my $problem = $self->{problem}; |
| 833 | my $editMode = $self->{editMode}; |
776 | my $editMode = $self->{editMode}; |
| 834 | my $permissionLevel = $self->{permissionLevel}; |
|
|
| 835 | my $submitAnswers = $self->{submitAnswers}; |
777 | my $submitAnswers = $self->{submitAnswers}; |
| 836 | my $checkAnswers = $self->{checkAnswers}; |
778 | my $checkAnswers = $self->{checkAnswers}; |
| 837 | my $previewAnswers = $self->{previewAnswers}; |
779 | my $previewAnswers = $self->{previewAnswers}; |
| 838 | my %want = %{ $self->{want} }; |
780 | my %want = %{ $self->{want} }; |
| 839 | my %can = %{ $self->{can} }; |
781 | my %can = %{ $self->{can} }; |