8000 Add display label to Tiered Benefits (#2115) · python/pythondotorg@4cc633b · GitHub
[go: up one dir, main page]

Skip to content

Commit 4cc633b

Browse files
berinhardewdurbin
andauthored
Add display label to Tiered Benefits (#2115)
* 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>
1 parent 898b5b6 commit 4cc633b

File tree

12 files changed

+216
-140
lines changed

12 files changed

+216
-140
lines changed

fixtures/sponsors.json

Lines changed: 92 additions & 92 deletions
Large diffs are not rendered by default.

sponsors/admin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class BenefitFeatureConfigurationInline(StackedPolymorphicInline):
6767
class LogoPlacementConfigurationInline(StackedPolymorphicInline.Child):
6868
model = LogoPlacementConfiguration
6969

70-
class TieredQuantityConfigurationInline(StackedPolymorphicInline.Child):
71-
model = TieredQuantityConfiguration
70+
class TieredBenefitConfigurationInline(StackedPolymorphicInline.Child):
71+
model = TieredBenefitConfiguration
7272

7373
class EmailTargetableConfigurationInline(StackedPolymorphicInline.Child):
7474
model = EmailTargetableConfiguration
@@ -96,7 +96,7 @@ class ProvidedFileAssetConfigurationInline(StackedPolymorphicInline.Child):
9696
model = BenefitFeatureConfiguration
9797
child_inlines = [
9898
LogoPlacementConfigurationInline,
99-
TieredQuantityConfigurationInline,
99+
TieredBenefitConfigurationInline,
100100
EmailTargetableConfigurationInline,
101101
RequiredImgAssetConfigurationInline,
102102
RequiredTextAssetConfigurationInline,

sponsors/management/commands/fullfill_pycon_2022.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
SponsorBenefit,
1717
BenefitFeature,
1818
ProvidedTextAsset,
19-
TieredQuantity,
19+
TieredBenefit,
2020
)
2121

2222
API_KEY = settings.PYCON_API_KEY
@@ -77,7 +77,7 @@ def handle(self, **options):
7777
.all()
7878
):
7979
try:
80-
quantity = BenefitFeature.objects.instance_of(TieredQuantity).get(
80+
quantity = BenefitFeature.objects.instance_of(TieredBenefit).get(
8181
sponsor_benefit=sponsorbenefit
8282
)
8383
except BenefitFeature.DoesNotExist:
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 2.2.24 on 2022-08-10 16:47
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('contenttypes', '0002_remove_content_type_name'),
10+
('sponsors', '0086_auto_20220809_1655'),
11+
]
12+
13+
operations = [
14+
migrations.RenameModel(
15+
old_name='TieredQuantity',
16+
new_name='TieredBenefit',
17+
),
18+
migrations.RenameModel(
19+
old_name='TieredQuantityConfiguration',
20+
new_name='TieredBenefitConfiguration',
21+
),
22+
migrations.AlterModelOptions(
23+
name='tieredbenefit',
24+
options={'base_manager_name': 'objects', 'verbose_name': 'Tiered Benefit', 'verbose_name_plural': 'Tiered Benefits'},
25+
),
26+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 2.2.24 on 2022-08-10 16:55
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('sponsors', '0087_auto_20220810_1647'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='tieredbenefit',
15+
name='display_label',
16+
field=models.CharField(blank=True, default='', help_text='If populated, this will be displayed instead of the quantity value.', max_length=32),
17+
),
18+
migrations.AddField(
19+
model_name='tieredbenefitconfiguration',
20+
name='display_label',
21+
field=models.CharField(blank=True, default='', help_text='If populated, this will be displayed instead of the quantity value.', max_length=32),
22+
),
23+
]

sponsors/models/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from .assets import GenericAsset, ImgAsset, TextAsset, FileAsset, ResponseAsset
88
from .notifications import SponsorEmailNotificationTemplate, SPONSOR_TEMPLATE_HELP_TEXT
99
from .sponsors import Sponsor, SponsorContact, SponsorBenefit
10-
from .benefits import BaseLogoPlacement, BaseTieredQuantity, BaseEmailTargetable, BenefitFeatureConfiguration, \
11-
LogoPlacementConfiguration, TieredQuantityConfiguration, EmailTargetableConfiguration, BenefitFeature, \
12-
LogoPlacement, EmailTargetable, TieredQuantity, RequiredImgAsset, RequiredImgAssetConfiguration, \
10+
from .benefits import BaseLogoPlacement, BaseTieredBenefit, BaseEmailTargetable, BenefitFeatureConfiguration, \
11+
LogoPlacementConfiguration, TieredBenefitConfiguration, EmailTargetableConfiguration, BenefitFeature, \
12+
LogoPlacement, EmailTargetable, TieredBenefit, RequiredImgAsset, RequiredImgAssetConfiguration, \
1313
RequiredTextAssetConfiguration, RequiredTextAsset, RequiredResponseAssetConfiguration, RequiredResponseAsset, \
1414
ProvidedTextAssetConfiguration, ProvidedTextAsset, ProvidedFileAssetConfiguration, ProvidedFileAsset
1515
from .sponsorship import Sponsorship, SponsorshipProgram, SponsorshipBenefit, Sponsorship, SponsorshipPackage, \

sponsors/models/benefits.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,15 @@ class Meta:
4747
abstract = True
4848

4949

50-
class BaseTieredQuantity(models.Model):
50+
class BaseTieredBenefit(models.Model):
5151
package = models.ForeignKey("sponsors.SponsorshipPackage", on_delete=models.CASCADE)
5252
quantity = models.PositiveIntegerField()
53+
display_label = models.CharField(
54+
blank=True,
55+
default="",
56+
help_text="If populated, this will be displayed instead of the quantity value.",
57+
max_length=32,
58+
)
5359

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

396402

397-
class TieredQuantityConfiguration(BaseTieredQuantity, BenefitFeatureConfiguration):
403+
class TieredBenefitConfiguration(BaseTieredBenefit, BenefitFeatureConfiguration):
398404
"""
399405
Configuration for tiered quantities among packages
400406
"""
401407

402-
class Meta(BaseTieredQuantity.Meta, BenefitFeatureConfiguration.Meta):
408+
class Meta(BaseTieredBenefit.Meta, BenefitFeatureConfiguration.Meta):
403409
verbose_name = "Tiered Benefit Configuration"
404410
verbose_name_plural = "Tiered Benefit Configurations"
405411

406412
@property
407413
def benefit_feature_class(self):
408-
return TieredQuantity
414+
return TieredBenefit
409415

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

415421
def __str__(self):
416-
return f"Tiered Quantity Configuration for {self.benefit} and {self.package} ({self.quantity})"
422+
return f"Tiered Benefit Configuration for {self.benefit} and {self.package} ({self.quantity})"
417423

418424
def display_modifier(self, name, **kwargs):
419425
if kwargs.get("package") != self.package:
420426
return name
421-
return f"{name} ({self.quantity})"
427+
return f"{name} ({self.display_label or self.quantity})"
422428

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

434-
class Meta(BaseTieredQuantity.Meta, BenefitFeatureConfiguration.Meta):
440+
class Meta(BaseTieredBenefit.Meta, BenefitFeatureConfiguration.Meta):
435441
verbose_name = "Email Targetable Configuration"
436442
verbose_name_plural = "Email Targetable Configurations"
437443

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

556562

557-
class TieredQuantity(BaseTieredQuantity, BenefitFeature):
563+
class TieredBenefit(BaseTieredBenefit, BenefitFeature):
558564
"""
559-
Tiered Quantity feature for sponsor benefits
565+
Tiered Benefit feature for sponsor benefits
560566
"""
561567

562-
class Meta(BaseTieredQuantity.Meta, BenefitFeature.Meta):
563-
verbose_name = "Tiered Quantity"
564-
verbose_name_plural = "Tiered Quantities"
568+
class Meta(BaseTieredBenefit.Meta, BenefitFeature.Meta):
569+
verbose_name = "Tiered Benefit"
570+
verbose_name_plural = "Tiered Benefits"
565571

566572
def display_modifier(self, name, **kwargs):
567-
return f"{name} ({self.quantity})"
573+
return f"{name} ({self.display_label or self.quantity})"
568574

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

578-
class Meta(BaseTieredQuantity.Meta, BenefitFeature.Meta):
584+
class Meta(BaseTieredBenefit.Meta, BenefitFeature.Meta):
579585
verbose_name = "Email Targetable Benefit"
580586
verbose_name_plural = "Email Targetable Benefits"
581587

sponsors/models/sponsorship.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from sponsors.models.assets import GenericAsset
2525
from sponsors.models.managers import SponsorshipPackageQuerySet, SponsorshipBenefitQuerySet, \
2626
SponsorshipQuerySet, SponsorshipCurrentYearQuerySet
27-
from sponsors.models.benefits import TieredQuantityConfiguration
27+
from sponsors.models.benefits import TieredBenefitConfiguration
2828
from sponsors.models.sponsors import SponsorBenefit
2929

3030
YEAR_VALIDATORS = [
@@ -514,7 +514,7 @@ def name_for_display(self, package=None):
514514

515515
@cached_property
516516
def has_tiers(self):
517-
return self.features_config.instance_of(TieredQuantityConfiguration).count() > 0
517+
return self.features_config.instance_of(TieredBenefitConfiguration).count() > 0
518518

519519
@transaction.atomic
520520
def clone(self, year: int):

sponsors/templatetags/sponsors.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.conf import settings
66
from django.core.cache import cache
77

8-
from ..models import Sponsorship, SponsorshipPackage, TieredQuantityConfiguration
8+
from ..models import Sponsorship, SponsorshipPackage, TieredBenefitConfiguration
99
from sponsors.models.enums import PublisherChoices, LogoPlacementChoices
1010

1111

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

6161
@register.simple_tag
6262
def benefit_quantity_for_package(benefit, package):
63-
quantity_configuration = TieredQuantityConfiguration.objects.filter(
63+
quantity_configuration = TieredBenefitConfiguration.objects.filter(
6464
benefit=benefit, package=package
6565
).first()
6666
if quantity_configuration is None:
6767
return ""
68-
return quantity_configuration.quantity
68+
return quantity_configuration.display_label or quantity_configuration.quantity
6969

7070

7171
@register.simple_tag

sponsors/tests/test_managers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.conf import settings
55
from django.test import TestCase
66

7-
from ..models import Sponsorship, SponsorBenefit, LogoPlacement, TieredQuantity, RequiredTextAsset, RequiredImgAsset, \
7+
from ..models import Sponsorship, SponsorBenefit, LogoPlacement, TieredBenefit, RequiredTextAsset, RequiredImgAsset, \
88
BenefitFeature, SponsorshipPackage, SponsorshipBenefit, SponsorshipCurrentYear
99
from sponsors.models.enums import LogoPlacementChoices, PublisherChoices
1010

@@ -109,7 +109,7 @@ def test_filter_sponsorship_by_benefit_feature_type(self):
109109
sponsorship_feature_1 = baker.make_recipe('sponsors.tests.finalized_sponsorship')
110110
sponsorship_feature_2 = baker.make_recipe('sponsors.tests.finalized_sponsorship')
111111
baker.make(LogoPlacement, sponsor_benefit__sponsorship=sponsorship_feature_1)
112-
baker.make(TieredQuantity, sponsor_benefit__sponsorship=sponsorship_feature_2)
112+
baker.make(TieredBenefit, sponsor_benefit__sponsorship=sponsorship_feature_2)
113113

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

126126
def test_filter_benefits_from_sponsorship(self):
127-
feature_1 = baker.make(TieredQuantity, spons 820C or_benefit=self.benefit)
127+
feature_1 = baker.make(TieredBenefit, sponsor_benefit=self.benefit)
128128
feature_2 = baker.make(LogoPlacement, sponsor_benefit=self.benefit)
129129
baker.make(LogoPlacement) # benefit from other sponsor benefit
130130

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

137137
def test_filter_only_for_required_assets(self):
138-
baker.make(TieredQuantity)
138+
baker.make(TieredBenefit)
139139
text_asset = baker.make(RequiredTextAsset)
140140
img_asset = baker.make(RequiredImgAsset)
141141

0 commit comments

Comments
 (0)
0