8000 Add display label to Tiered Benefits by berinhard · Pull Request #2115 · python/pythondotorg · GitHub
[go: up one dir, main page]

Skip to content

Add display label to Tiered Benefits #2115

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Aug 12, 2022
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 F438 ["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
6377
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
Loading
0