diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt
index b8dc4f954..0d80333f5 100644
--- a/docs/changelog/7.x.x.txt
+++ b/docs/changelog/7.x.x.txt
@@ -1,4 +1,5 @@
7.7.19
+ - fixed #10843: Ad Sales: how many do I have to buy?
- fixed #10835: Ad Sales: Ad Space field not user-friendly
- fixed #10841: Ad Sales: hover help spelling error
- fixed #10833: Calendar feeds not versioned, not duplicated
diff --git a/docs/upgrades/packages-7.7.19/root_import_ad-sku_default-purchase-ad-sku-template.wgpkg b/docs/upgrades/packages-7.7.19/root_import_ad-sku_default-purchase-ad-sku-template.wgpkg
new file mode 100644
index 000000000..8f1312722
Binary files /dev/null and b/docs/upgrades/packages-7.7.19/root_import_ad-sku_default-purchase-ad-sku-template.wgpkg differ
diff --git a/lib/WebGUI/Asset/Sku/Ad.pm b/lib/WebGUI/Asset/Sku/Ad.pm
index a79abd770..572d1325a 100644
--- a/lib/WebGUI/Asset/Sku/Ad.pm
+++ b/lib/WebGUI/Asset/Sku/Ad.pm
@@ -153,6 +153,20 @@ sub getAddToCartForm {
#-------------------------------------------------------------------
+=head2 getAdSpace
+
+Returns an AdSpace object for this Ad Sku.
+
+=cut
+
+sub getAdSpace {
+ my $self = shift;
+ my $adSpace = WebGUI::AdSpace->new($self->session,$self->get('adSpace'));
+ return $adSpace;
+}
+
+#-------------------------------------------------------------------
+
=head2 getClickDiscountText
returns the text to display the number of clicks purchasaed where discounts apply
@@ -458,56 +472,56 @@ sub view {
my $session = $self->session;
my $options = $self->getOptions();
- my $i18n = WebGUI::International->new($session, "Asset_AdSku");
+ my $i18n = WebGUI::International->new($session, "Asset_AdSku");
+ my $adSpace = $self->getAdSpace;
my %var = (
formHeader => WebGUI::Form::formHeader($session, { action=>$self->getUrl })
- . WebGUI::Form::hidden( $session, { name=>"func", value=>"addToCart" }),
+ . WebGUI::Form::hidden( $session, { name=>"func", value=>"addToCart" }),
formFooter => WebGUI::Form::formFooter($session),
formSubmit => WebGUI::Form::submit( $session, { value => $i18n->get("form purchase button") }),
- error_msg => $options->{error_msg},
+ error_msg => $options->{error_msg},
hasAddedToCart => $self->{_hasAddedToCart},
continueShoppingUrl => $self->getUrl,
- manageLink => $self->getUrl("func=manage"),
- adSkuTitle => $self->get('title'),
- adSkuDescription => $self->get('description'),
- formTitle => WebGUI::Form::text($session, {
- -name=>"formTitle",
- -value=>$options->{adtitle},
- -size=>40
- -default=>'untitled',
- }),
- formLink => WebGUI::Form::Url($session, {
- -name=>"formLink",
- -value=>$options->{link},
- -size=>40
- -required=>1,
- }),
- formImage => WebGUI::Form::File($session, {
- -name=>"formImage",
- -value=>$options->{image},
- -size=>40
- -forceImageOnly=>1,
- }),
+ manageLink => $self->getUrl("func=manage"),
+ adSkuTitle => $self->get('title'),
+ adSkuDescription => $self->get('description'),
+ formTitle => WebGUI::Form::text($session, {
+ -name => "formTitle",
+ -value => $options->{adtitle},
+ -size => 40
+ -defaultValue => 'untitled',
+ }),
+ formLink => WebGUI::Form::Url($session, {
+ -name=>"formLink",
+ -value=>$options->{link},
+ -size=>40
+ }),
+ formImage => WebGUI::Form::File($session, {
+ -name=>"formImage",
+ -value=>$options->{image},
+ -size=>40
+ -forceImageOnly=>1,
+ }),
formClicks => WebGUI::Form::Integer($session, {
- -name=>"formClicks",
- -value=>$options->{clicks},
- -size=>40
- -required=>1,
- }),
- formImpressions => WebGUI::Form::Integer($session, {
- -name=>"formImpressions",
- -value=>$options->{impressions},
- -size=>40
- -required=>1,
- }),
- formAdId => WebGUI::Form::Hidden($session, {
- -name=>"formAdId",
- -value=>$options->{adId} || '',
- }),
- clickPrice => $self->get('pricePerClick'),
- impressionPrice => $self->get('pricePerImpression'),
- clickDiscount => $self->getClickDiscountText,
- impressionDiscount => $self->getImpressionDiscountText,
+ -name=>"formClicks",
+ -value=>$options->{clicks},
+ -size=>40
+ }),
+ formImpressions => WebGUI::Form::Integer($session, {
+ -name=>"formImpressions",
+ -value=>$options->{impressions},
+ -size=>40
+ }),
+ formAdId => WebGUI::Form::Hidden($session, {
+ -name=>"formAdId",
+ -value=>$options->{adId} || '',
+ }),
+ clickPrice => $self->get('pricePerClick'),
+ impressionPrice => $self->get('pricePerImpression'),
+ minimumClicks => $adSpace->get('minimumClicks'),
+ minimumImpressions => $adSpace->get('minimumImpressions'),
+ clickDiscount => $self->getClickDiscountText,
+ impressionDiscount => $self->getImpressionDiscountText,
);
return $self->processTemplate(\%var,undef,$self->{_viewTemplate});
}
@@ -521,66 +535,72 @@ Add this subscription to the cart.
=cut
sub www_addToCart {
- my $self = shift;
+ my $self = shift;
+ return $self->session->privilege->insufficient() unless $self->canView;
my $session = $self->session;
- my $i18n = $self->i18n;
- if ($self->canView) {
- my $form = $session->form;
- my @errors;
- #my $imageStorage = $self->getOptions->{image} || WebGUI::Storage->create($session); # LATER should be createTemp
- my $imageStorageId = $form->process('formImage', 'image'); # , $self->getOptions->{image});
- my $imageStorage = WebGUI::Storage->get($session,$imageStorageId);
- my $code;
- if( not defined $imageStorage ) { $code = 1; }
- elsif( $imageStorage->getErrorCount > 0 ) { $code = 2; }
- elsif( scalar(@{$imageStorage->getFiles}) == 0 ) { $code = 3; }
- elsif( $imageStorage->isImage((@{$imageStorage->getFiles})[0]) ) { $code = 4; }
- if( not defined $imageStorage
- or $imageStorage->getErrorCount > 0
- or scalar(@{$imageStorage->getFiles}) == 0
- # or $imageStorage->isImage((@{$imageStorage->getFiles})[0]) # not currently working
- ) {
- push @errors, $i18n->get('form error no image') . $code . eval { (@{$imageStorage->getFiles})[0] } ;
- }
- my $title = $form->process('formTitle');
- if($title eq '' ) {
- push @errors, $i18n->get('form error no title');
- }
- my $link = $form->process('formLink','url');
- if($link eq '' ) {
- push @errors, $i18n->get('form error no link');
- }
- my $adId = $self->get('adSpace');
- my $adSpace = WebGUI::AdSpace->new($session,$adId);
- my $clicks = $form->process('formClicks','integer');
- if($clicks < $adSpace->get('minimumClicks') ) {
- push @errors, sprintf($i18n->get('form error min clicks'), $adSpace->get('minimumClicks'));
- }
- my $impressions = $form->process('formImpressions','integer');
- if($impressions < $adSpace->get('minimumImpressions') ) {
- push @errors, sprintf($i18n->get('form error min impressions'), $adSpace->get('minimumImpressions'));
- }
- if( @errors == 0 ) {
- $self->{_hasAddedToCart} = 1;
- $self->addToCart({
- adtitle => $title,
- link => $link,
- clicks => $clicks,
- impressions => $impressions,
- adId => $adId,
- image => $imageStorageId,
- });
- } else {
- $self->applyOptions({
- adtitle => $title,
- link => $link,
- clicks => $clicks,
- impressions => $impressions,
- adId => $adId,
- image => $imageStorageId,
- error_msg => join( '
', @errors ),
- });
- }
+ my $i18n = $self->i18n;
+ my $form = $session->form;
+ my @errors;
+#my $imageStorage = $self->getOptions->{image} || WebGUI::Storage->create($session); # LATER should be createTemp
+ my $imageStorageId = $form->process('formImage', 'image'); # , $self->getOptions->{image});
+ my $imageStorage = WebGUI::Storage->get($session,$imageStorageId);
+ my $code;
+ if( not defined $imageStorage ) {
+ $code = 1;
+ }
+ elsif( $imageStorage->getErrorCount > 0 ) {
+ $code = 2;
+ }
+ elsif( scalar(@{$imageStorage->getFiles}) == 0 ) {
+ $code = 3;
+ }
+ elsif( $imageStorage->isImage((@{$imageStorage->getFiles})[0]) ) {
+ $code = 4;
+ }
+ if( not defined $imageStorage
+ or $imageStorage->getErrorCount > 0
+ or scalar(@{$imageStorage->getFiles}) == 0) {
+ push @errors, $i18n->get('form error no image') . $code . eval { (@{$imageStorage->getFiles})[0] } ;
+ }
+ my $title = $form->process('formTitle');
+ if($title eq '' ) {
+ push @errors, $i18n->get('form error no title');
+ }
+ my $link = $form->process('formLink','url');
+ if($link eq '' ) {
+ push @errors, $i18n->get('form error no link');
+ }
+ my $adSpace = $self->getAdSpace;
+ my $adId = $self->get('adId');
+ my $clicks = $form->process('formClicks','integer');
+ if($clicks < $adSpace->get('minimumClicks') ) {
+ push @errors, sprintf($i18n->get('form error min clicks'), $adSpace->get('minimumClicks'));
+ }
+ my $impressions = $form->process('formImpressions','integer');
+ if($impressions < $adSpace->get('minimumImpressions') ) {
+ push @errors, sprintf($i18n->get('form error min impressions'), $adSpace->get('minimumImpressions'));
+ }
+ if( @errors == 0 ) {
+ $self->{_hasAddedToCart} = 1;
+ $self->addToCart({
+ adtitle => $title,
+ link => $link,
+ clicks => $clicks,
+ impressions => $impressions,
+ adId => $adId,
+ image => $imageStorageId,
+ });
+ }
+ else {
+ $self->applyOptions({
+ adtitle => $title,
+ link => $link,
+ clicks => $clicks,
+ impressions => $impressions,
+ adId => $adId,
+ image => $imageStorageId,
+ error_msg => join( '
', @errors ),
+ });
}
return $self->www_view;
}
@@ -594,18 +614,18 @@ manage previously purchased ads
=cut
sub www_manage {
- my $self = shift;
- my $check = $self->checkView;
- return $check if (defined $check);
- $self->session->http->setLastModified($self->getContentLastModified);
- $self->session->http->sendHeader;
- $self->prepareManage;
- my $style = $self->processStyle($self->getSeparator);
- my ($head, $foot) = split($self->getSeparator,$style);
- $self->session->output->print($head, 1);
- $self->session->output->print($self->manage);
- $self->session->output->print($foot, 1);
- return "chunked";
+ my $self = shift;
+ my $check = $self->checkView;
+ return $check if (defined $check);
+ $self->session->http->setLastModified($self->getContentLastModified);
+ $self->session->http->sendHeader;
+ $self->prepareManage;
+ my $style = $self->processStyle($self->getSeparator);
+ my ($head, $foot) = split($self->getSeparator,$style);
+ $self->session->output->print($head, 1);
+ $self->session->output->print($self->manage);
+ $self->session->output->print($foot, 1);
+ return "chunked";
}
#-------------------------------------------------------------------
@@ -617,20 +637,20 @@ renew an ad
=cut
sub www_renew {
- my $self = shift;
- my $session = $self->session;
- my $id = $session->form->get('Id');
- my $crud = WebGUI::AssetCollateral::Sku::Ad::Ad->new($session,$id);
- my $ad = WebGUI::AdSpace::Ad->new($session,$crud->get('adId'));
- $self->applyOptions({
- adtitle => $ad->get('title'),
- clicks => $crud->get('clicksPurchased'),
- impressions => $crud->get('impressionsPurchased'),
- link => $ad->get('url'),
- image => $ad->get('storageId'),
- adId => $crud->get('adId'),
- });
- return $self->www_view;
+ my $self = shift;
+ my $session = $self->session;
+ my $id = $session->form->get('Id');
+ my $crud = WebGUI::AssetCollateral::Sku::Ad::Ad->new($session,$id);
+ my $ad = WebGUI::AdSpace::Ad->new($session,$crud->get('adId'));
+ $self->applyOptions({
+ adtitle => $ad->get('title'),
+ clicks => $crud->get('clicksPurchased'),
+ impressions => $crud->get('impressionsPurchased'),
+ link => $ad->get('url'),
+ image => $ad->get('storageId'),
+ adId => $crud->get('adId'),
+ });
+ return $self->www_view;
}
1;
diff --git a/lib/WebGUI/i18n/English/Asset_AdSku.pm b/lib/WebGUI/i18n/English/Asset_AdSku.pm
index 1fdf52d39..41b34e972 100644
--- a/lib/WebGUI/i18n/English/Asset_AdSku.pm
+++ b/lib/WebGUI/i18n/English/Asset_AdSku.pm
@@ -129,6 +129,18 @@ our $I18N = {
context => q|%f is the price charged for each impression of the ad.|
},
+ 'minimum impressions' => {
+ message => q|Must buy at least %d impressions|,
+ lastUpdated => 0,
+ context => q|%d is the number of impressions that must be bought.|
+ },
+
+ 'minimum clicks' => {
+ message => q|Must buy at least %d clicks|,
+ lastUpdated => 0,
+ context => q|%d is the number of clicks that must be bought.|
+ },
+
'form manage title' => {
message => q|Manage My Ads|,
lastUpdated => 0,