Merge commit 'tags/WebGUI_7.6.8-beta' into survey-rfe

* commit 'tags/WebGUI_7.6.8-beta': (96 commits)
  Release 7.6.8-beta
  preparing for 7.6.8 release
  convert to new storage format
  fixing photo comment test
  fixed: Syndicated Content corrupts wide characters
  Add the WikiPage to the list of contributions shown in the Account Contributions tab.
  added #!/usr/bin/env perl to all utility scripts
  Forward port i18n fix for Gallery Album RSS list.
  Fix some Survey i18n typos in the time limit hoverhelp.
  Large batch of Help and i18n.  Also, make sure that the
  Fix a typo in the i18n help for the ITransact Pay Driver.
  Correct dataform captcha variable name in the help.
  Forward porting expanded patch for handling deleted things.
  Have Thingy check for existance of table and column to prevent
  Fix linking to other things and autocreating the form field for it.
  Update test to match fixed code.
  Remove the warnings pragma
  Only resize photos if they are larger than the Gallery resolutions.
  Fix a syntax error made in the i18n of the search button.
  I18n'ed a submit button in the manage transactions screen.
  ...

Conflicts:

	lib/WebGUI/Asset/Wobject/Survey.pm
	lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm
	www/extras/wobject/Survey/editsurvey.js
	www/extras/wobject/Survey/editsurvey/object.js
This commit is contained in:
Patrick Donelan 2009-01-14 06:00:06 +00:00
commit b7520da07d
396 changed files with 2647 additions and 1186 deletions

View file

@ -584,26 +584,31 @@ sub getEditForm {
</script>
ENDJS
$tab->raw(<<'ENDHTML');
<label for="addFeed">Add a feed</label>
my $addFeed = $i18n->get('Add a feed');
my $add = $i18n->get('Add');
my $feedUrl = $i18n->get('Feed URL');
my $status = $i18n->get('434', 'WebGUI');
my $lastUpdated = $i18n->get('454', 'WebGUI');
$tab->raw(<<"ENDHTML");
<label for="addFeed">$addFeed</label>
<input type="text" size="60" id="addFeed" name="addFeed" value="" />
<input type="button" value="Add" onclick="FeedsManager.addFeed('feeds','new',{ 'url' : this.form.addFeed.value }); this.form.addFeed.value=''" />
<input type="button" value="$add" onclick="FeedsManager.addFeed('feeds','new',{ 'url' : this.form.addFeed.value }); this.form.addFeed.value=''" />
<table id="feeds" style="width: 100%;">
<thead>
<th style="width: 30px;">&nbsp;</th>
<th style="width: 50%;">Feed URL</th>
<th>Status</th>
<th>Last Updated</th>
<th style="width: 50%;">$feedUrl</th>
<th>$status</th>
<th>$lastUpdated</th>
<th>&nbsp;</th>
</thead>
</table>
ENDHTML
# Add the existing feeds
my $feeds = $self->getFeeds();
$tab->raw('<script type="text/javascript">'."\n");
@ -612,8 +617,8 @@ ENDHTML
$tab->raw("FeedsManager.addFeed('feeds','".$feedId."',".JSON->new->encode( \%row ).");\n");
}
$tab->raw('</script>');
$tab->raw("</td></tr>");
return $form;
}

View file

