Skip to content

Commit f93f52e

Browse files
authored
Sponsorship (maybe) final UX bugfixes (#1682)
* Separate package benefits in application form * Flag sponsors benefits added by user * Split package and added benefits in full sponsorship detail * Filter by package only benefits
1 parent 21853df commit f93f52e

File tree

8 files changed

+95
-12
lines changed

8 files changed

+95
-12
lines changed

sponsors/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class SponsorshipBenefitAdmin(OrderedModelAdmin):
4040
"internal_value",
4141
"move_up_down_links",
4242
]
43-
list_filter = ["program"]
43+
list_filter = ["program", "package_only"]
4444
search_fields = ["name"]
4545

4646
fieldsets = [
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 2.0.13 on 2020-11-20 14:43
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("sponsors", "0016_auto_20201119_1448"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="sponsorbenefit",
15+
name="added_by_user",
16+
field=models.BooleanField(default=False, verbose_name="Added by user?"),
17+
),
18+
]

sponsors/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.db.models import Sum
55
from django.template.defaultfilters import truncatechars
66
from django.utils import timezone
7+
from django.utils.functional import cached_property
78
from django.urls import reverse
89
from markupfield.fields import MarkupField
910
from ordered_model.models import OrderedModel, OrderedModelManager
@@ -266,7 +267,9 @@ def new(cls, sponsor, benefits, package=None, submited_by=None):
266267
This will create SponsorBenefit copies from the benefits
267268
"""
268269
for_modified_package = False
270+
package_benefits = []
269271
if package and package.has_user_customization(benefits):
272+
package_benefits = package.benefits.all()
270273
for_modified_package = True
271274
elif not package:
272275
for_modified_package = True
@@ -283,13 +286,16 @@ def new(cls, sponsor, benefits, package=None, submited_by=None):
283286
)
284287

285288
for benefit in benefits:
289+
added_by_user = for_modified_package and benefit not in package_benefits
290+
286291
SponsorBenefit.objects.create(
287292
sponsorship=sponsorship,
288293
sponsorship_benefit=benefit,
289294
name=benefit.name,
290295
description=benefit.description,
291296
program=benefit.program,
292297
benefit_internal_value=benefit.internal_value,
298+
added_by_user=added_by_user,
293299
)
294300

295301
return sponsorship
@@ -322,6 +328,14 @@ def verified_emails(self):
322328
def admin_url(self):
323329
return reverse("admin:sponsors_sponsorship_change", args=[self.pk])
324330

331+
@cached_property
332+
def package_benefits(self):
333+
return self.benefits.filter(added_by_user=False)
334+
335+
@cached_property
336+
def added_benefits(self):
337+
return self.benefits.filter(added_by_user=True)
338+
325339

326340
class SponsorBenefit(models.Model):
327341
sponsorship = models.ForeignKey(
@@ -359,6 +373,9 @@ class SponsorBenefit(models.Model):
359373
verbose_name="Benefit Internal Value",
360374
help_text=("Benefit's internal value from when the Sponsorship gets created"),
361375
)
376+
added_by_user = models.BooleanField(
377+
blank=True, default=False, verbose_name="Added by user?"
378+
)
362379

363380

364381
class Sponsor(ContentManageable):

sponsors/tests/test_models.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ def test_create_new_sponsorship(self):
6464
self.assertEqual(sponsorship.benefits.count(), len(self.benefits))
6565
for benefit in self.benefits:
6666
sponsor_benefit = sponsorship.benefits.get(sponsorship_benefit=benefit)
67+
self.assertTrue(sponsor_benefit.added_by_user)
6768
self.assertEqual(sponsor_benefit.name, benefit.name)
6869
self.assertEqual(sponsor_benefit.description, benefit.description)
6970
self.assertEqual(sponsor_benefit.program, benefit.program)
@@ -79,6 +80,8 @@ def test_create_new_sponsorship_with_package(self):
7980
self.assertEqual(sponsorship.level_name, "PSF Sponsorship Program")
8081
self.assertEqual(sponsorship.sponsorship_fee, 100)
8182
self.assertFalse(sponsorship.for_modified_package)
83+
for benefit in sponsorship.benefits.all():
84+
self.assertFalse(benefit.added_by_user)
8285

8386
def test_create_new_sponsorship_with_package_modifications(self):
8487
benefits = self.benefits[:2]
@@ -88,6 +91,24 @@ def test_create_new_sponsorship_with_package_modifications(self):
8891

8992
self.assertTrue(sponsorship.for_modified_package)
9093
self.assertEqual(sponsorship.benefits.count(), 2)
94+
for benefit in sponsorship.benefits.all():
95+
self.assertFalse(benefit.added_by_user)
96+
97+
def test_create_new_sponsorship_with_package_added_benefit(self):
98+
extra_benefit = baker.make(SponsorshipBenefit)
99+
benefits = self.benefits + [extra_benefit]
100+
sponsorship = Sponsorship.new(self.sponsor, benefits, package=self.package)
101+
sponsorship.refresh_from_db()
102+
103+
self.assertTrue(sponsorship.for_modified_package)
104+
self.assertEqual(sponsorship.benefits.count(), 6)
105+
for benefit in self.benefits:
106+
sponsor_benefit = sponsorship.benefits.get(sponsorship_benefit=benefit)
107+
self.assertFalse(sponsor_benefit.added_by_user)
108+
self.assertIn(sponsor_benefit, sponsorship.package_benefits)
109+
sponsor_benefit = sponsorship.benefits.get(sponsorship_benefit=extra_benefit)
110+
self.assertTrue(sponsor_benefit.added_by_user)
111+
self.assertEqual([sponsor_benefit], list(sponsorship.added_benefits))
91112

92113
def test_estimated_cost_property(self):
93114
sponsorship = Sponsorship.new(self.sponsor, self.benefits)

sponsors/tests/test_views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ def test_display_template_with_form_and_context(self):
191191
self.assertEqual(
192192
len(r.context["sponsorship_benefits"]), len(self.program_1_benefits)
193193
)
194+
self.assertEqual(len(r.context["added_benefits"]), 0)
194195
self.assertEqual(
195196
r.context["sponsorship_price"], self.package.sponsorship_amount
196197
)
@@ -206,6 +207,8 @@ def test_return_package_as_none_if_not_previously_selected(self):
206207
r = self.client.get(self.url)
207208
self.assertIsNone(r.context["sponsorship_package"])
208209
self.assertIsNone(r.context["sponsorship_price"])
210+
self.assertEqual(len(r.context["added_benefits"]), len(self.program_1_benefits))
211+
self.assertEqual(len(r.context["sponsorship_benefits"]), 0)
209212

210213
def test_no_sponsorship_price_if_customized_benefits(self):
211214
extra_benefit = baker.make(SponsorshipBenefit)
@@ -221,8 +224,9 @@ def test_no_sponsorship_price_if_customized_benefits(self):
221224

222225
self.assertEqual(r.context["sponsorship_package"], self.package)
223226
self.assertIsNone(r.context["sponsorship_price"])
224-
for benefit in benefits:
227+
for benefit in self.program_1_benefits:
225228
self.assertIn(benefit, r.context["sponsorship_benefits"])
229+
self.assertIn(extra_benefit, r.context["added_benefits"])
226230

227231
def test_display_form_with_errors_if_invalid_post(self):
228232
r = self.client.post(self.url, {})

sponsors/views.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,29 @@ def get_context_data(self, *args, **kwargs):
122122
*[self.benefits_data[k] for k in self.benefits_data if k != "package"]
123123
)
124124
benefits = SponsorshipBenefit.objects.filter(id__in=benefits_ids)
125-
price = None
126125

126+
# sponsorship benefits holds selected package's benefits
127+
# added benefits holds holds extra benefits added by users
128+
added_benefits, sponsorship_benefits = [], benefits
129+
price = None
127130
if package and not package.has_user_customization(benefits):
128131
price = package.sponsorship_amount
132+
elif package:
133+
sponsorship_benefits = []
134+
package_benefits = package.benefits.all()
135+
for benefit in benefits:
136+
if benefit in package_benefits:
137+
sponsorship_benefits.append(benefit)
138+
else:
139+
added_benefits.append(benefit)
140+
else:
141+
added_benefits, sponsorship_benefits = sponsorship_benefits, []
129142

130143
kwargs.update(
131144
{
132145
"sponsorship_package": package,
133-
"sponsorship_benefits": benefits,
146+
"sponsorship_benefits": sponsorship_benefits,
147+
"added_benefits": added_benefits,
134148
"sponsorship_price": price,
135149
}
136150
)

templates/sponsors/new_sponsorship_application_form.html

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,25 @@
1010
<h1>Submit Sponsorship Information</h1>
1111

1212
<div id="sponsorship-info-container" class="user-feedback level-general">
13-
<p>
1413
{% if sponsorship_package %}
14+
<p>
1515
You selected the <b>{{ sponsorship_package.name }}</b> package {% if sponsorship_price %}costing ${{ sponsorship_price|intcomma }} USD {% endif %}and the following benefits:
16-
{% else %}
17-
You selected the following benefits:
18-
{% endif %}
1916
</p>
2017
<ul>
2118
{% for benefit in sponsorship_benefits %}
2219
<li>{{ benefit.name }}</li>
2320
{% endfor %}
2421
</ul>
22+
{% endif %}
23+
24+
{% if added_benefits %}
25+
<p>Added benefits:</p>
26+
<ul>
27+
{% for benefit in added_benefits %}
28+
<li>{{ benefit.name }}</li>
29+
{% endfor %}
30+
</ul>
31+
{% endif %}
2532
<p><i>Please complete the form below.</i></p>
2633
<span class="remove"><label id="close-info-container">Close</label> | <a href="{% url 'select_sponsorship_application_benefits' %}">Back to select benefits</a></span>
2734
</div>

templates/sponsors/partials/full_sponsorship.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
# Sponsorship Information
1212
* Status {{ sponsorship.status }}
1313
{% if sponsorship.level_name %} * Level {{ sponsorship.level_name }}{% else %} * Level Custom Package{% endif %}
14-
{% if for_modified_package %} * Sponsorship Fee To be determined{% else %} * Sponsorship Fee ${{ sponsorship.sponsorship_fee|intcomma }} USD{% endif %}
15-
* Benefits
16-
{% for benefit in benefits %} - {{ benefit.program.name }} - {{ benefit.name }}
17-
{% endfor %}
14+
{% if sponsorship.for_modified_package %} * Sponsorship Fee To be determined{% else %} * Sponsorship Fee ${{ sponsorship.sponsorship_fee|intcomma }} USD{% endif %}
15+
{% if sponsorship.package_benefits %}* Package Benefits
16+
{% for benefit in sponsorship.package_benefits %} - {{ benefit.program.name }} - {{ benefit.name }}
17+
{% endfor %}{% endif %} {% if sponsorship.added_benefits %}* Added Benefits
18+
{% for benefit in sponsorship.added_benefits %} - {{ benefit.program.name }} - {{ benefit.name }}
19+
{% endfor %}{% endif %}

0 commit comments

Comments
 (0)