From 3a0deeb84b1903c7b241c311fbcde826e316ae8b Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Fri, 20 Jan 2023 12:13:05 -0800 Subject: [PATCH] add a sponsorship export function via admin --- base-requirements.txt | 1 + pydotorg/settings/base.py | 1 + sponsors/admin.py | 78 ++++++++++++++++++++++++++++++++++++- sponsors/models/sponsors.py | 13 +++++++ 4 files changed, 92 insertions(+), 1 deletion(-) diff --git a/base-requirements.txt b/base-requirements.txt index da4a2b532..4832f0ee6 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -49,3 +49,4 @@ sorl-thumbnail==12.7.0 docxtpl==0.12.0 reportlab==3.6.6 django-extensions==3.1.4 +django-import-export==2.7.1 diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index 702eaa364..d5eb568a6 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -203,6 +203,7 @@ 'django_filters', 'polymorphic', 'django_extensions', + 'import_export', ] # Fixtures diff --git a/sponsors/admin.py b/sponsors/admin.py index 4e68a7d20..f5108bdc7 100644 --- a/sponsors/admin.py +++ b/sponsors/admin.py @@ -1,5 +1,6 @@ from django.contrib.contenttypes.admin import GenericTabularInline from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site from ordered_model.admin import OrderedModelAdmin from polymorphic.admin import PolymorphicInlineSupportMixin, StackedPolymorphicInline, PolymorphicParentModelAdmin, \ PolymorphicChildModelAdmin @@ -13,6 +14,10 @@ from django.utils.functional import cached_property from django.utils.html import mark_safe +from import_export import resources +from import_export.fields import Field +from import_export.admin import ImportExportActionModelAdmin + from mailing.admin import BaseEmailTemplateAdmin from sponsors.models import * from sponsors.models.benefits import RequiredAssetMixin @@ -292,8 +297,78 @@ def choices(self, changelist): return choices +class SponsorshipResource(resources.ModelResource): + + sponsor_name = Field(attribute='sponsor__name', column_name='Company Name') + contact_name = Field(column_name='Contact Name(s)') + contact_email = Field(column_name='Contact Email(s)') + contact_phone = Field(column_name='Contact phone number') + contact_type = Field(column_name='Contact Type(s)') + start_date = Field(attribute='start_date', column_name='Start Date') + end_date = Field(attribute='end_date', column_name='End Date') + web_logo = Field(column_name='Logo') + landing_page_url = Field(attribute='sponsor__landing_page_url', column_name='Webpage link') + level = Field(attribute='package__name', column_name='Sponsorship Level') + cost = Field(attribute='sponsorship_fee', column_name='Sponsorship Cost') + admin_url = Field(attribute='admin_url', column_name='Admin Link') + + class Meta: + model = Sponsorship + fields = ( + 'sponsor_name', + 'contact_name', + 'contact_email', + 'contact_phone', + 'contact_type', + 'start_date', + 'end_date', + 'web_logo', + 'landing_page_url', + 'level', + 'cost', + 'admin_url', + ) + export_order = ( + "sponsor_name", + "contact_name", + "contact_email", + "contact_phone", + "contact_type", + "start_date", + "end_date", + "web_logo", + "landing_page_url", + "level", + "cost", + "admin_url", + ) + + def get_sponsorship_url(self, sponsorship): + domain = Site.objects.get_current().domain + url = reverse("admin:sponsors_sponsorship_change", args=[sponsorship.id]) + return f'https://{domain}{url}' + + def dehydrate_web_logo(self, sponsorship): + return sponsorship.sponsor.web_logo.url + + def dehydrate_contact_type(self, sponsorship): + return "\n".join([contact.type for contact in sponsorship.sponsor.contacts.all()]) + + def dehydrate_contact_name(self, sponsorship): + return "\n".join([contact.name for contact in sponsorship.sponsor.contacts.all()]) + + def dehydrate_contact_email(self, sponsorship): + return "\n".join([contact.email for contact in sponsorship.sponsor.contacts.all()]) + + def dehydrate_contact_phone(self, sponsorship): + return "\n".join([contact.phone for contact in sponsorship.sponsor.contacts.all()]) + + def dehydrate_admin_url(self, sponsorship): + return self.get_sponsorship_url(sponsorship) + + @admin.register(Sponsorship) -class SponsorshipAdmin(admin.ModelAdmin): +class SponsorshipAdmin(ImportExportActionModelAdmin, admin.ModelAdmin): change_form_template = "sponsors/admin/sponsorship_change_form.html" form = SponsorshipReviewAdminForm inlines = [SponsorBenefitInline, AssetsInline] @@ -310,6 +385,7 @@ class SponsorshipAdmin(admin.ModelAdmin): ] list_filter = [SponsorshipStatusListFilter, "package", "year", TargetableEmailBenefitsFilter] actions = ["send_notifications"] + resource_class = SponsorshipResource fieldsets = [ ( "Sponsorship Data", diff --git a/sponsors/models/sponsors.py b/sponsors/models/sponsors.py index ad2c4b8b1..9b4d8fe86 100644 --- a/sponsors/models/sponsors.py +++ b/sponsors/models/sponsors.py @@ -164,6 +164,19 @@ def can_manage(self): if self.user is not None and (self.primary or self.manager): return True + @property + def type(self): + types=[] + if self.primary: + types.append('Primary') + if self.administrative: + types.append('Administrative') + if self.manager: + types.append('Manager') + if self.accounting: + types.append('Accounting') + return ", ".join(types) + def __str__(self): return f"Contact {self.name} from {self.sponsor}"