Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9dc7cbe

Browse files
authored
Update logo placement endpoint to read data from database (python#1855)
* Update logo placement endpoint to read data from database* Remove deprecated pypi csv* Simplify assertions* Remove TODO note
1 parent2aa90c0 commit9dc7cbe

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
fromrest_framework.viewsimportAPIView
99
fromrest_framework.responseimportResponse
1010
fromsponsors.enumsimportLogoPlacementChoices,PublisherChoices
11+
fromsponsors.modelsimportBenefitFeature,LogoPlacement,Sponsorship
1112

1213

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

2324

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

@@ -32,9 +32,6 @@ def has_permission(self, request, view):
3232
returnuser.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
classLogoPlacementeAPIList(APIView):
3936
authentication_classes= [TokenAuthentication]
4037
permission_classes= [SponsorPublisherPermission]
@@ -43,32 +40,24 @@ class LogoPlacementeAPIList(APIView):
4340
defget(self,request,*args,**kwargs):
4441
placements= []
4542

46-
withopen(settings.PYPI_SPONSORS_CSV,"r")asfd:
47-
forrowincsv.DictReader(fd):
48-
ifrow["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-
ifany([row[k]=="t"forkinsponsors_page_keys]):
63-
placement=base_data.copy()
64-
placement["flight"]=LogoPlacementChoices.SPONSORS_PAGE.value
65-
placements.append(placement)
66-
67-
ifrow["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+
forsponsorshipinsponsorships.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+
forlogoinbenefits.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
returnResponse(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-
frommodel_bakeryimportbaker
2-
31
fromdjango.contrib.auth.modelsimportPermission
42
fromdjango.urlsimportreverse_lazy
5-
3+
frommodel_bakeryimportbaker
64
fromrest_framework.authtoken.modelsimportToken
75
fromrest_framework.testimportAPITestCase
86

7+
fromsponsors.modelsimportSponsor
8+
fromsponsors.enumsimportLogoPlacementChoices,PublisherChoices
9+
910
classLogoPlacementeAPIListTests(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+
deftearDown(self):
22+
forsponsorinSponsor.objects.all():
23+
ifsponsor.web_logo:
24+
sponsor.web_logo.delete()
25+
ifsponsor.print_logo:
26+
sponsor.print_logo.delete()
1827

1928
deftest_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([pforpindataifp["flight"]==LogoPlacementChoices.SPONSORS_PAGE.value]))
40+
self.assertEqual(1,len([pforpindataifp["flight"]==LogoPlacementChoices.DOWNLOAD_PAGE.value]))
41+
self.assertEqual(2,len([pforpindataifp["sponsor"]==self.sponsors[0].name]))
42+
self.assertEqual(1,len([pforpindataifp["sponsor"]==self.sponsors[1].name]))
3543

3644
deftest_invalid_token(self):
3745
Token.objects.all().delete()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp