diff --git a/examples/settings.py b/examples/settings.py index 739044a..6f4bba8 100644 --- a/examples/settings.py +++ b/examples/settings.py @@ -79,4 +79,7 @@ "base_url": os.environ.get("PRETALX_BASE_URL", "https://pretalx.com"), "token": os.environ.get("PRETALX_TOKEN", ""), }, + "psf_sponsors": { + "token": os.environ.get("PSF_SPONSOR_API_TOKEN", ""), + }, } diff --git a/pyproject.toml b/pyproject.toml index cb72736..af5531e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ classifiers = [ dependencies = [ "django>=5.2", "django-fernet-encrypted-fields>=0.3.1", + "pillow>=12.1.1", "pretalx-client>=0.1.0", "stripe>=12.0.0", ] diff --git a/src/django_program/manage/forms.py b/src/django_program/manage/forms.py index 3cdf13f..5f28d36 100644 --- a/src/django_program/manage/forms.py +++ b/src/django_program/manage/forms.py @@ -11,6 +11,7 @@ from django_program.conference.models import Conference, Section from django_program.pretalx.models import Room, ScheduleSlot, Talk +from django_program.sponsors.models import Sponsor, SponsorLevel class ImportFromPretalxForm(forms.Form): @@ -187,3 +188,51 @@ def __init__(self, *args: object, **kwargs: object) -> None: for field_name in self.SYNCED_FIELDS: if field_name in self.fields: self.fields[field_name].disabled = True + + +class SponsorLevelForm(forms.ModelForm): + """Form for editing a sponsor level.""" + + class Meta: + model = SponsorLevel + fields = ["name", "cost", "description", "benefits_summary", "comp_ticket_count", "order"] + + +class SponsorForm(forms.ModelForm): + """Form for editing a sponsor. + + When the sponsor has an ``external_id`` (synced from the PSF API), + fields that come from the upstream API are disabled to prevent + overwriting synced data. + """ + + SYNCED_FIELDS: list[str] = [ + "name", + "level", + "website_url", + "logo_url", + "description", + ] + + class Meta: + model = Sponsor + fields = [ + "name", + "level", + "website_url", + "logo", + "logo_url", + "description", + "contact_name", + "contact_email", + "is_active", + ] + + def __init__(self, *args: object, **kwargs: object) -> None: + """Initialise the form and disable synced fields when locked by PSF sync.""" + self.is_synced: bool = kwargs.pop("is_synced", False) # type: ignore[arg-type] + super().__init__(*args, **kwargs) + if self.is_synced: + for field_name in self.SYNCED_FIELDS: + if field_name in self.fields: + self.fields[field_name].disabled = True diff --git a/src/django_program/manage/templates/django_program/manage/base.html b/src/django_program/manage/templates/django_program/manage/base.html index 9671b92..2c827dc 100644 --- a/src/django_program/manage/templates/django_program/manage/base.html +++ b/src/django_program/manage/templates/django_program/manage/base.html @@ -1041,6 +1041,21 @@ + {% endif %} diff --git a/src/django_program/manage/templates/django_program/manage/dashboard.html b/src/django_program/manage/templates/django_program/manage/dashboard.html index 2e74d9b..01a39d9 100644 --- a/src/django_program/manage/templates/django_program/manage/dashboard.html +++ b/src/django_program/manage/templates/django_program/manage/dashboard.html @@ -97,6 +97,12 @@

{{ conference.name }}

Sections
+
+ +
{{ stats.sponsors }}
+
Sponsors
+
+
{% if stats.unscheduled_talks %}
@@ -186,6 +192,19 @@

Pretalx Sync

{% endif %} +{% if has_psf_sponsor_sync %} +

PSF Sponsor Sync

+
+

+ Pull sponsor data from the Python Software Foundation sponsorship API. +

+
+ {% csrf_token %} + +
+
+{% endif %} + {% if conference.pretalx_event_slug %}