8
8
from rest_framework .views import APIView
9
9
from rest_framework .response import Response
10
10
from sponsors .enums import LogoPlacementChoices , PublisherChoices
11
+ from sponsors .models import BenefitFeature , LogoPlacement , Sponsorship
11
12
12
13
13
14
class LogoPlacementSerializer (serializers .Serializer ):
@@ -21,7 +22,6 @@ class LogoPlacementSerializer(serializers.Serializer):
21
22
sponsor_url = serializers .URLField ()
22
23
23
24
24
-
25
25
class SponsorPublisherPermission (permissions .BasePermission ):
26
26
message = 'Must have publisher permission.'
27
27
@@ -32,9 +32,6 @@ def has_permission(self, request, view):
32
32
return user .has_perm ("sponsors.sponsor_publisher" )
33
33
34
34
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.
38
35
class LogoPlacementeAPIList (APIView ):
39
36
authentication_classes = [TokenAuthentication ]
40
37
permission_classes = [SponsorPublisherPermission ]
@@ -43,32 +40,24 @@ class LogoPlacementeAPIList(APIView):
43
40
def get (self , request , * args , ** kwargs ):
44
41
placements = []
45
42
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 )
72
61
73
62
serializer = LogoPlacementSerializer (placements , many = True )
74
63
return Response (serializer .data )
0 commit comments