Skip to content

Commit

Permalink
Add display label to Tiered Benefits (#2115)
Browse files Browse the repository at this point in the history
* Add missing migration after changing ordring of packages

The ordering in Meta was change by 0197bd5

* Rename TieredQuantity to TieredBenefit (both configuration and feature objects)

* Add display label field to base tiered benefits abstract model

* Update template tag to prioritize tiered benefit label over quantity

* Add assertions to make sure display label is correctly configured and cloned

* Update display modifiers to prioritize label instead of quantity

* correct migrations

* Update fixture file to match table new name

Co-authored-by: Ee Durbin <ewdurbin@gmail.com>
  • Loading branch information
berinhard and ewdurbin committed Aug 12, 2022
1 parent 898b5b6 commit 4cc633b
Show file tree
Hide file tree
Showing 12 changed files with 216 additions and 140 deletions.
184 changes: 92 additions & 92 deletions fixtures/sponsors.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions sponsors/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ class BenefitFeatureConfigurationInline(StackedPolymorphicInline):
class LogoPlacementConfigurationInline(StackedPolymorphicInline.Child):
model = LogoPlacementConfiguration

class TieredQuantityConfigurationInline(StackedPolymorphicInline.Child):
model = TieredQuantityConfiguration
class TieredBenefitConfigurationInline(StackedPolymorphicInline.Child):
model = TieredBenefitConfiguration

class EmailTargetableConfigurationInline(StackedPolymorphicInline.Child):
model = EmailTargetableConfiguration
Expand Down Expand Up @@ -96,7 +96,7 @@ class ProvidedFileAssetConfigurationInline(StackedPolymorphicInline.Child):
model = BenefitFeatureConfiguration
child_inlines = [
LogoPlacementConfigurationInline,
TieredQuantityConfigurationInline,
TieredBenefitConfigurationInline,
EmailTargetableConfigurationInline,
RequiredImgAssetConfigurationInline,
RequiredTextAssetConfigurationInline,
Expand Down
4 changes: 2 additions & 2 deletions sponsors/management/commands/fullfill_pycon_2022.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
SponsorBenefit,
BenefitFeature,
ProvidedTextAsset,
TieredQuantity,
TieredBenefit,
)

API_KEY = settings.PYCON_API_KEY
Expand Down Expand Up @@ -77,7 +77,7 @@ def handle(self, **options):
.all()
):
try:
quantity = BenefitFeature.objects.instance_of(TieredQuantity).get(
quantity = BenefitFeature.objects.instance_of(TieredBenefit).get(
sponsor_benefit=sponsorbenefit
)
except BenefitFeature.DoesNotExist:
Expand Down
26 changes: 26 additions & 0 deletions sponsors/migrations/0087_auto_20220810_1647.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Generated by Django 2.2.24 on 2022-08-10 16:47

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('sponsors', '0086_auto_20220809_1655'),
]

operations = [
migrations.RenameModel(
old_name='TieredQuantity',
new_name='TieredBenefit',
),
migrations.RenameModel(
old_name='TieredQuantityConfiguration',
new_name='TieredBenefitConfiguration',
),
migrations.AlterModelOptions(
name='tieredbenefit',
options={'base_manager_name': 'objects', 'verbose_name': 'Tiered Benefit', 'verbose_name_plural': 'Tiered Benefits'},
),
]
23 changes: 23 additions & 0 deletions sponsors/migrations/0088_auto_20220810_1655.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 2.2.24 on 2022-08-10 16:55

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('sponsors', '0087_auto_20220810_1647'),
]

