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

@ -1,3 +1,12 @@
7.10.19
- fixed #12169: extras uploads symlink export
- Added ability to pass caller assetId to RenderThingMacro
- Allow specific expirations for groups in userImport.pl
- fixed #12164: Calendar feeds with tons of ;adminId=XXXXXX added
- fixed #12167: Calendar Next/Prev Month/Year confusion
- fixed #12172: Underground User Style template shows up in Style wizard during site creation
- fixed #12157: www_editThingSave
7.10.18 7.10.18
- fixed #12138: Version tag gets create by entering and direct leaving - fixed #12138: Version tag gets create by entering and direct leaving
- Added the WebGUI::Event API - Added the WebGUI::Event API

View file

@ -0,0 +1,177 @@
#!/usr/bin/env perl
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
our ($webguiRoot);
BEGIN {
$webguiRoot = "../..";
unshift (@INC, $webguiRoot."/lib");
}
use strict;
use Getopt::Long;
use WebGUI::Session;
use WebGUI::Storage;
use WebGUI::Asset;
use WebGUI::Asset::Wobject::Calendar;
use Exception::Class;
my $toVersion = '7.10.19';
my $quiet; # this line required
my $session = start(); # this line required
# upgrade functions go here
addTicketLimitToBadgeGroup( $session );
fixBrokenCalendarFeedUrls ( $session );
removeUndergroundUserStyleTemplate ( $session );
finish($session); # this line required
#----------------------------------------------------------------------------
# Describe what our function does
#sub exampleFunction {
# my $session = shift;
# print "\tWe're doing some stuff here that you should know about... " unless $quiet;
# # and here's our code
# print "DONE!\n" unless $quiet;
#}
#----------------------------------------------------------------------------
# Fix calendar feed urls that had adminId attached to them until they blew up
sub fixBrokenCalendarFeedUrls {
my $session = shift;
print "\tChecking all calendar feed URLs for adminId brokenness... " unless $quiet;
my $getCalendar = WebGUI::Asset::Wobject::Calendar->getIsa($session);
CALENDAR: while (1) {
my $calendar = eval { $getCalendar->(); };
next CALENDAR if Exception::Class->caught;
last CALENDAR unless $calendar;
FEED: foreach my $feed (@{ $calendar->getFeeds }) {
$feed->{url} =~ s/adminId=[^;]{22};?//g;
$feed->{url} =~ s/\?$//;
$calendar->setFeed($feed->{feedId}, $feed);
}
}
print "DONE!\n" unless $quiet;
}
#----------------------------------------------------------------------------
# Add a ticket limit to badges in a badge group
sub removeUndergroundUserStyleTemplate {
my $session = shift;
print "\tRemove Underground User Style template... " unless $quiet;
if ($session->setting->get('userFunctionStyleId') eq 'zfDnOJgeiybz9vnmoEXRXA') {
$session->setting->set('userFunctionStyleId', 'Qk24uXao2yowR6zxbVJ0xA');
}
my $underground_user = WebGUI::Asset->newByDynamicClass($session, 'zfDnOJgeiybz9vnmoEXRXA');
if ($underground_user) {
$underground_user->purge;
}
print "DONE!\n" unless $quiet;
}
#----------------------------------------------------------------------------
# Add a ticket limit to badges in a badge group
sub addTicketLimitToBadgeGroup {
my $session = shift;
print "\tAdd ticket limit to badge groups... " unless $quiet;
# Make sure it hasn't been done already...
my $columns = $session->db->buildHashRef('describe EMSBadgeGroup');
use List::MoreUtils qw(any);
if(!any { $_ eq 'ticketsPerBadge' } keys %{$columns}) {
$session->db->write(q{
ALTER TABLE EMSBadgeGroup ADD COLUMN `ticketsPerBadge` INTEGER
});
}
print "DONE!\n" unless $quiet;
}
# -------------- DO NOT EDIT BELOW THIS LINE --------------------------------
#----------------------------------------------------------------------------
# Add a package to the import node
sub addPackage {
my $session = shift;
my $file = shift;
print "\tUpgrading package $file\n" unless $quiet;
# Make a storage location for the package
my $storage = WebGUI::Storage->createTemp( $session );
$storage->addFileFromFilesystem( $file );
# Import the package into the import node
my $package = eval {
my $node = WebGUI::Asset->getImportNode($session);
$node->importPackage( $storage, {
overwriteLatest => 1,
clearPackageFlag => 1,
setDefaultTemplate => 1,
} );
};
if ($package eq 'corrupt') {
die "Corrupt package found in $file. Stopping upgrade.\n";
}
if ($@ || !defined $package) {
die "Error during package import on $file: $@\nStopping upgrade\n.";
}
return;
}
#-------------------------------------------------
sub start {
my $configFile;
$|=1; #disable output buffering
GetOptions(
'configFile=s'=>\$configFile,
'quiet'=>\$quiet
);
my $session = WebGUI::Session->open($webguiRoot,$configFile);
$session->user({userId=>3});
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name=>"Upgrade to ".$toVersion});
return $session;
}
#-------------------------------------------------
sub finish {
my $session = shift;
updateTemplates($session);
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->commit;
$session->db->write("insert into webguiVersion values (".$session->db->quote($toVersion).",'upgrade',".time().")");
$session->close();
}
#-------------------------------------------------
sub updateTemplates {
my $session = shift;
return undef unless (-d "packages-".$toVersion);
print "\tUpdating packages.\n" unless ($quiet);
opendir(DIR,"packages-".$toVersion);
my @files = readdir(DIR);
closedir(DIR);
my $newFolder = undef;
foreach my $file (@files) {
next unless ($file =~ /\.wgpkg$/);
# Fix the filename to include a path
$file = "packages-" . $toVersion . "/" . $file;
addPackage( $session, $file );
}
}
#vim:ft=perl

