Skip to content

Commit 9dc7cbe

Browse files
authored
Update logo placement endpoint to read data from database (#1855)
* Update logo placement endpoint to read data from database * Remove deprecated pypi csv * Simplify assertions * Remove TODO note
1 parent 2aa90c0 commit 9dc7cbe

File tree

3 files changed

+41
-91
lines changed

3 files changed

+41
-91
lines changed

data/pypi-sponsors.csv

Lines changed: 0 additions & 47 deletions
This file was deleted.

sponsors/api.py

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from rest_framework.views import APIView
99
from rest_framework.response import Response
1010
from sponsors.enums import LogoPlacementChoices, PublisherChoices
11+
from sponsors.models import BenefitFeature, LogoPlacement, Sponsorship
1112

1213

1314
class LogoPlacementSerializer(serializers.Serializer):
@@ -21,7 +22,6 @@ class LogoPlacementSerializer(serializers.Serializer):
2122
sponsor_url = serializers.URLField()
2223

2324

24-
2525
class SponsorPublisherPermission(permissions.BasePermission):
2626
message = 'Must have publisher permission.'
2727

@@ -32,9 +32,6 @@ def has_permission(self, request, view):
3232
return user.has_perm("sponsors.sponsor_publisher")
3333

3434

35-
# TODO Currently this endpoint only lists sponsors from pypi sponsors CSV.
36-
# Once we have all sponsorship data input into pydotorg, we should be
37-
# able to change this view to fetch data from the database instead.
3835
class LogoPlacementeAPIList(APIView):
3936
authentication_classes = [TokenAuthentication]
4037
permission_classes = [SponsorPublisherPermission]
@@ -43,32 +40,24 @@ class LogoPlacementeAPIList(APIView):
4340
def get(self, request, *args, **kwargs):
4441
placements = []
4542

46-
with open(settings.PYPI_SPONSORS_CSV, "r") as fd:
47-
for row in csv.DictReader(fd):
48-
if row["is_active"] != "t":
49-
continue
50-
51-
base_data = {
52-
"publisher": PublisherChoices.PYPI.value,
53-
"sponsor": row["name"],
54-
"description": row["activity_markdown"],
55-
"logo": row["color_logo_url"],
56-
"start_date": None,
57-
"end_date": None,
58-
"sponsor_url": row["link_url"],
59-
}
60-
61-
sponsors_page_keys = ["psf_sponsor", "infra_sponsor", "one_time"]
62-
if any([row[k] == "t" for k in sponsors_page_keys]):
63-
placement = base_data.copy()
64-
placement["flight"] = LogoPlacementChoices.SPONSORS_PAGE.value
65-
placements.append(placement)
66-
67-
if row["sidebar"] == "t":
68-
placement = base_data.copy()
69-
placement["flight"] = LogoPlacementChoices.SIDEBAR.value
70-
placement["sponsor_url"] = "https://pypi.org/sponsors/"
71-
placements.append(placement)
43+
sponsorships = Sponsorship.objects.enabled().with_logo_placement()
44+
for sponsorship in sponsorships.select_related("sponsor").iterator():
45+
sponsor = sponsorship.sponsor
46+
base_data = {
47+
"sponsor": sponsor.name,
48+
"description": sponsor.description,
49+
"logo": sponsor.web_logo.url,
50+
"sponsor_url": sponsor.landing_page_url,
51+
"start_date": sponsorship.start_date,
52+
"end_date": sponsorship.end_date,
53+
}
54+
55+
benefits = BenefitFeature.objects.filter(sponsor_benefit__sponsorship_id=sponsorship.pk)
56+
for logo in benefits.instance_of(LogoPlacement):
57+
placement = base_data.copy()
58+
placement["publisher"] = logo.publisher
59+
placement["flight"] = logo.logo_place
60+
placements.append(placement)
7261

7362
serializer = LogoPlacementSerializer(placements, many=True)
7463
return Response(serializer.data)

sponsors/tests/test_api.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from model_bakery import baker
2-
31
from django.contrib.auth.models import Permission
42
from django.urls import reverse_lazy
5-
3+
from model_bakery import baker
64
from rest_framework.authtoken.models import Token
75
from rest_framework.test import APITestCase
86

7+
from sponsors.models import Sponsor
8+
from sponsors.enums import LogoPlacementChoices, PublisherChoices
9+
910
class LogoPlacementeAPIListTests(APITestCase):
1011
url = reverse_lazy("logo_placement_list")
1112

@@ -15,23 +16,30 @@ def setUp(self):
1516
self.permission = Permission.objects.get(name='Can access sponsor placement API')
1617
self.user.user_permissions.add(self.permission)
1718
self.authorization = f'Token {token.key}'
19+
self.sponsors = baker.make(Sponsor, _create_files=True, _quantity=2)
20+
21+
def tearDown(self):
22+
for sponsor in Sponsor.objects.all():
23+
if sponsor.web_logo:
24+
sponsor.web_logo.delete()
25+
if sponsor.print_logo:
26+
sponsor.print_logo.delete()
1827

1928
def test_list_logo_placement_as_expected(self):
29+
sp1, sp2 = baker.make_recipe("sponsors.tests.finalized_sponsorship", sponsor=iter(self.sponsors), _quantity=2)
30+
baker.make_recipe("sponsors.tests.logo_at_download_feature", sponsor_benefit__sponsorship=sp1)
31+
baker.make_recipe("sponsors.tests.logo_at_sponsors_feature", sponsor_benefit__sponsorship=sp1)
32+
baker.make_recipe("sponsors.tests.logo_at_sponsors_feature", sponsor_benefit__sponsorship=sp2)
33+
2034
response = self.client.get(self.url, HTTP_AUTHORIZATION=self.authorization)
2135
data = response.json()
22-
expected_keys = set([
23-
"publisher",
24-
"sponsor",
25-
"description",
26-
"logo",
27-
"start_date",
28-
"end_date",
29-
"sponsor_url",
30-
"flight"
31-
])
3236

3337
self.assertEqual(200, response.status_code)
34-
self.assertEqual(expected_keys, set(data[0]))
38+
self.assertEqual(3, len(data))
39+
self.assertEqual(2, len([p for p in data if p["flight"] == LogoPlacementChoices.SPONSORS_PAGE.value]))
40+
self.assertEqual(1, len([p for p in data if p["flight"] == LogoPlacementChoices.DOWNLOAD_PAGE.value]))
41+
self.assertEqual(2, len([p for p in data if p["sponsor"] == self.sponsors[0].name]))
42+
self.assertEqual(1, len([p for p in data if p["sponsor"] == self.sponsors[1].name]))
3543

3644
def test_invalid_token(self):
3745
Token.objects.all().delete()

0 commit comments

Comments
 (0)