operations = [
migrations.AddField(
model_name='tieredbenefit',
name='display_label',
field=models.CharField(blank=True, default='', help_text='If populated, this will be displayed instead of the quantity value.', max_length=32),
),
migrations.AddField(
model_name='tieredbenefitconfiguration',
name='display_label',
field=models.CharField(blank=True, default='', help_text='If populated, this will be displayed instead of the quantity value.', max_length=32),
),
]
6 changes: 3 additions & 3 deletions sponsors/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
from .assets import GenericAsset, ImgAsset, TextAsset, FileAsset, ResponseAsset
from .notifications import SponsorEmailNotificationTemplate, SPONSOR_TEMPLATE_HELP_TEXT
from .sponsors import Sponsor, SponsorContact, SponsorBenefit
from .benefits import BaseLogoPlacement, BaseTieredQuantity, BaseEmailTargetable, BenefitFeatureConfiguration, \
LogoPlacementConfiguration, TieredQuantityConfiguration, EmailTargetableConfiguration, BenefitFeature, \
LogoPlacement, EmailTargetable, TieredQuantity, RequiredImgAsset, RequiredImgAssetConfiguration, \
from .benefits import BaseLogoPlacement, BaseTieredBenefit, BaseEmailTargetable, BenefitFeatureConfiguration, \
LogoPlacementConfiguration, TieredBenefitConfiguration, EmailTargetableConfiguration, BenefitFeature, \
LogoPlacement, EmailTargetable, TieredBenefit, RequiredImgAsset, RequiredImgAssetConfiguration, \
RequiredTextAssetConfiguration, RequiredTextAsset, RequiredResponseAssetConfiguration, RequiredResponseAsset, \
ProvidedTextAssetConfiguration, ProvidedTextAsset, ProvidedFileAssetConfiguration, ProvidedFileAsset
from .sponsorship import Sponsorship, SponsorshipProgram, SponsorshipBenefit, Sponsorship, SponsorshipPackage, \
Expand Down
34 changes: 20 additions & 14 deletions sponsors/models/benefits.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,15 @@ class Meta:
abstract = True


