From d8bc8f152063f6bc0310c8c3727fd39b3827203a Mon Sep 17 00:00:00 2001 From: Kaleb Murphy Date: Thu, 6 Nov 2008 20:18:23 +0000 Subject: [PATCH] preparing for merge --- lib/WebGUI/Asset/Wobject/Survey.pm | 58 ------------------ lib/WebGUI/Asset/Wobject/Survey/Survey.sql | 20 ------ lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm | 42 ++++++------- .../Asset/Wobject/Survey/Survey_response.sql | 13 ---- .../Asset/Wobject/Survey/survey_templates.tar | Bin 20480 -> 0 bytes 5 files changed, 21 insertions(+), 112 deletions(-) delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/Survey.sql delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql delete mode 100644 lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index fa7b558f3..30b969818 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -242,13 +242,9 @@ sub loadSurveyJSON{ $jsonHash = $self->session->db->quickScalar("select surveyJSON from Survey where assetId = ?",[$self->getId]) if(! defined $jsonHash); -$self->session->errorHandler->error("LOADING JSON"); eval{ $self->{survey} = WebGUI::Asset::Wobject::Survey::SurveyJSON->new($jsonHash,$self->session->errorHandler); }; -$self->session->errorHandler->error("Loaded JSON".$@); - -#$self->session->errorHandler->error("Loaded JSON\n\n".Dumper $self->survey->freeze); } #------------------------------------------------------------------- @@ -268,8 +264,6 @@ sub saveSurveyJSON{ my $data = $self->survey->freeze(); -$self->session->errorHandler->error("Saving THIS DATA");#\n\n".$data); - $self->session->db->write("update Survey set surveyJSON = ? where assetId = ?",[$data,$self->getId]); } @@ -295,7 +289,6 @@ sub www_editSurvey { #------------------------------------------------------------------- sub www_submitObjectEdit{ my $self = shift; -$self->session->errorHandler->error("Submit Edit Object"); # my $ref = @{decode_json($self->session->form->process("data"))}; my $responses = $self->session->form->paramsHashRef(); @@ -304,15 +297,12 @@ $self->session->errorHandler->error("Submit Edit Object"); $self->loadSurveyJSON(); if($responses->{delete}){ -$self->session->errorHandler->error("Deleting ".join(',',@address)); return $self->deleteObject(\@address); } elsif($responses->{copy}){ -$self->session->errorHandler->error("Copying ".join(',',@address)); return $self->copyObject(\@address); } -$self->session->errorHandler->error("Updating ".join(',',@address)); #each object checks the ref and then either updates or passes it to the correct child. New objects will have an index of -1. my $message = $self->survey->update(\@address,$responses); @@ -350,7 +340,6 @@ sub deleteObject{ }else{ pop(@{$address});# unless @$address == 1 and $$address[0] == 0; } -$self->session->errorHandler->error("returning ".join(',',@$address)); return $self->www_loadSurvey({address => $address, message=>$message}); } @@ -361,18 +350,15 @@ sub www_newObject{ my $self = shift; my $ref; -$self->session->errorHandler->error("Entering newObject"); my $ids = $self->session->form->process("data"); my @inAddress = split/-/,$ids; -$self->session->errorHandler->error("Address is:".join(',', @inAddress)); $self->loadSurveyJSON(); #Don't save after this as the new object should not stay in the survey my $address = $self->survey->newObject(\@inAddress); -$self->session->errorHandler->error("New objects address is:".join(',', @$address)); #The new temp object has an address of NEW, which means it is not a real final address. @@ -386,7 +372,6 @@ sub www_dragDrop{ my $self = shift; my $p = decode_json($self->session->form->process("data")); -$self->session->errorHandler->error("In Drag Drop ".Dumper $p); my @tid = split/-/,$p->{target}->{id}; my @bid = split/-/,$p->{before}->{id}; @@ -430,7 +415,6 @@ $self->session->errorHandler->error("In Drag Drop ".Dumper $p); } $self->saveSurveyJSON(); -$self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->survey->freeze()); return $self->www_loadSurvey({address => $address}); } @@ -440,7 +424,6 @@ $self->session->errorHandler->error("Finsihed Drag Drop ".Dumper $self->survey-> sub www_loadSurvey{ my ($self,$options) = @_; -$self->session->errorHandler->error("Entering loadSurvey"); $self->loadSurveyJSON(); my $address = defined $options->{address} ? $options->{address} : undef; @@ -452,13 +435,9 @@ $self->session->errorHandler->error("Entering loadSurvey"); } } my $message = defined $options->{message} ? $options->{message} : ''; -#$self->session->errorHandler->error("Getting edit vars:".join(',',@$address)); my $var = defined $options->{var} ? $options->{var} : $self->survey->getEditVars($address); -#$self->session->errorHandler->error("Got edit vars".Dumper $self->survey->freeze); -#$self->session->errorHandler->error("Loaded beginning params ".join(',',@$address)); my $editHtml; -#$self->session->errorHandler->error("The edit vars:".Dumper $var); if($var->{type} eq 'section'){ $editHtml = $self->processTemplate($var,$self->get("sectionEditTemplateId")); }elsif($var->{type} eq 'question'){ @@ -466,7 +445,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); }elsif($var->{type} eq 'answer'){ $editHtml = $self->processTemplate($var,$self->get("answerEditTemplateId")); } -#$self->session->errorHandler->error("The HTML :$editHtml"); my %buttons; $buttons{question} = $$address[0]; @@ -475,7 +453,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); } my $data = $self->survey->getDragDropList($address); -#$self->session->errorHandler->error("The DD data :".Dumper $data); my $html; my ($scount,$qcount,$acount) = (-1,-1,-1); my $lastType; @@ -512,7 +489,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); $lastType = 'answer'; } } -#$self->session->errorHandler->error($html); #address is the address of the focused object #buttons are the data to create the Add buttons @@ -521,13 +497,6 @@ $self->session->errorHandler->error("Entering loadSurvey"); #ids is a list of all ids passed in which are draggable (for adding events) #type is the object type my $return = {"address",$address,"buttons",\%buttons,"edithtml",$editHtml,"ddhtml",$html,"ids",\@ids,"type",$var->{type}}; -#$self->session->errorHandler->error(Dumper $return); -eval{ -# $self->session->errorHandler->error(encode_json($return)); -}; -#$self->session->errorHandler->error($@); - -$self->session->errorHandler->error("Returning from loadSurvey"); $self->session->http->setMimeType('application/json'); return encode_json($return); } @@ -632,12 +601,10 @@ sub www_takeSurvey{ eval{ my $responseId = $self->getResponseId(); if(!$responseId){ -$self->session->errorHandler->error("\n\nIn takeSurvey with no reponseId $responseId"); return $self->surveyEnd(); } }; - $self->session->errorHandler->error($@) if defined $@; return $out; } @@ -658,10 +625,8 @@ sub www_submitQuestions{ my $responseId = $self->getResponseId(); if(!$responseId){return $self->surveyEnd();} - $self->session->errorHandler->error("\n\nIn submitQuestions with reponseId $responseId"); my $responses = $self->session->form->paramsHashRef(); -$self->session->errorHandler->error(Dumper $responses); delete $$responses{'func'}; my @goodResponses = keys %$responses;#load everything. @@ -720,13 +685,11 @@ $self->session->errorHandler->error(Dumper $responses); sub www_loadQuestions{ my $self=shift; - $self->session->errorHandler->error("\n\n\n\n\t\t\t\t\t\t\t\t\t---In loadQuestions"); if(!$self->canTakeSurvey()){ return $self->surveyEnd(); } -$self->session->errorHandler->error("Can take survey"); my $responseId = $self->getResponseId();#also loads the survey and response if(!$responseId){ @@ -739,18 +702,14 @@ $self->session->errorHandler->error("Can take survey"); eval{ $questions = $self->response->nextQuestions(); }; -$self->session->errorHandler->error($@) if($@); -$self->session->errorHandler->error("Load Questions had ".@$questions." questions") if(ref $questions eq 'ARRAY'); my $section = $self->response->nextSection(); -#$self->session->errorHandler->error(Dumper $section); #return $self->prepareShowSurveyTemplate($section,$questions); $section->{id} = $self->response->nextSectionId(); my $text = $self->prepareShowSurveyTemplate($section,$questions); -$self->session->errorHandler->error("Load Questions returning"); return $text; } @@ -759,7 +718,6 @@ $self->session->errorHandler->error("Load Questions returning"); sub surveyEnd{ my $self = shift; my $url = shift; -$self->session->errorHandler->error("-------SurveyEnd $url"); 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",{ @@ -775,7 +733,6 @@ $self->session->errorHandler->error("-------SurveyEnd $url"); $url = "/"; } } -$self->session->errorHandler->error("-------SurveyEnd $url"); $self->session->http->setMimeType('application/json'); return encode_json({"type","forward","url",$url}); } @@ -795,9 +752,7 @@ sub prepareShowSurveyTemplate{ my %fileUpload = ('File Upload',1); my %hidden = ('Hidden',1); -$self->session->errorHandler->error("Preparing to insert question for $#$questions questions"); foreach my $q(@$questions){ -$self->session->errorHandler->error("Question Text is: ".$q->{text}); if($fileUpload{$$q{'questionType'}}){ $q->{'fileLoader'} = 1; } elsif($text{$$q{'questionType'}}){ $q->{'textType'} = 1; } elsif($hidden{$$q{'questionType'}}){ $q->{'hidden'} = 1; } @@ -823,7 +778,6 @@ $self->session->errorHandler->error("Question Text is: ".$q->{text}); } $section->{'questions'} = $questions; -#$self->session->errorHandler->error(Dumper $section); my $out = $self->processTemplate($section,$self->get("surveyQuestionsId")); $self->session->http->setMimeType('application/json'); @@ -849,18 +803,14 @@ sub loadBothJSON{ #------------------------------------------------------------------- sub loadResponseJSON{ my $self = shift; -$self->log("1"); my $jsonHash = shift; my $rId = shift; $rId = defined $rId ? $rId : $self->{responseId}; if(defined $self->response and ! defined $rId){return;} -$self->log("loading $rId"); $jsonHash = $self->session->db->quickScalar("select responseJSON from Survey_response where assetId = ? and Survey_responseId = ?", [$self->getId,$rId]) if(! defined $jsonHash); -$self->log("jsonhash was ".(length $jsonHash)); - $self->{response} = WebGUI::Asset::Wobject::Survey::ResponseJSON->new($jsonHash,$self->session->errorHandler, $self->survey); } #------------------------------------------------------------------- @@ -869,7 +819,6 @@ sub saveResponseJSON{ my $data = $self->response->freeze(); -$self->session->errorHandler->error("Saving RESPONSE to ".$self->{responseId}." for $data"); $self->session->db->write("update Survey_response set responseJSON = ? where Survey_responseId = ?",[$data,$self->{responseId}]); } @@ -939,18 +888,15 @@ sub getResponseId{ assetId=>$self->getId(), anonId=>$anonId }); -$self->session->errorHandler->error("Creating a new response and survey order"); $self->loadBothJSON($responseId); $self->response->createSurveyOrder(); $self->{responseId} = $responseId; $self->saveResponseJSON(); }else{ -$self->session->errorHandler->error("No responses left max=$allowedTakes used up=$haveTaken"); } } $self->{responseId} = $responseId; $self->loadBothJSON($responseId); - $self->session->errorHandler->error("Survey Response was ".$responseId); return $responseId; } @@ -962,7 +908,6 @@ sub canTakeSurvey{ return $self->{canTake} if(defined $self->{canTake}); -$self->session->errorHandler->error("Can take was NOT already defined"); if(!$self->session->user->isInGroup($self->get("groupToTakeSurvey"))){ return 0; @@ -982,15 +927,12 @@ $self->session->errorHandler->error("Can take was NOT already defined"); $takenCount = $self->session->db->quickScalar("select count(*) from Survey_response where userId = ? and assetId = ? and isComplete = ?",[$id,$self->getId(),1]); } - $self->session->errorHandler->error("userid is ".$id."\t and ip is ".$ip); - $self->session->errorHandler->error("max ".$maxTakes." taken ".$takenCount); if($takenCount >= $maxTakes){ $self->{canTake} = 0; }else{ $self->{canTake} = 1; } - $self->session->errorHandler->error("Can take survey returning ".$self->{canTake}); return $self->{canTake}; } diff --git a/lib/WebGUI/Asset/Wobject/Survey/Survey.sql b/lib/WebGUI/Asset/Wobject/Survey/Survey.sql deleted file mode 100644 index afefabbeb..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/Survey.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE TABLE `Survey` ( - `groupToTakeSurvey` varchar(22) character set utf8 collate utf8_bin NOT NULL default '2', - `groupToViewReports` varchar(22) character set utf8 collate utf8_bin NOT NULL default '3', - `responseTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `overviewTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `maxResponsesPerUser` int(11) NOT NULL default '1', - `gradebookTemplateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `templateId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `revisionDate` bigint(20) NOT NULL default '0', - `surveyEditTemplateId` varchar(22) NOT NULL, - `answerEditTemplateId` varchar(22) NOT NULL, - `questionEditTemplateId` varchar(22) NOT NULL, - `sectionEditTemplateId` varchar(22) NOT NULL, - `surveyTakeTemplateId` varchar(22) NOT NULL, - `surveyQuestionsId` varchar(22) NOT NULL, - `exitURL` varchar(512) default NULL, - `surveyJSON` longblob, - PRIMARY KEY (`assetId`,`revisionDate`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index 9e54a379c..483b62e2a 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -49,18 +49,18 @@ sub getDragDropList{ my $self = shift; my $address = shift; my @data; -#$self->log("dd'ing sections".$#{$self->sections}); +##$self->log("dd'ing sections".$#{$self->sections}); eval{ for(my $i = 0; $i <= $#{$self->sections}; $i++){ push(@data,{text=>$self->section([$i])->{title}, type=>'section'}); if($address->[0] == $i){ for(my $x = 0; $x <= $#{$self->questions($address)}; $x++){ -##$self->log("dd'ing questions".$#{$self->questions}); +###$self->log("dd'ing questions".$#{$self->questions}); push(@data,{text=>$self->question([$i,$x])->{text}, type=>'question'}); if($address->[1] == $x){ for(my $y = 0; $y <= $#{$self->answers($address)}; $y++){ -##$self->log("dd'ing answers".$#{$self->answers}); +###$self->log("dd'ing answers".$#{$self->answers}); push(@data,{text=>$self->answer([$i,$x,$y])->{text}, type=>'answer'}); } } @@ -68,8 +68,8 @@ eval{ } } }; -#$self->log($@); -##$self->log('finished dding'); +##$self->log($@); +###$self->log('finished dding'); return \@data; } @@ -150,14 +150,14 @@ sub update{ my $object; my $newQuestion = 0; if(@$address == 1){ -#$self->log("A section"); +##$self->log("A section"); $object = $self->section($address); if(! defined $object){ $object = $self->newSection(); push(@{$self->sections},$object); } }elsif(@$address == 2){ -#$self->log("A question"); +##$self->log("A question"); $object = $self->question($address); if(! defined $object){ my $newQuestion = 1; @@ -165,7 +165,7 @@ sub update{ push(@{$self->questions($address)},$object); } }elsif(@$address == 3){ -#$self->log("A answer"); +##$self->log("A answer"); $object = $self->answer($address); if(! defined $object){ $object = $self->newAnswer(); @@ -178,7 +178,7 @@ sub update{ } } for my $key(keys %$object){ -#$self->log("$key $$object{$key}"); +##$self->log("$key $$object{$key}"); $object->{$key} = $ref->{$key} if(defined $$ref{$key}); } } @@ -188,7 +188,7 @@ sub update{ # ref should contain all the information for the new sub insertObject{ my ($self,$object,$address) = @_; -#$self->log("Inserting ".join(',',@$address)); +##$self->log("Inserting ".join(',',@$address)); if(@$address == 1){ splice(@{$self->sections($address)},$$address[0] + 1, 0, $object); }elsif(@$address == 2){ @@ -196,7 +196,7 @@ sub insertObject{ }elsif(@$address == 3){ splice(@{$self->answers($address)},$$address[2] + 1, 0, $object); } -#$self->log("Finished inserting "); +##$self->log("Finished inserting "); } @@ -206,13 +206,13 @@ sub copy{ my %newSection = %{$self->section($address)}; push(@{$self->sections}, \%newSection); return [$#{$self->sections}]; -#$self->log("copying here $$address[0] :".$#{$self->sections}); +##$self->log("copying here $$address[0] :".$#{$self->sections}); }elsif(@$address == 2){ -#$self->log("copying question $$address[0] $$address[1]"); +##$self->log("copying question $$address[0] $$address[1]"); my %newQuestion = %{$self->question($address)}; push( @{$self->questions($address)}, \%newQuestion); $$address[1] = $#{$self->questions($address)}; -#$self->log("to $$address[0] $$address[1]"); +##$self->log("to $$address[0] $$address[1]"); return $address; } } @@ -221,14 +221,14 @@ sub copy{ sub remove{ my ($self,$address,$movingOverride) = @_; if(@$address == 1){ -#$self->log("removing here $$address[0] :".$#{$self->sections}) if($$address[0] != 0 or defined $movingOverride);; +##$self->log("removing here $$address[0] :".$#{$self->sections}) if($$address[0] != 0 or defined $movingOverride);; splice(@{$self->{sections}},$$address[0],1) if($$address[0] != 0 or defined $movingOverride);#can't delete the first section -#$self->log("removing here $$address[0] :".$#{$self->sections}); +##$self->log("removing here $$address[0] :".$#{$self->sections}); }elsif(@$address == 2){ -#$self->log("removing here $$address[0] $$address[1]"); +##$self->log("removing here $$address[0] $$address[1]"); splice(@{$self->questions($address)},$$address[1],1); }elsif(@$address == 3){ -#$self->log("removing here $$address[0] $$address[1] $$address[2]"); +##$self->log("removing here $$address[0] $$address[1] $$address[2]"); splice(@{$self->answers($address)},$$address[2],1); } } @@ -299,7 +299,7 @@ sub updateQuestionAnswers{ my $address = shift; my $type = shift; -#$self->log("In updateQuestion"); +##$self->log("In updateQuestion"); my @addy = @{$address}; my $question = $self->question($address); @@ -391,11 +391,11 @@ sub addAnswersToQuestion{ my $addy = shift; my $ans = shift; my $verbs = shift; -#$self->log(Dumper $verbs); +##$self->log(Dumper $verbs); for(0 .. $#$ans){ push(@{$self->question($addy)->{answers}},$self->newAnswer()); $$addy[2] = $_; -#$self->log("$_:".defined $$verbs{$_}." ".$$verbs{$_}); +##$self->log("$_:".defined $$verbs{$_}." ".$$verbs{$_}); if(defined $$verbs{$_} and $_ == $$verbs{$_}){ $self->update($addy,{'text',$$ans[$_],'recordedAnswer',$_+1,'verbatim',1}); }else{ diff --git a/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql b/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql deleted file mode 100644 index 008af27bf..000000000 --- a/lib/WebGUI/Asset/Wobject/Survey/Survey_response.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `Survey_response` ( - `assetId` varchar(22) character set utf8 collate utf8_bin NOT NULL, - `Survey_responseId` varchar(22) character set utf8 collate utf8_bin NOT NULL default '', - `userId` varchar(22) default NULL, - `username` varchar(255) default NULL, - `ipAddress` varchar(15) default NULL, - `startDate` bigint(20) NOT NULL default '0', - `endDate` bigint(20) NOT NULL default '0', - `isComplete` int(11) NOT NULL default '0', - `anonId` varchar(255) default NULL, - `responseJSON` longblob, - PRIMARY KEY (`Survey_responseId`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8 diff --git a/lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar b/lib/WebGUI/Asset/Wobject/Survey/survey_templates.tar deleted file mode 100644 index 3a5a97f37b7df72fac7c393c57d2aa89a2813c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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