Merge commit 'v7.10.19' into WebGUI8

This commit is contained in:
Colin Kuskie 2011-10-25 20:31:50 -07:00
commit 4fea10a1f5
52 changed files with 490 additions and 77 deletions

View file

@ -868,15 +868,75 @@ sub www_addTicketsToBadge {
my $self = shift;
my $session = $self->session;
return $session->privilege->insufficient() unless $self->canView;
my $form = $session->form;
my ( $form, $db ) = $session->quick(qw{ form db });
my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem');
# get badge's badge groups
my $badgeId = $form->get('badgeId');
my %badgeGroups = (); # Hash of badgeGroupId => ticketsPerBadge
if (defined $badgeId) {
my $assetId = $db->quickScalar("select badgeAssetId from EMSRegistrant where badgeId=?",[$badgeId]);
my $badge = WebGUI::Asset->new($session, $assetId, 'WebGUI::Asset::Sku::EMSBadge');
if ( defined $badge ) {
my @badgeGroups = split("\n",$badge->get('relatedBadgeGroups'));
%badgeGroups = $db->buildHash(
"SELECT badgeGroupId, ticketsPerBadge FROM EMSBadgeGroup WHERE badgeGroupId IN (" . $db->quoteAndJoin(\@badgeGroups) . ")",
);
}
}
# get a list of tickets already associated with the badge
my @existingTickets = $db->buildArray("select ticketAssetId from EMSRegistrantTicket where badgeId=?",[$badgeId]);
# Determine the ticket limits per badge group
my %fullBadgeGroups = ();
for my $ticketId ( @existingTickets ) {
my $ticket = WebGUI::Asset->new( $session, $ticketId, 'WebGUI::Asset::Sku::EMSTicket' );
next unless $ticket;
# Every ticket takes one spot from every related badge group
# So a badge can never have more than the limit defined in any related badge group
# Badge groups that start at 0 are not limited
for my $badgeGroupId ( split "\n", $ticket->get('relatedBadgeGroups') ) {
if ( $badgeGroups{ $badgeGroupId } ) {
$badgeGroups{ $badgeGroupId }--;
# If we're reduced to 0 now, keep track
if ( $badgeGroups{ $badgeGroupId } == 0 ) {
$fullBadgeGroups{ $badgeGroupId } = 1;
}
}
}
}
# Add the tickets
my @ids = $form->param('assetId');
foreach my $id (@ids) {
my @errors = (); # Error messages
TICKET: foreach my $id (@ids) {
my $ticket = WebGUI::Asset->newById($session, $id);
if (defined $ticket) {
$ticket->addToCart({badgeId=>$form->get('badgeId')});
# Make sure we're allowed to add this ticket
my @ticketBadgeGroups = ( split "\n", $ticket->get('relatedBadgeGroups') );
for my $badgeGroupId ( @ticketBadgeGroups ) {
if ( $fullBadgeGroups{ $badgeGroupId } ) {
push @errors, sprintf( $i18n->get('error badge group ticket limit'), $ticket->getTitle );
next TICKET;
}
}
# Reduce our numbers
for my $badgeGroupId ( @ticketBadgeGroups ) {
if ( $badgeGroups{ $badgeGroupId } ) {
$badgeGroups{ $badgeGroupId }--;
# If we're reduced to 0 now, keep track
if ( $badgeGroups{ $badgeGroupId } == 0 ) {
$fullBadgeGroups{ $badgeGroupId } = 1;
}
}
}
$ticket->addToCart({badgeId=>$badgeId});
}
}
return $self->www_getRegistrantAsJson();
return $self->www_getRegistrantAsJson( { errors => \@errors } );
}
#-------------------------------------------------------------------
@ -1007,6 +1067,12 @@ sub www_editBadgeGroup {
label => $i18n->get('badge group name'),
hoverHelp => $i18n->get('badge group name help'),
);
$f->addField( "integer",
name => 'ticketsPerBadge',
value => $badgeGroup->{ticketsPerBadge} || 0,
label => $i18n->get('badge group ticketsPerBadge'),
hoverHelp => $i18n->get('badge group ticketsPerBadge help'),
);
$f->addField( "submit", name => "send" );
return $self->processStyle('<h1>'.$i18n->get('badge groups').'</h1>'.$f->toHtml);
}
@ -1029,6 +1095,7 @@ sub www_editBadgeGroupSave {
badgeGroupId => $id,
emsAssetId => $self->getId,
name => $form->get('name'),
ticketsPerBadge => $form->get('ticketsPerBadge','Integer'),
});
return $self->www_manageBadgeGroups;
}
@ -1458,7 +1525,7 @@ Retrieves the properties of a specific badge and the items attached to it. Expec
=cut
sub www_getRegistrantAsJson {
my ($self) = @_;
my ($self, $opt) = @_;
my $session = $self->session;
my $db = $session->db;
return $session->privilege->insufficient() unless $self->canView;
@ -1477,6 +1544,11 @@ sub www_getRegistrantAsJson {
$badgeInfo->{assetId} = $badge->getId;
$badgeInfo->{hasPurchased} = ($badgeInfo->{purchaseComplete}) ? 1 : 0;
# Add errors, if any
if ( $opt->{errors} && @{ $opt->{errors} } ) {
$badgeInfo->{errors} = $opt->{errors};
}
# get existing tickets
my $existingTickets = $db->read("select ticketAssetId from EMSRegistrantTicket where badgeId=? and purchaseComplete=1",[$badgeId]);
while (my ($id) = $existingTickets->array) {
@ -1838,16 +1910,39 @@ className='WebGUI::Asset::Sku::EMSTicket' and state='published' and revisionDate
# get badge's badge groups
my $badgeId = $form->get('badgeId');
my @badgeGroups = ();
my %badgeGroups = (); # Hash of badgeGroupId => ticketsPerBadge
if (defined $badgeId) {
my $assetId = $db->quickScalar("select badgeAssetId from EMSRegistrant where badgeId=?",[$badgeId]);
my $badge = eval { WebGUI::Asset->newById($session, $assetId); };
@badgeGroups = split("\n",$badge->relatedBadgeGroups) if (defined $badge);
my $badge = eval { WebGUI::Asset->newById ($session, $assetId, 'WebGUI::Asset::Sku::EMSBadge'); };
if ( defined $badge ) {
my @badgeGroups = split("\n",$badge->get('relatedBadgeGroups'));
%badgeGroups = $db->buildHash(
"SELECT badgeGroupId, ticketsPerBadge FROM EMSBadgeGroup WHERE badgeGroupId IN (" . $db->quoteAndJoin(\@badgeGroups) . ")",
);
}
}
# get a list of tickets already associated with the badge
my @existingTickets = $db->buildArray("select ticketAssetId from EMSRegistrantTicket where badgeId=?",[$badgeId]);
# Determine the ticket limits per badge group
my %fullBadgeGroups = ();
for my $ticketId ( @existingTickets ) {
my $ticket = WebGUI::Asset->new( $session, $ticketId, 'WebGUI::Asset::Sku::EMSTicket' );
next unless $ticket;
# Every ticket takes one spot from every related badge group
# So a badge can never have more than the limit defined in any related badge group
for my $badgeGroupId ( split "\n", $ticket->get('relatedBadgeGroups') ) {
if ( $badgeGroups{ $badgeGroupId } ) {
$badgeGroups{ $badgeGroupId }--;
# If we're reduced to 0 now, keep track
if ( $badgeGroups{ $badgeGroupId } == 0 ) {
$fullBadgeGroups{ $badgeGroupId } = 1;
}
}
}
}
# get assets
my $counter = 0;
my $totalTickets = scalar(@ids);
@ -1870,19 +1965,18 @@ className='WebGUI::Asset::Sku::EMSTicket' and state='published' and revisionDate
next TICKETID if !$ticket;
# skip tickets not in our badge's badge groups
if ($badgeId ne "" && scalar(@badgeGroups) > 0 && $ticket->relatedBadgeGroups ne '') { # skip check if it has no badge groups
my @groups = split("\n",$ticket->relatedBadgeGroups);
if ($badgeId ne "" && keys %badgeGroups > 0 && $ticket->get('relatedBadgeGroups') ne '') { # skip check if it has no badge groups
my @badgeGroupIds = split("\n",$ticket->get('relatedBadgeGroups'));
my $found = 0;
BADGE: {
foreach my $a (@badgeGroups) {
foreach my $b (@groups) {
if ($a eq $b) {
$found = 1;
last BADGE;
}
}
}
}
for my $badgeGroupId ( @badgeGroupIds ) {
# Hash lookup is faster than array lookup
if ( exists $badgeGroups{ $badgeGroupId } ) {
$found = 1;
last;
}
}
unless ($found) {
$totalTickets--;
next;
@ -1907,20 +2001,30 @@ className='WebGUI::Asset::Sku::EMSTicket' and state='published' and revisionDate
my $date = WebGUI::DateTime->new($session, mysql => $ticket->startDate)
->set_time_zone($self->timezone)
->webguiDate("%W %z %Z");
push(@records, {
title => $ticket->getTitle,
description => $description,
price => $ticket->getPrice+0,
quantityAvailable => $ticket->getQuantityAvailable,
url => $ticket->getUrl,
editUrl => $ticket->getUrl('func=edit'),
deleteUrl => $ticket->getUrl('func=delete'),
assetId => $ticket->getId,
eventNumber => $ticket->eventNumber,
location => $ticket->location,
startDate => $date,
duration => $ticket->duration,
});
my $properties = {
title => $ticket->getTitle,
description => $description,
price => $ticket->getPrice+0,
quantityAvailable => $ticket->getQuantityAvailable,
url => $ticket->getUrl,
editUrl => $ticket->getUrl('func=edit'),
deleteUrl => $ticket->getUrl('func=delete'),
assetId => $ticket->getId,
eventNumber => $ticket->eventNumber,
location => $ticket->location,
startDate => $date,
duration => $ticket->duration,
};
# Determine if we're able to add this ticket due to Badge Group limits
for my $badgeGroupId ( split /\n/, $ticket->get('relatedBadgeGroups') ) {
if ( $fullBadgeGroups{ $badgeGroupId } ) {
$properties->{ limitReached } = 1;
}
}
push(@records, $properties);
last unless (scalar(@records) < $numberOfResults);
}
@ -2490,6 +2594,13 @@ sub www_printBadge {
my $registrant = $self->getRegistrant($form->get('badgeId'));
my $badge = WebGUI::Asset::Sku::EMSBadge->newById($session, $registrant->{badgeAssetId});
$registrant->{badgeTitle} = $badge->getTitle;
# Add badge metadata
my $meta = $badge->getMetaDataAsTemplateVariables;
for my $key ( keys %{$meta} ) {
$registrant->{ "badgeMeta_" . $key } = $meta->{ $key };
}
return $self->processTemplate($registrant,$self->printBadgeTemplateId);
}
@ -2583,7 +2694,12 @@ sub www_printTicket {
$registrant->{ticketDuration} = $ticket->duration;
$registrant->{ticketLocation} = $ticket->location;
$registrant->{ticketEventNumber} = $ticket->eventNumber;
return $self->processTemplate($registrant,$self->printTicketTemplateId);
# Add ticket metadata
my $meta = $ticket->getEventMetaData;
for my $key ( keys %{$meta} ) {
$registrant->{ "ticketMeta_" . $key } = $meta->{ $key };
}
return $self->processTemplate($registrant,$self->printTicketTemplateId);
}

View file

@ -2494,6 +2494,12 @@ sub www_editThingSave {
my $thingId = $self->session->form->process("thingId");
my $fields = $self->getFields($thingId);
if($fields->rows < 1){
$self->session->log->warn("Thing failed to create because it had no fields");
my $i18n = WebGUI::International->new($self->session, "Asset_Thingy");
return $self->www_editThing($i18n->get("thing must have fields"));
}
my $thing = {
thingId => $thingId,
label => $form->process("label"),
@ -2524,12 +2530,6 @@ sub www_editThingSave {
};
$self->setCollateral("Thingy_things", "thingId", $thing, 0, 1);
if($fields->rows < 1){
$self->session->log->warn("Thing failed to create because it had no fields");
my $i18n = WebGUI::International->new($self->session, "Asset_Thingy");
return $self->www_editThing($i18n->get("thing must have fields"));
}
while (my $field = $fields->hashRef) {
my $display = $self->session->form->process("display_".$field->{fieldId}) || 0;
my $viewScreenTitle = $self->session->form->process("viewScreenTitle_".$field->{fieldId}) || 0;
@ -3921,6 +3921,7 @@ sub www_viewThingData {
my $thingId = shift || $session->form->process('thingId');
my $thingDataId = shift || $session->form->process('thingDataId');
my $templateId = shift || $session->form->process('templateId');
my $callerAssetId = shift || $session->form->process('callerAssetId');
my $var = $self->get;
my $url = $self->getUrl;
my $i18n = WebGUI::International->new($self->session, "Asset_Thingy");
@ -3933,6 +3934,7 @@ sub www_viewThingData {
$var->{"addThing_url"} = $session->url->append($url, 'func=editThing;thingId=new');
$var->{"manage_url"} = $session->url->append($url, 'func=manage');
$var->{"thing_label"} = $thingProperties->{label};
$var->{"callerAssetId"} = $callerAssetId;
if($self->hasPrivileges($thingProperties->{groupIdEdit})){
$var->{"edit_url"} = $session->url->append($url,'func=editThingData;thingId='

View file

@ -162,9 +162,7 @@ sub www_exportStatus {
return $session->privilege->insufficient
unless $session->user->isInGroup(13);
my $form = $session->form;
my @vars = qw(
index depth userId extrasUploadsAction rootUrlAction exportUrl exportRelated
);
my @vars = qw(index depth userId rootUrlAction exportUrl exportRelated);
$asset->forkWithStatusPage({
plugin => 'ProgressTree',
title => 'Page Export Status',
@ -173,6 +171,9 @@ sub www_exportStatus {
message => 'Your assets have been exported!',
groupId => 13,
args => {
# Note the difference in spelling...
# v---no s s-----v
extrasUploadAction => scalar $form->get('extrasUploadsAction'),
assetId => $asset->getId,
map { $_ => scalar $form->get($_) } @vars
}

View file

@ -127,6 +127,7 @@ our $HELP = {
{ 'name' => 'purchaseComplete'},
{ 'name' => 'hasCheckedIn'},
{ 'name' => 'transactionItemId'},
{ 'name' => 'badgeMeta_', description => 'help badgeMeta' },
],
isa => [
{ namespace => "Asset_Template",
@ -217,6 +218,7 @@ our $HELP = {
{ 'name' => 'purchaseComplete'},
{ 'name' => 'hasCheckedIn'},
{ 'name' => 'transactionItemId'},
{ 'name' => 'ticketMeta_', description => 'help ticketMeta' },
],
isa => [
{ namespace => "Asset_Template",

View file

@ -155,6 +155,7 @@ our $HELP = {
{
'name' => 'variables by label',
},
{ 'name' => 'callerAssetId' },
],
related => [
{ tag => 'edit thing template',

View file

@ -23,7 +23,7 @@ Package WebGUI::Macro::RenderThingData
Macro that allows users to render thing data.
=head2 process ( thingURL, templateHint )
=head2 process ( thingURL, templateHint, callerAssetId )
=head3 thingHint
@ -33,12 +33,17 @@ The URL from which to pull the thingId and thingDataId
Optional. Specifies the templateId or template url to use. If omitted, the default thingy view template will be used.
=head3 callerAssetId
Optional. Passes an assetId to the template (as a template var named callerAssetId) so that the the assetId of of
the caller can be known by the called template. Generally you should pass <tmpl_var assetId>.
=cut
#-------------------------------------------------------------------
sub process {
my ($session, $thingDataUrl, $templateHint ) = @_;
my ($session, $thingDataUrl, $templateHint, $callerAssetId ) = @_;
my $i18n = WebGUI::International->new($session, 'Macro_RenderThingData');
return $i18n->get('no template') if !$templateHint;
@ -57,7 +62,7 @@ sub process {
return ( $i18n->get('bad url') . $thingDataUrl ) if !$thing || !$thingId || !$thingDataId;
# Render
my $output = $thing->www_viewThingData( $thingId, $thingDataId, $templateHint );
my $output = $thing->www_viewThingData( $thingId, $thingDataId, $templateHint, $callerAssetId );
# FIX: Temporary solution (broken map due to template rendering <script> tags)
return $i18n->get('bad tags') if $output =~ /script>/;

View file

@ -120,22 +120,23 @@ sub execute {
# and send the appropriate cookie with the request.
my $sitename = $session->config->get("sitename")->[0];
FEED: foreach my $feed (@{ $calendar->getFeeds }) {
if ($feed->{url} =~ m{http://[^/]*$sitename}) {
$feed->{url} .= ( $feed->{url} =~ /[?]/ ? ";" : "?" ) . "adminId=".$session->getId;
my $url = $feed->{url};
if ($url =~ m{http://[^/]*$sitename}) {
$url .= ( $url =~ /[?]/ ? ";" : "?" ) . "adminId=".$session->getId;
$session->db->write("REPLACE INTO userSessionScratch (sessionId,name,value) VALUES (?,?,?)",
[$session->getId,$calendar->getId,"SPECTRE"]);
}
# Get the feed
$session->log->info( "Trying Calendar feed ".$feed->{url}." for $calendarTitle" );
my $response = $ua->get($feed->{url});
$session->log->info( "Trying Calendar feed ".$url." for $calendarTitle" );
my $response = $ua->get($url);
if (!$response->is_success) {
# Update the result and last updated fields
$feed->{lastResult} = $response->message || $response->content;
$feed->{lastUpdated} = $dt;
$calendar->setFeed($feed->{feedId}, $feed);
$session->log->info( "Calendar feed ".$feed->{url}." for $calendarTitle failed" );
$session->log->warn( "Calendar feed ".$url." for $calendarTitle failed" );
next FEED;
}
@ -146,7 +147,8 @@ sub execute {
$feed->{lastResult} = "Error parsing iCal feed";
$feed->{lastUpdated} = $dt;
$calendar->setFeed($feed->{feedId}, $feed);
#next FEED;
$session->log->warn( "Calendar feed ".$url." for $calendarTitle could not be parsed" );
next FEED;
}
my $feedData = $feedList->{$feed->{feedId}} = {
added => 0,

View file

@ -954,13 +954,13 @@ our $I18N = {
},
'pageNextUrl monthVar' => {
message => q|A URL to the next month in the calendar.|,
lastUpdated => 1269839944,
message => q|A URL to the next year in the calendar.|,
lastUpdated => 1309212604,
},
'pagePrevUrl monthVar' => {
message => q|A URL to the previous month in the calendar.|,
lastUpdated => 1269839951,
message => q|A URL to the previous year in the calendar.|,
lastUpdated => 1309212606,
},
'pageNextYear' => {

View file

@ -2277,6 +2277,36 @@ normal templates.|,
# },
'help badgeMeta' => {
message => 'Add a metadata value to the template by adding the name after "badgeMeta_". ex: badgeMeta_department',
lastUpdated => 0,
context => 'help text for template variable',
},
'help ticketMeta' => {
message => 'Add a metadata value to the template by adding the name after "ticketMeta_". ex: ticketMeta_department',
lastUpdated => 0,
context => 'help text for template variable',
},
'badge group ticketsPerBadge' => {
message => 'Tickets Per Badge',
lastUpdated => 0,
context => 'Label for badge group property',
},
'badge group ticketsPerBadge help' => {
message => "The number of tickets each badge in this group is allowed to purchase",
lastUpdated => 0,
context => 'Help text for badge group property',
},
'error badge group ticket limit' => {
message => q{Cannot add %s because ticket limit reached},
lastUpdated => 0,
context => q{Error message when trying to add too many tickets to a badge},
},
};
1;

View file

@ -1162,6 +1162,12 @@ below/after the form element.|,
context => q|Hoverhelp for edit field screen|,
},
'callerAssetId' => {
message => q|When passed into the www_viewThingData, provides the assetId of the caller asset. Used by RenderThingMacro. See POD.|,
lastUpdated => 0,
context => q|Template variable help for www_viewThingData|,
},
};
1;