class BaseTieredQuantity(models.Model):
class BaseTieredBenefit(models.Model):
package = models.ForeignKey("sponsors.SponsorshipPackage", on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
display_label = models.CharField(
blank=True,
default="",
help_text="If populated, this will be displayed instead of the quantity value.",
max_length=32,
)

class Meta:
abstract = True
Expand Down Expand Up @@ -394,31 +400,31 @@ def __str__(self):
return f"Logo Configuration for {self.get_publisher_display()} at {self.get_logo_place_display()}"


class TieredQuantityConfiguration(BaseTieredQuantity, BenefitFeatureConfiguration):
class TieredBenefitConfiguration(BaseTieredBenefit, BenefitFeatureConfiguration):
"""
Configuration for tiered quantities among packages
"""

class Meta(BaseTieredQuantity.Meta, BenefitFeatureConfiguration.Meta):
class Meta(BaseTieredBenefit.Meta, BenefitFeatureConfiguration.Meta):
verbose_name = "Tiered Benefit Configuration"
verbose_name_plural = "Tiered Benefit Configurations"

@property
def benefit_feature_class(self):
return TieredQuantity
return TieredBenefit

def get_benefit_feature_kwargs(self, **kwargs):
if kwargs["sponsor_benefit"].sponsorship.package == self.package:
return super().get_benefit_feature_kwargs(**kwargs)
return None

def __str__(self):
return f"Tiered Quantity Configuration for {self.benefit} and {self.package} ({self.quantity})"
return f"Tiered Benefit Configuration for {self.benefit} and {self.package} ({self.quantity})"

def display_modifier(self, name, **kwargs):
if kwargs.get("package") != self.package:
return name
return f"{name} ({self.quantity})"
return f"{name} ({self.display_label or self.quantity})"

def get_clone_kwargs(self, new_benefit):
kwargs = super().get_clone_kwargs(new_benefit)
Expand All @@ -431,7 +437,7 @@ class EmailTargetableConfiguration(BaseEmailTargetable, BenefitFeatureConfigurat
Configuration for email targeatable benefits
"""

class Meta(BaseTieredQuantity.Meta, BenefitFeatureConfiguration.Meta):
class Meta(BaseTieredBenefit.Meta, BenefitFeatureConfiguration.Meta):
verbose_name = "Email Targetable Configuration"
verbose_name_plural = "Email Targetable Configurations"

Expand Down Expand Up @@ -554,17 +560,17 @@ def __str__(self):
return f"Logo for {self.get_publisher_display()} at {self.get_logo_place_display()}"


class TieredQuantity(BaseTieredQuantity, BenefitFeature):
class TieredBenefit(BaseTieredBenefit, BenefitFeature):
"""
Tiered Quantity feature for sponsor benefits
Tiered Benefit feature for sponsor benefits
"""

class Meta(BaseTieredQuantity.Meta, BenefitFeature.Meta):
verbose_name = "Tiered Quantity"
verbose_name_plural = "Tiered Quantities"
class Meta(BaseTieredBenefit.Meta, BenefitFeature.Meta):
verbose_name = "Tiered Benefit"
verbose_name_plural = "Tiered Benefits"

def display_modifier(self, name, **kwargs):
return f"{name} ({self.quantity})"
return f"{name} ({self.display_label or self.quantity})"

def __str__(self):
return f"{self.quantity} of {self.sponsor_benefit} for {self.package}"
Expand All @@ -575,7 +581,7 @@ class EmailTargetable(BaseEmailTargetable, BenefitFeature):
For email targeatable benefits
"""

class Meta(BaseTieredQuantity.Meta, BenefitFeature.Meta):
class Meta(BaseTieredBenefit.Meta, BenefitFeature.Meta):
verbose_name = "Email Targetable Benefit"
verbose_name_plural = "Email Targetable Benefits"

Expand Down
4 changes: 2 additions & 2 deletions sponsors/models/sponsorship.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
from sponsors.models.assets import GenericAsset
from sponsors.models.managers import SponsorshipPackageQuerySet, SponsorshipBenefitQuerySet, \
SponsorshipQuerySet, SponsorshipCurrentYearQuerySet
from sponsors.models.benefits import TieredQuantityConfiguration
from sponsors.models.benefits import TieredBenefitConfiguration
from sponsors.models.sponsors import SponsorBenefit

YEAR_VALIDATORS = [
Expand Down Expand Up @@ -514,7 +514,7 @@ def name_for_display(self, package=None):

@cached_property
def has_tiers(self):
return self.features_config.instance_of(TieredQuantityConfiguration).count() > 0
return self.features_config.instance_of(TieredBenefitConfiguration).count() > 0

@transaction.atomic
def clone(self, year: int):
Expand Down
6 changes: 3 additions & 3 deletions sponsors/templatetags/sponsors.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.conf import settings
from django.core.cache import cache

from ..models import Sponsorship, SponsorshipPackage, TieredQuantityConfiguration
from ..models import Sponsorship, SponsorshipPackage, TieredBenefitConfiguration
from sponsors.models.enums import PublisherChoices, LogoPlacementChoices


Expand Down Expand Up @@ -60,12 +60,12 @@ def list_sponsors(logo_place, publisher=PublisherChoices.FOUNDATION.value):

@register.simple_tag
def benefit_quantity_for_package(benefit, package):
quantity_configuration = TieredQuantityConfiguration.objects.filter(
quantity_configuration = TieredBenefitConfiguration.objects.filter(
benefit=benefit, package=package
).first()
if quantity_configuration is None:
return ""
return quantity_configuration.quantity
return quantity_configuration.display_label or quantity_configuration.quantity


@register.simple_tag
Expand Down
8 changes: 4 additions & 4 deletions sponsors/tests/test_managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.conf import settings
from django.test import TestCase

from ..models import Sponsorship, SponsorBenefit, LogoPlacement, TieredQuantity, RequiredTextAsset, RequiredImgAsset, \
from ..models import Sponsorship, SponsorBenefit, LogoPlacement, TieredBenefit, RequiredTextAsset, RequiredImgAsset, \
BenefitFeature, SponsorshipPackage, SponsorshipBenefit, SponsorshipCurrentYear
from sponsors.models.enums import LogoPlacementChoices, PublisherChoices

Expand Down Expand Up @@ -109,7 +109,7 @@ def test_filter_sponsorship_by_benefit_feature_type(self):
sponsorship_feature_1 = baker.make_recipe('sponsors.tests.finalized_sponsorship')
sponsorship_feature_2 = baker.make_recipe('sponsors.tests.finalized_sponsorship')
baker.make(LogoPlacement, sponsor_benefit__sponsorship=sponsorship_feature_1)
baker.make(TieredQuantity, sponsor_benefit__sponsorship=sponsorship_feature_2)
baker.make(TieredBenefit, sponsor_benefit__sponsorship=sponsorship_feature_2)

with self.assertNumQueries(1):
qs = list(Sponsorship.objects.includes_benefit_feature(LogoPlacement))
Expand All @@ -124,7 +124,7 @@ def setUp(self):
self.benefit = baker.make(SponsorBenefit, sponsorship=self.sponsorship)

def test_filter_benefits_from_sponsorship(self):
feature_1 = baker.make(TieredQuantity, sponsor_benefit=self.benefit)
feature_1 = baker.make(TieredBenefit, sponsor_benefit=self.benefit)
feature_2 = baker.make(LogoPlacement, sponsor_benefit=self.benefit)
baker.make(LogoPlacement) # benefit from other sponsor benefit

Expand All @@ -135,7 +135,7 @@ def test_filter_benefits_from_sponsorship(self):
self.assertIn(feature_2, qs)

def test_filter_only_for_required_assets(self):
baker.make(TieredQuantity)
baker.make(TieredBenefit)
text_asset = baker.make(RequiredTextAsset)
img_asset = baker.make(RequiredImgAsset)

Expand Down

0 comments on commit 4cc633b

Please sign in to comment.