Refactored JS to use module pattern for proper encapsulation

Extensive jslinting to improve cross-browser support
Added some debugging statements
Fixed redirection to exitUrl when survey complete
Added www_deleteResponses
Added security restrictions on www_ methods
This commit is contained in:
Patrick Donelan 2008-11-25 06:33:55 +00:00
parent 3f25f2668f
commit 31dec565b7
4 changed files with 595 additions and 494 deletions

View file

@ -21,7 +21,6 @@ use WebGUI::Asset::Wobject::Survey::ResponseJSON;
use Data::Dumper;
#<tmpl if admin <tmpl_if canEditSurvey><a href="<tmpl_var editSUrvey_url>"><tmpl_var editSurvey_label></a></tmpl_if>
#-------------------------------------------------------------------
sub definition {
my $class = shift;
@ -130,21 +129,21 @@ sub definition {
sectionEditTemplateId => {
tab => 'display',
fieldType => 'template',
label => "Section Edit Template",
label => "Section Edit Tempalte",
defaultValue => '1oBRscNIcFOI-pETrCOspA',
namespace => 'Survey/Edit',
},
questionEditTemplateId => {
tab => 'display',
fieldType => 'template',
label => "Question Edit Template",
label => "Question Edit Tempalte",
defaultValue => 'wAc4azJViVTpo-2NYOXWvg',
namespace => 'Survey/Edit',
},
answerEditTemplateId => {
tab => 'display',
fieldType => 'template',
label => "Answer Edit Template",
label => "Answer Edit Tempalte",
defaultValue => 'AjhlNO3wZvN5k4i4qioWcg',
namespace => 'Survey/Edit',
},
@ -261,6 +260,9 @@ Loads the initial edit survey page. All other edit actions are JSON calls from
sub www_editSurvey {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
my %var;
my $out = $self->processTemplate( \%var, $self->get("surveyEditTemplateId") );
@ -271,6 +273,9 @@ sub www_editSurvey {
#-------------------------------------------------------------------
sub www_submitObjectEdit {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
# my $ref = @{decode_json($self->session->form->process("data"))};
my $responses = $self->session->form->paramsHashRef();
@ -334,6 +339,10 @@ sub deleteObject {
#-------------------------------------------------------------------
sub www_newObject {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
my $ref;
my $ids = $self->session->form->process("data");
@ -354,6 +363,10 @@ sub www_newObject {
#-------------------------------------------------------------------
sub www_dragDrop {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
my $p = decode_json( $self->session->form->process("data") );
my @tid = split /-/, $p->{target}->{id};
@ -598,31 +611,47 @@ sub www_takeSurvey {
my $self = shift;
my %var;
my $out = $self->processTemplate( \%var, $self->get("surveyTakeTemplateId") );
eval {
my $responseId = $self->getResponseId();
if ( !$responseId ) {
return $self->surveyEnd();
$self->session->log->debug('No responseId, surveyEnd');
# return $self->surveyEnd(); # disabled. let the js handle the exitUrl redirection
} else {
$self->session->log->debug("ResponseId: $responseId");
}
};
my $out = $self->processTemplate( \%var, $self->get("surveyTakeTemplateId") );
return $self->session->style->process($out,$self->get("styleTemplateId"));
}
#-------------------------------------------------------------------
sub www_deleteResponses {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
$self->session->db->write('delete from Survey_response');
return;
}
#handles questions that were submitted
#-------------------------------------------------------------------
sub www_submitQuestions {
my $self = shift;
#can user take survey
if ( !$self->canTakeSurvey() ) {
# return encode_json({"type","FAIL LOGIN"});
$self->session->log->debug('canTakeSurvey false, surveyEnd');
return $self->surveyEnd();
}
my $responseId = $self->getResponseId();
if ( !$responseId ) { return $self->surveyEnd(); }
if ( !$responseId ) {
$self->session->log->debug('No response id, surveyEnd');
return $self->surveyEnd();
}
my $responses = $self->session->form->paramsHashRef();
delete $$responses{'func'};
@ -631,11 +660,12 @@ sub www_submitQuestions {
$self->loadBothJSON();
my $termInfo = $self->response->recordResponses($responses);
my $termInfo = $self->response->recordResponses($self->session, $responses);
$self->saveResponseJSON();
if ( $termInfo->[0] ) {
$self->session->log->debug('Terminal, surveyEnd');
return $self->surveyEnd( $termInfo->[1] );
}
@ -679,18 +709,24 @@ sub www_loadQuestions {
my $self = shift;
if ( !$self->canTakeSurvey() ) {
$self->session->log->debug('canTakeSurvey false, surveyEnd');
return $self->surveyEnd();
}
my $responseId = $self->getResponseId(); #also loads the survey and response
if ( !$responseId ) {
$self->session->log->debug('No responseId, surveyEnd');
return $self->surveyEnd();
}
if($self->response->hasTimedOut()){
$self->session->log->debug('Response hasTimedOut, surveyEnd');
return $self->surveyEnd();
}
return $self->surveyEnd() if ( $self->response->surveyEnd() );
if ( $self->response->surveyEnd() ) {
$self->session->log->debug('Response surveyEnd, so calling surveyEnd');
return $self->surveyEnd();
}
my $questions;
eval { $questions = $self->response->nextQuestions(); };
@ -708,17 +744,18 @@ sub www_loadQuestions {
sub surveyEnd {
my $self = shift;
my $url = shift;
my $responseId = $self->getResponseId(); #also loads the survey and response
# $self->session->db->write("update Survey_response set endDate = ? and isComplete = 1 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]);
$self->session->db->setRow(
"Survey_response",
"Survey_responseId", {
Survey_responseId => $responseId,
endDate => time(),#WebGUI::DateTime->now->toDatabase,
isComplete => 1
}
);
if (my $responseId = $self->getResponseId()) { #also loads the survey and response
# $self->session->db->write("update Survey_response set endDate = ? and isComplete = 1 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]);
$self->session->db->setRow(
"Survey_response",
"Survey_responseId", {
Survey_responseId => $responseId,
endDate => time(),#WebGUI::DateTime->now->toDatabase,
isComplete => 1
}
);
}
if ( $url !~ /\w/ ) { $url = 0; }
if ( $url eq "undefined" ) { $url = 0; }
if ( !$url ) {
@ -730,8 +767,8 @@ sub surveyEnd {
$url = "/";
}
}
$self->session->http->setMimeType('application/json');
return encode_json( { "type", "forward", "url", $url } );
# $self->session->http->setRedirect($url);
return encode_json({ "type", "forward", "url", $url });
} ## end sub surveyEnd
#-------------------------------------------------------------------
@ -844,7 +881,6 @@ sub response {
sub getResponseId {
my $self = shift;
return $self->{responseId} if ( defined $self->{responseId} );
my $ip = $self->session->env->getIp;
@ -925,6 +961,7 @@ sub getResponseId {
} ## end if ( $haveTaken < $allowedTakes)
else {
$self->session->log->debug("haveTaken ($haveTaken) >= allowedTakes ($allowedTakes)");
}
} ## end if ( !$responseId )
$self->{responseId} = $responseId;
@ -974,9 +1011,12 @@ sub canTakeSurvey {
#-------------------------------------------------------------------
sub www_viewGradeBook{
my $self = shift;
$self->loadTempReportTable();
return ""
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get("groupToViewReports") ) );
$self->loadTempReportTable();
my @peoples = $self->session->db->quickArray("SELECT UNIQUE(Survey_responseId) from Survey_tempReport where assetId = ?",[$self->getId()]);
for my $people(@peoples){
#my $
@ -988,9 +1028,12 @@ sub www_viewGradeBook{
#-------------------------------------------------------------------
sub www_exportSimpleResults{
my $self = shift;
$self->loadTempReportTable();
return ""
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get("groupToViewReports") ) );
$self->loadTempReportTable();
my $filename = $self->session->url->escape( $self->get("title") . "_results.tab" );
my $content
= $self->session->db->quickTab(

View file

@ -130,9 +130,9 @@ sub currentSection {
sub recordResponses {
my $self = shift;
my $responses = shift;
my $session = shift;
my $responses = shift;
my %mcTypes = (
'Agree/Disagree', 1, 'Certainty', 1, 'Concern', 1, 'Confidence', 1, 'Education', 1,
'Effectiveness', 1, 'Gender', 1, 'Ideology', 1, 'Importance', 1, 'Likelihood', 1,