View file

@ -868,15 +868,75 @@ sub www_addTicketsToBadge {
my $self = shift; my $self = shift;
my $session = $self->session; my $session = $self->session;
return $session->privilege->insufficient() unless $self->canView; 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'); 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); my $ticket = WebGUI::Asset->newById($session, $id);
if (defined $ticket) { 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'), label => $i18n->get('badge group name'),
hoverHelp => $i18n->get('badge group name help'), 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" ); $f->addField( "submit", name => "send" );
return $self->processStyle('<h1>'.$i18n->get('badge groups').'</h1>'.$f->toHtml); return $self->processStyle('<h1>'.$i18n->get('badge groups').'</h1>'.$f->toHtml);
} }
@ -1029,6 +1095,7 @@ sub www_editBadgeGroupSave {
badgeGroupId => $id, badgeGroupId => $id,
emsAssetId => $self->getId, emsAssetId => $self->getId,
name => $form->get('name'), name => $form->get('name'),
ticketsPerBadge => $form->get('ticketsPerBadge','Integer'),
}); });
return $self->www_manageBadgeGroups; return $self->www_manageBadgeGroups;
} }
@ -1458,7 +1525,7 @@ Retrieves the properties of a specific badge and the items attached to it. Expec
=cut =cut
sub www_getRegistrantAsJson { sub www_getRegistrantAsJson {
my ($self) = @_; my ($self, $opt) = @_;
my $session = $self->session; my $session = $self->session;
my $db = $session->db; my $db = $session->db;
return $session->privilege->insufficient() unless $self->canView; return $session->privilege->insufficient() unless $self->canView;
@ -1477,6 +1544,11 @@ sub www_getRegistrantAsJson {
$badgeInfo->{assetId} = $badge->getId; $badgeInfo->{assetId} = $badge->getId;
$badgeInfo->{hasPurchased} = ($badgeInfo->{purchaseComplete}) ? 1 : 0; $badgeInfo->{hasPurchased} = ($badgeInfo->{purchaseComplete}) ? 1 : 0;
# Add errors, if any
if ( $opt->{errors} && @{ $opt->{errors} } ) {
$badgeInfo->{errors} = $opt->{errors};
}
# get existing tickets # get existing tickets
my $existingTickets = $db->read("select ticketAssetId from EMSRegistrantTicket where badgeId=? and purchaseComplete=1",[$badgeId]); my $existingTickets = $db->read("select ticketAssetId from EMSRegistrantTicket where badgeId=? and purchaseComplete=1",[$badgeId]);
while (my ($id) = $existingTickets->array) { while (my ($id) = $existingTickets->array) {
@ -1838,16 +1910,39 @@ className='WebGUI::Asset::Sku::EMSTicket' and state='published' and revisionDate
# get badge's badge groups # get badge's badge groups
my $badgeId = $form->get('badgeId'); my $badgeId = $form->get('badgeId');
my @badgeGroups = (); my %badgeGroups = (); # Hash of badgeGroupId => ticketsPerBadge
if (defined $badgeId) { if (defined $badgeId) {
my $assetId = $db->quickScalar("select badgeAssetId from EMSRegistrant where badgeId=?",[$badgeId]); my $assetId = $db->quickScalar("select badgeAssetId from EMSRegistrant where badgeId=?",[$badgeId]);
my $badge = eval { WebGUI::Asset->newById($session, $assetId); }; my $badge = eval { WebGUI::Asset->newById ($session, $assetId, 'WebGUI::Asset::Sku::EMSBadge'); };
@badgeGroups = split("\n",$badge->relatedBadgeGroups) if (defined $badge); 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 # get a list of tickets already associated with the badge
my @existingTickets = $db->buildArray("select ticketAssetId from EMSRegistrantTicket where badgeId=?",[$badgeId]); 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 # get assets
my $counter = 0; my $counter = 0;
my $totalTickets = scalar(@ids); my $totalTickets = scalar(@ids);
@ -1870,19 +1965,18 @@ className='WebGUI::Asset::Sku::EMSTicket' and state='published' and revisionDate
next TICKETID if !$ticket; next TICKETID if !$ticket;
# skip tickets not in our badge's badge groups # 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 if ($badgeId ne "" && keys %badgeGroups > 0 && $ticket->get('relatedBadgeGroups') ne '') { # skip check if it has no badge groups
my @groups = split("\n",$ticket->relatedBadgeGroups); my @badgeGroupIds = split("\n",$ticket->get('relatedBadgeGroups'));
my $found = 0; my $found = 0;
BADGE: {
foreach my $a (@badgeGroups) { for my $badgeGroupId ( @badgeGroupIds ) {
foreach my $b (@groups) { # Hash lookup is faster than array lookup
if ($a eq $b) { if ( exists $badgeGroups{ $badgeGroupId } ) {
$found = 1; $found = 1;
last BADGE; last;
} }
} }
}
}
unless ($found) { unless ($found) {
$totalTickets--; $totalTickets--;
next; next;
@ -1907,20 +2001,30 @@ className='WebGUI::Asset::Sku::EMSTicket' and state='published' and revisionDate
my $date = WebGUI::DateTime->new($session, mysql => $ticket->startDate) my $date = WebGUI::DateTime->new($session, mysql => $ticket->startDate)
->set_time_zone($self->timezone) ->set_time_zone($self->timezone)
->webguiDate("%W %z %Z"); ->webguiDate("%W %z %Z");
push(@records, {
title => $ticket->getTitle, my $properties = {
description => $description, title => $ticket->getTitle,
price => $ticket->getPrice+0, description => $description,
quantityAvailable => $ticket->getQuantityAvailable, price => $ticket->getPrice+0,
url => $ticket->getUrl, quantityAvailable => $ticket->getQuantityAvailable,
editUrl => $ticket->getUrl('func=edit'), url => $ticket->getUrl,
deleteUrl => $ticket->getUrl('func=delete'), editUrl => $ticket->getUrl('func=edit'),
assetId => $ticket->getId, deleteUrl => $ticket->getUrl('func=delete'),
eventNumber => $ticket->eventNumber, assetId => $ticket->getId,
location => $ticket->location, eventNumber => $ticket->eventNumber,
startDate => $date, location => $ticket->location,
duration => $ticket->duration, 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); last unless (scalar(@records) < $numberOfResults);
} }
@ -2490,6 +2594,13 @@ sub www_printBadge {
my $registrant = $self->getRegistrant($form->get('badgeId')); my $registrant = $self->getRegistrant($form->get('badgeId'));
my $badge = WebGUI::Asset::Sku::EMSBadge->newById($session, $registrant->{badgeAssetId}); my $badge = WebGUI::Asset::Sku::EMSBadge->newById($session, $registrant->{badgeAssetId});
$registrant->{badgeTitle} = $badge->getTitle; $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); return $self->processTemplate($registrant,$self->printBadgeTemplateId);
} }
@ -2583,7 +2694,12 @@ sub www_printTicket {
$registrant->{ticketDuration} = $ticket->duration; $registrant->{ticketDuration} = $ticket->duration;
$registrant->{ticketLocation} = $ticket->location; $registrant->{ticketLocation} = $ticket->location;
$registrant->{ticketEventNumber} = $ticket->eventNumber; $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 $thingId = $self->session->form->process("thingId");
my $fields = $self->getFields($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 = { my $thing = {
thingId => $thingId, thingId => $thingId,
label => $form->process("label"), label => $form->process("label"),
@ -2524,12 +2530,6 @@ sub www_editThingSave {
}; };
$self->setCollateral("Thingy_things", "thingId", $thing, 0, 1); $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) { while (my $field = $fields->hashRef) {
my $display = $self->session->form->process("display_".$field->{fieldId}) || 0; my $display = $self->session->form->process("display_".$field->{fieldId}) || 0;
my $viewScreenTitle = $self->session->form->process("viewScreenTitle_".$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 $thingId = shift || $session->form->process('thingId');
my $thingDataId = shift || $session->form->process('thingDataId'); my $thingDataId = shift || $session->form->process('thingDataId');
my $templateId = shift || $session->form->process('templateId'); my $templateId = shift || $session->form->process('templateId');
my $callerAssetId = shift || $session->form->process('callerAssetId');
my $var = $self->get; my $var = $self->get;
my $url = $self->getUrl; my $url = $self->getUrl;
my $i18n = WebGUI::International->new($self->session, "Asset_Thingy"); 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->{"addThing_url"} = $session->url->append($url, 'func=editThing;thingId=new');
$var->{"manage_url"} = $session->url->append($url, 'func=manage'); $var->{"manage_url"} = $session->url->append($url, 'func=manage');
$var->{"thing_label"} = $thingProperties->{label}; $var->{"thing_label"} = $thingProperties->{label};
$var->{"callerAssetId"} = $callerAssetId;
if($self->hasPrivileges($thingProperties->{groupIdEdit})){ if($self->hasPrivileges($thingProperties->{groupIdEdit})){
$var->{"edit_url"} = $session->url->append($url,'func=editThingData;thingId=' $var->{"edit_url"} = $session->url->append($url,'func=editThingData;thingId='

View file

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

View file

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

View file

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

View file

@ -23,7 +23,7 @@ Package WebGUI::Macro::RenderThingData
Macro that allows users to render thing data. Macro that allows users to render thing data.
=head2 process ( thingURL, templateHint ) =head2 process ( thingURL, templateHint, callerAssetId )
=head3 thingHint =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. 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 =cut
#------------------------------------------------------------------- #-------------------------------------------------------------------
sub process { sub process {
my ($session, $thingDataUrl, $templateHint ) = @_; my ($session, $thingDataUrl, $templateHint, $callerAssetId ) = @_;
my $i18n = WebGUI::International->new($session, 'Macro_RenderThingData'); my $i18n = WebGUI::International->new($session, 'Macro_RenderThingData');
return $i18n->get('no template') if !$templateHint; return $i18n->get('no template') if !$templateHint;
@ -57,7 +62,7 @@ sub process {
return ( $i18n->get('bad url') . $thingDataUrl ) if !$thing || !$thingId || !$thingDataId; return ( $i18n->get('bad url') . $thingDataUrl ) if !$thing || !$thingId || !$thingDataId;
# Render # 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) # FIX: Temporary solution (broken map due to template rendering <script> tags)
return $i18n->get('bad tags') if $output =~ /script>/; return $i18n->get('bad tags') if $output =~ /script>/;

View file

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

View file

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

View file

@ -1162,6 +1162,12 @@ below/after the form element.|,
context => q|Hoverhelp for edit field screen|, 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; 1;

View file

@ -73,7 +73,7 @@ if (!($^O =~ /^Win/i) && $> != 0 && !$override) {
print "Starting up..." unless ($quiet); print "Starting up..." unless ($quiet);
my $session = WebGUI::Session->open($configFile); my $session = WebGUI::Session->open($configFile);
$session->user({userId=>3}); $session->user({userId=>3});
open(FILE,"<".$usersFile); open(FILE,"<".$usersFile) || die("Could not open $usersFile for reading: $!");
print "OK\n" unless ($quiet); print "OK\n" unless ($quiet);
my $lineNumber = 0; my $lineNumber = 0;
@ -81,6 +81,7 @@ my @field;
my @profileFields = $session->db->buildArray("select fieldName from userProfileField"); my @profileFields = $session->db->buildArray("select fieldName from userProfileField");
while(my $line = <FILE>) { while(my $line = <FILE>) {
$lineNumber++; $lineNumber++;
chomp $line; chomp $line;
next next
if $line eq ''; if $line eq '';
@ -179,7 +180,25 @@ while(my $line = <FILE>) {
} }
if ($user{groups}) { if ($user{groups}) {
my @groups = split(/,/,$user{groups}); my @groups = split(/,/,$user{groups});
$u->addToGroups(\@groups,$user{expireOffset}); # Groups that have : in them have unique expiration dates
$u->addToGroups([grep { !/:/ } @groups],$user{expireOffset});
for my $groupDef ( grep { /:/ } @groups ) {
my ( $groupId, $expireDate ) = split /:/, $groupDef, 2;
# Calculate expiration offset
my $dtparse = DateTime::Format::Strptime->new(
pattern => '%F %T',
on_error => 'croak',
);
eval {
my $expireOffset = $dtparse->parse_datetime( $expireDate )->epoch - time;
$u->addToGroups( [$groupId], $expireOffset );
};
if ( $@ ) {
print "Could not add user $user{username} to group $groupId: $@";
}
}
} }
} }
} }
@ -345,6 +364,12 @@ Specify a comma separated list of WebGUI Group Ids that each loaded
user will be set to. It can be overridden in the import file for user will be set to. It can be overridden in the import file for
specific users. specific users.
You can specify a unique expiration date for a group by adding it
after the group ID, seperated by a colon. The date/time should be in
"YYYY-MM-DD HH:NN:SS" format.
groupId:2000-01-01 01:00:00,groupId2:2001-01-02 02:00:00
=item B<--ldapUrl uri> =item B<--ldapUrl uri>
Specify the URI used to connect to the LDAP server for authentication. Specify the URI used to connect to the LDAP server for authentication.

File diff suppressed because one or more lines are too long

View file

@ -32,7 +32,7 @@ my $session = WebGUI::Test->session;
$templateMock->mock_id( $templateId ); $templateMock->mock_id( $templateId );
$templateMock->mock_url( $templateUrl ); $templateMock->mock_url( $templateUrl );
plan tests => 6; plan tests => 7;
my $node = WebGUI::Test->asset; my $node = WebGUI::Test->asset;
my $thingy = $node->addChild({ my $thingy = $node->addChild({
@ -107,3 +107,6 @@ $output = WebGUI::Macro::RenderThingData::process($session, $thing_url, $templat
ok $templateProcessed, '... passed template url, template processed'; ok $templateProcessed, '... passed template url, template processed';
$templateProcessed = 0; $templateProcessed = 0;
$output = WebGUI::Macro::RenderThingData::process($session, $thing_url, $templateUrl, "fakeAssetId");
ok $templateVars->{'callerAssetId'} eq 'fakeAssetId', '... passed callerAssetId, template var was passed';
$templateProcessed = 0;

View file

@ -13,17 +13,16 @@ use strict;
use WebGUI::Test; use WebGUI::Test;
use WebGUI::Session; use WebGUI::Session;
use WebGUI::Workflow::Activity::CalendarUpdateFeeds; use WebGUI::Workflow::Activity::CalendarUpdateFeeds;
use WebGUI::Asset::Wobject::Calendar;
use Test::More; use Test::More;
use Test::Deep; use Test::Deep;
use Test::LongString; use Test::LongString;
use Data::Dumper; use WebGUI::Asset::Wobject::Calendar;
plan skip_all => 'set WEBGUI_LIVE to enable this test' plan skip_all => 'set WEBGUI_LIVE to enable this test'
unless $ENV{WEBGUI_LIVE}; unless $ENV{WEBGUI_LIVE};
plan tests => 23; # increment this value for each test you create plan tests => 27; # increment this value for each test you create
my $session = WebGUI::Test->session; my $session = WebGUI::Test->session;
@ -173,7 +172,7 @@ SKIP: {
##Add an ical feed to check time zone processing ##Add an ical feed to check time zone processing
$receiver->deleteFeed($feedId); $receiver->deleteFeed($feedId);
$receiver->addFeed({ $feedId = $receiver->addFeed({
url => $session->url->getSiteURL.$snippet_feed->getUrl, url => $session->url->getSiteURL.$snippet_feed->getUrl,
lastUpdated => 'never', lastUpdated => 'never',
}); });
@ -201,4 +200,36 @@ $newEvents = $receiver->getLineage(['children'], { returnObjects => 1, });
my $got_cpr = is(scalar @{ $newEvents }, 1, 'ical import of 1 event'); my $got_cpr = is(scalar @{ $newEvents }, 1, 'ical import of 1 event');
##Add a feed that will fail, to test that feeds are not modified
$receiver->deleteFeed($feedId);
my $feedUrl = $session->url->getSiteURL.'do_not_hack_my_url';
$feedId = $receiver->addFeed({
url => $feedUrl,
lastUpdated => 'never',
});
$instance1->delete('skipNotify');
$instance1 = WebGUI::Workflow::Instance->create($session,
{
workflowId => $workflow->getId,
skipSpectreNotification => 1,
}
);
my $retVal;
$retVal = $instance1->run();
is($retVal, 'complete', 'cleanup: activity complete');
$retVal = $instance1->run();
is($retVal, 'done', 'cleanup: activity is done');
$instance1->delete;
$receiver = $receiver->cloneFromDb;
my $feed = $receiver->getFeed($feedId);
##Note, cannot use Test::Deep in here because Asset/Event.pm use Test::Deep::NoTest
is $feed->{lastResult}, 'Error parsing iCal feed', 'After fetching a bad feed it updated the lastResult';
is $feed->{url}, $feedUrl, '... nothing added to feed URL';
#vim:ft=perl #vim:ft=perl

View file

@ -8,17 +8,17 @@ var draggableObjectList=new Array();
//Internal Config (Do not Edit) //Internal Config (Do not Edit)
//browser check //browser check
var dom=document.getElementById&&!document.all //var dom=document.getElementById&&!document.all
var docElement = document.documentElement; var docElement = document.documentElement;
var pageURL = ""; var pageURL = "";
var topelement=dom? "HTML" : "BODY" //var topelement=dom? "HTML" : "BODY"
var pageHeight=0; var pageHeight=0;
var pageWidth=0; var pageWidth=0;
var scrollJump=50; var scrollJump=50;
var blankCount=1; var blankCount=1;
var Dom = YAHOO.util.Dom; var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event; //var Event = YAHOO.util.Event;
var DDM = YAHOO.util.DragDropMgr; var DDM = YAHOO.util.DragDropMgr;
@ -26,6 +26,8 @@ var DDM = YAHOO.util.DragDropMgr;
//goes up the parent tree until class is found. If not found, returns null //goes up the parent tree until class is found. If not found, returns null
function dragable_getObjectByClass(target,clazz) { function dragable_getObjectByClass(target,clazz) {
var classMatch = new RegExp("\\b" + clazz + "\\b"); var classMatch = new RegExp("\\b" + clazz + "\\b");
var dom=document.getElementById&&!document.all;
var topelement=dom? "HTML" : "BODY";
while (target.tagName!=topelement && target.className.search(classMatch) == -1){ while (target.tagName!=topelement && target.className.search(classMatch) == -1){
target=dom? target.parentNode : target.parentElement target=dom? target.parentNode : target.parentElement
} }
@ -153,7 +155,7 @@ YAHOO.extend(YAHOO.webgui.DDList, YAHOO.util.DDProxy, {
onDrag: function(e) { onDrag: function(e) {
// Keep track of the direction of the drag for use during onDragOver // Keep track of the direction of the drag for use during onDragOver
var y = Event.getPageY(e); var y = YAHOO.util.Event.getPageY(e);
if (y < this.lastY) { if (y < this.lastY) {
this.goingUp = true; this.goingUp = true;
} else if (y > this.lastY) { } else if (y > this.lastY) {