Skip to content

Commit afe3cdb

Browse files
authored
add a sponsorship export function via admin (#2231)
1 parent b41f5e4 commit afe3cdb

File tree

4 files changed

+92
-1
lines changed

4 files changed

+92
-1
lines changed

base-requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ sorl-thumbnail==12.7.0
4949
docxtpl==0.12.0
5050
reportlab==3.6.6
5151
django-extensions==3.1.4
52+
django-import-export==2.7.1

pydotorg/settings/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
'django_filters',
204204
'polymorphic',
205205
'django_extensions',
206+
'import_export',
206207
]
207208

208209
# Fixtures

sponsors/admin.py

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.contrib.contenttypes.admin import GenericTabularInline
22
from django.contrib.contenttypes.models import ContentType
3+
from django.contrib.sites.models import Site
34
from ordered_model.admin import OrderedModelAdmin
45
from polymorphic.admin import PolymorphicInlineSupportMixin, StackedPolymorphicInline, PolymorphicParentModelAdmin, \
56
PolymorphicChildModelAdmin
@@ -13,6 +14,10 @@
1314
from django.utils.functional import cached_property
1415
from django.utils.html import mark_safe
1516

17+
from import_export import resources
18+
from import_export.fields import Field
19+
from import_export.admin import ImportExportActionModelAdmin
20+
1621
from mailing.admin import BaseEmailTemplateAdmin
1722
from sponsors.models import *
1823
from sponsors.models.benefits import RequiredAssetMixin
@@ -292,8 +297,78 @@ def choices(self, changelist):
292297
return choices
293298

294299

300+
class SponsorshipResource(resources.ModelResource):
301+
302+
sponsor_name = Field(attribute='sponsor__name', column_name='Company Name')
303+
contact_name = Field(column_name='Contact Name(s)')
304+
contact_email = Field(column_name='Contact Email(s)')
305+
contact_phone = Field(column_name='Contact phone number')
306+
contact_type = Field(column_name='Contact Type(s)')
307+
start_date = Field(attribute='start_date', column_name='Start Date')
308+
end_date = Field(attribute='end_date', column_name='End Date')
309+
web_logo = Field(column_name='Logo')
310+
landing_page_url = Field(attribute='sponsor__landing_page_url', column_name='Webpage link')
311+
level = Field(attribute='package__name', column_name='Sponsorship Level')
312+
cost = Field(attribute='sponsorship_fee', column_name='Sponsorship Cost')
313+
admin_url = Field(attribute='admin_url', column_name='Admin Link')
314+
315+
class Meta:
316+
model = Sponsorship
317+
fields = (
318+
'sponsor_name',
319+
'contact_name',
320+
'contact_email',
321+
'contact_phone',
322+
'contact_type',
323+
'start_date',
324+
'end_date',
325+
'web_logo',
326+
'landing_page_url',
327+
'level',
328+
'cost',
329+
'admin_url',
330+
)
331+
export_order = (
332+
"sponsor_name",
333+
"contact_name",
334+
"contact_email",
335+
"contact_phone",
336+
"contact_type",
337+
"start_date",
338+
"end_date",
339+
"web_logo",
340+
"landing_page_url",
341+
"level",
342+
"cost",
343+
"admin_url",
344+
)
345+
346+
def get_sponsorship_url(self, sponsorship):
347+
domain = Site.objects.get_current().domain
348+
url = reverse("admin:sponsors_sponsorship_change", args=[sponsorship.id])
349+
return f'https://{domain}{url}'
350+
351+
def dehydrate_web_logo(self, sponsorship):
352+
return sponsorship.sponsor.web_logo.url
353+
354+
def dehydrate_contact_type(self, sponsorship):
355+
return "\n".join([contact.type for contact in sponsorship.sponsor.contacts.all()])
356+
357+
def dehydrate_contact_name(self, sponsorship):
358+
return "\n".join([contact.name for contact in sponsorship.sponsor.contacts.all()])
359+
360+
def dehydrate_contact_email(self, sponsorship):
361+
return "\n".join([contact.email for contact in sponsorship.sponsor.contacts.all()])
362+
363+
def dehydrate_contact_phone(self, sponsorship):
364+
return "\n".join([contact.phone for contact in sponsorship.sponsor.contacts.all()])
365+
366+
def dehydrate_admin_url(self, sponsorship):
367+
return self.get_sponsorship_url(sponsorship)
368+
369+
295370
@admin.register(Sponsorship)
296-
class SponsorshipAdmin(admin.ModelAdmin):
371+
class SponsorshipAdmin(ImportExportActionModelAdmin, admin.ModelAdmin):
297372
change_form_template = "sponsors/admin/sponsorship_change_form.html"
298373
form = SponsorshipReviewAdminForm
299374
inlines = [SponsorBenefitInline, AssetsInline]
@@ -310,6 +385,7 @@ class SponsorshipAdmin(admin.ModelAdmin):
310385
]
311386
list_filter = [SponsorshipStatusListFilter, "package", "year", TargetableEmailBenefitsFilter]
312387
actions = ["send_notifications"]
388+
resource_class = SponsorshipResource
313389
fieldsets = [
314390
(
315391
"Sponsorship Data",

sponsors/models/sponsors.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,19 @@ def can_manage(self):
164164
if self.user is not None and (self.primary or self.manager):
165165
return True
166166

167+
@property
168+
def type(self):
169+
types=[]
170+
if self.primary:
171+
types.append('Primary')
172+
if self.administrative:
173+
types.append('Administrative')
174+
if self.manager:
175+
types.append('Manager')
176+
if self.accounting:
177+
types.append('Accounting')
178+
return ", ".join(types)
179+
167180
def __str__(self):
168181
return f"Contact {self.name} from {self.sponsor}"
169182

0 commit comments

Comments
 (0)