@ -1164,18 +1164,21 @@ sub www_editField {
#-------------------------------------------------------------------
sub www_editFieldSave {
my $self = shift;
return $self->session->privilege->insufficient
my $session = $self->session;
return $session->privilege->insufficient
unless $self->canEdit;
my $form = $self->session->form;
my $form = $session->form;
my $fieldName = $form->process('fieldName');
my $newName = $self->session->url->urlize($form->process('newName') || $form->process('label'));
my $newName = $session->url->urlize($form->process('newName') || $form->process('label'));
$newName =~ tr{-/}{};
# Make sure we don't rename special fields
my $isMailField = 0;
if ($fieldName) {
my $field = $self->getFieldConfig($fieldName);
if ($field->{isMailField}) {
$newName = $fieldName;
$isMailField = 1;
}
}
@ -1202,6 +1205,9 @@ sub www_editFieldSave {
vertical => $form->process("vertical", 'yesNo'),
extras => $form->process("extras"),
);
if ($isMailField) {
$field{isMailField} = 1;
}
my $newSelf = $self->addRevision;
if ($fieldName) {

View file

@ -346,7 +346,7 @@ sub DESTROY {
my $self = shift;
for my $key ( qw/ _nextAlbum _prevAlbum / ) {
my $asset = delete $self->{ $key };
$asset->DESTROY;
$asset->DESTROY if $asset;
}
}
@ -881,6 +881,8 @@ sub www_addArchive {
my $form = $self->session->form;
my $var = $self->getTemplateVars;
my $i18n = WebGUI::International->new($session);
$var->{ error } = $params->{ error };
$var->{ form_start }
@ -893,7 +895,7 @@ sub www_addArchive {
$var->{ form_submit }
= WebGUI::Form::submit( $session, {
name => "submit",
value => "Submit",
value => $i18n->get("submit",'WebGUI'),
});
$var->{ form_archive }

View file

@ -1021,6 +1021,7 @@ sub www_getCompareListData {
my $self = shift;
my @listingIds = @_;
my $session = $self->session;
my $i18n = WebGUI::International->new($session,'Asset_Matrix');
my (@results,@columnDefs);
unless (scalar(@listingIds)) {
@ -1034,10 +1035,16 @@ sub www_getCompareListData {
$listing->incrementCounter("compares");
my $listingId_safe = $listingId;
$listingId_safe =~ s/-/_____/g;
push(@columnDefs,{key=>$listingId_safe,label=>$listing->get('title'),formatter=>"formatColors",
url=>$listing->getUrl});
push(@columnDefs,{
key =>$listingId_safe,
label =>$listing->get('title').' '.$listing->get('version'),
formatter =>"formatColors",
url =>$listing->getUrl,
lastUpdated =>$session->datetime->epochToHuman( $listing->get('revisonDate'),"%z" ),
});
}
push(@results,{name=>$i18n->get('last updated label'),fieldType=>'lastUpdated'});
my $jsonOutput;
$jsonOutput->{ColumnDefs} = \@columnDefs;
@ -1061,10 +1068,16 @@ sub www_getCompareListData {
}
foreach my $result (@results){
if($result->{fieldType} eq 'category'){
# Row starting with a category label shows the listing name in each column
foreach my $columnDef (@columnDefs) {
$result->{$columnDef->{key}} = $columnDef->{label};
}
}
elsif($result->{fieldType} eq 'lastUpdated'){
foreach my $columnDef (@columnDefs) {
$result->{$columnDef->{key}} = $columnDef->{lastUpdated};
}
}
else{
foreach my $listingId (@listingIds) {
$result->{attributeId} =~ s/-/_____/g;

View file

@ -405,10 +405,6 @@ sub view {
my $previousPageData = undef;
my $eh = $self->session->errorHandler;
foreach my $asset (@{$assets}) {
# Set absoluteDepthOfFirstPage
if ( !defined $absoluteDepthOfFirstPage ) {
$absoluteDepthOfFirstPage = $asset->getLineageLength;
}
# skip pages we shouldn't see
my $pageLineage = $asset->get("lineage");
@ -426,6 +422,13 @@ sub view {
$lineageToSkip = $pageLineage unless ($pageLineage eq "000001");
next;
}
# Set absoluteDepthOfFirstPage after we have determined if the first page is viewable!
# Otherwise, the indent loop calculation below will be off by 1 (or more)
if ( !defined $absoluteDepthOfFirstPage ) {
$absoluteDepthOfFirstPage = $asset->getLineageLength;
}
my $pageData = {};
my $pageProperties = $asset->get;
while (my ($property, $propertyValue) = each %{ $pageProperties }) {

View file

@ -27,170 +27,196 @@ our @ISA = qw(WebGUI::Asset::Wobject);
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my $i18n = WebGUI::International->new($session,"Asset_SQLReport");
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
uiLevel => 5,
icon=>'sqlReport.gif',
tableName=>'SQLReport',
className=>'WebGUI::Asset::Wobject::SQLReport',
properties=>{
templateId =>{
fieldType=>"template",
defaultValue=>'PBtmpl0000000000000059'
},
cacheTimeout=>{
fieldType=>"interval",
defaultValue=>0
},
paginateAfter=>{
fieldType=>"integer",
defaultValue=>50
},
dbQuery1=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef,
},
prequeryStatements1=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
preprocessMacros1=>{
fieldType=>"yesNo",
defaultValue=>0
},
placeholderParams1=>{
fieldType=>"textarea",
defaultValue=>undef
},
databaseLinkId1=>{
fieldType=>"databaseLink",
defaultValue=>0
},
dbQuery2=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
prequeryStatements2=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
preprocessMacros2=>{
fieldType=>"yesNo",
defaultValue=>0
},
placeholderParams2=>{
fieldType=>"textarea",
defaultValue=>undef
},
databaseLinkId2=>{
fieldType=>"databaseLink",
defaultValue=>0
},
dbQuery3=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
prequeryStatements3=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
preprocessMacros3=>{
fieldType=>"yesNo",
defaultValue=>0
},
placeholderParams3=>{
fieldType=>"textarea",
defaultValue=>undef
},
databaseLinkId3=>{
fieldType=>"databaseLink",
defaultValue=>0
},
dbQuery4=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
prequeryStatements4=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
preprocessMacros4=>{
fieldType=>"yesNo",
defaultValue=>0
},
placeholderParams4=>{
fieldType=>"textarea",
defaultValue=>undef
},
databaseLinkId4=>{
fieldType=>"databaseLink",
defaultValue=>0
},
dbQuery5=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
prequeryStatements5=>{
fieldType=>"codearea",
syntax => "sql",
defaultValue=>undef
},
preprocessMacros5=>{
fieldType=>"yesNo",
defaultValue=>0
},
placeholderParams5=>{
fieldType=>"textarea",
defaultValue=>undef
},
databaseLinkId5=>{
fieldType=>"databaseLink",
defaultValue=>0
},
debugMode=>{
fieldType=>"yesNo",
defaultValue=>0
},
# download
downloadType=>{
fieldType=>"text",
defaultValue=>"none",
},
downloadFilename=>{
fieldType=>"text",
defaultValue=>"",
},
downloadTemplateId=>{
fieldType=>"template",
defaultValue=>'SQLReportDownload00001',
},
downloadMimeType=>{
fieldType=>"text",
defaultValue=>"text/html",
},
downloadUserGroup=>{
fieldType=>"group",
defaultValue=>"text/html",
},
}
});
return $class->SUPER::definition($session, $definition);
my $class = shift;
my $session = shift;
my $definition = shift;
my $i18n = WebGUI::International->new($session,"Asset_SQLReport");
my %properties;
tie %properties, 'Tie::IxHash';
%properties = (
templateId =>{
fieldType=>"template",
defaultValue=>'PBtmpl0000000000000059',
label=>$i18n->get(72),
},
cacheTimeout=>{
fieldType=>"interval",
defaultValue=>0,
label=>$i18n->get('cache timeout'),
},
paginateAfter=>{
fieldType=>"integer",
defaultValue=>50,
label=>$i18n->get(14),
},
dbQuery1=>{
fieldType=>"codearea",
defaultValue=>undef,
label=>$i18n->get(4) . ' 1',
},
prequeryStatements1=>{
fieldType=>"codearea",
defaultValue=>undef,
label => $i18n->get('Prequery statements') . ' 1',
},
preprocessMacros1=>{
fieldType=>"yesNo",
defaultValue=>0,
label=>$i18n->get(15) . ' 1',
},
placeholderParams1=>{
fieldType=>"textarea",
defaultValue=>undef,
label=>$i18n->get('Placeholder Parameters') . ' 1',
},
databaseLinkId1=>{
fieldType=>"databaseLink",
defaultValue=>0,
label=>$i18n->get("1075", 'WebGUI').' 1',
},
dbQuery2=>{
fieldType=>"codearea",
defaultValue=>undef,
label=>$i18n->get(4) . ' 2',
},
prequeryStatements2=>{
fieldType=>"codearea",
defaultValue=>undef,
label => $i18n->get('Prequery statements') . ' 2',
},
preprocessMacros2=>{
fieldType=>"yesNo",
defaultValue=>0,
label=>$i18n->get(15) . ' 2',
},
placeholderParams2=>{
fieldType=>"textarea",
defaultValue=>undef,
label=>$i18n->get('Placeholder Parameters') . ' 2',
},
databaseLinkId2=>{
fieldType=>"databaseLink",
defaultValue=>0,
label=>$i18n->get("1075", 'WebGUI').' 2',
},
dbQuery3=>{
fieldType=>"codearea",
defaultValue=>undef,
label=>$i18n->get(4) . ' 3',
},
prequeryStatements3=>{
fieldType=>"codearea",
defaultValue=>undef,
label => $i18n->get('Prequery statements') . ' 3',
},
preprocessMacros3=>{
fieldType=>"yesNo",
defaultValue=>0,
label=>$i18n->get(15) . ' 3',
},
placeholderParams3=>{
fieldType=>"textarea",
defaultValue=>undef,
label=>$i18n->get('Placeholder Parameters') . ' 3',
},
databaseLinkId3=>{
fieldType=>"databaseLink",
defaultValue=>0,
label=>$i18n->get("1075", 'WebGUI').' 3',
},
dbQuery4=>{
fieldType=>"codearea",
defaultValue=>undef,
label=>$i18n->get(4) . ' 4',
},
prequeryStatements4=>{
fieldType=>"codearea",
defaultValue=>undef,
label => $i18n->get('Prequery statements') . ' 4',
},
preprocessMacros4=>{
fieldType=>"yesNo",
defaultValue=>0,
label=>$i18n->get(15) . ' 4',
},
placeholderParams4=>{
fieldType=>"textarea",
defaultValue=>undef,
label=>$i18n->get('Placeholder Parameters') . ' 4',
},
databaseLinkId4=>{
fieldType=>"databaseLink",
defaultValue=>0,
label=>$i18n->get("1075", 'WebGUI').' 4',
},
dbQuery5=>{
fieldType=>"codearea",
defaultValue=>undef,
label=>$i18n->get(4) . ' 5',
},
prequeryStatements5=>{
fieldType=>"codearea",
defaultValue=>undef,
label => $i18n->get('Prequery statements') . ' 5',
},
preprocessMacros5=>{
fieldType=>"yesNo",
defaultValue=>0,
label=>$i18n->get(15) . '5',
},
placeholderParams5=>{
fieldType=>"textarea",
defaultValue=>undef,
label=>$i18n->get('Placeholder Parameters') . ' 5',
},
databaseLinkId5=>{
fieldType=>"databaseLink",
defaultValue=>0,
label=>$i18n->get("1075", 'WebGUI').' 5',
},
debugMode=>{
fieldType=>"yesNo",
defaultValue=>0,
label=>$i18n->get(16),
},
# download
downloadType=>{
fieldType=>"text",
defaultValue=>"none",
label=>$i18n->get("download type"),
},
downloadFilename=>{
fieldType=>"text",
defaultValue=>"",
label=>$i18n->get("download filename"),
},
downloadTemplateId=>{
fieldType=>"template",
defaultValue=>'SQLReportDownload00001',
label=>$i18n->get("download template"),
},
downloadMimeType=>{
fieldType=>"text",
defaultValue=>"text/html",
label=>$i18n->get("download mimetype"),
},
downloadUserGroup=>{
fieldType=>"group",
defaultValue=>"text/html",
label=>$i18n->get("download usergroup"),
},
);
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
uiLevel => 5,
icon=>'sqlReport.gif',
tableName=>'SQLReport',
className=>'WebGUI::Asset::Wobject::SQLReport',
properties => \%properties,
autoGenerateForms => 0,
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------

View file

@ -39,23 +39,23 @@ sub definition {
label => "Template ID"
},
showProgress => {
fieldType => "yesNo",
fieldType => "yesNo",
defaultValue => 0,
tab => 'properties',
label => "Show user their progress"
tab => 'properties',
label => "Show user their progress"
},
showTimeLimit => {
fieldType => "yesNo",
fieldType => "yesNo",
defaultValue => 0,
tab => 'properties',
label => "Show user their time remaining"
tab => 'properties',
label => "Show user their time remaining"
},
timeLimit => {
fieldType => 'integer',
timeLimit => {
fieldType => 'integer',
defaultValue => 0,
tab => 'properties',
hoverHelp => $i18n->get('timelimit hoverHelp'),
label => $i18n->get('timelimit')
tab => 'properties',
hoverHelp => $i18n->get('timelimit hoverHelp'),
label => $i18n->get('timelimit')
},
groupToEditSurvey => {
fieldType => 'group',
@ -260,9 +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')));
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
my %var;
my $out = $self->processTemplate( \%var, $self->get("surveyEditTemplateId") );
@ -273,9 +273,9 @@ sub www_editSurvey {
#-------------------------------------------------------------------
sub www_submitObjectEdit {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
# my $ref = @{from_json($self->session->form->process("data"))};
my $responses = $self->session->form->paramsHashRef();
@ -299,14 +299,14 @@ sub www_submitObjectEdit {
} ## end sub www_submitObjectEdit
#-------------------------------------------------------------------
=head2 Allow survey editors to "jump to" a particular section of question in a
=head2 Allow survey editors to "jump to" a particular section of question in a
Survey by tricking Survey into thinking they've completed the survey up to that
point. Useful for survey builders.
Note that calling this method will delete any existing survey responses for the
current user (although only survey builders can call this method so that shouldn't be
a problem
=cut
sub www_jumpTo {
my $self = shift;
@ -314,7 +314,7 @@ sub www_jumpTo {
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
my $data = $self->session->form->paramsHashRef();
$self->session->log->debug("jumpTo to $data->{id}");
# Remove existing responses for current user
@ -387,10 +387,10 @@ sub deleteObject {
#-------------------------------------------------------------------
sub www_newObject {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
my $ref;
my $ids = $self->session->form->process("data");
@ -411,11 +411,11 @@ sub www_newObject {
#-------------------------------------------------------------------
sub www_dragDrop {
my $self = shift;
return $self->session->privilege->insufficient()
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
my $p = from_json( $self->session->form->process("data") );
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
my $p = from_json( $self->session->form->process("data") );
my @tid = split /-/, $p->{target}->{id};
my @bid = split /-/, $p->{before}->{id};
@ -463,6 +463,7 @@ sub www_dragDrop {
$self->survey->insertObject( $target, [ $bid[0], $bid[1], $bid[2] ] );
}
else {
#else put it back where it was
$self->survey->insertObject( $target, \@tid );
}
@ -476,13 +477,19 @@ sub www_dragDrop {
#-------------------------------------------------------------------
sub www_loadSurvey {
my ( $self, $options ) = @_;
my $editflag = 1;
$self->loadSurveyJSON();
my $address = defined $options->{address} ? $options->{address} : undef;
if ( !defined $address ) {
if ( my $inAddress = $self->session->form->process("data") ) {
$address = [ split /-/, $inAddress ];
if( $inAddress eq '-' ) {
$editflag = 0;
$address = [ 0 ];
} else {
$address = [ split /-/, $inAddress ];
}
}
else {
$address = [0];
@ -504,7 +511,7 @@ sub www_loadSurvey {
elsif ( $var->{type} eq 'answer' ) {
$editHtml = $self->processTemplate( $var, $self->get("answerEditTemplateId") );
}
# Generate the list of valid goto targets
my @gotoTargets = $self->survey->getGotoTargets;
@ -559,9 +566,10 @@ sub www_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},
gotoTargets => \@gotoTargets,
"address", $address, "buttons", \%buttons,
"edithtml", $editflag ? $editHtml : '',
"ddhtml", $html, "ids", \@ids, "type", $var->{type}
,gotoTargets => \@gotoTargets,
};
$self->session->http->setMimeType('application/json');
return to_json($return);
@ -631,19 +639,90 @@ sub view {
my $self = shift;
my %var;
$var{'edit_survey_url'} = $self->getUrl('func=editSurvey');
$var{'take_survey_url'} = $self->getUrl('func=takeSurvey');
$var{'view_simple_results_url'} = $self->getUrl('func=exportSimpleResults');
$var{'view_transposed_results_url'} = $self->getUrl('func=exportTransposedResults');
$var{'view_statistical_overview_url'} = $self->getUrl('func=viewStatisticalOverview');
$var{'view_grade_book_url'} = $self->getUrl('func=viewGradeBook');
$var{'user_canTakeSurvey'} = $self->session->user->isInGroup( $self->get("groupToTakeSurvey") );
$var{'user_canViewReports'} = $self->session->user->isInGroup( $self->get("groupToViewReports") );
$var{'user_canEditSurvey'} = $self->session->user->isInGroup( $self->get("groupToEditSurvey") );
$var{'edit_survey_url'} = $self->getUrl('func=editSurvey');
$var{'take_survey_url'} = $self->getUrl('func=takeSurvey');
$var{'view_simple_results_url'} = $self->getUrl('func=exportSimpleResults');
$var{'view_transposed_results_url'} = $self->getUrl('func=exportTransposedResults');
$var{'view_statistical_overview_url'} = $self->getUrl('func=viewStatisticalOverview');
$var{'view_grade_book_url'} = $self->getUrl('func=viewGradeBook');
$var{'user_canTakeSurvey'} = $self->session->user->isInGroup( $self->get("groupToTakeSurvey") );
$var{'user_canViewReports'} = $self->session->user->isInGroup( $self->get("groupToViewReports") );
$var{'user_canEditSurvey'} = $self->session->user->isInGroup( $self->get("groupToEditSurvey") );
$var{'user_canEditSurvey'} = $self->session->user->isInGroup( $self->get("groupToEditSurvey") );
my ( $code, $overTakeLimit ) = $self->getResponseInfoForView();
$var{'lastResponseCompleted'} = $code;
$var{'lastResponseTimedOut'} = $code > 1 ? 1 : 0;
$var{'maxResponsesSubmitted'} = $overTakeLimit;
my $out = $self->processTemplate( \%var, undef, $self->{_viewTemplate} );
return $out;
}
} ## end sub view
#-------------------------------------------------------------------
=head2 getResponseInfoForView ( )
Looks to see if this user has a response, looks at the last one to see if it was completed or timed out.
Then it checks to see if the user has reached the max number of responses.
=cut
sub getResponseInfoForView {
my $self = shift;
my ( $code, $taken );
my $maxTakes = $self->getValue("maxResponsesPerUser");
my $id = $self->session->user->userId();
my $anonId
= $self->session->form->process("userid")
|| $self->session->http->getCookies->{"Survey2AnonId"}
|| undef;
$self->session->http->setCookie( "Survey2AnonId", $anonId ) if ($anonId);
my $ip = $self->session->env->getIp;
my $string;
#if there is an anonid or id is for a WG user
if ( $anonId or $id != 1 ) {
$string = 'userId';
if ($anonId) {
$string = 'anonId';
$id = $anonId;
}
my $responseId
= $self->session->db->quickScalar(
"select Survey_responseId from Survey_response where $string = ? and assetId = ? and isComplete = 0",
[ $id, $self->getId() ] );
if ( !$responseId ) {
$code = $self->session->db->quickScalar(
"select isComplete from Survey_response where $string = ? and assetId = ? and isComplete > 0 order by endDate desc limit 1",
[ $id, $self->getId() ]
);
}
$taken
= $self->session->db->quickScalar(
"select count(*) from Survey_response where $string = ? and assetId = ? and isComplete > 0",
[ $id, $self->getId() ] );
} ## end if ( $anonId or $id !=...
elsif ( $id == 1 ) {
my $responseId = $self->session->db->quickScalar(
"select Survey_responseId from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete = 0",
[ $id, $ip, $self->getId() ]
);
if ( !$responseId ) {
$code = $self->session->db->quickScalar(
"select isComplete from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete > 0 order by endDate desc limit 1",
[ $id, $ip, $self->getId() ]
);
}
$taken = $self->session->db->quickScalar(
"select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete > 0",
[ $id, $ip, $self->getId() ]
);
} ## end elsif ( $id == 1 )
return ( $code, $taken >= $maxTakes );
} ## end sub getResponseInfoForView
#-------------------------------------------------------------------
@ -667,24 +746,26 @@ sub www_takeSurvey {
my $responseId = $self->getResponseId();
if ( !$responseId ) {
$self->session->log->debug('No responseId, surveyEnd');
# return $self->surveyEnd(); # disabled. let the js handle the exitUrl redirection
} else {
# 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"));
}
return $self->session->style->process( $out, $self->get("styleTemplateId") );
} ## end sub www_takeSurvey
#-------------------------------------------------------------------
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 where assetId = ?',[$self->getId]);
return $self->session->privilege->insufficient()
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
$self->session->db->write( 'delete from Survey_response where assetId = ?', [ $self->getId ] );
return;
}
@ -702,7 +783,7 @@ sub www_submitQuestions {
my $responseId = $self->getResponseId();
if ( !$responseId ) {
$self->session->log->debug('No response id, surveyEnd');
return $self->surveyEnd();
return $self->surveyEnd();
}
my $responses = $self->session->form->paramsHashRef();
@ -712,7 +793,7 @@ sub www_submitQuestions {
$self->loadBothJSON();
my $termInfo = $self->response->recordResponses($self->session, $responses);
my $termInfo = $self->response->recordResponses( $self->session, $responses );
$self->saveResponseJSON();
@ -770,9 +851,9 @@ sub www_loadQuestions {
$self->session->log->debug('No responseId, surveyEnd');
return $self->surveyEnd();
}
if($self->response->hasTimedOut($self->get('timeLimit'))){
if ( $self->response->hasTimedOut( $self->get('timeLimit') ) ) {
$self->session->log->debug('Response hasTimedOut, surveyEnd');
return $self->surveyEnd();
return $self->surveyEnd( undef, 2 );
}
if ( $self->response->surveyEnd() ) {
@ -792,19 +873,41 @@ sub www_loadQuestions {
} ## end sub www_loadQuestions
#-------------------------------------------------------------------
#called when the survey is over.
=head2 surveyEnd ( [ $url ], [ $completeCode ] )
Marks the survey completed with either 1 or the $completeCode and then sends the url to the site home or if defined, $url.
=head3 $url
An optional url to send the user to upon survey completion.
=head3 $completeCode
An optional code (defaults to 1) to say how the user completed the survey.
1 is normal completion.
2 is timed out.
=cut
sub surveyEnd {
my $self = shift;
my $url = shift;
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]);
my $self = shift;
my $url = shift;
my $completeCode = shift;
$completeCode = defined $completeCode ? $completeCode : 1;
if ( my $responseId = $self->getResponseId() ) { #also loads the survey and response
# $self->session->db->write("update Survey_response set endDate = ? and isComplete > 0 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
endDate => time(), #WebGUI::DateTime->now->toDatabase,
isComplete => $completeCode
}
);
}
@ -819,8 +922,9 @@ sub surveyEnd {
$url = "/";
}
}
# $self->session->http->setRedirect($url);
return to_json({ "type", "forward", "url", $url });
# $self->session->http->setRedirect($url);
return to_json( { "type", "forward", "url", $url } );
} ## end sub surveyEnd
#-------------------------------------------------------------------
@ -867,12 +971,13 @@ sub prepareShowSurveyTemplate {
$$q{'verte'} = "</p>";
}
} ## end foreach my $q (@$questions)
$section->{'questions'} = $questions;
$section->{'questions'} = $questions;
$section->{'questionsAnswered'} = $self->response->{questionsAnswered};
$section->{'totalQuestions'} = @{$self->response->surveyOrder};
$section->{'showProgress'} = $self->get('showProgress');
$section->{'showTimeLimit'} = $self->get('showTimeLimit');
$section->{'minutesLeft'} = int((($self->response->startTime() + (60 * $self->get('timeLimit'))) - time())/60);
$section->{'totalQuestions'} = @{ $self->response->surveyOrder };
$section->{'showProgress'} = $self->get('showProgress');
$section->{'showTimeLimit'} = $self->get('showTimeLimit');
$section->{'minutesLeft'}
= int( ( ( $self->response->startTime() + ( 60 * $self->get('timeLimit') ) ) - time() ) / 60 );
if(scalar @$questions == ($section->{'totalQuestions'} - $section->{'questionsAnswered'})){
$section->{isLastPage} = 1
@ -1000,8 +1105,8 @@ sub getResponseId {
userId => $id,
ipAddress => $ip,
username => $self->session->user->username,
startDate => $time,#WebGUI::DateTime->now->toDatabase,
endDate => 0,#WebGUI::DateTime->now->toDatabase,
startDate => $time, #WebGUI::DateTime->now->toDatabase,
endDate => 0, #WebGUI::DateTime->now->toDatabase,
assetId => $self->getId(),
anonId => $anonId
}
@ -1010,7 +1115,7 @@ sub getResponseId {
$self->response->createSurveyOrder();
$self->{responseId} = $responseId;
$self->saveResponseJSON();
} ## end if ( $haveTaken < $allowedTakes)
else {
$self->session->log->debug("haveTaken ($haveTaken) >= allowedTakes ($allowedTakes)");
@ -1041,14 +1146,14 @@ sub canTakeSurvey {
if ( $id == 1 ) {
$takenCount = $self->session->db->quickScalar(
"select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ?
and isComplete = ?", [ $id, $ip, $self->getId(), 1 ]
and isComplete > ?", [ $id, $ip, $self->getId(), 0 ]
);
}
else {
$takenCount
= $self->session->db->quickScalar(
"select count(*) from Survey_response where userId = ? and assetId = ? and isComplete = ?",
[ $id, $self->getId(), 1 ] );
"select count(*) from Survey_response where userId = ? and assetId = ? and isComplete > ?",
[ $id, $self->getId(), 0 ] );
}
if ( $takenCount >= $maxTakes ) {
@ -1060,32 +1165,36 @@ sub canTakeSurvey {
return $self->{canTake};
} ## end sub canTakeSurvey
#-------------------------------------------------------------------
sub www_viewGradeBook{
sub www_viewGradeBook {
my $self = shift;
return $self->session->privilege->insufficient()
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 @peoples
= $self->session->db->quickArray( "SELECT UNIQUE(Survey_responseId) from Survey_tempReport where assetId = ?",
[ $self->getId() ] );
for my $people (@peoples) {
#my $
}
}
} ## end sub www_viewGradeBook
#-------------------------------------------------------------------
sub www_exportSimpleResults{
sub www_exportSimpleResults {
my $self = shift;
return $self->session->privilege->insufficient()
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

@ -856,7 +856,7 @@ Logs an error to the webgui log file, using the session logger.
sub log {
my ( $self, $message) = @_;
if ( defined $self->{log} ) {
$self->{log}->error($message);
$self->{log}->debug($message);
}
}

View file

@ -320,10 +320,10 @@ sub getSectionEditVars {
sub getGotoTargets {
my $self = shift;
my @section_vars = map {$_->{variable}} @{$self->sections};
my @question_vars = map {$_->{variable}} @{$self->questions};
return grep {$_ ne ''} (@section_vars, @question_vars);
return grep {$_ ne ''} (@section_vars, @question_vars);
}
=head2 getQuestionEditVars ( $address )

View file

@ -143,10 +143,14 @@ sub generateFeed {
my $cache = WebGUI::Cache->new($self->session, $url, "RSS");
my $value = $cache->get;
unless ($value) {
$value = $cache->setByHTTP($url, $self->get("cacheTimeout"));
$value = $cache->setByHTTP($url, $self->get("cacheTimeout"));
$newlyCached = 1;
}
eval { $feed->merge($value) };
utf8::downgrade($value);
eval {
my $singleFeed = XML::FeedPP->new($value, utf8_flag => 1);
$feed->merge($singleFeed);
};
if (my $e = WebGUI::Error->caught()) {
$log->error("Syndicated Content asset (".$self->getId.") has a bad feed URL (".$url."). Failed with ".$e->message);
}

View file

@ -19,6 +19,7 @@ use WebGUI::Text;
use WebGUI::Form::File;
use WebGUI::DateTime;
use base 'WebGUI::Asset::Wobject';
use Data::Dumper;
#-------------------------------------------------------------------
@ -200,6 +201,38 @@ sub canViewThing {
#-------------------------------------------------------------------
=head2 badOtherThing ( tableName, fieldName )
Checks that the table and field for the other Thing are okay. Returns 0 if okay,
otherwise, returns an i18n message appropriate for the type of error, like the
table or the field in the table not existing.
=head3 tableName
The table name for the other thing.
=head3 fieldName
The field in the other thing to check for.
=cut
sub badOtherThing {
my ($self, $tableName, $fieldName) = @_;
my $session = $self->session;
my $db = $session->db;
my $i18n = WebGUI::International->new($session, 'Asset_Thingy');
my ($otherThingTableExists) = $db->quickArray('show tables like ?',[$tableName]);
return $i18n->get('other thing missing message') unless $otherThingTableExists;
my ($otherThingFieldExists) = $db->quickArray(
sprintf('show columns from %s like ?', $db->dbh->quote_identifier($tableName)),
[$fieldName]);
return $i18n->get('other thing field missing message') unless $otherThingFieldExists;
return undef;
}
#-------------------------------------------------------------------
=head2 definition ( )
defines wobject properties for Thingy instances. If you choose to "autoGenerateForms", the
@ -803,10 +836,11 @@ sub getFieldValue {
my $otherThingId = $field->{fieldType};
$otherThingId =~ s/^otherThing_//x;
my $tableName = 'Thingy_'.$otherThingId;
my ($otherThingTableExists) = $self->session->db->quickArray('show tables like ?',[$tableName]);
if ($otherThingTableExists){
my $fieldName = 'field_'.$field->{fieldInOtherThingId};
my $badThing = $self->badOtherThing($tableName, $fieldName);
if (! $badThing){
($processedValue) = $self->session->db->quickArray('select '
.$dbh->quote_identifier('field_'.$field->{fieldInOtherThingId})
.$dbh->quote_identifier($fieldName)
.' from '.$dbh->quote_identifier($tableName)
.' where thingDataId = ?',[$value]);
}
@ -840,9 +874,10 @@ sub getFormElement {
my $self = shift;
my $data = shift;
my %param;
my $db = $self->session->db;
my $session = $self->session;
my $db = $session->db;
my $dbh = $db->dbh;
my $i18n = WebGUI::International->new($self->session,"Asset_Thingy");
my $i18n = WebGUI::International->new($session,"Asset_Thingy");
$param{name} = "field_".$data->{fieldId};
my $name = $param{name};
@ -865,7 +900,7 @@ sub getFormElement {
if (WebGUI::Utility::isIn($data->{fieldType},qw(SelectList CheckList SelectBox Attachments))) {
my @defaultValues;
if ($self->session->form->param($name)) {
@defaultValues = $self->session->form->selectList($name);
@defaultValues = $session->form->selectList($name);
}
else {
foreach (split(/\n/x, $data->{value})) {
@ -881,7 +916,7 @@ sub getFormElement {
if ($class->isa('WebGUI::Form::List')) {
delete $param{size};
my $values = WebGUI::Operation::Shared::secureEval($self->session,$data->{possibleValues});
my $values = WebGUI::Operation::Shared::secureEval($session,$data->{possibleValues});
if (ref $values eq 'HASH') {
$param{options} = $values;
}
@ -909,30 +944,30 @@ sub getFormElement {
my $otherThingId = $data->{fieldType};
$otherThingId =~ s/^otherThing_(.*)/$1/x;
$param{fieldType} = "SelectList";
$class = 'WebGUI::Form::'. $param{fieldType};
my $options = ();
my $tableName = 'Thingy_'.$otherThingId;
my ($otherThingTableExists) = $db->quickArray('show tables like ?',[$tableName]);
if ($otherThingTableExists){
$options = $db->buildHashRef('select thingDataId, '
.$dbh->quote_identifier('field_'.$data->{fieldInOtherThingId})
.' from '.$dbh->quote_identifier($tableName));
my $value = $data->{value} || $data->{defaultValue};
($param{value}) = $db->quickArray('select '
.$dbh->quote_identifier('field_'.$data->{fieldInOtherThingId})
.' from '.$dbh->quote_identifier($tableName)
.' where thingDataId = ?',[$value]);
}
else{
return $i18n->get('other thing missing message');
}
my $fieldName = 'field_'.$data->{fieldInOtherThingId};
my $errorMessage = $self->badOtherThing($tableName, $fieldName);
return $errorMessage if $errorMessage;
$options = $db->buildHashRef('select thingDataId, '
.$dbh->quote_identifier($fieldName)
.' from '.$dbh->quote_identifier($tableName));
my $value = $data->{value} || $data->{defaultValue};
($param{value}) = $db->quickArray('select '
.$dbh->quote_identifier($fieldName)
.' from '.$dbh->quote_identifier($tableName)
.' where thingDataId = ?',[$value]);
$param{size} = 1;
$param{multiple} = 0;
$param{options} = $options;
$param{value} = $data->{value} || $data->{defaultValue};
}
my $formElement = eval { WebGUI::Pluggable::instanciate($class, "new", [$self->session, \%param ])};
my $formElement = eval { WebGUI::Pluggable::instanciate($class, "new", [$session, \%param ])};
return $formElement->toHtml();
}
@ -1048,6 +1083,10 @@ sub getViewThingVars {
"label" => $field{label},
"isHidden" => $hidden,
"url" => $otherThingUrl,
"isVisible" => ($field{status} eq "visible" && !$hidden),
"isRequired" => ($field{status} eq "required" && !$hidden),
"pretext" => $field{pretext},
"subtext" => $field{subtext},
);
push(@viewScreenTitleFields,$value) if ($field{viewScreenTitle});
push(@field_loop, { map {("field_".$_ => $fieldProperties{$_})} keys(%fieldProperties) });
@ -1657,6 +1696,9 @@ sub www_editThing {
if ($field->{fieldType} eq "File"){
$formElement = "<input type='file' name='file'>";
}
if ($field->{fieldType} eq "Image"){
$formElement = "<input type='file' name='image'>";
}
else{
$formElement = $self->getFormElement($field);
}
@ -1672,9 +1714,9 @@ sub www_editThing {
." <td style='width:100px;' valign='top' class='formDescription'>".$field->{label}."</td>\n"
." <td style='width:370px;'>".$formElement."</td>\n"
." <td style='width:120px;' valign='top'> <input onClick=\"editListItem('".$self->session->url->page()
."?func=editField;fieldId=".$field->{fieldId}.";thingId=".$thingId."','".$field->{fieldId}."')\" value='Edit' type='button'>"
."?func=editField;fieldId=".$field->{fieldId}.";thingId=".$thingId."','".$field->{fieldId}."')\" value='".$i18n->get('Edit','Icon')."' type='button'>"
."<input onClick=\"deleteListItem('".$self->session->url->page()."','".$field->{fieldId}."','".$thingId."')\" "
."value='Delete' type='button'></td>\n</tr>\n</table>\n</li>\n";
."value='".$i18n->get('Delete','Icon')."' type='button'></td>\n</tr>\n</table>\n</li>\n";
$fieldsViewScreen .= "<tr id='view_tr_".$field->{fieldId}."'>"
."<td class='formDescription' style='width:180px;' id='view_label_".$field->{fieldId}."'>".$field->{label}
@ -2088,6 +2130,9 @@ sub www_editFieldSave {
if ($properties{fieldType} eq "File"){
$formElement = "<input type='file' name='file'>";
}
elsif ($properties{fieldType} eq "Image"){
$formElement = "<input type='file' name='image'>";
}
else{
$formElement = $self->getFormElement(\%properties);
}
@ -2101,9 +2146,9 @@ sub www_editFieldSave {
$listItemHTML = "<table>\n<tr>\n<td style='width:100px;' valign='top' class='formDescription'>".$label."</td>\n"
."<td style='width:370px;'>".$formElement."</td>\n"
."<td style='width:120px;' valign='top'> <input onClick=\"editListItem('".$self->session->url->page()
."?func=editField;fieldId=".$newFieldId.";thingId=".$properties{thingId}."','".$newFieldId."')\" value='Edit' type='button'>"
."?func=editField;fieldId=".$newFieldId.";thingId=".$properties{thingId}."','".$newFieldId."')\" value='".$i18n->get('Edit','Icon')."' type='button'>"
."<input onClick=\"deleteListItem('".$self->session->url->page()."','".$newFieldId
."','".$properties{thingId}."')\" value='Delete' type='button'></td>\n</tr>\n</table>";
."','".$properties{thingId}."')\" value='".$i18n->get('Delete','Icon')."' type='button'></td>\n</tr>\n</table>";
$session->output->print($newFieldId.$listItemHTML);
return "chunked";

View file

@ -11,7 +11,6 @@ package WebGUI::Asset::Wobject::UserList;
#-------------------------------------------------------------------
use strict;
use warnings;
use HTML::Entities;
use Tie::CPHash;
use Tie::IxHash;